diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 3515553..0000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -build/ -tools/ diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index ec4e99d..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,33 +0,0 @@ -module.exports = { - "env": { - "es6": true, - "node": true, - "mocha": true, - "es2020": true - }, - "globals": { - "WebAssembly": true - }, - "parserOptions": { - "ecmaVersion": 2020 - }, - "extends": "eslint:recommended", - "rules": { - "indent": [ - "error", - 4 - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "double" - ], - "semi": [ - "error", - "always" - ] - } -}; diff --git a/.gitattributes b/.gitattributes index 736e7ee..6df4591 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,11 @@ -# Autodetect text files +# Normalize all text to LF in the repository and in every checkout, +# regardless of the local core.autocrlf setting. * text=auto eol=lf + +# Binary test fixtures and artifacts: never subject to EOL conversion. +*.zkey -text +*.ptau -text +*.wtns -text +*.r1cs -text +*.wasm -text +*.png -text diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 700be04..93a13c3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,30 +1,36 @@ name: Continuous Integration -on: [push, pull_request] +on: + push: + branches: + - master + pull_request: jobs: test: name: Test - runs-on: ${{ matrix.os }} + timeout-minutes: 15 + runs-on: ubuntu-latest strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - node-version: ["12", "14", "16", "18"] + node-version: [lts/*, lts/-1] steps: - name: Checkout project - uses: actions/checkout@v2 + uses: actions/checkout@v6 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} - check-latest: true - cache: 'npm' + cache: "npm" - name: Install dependencies run: npm ci + - name: Install Playwright dependencies + run: npx playwright install --with-deps chromium + - name: Run tests run: npm test diff --git a/.gitignore b/.gitignore index 07d2049..7097acb 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,4 @@ typings/ tmp .DS_Store +.idea/ diff --git a/build/bls12381.wasm b/build/bls12381.wasm index abd1727..0686aaa 100644 Binary files a/build/bls12381.wasm and b/build/bls12381.wasm differ diff --git a/build/bls12381_wasm.js b/build/bls12381_wasm.js index fe10531..d7d853b 100644 --- a/build/bls12381_wasm.js +++ b/build/bls12381_wasm.js @@ -1,18 +1,16 @@ - - exports.code = "AGFzbQEAAAABlAESYAJ/fwBgAX8AYAF/AX9gAn9/AX9gA39/fwF/YAN/f38AYAN/fn8AYAJ/fgBgBH9/f38AYAV/f39/fwBgBH9/f38Bf2AHf39/f39/fwBgBn9/f39/fwBgCn9/f39/f39/f38AYAV/f39/fwF/YAd/f39/f39/AX9gCX9/f39/f39/fwF/YAt/f39/f39/f39/fwF/Ag8BA2VudgZtZW1vcnkCABkD0wLRAgABAgEDAwQEBQAABgcIBQIFBQAABQAAAAACAgABBQgJBQUFCAgICAACAAECAQMDBAQFAAAGBwgFAgUFAAAFAAAAAAICAAEFCAkFBQUICAgIAAIFAAACAgIBAQAAAAMDAwAABQUFAAAFBQUAAAAAAAICBQAFAAAAAAUFBQUFCgALCQoACwkICAMACAgCAAAJDAwFBQwACA0JCAICAQEABQUABQUAAAAAAwAIAgIJCAACAgIBAQAAAAMDAwAABQUFAAAFBQUAAAAAAAICBQAFAAAAAAUFBQUFCgALCQoACwkICAUDAAgIAgAACQwMBQUMBQMACAgCAAAJDAwFBQwFBQkJCQkJAAICAQEABQAFBQACAAADAAgCCQgAAgIBAQAFBQAFBQAAAAADAAgCAgkIAAIFCAkFAAAAAAAAAAAAAAICAgIFAAAABQAAAAAEDg8QEQUH/Sa6AglpbnRxX2NvcHkAAAlpbnRxX3plcm8AAQhpbnRxX29uZQADC2ludHFfaXNaZXJvAAIHaW50cV9lcQAECGludHFfZ3RlAAUIaW50cV9hZGQABghpbnRxX3N1YgAHCGludHFfbXVsAAgLaW50cV9zcXVhcmUACQ5pbnRxX3NxdWFyZU9sZAAKCGludHFfZGl2AA0PaW50cV9pbnZlcnNlTW9kAA4IZjFtX2NvcHkAAAhmMW1femVybwABCmYxbV9pc1plcm8AAgZmMW1fZXEABAdmMW1fYWRkABAHZjFtX3N1YgARB2YxbV9uZWcAEg5mMW1faXNOZWdhdGl2ZQAZCWYxbV9pc09uZQAPCGYxbV9zaWduABoLZjFtX21SZWR1Y3QAEwdmMW1fbXVsABQKZjFtX3NxdWFyZQAVDWYxbV9zcXVhcmVPbGQAFhJmMW1fZnJvbU1vbnRnb21lcnkAGBBmMW1fdG9Nb250Z29tZXJ5ABcLZjFtX2ludmVyc2UAGwdmMW1fb25lABwIZjFtX2xvYWQAHQ9mMW1fdGltZXNTY2FsYXIAHgdmMW1fZXhwACYQZjFtX2JhdGNoSW52ZXJzZQAfCGYxbV9zcXJ0ACcMZjFtX2lzU3F1YXJlACgVZjFtX2JhdGNoVG9Nb250Z29tZXJ5ACAXZjFtX2JhdGNoRnJvbU1vbnRnb21lcnkAIQlpbnRyX2NvcHkAKQlpbnRyX3plcm8AKghpbnRyX29uZQAsC2ludHJfaXNaZXJvACsHaW50cl9lcQAtCGludHJfZ3RlAC4IaW50cl9hZGQALwhpbnRyX3N1YgAwCGludHJfbXVsADELaW50cl9zcXVhcmUAMg5pbnRyX3NxdWFyZU9sZAAzCGludHJfZGl2ADYPaW50cl9pbnZlcnNlTW9kADcIZnJtX2NvcHkAKQhmcm1femVybwAqCmZybV9pc1plcm8AKwZmcm1fZXEALQdmcm1fYWRkADkHZnJtX3N1YgA6B2ZybV9uZWcAOw5mcm1faXNOZWdhdGl2ZQBCCWZybV9pc09uZQA4CGZybV9zaWduAEMLZnJtX21SZWR1Y3QAPAdmcm1fbXVsAD0KZnJtX3NxdWFyZQA+DWZybV9zcXVhcmVPbGQAPxJmcm1fZnJvbU1vbnRnb21lcnkAQRBmcm1fdG9Nb250Z29tZXJ5AEALZnJtX2ludmVyc2UARAdmcm1fb25lAEUIZnJtX2xvYWQARg9mcm1fdGltZXNTY2FsYXIARwdmcm1fZXhwAE8QZnJtX2JhdGNoSW52ZXJzZQBICGZybV9zcXJ0AFAMZnJtX2lzU3F1YXJlAFEVZnJtX2JhdGNoVG9Nb250Z29tZXJ5AEkXZnJtX2JhdGNoRnJvbU1vbnRnb21lcnkASgZmcl9hZGQAOQZmcl9zdWIAOgZmcl9uZWcAOwZmcl9tdWwAUglmcl9zcXVhcmUAUwpmcl9pbnZlcnNlAFQNZnJfaXNOZWdhdGl2ZQBVB2ZyX2NvcHkAKQdmcl96ZXJvACoGZnJfb25lAEUJZnJfaXNaZXJvACsFZnJfZXEALQxnMW1fbXVsdGlleHAAgAESZzFtX211bHRpZXhwX2NodW5rAH8SZzFtX211bHRpZXhwQWZmaW5lAIQBGGcxbV9tdWx0aWV4cEFmZmluZV9jaHVuawCDAQpnMW1faXNaZXJvAFcQZzFtX2lzWmVyb0FmZmluZQBWBmcxbV9lcQBfC2cxbV9lcU1peGVkAF4MZzFtX2VxQWZmaW5lAF0IZzFtX2NvcHkAWw5nMW1fY29weUFmZmluZQBaCGcxbV96ZXJvAFkOZzFtX3plcm9BZmZpbmUAWApnMW1fZG91YmxlAGEQZzFtX2RvdWJsZUFmZmluZQBgB2cxbV9hZGQAZAxnMW1fYWRkTWl4ZWQAYw1nMW1fYWRkQWZmaW5lAGIHZzFtX25lZwBmDWcxbV9uZWdBZmZpbmUAZQdnMW1fc3ViAGkMZzFtX3N1Yk1peGVkAGgNZzFtX3N1YkFmZmluZQBnEmcxbV9mcm9tTW9udGdvbWVyeQBrGGcxbV9mcm9tTW9udGdvbWVyeUFmZmluZQBqEGcxbV90b01vbnRnb21lcnkAbRZnMW1fdG9Nb250Z29tZXJ5QWZmaW5lAGwPZzFtX3RpbWVzU2NhbGFyAIUBFWcxbV90aW1lc1NjYWxhckFmZmluZQCGAQ1nMW1fbm9ybWFsaXplAHIKZzFtX0xFTXRvVQB0CmcxbV9MRU10b0MAdQpnMW1fVXRvTEVNAHYKZzFtX0N0b0xFTQB3D2cxbV9iYXRjaExFTXRvVQB4D2cxbV9iYXRjaExFTXRvQwB5D2cxbV9iYXRjaFV0b0xFTQB6D2cxbV9iYXRjaEN0b0xFTQB7DGcxbV90b0FmZmluZQBuDmcxbV90b0phY29iaWFuAFwRZzFtX2JhdGNoVG9BZmZpbmUAcRNnMW1fYmF0Y2hUb0phY29iaWFuAHwLZzFtX2luQ3VydmUAcBFnMW1faW5DdXJ2ZUFmZmluZQBvB2ZybV9mZnQAjAEIZnJtX2lmZnQAjQEKZnJtX3Jhd2ZmdACKAQtmcm1fZmZ0Sm9pbgCOAQ5mcm1fZmZ0Sm9pbkV4dACPARFmcm1fZmZ0Sm9pbkV4dEludgCQAQpmcm1fZmZ0TWl4AJEBDGZybV9mZnRGaW5hbACSAR1mcm1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgCTAQhwb2xfemVybwCUAQ9wb2xfY29uc3RydWN0TEMAlQEMcWFwX2J1aWxkQUJDAJYBC3FhcF9qb2luQUJDAJcBDHFhcF9iYXRjaEFkZACYAQpmMm1faXNaZXJvAJkBCWYybV9pc09uZQCaAQhmMm1femVybwCbAQdmMm1fb25lAJwBCGYybV9jb3B5AJ0BB2YybV9tdWwAngEIZjJtX211bDEAnwEKZjJtX3NxdWFyZQCgAQdmMm1fYWRkAKEBB2YybV9zdWIAogEHZjJtX25lZwCjAQhmMm1fc2lnbgCqAQ1mMm1fY29uanVnYXRlAKQBEmYybV9mcm9tTW9udGdvbWVyeQCmARBmMm1fdG9Nb250Z29tZXJ5AKUBBmYybV9lcQCnAQtmMm1faW52ZXJzZQCoAQdmMm1fZXhwAK0BD2YybV90aW1lc1NjYWxhcgCpARBmMm1fYmF0Y2hJbnZlcnNlAKwBCGYybV9zcXJ0AK4BDGYybV9pc1NxdWFyZQCvAQ5mMm1faXNOZWdhdGl2ZQCrAQxnMm1fbXVsdGlleHAA2gESZzJtX211bHRpZXhwX2NodW5rANkBEmcybV9tdWx0aWV4cEFmZmluZQDeARhnMm1fbXVsdGlleHBBZmZpbmVfY2h1bmsA3QEKZzJtX2lzWmVybwCxARBnMm1faXNaZXJvQWZmaW5lALABBmcybV9lcQC5AQtnMm1fZXFNaXhlZAC4AQxnMm1fZXFBZmZpbmUAtwEIZzJtX2NvcHkAtQEOZzJtX2NvcHlBZmZpbmUAtAEIZzJtX3plcm8AswEOZzJtX3plcm9BZmZpbmUAsgEKZzJtX2RvdWJsZQC7ARBnMm1fZG91YmxlQWZmaW5lALoBB2cybV9hZGQAvgEMZzJtX2FkZE1peGVkAL0BDWcybV9hZGRBZmZpbmUAvAEHZzJtX25lZwDAAQ1nMm1fbmVnQWZmaW5lAL8BB2cybV9zdWIAwwEMZzJtX3N1Yk1peGVkAMIBDWcybV9zdWJBZmZpbmUAwQESZzJtX2Zyb21Nb250Z29tZXJ5AMUBGGcybV9mcm9tTW9udGdvbWVyeUFmZmluZQDEARBnMm1fdG9Nb250Z29tZXJ5AMcBFmcybV90b01vbnRnb21lcnlBZmZpbmUAxgEPZzJtX3RpbWVzU2NhbGFyAN8BFWcybV90aW1lc1NjYWxhckFmZmluZQDgAQ1nMm1fbm9ybWFsaXplAMwBCmcybV9MRU10b1UAzgEKZzJtX0xFTXRvQwDPAQpnMm1fVXRvTEVNANABCmcybV9DdG9MRU0A0QEPZzJtX2JhdGNoTEVNdG9VANIBD2cybV9iYXRjaExFTXRvQwDTAQ9nMm1fYmF0Y2hVdG9MRU0A1AEPZzJtX2JhdGNoQ3RvTEVNANUBDGcybV90b0FmZmluZQDIAQ5nMm1fdG9KYWNvYmlhbgC2ARFnMm1fYmF0Y2hUb0FmZmluZQDLARNnMm1fYmF0Y2hUb0phY29iaWFuANYBC2cybV9pbkN1cnZlAMoBEWcybV9pbkN1cnZlQWZmaW5lAMkBC2cxbV90aW1lc0ZyAOEBB2cxbV9mZnQA5wEIZzFtX2lmZnQA6AEKZzFtX3Jhd2ZmdADlAQtnMW1fZmZ0Sm9pbgDpAQ5nMW1fZmZ0Sm9pbkV4dADqARFnMW1fZmZ0Sm9pbkV4dEludgDrAQpnMW1fZmZ0TWl4AOwBDGcxbV9mZnRGaW5hbADtAR1nMW1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgDuAQtnMm1fdGltZXNGcgDvAQdnMm1fZmZ0APUBCGcybV9pZmZ0APYBCmcybV9yYXdmZnQA8wELZzJtX2ZmdEpvaW4A9wEOZzJtX2ZmdEpvaW5FeHQA+AERZzJtX2ZmdEpvaW5FeHRJbnYA+QEKZzJtX2ZmdE1peAD6AQxnMm1fZmZ0RmluYWwA+wEdZzJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24A/AERZzFtX3RpbWVzRnJBZmZpbmUA/QERZzJtX3RpbWVzRnJBZmZpbmUA/gERZnJtX2JhdGNoQXBwbHlLZXkA/wERZzFtX2JhdGNoQXBwbHlLZXkAgAIWZzFtX2JhdGNoQXBwbHlLZXlNaXhlZACBAhFnMm1fYmF0Y2hBcHBseUtleQCCAhZnMm1fYmF0Y2hBcHBseUtleU1peGVkAIMCCmY2bV9pc1plcm8AhQIJZjZtX2lzT25lAIYCCGY2bV96ZXJvAIcCB2Y2bV9vbmUAiAIIZjZtX2NvcHkAiQIHZjZtX211bACKAgpmNm1fc3F1YXJlAIsCB2Y2bV9hZGQAjAIHZjZtX3N1YgCNAgdmNm1fbmVnAI4CCGY2bV9zaWduAI8CEmY2bV9mcm9tTW9udGdvbWVyeQCRAhBmNm1fdG9Nb250Z29tZXJ5AJACBmY2bV9lcQCSAgtmNm1faW52ZXJzZQCTAgdmNm1fZXhwAJcCD2Y2bV90aW1lc1NjYWxhcgCUAhBmNm1fYmF0Y2hJbnZlcnNlAJYCDmY2bV9pc05lZ2F0aXZlAJUCCmZ0bV9pc1plcm8AmQIJZnRtX2lzT25lAJoCCGZ0bV96ZXJvAJsCB2Z0bV9vbmUAnAIIZnRtX2NvcHkAnQIHZnRtX211bACeAghmdG1fbXVsMQCfAgpmdG1fc3F1YXJlAKACB2Z0bV9hZGQAoQIHZnRtX3N1YgCiAgdmdG1fbmVnAKMCCGZ0bV9zaWduAKoCDWZ0bV9jb25qdWdhdGUApAISZnRtX2Zyb21Nb250Z29tZXJ5AKYCEGZ0bV90b01vbnRnb21lcnkApQIGZnRtX2VxAKcCC2Z0bV9pbnZlcnNlAKgCB2Z0bV9leHAArQIPZnRtX3RpbWVzU2NhbGFyAKkCEGZ0bV9iYXRjaEludmVyc2UArAIIZnRtX3NxcnQArgIMZnRtX2lzU3F1YXJlAK8CDmZ0bV9pc05lZ2F0aXZlAKsCEWZ0bV9mcm9iZW5pdXNNYXAwALQCEWZ0bV9mcm9iZW5pdXNNYXAxALUCEWZ0bV9mcm9iZW5pdXNNYXAyALYCEWZ0bV9mcm9iZW5pdXNNYXAzALcCEWZ0bV9mcm9iZW5pdXNNYXA0ALgCEWZ0bV9mcm9iZW5pdXNNYXA1ALkCEWZ0bV9mcm9iZW5pdXNNYXA2ALoCEWZ0bV9mcm9iZW5pdXNNYXA3ALsCEWZ0bV9mcm9iZW5pdXNNYXA4ALwCEWZ0bV9mcm9iZW5pdXNNYXA5AL0CE2JsczEyMzgxX3BhaXJpbmdFcTEAywITYmxzMTIzODFfcGFpcmluZ0VxMgDMAhNibHMxMjM4MV9wYWlyaW5nRXEzAM0CE2JsczEyMzgxX3BhaXJpbmdFcTQAzgITYmxzMTIzODFfcGFpcmluZ0VxNQDPAhBibHMxMjM4MV9wYWlyaW5nANACEmJsczEyMzgxX3ByZXBhcmVHMQDEAhJibHMxMjM4MV9wcmVwYXJlRzIAxQITYmxzMTIzODFfbWlsbGVyTG9vcADGAhxibHMxMjM4MV9maW5hbEV4cG9uZW50aWF0aW9uAMoCH2JsczEyMzgxX2ZpbmFsRXhwb25lbnRpYXRpb25PbGQAxwIaYmxzMTIzODFfX2N5Y2xvdG9taWNTcXVhcmUAyAIaYmxzMTIzODFfX2N5Y2xvdG9taWNFeHBfdzAAyQIIZjZtX211bDEAsAIJZjZtX211bDAxALECCmZ0bV9tdWwwMTQAsgIRZzFtX2luR3JvdXBBZmZpbmUAvgILZzFtX2luR3JvdXAAvwIRZzJtX2luR3JvdXBBZmZpbmUAwAILZzJtX2luR3JvdXAAwQIKwJUF0QI+ACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKAssACAAQgA3AwAgAEIANwMIIABCADcDECAAQgA3AxggAEIANwMgIABCADcDKAtNACAAKQMoUARAIAApAyBQBEAgACkDGFAEQCAAKQMQUARAIAApAwhQBEAgACkDAFAPBUEADwsFQQAPCwVBAA8LBUEADwsFQQAPC0EADwssACAAQgE3AwAgAEIANwMIIABCADcDECAAQgA3AxggAEIANwMgIABCADcDKAtrACAAKQMoIAEpAyhRBEAgACkDICABKQMgUQRAIAApAxggASkDGFEEQCAAKQMQIAEpAxBRBEAgACkDCCABKQMIUQRAIAApAwAgASkDAFEPBUEADwsFQQAPCwVBAA8LBUEADwsFQQAPC0EADwvFAQAgACkDKCABKQMoVARAQQAPBSAAKQMoIAEpAyhWBEBBAQ8FIAApAyAgASkDIFQEQEEADwUgACkDICABKQMgVgRAQQEPBSAAKQMYIAEpAxhUBEBBAA8FIAApAxggASkDGFYEQEEBDwUgACkDECABKQMQVARAQQAPBSAAKQMQIAEpAxBWBEBBAQ8FIAApAwggASkDCFQEQEEADwUgACkDCCABKQMIVgRAQQEPBSAAKQMAIAEpAwBaDwsLCwsLCwsLCwtBAA8LvAIBAX4gADUCACABNQIAfCEDIAIgAz4CACAANQIEIAE1AgR8IANCIIh8IQMgAiADPgIEIAA1AgggATUCCHwgA0IgiHwhAyACIAM+AgggADUCDCABNQIMfCADQiCIfCEDIAIgAz4CDCAANQIQIAE1AhB8IANCIIh8IQMgAiADPgIQIAA1AhQgATUCFHwgA0IgiHwhAyACIAM+AhQgADUCGCABNQIYfCADQiCIfCEDIAIgAz4CGCAANQIcIAE1Ahx8IANCIIh8IQMgAiADPgIcIAA1AiAgATUCIHwgA0IgiHwhAyACIAM+AiAgADUCJCABNQIkfCADQiCIfCEDIAIgAz4CJCAANQIoIAE1Aih8IANCIIh8IQMgAiADPgIoIAA1AiwgATUCLHwgA0IgiHwhAyACIAM+AiwgA0IgiKcLkAMBAX4gADUCACABNQIAfSEDIAIgA0L/////D4M+AgAgADUCBCABNQIEfSADQiCHfCEDIAIgA0L/////D4M+AgQgADUCCCABNQIIfSADQiCHfCEDIAIgA0L/////D4M+AgggADUCDCABNQIMfSADQiCHfCEDIAIgA0L/////D4M+AgwgADUCECABNQIQfSADQiCHfCEDIAIgA0L/////D4M+AhAgADUCFCABNQIUfSADQiCHfCEDIAIgA0L/////D4M+AhQgADUCGCABNQIYfSADQiCHfCEDIAIgA0L/////D4M+AhggADUCHCABNQIcfSADQiCHfCEDIAIgA0L/////D4M+AhwgADUCICABNQIgfSADQiCHfCEDIAIgA0L/////D4M+AiAgADUCJCABNQIkfSADQiCHfCEDIAIgA0L/////D4M+AiQgADUCKCABNQIofSADQiCHfCEDIAIgA0L/////D4M+AiggADUCLCABNQIsfSADQiCHfCEDIAIgA0L/////D4M+AiwgA0Igh6cLpyIaAX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfiADQv////8PgyAANQIAIgUgATUCACIGfnwhAyAEIANCIIh8IQQgAiADPgIAIARCIIghAyAEQv////8PgyAFIAE1AgQiCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgQiByAGfnwhBCADIARCIIh8IQMgAiAEPgIEIANCIIghBCADQv////8PgyAFIAE1AggiCn58IQMgBCADQiCIfCEEIANC/////w+DIAcgCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AggiCSAGfnwhAyAEIANCIIh8IQQgAiADPgIIIARCIIghAyAEQv////8PgyAFIAE1AgwiDH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgCn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgwiCyAGfnwhBCADIARCIIh8IQMgAiAEPgIMIANCIIghBCADQv////8PgyAFIAE1AhAiDn58IQMgBCADQiCIfCEEIANC/////w+DIAcgDH58IQMgBCADQiCIfCEEIANC/////w+DIAkgCn58IQMgBCADQiCIfCEEIANC/////w+DIAsgCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AhAiDSAGfnwhAyAEIANCIIh8IQQgAiADPgIQIARCIIghAyAEQv////8PgyAFIAE1AhQiEH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgDn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgDH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgCn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AhQiDyAGfnwhBCADIARCIIh8IQMgAiAEPgIUIANCIIghBCADQv////8PgyAFIAE1AhgiEn58IQMgBCADQiCIfCEEIANC/////w+DIAcgEH58IQMgBCADQiCIfCEEIANC/////w+DIAkgDn58IQMgBCADQiCIfCEEIANC/////w+DIAsgDH58IQMgBCADQiCIfCEEIANC/////w+DIA0gCn58IQMgBCADQiCIfCEEIANC/////w+DIA8gCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AhgiESAGfnwhAyAEIANCIIh8IQQgAiADPgIYIARCIIghAyAEQv////8PgyAFIAE1AhwiFH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgEn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgEH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgDn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gDH58IQQgAyAEQiCIfCEDIARC/////w+DIA8gCn58IQQgAyAEQiCIfCEDIARC/////w+DIBEgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AhwiEyAGfnwhBCADIARCIIh8IQMgAiAEPgIcIANCIIghBCADQv////8PgyAFIAE1AiAiFn58IQMgBCADQiCIfCEEIANC/////w+DIAcgFH58IQMgBCADQiCIfCEEIANC/////w+DIAkgEn58IQMgBCADQiCIfCEEIANC/////w+DIAsgEH58IQMgBCADQiCIfCEEIANC/////w+DIA0gDn58IQMgBCADQiCIfCEEIANC/////w+DIA8gDH58IQMgBCADQiCIfCEEIANC/////w+DIBEgCn58IQMgBCADQiCIfCEEIANC/////w+DIBMgCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AiAiFSAGfnwhAyAEIANCIIh8IQQgAiADPgIgIARCIIghAyAEQv////8PgyAFIAE1AiQiGH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgFn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgFH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgEn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gEH58IQQgAyAEQiCIfCEDIARC/////w+DIA8gDn58IQQgAyAEQiCIfCEDIARC/////w+DIBEgDH58IQQgAyAEQiCIfCEDIARC/////w+DIBMgCn58IQQgAyAEQiCIfCEDIARC/////w+DIBUgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AiQiFyAGfnwhBCADIARCIIh8IQMgAiAEPgIkIANCIIghBCADQv////8PgyAFIAE1AigiGn58IQMgBCADQiCIfCEEIANC/////w+DIAcgGH58IQMgBCADQiCIfCEEIANC/////w+DIAkgFn58IQMgBCADQiCIfCEEIANC/////w+DIAsgFH58IQMgBCADQiCIfCEEIANC/////w+DIA0gEn58IQMgBCADQiCIfCEEIANC/////w+DIA8gEH58IQMgBCADQiCIfCEEIANC/////w+DIBEgDn58IQMgBCADQiCIfCEEIANC/////w+DIBMgDH58IQMgBCADQiCIfCEEIANC/////w+DIBUgCn58IQMgBCADQiCIfCEEIANC/////w+DIBcgCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AigiGSAGfnwhAyAEIANCIIh8IQQgAiADPgIoIARCIIghAyAEQv////8PgyAFIAE1AiwiHH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgGn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgGH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgFn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gFH58IQQgAyAEQiCIfCEDIARC/////w+DIA8gEn58IQQgAyAEQiCIfCEDIARC/////w+DIBEgEH58IQQgAyAEQiCIfCEDIARC/////w+DIBMgDn58IQQgAyAEQiCIfCEDIARC/////w+DIBUgDH58IQQgAyAEQiCIfCEDIARC/////w+DIBcgCn58IQQgAyAEQiCIfCEDIARC/////w+DIBkgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AiwiGyAGfnwhBCADIARCIIh8IQMgAiAEPgIsIANCIIghBCADQv////8PgyAHIBx+fCEDIAQgA0IgiHwhBCADQv////8PgyAJIBp+fCEDIAQgA0IgiHwhBCADQv////8PgyALIBh+fCEDIAQgA0IgiHwhBCADQv////8PgyANIBZ+fCEDIAQgA0IgiHwhBCADQv////8PgyAPIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyARIBJ+fCEDIAQgA0IgiHwhBCADQv////8PgyATIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyAVIA5+fCEDIAQgA0IgiHwhBCADQv////8PgyAXIAx+fCEDIAQgA0IgiHwhBCADQv////8PgyAZIAp+fCEDIAQgA0IgiHwhBCADQv////8PgyAbIAh+fCEDIAQgA0IgiHwhBCACIAM+AjAgBEIgiCEDIARC/////w+DIAkgHH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgGn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gGH58IQQgAyAEQiCIfCEDIARC/////w+DIA8gFn58IQQgAyAEQiCIfCEDIARC/////w+DIBEgFH58IQQgAyAEQiCIfCEDIARC/////w+DIBMgEn58IQQgAyAEQiCIfCEDIARC/////w+DIBUgEH58IQQgAyAEQiCIfCEDIARC/////w+DIBcgDn58IQQgAyAEQiCIfCEDIARC/////w+DIBkgDH58IQQgAyAEQiCIfCEDIARC/////w+DIBsgCn58IQQgAyAEQiCIfCEDIAIgBD4CNCADQiCIIQQgA0L/////D4MgCyAcfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAafnwhAyAEIANCIIh8IQQgA0L/////D4MgDyAYfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAWfnwhAyAEIANCIIh8IQQgA0L/////D4MgEyAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgFSASfnwhAyAEIANCIIh8IQQgA0L/////D4MgFyAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgGSAOfnwhAyAEIANCIIh8IQQgA0L/////D4MgGyAMfnwhAyAEIANCIIh8IQQgAiADPgI4IARCIIghAyAEQv////8PgyANIBx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAPIBp+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyATIBZ+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAXIBJ+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAbIA5+fCEEIAMgBEIgiHwhAyACIAQ+AjwgA0IgiCEEIANC/////w+DIA8gHH58IQMgBCADQiCIfCEEIANC/////w+DIBEgGn58IQMgBCADQiCIfCEEIANC/////w+DIBMgGH58IQMgBCADQiCIfCEEIANC/////w+DIBUgFn58IQMgBCADQiCIfCEEIANC/////w+DIBcgFH58IQMgBCADQiCIfCEEIANC/////w+DIBkgEn58IQMgBCADQiCIfCEEIANC/////w+DIBsgEH58IQMgBCADQiCIfCEEIAIgAz4CQCAEQiCIIQMgBEL/////D4MgESAcfnwhBCADIARCIIh8IQMgBEL/////D4MgEyAafnwhBCADIARCIIh8IQMgBEL/////D4MgFSAYfnwhBCADIARCIIh8IQMgBEL/////D4MgFyAWfnwhBCADIARCIIh8IQMgBEL/////D4MgGSAUfnwhBCADIARCIIh8IQMgBEL/////D4MgGyASfnwhBCADIARCIIh8IQMgAiAEPgJEIANCIIghBCADQv////8PgyATIBx+fCEDIAQgA0IgiHwhBCADQv////8PgyAVIBp+fCEDIAQgA0IgiHwhBCADQv////8PgyAXIBh+fCEDIAQgA0IgiHwhBCADQv////8PgyAZIBZ+fCEDIAQgA0IgiHwhBCADQv////8PgyAbIBR+fCEDIAQgA0IgiHwhBCACIAM+AkggBEIgiCEDIARC/////w+DIBUgHH58IQQgAyAEQiCIfCEDIARC/////w+DIBcgGn58IQQgAyAEQiCIfCEDIARC/////w+DIBkgGH58IQQgAyAEQiCIfCEDIARC/////w+DIBsgFn58IQQgAyAEQiCIfCEDIAIgBD4CTCADQiCIIQQgA0L/////D4MgFyAcfnwhAyAEIANCIIh8IQQgA0L/////D4MgGSAafnwhAyAEIANCIIh8IQQgA0L/////D4MgGyAYfnwhAyAEIANCIIh8IQQgAiADPgJQIARCIIghAyAEQv////8PgyAZIBx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAbIBp+fCEEIAMgBEIgiHwhAyACIAQ+AlQgA0IgiCEEIANC/////w+DIBsgHH58IQMgBCADQiCIfCEEIAIgAz4CWCAEQiCIIQMgAiAEPgJcC84gEAF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+QgAhAkIAIQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgADUCACIGIAZ+fCECIAMgAkIgiHwhAyABIAI+AgAgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCBCIHfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CBCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIIIgh+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAHIAd+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIIIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AgwiCX58IQIgAyACQiCIfCEDIAJC/////w+DIAcgCH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AgwgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCECIKfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAJfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgCCAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CECADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIUIgt+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAp+fCECIAMgAkIgiHwhAyACQv////8PgyAIIAl+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIUIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AhgiDH58IQIgAyACQiCIfCEDIAJC/////w+DIAcgC358IQIgAyACQiCIfCEDIAJC/////w+DIAggCn58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAkgCX58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AhggAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCHCINfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAMfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCALfnwhAiADIAJCIIh8IQMgAkL/////D4MgCSAKfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CHCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIgIg5+fCECIAMgAkIgiHwhAyACQv////8PgyAHIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAIIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAJIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAKIAp+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIgIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AiQiD358IQIgAyACQiCIfCEDIAJC/////w+DIAcgDn58IQIgAyACQiCIfCEDIAJC/////w+DIAggDX58IQIgAyACQiCIfCEDIAJC/////w+DIAkgDH58IQIgAyACQiCIfCEDIAJC/////w+DIAogC358IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AiQgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCKCIQfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAPfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgCSANfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAMfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgCyALfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CKCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIsIhF+fCECIAMgAkIgiHwhAyACQv////8PgyAHIBB+fCECIAMgAkIgiHwhAyACQv////8PgyAIIA9+fCECIAMgAkIgiHwhAyACQv////8PgyAJIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAKIA1+fCECIAMgAkIgiHwhAyACQv////8PgyALIAx+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIsIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAIIBB+fCECIAMgAkIgiHwhAyACQv////8PgyAJIA9+fCECIAMgAkIgiHwhAyACQv////8PgyAKIA5+fCECIAMgAkIgiHwhAyACQv////8PgyALIA1+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAMIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIwIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAIIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAJIBB+fCECIAMgAkIgiHwhAyACQv////8PgyAKIA9+fCECIAMgAkIgiHwhAyACQv////8PgyALIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAMIA1+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgI0IAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAJIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAKIBB+fCECIAMgAkIgiHwhAyACQv////8PgyALIA9+fCECIAMgAkIgiHwhAyACQv////8PgyAMIA5+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyANIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgI4IAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAKIBF+fCECIAMgAkIgiHwhAyACQv////8PgyALIBB+fCECIAMgAkIgiHwhAyACQv////8PgyAMIA9+fCECIAMgAkIgiHwhAyACQv////8PgyANIA5+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgI8IAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyALIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAMIBB+fCECIAMgAkIgiHwhAyACQv////8PgyANIA9+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAOIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgJAIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAMIBF+fCECIAMgAkIgiHwhAyACQv////8PgyANIBB+fCECIAMgAkIgiHwhAyACQv////8PgyAOIA9+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgJEIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyANIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAOIBB+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAPIA9+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgJIIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAOIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAPIBB+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgJMIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAPIBF+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAQIBB+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgJQIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAQIBF+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgJUIAMhBCAEQiCIIQVCACECQgAhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyARIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8P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UCAANQJUIANCIIh8QcgFNQIsIAR+fCEDIAAgAz4CVEH4CCADQiCIPgIoQgAhAyAANQIsIAJ+Qv////8PgyEEIAA1AiwgA0IgiHxByAU1AgAgBH58IQMgACADPgIsIAA1AjAgA0IgiHxByAU1AgQgBH58IQMgACADPgIwIAA1AjQgA0IgiHxByAU1AgggBH58IQMgACADPgI0IAA1AjggA0IgiHxByAU1AgwgBH58IQMgACADPgI4IAA1AjwgA0IgiHxByAU1AhAgBH58IQMgACADPgI8IAA1AkAgA0IgiHxByAU1AhQgBH58IQMgACADPgJAIAA1AkQgA0IgiHxByAU1AhggBH58IQMgACADPgJEIAA1AkggA0IgiHxByAU1AhwgBH58IQMgACADPgJIIAA1AkwgA0IgiHxByAU1AiAgBH58IQMgACADPgJMIAA1AlAgA0IgiHxByAU1AiQgBH58IQMgACADPgJQIAA1AlQgA0IgiHxByAU1AiggBH58IQMgACADPgJUIAA1AlggA0IgiHxByAU1AiwgBH58IQMgACADPgJYQfgIIANCIIg+AixB+AggAEEwaiABEBALpkMzAX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+Qv3/8/8PIQUgA0L/////D4MgADUCACIGIAE1AgAiB358IQMgBCADQiCIfCEEIANC/////w+DIAV+Qv////8PgyEIIANC/////w+DQQA1AsgFIgkgCH58IQMgBCADQiCIfCEEIARCIIghAyAEQv////8PgyAGIAE1AgQiC358IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgQiCiAHfnwhBCADIARCIIh8IQMgBEL/////D4NBADUCzAUiDSAIfnwhBCADIARCIIh8IQMgBEL/////D4MgBX5C/////w+DIQwgBEL/////D4MgCSAMfnwhBCADIARCIIh8IQMgA0IgiCEEIANC/////w+DIAYgATUCCCIPfnwhAyAEIANCIIh8IQQgA0L/////D4MgCiALfnwhAyAEIANCIIh8IQQgA0L/////D4MgADUCCCIOIAd+fCEDIAQgA0IgiHwhBCADQv////8PgyANIAx+fCEDIAQgA0IgiHwhBCADQv////8Pg0EANQLQBSIRIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAFfkL/////D4MhECADQv////8PgyAJIBB+fCEDIAQgA0IgiHwhBCAEQiCIIQMgBEL/////D4MgBiABNQIMIhN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAKIA9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAOIAt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIMIhIgB358IQQgAyAEQiCIfCEDIARC/////w+DIA0gEH58IQQgAyAEQiCIfCEDIARC/////w+DIBEgDH58IQQgAyAEQiCIfCEDIARC/////w+DQQA1AtQFIhUgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAV+Qv////8PgyEUIARC/////w+DIAkgFH58IQQgAyAEQiCIfCEDIANCIIghBCADQv////8PgyAGIAE1AhAiF358IQMgBCADQiCIfCEEIANC/////w+DIAogE358IQMgBCADQiCIfCEEIANC/////w+DIA4gD358IQMgBCADQiCIfCEEIANC/////w+DIBIgC358IQMgBCADQiCIfCEEIANC/////w+DIAA1AhAiFiAHfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgFSAMfnwhAyAEIANCIIh8IQQgA0L/////D4NBADUC2AUiGSAIfnwhAyAEIANCIIh8IQQgA0L/////D4MgBX5C/////w+DIRggA0L/////D4MgCSAYfnwhAyAEIANCIIh8IQQgBEIgiCEDIARC/////w+DIAYgATUCFCIbfnwhBCADIARCIIh8IQMgBEL/////D4MgCiAXfnwhBCADIARCIIh8IQMgBEL/////D4MgDiATfnwhBCADIARCIIh8IQMgBEL/////D4MgEiAPfnwhBCADIARCIIh8IQMgBEL/////D4MgFiALfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCFCIaIAd+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZIAx+fCEEIAMgBEIgiHwhAyAEQv////8Pg0EANQLcBSIdIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAFfkL/////D4MhHCAEQv////8PgyAJIBx+fCEEIAMgBEIgiHwhAyADQiCIIQQgA0L/////D4MgBiABNQIYIh9+fCEDIAQgA0IgiHwhBCADQv////8PgyAKIBt+fCEDIAQgA0IgiHwhBCADQv////8PgyAOIBd+fCEDIAQgA0IgiHwhBCADQv////8PgyASIBN+fCEDIAQgA0IgiHwhBCADQv////8PgyAWIA9+fCEDIAQgA0IgiHwhBCADQv////8PgyAaIAt+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIYIh4gB358IQMgBCADQiCIfCEEIANC/////w+DIA0gHH58IQMgBCADQiCIfCEEIANC/////w+DIBEgGH58IQMgBCADQiCIfCEEIANC/////w+DIBUgFH58IQMgBCADQiCIfCEEIANC/////w+DIBkgEH58IQMgBCADQiCIfCEEIANC/////w+DIB0gDH58IQMgBCADQiCIfCEEIANC/////w+DQQA1AuAFIiEgCH58IQMgBCADQiCIfCEEIANC/////w+DIAV+Qv////8PgyEgIANC/////w+DIAkgIH58IQMgBCADQiCIfCEEIARCIIghAyAEQv////8PgyAGIAE1AhwiI358IQQgAyAEQiCIfCEDIARC/////w+DIAogH358IQQgAyAEQiCIfCEDIARC/////w+DIA4gG358IQQgAyAEQiCIfCEDIARC/////w+DIBIgF358IQQgAyAEQiCIfCEDIARC/////w+DIBYgE358IQQgAyAEQiCIfCEDIARC/////w+DIBogD358IQQgAyAEQiCIfCEDIARC/////w+DIB4gC358IQQgAyAEQiCIfCEDIARC/////w+DIAA1AhwiIiAHfnwhBCADIARCIIh8IQMgBEL/////D4MgDSAgfnwhBCADIARCIIh8IQMgBEL/////D4MgESAcfnwhBCADIARCIIh8IQMgBEL/////D4MgFSAYfnwhBCADIARCIIh8IQMgBEL/////D4MgGSAUfnwhBCADIARCIIh8IQMgBEL/////D4MgHSAQfnwhBCADIARCIIh8IQMgBEL/////D4MgISAMfnwhBCADIARCIIh8IQMgBEL/////D4NBADUC5AUiJSAIfnwhBCADIARCIIh8IQMgBEL/////D4MgBX5C/////w+DISQgBEL/////D4MgCSAkfnwhBCADIARCIIh8IQMgA0IgiCEEIANC/////w+DIAYgATUCICInfnwhAyAEIANCIIh8IQQgA0L/////D4MgCiAjfnwhAyAEIANCIIh8IQQgA0L/////D4MgDiAffnwhAyAEIANCIIh8IQQgA0L/////D4MgEiAbfnwhAyAEIANCIIh8IQQgA0L/////D4MgFiAXfnwhAyAEIANCIIh8IQQgA0L/////D4MgGiATfnwhAyAEIANCIIh8IQQgA0L/////D4MgHiAPfnwhAyAEIANCIIh8IQQgA0L/////D4MgIiALfnwhAyAEIANCIIh8IQQgA0L/////D4MgADUCICImIAd+fCEDIAQgA0IgiHwhBCADQv////8PgyANICR+fCEDIAQgA0IgiHwhBCADQv////8PgyARICB+fCEDIAQgA0IgiHwhBCADQv////8PgyAVIBx+fCEDIAQgA0IgiHwhBCADQv////8PgyAZIBh+fCEDIAQgA0IgiHwhBCADQv////8PgyAdIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyAhIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyAlIAx+fCEDIAQgA0IgiHwhBCADQv////8Pg0EANQLoBSIpIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAFfkL/////D4MhKCADQv////8PgyAJICh+fCEDIAQgA0IgiHwhBCAEQiCIIQMgBEL/////D4MgBiABNQIkIit+fCEEIAMgBEIgiHwhAyAEQv////8PgyAKICd+fCEEIAMgBEIgiHwhAyAEQv////8PgyAOICN+fCEEIAMgBEIgiHwhAyAEQv////8PgyASIB9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAWIBt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAaIBd+fCEEIAMgBEIgiHwhAyAEQv////8PgyAeIBN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAiIA9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAmIAt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIkIiogB358IQQgAyAEQiCIfCEDIARC/////w+DIA0gKH58IQQgAyAEQiCIfCEDIARC/////w+DIBEgJH58IQQgAyAEQiCIfCEDIARC/////w+DIBUgIH58IQQgAyAEQiCIfCEDIARC/////w+DIBkgHH58IQQgAyAEQiCIfCEDIARC/////w+DIB0gGH58IQQgAyAEQiCIfCEDIARC/////w+DICEgFH58IQQgAyAEQiCIfCEDIARC/////w+DICUgEH58IQQgAyAEQiCIfCEDIARC/////w+DICkgDH58IQQgAyAEQiCIfCEDIARC/////w+DQQA1AuwFIi0gCH58IQQgAyAEQiCIfCEDIARC/////w+DIAV+Qv////8PgyEsIARC/////w+DIAkgLH58IQQgAyAEQiCIfCEDIANCIIghBCADQv////8PgyAGIAE1AigiL358IQMgBCADQiCIfCEEIANC/////w+DIAogK358IQMgBCADQiCIfCEEIANC/////w+DIA4gJ358IQMgBCADQiCIfCEEIANC/////w+DIBIgI358IQMgBCADQiCIfCEEIANC/////w+DIBYgH358IQMgBCADQiCIfCEEIANC/////w+DIBogG358IQMgBCADQiCIfCEEIANC/////w+DIB4gF358IQMgBCADQiCIfCEEIANC/////w+DICIgE358IQMgBCADQiCIfCEEIANC/////w+DICYgD358IQMgBCADQiCIfCEEIANC/////w+DICogC358IQMgBCADQiCIfCEEIANC/////w+DIAA1AigiLiAHfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAsfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAofnwhAyAEIANCIIh8IQQgA0L/////D4MgFSAkfnwhAyAEIANCIIh8IQQgA0L/////D4MgGSAgfnwhAyAEIANCIIh8IQQgA0L/////D4MgHSAcfnwhAyAEIANCIIh8IQQgA0L/////D4MgISAYfnwhAyAEIANCIIh8IQQgA0L/////D4MgJSAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgKSAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgLSAMfnwhAyAEIANCIIh8IQQgA0L/////D4NBADUC8AUiMSAIfnwhAyAEIANCIIh8IQQgA0L/////D4MgBX5C/////w+DITAgA0L/////D4MgCSAwfnwhAyAEIANCIIh8IQQgBEIgiCEDIARC/////w+DIAYgATUCLCIzfnwhBCADIARCIIh8IQMgBEL/////D4MgCiAvfnwhBCADIARCIIh8IQMgBEL/////D4MgDiArfnwhBCADIARCIIh8IQMgBEL/////D4MgEiAnfnwhBCADIARCIIh8IQMgBEL/////D4MgFiAjfnwhBCADIARCIIh8IQMgBEL/////D4MgGiAffnwhBCADIARCIIh8IQMgBEL/////D4MgHiAbfnwhBCADIARCIIh8IQMgBEL/////D4MgIiAXfnwhBCADIARCIIh8IQMgBEL/////D4MgJiATfnwhBCADIARCIIh8IQMgBEL/////D4MgKiAPfnwhBCADIARCIIh8IQMgBEL/////D4MgLiALfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCLCIyIAd+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIDB+fCEEIAMgBEIgiHwhAyAEQv////8PgyARICx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVICh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZICR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAdICB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAhIBx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAlIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyApIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAtIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAxIAx+fCEEIAMgBEIgiHwhAyAEQv////8Pg0EANQL0BSI1IAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAFfkL/////D4MhNCAEQv////8PgyAJIDR+fCEEIAMgBEIgiHwhAyADQiCIIQQgA0L/////D4MgCiAzfnwhAyAEIANCIIh8IQQgA0L/////D4MgDiAvfnwhAyAEIANCIIh8IQQgA0L/////D4MgEiArfnwhAyAEIANCIIh8IQQgA0L/////D4MgFiAnfnwhAyAEIANCIIh8IQQgA0L/////D4MgGiAjfnwhAyAEIANCIIh8IQQgA0L/////D4MgHiAffnwhAyAEIANCIIh8IQQgA0L/////D4MgIiAbfnwhAyAEIANCIIh8IQQgA0L/////D4MgJiAXfnwhAyAEIANCIIh8IQQgA0L/////D4MgKiATfnwhAyAEIANCIIh8IQQgA0L/////D4MgLiAPfnwhAyAEIANCIIh8IQQgA0L/////D4MgMiALfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSA0fnwhAyAEIANCIIh8IQQgA0L/////D4MgESAwfnwhAyAEIANCIIh8IQQgA0L/////D4MgFSAsfnwhAyAEIANCIIh8IQQgA0L/////D4MgGSAofnwhAyAEIANCIIh8IQQgA0L/////D4MgHSAkfnwhAyAEIANCIIh8IQQgA0L/////D4MgISAgfnwhAyAEIANCIIh8IQQgA0L/////D4MgJSAcfnwhAyAEIANCIIh8IQQgA0L/////D4MgKSAYfnwhAyAEIANCIIh8IQQgA0L/////D4MgLSAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgMSAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgNSAMfnwhAyAEIANCIIh8IQQgAiADPgIAIARCIIghAyAEQv////8PgyAOIDN+fCEEIAMgBEIgiHwhAyAEQv////8PgyASIC9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAWICt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAaICd+fCEEIAMgBEIgiHwhAyAEQv////8PgyAeICN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAiIB9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAmIBt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAqIBd+fCEEIAMgBEIgiHwhAyAEQv////8PgyAuIBN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAyIA9+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIDR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVIDB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZICx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAdICh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAhICR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAlICB+fCEEIAMgBEIgiHwhAyAEQv////8PgyApIBx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAtIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAxIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyA1IBB+fCEEIAMgBEIgiHwhAyACIAQ+AgQgA0IgiCEEIANC/////w+DIBIgM358IQMgBCADQiCIfCEEIANC/////w+DIBYgL358IQMgBCADQiCIfCEEIANC/////w+DIBogK358IQMgBCADQiCIfCEEIANC/////w+DIB4gJ358IQMgBCADQiCIfCEEIANC/////w+DICIgI358IQMgBCADQiCIfCEEIANC/////w+DICYgH358IQMgBCADQiCIfCEEIANC/////w+DICogG358IQMgBCADQiCIfCEEIANC/////w+DIC4gF358IQMgBCADQiCIfCEEIANC/////w+DIDIgE358IQMgBCADQiCIfCEEIANC/////w+DIBUgNH58IQMgBCADQiCIfCEEIANC/////w+DIBkgMH58IQMgBCADQiCIfCEEIANC/////w+DIB0gLH58IQMgBCADQiCIfCEEIANC/////w+DICEgKH58IQMgBCADQiCIfCEEIANC/////w+DICUgJH58IQMgBCADQiCIfCEEIANC/////w+DICkgIH58IQMgBCADQiCIfCEEIANC/////w+DIC0gHH58IQMgBCADQiCIfCEEIANC/////w+DIDEgGH58IQMgBCADQiCIfCEEIANC/////w+DIDUgFH58IQMgBCADQiCIfCEEIAIgAz4CCCAEQiCIIQMgBEL/////D4MgFiAzfnwhBCADIARCIIh8IQMgBEL/////D4MgGiAvfnwhBCADIARCIIh8IQMgBEL/////D4MgHiArfnwhBCADIARCIIh8IQMgBEL/////D4MgIiAnfnwhBCADIARCIIh8IQMgBEL/////D4MgJiAjfnwhBCADIARCIIh8IQMgBEL/////D4MgKiAffnwhBCADIARCIIh8IQMgBEL/////D4MgLiAbfnwhBCADIARCIIh8IQMgBEL/////D4MgMiAXfnwhBCADIARCIIh8IQMgBEL/////D4MgGSA0fnwhBCADIARCIIh8IQMgBEL/////D4MgHSAwfnwhBCADIARCIIh8IQMgBEL/////D4MgISAsfnwhBCADIARCIIh8IQMgBEL/////D4MgJSAofnwhBCADIARCIIh8IQMgBEL/////D4MgKSAkfnwhBCADIARCIIh8IQMgBEL/////D4MgLSAgfnwhBCADIARCIIh8IQMgBEL/////D4MgMSAcfnwhBCADIARCIIh8IQMgBEL/////D4MgNSAYfnwhBCADIARCIIh8IQMgAiAEPgIMIANCIIghBCADQv////8PgyAaIDN+fCEDIAQgA0IgiHwhBCADQv////8PgyAeIC9+fCEDIAQgA0IgiHwhBCADQv////8PgyAiICt+fCEDIAQgA0IgiHwhBCADQv////8PgyAmICd+fCEDIAQgA0IgiHwhBCADQv////8PgyAqICN+fCEDIAQgA0IgiHwhBCADQv////8PgyAuIB9+fCEDIAQgA0IgiHwhBCADQv////8PgyAyIBt+fCEDIAQgA0IgiHwhBCADQv////8PgyAdIDR+fCEDIAQgA0IgiHwhBCADQv////8PgyAhIDB+fCEDIAQgA0IgiHwhBCADQv////8PgyAlICx+fCEDIAQgA0IgiHwhBCADQv////8PgyApICh+fCEDIAQgA0IgiHwhBCADQv////8PgyAtICR+fCEDIAQgA0IgiHwhBCADQv////8PgyAxICB+fCEDIAQgA0IgiHwhBCADQv////8PgyA1IBx+fCEDIAQgA0IgiHwhBCACIAM+AhAgBEIgiCEDIARC/////w+DIB4gM358IQQgAyAEQiCIfCEDIARC/////w+DICIgL358IQQgAyAEQiCIfCEDIARC/////w+DICYgK358IQQgAyAEQiCIfCEDIARC/////w+DICogJ358IQQgAyAEQiCIfCEDIARC/////w+DIC4gI358IQQgAyAEQiCIfCEDIARC/////w+DIDIgH358IQQgAyAEQiCIfCEDIARC/////w+DICEgNH58IQQgAyAEQiCIfCEDIARC/////w+DICUgMH58IQQgAyAEQiCIfCEDIARC/////w+DICkgLH58IQQgAyAEQiCIfCEDIARC/////w+DIC0gKH58IQQgAyAEQiCIfCEDIARC/////w+DIDEgJH58IQQgAyAEQiCIfCEDIARC/////w+DIDUgIH58IQQgAyAEQiCIfCEDIAIgBD4CFCADQiCIIQQgA0L/////D4MgIiAzfnwhAyAEIANCIIh8IQQgA0L/////D4MgJiAvfnwhAyAEIANCIIh8IQQgA0L/////D4MgKiArfnwhAyAEIANCIIh8IQQgA0L/////D4MgLiAnfnwhAyAEIANCIIh8IQQgA0L/////D4MgMiAjfnwhAyAEIANCIIh8IQQgA0L/////D4MgJSA0fnwhAyAEIANCIIh8IQQgA0L/////D4MgKSAwfnwhAyAEIANCIIh8IQQgA0L/////D4MgLSAsfnwhAyAEIANCIIh8IQQgA0L/////D4MgMSAofnwhAyAEIANCIIh8IQQgA0L/////D4MgNSAkfnwhAyAEIANCIIh8IQQgAiADPgIYIARCIIghAyAEQv////8PgyAmIDN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAqIC9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAuICt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAyICd+fCEEIAMgBEIgiHwhAyAEQv////8PgyApIDR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAtIDB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAxICx+fCEEIAMgBEIgiHwhAyAEQv////8PgyA1ICh+fCEEIAMgBEIgiHwhAyACIAQ+AhwgA0IgiCEEIANC/////w+DICogM358IQMgBCADQiCIfCEEIANC/////w+DIC4gL358IQMgBCADQiCIfCEEIANC/////w+DIDIgK358IQMgBCADQiCIfCEEIANC/////w+DIC0gNH58IQMgBCADQiCIfCEEIANC/////w+DIDEgMH58IQMgBCADQiCIfCEEIANC/////w+DIDUgLH58IQMgBCADQiCIfCEEIAIgAz4CICAEQiCIIQMgBEL/////D4MgLiAzfnwhBCADIARCIIh8IQMgBEL/////D4MgMiAvfnwhBCADIARCIIh8IQMgBEL/////D4MgMSA0fnwhBCADIARCIIh8IQMgBEL/////D4MgNSAwfnwhBCADIARCIIh8IQMgAiAEPgIkIANCIIghBCADQv////8PgyAyIDN+fCEDIAQgA0IgiHwhBCADQv////8PgyA1IDR+fCEDIAQgA0IgiHwhBCACIAM+AiggBEIgiCEDIAIgBD4CLCADpwRAIAJByAUgAhAHGgUgAkHIBRAFBEAgAkHIBSACEAcaCwsLzUEpAX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfkL9//P/DyEGQgAhAkIAIQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgADUCACIHIAd+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhCCACQv////8Pg0EANQLIBSIJIAh+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIEIgp+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4NBADUCzAUiDCAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIQsgAkL/////D4MgCSALfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCCCINfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgCiAKfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1AtAFIg8gCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEOIAJC/////w+DIAkgDn58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AgwiEH58IQIgAyACQiCIfCEDIAJC/////w+DIAogDX58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8PgyAMIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAPIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0EANQLUBSISIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhESACQv////8PgyAJIBF+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIQIhN+fCECIAMgAkIgiHwhAyACQv////8PgyAKIBB+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyANIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCARfnwhAiADIAJCIIh8IQMgAkL/////D4MgDyAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgEiALfnwhAiADIAJCIIh8IQMgAkL/////D4NBADUC2AUiFSAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIRQgAkL/////D4MgCSAUfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCFCIWfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiATfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSAQfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgFH58IQIgAyACQiCIfCEDIAJC/////w+DIA8gEX58IQIgAyACQiCIfCEDIAJC/////w+DIBIgDn58IQIgAyACQiCIfCEDIAJC/////w+DIBUgC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1AtwFIhggCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEXIAJC/////w+DIAkgF358IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AhgiGX58IQIgAyACQiCIfCEDIAJC/////w+DIAogFn58IQIgAyACQiCIfCEDIAJC/////w+DIA0gE358IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIBAgEH58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8PgyAMIBd+fCECIAMgAkIgiHwhAyACQv////8PgyAPIBR+fCECIAMgAkIgiHwhAyACQv////8PgyASIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAVIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAYIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0EANQLgBSIbIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhGiACQv////8PgyAJIBp+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIcIhx+fCECIAMgAkIgiHwhAyACQv////8PgyAKIBl+fCECIAMgAkIgiHwhAyACQv////8PgyANIBZ+fCECIAMgAkIgiHwhAyACQv////8PgyAQIBN+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCAafnwhAiADIAJCIIh8IQMgAkL/////D4MgDyAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgEiAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSARfnwhAiADIAJCIIh8IQMgAkL/////D4MgGCAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyALfnwhAiADIAJCIIh8IQMgAkL/////D4NBADUC5AUiHiAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIR0gAkL/////D4MgCSAdfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCICIffnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSAZfnwhAiADIAJCIIh8IQMgAkL/////D4MgECAWfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgEyATfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgHX58IQIgAyACQiCIfCEDIAJC/////w+DIA8gGn58IQIgAyACQiCIfCEDIAJC/////w+DIBIgF358IQIgAyACQiCIfCEDIAJC/////w+DIBUgFH58IQIgAyACQiCIfCEDIAJC/////w+DIBggEX58IQIgAyACQiCIfCEDIAJC/////w+DIBsgDn58IQIgAyACQiCIfCEDIAJC/////w+DIB4gC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1AugFIiEgCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEgIAJC/////w+DIAkgIH58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AiQiIn58IQIgAyACQiCIfCEDIAJC/////w+DIAogH358IQIgAyACQiCIfCEDIAJC/////w+DIA0gHH58IQIgAyACQiCIfCEDIAJC/////w+DIBAgGX58IQIgAyACQiCIfCEDIAJC/////w+DIBMgFn58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8PgyAMICB+fCECIAMgAkIgiHwhAyACQv////8PgyAPIB1+fCECIAMgAkIgiHwhAyACQv////8PgyASIBp+fCECIAMgAkIgiHwhAyACQv////8PgyAVIBd+fCECIAMgAkIgiHwhAyACQv////8PgyAYIBR+fCECIAMgAkIgiHwhAyACQv////8PgyAbIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAeIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAhIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0EANQLsBSIkIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhIyACQv////8PgyAJICN+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIoIiV+fCECIAMgAkIgiHwhAyACQv////8PgyAKICJ+fCECIAMgAkIgiHwhAyACQv////8PgyANIB9+fCECIAMgAkIgiHwhAyACQv////8PgyAQIBx+fCECIAMgAkIgiHwhAyACQv////8PgyATIBl+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAWIBZ+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCAjfnwhAiADIAJCIIh8IQMgAkL/////D4MgDyAgfnwhAiADIAJCIIh8IQMgAkL/////D4MgEiAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSAafnwhAiADIAJCIIh8IQMgAkL/////D4MgGCAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiARfnwhAiADIAJCIIh8IQMgAkL/////D4MgISAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgJCALfnwhAiADIAJCIIh8IQMgAkL/////D4NBADUC8AUiJyAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DISYgAkL/////D4MgCSAmfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCLCIofnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAlfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSAifnwhAiADIAJCIIh8IQMgAkL/////D4MgECAffnwhAiADIAJCIIh8IQMgAkL/////D4MgEyAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgFiAZfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgJn58IQIgAyACQiCIfCEDIAJC/////w+DIA8gI358IQIgAyACQiCIfCEDIAJC/////w+DIBIgIH58IQIgAyACQiCIfCEDIAJC/////w+DIBUgHX58IQIgAyACQiCIfCEDIAJC/////w+DIBggGn58IQIgAyACQiCIfCEDIAJC/////w+DIBsgF358IQIgAyACQiCIfCEDIAJC/////w+DIB4gFH58IQIgAyACQiCIfCEDIAJC/////w+DICEgEX58IQIgAyACQiCIfCEDIAJC/////w+DICQgDn58IQIgAyACQiCIfCEDIAJC/////w+DICcgC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1AvQFIiogCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEpIAJC/////w+DIAkgKX58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAKICh+fCECIAMgAkIgiHwhAyACQv////8PgyANICV+fCECIAMgAkIgiHwhAyACQv////8PgyAQICJ+fCECIAMgAkIgiHwhAyACQv////8PgyATIB9+fCECIAMgAkIgiHwhAyACQv////8PgyAWIBx+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAZIBl+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCApfnwhAiADIAJCIIh8IQMgAkL/////D4MgDyAmfnwhAiADIAJCIIh8IQMgAkL/////D4MgEiAjfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSAgfnwhAiADIAJCIIh8IQMgAkL/////D4MgGCAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAafnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgISAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgJCARfnwhAiADIAJCIIh8IQMgAkL/////D4MgJyAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgKiALfnwhAiADIAJCIIh8IQMgASACPgIAIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyANICh+fCECIAMgAkIgiHwhAyACQv////8PgyAQICV+fCECIAMgAkIgiHwhAyACQv////8PgyATICJ+fCECIAMgAkIgiHwhAyACQv////8PgyAWIB9+fCECIAMgAkIgiHwhAyACQv////8PgyAZIBx+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDyApfnwhAiADIAJCIIh8IQMgAkL/////D4MgEiAmfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSAjfnwhAiADIAJCIIh8IQMgAkL/////D4MgGCAgfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAafnwhAiADIAJCIIh8IQMgAkL/////D4MgISAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgJCAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgJyARfnwhAiADIAJCIIh8IQMgAkL/////D4MgKiAOfnwhAiADIAJCIIh8IQMgASACPgIEIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAQICh+fCECIAMgAkIgiHwhAyACQv////8PgyATICV+fCECIAMgAkIgiHwhAyACQv////8PgyAWICJ+fCECIAMgAkIgiHwhAyACQv////8PgyAZIB9+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAcIBx+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgEiApfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSAmfnwhAiADIAJCIIh8IQMgAkL/////D4MgGCAjfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAgfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgISAafnwhAiADIAJCIIh8IQMgAkL/////D4MgJCAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgJyAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgKiARfnwhAiADIAJCIIh8IQMgASACPgIIIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyATICh+fCECIAMgAkIgiHwhAyACQv////8PgyAWICV+fCECIAMgAkIgiHwhAyACQv////8PgyAZICJ+fCECIAMgAkIgiHwhAyACQv////8PgyAcIB9+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgFSApfnwhAiADIAJCIIh8IQMgAkL/////D4MgGCAmfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAjfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAgfnwhAiADIAJCIIh8IQMgAkL/////D4MgISAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgJCAafnwhAiADIAJCIIh8IQMgAkL/////D4MgJyAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgKiAUfnwhAiADIAJCIIh8IQMgASACPgIMIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAWICh+fCECIAMgAkIgiHwhAyACQv////8PgyAZICV+fCECIAMgAkIgiHwhAyACQv////8PgyAcICJ+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAfIB9+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgGCApfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAmfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAjfnwhAiADIAJCIIh8IQMgAkL/////D4MgISAgfnwhAiADIAJCIIh8IQMgAkL/////D4MgJCAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgJyAafnwhAiADIAJCIIh8IQMgAkL/////D4MgKiAXfnwhAiADIAJCIIh8IQMgASACPgIQIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAZICh+fCECIAMgAkIgiHwhAyACQv////8PgyAcICV+fCECIAMgAkIgiHwhAyACQv////8PgyAfICJ+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgGyApfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAmfnwhAiADIAJCIIh8IQMgAkL/////D4MgISAjfnwhAiADIAJCIIh8IQMgAkL/////D4MgJCAgfnwhAiADIAJCIIh8IQMgAkL/////D4MgJyAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgKiAafnwhAiADIAJCIIh8IQMgASACPgIUIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAcICh+fCECIAMgAkIgiHwhAyACQv////8PgyAfICV+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAiICJ+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgHiApfnwhAiADIAJCIIh8IQMgAkL/////D4MgISAmfnwhAiADIAJCIIh8IQMgAkL/////D4MgJCAjfnwhAiADIAJCIIh8IQMgAkL/////D4MgJyAgfnwhAiADIAJCIIh8IQMgAkL/////D4MgKiAdfnwhAiADIAJCIIh8IQMgASACPgIYIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAfICh+fCECIAMgAkIgiHwhAyACQv////8PgyAiICV+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgISApfnwhAiADIAJCIIh8IQMgAkL/////D4MgJCAmfnwhAiADIAJCIIh8IQMgAkL/////D4MgJyAjfnwhAiADIAJCIIh8IQMgAkL/////D4MgKiAgfnwhAiADIAJCIIh8IQMgASACPgIcIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAiICh+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAlICV+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgJCApfnwhAiADIAJCIIh8IQMgAkL/////D4MgJyAmfnwhAiADIAJCIIh8IQMgAkL/////D4MgKiAjfnwhAiADIAJCIIh8IQMgASACPgIgIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAlICh+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgJyApfnwhAiADIAJCIIh8IQMgAkL/////D4MgKiAmfnwhAiADIAJCIIh8IQMgASACPgIkIAMhBCAEQiCIIQVCACECQgAhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAoICh+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgKiApfnwhAiADIAJCIIh8IQMgASACPgIoIAMhBCAEQiCIIQUgASAEPgIsIAWnBEAgAUHIBSABEAcaBSABQcgFEAUEQCABQcgFIAEQBxoLCwsKACAAIAAgARAUCwsAIABB+AUgARAUCxUAIABB+BEQAEGoEhABQfgRIAEQEwsRACAAQdgSEBhB2BJBuAcQBQskACAAEAIEQEEADwsgAEGIExAYQYgTQbgHEAUEQEF/DwtBAQ8LFwAgACABEBggAUHIBSABEA4gASABEBcLCQBBqAYgABAAC8sBBAF/AX8BfwF/IAIQAUEwIQUgACEDAkADQCAFIAFLDQEgBUEwRgRAQbgTEBwFQbgTQfgFQbgTEBQLIANBuBNB6BMQFCACQegTIAIQECADQTBqIQMgBUEwaiEFDAALCyABQTBwIQQgBEUEQA8LQegTEAFBACEGAkADQCAGIARGDQEgBiADLQAAOgDoEyADQQFqIQMgBkEBaiEGDAALCyAFQTBGBEBBuBMQHAVBuBNB+AVBuBMQFAtB6BNBuBNB6BMQFCACQegTIAIQEAscACABIAJBmBQQHUGYFEGYFBAXIABBmBQgAxAUC/gBBAF/AX8BfwF/QQAoAgAhBUEAIAUgAkEBakEwbGo2AgAgBRAcIAAhBiAFQTBqIQVBACEIAkADQCAIIAJGDQEgBhACBEAgBUEwayAFEAAFIAYgBUEwayAFEBQLIAYgAWohBiAFQTBqIQUgCEEBaiEIDAALCyAGIAFrIQYgBUEwayEFIAMgAkEBayAEbGohByAFIAUQGwJAA0AgCEUNASAGEAIEQCAFIAVBMGsQACAHEAEFIAVBMGtByBQQACAFIAYgBUEwaxAUIAVByBQgBxAUCyAGIAFrIQYgByAEayEHIAVBMGshBSAIQQFrIQgMAAsLQQAgBTYCAAs+AwF/AX8BfyAAIQQgAiEFQQAhAwJAA0AgAyABRg0BIAQgBRAXIARBMGohBCAFQTBqIQUgA0EBaiEDDAALCws+AwF/AX8BfyAAIQQgAiEFQQAhAwJAA0AgAyABRg0BIAQgBRAYIARBMGohBCAFQTBqIQUgA0EBaiEDDAALCws+AwF/AX8BfyAAIQQgAiEFQQAhAwJAA0AgAyABRg0BIAQgBRASIARBMGohBCAFQTBqIQUgA0EBaiEDDAALCwtNBAF/AX8BfwF/IAAhBSABIQYgAyEHQQAhBAJAA0AgBCACRg0BIAUgBiAHEBAgBUEwaiEFIAZBMGohBiAHQTBqIQcgBEEBaiEEDAALCwtNBAF/AX8BfwF/IAAhBSABIQYgAyEHQQAhBAJAA0AgBCACRg0BIAUgBiAHEBEgBUEwaiEFIAZBMGohBiAHQTBqIQcgBEEBaiEEDAALCwtNBAF/AX8BfwF/IAAhBSABIQYgAyEHQQAhBAJAA0AgBCACRg0BIAUgBiAHEBQgBUEwaiEFIAZBMGohBiAHQTBqIQcgBEEBaiEEDAALCwuyAgIBfwF/IAJFBEAgAxAcDwsgAEH4FBAAIAMQHCACIQQCQANAIARBAWshBCABIARqLQAAIQUgAyADEBUgBUGAAU8EQCAFQYABayEFIANB+BQgAxAUCyADIAMQFSAFQcAATwRAIAVBwABrIQUgA0H4FCADEBQLIAMgAxAVIAVBIE8EQCAFQSBrIQUgA0H4FCADEBQLIAMgAxAVIAVBEE8EQCAFQRBrIQUgA0H4FCADEBQLIAMgAxAVIAVBCE8EQCAFQQhrIQUgA0H4FCADEBQLIAMgAxAVIAVBBE8EQCAFQQRrIQUgA0H4FCADEBQLIAMgAxAVIAVBAk8EQCAFQQJrIQUgA0H4FCADEBQLIAMgAxAVIAVBAU8EQCAFQQFrIQUgA0H4FCADEBQLIARFDQEMAAsLC94BAwF/AX8BfyAAEAIEQCABEAEPC0EBIQJBmAhBqBUQACAAQegHQTBB2BUQJiAAQcgIQTBBiBYQJgJAA0BB2BVBqAYQBA0BQdgVQbgWEBVBASEDAkADQEG4FkGoBhAEDQFBuBZBuBYQFSADQQFqIQMMAAsLQagVQegWEAAgAiADa0EBayEEAkADQCAERQ0BQegWQegWEBUgBEEBayEEDAALCyADIQJB6BZBqBUQFUHYFUGoFUHYFRAUQYgWQegWQYgWEBQMAAsLQYgWEBkEQEGIFiABEBIFQYgWIAEQAAsLIAAgABACBEBBAQ8LIABBiAdBMEGYFxAmQZgXQagGEAQLKgAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYCx4AIABCADcDACAAQgA3AwggAEIANwMQIABCADcDGAszACAAKQMYUARAIAApAxBQBEAgACkDCFAEQCAAKQMAUA8FQQAPCwVBAA8LBUEADwtBAA8LHgAgAEIBNwMAIABCADcDCCAAQgA3AxAgAEIANwMYC0cAIAApAxggASkDGFEEQCAAKQMQIAEpAxBRBEAgACkDCCABKQMIUQRAIAApAwAgASkDAFEPBUEADwsFQQAPCwVBAA8LQQAPC30AIAApAxggASkDGFQEQEEADwUgACkDGCABKQMYVgRAQQEPBSAAKQMQIAEpAxBUBEBBAA8FIAApAxAgASkDEFYEQEEBDwUgACkDCCABKQMIVARAQQAPBSAAKQMIIAEpAwhWBEBBAQ8FIAApAwAgASkDAFoPCwsLCwsLQQAPC9QBAQF+IAA1AgAgATUCAHwhAyACIAM+AgAgADUCBCABNQIEfCADQiCIfCEDIAIgAz4CBCAANQIIIAE1Agh8IANCIIh8IQMgAiADPgIIIAA1AgwgATUCDHwgA0IgiHwhAyACIAM+AgwgADUCECABNQIQfCADQiCIfCEDIAIgAz4CECAANQIUIAE1AhR8IANCIIh8IQMgAiADPgIUIAA1AhggATUCGHwgA0IgiHwhAyACIAM+AhggADUCHCABNQIcfCADQiCIfCEDIAIgAz4CHCADQiCIpwuMAgEBfiAANQIAIAE1AgB9IQMgAiADQv////8Pgz4CACAANQIEIAE1AgR9IANCIId8IQMgAiADQv////8Pgz4CBCAANQIIIAE1Agh9IANCIId8IQMgAiADQv////8Pgz4CCCAANQIMIAE1Agx9IANCIId8IQMgAiADQv////8Pgz4CDCAANQIQIAE1AhB9IANCIId8IQMgAiADQv////8Pgz4CECAANQIUIAE1AhR9IANCIId8IQMgAiADQv////8Pgz4CFCAANQIYIAE1Ahh9IANCIId8IQMgAiADQv////8Pgz4CGCAANQIcIAE1Ahx9IANCIId8IQMgAiADQv////8Pgz4CHCADQiCHpwuPEBIBfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4gA0L/////D4MgADUCACIFIAE1AgAiBn58IQMgBCADQiCIfCEEIAIgAz4CACAEQiCIIQMgBEL/////D4MgBSABNQIEIgh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIEIgcgBn58IQQgAyAEQiCIfCEDIAIgBD4CBCADQiCIIQQgA0L/////D4MgBSABNQIIIgp+fCEDIAQgA0IgiHwhBCADQv////8PgyAHIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIIIgkgBn58IQMgBCADQiCIfCEEIAIgAz4CCCAEQiCIIQMgBEL/////D4MgBSABNQIMIgx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAHIAp+fCEEIAMgBEIgiHwhAyAEQv////8PgyAJIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIMIgsgBn58IQQgAyAEQiCIfCEDIAIgBD4CDCADQiCIIQQgA0L/////D4MgBSABNQIQIg5+fCEDIAQgA0IgiHwhBCADQv////8PgyAHIAx+fCEDIAQgA0IgiHwhBCADQv////8PgyAJIAp+fCEDIAQgA0IgiHwhBCADQv////8PgyALIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIQIg0gBn58IQMgBCADQiCIfCEEIAIgAz4CECAEQiCIIQMgBEL/////D4MgBSABNQIUIhB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAHIA5+fCEEIAMgBEIgiHwhAyAEQv////8PgyAJIAx+fCEEIAMgBEIgiHwhAyAEQv////8PgyALIAp+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIUIg8gBn58IQQgAyAEQiCIfCEDIAIgBD4CFCADQiCIIQQgA0L/////D4MgBSABNQIYIhJ+fCEDIAQgA0IgiHwhBCADQv////8PgyAHIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyAJIA5+fCEDIAQgA0IgiHwhBCADQv////8PgyALIAx+fCEDIAQgA0IgiHwhBCADQv////8PgyANIAp+fCEDIAQgA0IgiHwhBCADQv////8PgyAPIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIYIhEgBn58IQMgBCADQiCIfCEEIAIgAz4CGCAEQiCIIQMgBEL/////D4MgBSABNQIcIhR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAHIBJ+fCEEIAMgBEIgiHwhAyAEQv////8PgyAJIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyALIA5+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIAx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAPIAp+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIcIhMgBn58IQQgAyAEQiCIfCEDIAIgBD4CHCADQiCIIQQgA0L/////D4MgByAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgCSASfnwhAyAEIANCIIh8IQQgA0L/////D4MgCyAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAOfnwhAyAEIANCIIh8IQQgA0L/////D4MgDyAMfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAKfnwhAyAEIANCIIh8IQQgA0L/////D4MgEyAIfnwhAyAEIANCIIh8IQQgAiADPgIgIARCIIghAyAEQv////8PgyAJIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyALIBJ+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAPIA5+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIAx+fCEEIAMgBEIgiHwhAyAEQv////8PgyATIAp+fCEEIAMgBEIgiHwhAyACIAQ+AiQgA0IgiCEEIANC/////w+DIAsgFH58IQMgBCADQiCIfCEEIANC/////w+DIA0gEn58IQMgBCADQiCIfCEEIANC/////w+DIA8gEH58IQMgBCADQiCIfCEEIANC/////w+DIBEgDn58IQMgBCADQiCIfCEEIANC/////w+DIBMgDH58IQMgBCADQiCIfCEEIAIgAz4CKCAEQiCIIQMgBEL/////D4MgDSAUfnwhBCADIARCIIh8IQMgBEL/////D4MgDyASfnwhBCADIARCIIh8IQMgBEL/////D4MgESAQfnwhBCADIARCIIh8IQMgBEL/////D4MgEyAOfnwhBCADIARCIIh8IQMgAiAEPgIsIANCIIghBCADQv////8PgyAPIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyARIBJ+fCEDIAQgA0IgiHwhBCADQv////8PgyATIBB+fCEDIAQgA0IgiHwhBCACIAM+AjAgBEIgiCEDIARC/////w+DIBEgFH58IQQgAyAEQiCIfCEDIARC/////w+DIBMgEn58IQQgAyAEQiCIfCEDIAIgBD4CNCADQiCIIQQgA0L/////D4MgEyAUfnwhAyAEIANCIIh8IQQgAiADPgI4IARCIIghAyACIAQ+AjwLjBIMAX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+QgAhAkIAIQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgADUCACIGIAZ+fCECIAMgAkIgiHwhAyABIAI+AgAgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCBCIHfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CBCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIIIgh+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAHIAd+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIIIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AgwiCX58IQIgAyACQiCIfCEDIAJC/////w+DIAcgCH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AgwgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCECIKfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAJfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgCCAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CECADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIUIgt+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAp+fCECIAMgAkIgiHwhAyACQv////8PgyAIIAl+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIUIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AhgiDH58IQIgAyACQiCIfCEDIAJC/////w+DIAcgC358IQIgAyACQiCIfCEDIAJC/////w+DIAggCn58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAkgCX58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AhggAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCHCINfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAMfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCALfnwhAiADIAJCIIh8IQMgAkL/////D4MgCSAKfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CHCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByANfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCAMfnwhAiADIAJCIIh8IQMgAkL/////D4MgCSALfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgCiAKfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CICADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCCANfnwhAiADIAJCIIh8IQMgAkL/////D4MgCSAMfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiALfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CJCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCSANfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAMfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgCyALfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CKCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCiANfnwhAiADIAJCIIh8IQMgAkL/////D4MgCyAMfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CLCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCyANfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgDCAMfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CMCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgDCANfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CNCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgDSANfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4COCADIQQgBEIgiCEFIAEgBD4CPAsKACAAIAAgARAx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PgIcIAA1AiAgA0IgiHxBiBs1AgggBH58IQMgACADPgIgIAA1AiQgA0IgiHxBiBs1AgwgBH58IQMgACADPgIkIAA1AiggA0IgiHxBiBs1AhAgBH58IQMgACADPgIoIAA1AiwgA0IgiHxBiBs1AhQgBH58IQMgACADPgIsIAA1AjAgA0IgiHxBiBs1AhggBH58IQMgACADPgIwIAA1AjQgA0IgiHxBiBs1AhwgBH58IQMgACADPgI0QagdIANCIIg+AhhCACEDIAA1AhwgAn5C/////w+DIQQgADUCHCADQiCIfEGIGzUCACAEfnwhAyAAIAM+AhwgADUCICADQiCIfEGIGzUCBCAEfnwhAyAAIAM+AiAgADUCJCADQiCIfEGIGzUCCCAEfnwhAyAAIAM+AiQgADUCKCADQiCIfEGIGzUCDCAEfnwhAyAAIAM+AiggADUCLCADQiCIfEGIGzUCECAEfnwhAyAAIAM+AiwgADUCMCADQiCIfEGIGzUCFCAEfnwhAyAAIAM+AjAgADUCNCADQiCIfEGIGzUCGCAEfnwhAyAAIAM+AjQgADUCOCADQiCIfEGIGzUCHCAEfnwhAyAAIAM+AjhBqB0gA0IgiD4CHEGoHSAAQSBqIAEQOQu+HyMBfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+Qv////8PIQUgA0L/////D4MgADUCACIGIAE1AgAiB358IQMgBCADQiCIfCEEIANC/////w+DIAV+Qv////8PgyEIIANC/////w+DQQA1AogbIgkgCH58IQMgBCADQiCIfCEEIARCIIghAyAEQv////8PgyAGIAE1AgQiC358IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgQiCiAHfnwhBCADIARCIIh8IQMgBEL/////D4NBADUCjBsiDSAIfnwhBCADIARCIIh8IQMgBEL/////D4MgBX5C/////w+DIQwgBEL/////D4MgCSAMfnwhBCADIARCIIh8IQMgA0IgiCEEIANC/////w+DIAYgATUCCCIPfnwhAyAEIANCIIh8IQQgA0L/////D4MgCiALfnwhAyAEIANCIIh8IQQgA0L/////D4MgADUCCCIOIAd+fCEDIAQgA0IgiHwhBCADQv////8PgyANIAx+fCEDIAQgA0IgiHwhBCADQv////8Pg0EANQKQGyIRIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAFfkL/////D4MhECADQv////8PgyAJIBB+fCEDIAQgA0IgiHwhBCAEQiCIIQMgBEL/////D4MgBiABNQIMIhN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAKIA9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAOIAt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIMIhIgB358IQQgAyAEQiCIfCEDIARC/////w+DIA0gEH58IQQgAyAEQiCIfCEDIARC/////w+DIBEgDH58IQQgAyAEQiCIfCEDIARC/////w+DQQA1ApQbIhUgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAV+Qv////8PgyEUIARC/////w+DIAkgFH58IQQgAyAEQiCIfCEDIANCIIghBCADQv////8PgyAGIAE1AhAiF358IQMgBCADQiCIfCEEIANC/////w+DIAogE358IQMgBCADQiCIfCEEIANC/////w+DIA4gD358IQMgBCADQiCIfCEEIANC/////w+DIBIgC358IQMgBCADQiCIfCEEIANC/////w+DIAA1AhAiFiAHfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgFSAMfnwhAyAEIANCIIh8IQQgA0L/////D4NBADUCmBsiGSAIfnwhAyAEIANCIIh8IQQgA0L/////D4MgBX5C/////w+DIRggA0L/////D4MgCSAYfnwhAyAEIANCIIh8IQQgBEIgiCEDIARC/////w+DIAYgATUCFCIbfnwhBCADIARCIIh8IQMgBEL/////D4MgCiAXfnwhBCADIARCIIh8IQMgBEL/////D4MgDiATfnwhBCADIARCIIh8IQMgBEL/////D4MgEiAPfnwhBCADIARCIIh8IQMgBEL/////D4MgFiALfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCFCIaIAd+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZIAx+fCEEIAMgBEIgiHwhAyAEQv////8Pg0EANQKcGyIdIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAFfkL/////D4MhHCAEQv////8PgyAJIBx+fCEEIAMgBEIgiHwhAyADQiCIIQQgA0L/////D4MgBiABNQIYIh9+fCEDIAQgA0IgiHwhBCADQv////8PgyAKIBt+fCEDIAQgA0IgiHwhBCADQv////8PgyAOIBd+fCEDIAQgA0IgiHwhBCADQv////8PgyASIBN+fCEDIAQgA0IgiHwhBCADQv////8PgyAWIA9+fCEDIAQgA0IgiHwhBCADQv////8PgyAaIAt+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIYIh4gB358IQMgBCADQiCIfCEEIANC/////w+DIA0gHH58IQMgBCADQiCIfCEEIANC/////w+DIBEgGH58IQMgBCADQiCIfCEEIANC/////w+DIBUgFH58IQMgBCADQiCIfCEEIANC/////w+DIBkgEH58IQMgBCADQiCIfCEEIANC/////w+DIB0gDH58IQMgBCADQiCIfCEEIANC/////w+DQQA1AqAbIiEgCH58IQMgBCADQiCIfCEEIANC/////w+DIAV+Qv////8PgyEgIANC/////w+DIAkgIH58IQMgBCADQiCIfCEEIARCIIghAyAEQv////8PgyAGIAE1AhwiI358IQQgAyAEQiCIfCEDIARC/////w+DIAogH358IQQgAyAEQiCIfCEDIARC/////w+DIA4gG358IQQgAyAEQiCIfCEDIARC/////w+DIBIgF358IQQgAyAEQiCIfCEDIARC/////w+DIBYgE358IQQgAyAEQiCIfCEDIARC/////w+DIBogD358IQQgAyAEQiCIfCEDIARC/////w+DIB4gC358IQQgAyAEQiCIfCEDIARC/////w+DIAA1AhwiIiAHfnwhBCADIARCIIh8IQMgBEL/////D4MgDSAgfnwhBCADIARCIIh8IQMgBEL/////D4MgESAcfnwhBCADIARCIIh8IQMgBEL/////D4MgFSAYfnwhBCADIARCIIh8IQMgBEL/////D4MgGSAUfnwhBCADIARCIIh8IQMgBEL/////D4MgHSAQfnwhBCADIARCIIh8IQMgBEL/////D4MgISAMfnwhBCADIARCIIh8IQMgBEL/////D4NBADUCpBsiJSAIfnwhBCADIARCIIh8IQMgBEL/////D4MgBX5C/////w+DISQgBEL/////D4MgCSAkfnwhBCADIARCIIh8IQMgA0IgiCEEIANC/////w+DIAogI358IQMgBCADQiCIfCEEIANC/////w+DIA4gH358IQMgBCADQiCIfCEEIANC/////w+DIBIgG358IQMgBCADQiCIfCEEIANC/////w+DIBYgF358IQMgBCADQiCIfCEEIANC/////w+DIBogE358IQMgBCADQiCIfCEEIANC/////w+DIB4gD358IQMgBCADQiCIfCEEIANC/////w+DICIgC358IQMgBCADQiCIfCEEIANC/////w+DIA0gJH58IQMgBCADQiCIfCEEIANC/////w+DIBEgIH58IQMgBCADQiCIfCEEIANC/////w+DIBUgHH58IQMgBCADQiCIfCEEIANC/////w+DIBkgGH58IQMgBCADQiCIfCEEIANC/////w+DIB0gFH58IQMgBCADQiCIfCEEIANC/////w+DICEgEH58IQMgBCADQiCIfCEEIANC/////w+DICUgDH58IQMgBCADQiCIfCEEIAIgAz4CACAEQiCIIQMgBEL/////D4MgDiAjfnwhBCADIARCIIh8IQMgBEL/////D4MgEiAffnwhBCADIARCIIh8IQMgBEL/////D4MgFiAbfnwhBCADIARCIIh8IQMgBEL/////D4MgGiAXfnwhBCADIARCIIh8IQMgBEL/////D4MgHiATfnwhBCADIARCIIh8IQMgBEL/////D4MgIiAPfnwhBCADIARCIIh8IQMgBEL/////D4MgESAkfnwhBCADIARCIIh8IQMgBEL/////D4MgFSAgfnwhBCADIARCIIh8IQMgBEL/////D4MgGSAcfnwhBCADIARCIIh8IQMgBEL/////D4MgHSAYfnwhBCADIARCIIh8IQMgBEL/////D4MgISAUfnwhBCADIARCIIh8IQMgBEL/////D4MgJSAQfnwhBCADIARCIIh8IQMgAiAEPgIEIANCIIghBCADQv////8PgyASICN+fCEDIAQgA0IgiHwhBCADQv////8PgyAWIB9+fCEDIAQgA0IgiHwhBCADQv////8PgyAaIBt+fCEDIAQgA0IgiHwhBCADQv////8PgyAeIBd+fCEDIAQgA0IgiHwhBCADQv////8PgyAiIBN+fCEDIAQgA0IgiHwhBCADQv////8PgyAVICR+fCEDIAQgA0IgiHwhBCADQv////8PgyAZICB+fCEDIAQgA0IgiHwhBCADQv////8PgyAdIBx+fCEDIAQgA0IgiHwhBCADQv////8PgyAhIBh+fCEDIAQgA0IgiHwhBCADQv////8PgyAlIBR+fCEDIAQgA0IgiHwhBCACIAM+AgggBEIgiCEDIARC/////w+DIBYgI358IQQgAyAEQiCIfCEDIARC/////w+DIBogH358IQQgAyAEQiCIfCEDIARC/////w+DIB4gG358IQQgAyAEQiCIfCEDIARC/////w+DICIgF358IQQgAyAEQiCIfCEDIARC/////w+DIBkgJH58IQQgAyAEQiCIfCEDIARC/////w+DIB0gIH58IQQgAyAEQiCIfCEDIARC/////w+DICEgHH58IQQgAyAEQiCIfCEDIARC/////w+DICUgGH58IQQgAyAEQiCIfCEDIAIgBD4CDCADQiCIIQQgA0L/////D4MgGiAjfnwhAyAEIANCIIh8IQQgA0L/////D4MgHiAffnwhAyAEIANCIIh8IQQgA0L/////D4MgIiAbfnwhAyAEIANCIIh8IQQgA0L/////D4MgHSAkfnwhAyAEIANCIIh8IQQgA0L/////D4MgISAgfnwhAyAEIANCIIh8IQQgA0L/////D4MgJSAcfnwhAyAEIANCIIh8IQQgAiADPgIQIARCIIghAyAEQv////8PgyAeICN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAiIB9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAhICR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAlICB+fCEEIAMgBEIgiHwhAyACIAQ+AhQgA0IgiCEEIANC/////w+DICIgI358IQMgBCADQiCIfCEEIANC/////w+DICUgJH58IQMgBCADQiCIfCEEIAIgAz4CGCAEQiCIIQMgAiAEPgIcIAOnBEAgAkGIGyACEDAaBSACQYgbEC4EQCACQYgbIAIQMBoLCwu7IR0BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+Qv////8PIQZCACECQgAhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAANQIAIgcgB358IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEIIAJC/////w+DQQA1AogbIgkgCH58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AgQiCn58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8Pg0EANQKMGyIMIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhCyACQv////8PgyAJIAt+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIIIg1+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAKIAp+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCALfnwhAiADIAJCIIh8IQMgAkL/////D4NBADUCkBsiDyAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIQ4gAkL/////D4MgCSAOfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCDCIQfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiANfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgDn58IQIgAyACQiCIfCEDIAJC/////w+DIA8gC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1ApQbIhIgCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyERIAJC/////w+DIAkgEX58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AhAiE358IQIgAyACQiCIfCEDIAJC/////w+DIAogEH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIA0gDX58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8PgyAMIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAPIA5+fCECIAMgAkIgiHwhAyACQv////8PgyASIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0EANQKYGyIVIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhFCACQv////8PgyAJIBR+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIUIhZ+fCECIAMgAkIgiHwhAyACQv////8PgyAKIBN+fCECIAMgAkIgiHwhAyACQv////8PgyANIBB+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgDyARfnwhAiADIAJCIIh8IQMgAkL/////D4MgEiAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSALfnwhAiADIAJCIIh8IQMgAkL/////D4NBADUCnBsiGCAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIRcgAkL/////D4MgCSAXfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCGCIZfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAWfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSATfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgECAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgF358IQIgAyACQiCIfCEDIAJC/////w+DIA8gFH58IQIgAyACQiCIfCEDIAJC/////w+DIBIgEX58IQIgAyACQiCIfCEDIAJC/////w+DIBUgDn58IQIgAyACQiCIfCEDIAJC/////w+DIBggC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1AqAbIhsgCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEaIAJC/////w+DIAkgGn58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AhwiHH58IQIgAyACQiCIfCEDIAJC/////w+DIAogGX58IQIgAyACQiCIfCEDIAJC/////w+DIA0gFn58IQIgAyACQiCIfCEDIAJC/////w+DIBAgE358IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8PgyAMIBp+fCECIAMgAkIgiHwhAyACQv////8PgyAPIBd+fCECIAMgAkIgiHwhAyACQv////8PgyASIBR+fCECIAMgAkIgiHwhAyACQv////8PgyAVIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAYIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAbIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0EANQKkGyIeIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhHSACQv////8PgyAJIB1+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCiAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSAZfnwhAiADIAJCIIh8IQMgAkL/////D4MgECAWfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgEyATfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgHX58IQIgAyACQiCIfCEDIAJC/////w+DIA8gGn58IQIgAyACQiCIfCEDIAJC/////w+DIBIgF358IQIgAyACQiCIfCEDIAJC/////w+DIBUgFH58IQIgAyACQiCIfCEDIAJC/////w+DIBggEX58IQIgAyACQiCIfCEDIAJC/////w+DIBsgDn58IQIgAyACQiCIfCEDIAJC/////w+DIB4gC358IQIgAyACQiCIfCEDIAEgAj4CACADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgDSAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgECAZfnwhAiADIAJCIIh8IQMgAkL/////D4MgEyAWfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIA8gHX58IQIgAyACQiCIfCEDIAJC/////w+DIBIgGn58IQIgAyACQiCIfCEDIAJC/////w+DIBUgF358IQIgAyACQiCIfCEDIAJC/////w+DIBggFH58IQIgAyACQiCIfCEDIAJC/////w+DIBsgEX58IQIgAyACQiCIfCEDIAJC/////w+DIB4gDn58IQIgAyACQiCIfCEDIAEgAj4CBCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgECAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgEyAZfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgFiAWfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIBIgHX58IQIgAyACQiCIfCEDIAJC/////w+DIBUgGn58IQIgAyACQiCIfCEDIAJC/////w+DIBggF358IQIgAyACQiCIfCEDIAJC/////w+DIBsgFH58IQIgAyACQiCIfCEDIAJC/////w+DIB4gEX58IQIgAyACQiCIfCEDIAEgAj4CCCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgEyAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgFiAZfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIBUgHX58IQIgAyACQiCIfCEDIAJC/////w+DIBggGn58IQIgAyACQiCIfCEDIAJC/////w+DIBsgF358IQIgAyACQiCIfCEDIAJC/////w+DIB4gFH58IQIgAyACQiCIfCEDIAEgAj4CDCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgFiAcfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgGSAZfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIBggHX58IQIgAyACQiCIfCEDIAJC/////w+DIBsgGn58IQIgAyACQiCIfCEDIAJC/////w+DIB4gF358IQIgAyACQiCIfCEDIAEgAj4CECADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgGSAcfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIBsgHX58IQIgAyACQiCIfCEDIAJC/////w+DIB4gGn58IQIgAyACQiCIfCEDIAEgAj4CFCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgHCAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIB4gHX58IQIgAyACQiCIfCEDIAEgAj4CGCADIQQgBEIgiCEFIAEgBD4CHCAFpwRAIAFBiBsgARAwGgUgAUGIGxAuBEAgAUGIGyABEDAaCwsLCgAgACAAIAEQPQsLACAAQagbIAEQPQsVACAAQaghEClByCEQKkGoISABEDwLEQAgAEHoIRBBQeghQagcEC4LJAAgABArBEBBAA8LIABBiCIQQUGIIkGoHBAuBEBBfw8LQQEPCxcAIAAgARBBIAFBiBsgARA3IAEgARBACwkAQcgbIAAQKQvLAQQBfwF/AX8BfyACECpBICEFIAAhAwJAA0AgBSABSw0BIAVBIEYEQEGoIhBFBUGoIkGoG0GoIhA9CyADQagiQcgiED0gAkHIIiACEDkgA0EgaiEDIAVBIGohBQwACwsgAUEgcCEEIARFBEAPC0HIIhAqQQAhBgJAA0AgBiAERg0BIAYgAy0AADoAyCIgA0EBaiEDIAZBAWohBgwACwsgBUEgRgRAQagiEEUFQagiQagbQagiED0LQcgiQagiQcgiED0gAkHIIiACEDkLHAAgASACQegiEEZB6CJB6CIQQCAAQegiIAMQPQv4AQQBfwF/AX8Bf0EAKAIAIQVBACAFIAJBAWpBIGxqNgIAIAUQRSAAIQYgBUEgaiEFQQAhCAJAA0AgCCACRg0BIAYQKwRAIAVBIGsgBRApBSAGIAVBIGsgBRA9CyAGIAFqIQYgBUEgaiEFIAhBAWohCAwACwsgBiABayEGIAVBIGshBSADIAJBAWsgBGxqIQcgBSAFEEQCQANAIAhFDQEgBhArBEAgBSAFQSBrECkgBxAqBSAFQSBrQYgjECkgBSAGIAVBIGsQPSAFQYgjIAcQPQsgBiABayEGIAcgBGshByAFQSBrIQUgCEEBayEIDAALC0EAIAU2AgALPgMBfwF/AX8gACEEIAIhBUEAIQMCQANAIAMgAUYNASAEIAUQQCAEQSBqIQQgBUEgaiEFIANBAWohAwwACwsLPgMBfwF/AX8gACEEIAIhBUEAIQMCQANAIAMgAUYNASAEIAUQQSAEQSBqIQQgBUEgaiEFIANBAWohAwwACwsLPgMBfwF/AX8gACEEIAIhBUEAIQMCQANAIAMgAUYNASAEIAUQOyAEQSBqIQQgBUEgaiEFIANBAWohAwwACwsLTQQBfwF/AX8BfyAAIQUgASEGIAMhB0EAIQQCQANAIAQgAkYNASAFIAYgBxA5IAVBIGohBSAGQSBqIQYgB0EgaiEHIARBAWohBAwACwsLTQQBfwF/AX8BfyAAIQUgASEGIAMhB0EAIQQCQANAIAQgAkYNASAFIAYgBxA6IAVBIGohBSAGQSBqIQYgB0EgaiEHIARBAWohBAwACwsLTQQBfwF/AX8BfyAAIQUgASEGIAMhB0EAIQQCQANAIAQgAkYNASAFIAYgBxA9IAVBIGohBSAGQSBqIQYgB0EgaiEHIARBAWohBAwACwsLsgICAX8BfyACRQRAIAMQRQ8LIABBqCMQKSADEEUgAiEEAkADQCAEQQFrIQQgASAEai0AACEFIAMgAxA+IAVBgAFPBEAgBUGAAWshBSADQagjIAMQPQsgAyADED4gBUHAAE8EQCAFQcAAayEFIANBqCMgAxA9CyADIAMQPiAFQSBPBEAgBUEgayEFIANBqCMgAxA9CyADIAMQPiAFQRBPBEAgBUEQayEFIANBqCMgAxA9CyADIAMQPiAFQQhPBEAgBUEIayEFIANBqCMgAxA9CyADIAMQPiAFQQRPBEAgBUEEayEFIANBqCMgAxA9CyADIAMQPiAFQQJPBEAgBUECayEFIANBqCMgAxA9CyADIAMQPiAFQQFPBEAgBUEBayEFIANBqCMgAxA9CyAERQ0BDAALCwveAQMBfwF/AX8gABArBEAgARAqDwtBICECQegcQcgjECkgAEHIHEEgQegjEE8gAEGIHUEgQYgkEE8CQANAQegjQcgbEC0NAUHoI0GoJBA+QQEhAwJAA0BBqCRByBsQLQ0BQagkQagkED4gA0EBaiEDDAALC0HII0HIJBApIAIgA2tBAWshBAJAA0AgBEUNAUHIJEHIJBA+IARBAWshBAwACwsgAyECQcgkQcgjED5B6CNByCNB6CMQPUGIJEHIJEGIJBA9DAALC0GIJBBCBEBBiCQgARA7BUGIJCABECkLCyAAIAAQKwRAQQEPCyAAQYgcQSBB6CQQT0HoJEHIGxAtCxUAIAAgAUGIJRA9QYglQagbIAIQPQsKACAAIAAgARBSCwsAIABBiBsgARA3CwkAIABBqBwQLgsOACAAEAIgAEEwahACcQsKACAAQeAAahACCw0AIAAQASAAQTBqEAELFQAgABABIABBMGoQHCAAQeAAahABC3oAIAEgACkDADcDACABIAApAwg3AwggASAAKQMQNwMQIAEgACkDGDcDGCABIAApAyA3AyAgASAAKQMoNwMoIAEgACkDMDcDMCABIAApAzg3AzggASAAKQNANwNAIAEgACkDSDcDSCABIAApA1A3A1AgASAAKQNYNwNYC7oBACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKCABIAApAzA3AzAgASAAKQM4NwM4IAEgACkDQDcDQCABIAApA0g3A0ggASAAKQNQNwNQIAEgACkDWDcDWCABIAApA2A3A2AgASAAKQNoNwNoIAEgACkDcDcDcCABIAAp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wwEgBkHgAGoQngELIARBoAJqIQQgBkHAAWohBiAFQeAAaiEFIAdBAWohBwwACwtBACADNgIAC14AIAAQsQEEQCABELMBBSAAQcABakG4xAEQqAFBuMQBQZjFARCgAUG4xAFBmMUBQfjFARCeASAAQZjFASABEJ4BIABB4ABqQfjFASABQeAAahCeASABQcABahCcAQsLOwIBfwF/IAIgAWpBAWshAyAAIQQCQANAIAMgAkgNASADIAQtAAA6AAAgA0EBayEDIARBAWohBAwACwsLNQAgABCwAQRAIAEQsgEPCyAAQdjGARDEAUHYxgFB4AAgARDNAUG4xwFB4AAgAUHgAGoQzQELSgAgABCwAQRAIAEQmwEgAUHAADoAAA8LIABBmMgBEKYBQZjIAUHgACABEM0BIABB4ABqEKoBQX9GBEAgASABLQAAQYABcjoAAAsLOQAgAC0AAEHAAHEEQCABELIBDwsgAEHgAEH4yAEQzQEgAEHgAGpB4ABB2MkBEM0BQfjIASABEMYBC9kBAgF/AX8gAC0AACECIAJBwABxBEAgARCyAQ8LIAJBgAFxIQMgAEGYywEQnQFBmMsBIAJBP3E6AABBmMsBQeAAQbjKARDNAUG4ygEgARClASABQZjLARCgASABQZjLAUGYywEQngFBmMsBQdiEAUGYywEQoQFBmMsBQZjLARCuAUGYywFBuMoBEKMBQZjLARCqAUF/RgRAIAMEQEGYywEgAUHgAGoQnQEFQZjLASABQeAAahCjAQsFIAMEQEGYywEgAUHgAGoQowEFQZjLASABQeAAahCdAQsLC0EDAX8BfwF/IAAhBCACIQVBACEDAkADQCADIAFGDQEgBCAFEM4BIARBwAFqIQQgBUHAAWohBSADQQFqIQMMAAsLC0EDAX8BfwF/IAAhBCACIQVBACEDAkADQCADIAFGDQEgBCAFEM8BIARBwAFqIQQgBUHgAGohBSADQQFqIQMMAAsLC0EDAX8BfwF/IAAhBCACIQVBACEDAkADQCADIAFGDQEgBCAFENABIARBwAFqIQQgBUHAAWohBSADQQFqIQMMAAsLC1UDAX8BfwF/IAAgAUEBa0HgAGxqIQQgAiABQQFrQcABbGohBUEAIQMCQANAIAMgAUYNASAEIAUQ0QEgBEHgAGshBCAFQcABayEFIANBAWohAwwACwsL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kQMgAxCeAgsgAyADEKACIAVBAk8EQCAFQQJrIQUgA0GokQMgAxCeAgsgAyADEKACIAVBAU8EQCAFQQFrIQUgA0GokQMgAxCeAgsgBEUNAQwACwsL0QEAQeinAxCcAkHopwNB6KcDEKMCIABB6JUDQaACQaiaAxCtAkGomgNB6J4DEKACIABB6J4DQeieAxCeAkHongNBqKMDEKQCQaijA0HongNBqKMDEJ4CQaijA0HopwMQpwIEQAALQaiaAyAAQaisAxCeAkHongNB6KcDEKcCBEBB6KcDEIcCQYiqAxCIAkHopwNBqKwDIAEQngIFQeiwAxCcAkHosANB6J4DQeiwAxChAkHosANBiJgDQaACQeiwAxCtAkHosANBqKwDIAEQngILC2oAQYjFAxCcAkGIxQNBiMUDEKMCIABBqLUDQaACQci3AxCtAkHItwNBiLwDEKACIABBiLwDQYi8AxCeAkGIvANByMADEKQCQcjAA0GIvANByMADEJ4CQcjAA0GIxQMQpwIEQEEADwtBAQ8LeAAgACAAQeAAakGIygMQoQEgAEHgAGogAEHAAWpB6MoDEKEBIABB4ABqIAEgAkHAAWoQngFB6MoDIAEgAhCeASACIAJBwAFqIAIQogEgAiACEIQCQYjKAyABIAJB4ABqEJ4BIAJB4ABqIAJBwAFqIAJB4ABqEKIBC+wBACAAIAFByMsDEJ4BIABB4ABqIAJBqMwDEJ4BIAAgAEHgAGpBiM0DEKEBIAAgAEHAAWpB6M0DEKEBIABB4ABqIABBwAFqIAMQoQEgAyACIAMQngEgA0GozAMgAxCiASADIAMQhAIgA0HIywMgAxChASABIAIgA0HgAGoQoQEgA0HgAGpBiM0DIANB4ABqEJ4BIANB4ABqQcjLAyADQeAAahCiASADQeAAakGozAMgA0HgAGoQogFB6M0DIAEgA0HAAWoQngEgA0HAAWpByMsDIANBwAFqEKIBIANBwAFqQajMAyADQcABahChAQuQAQAgACABIAJByM4DELECIABBoAJqIANB6NADELACIAIgA0GI0wMQoQEgAEGgAmogACAEQaACahCMAiAEQaACaiABQYjTAyAEQaACahCxAiAEQaACakHIzgMgBEGgAmoQjQIgBEGgAmpB6NADIARBoAJqEI0CQejQAyAEEIkCIAQgBBCYAiAEQcjOAyAEEIwCC1AAIAEgAEEwakHo0wMQFCABQTBqIABBMGpBmNQDEBQgAUHgAGogAEHI1AMQFCABQZABaiAAQfjUAxAUIAIgAUHAAWpByNQDQejTAyACELICC2wAIABBqPcEIAEQngEgAEHgAGpBiPgEIAFB4ABqEJ4BIABBwAFqQej4BCABQcABahCeASAAQaACakHI+QQgAUGgAmoQngEgAEGAA2pBqPoEIAFBgANqEJ4BIABB4ANqQYj7BCABQeADahCeAQuKAgAgACABEAAgAEEwaiABQTBqEBIgAUHo+wQgARCeASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBIgAUHgAGpByPwEIAFB4ABqEJ4BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQEiABQcABakGo/QQgAUHAAWoQngEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahASIAFBoAJqQYj+BCABQaACahCeASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBIgAUGAA2pB6P4EIAFBgANqEJ4BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQEiABQeADakHI/wQgAUHgA2oQngELbAAgAEGogAUgARCeASAAQeAAakGIgQUgAUHgAGoQngEgAEHAAWpB6IEFIAFBwAFqEJ4BIABBoAJqQciCBSABQaACahCeASAAQYADakGogwUgAUGAA2oQngEgAEHgA2pBiIQFIAFB4ANqEJ4BC4oCACAAIAEQACAAQTBqIAFBMGoQEiABQeiEBSABEJ4BIABB4ABqIAFB4ABqEAAgAEGQAWogAUGQAWoQEiABQeAAakHIhQUgAUHgAGoQngEgAEHAAWogAUHAAWoQACAAQfABaiABQfABahASIAFBwAFqQaiGBSABQcABahCeASAAQaACaiABQaACahAAIABB0AJqIAFB0AJqEBIgAUGgAmpBiIcFIAFBoAJqEJ4BIABBgANqIAFBgANqEAAgAEGwA2ogAUGwA2oQEiABQYADakHohwUgAUGAA2oQngEgAEHgA2ogAUHgA2oQACAAQZAEaiABQZAEahASIAFB4ANqQciIBSABQeADahCeAQtsACAAQaiJBSABEJ4BIABB4ABqQYiKBSABQeAAahCeASAAQcABakHoigUgAUHAAWoQngEgAEGgAmpByIsFIAFBoAJqEJ4BIABBgANqQaiMBSABQYADahCeASAAQeADakGIjQUgAUHgA2oQngELigIAIAAgARAAIABBMGogAUEwahASIAFB6I0FIAEQngEgAEHgAGogAUHgAGoQACAAQZABaiABQZABahASIAFB4ABqQciOBSABQeAAahCeASAAQcABaiABQcABahAAIABB8AFqIAFB8AFqEBIgAUHAAWpBqI8FIAFBwAFqEJ4BIABBoAJqIAFBoAJqEAAgAEHQAmogAUHQAmoQEiABQaACakGIkAUgAUGgAmoQngEgAEGAA2ogAUGAA2oQACAAQbADaiABQbADahASIAFBgANqQeiQBSABQYADahCeASAAQeADaiABQeADahAAIABBkARqIAFBkARqEBIgAUHgA2pByJEFIAFB4ANqEJ4BC2wAIABBqJIFIAEQngEgAEHgAGpBiJMFIAFB4ABqEJ4BIABBwAFqQeiTBSABQcABahCeASAAQaACakHIlAUgAUGgAmoQngEgAEGAA2pBqJUFIAFBgANqEJ4BIABB4ANqQYiWBSABQeADahCeAQuKAgAgACABEAAgAEEwaiABQTBqEBIgAUHolgUgARCeASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBIgAUHgAGpByJcFIAFB4ABqEJ4BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQEiABQcABakGomAUgAUHAAWoQngEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahASIAFBoAJqQYiZBSABQaACahCeASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBIgAUGAA2pB6JkFIAFBgANqEJ4BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQEiABQeADakHImgUgAUHgA2oQngELbAAgAEGomwUgARCeASAAQeAAakGInAUgAUHgAGoQngEgAEHAAWpB6JwFIAFBwAFqEJ4BIABBoAJqQcidBSABQaACahCeASAAQYADakGongUgAUGAA2oQngEgAEHgA2pBiJ8FIAFB4ANqEJ4BC4oCACAAIAEQACAAQTBqIAFBMGoQEiABQeifBSABEJ4BIABB4ABqIAFB4ABqEAAgAEGQAWogAUGQAWoQEiABQeAAakHIoAUgAUHgAGoQngEgAEHAAWogAUHAAWoQACAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAABBuOUBC6AIyf///zYAAAA3PFoAW8NBAtuWOu5FlpL+fBUqDyIN8Rec+v//YwUAAGQV2AjU37eVSIOPE6x0L9zLpgirswPmEnfW8v+IKQ0Aie0xmHq/F3wbSoX075wJWjjK/CTVBcxmjRj8iyTnA3TBk7zbS1RI+5ZElSxLb0+vU/CFZ3rFcCeMxsHEZJ6vA6AZD4nIpsaYElbCxiAQvIyZBcmmyYR1Yjoy2HM5uamhgU7TqF0h3Sa1dJ7bxkqHgOuKJkC/mko18hrWlOvZEcZ7MnSA4ZeQ6gYfgcID2bqQlprtCLSo1wJG3sQKemwVTaysHDkuj2Gb3r2qsX3+LWn+Z5IjdeKII7b2ezzlk1nitleXwYwMAF3PLFc+SUL7/AX7M1zrX2AP4W+Gw0SeIhZw1qTxaK/MjgNN9q1ySFezv4afn1dcRAKHrAicpF1phI2WnnGmm6TBt+zZtAQqWkzzxrfkST8/Uopa+b//aCvZeqMOhabyrxBtSeQ7gazlZDTdeBywzycau7PIEsqEfkmf3K5+ACKjxbOFsZfPuVew5sHmQHMPFg09MkH2VlrNX0TzGEoNr0cfkViMbL296IfeTSvOPc37YcvgiCWrC7JM36wHVE5O+V223Y8VemSNbNTYxYMS3RttENDCrDH04I/WSnXyaHlAAxVzsIitDsi3UN7z0v3OtTGmxA5rrikTfdMCODUIzDufRJ6/aGe4Qio5PVd9VHQQPvduiTrzVfTjX/D/xDG/rKSq9wVYpyPFVwGvzDcQ175zvqA/lvdxNcLQgZuLZk88KJHj+ZJdGdCLCK/zDC6iwlc3zWzgcRpdOLsb4jPrB9xFpw6p+Nh+H+Pj6xpY7y/fC9lzdDbmm9kmV4NjzImv/viZzd5/pYD9OlPfvZw5XhklvgttGT+vU9G1u5M9O8ptGS4/gEX3nJo1Az/FYG/5Z1TFNBBIc+zeXAdJHQTKcZocksLqHhkO8xoOTXxr4Ot4ZJ8bpOG0yiit9BHVVP9h6i2W0v/bpTJpFkzuHb/waTNZdnGdmE9oDpzc98VZemaiEzzBE0QD8ZDCCQ8PlQA5T05onm72a6asxflOWhRx9J7EnNpKnJmxCHRN/0PJV+u2FXF08Oa+HSkPVk2KEAQ7gKO7C+bDeNYYsJKphB3Th7YPcOqiWX+WnHFL6vK3g2DrJbId82PBStrZ9QWyTK1W/WY5MJQfvxSoQvgpHw+XveihyYYYZeuRtDko3lCndaPZYJJxi9FJib0acRQtedPQbtutrBJGvngFqrVHjdMKdw0RCNmObT6WjOfb47O8/sJgE6Sb5nDusMeVBP5FhgQRBDki8IXATBVpZXQdhVE8Iw47dEJ3uOAloeykIei/USkTBjgWB1UpX74JocHzW85RUBqQmLQmsM5janW4gothM8JcAEHY7QELoAhWVVVV/////6mSqaqswtM3rjrBWwWQJiIw/mjGjG+eQoQ0SIOwEzuxj3ZAGjBvCwHjUoF2GZtk/anWvxD6AdJS4j8GCpwaZUX7/3GAgypQ2KKoqHHsXV3KtIO0e9II4GQnA6B1q8L3QCnIB7Xdib+hKMO1FyGgWoPxTigHO1sHSzNF1zPPr+eMIkVox0PRSVtZdzs6DLKKzXW2LJEuMPQNwD4o5/xJLMoUrCQ+KLIAEsOequSmh0PWUqMiEOfOrgz9TefHCMZEZWI5WBJqBEks3q6NV7DHtKFs3V9ybCJYVBdJF0/KldrmqYSJXA2ETceUlJ9b2ora+6oxJZ24f5g7iytGIylZVILuNhfMnAkG2ay12m7HefgBN6BU3tko6gTmTKPJtLnoTKZBNpzSOB40aUdAsugBp865dss2kv5OOTblVUHGl2VgWKRCF7Ut710oKCZd3tAMidDih6ol3Nkwne3Va8TTF6r8kBYwhVUYYAzaqjdYOvtjDgPbqvU6tUlQAnlppUJgS7d/OwH3yAOzmeJ19JJdz/BgY6/N1iJlBBy5AJDb5Z8rufJ6BHwI1dRR1e4kMxvfSdW9JjlovecEp4Sm7fxueV9fxu94UonziqDsQ7iAl86LDfefxiqEtDaA5bFPuhQbD4eDlFkl1pJSqCEeBx9GYpprGbwCUqLiHlncaeH8NTkujiZ9TT4kkdp1yVSGSYsecB/v6FrKRPdcr9Dx/T//qQKPKKOJmUBxwRou5Rq9cdKNe+w+w65zkiyFvJYwRJMsjy61hkPljZB0Q/Ejfrc/UTzX+lHSyzf9QOnDkK9t+TOUJS5czCDBRPT9S/M+Pj+FcbUN5/DRVKEUFBFAs5DQBIBIgHCelcts2SGp1m4Eez/b1vI0MsV/Bx5XM0YCUJRAlVkWGz5RvwG0TnfCkjmAuAxRlwXTfN8oYueRXHO1H6+vZ/OP/fuK5LFtvhDFjY4HoZmpeZETcD5EyYh+HnZRRYEiiQvHjXTpI9KDkTR74bg3jSA0DIwoEjNYkg7D5SXVPuUXycobaP9Ip+bIh0gWf3NEFbvAvY6eaj+wf+R0aIFWXo+CfbjvYyAh3zNMphwFHjJPMMOGr100IKwLY13nlZHmO1/x+W4qAcV0U6jDGf1MO5v/fFX+fx3xF7S86F+jcrVcGLlapLh5/f777UsGT/tJftY8j7ayT4QNx8BhxMNtm3W7FIwqPMOp6OTtQdWiwr6s543Dsbxuta0Ce+BJONKM1dBYPS16gl7dX1BkpM1whUJE/3IB+BqX4G3dOPwuXEm5K/CLlGMdcuQWRtygmQYDuNeauANSOdT87ckuLwZmXCgHq7rtVqVnotBLWGUccDIkc1BMtKQA/53nhYUH7+2Y753ER3eDOMInbDYWsxREM1JU00dDIV4AQfj1AQuAAgCAQMAgoGDgEJBQ0DCwcPAIiEjIKKho6BiYWNg4uHj4BIRExCSkZOQUlFTUNLR09AyMTMwsrGzsHJxc3Dy8fPwCgkLCIqJi4hKSUtIysnLyCopKyiqqauoamlraOrp6+gaGRsYmpmbmFpZW1ja2dvYOjk7OLq5u7h6eXt4+vn7+AYFBwSGhYeERkVHRMbFx8QmJSckpqWnpGZlZ2Tm5efkFhUXFJaVl5RWVVdU1tXX1DY1NzS2tbe0dnV3dPb19/QODQ8Mjo2PjE5NT0zOzc/MLi0vLK6tr6xubW9s7u3v7B4dHxyenZ+cXl1fXN7d39w+PT88vr2/vH59f3z+/f/8AQbiHAgugCP7///8BAAAAAkgDAPq3hFj1T7zs70+MmW8FxaxZsSQYAwAAAP3////8E/v/COw4+w+I5RwYiK2Z2HfYfPn1yFuxz4mqdFaw8/65BmBAAS8HJnpmJb8Nms50g1ktBeQsTQkQvdNptjCRp2Ggsn+p++SoJkuzzwhE8yx6/wbspDUfiRIKCwKgwiWIIQh9f3Ecl9jFGtjK3DlHwUHj7ql7YE800Rwjo2Bkxe5f8k+pFMSVbptUgFA2HZ3dBkWfCXRSHMxAJ3WwlZsdfMvoUiZasMhdA5lDXOIBDxAXPWdfm8ZjU60m87xhY8NemoHc8M+Zl2Mc2avwBL6VECLy5skg9kmsQlMRTcjBynIlcRbOhWL83IZHV+zVZHkVlhdImsBCVzT4U3czNbqUd1CuFlDM+Ek8GiUXtvLbBeE40N82G/Nr5zY93YC4VPwbScraiHLy9sVbNeKa3QS7HDiZyQmm0iRlFs2cki314z9GBKuxc/q9Dnj99hcm5jI7d5xQDkhvV8fh95frsbwQX+lx2itnM6onYCwu7k6BUkTzFxJvr+U5LDMfmp/cmGXyqNBO0seyw3AWZoESEQYe4iK6h/DdPAI4BkylL/yXX0Nrq5TTW50Ih5Z7Aa4UhfTvsACdYFo4OZSpEOUIrirS8/A1w7C4mm57YMv5rGQtttYGqeIK9dVjdAluT+dUFZBfK0DXCoVR+4HPL6364CzZ99lVj89ZnA3VYHUBvWO39mQzq+eewS8av+VUdqvD3JEvJFl0fe3OJyh55BwPfNwKeL565CTXkg1MATvGZ5QuwWLkGkNv1nFFXV9R+v3pYFPO9w3kzBVhjtMNngX6woBzY9u54mEtWg0Q2t32pk+nsXaDLNRrW8M7WhEUitwH9sacrXjJDAisVn+yxz7DgyeOj/P5XQKEqmBdydO1IaZvBAkPT7sup5wN5oFs5aT84gP4xwtELAB79QZM+Wm4SK9EQlimYIKlCyFBaMi/D+jB5stPT4Y0TupkH49RLb+Sj6mhFmTpqiKHSdxE26gRBtCBR/l/dQgBu4F9IJHKs54kN3xRVaxXMQdDUvUaLhxU3ivswwNg0XmWptQE6PA2pVVC6LwMNd6Tb3FaeZ5bcui7MTZFqCtCbqC7jGZT4PZXSCgPnHnNlwNEC/xWeabeJzKvGK9JNvvxskzR86xyuqamCU1n/aOzeeIeS/JtKUy1E9ymJ9jSlUR5RRDWNGqElrWjuEBfZzyIui7W0HPgf5ldfiKKjf8Z6MO8QeBPkqyLLBkhGhvq9CdFO466ZDgALU+e2Rjk9L8Gcd/pOJWe+0dvI0Tt6f3fTi8FvFEm0Ko2fcCDc7DU8IdnH09vCIksdGD1F2O/aCmnWGN89BcMXG2rnOVxS/096eEcBdUdRzCybQ1qOzp0kOkOPwBB2I8CC6AI/v///wEAAAACSAMA+reEWPVPvOzvT4yZbwXFrFmxJBj/////AAAAAAGkAQD9W0Ks+ide9vcnxsy3gmLWrFgSDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA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"; - exports.pq = 712; - exports.pr = 3464; - exports.pG1gen = 42104; - exports.pG1zero = 42248; - exports.pG1b = 4776; - exports.pG2gen = 42392; - exports.pG2zero = 42680; - exports.pG2b = 16984; - exports.pOneT = 42968; - exports.prePSize = 288; - exports.preQSize = 20448; - exports.n8q = 48; - exports.n8r = 32; - exports.q = "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787"; - exports.r = "52435875175126190479447740508185965837690552500527637822603658699938581184513"; - \ No newline at end of file +export const code = "AGFzbQEAAAABlQESYAJ/fwBgAX8AYAF/AX9gAn9/AX9gA39/fwF/YAN/f38AYAN/fn8AYAJ/fgBgBH9/f38AYAV/f39/fwBgBH9/f38Bf2AGf39/f39/AGAIf39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38Bf2AHf39/f39/fwF/YAl/f39/f39/f38Bf2ALf39/f39/f39/f38BfwIPAQNlbnYGbWVtb3J5AgAZA9MC0QIAAQIBAwMEBAUAAAYHCAUCBQUAAAUAAAAAAgIAAQUICQUFBQgICAgAAgABAgEDAwQEBQAABgcIBQIFBQAABQAAAAACAgABBQgJBQUFCAgICAACBQAAAgICAQEAAAADAwMAAAUFBQAABQUFAAAAAAACAgUABQAAAAAFBQUFBQoLDAkKCwwJCAgDAAgIAgAACQsLBQULAAgNCQgCAgEBAAUFAAUFAAAAAAMACAICCQgAAgICAQEAAAADAwMAAAUFBQAABQUFAAAAAAACAgUABQAAAAAFBQUFBQoLDAkKCwwJCAgFAwAICAIAAAkLCwUFCwUDAAgIAgAACQsLBQULBQUJCQkJCQACAgEBAAUABQUAAgAAAwAIAgkIAAICAQEABQUABQUAAAAAAwAIAgIJCAACBQgJBQAAAAAAAAAAAAACAgICBQAAAAUAAAAABA4PEBEFB84nvQIJaW50cV9jb3B5AAAJaW50cV96ZXJvAAEIaW50cV9vbmUAAwtpbnRxX2lzWmVybwACB2ludHFfZXEABAhpbnRxX2d0ZQAFCGludHFfYWRkAAYIaW50cV9zdWIABwhpbnRxX211bAAIC2ludHFfc3F1YXJlAAkOaW50cV9zcXVhcmVPbGQACghpbnRxX2RpdgAND2ludHFfaW52ZXJzZU1vZAAOCGYxbV9jb3B5AAAIZjFtX3plcm8AAQpmMW1faXNaZXJvAAIGZjFtX2VxAAQHZjFtX2FkZAAQB2YxbV9zdWIAEQdmMW1fbmVnABIOZjFtX2lzTmVnYXRpdmUAGQlmMW1faXNPbmUADwhmMW1fc2lnbgAaC2YxbV9tUmVkdWN0ABMHZjFtX211bAAUCmYxbV9zcXVhcmUAFQ1mMW1fc3F1YXJlT2xkABYSZjFtX2Zyb21Nb250Z29tZXJ5ABgQZjFtX3RvTW9udGdvbWVyeQAXC2YxbV9pbnZlcnNlABsHZjFtX29uZQAcCGYxbV9sb2FkAB0PZjFtX3RpbWVzU2NhbGFyAB4HZjFtX2V4cAAmEGYxbV9iYXRjaEludmVyc2UAHwhmMW1fc3FydAAnDGYxbV9pc1NxdWFyZQAoFWYxbV9iYXRjaFRvTW9udGdvbWVyeQAgF2YxbV9iYXRjaEZyb21Nb250Z29tZXJ5ACEJaW50cl9jb3B5ACkJaW50cl96ZXJvACoIaW50cl9vbmUALAtpbnRyX2lzWmVybwArB2ludHJfZXEALQhpbnRyX2d0ZQAuCGludHJfYWRkAC8IaW50cl9zdWIAMAhpbnRyX211bAAxC2ludHJfc3F1YXJlADIOaW50cl9zcXVhcmVPbGQAMwhpbnRyX2RpdgA2D2ludHJfaW52ZXJzZU1vZAA3CGZybV9jb3B5ACkIZnJtX3plcm8AKgpmcm1faXNaZXJvACsGZnJtX2VxAC0HZnJtX2FkZAA5B2ZybV9zdWIAOgdmcm1fbmVnADsOZnJtX2lzTmVnYXRpdmUAQglmcm1faXNPbmUAOAhmcm1fc2lnbgBDC2ZybV9tUmVkdWN0ADwHZnJtX211bAA9CmZybV9zcXVhcmUAPg1mcm1fc3F1YXJlT2xkAD8SZnJtX2Zyb21Nb250Z29tZXJ5AEEQZnJtX3RvTW9udGdvbWVyeQBAC2ZybV9pbnZlcnNlAEQHZnJtX29uZQBFCGZybV9sb2FkAEYPZnJtX3RpbWVzU2NhbGFyAEcHZnJtX2V4cABPEGZybV9iYXRjaEludmVyc2UASAhmcm1fc3FydABQDGZybV9pc1NxdWFyZQBRFWZybV9iYXRjaFRvTW9udGdvbWVyeQBJF2ZybV9iYXRjaEZyb21Nb250Z29tZXJ5AEoGZnJfYWRkADkGZnJfc3ViADoGZnJfbmVnADsGZnJfbXVsAFIJZnJfc3F1YXJlAFMKZnJfaW52ZXJzZQBUDWZyX2lzTmVnYXRpdmUAVQdmcl9jb3B5ACkHZnJfemVybwAqBmZyX29uZQBFCWZyX2lzWmVybwArBWZyX2VxAC0MZzFtX211bHRpZXhwAIABEmcxbV9tdWx0aWV4cF9jaHVuawB/EmcxbV9tdWx0aWV4cEFmZmluZQCEARhnMW1fbXVsdGlleHBBZmZpbmVfY2h1bmsAgwEKZzFtX2lzWmVybwBXEGcxbV9pc1plcm9BZmZpbmUAVgZnMW1fZXEAXwtnMW1fZXFNaXhlZABeDGcxbV9lcUFmZmluZQBdCGcxbV9jb3B5AFsOZzFtX2NvcHlBZmZpbmUAWghnMW1femVybwBZDmcxbV96ZXJvQWZmaW5lAFgKZzFtX2RvdWJsZQBhEGcxbV9kb3VibGVBZmZpbmUAYAdnMW1fYWRkAGQMZzFtX2FkZE1peGVkAGMNZzFtX2FkZEFmZmluZQBiB2cxbV9uZWcAZg1nMW1fbmVnQWZmaW5lAGUHZzFtX3N1YgBpDGcxbV9zdWJNaXhlZABoDWcxbV9zdWJBZmZpbmUAZxJnMW1fZnJvbU1vbnRnb21lcnkAaxhnMW1fZnJvbU1vbnRnb21lcnlBZmZpbmUAahBnMW1fdG9Nb250Z29tZXJ5AG0WZzFtX3RvTW9udGdvbWVyeUFmZmluZQBsD2cxbV90aW1lc1NjYWxhcgCFARVnMW1fdGltZXNTY2FsYXJBZmZpbmUAhgENZzFtX25vcm1hbGl6ZQByCmcxbV9MRU10b1UAdApnMW1fTEVNdG9DAHUKZzFtX1V0b0xFTQB2CmcxbV9DdG9MRU0Adw9nMW1fYmF0Y2hMRU10b1UAeA9nMW1fYmF0Y2hMRU10b0MAeQ9nMW1fYmF0Y2hVdG9MRU0Aeg9nMW1fYmF0Y2hDdG9MRU0AewxnMW1fdG9BZmZpbmUAbg5nMW1fdG9KYWNvYmlhbgBcEWcxbV9iYXRjaFRvQWZmaW5lAHETZzFtX2JhdGNoVG9KYWNvYmlhbgB8C2cxbV9pbkN1cnZlAHARZzFtX2luQ3VydmVBZmZpbmUAbxdmcm1fX3JldmVyc2VQZXJtdXRhdGlvbgCIAQdmcm1fZmZ0AIwBCGZybV9pZmZ0AI0BCmZybV9yYXdmZnQAigELZnJtX2ZmdEpvaW4AjgEOZnJtX2ZmdEpvaW5FeHQAjwERZnJtX2ZmdEpvaW5FeHRJbnYAkAEKZnJtX2ZmdE1peACRAQxmcm1fZmZ0RmluYWwAkgEdZnJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24AkwEIcG9sX3plcm8AlAEPcG9sX2NvbnN0cnVjdExDAJUBDHFhcF9idWlsZEFCQwCWAQtxYXBfam9pbkFCQwCXAQxxYXBfYmF0Y2hBZGQAmAEKZjJtX2lzWmVybwCZAQlmMm1faXNPbmUAmgEIZjJtX3plcm8AmwEHZjJtX29uZQCcAQhmMm1fY29weQCdAQdmMm1fbXVsAJ4BCGYybV9tdWwxAJ8BCmYybV9zcXVhcmUAoAEHZjJtX2FkZAChAQdmMm1fc3ViAKIBB2YybV9uZWcAowEIZjJtX3NpZ24AqgENZjJtX2Nvbmp1Z2F0ZQCkARJmMm1fZnJvbU1vbnRnb21lcnkApgEQZjJtX3RvTW9udGdvbWVyeQClAQZmMm1fZXEApwELZjJtX2ludmVyc2UAqAEHZjJtX2V4cACtAQ9mMm1fdGltZXNTY2FsYXIAqQEQZjJtX2JhdGNoSW52ZXJzZQCsAQhmMm1fc3FydACuAQxmMm1faXNTcXVhcmUArwEOZjJtX2lzTmVnYXRpdmUAqwEMZzJtX211bHRpZXhwANoBEmcybV9tdWx0aWV4cF9jaHVuawDZARJnMm1fbXVsdGlleHBBZmZpbmUA3gEYZzJtX211bHRpZXhwQWZmaW5lX2NodW5rAN0BCmcybV9pc1plcm8AsQEQZzJtX2lzWmVyb0FmZmluZQCwAQZnMm1fZXEAuQELZzJtX2VxTWl4ZWQAuAEMZzJtX2VxQWZmaW5lALcBCGcybV9jb3B5ALUBDmcybV9jb3B5QWZmaW5lALQBCGcybV96ZXJvALMBDmcybV96ZXJvQWZmaW5lALIBCmcybV9kb3VibGUAuwEQZzJtX2RvdWJsZUFmZmluZQC6AQdnMm1fYWRkAL4BDGcybV9hZGRNaXhlZAC9AQ1nMm1fYWRkQWZmaW5lALwBB2cybV9uZWcAwAENZzJtX25lZ0FmZmluZQC/AQdnMm1fc3ViAMMBDGcybV9zdWJNaXhlZADCAQ1nMm1fc3ViQWZmaW5lAMEBEmcybV9mcm9tTW9udGdvbWVyeQDFARhnMm1fZnJvbU1vbnRnb21lcnlBZmZpbmUAxAEQZzJtX3RvTW9udGdvbWVyeQDHARZnMm1fdG9Nb250Z29tZXJ5QWZmaW5lAMYBD2cybV90aW1lc1NjYWxhcgDfARVnMm1fdGltZXNTY2FsYXJBZmZpbmUA4AENZzJtX25vcm1hbGl6ZQDMAQpnMm1fTEVNdG9VAM4BCmcybV9MRU10b0MAzwEKZzJtX1V0b0xFTQDQAQpnMm1fQ3RvTEVNANEBD2cybV9iYXRjaExFTXRvVQDSAQ9nMm1fYmF0Y2hMRU10b0MA0wEPZzJtX2JhdGNoVXRvTEVNANQBD2cybV9iYXRjaEN0b0xFTQDVAQxnMm1fdG9BZmZpbmUAyAEOZzJtX3RvSmFjb2JpYW4AtgERZzJtX2JhdGNoVG9BZmZpbmUAywETZzJtX2JhdGNoVG9KYWNvYmlhbgDWAQtnMm1faW5DdXJ2ZQDKARFnMm1faW5DdXJ2ZUFmZmluZQDJAQtnMW1fdGltZXNGcgDhARdnMW1fX3JldmVyc2VQZXJtdXRhdGlvbgDjAQdnMW1fZmZ0AOcBCGcxbV9pZmZ0AOgBCmcxbV9yYXdmZnQA5QELZzFtX2ZmdEpvaW4A6QEOZzFtX2ZmdEpvaW5FeHQA6gERZzFtX2ZmdEpvaW5FeHRJbnYA6wEKZzFtX2ZmdE1peADsAQxnMW1fZmZ0RmluYWwA7QEdZzFtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24A7gELZzJtX3RpbWVzRnIA7wEXZzJtX19yZXZlcnNlUGVybXV0YXRpb24A8QEHZzJtX2ZmdAD1AQhnMm1faWZmdAD2AQpnMm1fcmF3ZmZ0APMBC2cybV9mZnRKb2luAPcBDmcybV9mZnRKb2luRXh0APgBEWcybV9mZnRKb2luRXh0SW52APkBCmcybV9mZnRNaXgA+gEMZzJtX2ZmdEZpbmFsAPsBHWcybV9wcmVwYXJlTGFncmFuZ2VFdmFsdWF0aW9uAPwBEWcxbV90aW1lc0ZyQWZmaW5lAP0BEWcybV90aW1lc0ZyQWZmaW5lAP4BEWZybV9iYXRjaEFwcGx5S2V5AP8BEWcxbV9iYXRjaEFwcGx5S2V5AIACFmcxbV9iYXRjaEFwcGx5S2V5TWl4ZWQAgQIRZzJtX2JhdGNoQXBwbHlLZXkAggIWZzJtX2JhdGNoQXBwbHlLZXlNaXhlZACDAgpmNm1faXNaZXJvAIUCCWY2bV9pc09uZQCGAghmNm1femVybwCHAgdmNm1fb25lAIgCCGY2bV9jb3B5AIkCB2Y2bV9tdWwAigIKZjZtX3NxdWFyZQCLAgdmNm1fYWRkAIwCB2Y2bV9zdWIAjQIHZjZtX25lZwCOAghmNm1fc2lnbgCPAhJmNm1fZnJvbU1vbnRnb21lcnkAkQIQZjZtX3RvTW9udGdvbWVyeQCQAgZmNm1fZXEAkgILZjZtX2ludmVyc2UAkwIHZjZtX2V4cACXAg9mNm1fdGltZXNTY2FsYXIAlAIQZjZtX2JhdGNoSW52ZXJzZQCWAg5mNm1faXNOZWdhdGl2ZQCVAgpmdG1faXNaZXJvAJkCCWZ0bV9pc09uZQCaAghmdG1femVybwCbAgdmdG1fb25lAJwCCGZ0bV9jb3B5AJ0CB2Z0bV9tdWwAngIIZnRtX211bDEAnwIKZnRtX3NxdWFyZQCgAgdmdG1fYWRkAKECB2Z0bV9zdWIAogIHZnRtX25lZwCjAghmdG1fc2lnbgCqAg1mdG1fY29uanVnYXRlAKQCEmZ0bV9mcm9tTW9udGdvbWVyeQCmAhBmdG1fdG9Nb250Z29tZXJ5AKUCBmZ0bV9lcQCnAgtmdG1faW52ZXJzZQCoAgdmdG1fZXhwAK0CD2Z0bV90aW1lc1NjYWxhcgCpAhBmdG1fYmF0Y2hJbnZlcnNlAKwCCGZ0bV9zcXJ0AK4CDGZ0bV9pc1NxdWFyZQCvAg5mdG1faXNOZWdhdGl2ZQCrAhFmdG1fZnJvYmVuaXVzTWFwMAC0AhFmdG1fZnJvYmVuaXVzTWFwMQC1AhFmdG1fZnJvYmVuaXVzTWFwMgC2AhFmdG1fZnJvYmVuaXVzTWFwMwC3AhFmdG1fZnJvYmVuaXVzTWFwNAC4AhFmdG1fZnJvYmVuaXVzTWFwNQC5AhFmdG1fZnJvYmVuaXVzTWFwNgC6AhFmdG1fZnJvYmVuaXVzTWFwNwC7AhFmdG1fZnJvYmVuaXVzTWFwOAC8AhFmdG1fZnJvYmVuaXVzTWFwOQC9AhNibHMxMjM4MV9wYWlyaW5nRXExAMsCE2JsczEyMzgxX3BhaXJpbmdFcTIAzAITYmxzMTIzODFfcGFpcmluZ0VxMwDNAhNibHMxMjM4MV9wYWlyaW5nRXE0AM4CE2JsczEyMzgxX3BhaXJpbmdFcTUAzwIQYmxzMTIzODFfcGFpcmluZwDQAhJibHMxMjM4MV9wcmVwYXJlRzEAxAISYmxzMTIzODFfcHJlcGFyZUcyAMUCE2JsczEyMzgxX21pbGxlckxvb3AAxgIcYmxzMTIzODFfZmluYWxFeHBvbmVudGlhdGlvbgDKAh9ibHMxMjM4MV9maW5hbEV4cG9uZW50aWF0aW9uT2xkAMcCGmJsczEyMzgxX19jeWNsb3RvbWljU3F1YXJlAMgCGmJsczEyMzgxX19jeWNsb3RvbWljRXhwX3cwAMkCCGY2bV9tdWwxALACCWY2bV9tdWwwMQCxAgpmdG1fbXVsMDE0ALICEWcxbV9pbkdyb3VwQWZmaW5lAL4CC2cxbV9pbkdyb3VwAL8CEWcybV9pbkdyb3VwQWZmaW5lAMACC2cybV9pbkdyb3VwAMECCvK7BdECPgAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AygLLAAgAEIANwMAIABCADcDCCAAQgA3AxAgAEIANwMYIABCADcDICAAQgA3AygLTQAgACkDKFAEQCAAKQMgUARAIAApAxhQBEAgACkDEFAEQCAAKQMIUARAIAApAwBQDwVBAA8LBUEADwsFQQAPCwVBAA8LBUEADwtBAA8LLAAgAEIBNwMAIABCADcDCCAAQgA3AxAgAEIANwMYIABCADcDICAAQgA3AygLawAgACkDKCABKQMoUQRAIAApAyAgASkDIFEEQCAAKQMYIAEpAxhRBEAgACkDECABKQMQUQRAIAApAwggASkDCFEEQCAAKQMAIAEpAwBRDwVBAA8LBUEADwsFQQAPCwVBAA8LBUEADwtBAA8LxQEAIAApAyggASkDKFQEQEEADwUgACkDKCABKQMoVgRAQQEPBSAAKQMgIAEpAyBUBEBBAA8FIAApAyAgASkDIFYEQEEBDwUgACkDGCABKQMYVARAQQAPBSAAKQMYIAEpAxhWBEBBAQ8FIAApAxAgASkDEFQEQEEADwUgACkDECABKQMQVgRAQQEPBSAAKQMIIAEpAwhUBEBBAA8FIAApAwggASkDCFYEQEEBDwUgACkDACABKQMAWg8LCwsLCwsLCwsLQQAPC7wCAQF+IAA1AgAgATUCAHwhAyACIAM+AgAgADUCBCABNQIEfCADQiCIfCEDIAIgAz4CBCAANQIIIAE1Agh8IANCIIh8IQMgAiADPgIIIAA1AgwgATUCDHwgA0IgiHwhAyACIAM+AgwgADUCECABNQIQfCADQiCIfCEDIAIgAz4CECAANQIUIAE1AhR8IANCIIh8IQMgAiADPgIUIAA1AhggATUCGHwgA0IgiHwhAyACIAM+AhggADUCHCABNQIcfCADQiCIfCEDIAIgAz4CHCAANQIgIAE1AiB8IANCIIh8IQMgAiADPgIgIAA1AiQgATUCJHwgA0IgiHwhAyACIAM+AiQgADUCKCABNQIofCADQiCIfCEDIAIgAz4CKCAANQIsIAE1Aix8IANCIIh8IQMgAiADPgIsIANCIIinC5ADAQF+IAA1AgAgATUCAH0hAyACIANC/////w+DPgIAIAA1AgQgATUCBH0gA0Igh3whAyACIANC/////w+DPgIEIAA1AgggATUCCH0gA0Igh3whAyACIANC/////w+DPgIIIAA1AgwgATUCDH0gA0Igh3whAyACIANC/////w+DPgIMIAA1AhAgATUCEH0gA0Igh3whAyACIANC/////w+DPgIQIAA1AhQgATUCFH0gA0Igh3whAyACIANC/////w+DPgIUIAA1AhggATUCGH0gA0Igh3whAyACIANC/////w+DPgIYIAA1AhwgATUCHH0gA0Igh3whAyACIANC/////w+DPgIcIAA1AiAgATUCIH0gA0Igh3whAyACIANC/////w+DPgIgIAA1AiQgATUCJH0gA0Igh3whAyACIANC/////w+DPgIkIAA1AiggATUCKH0gA0Igh3whAyACIANC/////w+DPgIoIAA1AiwgATUCLH0gA0Igh3whAyACIANC/////w+DPgIsIANCIIenC6ciGgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4gA0L/////D4MgADUCACIFIAE1AgAiBn58IQMgBCADQiCIfCEEIAIgAz4CACAEQiCIIQMgBEL/////D4MgBSABNQIEIgh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIEIgcgBn58IQQgAyAEQiCIfCEDIAIgBD4CBCADQiCIIQQgA0L/////D4MgBSABNQIIIgp+fCEDIAQgA0IgiHwhBCADQv////8PgyAHIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIIIgkgBn58IQMgBCADQiCIfCEEIAIgAz4CCCAEQiCIIQMgBEL/////D4MgBSABNQIMIgx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAHIAp+fCEEIAMgBEIgiHwhAyAEQv////8PgyAJIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIMIgsgBn58IQQgAyAEQiCIfCEDIAIgBD4CDCADQiCIIQQgA0L/////D4MgBSABNQIQIg5+fCEDIAQgA0IgiHwhBCADQv////8PgyAHIAx+fCEDIAQgA0IgiHwhBCADQv////8PgyAJIAp+fCEDIAQgA0IgiHwhBCADQv////8PgyALIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIQIg0gBn58IQMgBCADQiCIfCEEIAIgAz4CECAEQiCIIQMgBEL/////D4MgBSABNQIUIhB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAHIA5+fCEEIAMgBEIgiHwhAyAEQv////8PgyAJIAx+fCEEIAMgBEIgiHwhAyAEQv////8PgyALIAp+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIUIg8gBn58IQQgAyAEQiCIfCEDIAIgBD4CFCADQiCIIQQgA0L/////D4MgBSABNQIYIhJ+fCEDIAQgA0IgiHwhBCADQv////8PgyAHIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyAJIA5+fCEDIAQgA0IgiHwhBCADQv////8PgyALIAx+fCEDIAQgA0IgiHwhBCADQv////8PgyANIAp+fCEDIAQgA0IgiHwhBCADQv////8PgyAPIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIYIhEgBn58IQMgBCADQiCIfCEEIAIgAz4CGCAEQiCIIQMgBEL/////D4MgBSABNQIcIhR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAHIBJ+fCEEIAMgBEIgiHwhAyAEQv////8PgyAJIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyALIA5+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIAx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAPIAp+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIcIhMgBn58IQQgAyAEQiCIfCEDIAIgBD4CHCADQiCIIQQgA0L/////D4MgBSABNQIgIhZ+fCEDIAQgA0IgiHwhBCADQv////8PgyAHIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyAJIBJ+fCEDIAQgA0IgiHwhBCADQv////8PgyALIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyANIA5+fCEDIAQgA0IgiHwhBCADQv////8PgyAPIAx+fCEDIAQgA0IgiHwhBCADQv////8PgyARIAp+fCEDIAQgA0IgiHwhBCADQv////8PgyATIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIgIhUgBn58IQMgBCADQiCIfCEEIAIgAz4CICAEQiCIIQMgBEL/////D4MgBSABNQIkIhh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAHIBZ+fCEEIAMgBEIgiHwhAyAEQv////8PgyAJIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyALIBJ+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAPIA5+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIAx+fCEEIAMgBEIgiHwhAyAEQv////8PgyATIAp+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIkIhcgBn58IQQgAyAEQiCIfCEDIAIgBD4CJCADQiCIIQQgA0L/////D4MgBSABNQIoIhp+fCEDIAQgA0IgiHwhBCADQv////8PgyAHIBh+fCEDIAQgA0IgiHwhBCADQv////8PgyAJIBZ+fCEDIAQgA0IgiHwhBCADQv////8PgyALIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyANIBJ+fCEDIAQgA0IgiHwhBCADQv////8PgyAPIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyARIA5+fCEDIAQgA0IgiHwhBCADQv////8PgyATIAx+fCEDIAQgA0IgiHwhBCADQv////8PgyAVIAp+fCEDIAQgA0IgiHwhBCADQv////8PgyAXIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIoIhkgBn58IQMgBCADQiCIfCEEIAIgAz4CKCAEQiCIIQMgBEL/////D4MgBSABNQIsIhx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAHIBp+fCEEIAMgBEIgiHwhAyAEQv////8PgyAJIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyALIBZ+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAPIBJ+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyATIA5+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVIAx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAXIAp+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIsIhsgBn58IQQgAyAEQiCIfCEDIAIgBD4CLCADQiCIIQQgA0L/////D4MgByAcfnwhAyAEIANCIIh8IQQgA0L/////D4MgCSAafnwhAyAEIANCIIh8IQQgA0L/////D4MgCyAYfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAWfnwhAyAEIANCIIh8IQQgA0L/////D4MgDyAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgESASfnwhAyAEIANCIIh8IQQgA0L/////D4MgEyAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgFSAOfnwhAyAEIANCIIh8IQQgA0L/////D4MgFyAMfnwhAyAEIANCIIh8IQQgA0L/////D4MgGSAKfnwhAyAEIANCIIh8IQQgA0L/////D4MgGyAIfnwhAyAEIANCIIh8IQQgAiADPgIwIARCIIghAyAEQv////8PgyAJIBx+fCEEIAMgBEIgiHwhAyAEQv////8PgyALIBp+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAPIBZ+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyATIBJ+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAXIA5+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZIAx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAbIAp+fCEEIAMgBEIgiHwhAyACIAQ+AjQgA0IgiCEEIANC/////w+DIAsgHH58IQMgBCADQiCIfCEEIANC/////w+DIA0gGn58IQMgBCADQiCIfCEEIANC/////w+DIA8gGH58IQMgBCADQiCIfCEEIANC/////w+DIBEgFn58IQMgBCADQiCIfCEEIANC/////w+DIBMgFH58IQMgBCADQiCIfCEEIANC/////w+DIBUgEn58IQMgBCADQiCIfCEEIANC/////w+DIBcgEH58IQMgBCADQiCIfCEEIANC/////w+DIBkgDn58IQMgBCADQiCIfCEEIANC/////w+DIBsgDH58IQMgBCADQiCIfCEEIAIgAz4COCAEQiCIIQMgBEL/////D4MgDSAcfnwhBCADIARCIIh8IQMgBEL/////D4MgDyAafnwhBCADIARCIIh8IQMgBEL/////D4MgESAYfnwhBCADIARCIIh8IQMgBEL/////D4MgEyAWfnwhBCADIARCIIh8IQMgBEL/////D4MgFSAUfnwhBCADIARCIIh8IQMgBEL/////D4MgFyASfnwhBCADIARCIIh8IQMgBEL/////D4MgGSAQfnwhBCADIARCIIh8IQMgBEL/////D4MgGyAOfnwhBCADIARCIIh8IQMgAiAEPgI8IANCIIghBCADQv////8PgyAPIBx+fCEDIAQgA0IgiHwhBCADQv////8PgyARIBp+fCEDIAQgA0IgiHwhBCADQv////8PgyATIBh+fCEDIAQgA0IgiHwhBCADQv////8PgyAVIBZ+fCEDIAQgA0IgiHwhBCADQv////8PgyAXIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyAZIBJ+fCEDIAQgA0IgiHwhBCADQv////8PgyAbIBB+fCEDIAQgA0IgiHwhBCACIAM+AkAgBEIgiCEDIARC/////w+DIBEgHH58IQQgAyAEQiCIfCEDIARC/////w+DIBMgGn58IQQgAyAEQiCIfCEDIARC/////w+DIBUgGH58IQQgAyAEQiCIfCEDIARC/////w+DIBcgFn58IQQgAyAEQiCIfCEDIARC/////w+DIBkgFH58IQQgAyAEQiCIfCEDIARC/////w+DIBsgEn58IQQgAyAEQiCIfCEDIAIgBD4CRCADQiCIIQQgA0L/////D4MgEyAcfnwhAyAEIANCIIh8IQQgA0L/////D4MgFSAafnwhAyAEIANCIIh8IQQgA0L/////D4MgFyAYfnwhAyAEIANCIIh8IQQgA0L/////D4MgGSAWfnwhAyAEIANCIIh8IQQgA0L/////D4MgGyAUfnwhAyAEIANCIIh8IQQgAiADPgJIIARCIIghAyAEQv////8PgyAVIBx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAXIBp+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAbIBZ+fCEEIAMgBEIgiHwhAyACIAQ+AkwgA0IgiCEEIANC/////w+DIBcgHH58IQMgBCADQiCIfCEEIANC/////w+DIBkgGn58IQMgBCADQiCIfCEEIANC/////w+DIBsgGH58IQMgBCADQiCIfCEEIAIgAz4CUCAEQiCIIQMgBEL/////D4MgGSAcfnwhBCADIARCIIh8IQMgBEL/////D4MgGyAafnwhBCADIARCIIh8IQMgAiAEPgJUIANCIIghBCADQv////8PgyAbIBx+fCEDIAQgA0IgiHwhBCACIAM+AlggBEIgiCEDIAIgBD4CXAvOIBABfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfkIAIQJCACEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAA1AgAiBiAGfnwhAiADIAJCIIh8IQMgASACPgIAIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AgQiB358IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AgQgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCCCIIfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgByAHfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CCCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIMIgl+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAh+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIMIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AhAiCn58IQIgAyACQiCIfCEDIAJC/////w+DIAcgCX58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAggCH58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AhAgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCFCILfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAKfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCAJfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CFCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIYIgx+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAt+fCECIAMgAkIgiHwhAyACQv////8PgyAIIAp+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAJIAl+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIYIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AhwiDX58IQIgAyACQiCIfCEDIAJC/////w+DIAcgDH58IQIgAyACQiCIfCEDIAJC/////w+DIAggC358IQIgAyACQiCIfCEDIAJC/////w+DIAkgCn58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AhwgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCICIOfnwhAiADIAJCIIh8IQMgAkL/////D4MgByANfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCAMfnwhAiADIAJCIIh8IQMgAkL/////D4MgCSALfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgCiAKfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CICADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIkIg9+fCECIAMgAkIgiHwhAyACQv////8PgyAHIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAIIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAJIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAKIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIkIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AigiEH58IQIgAyACQiCIfCEDIAJC/////w+DIAcgD358IQIgAyACQiCIfCEDIAJC/////w+DIAggDn58IQIgAyACQiCIfCEDIAJC/////w+DIAkgDX58IQIgAyACQiCIfCEDIAJC/////w+DIAogDH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAsgC358IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AiggAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCLCIRfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCAPfnwhAiADIAJCIIh8IQMgAkL/////D4MgCSAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiANfnwhAiADIAJCIIh8IQMgAkL/////D4MgCyAMfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CLCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByARfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgCSAPfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgCyANfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgDCAMfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CMCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCCARfnwhAiADIAJCIIh8IQMgAkL/////D4MgCSAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAPfnwhAiADIAJCIIh8IQMgAkL/////D4MgCyAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgDCANfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CNCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCSARfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgCyAPfnwhAiADIAJCIIh8IQMgAkL/////D4MgDCAOfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgDSANfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4COCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCiARfnwhAiADIAJCIIh8IQMgAkL/////D4MgCyAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgDCAPfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSAOfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CPCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCyARfnwhAiADIAJCIIh8IQMgAkL/////D4MgDCAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSAPfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgDiAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CQCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgDCARfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgDiAPfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CRCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgDSARfnwhAiADIAJCIIh8IQMgAkL/////D4MgDiAQfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgDyAPfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CSCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgDiARfnwhAiADIAJCIIh8IQMgAkL/////D4MgDyAQfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CTCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgDyARfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgECAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CUCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgECARfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CVCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgESARfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CWCADIQQgBEIgiCEFIAEgBD4CXAsKACAAIAAgARAIC5ICAQF+IAA1AAAgAX4hAyACIAM+AAAgADUABCABfiADQiCIfCEDIAIgAz4ABCAANQAIIAF+IANCIIh8IQMgAiADPgAIIAA1AAwgAX4gA0IgiHwhAyACIAM+AAwgADUAECABfiADQiCIfCEDIAIgAz4AECAANQAUIAF+IANCIIh8IQMgAiADPgAUIAA1ABggAX4gA0IgiHwhAyACIAM+ABggADUAHCABfiADQiCIfCEDIAIgAz4AHCAANQAgIAF+IANCIIh8IQMgAiADPgAgIAA1ACQgAX4gA0IgiHwhAyACIAM+ACQgADUAKCABfiADQiCIfCEDIAIgAz4AKCAANQAsIAF+IANCIIh8IQMgAiADPgAsC04CAX4BfyAAIQMgAzUAACABfCECIAMgAj4AACACQiCIIQICQANAIAJQDQEgA0EEaiEDIAM1AAAgAnwhAiADIAI+AAAgAkIgiCECDAALCwurAgcBfwF/AX8BfwF+AX4BfyACBEAgAiEFBUHYACEFCyADBEAgAyEEBUGIASEECyAAIAQQACABQSgQACAFEAFBuAEQAUEvIQZBLyEHAkADQEEoIAdqLQAAIAdBA0ZyDQEgB0EBayEHDAALC0EoIAdqQQNrNQAAQgF8IQggCEIBUQRAQgBCAIAaCwJAA0ACQANAIAQgBmotAAAgBkEHRnINASAGQQFrIQYMAAsLIAQgBmpBB2spAAAhCSAJIAiAIQkgBiAHa0EEayEKAkADQCAJQoCAgIBwg1AgCkEATnENASAJQgiIIQkgCkEBaiEKDAALCyAJUARAIARBKBAFRQ0CQgEhCUEAIQoLQSggCUHoARALIARB6AEgCmsgBBAHGiAFIApqIAkQDAwACwsLtQILAX8BfwF/AX8BfwF/AX8BfwF/AX8Bf0GYAiEDQZgCEAFBACELQcgCIQUgAUHIAhAAQfgCIQRB+AIQA0EAIQxBqAMhCCAAQagDEABB2AMhBkGIBCEHQZgFIQoCQANAIAgQAg0BIAUgCCAGIAcQDSAGIARBuAQQCCALBEAgDARAQbgEIAMQBQRAQbgEIAMgChAHGkEAIQ0FIANBuAQgChAHGkEBIQ0LBUG4BCADIAoQBhpBASENCwUgDARAQbgEIAMgChAGGkEAIQ0FIANBuAQQBQRAIANBuAQgChAHGkEAIQ0FQbgEIAMgChAHGkEBIQ0LCwsgAyEJIAQhAyAKIQQgCSEKIAwhCyANIQwgBSEJIAghBSAHIQggCSEHDAALCyALBEAgASADIAIQBxoFIAMgAhAACwsKACAAQagGEAQPCywAIAAgASACEAYEQCACQcgFIAIQBxoFIAJByAUQBQRAIAJByAUgAhAHGgsLCxcAIAAgASACEAcEQCACQcgFIAIQBhoLCwsAQdgGIAAgARARC/wkAwF+AX4BfkL9//P/DyECQgAhAyAANQIAIAJ+Qv////8PgyEEIAA1AgAgA0IgiHxByAU1AgAgBH58IQMgACADPgIAIAA1AgQgA0IgiHxByAU1AgQgBH58IQMgACADPgIEIAA1AgggA0IgiHxByAU1AgggBH58IQMgACADPgIIIAA1AgwgA0IgiHxByAU1AgwgBH58IQMgACADPgIMIAA1AhAgA0IgiHxByAU1AhAgBH58IQMgACADPgIQIAA1AhQgA0IgiHxByAU1AhQgBH58IQMgACADPgIUIAA1AhggA0IgiHxByAU1AhggBH58IQMgACADPgIYIAA1AhwgA0IgiHxByAU1AhwgBH58IQMgACADPgIcIAA1AiAgA0IgiHxByAU1AiAgBH58IQMgACADPgIgIAA1AiQgA0IgiHxByAU1AiQgBH58IQMgACADPgIkIAA1AiggA0IgiHxByAU1AiggBH58IQMgACADPgIoIAA1AiwgA0IgiHxByAU1AiwgBH58IQMgACADPgIsQfgIIANCIIg+AgBCACEDIAA1AgQgAn5C/////w+DIQQgADUCBCADQiCIfEHIBTUCACAEfnwhAyAAIAM+AgQgADUCCCADQiCIfEHIBTUCBCAEfnwhAyAAIAM+AgggADUCDCADQiCIfEHIBTUCCCAEfnwhAyAAIAM+AgwgADUCECADQiCIfEHIBTUCDCAEfnwhAyAAIAM+AhAgADUCFCADQiCIfEHIBTUCECAEfnwhAyAAIAM+AhQgADUCGCADQiCIfEHIBTUCFCAEfnwhAyAA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DiADfnwgBXwhBiAGQv////8PgyEaIAZCIIghBSAbIA8gA358IAV8IQYgBkL/////D4MhGyAGQiCIIQUgHCAQIAN+fCAFfCEGIAZC/////w+DIRwgBkIgiCEFIB0gESADfnwgBXwhBiAGQv////8PgyEdIAZCIIghBSAeIBIgA358IAV8IQYgBkL/////D4MhHiAGQiCIIQUgBSEfIBNC/f/z/w9+Qv////8PgyEEIBMgBEKr1f7/D358IQYgBkIgiCEFIBQgBEL///vPC358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQv//z4oLfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC/v+v9QF+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBEKk7MO1D358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgGCAEQqClw7kGfnwgBXwhBiAGQv////8PgyEXIAZCIIghBSAZIARCv6WUnA9+fCAFfCEGIAZC/////w+DIRggBkIgiCEFIBogBEKEl92jBn58IAV8IQYgBkL/////D4MhGSAGQiCIIQUgGyAEQtfZrpoEfnwgBXwhBiAGQv////8PgyEaIAZCIIghBSAcIARCts/u2AR+fCAFfCEGIAZC/////w+DIRsgBkIgiCEFIB0gBEKazf/LA358IAV8IQYgBkL/////D4MhHCAGQiCIIQUgHiAEQuqjhNABfnwgBXwhBiAGQv////8PgyEdIAZCIIghBSAfIAV8IR4gATUCBCEDIBMgByADfnwhBiAGQv////8PgyETIAZCIIghBSAUIAggA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSAJIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgCiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAXIAsgA358IAV8IQYgBkL/////D4MhFyAGQiCIIQUgGCAMIAN+fCAFfCEGIAZC/////w+DIRggBkIgiCEFIBkgDSADfnwgBXwhBiAGQv////8PgyEZIAZCIIghBSAaIA4gA358IAV8IQYgBkL/////D4MhGiAGQiCIIQUgGyAPIAN+fCAFfCEGIAZC/////w+DIRsgBkIgiCEFIBwgECADfnwgBXwhBiAGQv////8PgyEcIAZCIIghBSAdIBEgA358IAV8IQYgBkL/////D4MhHSAGQiCIIQUgHiASIAN+fCAFfCEGIAZC/////w+DIR4gBkIgiCEFIAUhHyATQv3/8/8PfkL/////D4MhBCATIARCq9X+/w9+fCEGIAZCIIghBSAUIARC///7zwt+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBUgBEL//8+KC358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFiAEQv7/r/UBfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAXIARCpOzDtQ9+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIBggBEKgpcO5Bn58IAV8IQYgBkL/////D4MhFyAGQiCIIQUgGSAEQr+llJwPfnwgBXwhBiAGQv////8PgyEYIAZCIIghBSAaIARChJfdowZ+fCAFfCEGIAZC/////w+DIRkgBkIgiCEFIBsgBELX2a6aBH58IAV8IQYgBkL/////D4MhGiAGQiCIIQUgHCAEQrbP7tgEfnwgBXwhBiAGQv////8PgyEbIAZCIIghBSAdIARCms3/ywN+fCAFfCEGIAZC/////w+DIRwgBkIgiCEFIB4gBELqo4TQAX58IAV8IQYgBkL/////D4MhHSAGQiCIIQUgHyAFfCEeIAE1AgghAyATIAcgA358IQYgBkL/////D4MhEyAGQiCIIQUgFCAIIAN+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBUgCSADfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAWIAogA358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgFyALIAN+fCAFfCEGIAZC/////w+DIRcgBkIgiCEFIBggDCADfnwgBXwhBiAGQv////8PgyEYIAZCIIghBSAZIA0gA358IAV8IQYgBkL/////D4MhGSAGQiCIIQUgGiAOIAN+fCAFfCEGIAZC/////w+DIRogBkIgiCEFIBsgDyADfnwgBXwhBiAGQv////8PgyEbIAZCIIghBSAcIBAgA358IAV8IQYgBkL/////D4MhHCAGQiCIIQUgHSARIAN+fCAFfCEGIAZC/////w+DIR0gBkIgiCEFIB4gEiADfnwgBXwhBiAGQv////8PgyEeIAZCIIghBSAFIR8gE0L9//P/D35C/////w+DIQQgEyAEQqvV/v8PfnwhBiAGQiCIIQUgFCAEQv//+88LfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAVIARC///Pigt+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBYgBEL+/6/1AX58IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFyAEQqTsw7UPfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAYIARCoKXDuQZ+fCAFfCEGIAZC/////w+DIRcgBkIgiCEFIBkgBEK/pZScD358IAV8IQYgBkL/////D4MhGCAGQiCIIQUgGiAEQoSX3aMGfnwgBXwhBiAGQv////8PgyEZIAZCIIghBSAbIARC19mumgR+fCAFfCEGIAZC/////w+DIRogBkIgiCEFIBwgBEK2z+7YBH58IAV8IQYgBkL/////D4MhGyAGQiCIIQUgHSAEQprN/8sDfnwgBXwhBiAGQv////8PgyEcIAZCIIghBSAeIARC6qOE0AF+fCAFfCEGIAZC/////w+DIR0gBkIgiCEFIB8gBXwhHiABNQIMIQMgEyAHIAN+fCEGIAZC/////w+DIRMgBkIgiCEFIBQgCCADfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAVIAkgA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFiAKIAN+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIBcgCyADfnwgBXwhBiAGQv////8PgyEXIAZCIIghBSAYIAwgA358IAV8IQYgBkL/////D4MhGCAGQiCIIQUgGSANIAN+fCAFfCEGIAZC/////w+DIRkgBkIgiCEFIBogDiADfnwgBXwhBiAGQv////8PgyEaIAZCIIghBSAbIA8gA358IAV8IQYgBkL/////D4MhGyAGQiCIIQUgHCAQIAN+fCAFfCEGIAZC/////w+DIRwgBkIgiCEFIB0gESADfnwgBXwhBiAGQv////8PgyEdIAZCIIghBSAeIBIgA358IAV8IQYgBkL/////D4MhHiAGQiCIIQUgBSEfIBNC/f/z/w9+Qv////8PgyEEIBMgBEKr1f7/D358IQYgBkIgiCEFIBQgBEL///vPC358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQv//z4oLfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC/v+v9QF+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBEKk7MO1D358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgGCAEQqClw7kGfnwgBXwhBiAGQv////8PgyEXIAZCIIghBSAZIARCv6WUnA9+fCAFfCEGIAZC/////w+DIRggBkIgiCEFIBogBEKEl92jBn58IAV8IQYgBkL/////D4MhGSAGQiCIIQUgGyAEQtfZrpoEfnwgBXwhBiAGQv////8PgyEaIAZCIIghBSAcIARCts/u2AR+fCAFfCEGIAZC/////w+DIRsgBkIgiCEFIB0gBEKazf/LA358IAV8IQYgBkL/////D4MhHCAGQiCIIQUgHiAEQuqjhNABfnwgBXwhBiAGQv////8PgyEdIAZCIIghBSAfIAV8IR4gATUCECEDIBMgByADfnwhBiAGQv////8PgyETIAZCIIghBSAUIAggA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSAJIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgCiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAXIAsgA358IAV8IQYgBkL/////D4MhFyAGQiCIIQUgGCAMIAN+fCAFfCEGIAZC/////w+DIRggBkIgiCEFIBkgDSADfnwgBXwhBiAGQv////8PgyEZIAZCIIghBSAaIA4gA358IAV8IQYgBkL/////D4MhGiAGQiCIIQUgGyAPIAN+fCAFfCEGIAZC/////w+DIRsgBkIgiCEFIBwgECADfnwgBXwhBiAGQv////8PgyEcIAZCIIghBSAdIBEgA358IAV8IQYgBkL/////D4MhHSAGQiCIIQUgHiASIAN+fCAFfCEGIAZC/////w+DIR4gBkIgiCEFIAUhHyATQv3/8/8PfkL/////D4MhBCATIARCq9X+/w9+fCEGIAZCIIghBSAUIARC///7zwt+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBUgBEL//8+KC358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFiAEQv7/r/UBfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAXIARCpOzDtQ9+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIBggBEKgpcO5Bn58IAV8IQYgBkL/////D4MhFyAGQiCIIQUgGSAEQr+llJwPfnwgBXwhBiAGQv////8PgyEYIAZCIIghBSAaIARChJfdowZ+fCAFfCEGIAZC/////w+DIRkgBkIgiCEFIBsgBELX2a6aBH58IAV8IQYgBkL/////D4MhGiAGQiCIIQUgHCAEQrbP7tgEfnwgBXwhBiAGQv////8PgyEbIAZCIIghBSAdIARCms3/ywN+fCAFfCEGIAZC/////w+DIRwgBkIgiCEFIB4gBELqo4TQAX58IAV8IQYgBkL/////D4MhHSAGQiCIIQUgHyAFfCEeIAE1AhQhAyATIAcgA358IQYgBkL/////D4MhEyAGQiCIIQUgFCAIIAN+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBUgCSADfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAWIAogA358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgFyALIAN+fCAFfCEGIAZC/////w+DIRcgBkIgiCEFIBggDCADfnwgBXwhBiAGQv////8PgyEYIAZCIIghBSAZIA0gA358IAV8IQYgBkL/////D4MhGSAGQiCIIQUgGiAOIAN+fCAFfCEGIAZC/////w+DIRogBkIgiCEFIBsgDyADfnwgBXwhBiAGQv////8PgyEbIAZCIIghBSAcIBAgA358IAV8IQYgBkL/////D4MhHCAGQiCIIQUgHSARIAN+fCAFfCEGIAZC/////w+DIR0gBkIgiCEFIB4gEiADfnwgBXwhBiAGQv////8PgyEeIAZCIIghBSAFIR8gE0L9//P/D35C/////w+DIQQgEyAEQqvV/v8PfnwhBiAGQiCIIQUgFCAEQv//+88LfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAVIARC///Pigt+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBYgBEL+/6/1AX58IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFyAEQqTsw7UPfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAYIARCoKXDuQZ+fCAFfCEGIAZC/////w+DIRcgBkIgiCEFIBkgBEK/pZScD358IAV8IQYgBkL/////D4MhGCAGQiCIIQUgGiAEQoSX3aMGfnwgBXwhBiAGQv////8PgyEZIAZCIIghBSAbIARC19mumgR+fCAFfCEGIAZC/////w+DIRogBkIgiCEFIBwgBEK2z+7YBH58IAV8IQYgBkL/////D4MhGyAGQiCIIQUgHSAEQprN/8sDfnwgBXwhBiAGQv////8PgyEcIAZCIIghBSAeIARC6qOE0AF+fCAFfCEGIAZC/////w+DIR0gBkIgiCEFIB8gBXwhHiABNQIYIQMgEyAHIAN+fCEGIAZC/////w+DIRMgBkIgiCEFIBQgCCADfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAVIAkgA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFiAKIAN+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIBcgCyADfnwgBXwhBiAGQv////8PgyEXIAZCIIghBSAYIAwgA358IAV8IQYgBkL/////D4MhGCAGQiCIIQUgGSANIAN+fCAFfCEGIAZC/////w+DIRkgBkIgiCEFIBogDiADfnwgBXwhBiAGQv////8PgyEaIAZCIIghBSAbIA8gA358IAV8IQYgBkL/////D4MhGyAGQiCIIQUgHCAQIAN+fCAFfCEGIAZC/////w+DIRwgBkIgiCEFIB0gESADfnwgBXwhBiAGQv////8PgyEdIAZCIIghBSAeIBIgA358IAV8IQYgBkL/////D4MhHiAGQiCIIQUgBSEfIBNC/f/z/w9+Qv////8PgyEEIBMgBEKr1f7/D358IQYgBkIgiCEFIBQgBEL///vPC358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQv//z4oLfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC/v+v9QF+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBEKk7MO1D358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgGCAEQqClw7kGfnwgBXwhBiAGQv////8PgyEXIAZCIIghBSAZIARCv6WUnA9+fCAFfCEGIAZC/////w+DIRggBkIgiCEFIBogBEKEl92jBn58IAV8IQYgBkL/////D4MhGSAGQiCIIQUgGyAEQtfZrpoEfnwgBXwhBiAGQv////8PgyEaIAZCIIghBSAcIARCts/u2AR+fCAFfCEGIAZC/////w+DIRsgBkIgiCEFIB0gBEKazf/LA358IAV8IQYgBkL/////D4MhHCAGQiCIIQUgHiAEQuqjhNABfnwgBXwhBiAGQv////8PgyEdIAZCIIghBSAfIAV8IR4gATUCHCEDIBMgByADfnwhBiAGQv////8PgyETIAZCIIghBSAUIAggA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSAJIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgCiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAXIAsgA358IAV8IQYgBkL/////D4MhFyAGQiCIIQUgGCAMIAN+fCAFfCEGIAZC/////w+DIRggBkIgiCEFIBkgDSADfnwgBXwhBiAGQv////8PgyEZIAZCIIghBSAaIA4gA358IAV8IQYgBkL/////D4MhGiAGQiCIIQUgGyAPIAN+fCAFfCEGIAZC/////w+DIRsgBkIgiCEFIBwgECADfnwgBXwhBiAGQv////8PgyEcIAZCIIghBSAdIBEgA358IAV8IQYgBkL/////D4MhHSAGQiCIIQUgHiASIAN+fCAFfCEGIAZC/////w+DIR4gBkIgiCEFIAUhHyATQv3/8/8PfkL/////D4MhBCATIARCq9X+/w9+fCEGIAZCIIghBSAUIARC///7zwt+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBUgBEL//8+KC358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFiAEQv7/r/UBfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAXIARCpOzDtQ9+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIBggBEKgpcO5Bn58IAV8IQYgBkL/////D4MhFyAGQiCIIQUgGSAEQr+llJwPfnwgBXwhBiAGQv////8PgyEYIAZCIIghBSAaIARChJfdowZ+fCAFfCEGIAZC/////w+DIRkgBkIgiCEFIBsgBELX2a6aBH58IAV8IQYgBkL/////D4MhGiAGQiCIIQUgHCAEQrbP7tgEfnwgBXwhBiAGQv////8PgyEbIAZCIIghBSAdIARCms3/ywN+fCAFfCEGIAZC/////w+DIRwgBkIgiCEFIB4gBELqo4TQAX58IAV8IQYgBkL/////D4MhHSAGQiCIIQUgHyAFfCEeIAE1AiAhAyATIAcgA358IQYgBkL/////D4MhEyAGQiCIIQUgFCAIIAN+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBUgCSADfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAWIAogA358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgFyALIAN+fCAFfCEGIAZC/////w+DIRcgBkIgiCEFIBggDCADfnwgBXwhBiAGQv////8PgyEYIAZCIIghBSAZIA0gA358IAV8IQYgBkL/////D4MhGSAGQiCIIQUgGiAOIAN+fCAFfCEGIAZC/////w+DIRogBkIgiCEFIBsgDyADfnwgBXwhBiAGQv////8PgyEbIAZCIIghBSAcIBAgA358IAV8IQYgBkL/////D4MhHCAGQiCIIQUgHSARIAN+fCAFfCEGIAZC/////w+DIR0gBkIgiCEFIB4gEiADfnwgBXwhBiAGQv////8PgyEeIAZCIIghBSAFIR8gE0L9//P/D35C/////w+DIQQgEyAEQqvV/v8PfnwhBiAGQiCIIQUgFCAEQv//+88LfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAVIARC///Pigt+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBYgBEL+/6/1AX58IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFyAEQqTsw7UPfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAYIARCoKXDuQZ+fCAFfCEGIAZC/////w+DIRcgBkIgiCEFIBkgBEK/pZScD358IAV8IQYgBkL/////D4MhGCAGQiCIIQUgGiAEQoSX3aMGfnwgBXwhBiAGQv////8PgyEZIAZCIIghBSAbIARC19mumgR+fCAFfCEGIAZC/////w+DIRogBkIgiCEFIBwgBEK2z+7YBH58IAV8IQYgBkL/////D4MhGyAGQiCIIQUgHSAEQprN/8sDfnwgBXwhBiAGQv////8PgyEcIAZCIIghBSAeIARC6qOE0AF+fCAFfCEGIAZC/////w+DIR0gBkIgiCEFIB8gBXwhHiABNQIkIQMgEyAHIAN+fCEGIAZC/////w+DIRMgBkIgiCEFIBQgCCADfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAVIAkgA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFiAKIAN+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIBcgCyADfnwgBXwhBiAGQv////8PgyEXIAZCIIghBSAYIAwgA358IAV8IQYgBkL/////D4MhGCAGQiCIIQUgGSANIAN+fCAFfCEGIAZC/////w+DIRkgBkIgiCEFIBogDiADfnwgBXwhBiAGQv////8PgyEaIAZCIIghBSAbIA8gA358IAV8IQYgBkL/////D4MhGyAGQiCIIQUgHCAQIAN+fCAFfCEGIAZC/////w+DIRwgBkIgiCEFIB0gESADfnwgBXwhBiAGQv////8PgyEdIAZCIIghBSAeIBIgA358IAV8IQYgBkL/////D4MhHiAGQiCIIQUgBSEfIBNC/f/z/w9+Qv////8PgyEEIBMgBEKr1f7/D358IQYgBkIgiCEFIBQgBEL///vPC358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQv//z4oLfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC/v+v9QF+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBEKk7MO1D358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgGCAEQqClw7kGfnwgBXwhBiAGQv////8PgyEXIAZCIIghBSAZIARCv6WUnA9+fCAFfCEGIAZC/////w+DIRggBkIgiCEFIBogBEKEl92jBn58IAV8IQYgBkL/////D4MhGSAGQiCIIQUgGyAEQtfZrpoEfnwgBXwhBiAGQv////8PgyEaIAZCIIghBSAcIARCts/u2AR+fCAFfCEGIAZC/////w+DIRsgBkIgiCEFIB0gBEKazf/LA358IAV8IQYgBkL/////D4MhHCAGQiCIIQUgHiAEQuqjhNABfnwgBXwhBiAGQv////8PgyEdIAZCIIghBSAfIAV8IR4gATUCKCEDIBMgByADfnwhBiAGQv////8PgyETIAZCIIghBSAUIAggA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSAJIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgCiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAXIAsgA358IAV8IQYgBkL/////D4MhFyAGQiCIIQUgGCAMIAN+fCAFfCEGIAZC/////w+DIRggBkIgiCEFIBkgDSADfnwgBXwhBiAGQv////8PgyEZIAZCIIghBSAaIA4gA358IAV8IQYgBkL/////D4MhGiAGQiCIIQUgGyAPIAN+fCAFfCEGIAZC/////w+DIRsgBkIgiCEFIBwgECADfnwgBXwhBiAGQv////8PgyEcIAZCIIghBSAdIBEgA358IAV8IQYgBkL/////D4MhHSAGQiCIIQUgHiASIAN+fCAFfCEGIAZC/////w+DIR4gBkIgiCEFIAUhHyATQv3/8/8PfkL/////D4MhBCATIARCq9X+/w9+fCEGIAZCIIghBSAUIARC///7zwt+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBUgBEL//8+KC358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFiAEQv7/r/UBfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAXIARCpOzDtQ9+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIBggBEKgpcO5Bn58IAV8IQYgBkL/////D4MhFyAGQiCIIQUgGSAEQr+llJwPfnwgBXwhBiAGQv////8PgyEYIAZCIIghBSAaIARChJfdowZ+fCAFfCEGIAZC/////w+DIRkgBkIgiCEFIBsgBELX2a6aBH58IAV8IQYgBkL/////D4MhGiAGQiCIIQUgHCAEQrbP7tgEfnwgBXwhBiAGQv////8PgyEbIAZCIIghBSAdIARCms3/ywN+fCAFfCEGIAZC/////w+DIRwgBkIgiCEFIB4gBELqo4TQAX58IAV8IQYgBkL/////D4MhHSAGQiCIIQUgHyAFfCEeIAE1AiwhAyATIAcgA358IQYgBkL/////D4MhEyAGQiCIIQUgFCAIIAN+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBUgCSADfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAWIAogA358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgFyALIAN+fCAFfCEGIAZC/////w+DIRcgBkIgiCEFIBggDCADfnwgBXwhBiAGQv////8PgyEYIAZCIIghBSAZIA0gA358IAV8IQYgBkL/////D4MhGSAGQiCIIQUgGiAOIAN+fCAFfCEGIAZC/////w+DIRogBkIgiCEFIBsgDyADfnwgBXwhBiAGQv////8PgyEbIAZCIIghBSAcIBAgA358IAV8IQYgBkL/////D4MhHCAGQiCIIQUgHSARIAN+fCAFfCEGIAZC/////w+DIR0gBkIgiCEFIB4gEiADfnwgBXwhBiAGQv////8PgyEeIAZCIIghBSAFIR8gE0L9//P/D35C/////w+DIQQgEyAEQqvV/v8PfnwhBiAGQiCIIQUgFCAEQv//+88LfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAVIARC///Pigt+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBYgBEL+/6/1AX58IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFyAEQqTsw7UPfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAYIARCoKXDuQZ+fCAFfCEGIAZC/////w+DIRcgBkIgiCEFIBkgBEK/pZScD358IAV8IQYgBkL/////D4MhGCAGQiCIIQUgGiAEQoSX3aMGfnwgBXwhBiAGQv////8PgyEZIAZCIIghBSAbIARC19mumgR+fCAFfCEGIAZC/////w+DIRogBkIgiCEFIBwgBEK2z+7YBH58IAV8IQYgBkL/////D4MhGyAGQiCIIQUgHSAEQprN/8sDfnwgBXwhBiAGQv////8PgyEcIAZCIIghBSAeIARC6qOE0AF+fCAFfCEGIAZC/////w+DIR0gBkIgiCEFIB8gBXwhHiACIBM+AgAgAiAUPgIEIAIgFT4CCCACIBY+AgwgAiAXPgIQIAIgGD4CFCACIBk+AhggAiAaPgIcIAIgGz4CICACIBw+AiQgAiAdPgIoIAIgHj4CLCACQcgFEAUEQCACQcgFIAIQBxoLC/dNHgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfiAANQIAIQYgADUCBCEHIAA1AgghCCAANQIMIQkgADUCECEKIAA1AhQhCyAANQIYIQwgADUCHCENIAA1AiAhDiAANQIkIQ8gADUCKCEQIAA1AiwhESASIAYgBn58IQQgBEL/////D4MhEiAEQiCIIQMgByAGfiEFIBMgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEyAEQiCIIAVCIIhCAYZ8IQMgCCAGfiEFIBQgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFCAEQiCIIAVCIIhCAYZ8IQMgCSAGfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgCiAGfiEFIBYgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFiAEQiCIIAVCIIhCAYZ8IQMgCyAGfiEFIBcgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFyAEQiCIIAVCIIhCAYZ8IQMgDCAGfiEFIBggBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGCAEQiCIIAVCIIhCAYZ8IQMgDSAGfiEFIBkgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGSAEQiCIIAVCIIhCAYZ8IQMgDiAGfiEFIBogBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGiAEQiCIIAVCIIhCAYZ8IQMgDyAGfiEFIBsgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGyAEQiCIIAVCIIhCAYZ8IQMgECAGfiEFIBwgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhHCAEQiCIIAVCIIhCAYZ8IQMgESAGfiEFIB0gBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhHSAEQiCIIAVCIIhCAYZ8IQMgHiADfCEEIARC/////w+DIR4gHyAEQiCIfCEfIBJC/f/z/w9+Qv////8PgyECIBIgAkKr1f7/D358IQQgBEIgiCEDIBMgAkL///vPC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQv//z4oLfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC/v+v9QF+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgAkKk7MO1D358IAN8IQQgBEL/////D4MhFSAEQiCIIQMgFyACQqClw7kGfnwgA3whBCAEQv////8PgyEWIARCIIghAyAYIAJCv6WUnA9+fCADfCEEIARC/////w+DIRcgBEIgiCEDIBkgAkKEl92jBn58IAN8IQQgBEL/////D4MhGCAEQiCIIQMgGiACQtfZrpoEfnwgA3whBCAEQv////8PgyEZIARCIIghAyAbIAJCts/u2AR+fCADfCEEIARC/////w+DIRogBEIgiCEDIBwgAkKazf/LA358IAN8IQQgBEL/////D4MhGyAEQiCIIQMgHSACQuqjhNABfnwgA3whBCAEQv////8PgyEcIARCIIghAyAeIAN8IQQgBEL/////D4MhHSAfIARCIIh8IR5CACEfIBMgByAHfnwhBCAEQv////8PgyETIARCIIghAyAIIAd+IQUgFCAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEUIARCIIggBUIgiEIBhnwhAyAJIAd+IQUgFSAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEVIARCIIggBUIgiEIBhnwhAyAKIAd+IQUgFiAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEWIARCIIggBUIgiEIBhnwhAyALIAd+IQUgFyAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEXIARCIIggBUIgiEIBhnwhAyAMIAd+IQUgGCAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEYIARCIIggBUIgiEIBhnwhAyANIAd+IQUgGSAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEZIARCIIggBUIgiEIBhnwhAyAOIAd+IQUgGiAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEaIARCIIggBUIgiEIBhnwhAyAPIAd+IQUgGyAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEbIARCIIggBUIgiEIBhnwhAyAQIAd+IQUgHCAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEcIARCIIggBUIgiEIBhnwhAyARIAd+IQUgHSAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEdIARCIIggBUIgiEIBhnwhAyAeIAN8IQQgBEL/////D4MhHiAfIARCIIh8IR8gEkL9//P/D35C/////w+DIQIgEiACQqvV/v8PfnwhBCAEQiCIIQMgEyACQv//+88LfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJC///Pigt+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkL+/6/1AX58IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiACQqTsw7UPfnwgA3whBCAEQv////8PgyEVIARCIIghAyAXIAJCoKXDuQZ+fCADfCEEIARC/////w+DIRYgBEIgiCEDIBggAkK/pZScD358IAN8IQQgBEL/////D4MhFyAEQiCIIQMgGSACQoSX3aMGfnwgA3whBCAEQv////8PgyEYIARCIIghAyAaIAJC19mumgR+fCADfCEEIARC/////w+DIRkgBEIgiCEDIBsgAkK2z+7YBH58IAN8IQQgBEL/////D4MhGiAEQiCIIQMgHCACQprN/8sDfnwgA3whBCAEQv////8PgyEbIARCIIghAyAdIAJC6qOE0AF+fCADfCEEIARC/////w+DIRwgBEIgiCEDIB4gA3whBCAEQv////8PgyEdIB8gBEIgiHwhHkIAIR8gFCAIIAh+fCEEIARC/////w+DIRQgBEIgiCEDIAkgCH4hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIAogCH4hBSAWIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRYgBEIgiCAFQiCIQgGGfCEDIAsgCH4hBSAXIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRcgBEIgiCAFQiCIQgGGfCEDIAwgCH4hBSAYIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRggBEIgiCAFQiCIQgGGfCEDIA0gCH4hBSAZIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRkgBEIgiCAFQiCIQgGGfCEDIA4gCH4hBSAaIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRogBEIgiCAFQiCIQgGGfCEDIA8gCH4hBSAbIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRsgBEIgiCAFQiCIQgGGfCEDIBAgCH4hBSAcIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRwgBEIgiCAFQiCIQgGGfCEDIBEgCH4hBSAdIAVC/////w+DQgGGfCADfCEEIARC/////w+DIR0gBEIgiCAFQiCIQgGGfCEDIB4gA3whBCAEQv////8PgyEeIB8gBEIgiHwhHyASQv3/8/8PfkL/////D4MhAiASIAJCq9X+/w9+fCEEIARCIIghAyATIAJC///7zwt+fCADfCEEIARC/////w+DIRIgBEIgiCEDIBQgAkL//8+KC358IAN8IQQgBEL/////D4MhEyAEQiCIIQMgFSACQv7/r/UBfnwgA3whBCAEQv////8PgyEUIARCIIghAyAWIAJCpOzDtQ9+fCADfCEEIARC/////w+DIRUgBEIgiCEDIBcgAkKgpcO5Bn58IAN8IQQgBEL/////D4MhFiAEQiCIIQMgGCACQr+llJwPfnwgA3whBCAEQv////8PgyEXIARCIIghAyAZIAJChJfdowZ+fCADfCEEIARC/////w+DIRggBEIgiCEDIBogAkLX2a6aBH58IAN8IQQgBEL/////D4MhGSAEQiCIIQMgGyACQrbP7tgEfnwgA3whBCAEQv////8PgyEaIARCIIghAyAcIAJCms3/ywN+fCADfCEEIARC/////w+DIRsgBEIgiCEDIB0gAkLqo4TQAX58IAN8IQQgBEL/////D4MhHCAEQiCIIQMgHiADfCEEIARC/////w+DIR0gHyAEQiCIfCEeQgAhHyAVIAkgCX58IQQgBEL/////D4MhFSAEQiCIIQMgCiAJfiEFIBYgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFiAEQiCIIAVCIIhCAYZ8IQMgCyAJfiEFIBcgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFyAEQiCIIAVCIIhCAYZ8IQMgDCAJfiEFIBggBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGCAEQiCIIAVCIIhCAYZ8IQMgDSAJfiEFIBkgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGSAEQiCIIAVCIIhCAYZ8IQMgDiAJfiEFIBogBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGiAEQiCIIAVCIIhCAYZ8IQMgDyAJfiEFIBsgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGyAEQiCIIAVCIIhCAYZ8IQMgECAJfiEFIBwgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhHCAEQiCIIAVCIIhCAYZ8IQMgESAJfiEFIB0gBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhHSAEQiCIIAVCIIhCAYZ8IQMgHiADfCEEIARC/////w+DIR4gHyAEQiCIfCEfIBJC/f/z/w9+Qv////8PgyECIBIgAkKr1f7/D358IQQgBEIgiCEDIBMgAkL///vPC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQv//z4oLfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC/v+v9QF+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgAkKk7MO1D358IAN8IQQgBEL/////D4MhFSAEQiCIIQMgFyACQqClw7kGfnwgA3whBCAEQv////8PgyEWIARCIIghAyAYIAJCv6WUnA9+fCADfCEEIARC/////w+DIRcgBEIgiCEDIBkgAkKEl92jBn58IAN8IQQgBEL/////D4MhGCAEQiCIIQMgGiACQtfZrpoEfnwgA3whBCAEQv////8PgyEZIARCIIghAyAbIAJCts/u2AR+fCADfCEEIARC/////w+DIRogBEIgiCEDIBwgAkKazf/LA358IAN8IQQgBEL/////D4MhGyAEQiCIIQMgHSACQuqjhNABfnwgA3whBCAEQv////8PgyEcIARCIIghAyAeIAN8IQQgBEL/////D4MhHSAfIARCIIh8IR5CACEfIBYgCiAKfnwhBCAEQv////8PgyEWIARCIIghAyALIAp+IQUgFyAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEXIARCIIggBUIgiEIBhnwhAyAMIAp+IQUgGCAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEYIARCIIggBUIgiEIBhnwhAyANIAp+IQUgGSAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEZIARCIIggBUIgiEIBhnwhAyAOIAp+IQUgGiAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEaIARCIIggBUIgiEIBhnwhAyAPIAp+IQUgGyAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEbIARCIIggBUIgiEIBhnwhAyAQIAp+IQUgHCAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEcIARCIIggBUIgiEIBhnwhAyARIAp+IQUgHSAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEdIARCIIggBUIgiEIBhnwhAyAeIAN8IQQgBEL/////D4MhHiAfIARCIIh8IR8gEkL9//P/D35C/////w+DIQIgEiACQqvV/v8PfnwhBCAEQiCIIQMgEyACQv//+88LfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJC///Pigt+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkL+/6/1AX58IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiACQqTsw7UPfnwgA3whBCAEQv////8PgyEVIARCIIghAyAXIAJCoKXDuQZ+fCADfCEEIARC/////w+DIRYgBEIgiCEDIBggAkK/pZScD358IAN8IQQgBEL/////D4MhFyAEQiCIIQMgGSACQoSX3aMGfnwgA3whBCAEQv////8PgyEYIARCIIghAyAaIAJC19mumgR+fCADfCEEIARC/////w+DIRkgBEIgiCEDIBsgAkK2z+7YBH58IAN8IQQgBEL/////D4MhGiAEQiCIIQMgHCACQprN/8sDfnwgA3whBCAEQv////8PgyEbIARCIIghAyAdIAJC6qOE0AF+fCADfCEEIARC/////w+DIRwgBEIgiCEDIB4gA3whBCAEQv////8PgyEdIB8gBEIgiHwhHkIAIR8gFyALIAt+fCEEIARC/////w+DIRcgBEIgiCEDIAwgC34hBSAYIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRggBEIgiCAFQiCIQgGGfCEDIA0gC34hBSAZIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRkgBEIgiCAFQiCIQgGGfCEDIA4gC34hBSAaIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRogBEIgiCAFQiCIQgGGfCEDIA8gC34hBSAbIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRsgBEIgiCAFQiCIQgGGfCEDIBAgC34hBSAcIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRwgBEIgiCAFQiCIQgGGfCEDIBEgC34hBSAdIAVC/////w+DQgGGfCADfCEEIARC/////w+DIR0gBEIgiCAFQiCIQgGGfCEDIB4gA3whBCAEQv////8PgyEeIB8gBEIgiHwhHyASQv3/8/8PfkL/////D4MhAiASIAJCq9X+/w9+fCEEIARCIIghAyATIAJC///7zwt+fCADfCEEIARC/////w+DIRIgBEIgiCEDIBQgAkL//8+KC358IAN8IQQgBEL/////D4MhEyAEQiCIIQMgFSACQv7/r/UBfnwgA3whBCAEQv////8PgyEUIARCIIghAyAWIAJCpOzDtQ9+fCADfCEEIARC/////w+DIRUgBEIgiCEDIBcgAkKgpcO5Bn58IAN8IQQgBEL/////D4MhFiAEQiCIIQMgGCACQr+llJwPfnwgA3whBCAEQv////8PgyEXIARCIIghAyAZIAJChJfdowZ+fCADfCEEIARC/////w+DIRggBEIgiCEDIBogAkLX2a6aBH58IAN8IQQgBEL/////D4MhGSAEQiCIIQMgGyACQrbP7tgEfnwgA3whBCAEQv////8PgyEaIARCIIghAyAcIAJCms3/ywN+fCADfCEEIARC/////w+DIRsgBEIgiCEDIB0gAkLqo4TQAX58IAN8IQQgBEL/////D4MhHCAEQiCIIQMgHiADfCEEIARC/////w+DIR0gHyAEQiCIfCEeQgAhHyAYIAwgDH58IQQgBEL/////D4MhGCAEQiCIIQMgDSAMfiEFIBkgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGSAEQiCIIAVCIIhCAYZ8IQMgDiAMfiEFIBogBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGiAEQiCIIAVCIIhCAYZ8IQMgDyAMfiEFIBsgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhGyAEQiCIIAVCIIhCAYZ8IQMgECAMfiEFIBwgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhHCAEQiCIIAVCIIhCAYZ8IQMgESAMfiEFIB0gBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhHSAEQiCIIAVCIIhCAYZ8IQMgHiADfCEEIARC/////w+DIR4gHyAEQiCIfCEfIBJC/f/z/w9+Qv////8PgyECIBIgAkKr1f7/D358IQQgBEIgiCEDIBMgAkL///vPC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQv//z4oLfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC/v+v9QF+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgAkKk7MO1D358IAN8IQQgBEL/////D4MhFSAEQiCIIQMgFyACQqClw7kGfnwgA3whBCAEQv////8PgyEWIARCIIghAyAYIAJCv6WUnA9+fCADfCEEIARC/////w+DIRcgBEIgiCEDIBkgAkKEl92jBn58IAN8IQQgBEL/////D4MhGCAEQiCIIQMgGiACQtfZrpoEfnwgA3whBCAEQv////8PgyEZIARCIIghAyAbIAJCts/u2AR+fCADfCEEIARC/////w+DIRogBEIgiCEDIBwgAkKazf/LA358IAN8IQQgBEL/////D4MhGyAEQiCIIQMgHSACQuqjhNABfnwgA3whBCAEQv////8PgyEcIARCIIghAyAeIAN8IQQgBEL/////D4MhHSAfIARCIIh8IR5CACEfIBkgDSANfnwhBCAEQv////8PgyEZIARCIIghAyAOIA1+IQUgGiAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEaIARCIIggBUIgiEIBhnwhAyAPIA1+IQUgGyAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEbIARCIIggBUIgiEIBhnwhAyAQIA1+IQUgHCAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEcIARCIIggBUIgiEIBhnwhAyARIA1+IQUgHSAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEdIARCIIggBUIgiEIBhnwhAyAeIAN8IQQgBEL/////D4MhHiAfIARCIIh8IR8gEkL9//P/D35C/////w+DIQIgEiACQqvV/v8PfnwhBCAEQiCIIQMgEyACQv//+88LfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJC///Pigt+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkL+/6/1AX58IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiACQqTsw7UPfnwgA3whBCAEQv////8PgyEVIARCIIghAyAXIAJCoKXDuQZ+fCADfCEEIARC/////w+DIRYgBEIgiCEDIBggAkK/pZScD358IAN8IQQgBEL/////D4MhFyAEQiCIIQMgGSACQoSX3aMGfnwgA3whBCAEQv////8PgyEYIARCIIghAyAaIAJC19mumgR+fCADfCEEIARC/////w+DIRkgBEIgiCEDIBsgAkK2z+7YBH58IAN8IQQgBEL/////D4MhGiAEQiCIIQMgHCACQprN/8sDfnwgA3whBCAEQv////8PgyEbIARCIIghAyAdIAJC6qOE0AF+fCADfCEEIARC/////w+DIRwgBEIgiCEDIB4gA3whBCAEQv////8PgyEdIB8gBEIgiHwhHkIAIR8gGiAOIA5+fCEEIARC/////w+DIRogBEIgiCEDIA8gDn4hBSAbIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRsgBEIgiCAFQiCIQgGGfCEDIBAgDn4hBSAcIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRwgBEIgiCAFQiCIQgGGfCEDIBEgDn4hBSAdIAVC/////w+DQgGGfCADfCEEIARC/////w+DIR0gBEIgiCAFQiCIQgGGfCEDIB4gA3whBCAEQv////8PgyEeIB8gBEIgiHwhHyASQv3/8/8PfkL/////D4MhAiASIAJCq9X+/w9+fCEEIARCIIghAyATIAJC///7zwt+fCADfCEEIARC/////w+DIRIgBEIgiCEDIBQgAkL//8+KC358IAN8IQQgBEL/////D4MhEyAEQiCIIQMgFSACQv7/r/UBfnwgA3whBCAEQv////8PgyEUIARCIIghAyAWIAJCpOzDtQ9+fCADfCEEIARC/////w+DIRUgBEIgiCEDIBcgAkKgpcO5Bn58IAN8IQQgBEL/////D4MhFiAEQiCIIQMgGCACQr+llJwPfnwgA3whBCAEQv////8PgyEXIARCIIghAyAZIAJChJfdowZ+fCADfCEEIARC/////w+DIRggBEIgiCEDIBogAkLX2a6aBH58IAN8IQQgBEL/////D4MhGSAEQiCIIQMgGyACQrbP7tgEfnwgA3whBCAEQv////8PgyEaIARCIIghAyAcIAJCms3/ywN+fCADfCEEIARC/////w+DIRsgBEIgiCEDIB0gAkLqo4TQAX58IAN8IQQgBEL/////D4MhHCAEQiCIIQMgHiADfCEEIARC/////w+DIR0gHyAEQiCIfCEeQgAhHyAbIA8gD358IQQgBEL/////D4MhGyAEQiCIIQMgECAPfiEFIBwgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhHCAEQiCIIAVCIIhCAYZ8IQMgESAPfiEFIB0gBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhHSAEQiCIIAVCIIhCAYZ8IQMgHiADfCEEIARC/////w+DIR4gHyAEQiCIfCEfIBJC/f/z/w9+Qv////8PgyECIBIgAkKr1f7/D358IQQgBEIgiCEDIBMgAkL///vPC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQv//z4oLfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC/v+v9QF+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgAkKk7MO1D358IAN8IQQgBEL/////D4MhFSAEQiCIIQMgFyACQqClw7kGfnwgA3whBCAEQv////8PgyEWIARCIIghAyAYIAJCv6WUnA9+fCADfCEEIARC/////w+DIRcgBEIgiCEDIBkgAkKEl92jBn58IAN8IQQgBEL/////D4MhGCAEQiCIIQMgGiACQtfZrpoEfnwgA3whBCAEQv////8PgyEZIARCIIghAyAbIAJCts/u2AR+fCADfCEEIARC/////w+DIRogBEIgiCEDIBwgAkKazf/LA358IAN8IQQgBEL/////D4MhGyAEQiCIIQMgHSACQuqjhNABfnwgA3whBCAEQv////8PgyEcIARCIIghAyAeIAN8IQQgBEL/////D4MhHSAfIARCIIh8IR5CACEfIBwgECAQfnwhBCAEQv////8PgyEcIARCIIghAyARIBB+IQUgHSAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEdIARCIIggBUIgiEIBhnwhAyAeIAN8IQQgBEL/////D4MhHiAfIARCIIh8IR8gEkL9//P/D35C/////w+DIQIgEiACQqvV/v8PfnwhBCAEQiCIIQMgEyACQv//+88LfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJC///Pigt+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkL+/6/1AX58IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiACQqTsw7UPfnwgA3whBCAEQv////8PgyEVIARCIIghAyAXIAJCoKXDuQZ+fCADfCEEIARC/////w+DIRYgBEIgiCEDIBggAkK/pZScD358IAN8IQQgBEL/////D4MhFyAEQiCIIQMgGSACQoSX3aMGfnwgA3whBCAEQv////8PgyEYIARCIIghAyAaIAJC19mumgR+fCADfCEEIARC/////w+DIRkgBEIgiCEDIBsgAkK2z+7YBH58IAN8IQQgBEL/////D4MhGiAEQiCIIQMgHCACQprN/8sDfnwgA3whBCAEQv////8PgyEbIARCIIghAyAdIAJC6qOE0AF+fCADfCEEIARC/////w+DIRwgBEIgiCEDIB4gA3whBCAEQv////8PgyEdIB8gBEIgiHwhHkIAIR8gHSARIBF+fCEEIARC/////w+DIR0gBEIgiCEDIB4gA3whBCAEQv////8PgyEeIB8gBEIgiHwhHyASQv3/8/8PfkL/////D4MhAiASIAJCq9X+/w9+fCEEIARCIIghAyATIAJC///7zwt+fCADfCEEIARC/////w+DIRIgBEIgiCEDIBQgAkL//8+KC358IAN8IQQgBEL/////D4MhEyAEQiCIIQMgFSACQv7/r/UBfnwgA3whBCAEQv////8PgyEUIARCIIghAyAWIAJCpOzDtQ9+fCADfCEEIARC/////w+DIRUgBEIgiCEDIBcgAkKgpcO5Bn58IAN8IQQgBEL/////D4MhFiAEQiCIIQMgGCACQr+llJwPfnwgA3whBCAEQv////8PgyEXIARCIIghAyAZIAJChJfdowZ+fCADfCEEIARC/////w+DIRggBEIgiCEDIBogAkLX2a6aBH58IAN8IQQgBEL/////D4MhGSAEQiCIIQMgGyACQrbP7tgEfnwgA3whBCAEQv////8PgyEaIARCIIghAyAcIAJCms3/ywN+fCADfCEEIARC/////w+DIRsgBEIgiCEDIB0gAkLqo4TQAX58IAN8IQQgBEL/////D4MhHCAEQiCIIQMgHiADfCEEIARC/////w+DIR0gHyAEQiCIfCEeQgAhHyABIBI+AgAgASATPgIEIAEgFD4CCCABIBU+AgwgASAWPgIQIAEgFz4CFCABIBg+AhggASAZPgIcIAEgGj4CICABIBs+AiQgASAcPgIoIAEgHT4CLCAepwRAIAFByAUgARAHGgUgAUHIBRAFBEAgAUHIBSABEAcaCwsLCgAgACAAIAEQFAsLACAAQfgFIAEQFAsVACAAQfgREABBqBIQAUH4ESABEBMLEQAgAEHYEhAYQdgSQbgHEAULJAAgABACBEBBAA8LIABBiBMQGEGIE0G4BxAFBEBBfw8LQQEPCxcAIAAgARAYIAFByAUgARAOIAEgARAXCwkAQagGIAAQAAvLAQQBfwF/AX8BfyACEAFBMCEFIAAhAwJAA0AgBSABSw0BIAVBMEYEQEG4ExAcBUG4E0H4BUG4ExAUCyADQbgTQegTEBQgAkHoEyAC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AgQgADUCCCABNQIIfCADQiCIfCEDIAIgAz4CCCAANQIMIAE1Agx8IANCIIh8IQMgAiADPgIMIAA1AhAgATUCEHwgA0IgiHwhAyACIAM+AhAgADUCFCABNQIUfCADQiCIfCEDIAIgAz4CFCAANQIYIAE1Ahh8IANCIIh8IQMgAiADPgIYIAA1AhwgATUCHHwgA0IgiHwhAyACIAM+AhwgA0IgiKcLjAIBAX4gADUCACABNQIAfSEDIAIgA0L/////D4M+AgAgADUCBCABNQIEfSADQiCHfCEDIAIgA0L/////D4M+AgQgADUCCCABNQIIfSADQiCHfCEDIAIgA0L/////D4M+AgggADUCDCABNQIMfSADQiCHfCEDIAIgA0L/////D4M+AgwgADUCECABNQIQfSADQiCHfCEDIAIgA0L/////D4M+AhAgADUCFCABNQIUfSADQiCHfCEDIAIgA0L/////D4M+AhQgADUCGCABNQIYfSADQiCHfCEDIAIgA0L/////D4M+AhggADUCHCABNQIcfSADQiCHfCEDIAIgA0L/////D4M+AhwgA0Igh6cLjxASAX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+IANC/////w+DIAA1AgAiBSABNQIAIgZ+fCEDIAQgA0IgiHwhBCACIAM+AgAgBEIgiCEDIARC/////w+DIAUgATUCBCIIfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCBCIHIAZ+fCEEIAMgBEIgiHwhAyACIAQ+AgQgA0IgiCEEIANC/////w+DIAUgATUCCCIKfnwhAyAEIANCIIh8IQQgA0L/////D4MgByAIfnwhAyAEIANCIIh8IQQgA0L/////D4MgADUCCCIJIAZ+fCEDIAQgA0IgiHwhBCACIAM+AgggBEIgiCEDIARC/////w+DIAUgATUCDCIMfnwhBCADIARCIIh8IQMgBEL/////D4MgByAKfnwhBCADIARCIIh8IQMgBEL/////D4MgCSAIfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCDCILIAZ+fCEEIAMgBEIgiHwhAyACIAQ+AgwgA0IgiCEEIANC/////w+DIAUgATUCECIOfnwhAyAEIANCIIh8IQQgA0L/////D4MgByAMfnwhAyAEIANCIIh8IQQgA0L/////D4MgCSAKfnwhAyAEIANCIIh8IQQgA0L/////D4MgCyAIfnwhAyAEIANCIIh8IQQgA0L/////D4MgADUCECINIAZ+fCEDIAQgA0IgiHwhBCACIAM+AhAgBEIgiCEDIARC/////w+DIAUgATUCFCIQfnwhBCADIARCIIh8IQMgBEL/////D4MgByAOfnwhBCADIARCIIh8IQMgBEL/////D4MgCSAMfnwhBCADIARCIIh8IQMgBEL/////D4MgCyAKfnwhBCADIARCIIh8IQMgBEL/////D4MgDSAIfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCFCIPIAZ+fCEEIAMgBEIgiHwhAyACIAQ+AhQgA0IgiCEEIANC/////w+DIAUgATUCGCISfnwhAyAEIANCIIh8IQQgA0L/////D4MgByAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgCSAOfnwhAyAEIANCIIh8IQQgA0L/////D4MgCyAMfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAKfnwhAyAEIANCIIh8IQQgA0L/////D4MgDyAIfnwhAyAEIANCIIh8IQQgA0L/////D4MgADUCGCIRIAZ+fCEDIAQgA0IgiHwhBCACIAM+AhggBEIgiCEDIARC/////w+DIAUgATUCHCIUfnwhBCADIARCIIh8IQMgBEL/////D4MgByASfnwhBCADIARCIIh8IQMgBEL/////D4MgCSAQfnwhBCADIARCIIh8IQMgBEL/////D4MgCyAOfnwhBCADIARCIIh8IQMgBEL/////D4MgDSAMfnwhBCADIARCIIh8IQMgBEL/////D4MgDyAKfnwhBCADIARCIIh8IQMgBEL/////D4MgESAIfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCHCITIAZ+fCEEIAMgBEIgiHwhAyACIAQ+AhwgA0IgiCEEIANC/////w+DIAcgFH58IQMgBCADQiCIfCEEIANC/////w+DIAkgEn58IQMgBCADQiCIfCEEIANC/////w+DIAsgEH58IQMgBCADQiCIfCEEIANC/////w+DIA0gDn58IQMgBCADQiCIfCEEIANC/////w+DIA8gDH58IQMgBCADQiCIfCEEIANC/////w+DIBEgCn58IQMgBCADQiCIfCEEIANC/////w+DIBMgCH58IQMgBCADQiCIfCEEIAIgAz4CICAEQiCIIQMgBEL/////D4MgCSAUfnwhBCADIARCIIh8IQMgBEL/////D4MgCyASfnwhBCADIARCIIh8IQMgBEL/////D4MgDSAQfnwhBCADIARCIIh8IQMgBEL/////D4MgDyAOfnwhBCADIARCIIh8IQMgBEL/////D4MgESAMfnwhBCADIARCIIh8IQMgBEL/////D4MgEyAKfnwhBCADIARCIIh8IQMgAiAEPgIkIANCIIghBCADQv////8PgyALIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyANIBJ+fCEDIAQgA0IgiHwhBCADQv////8PgyAPIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyARIA5+fCEDIAQgA0IgiHwhBCADQv////8PgyATIAx+fCEDIAQgA0IgiHwhBCACIAM+AiggBEIgiCEDIARC/////w+DIA0gFH58IQQgAyAEQiCIfCEDIARC/////w+DIA8gEn58IQQgAyAEQiCIfCEDIARC/////w+DIBEgEH58IQQgAyAEQiCIfCEDIARC/////w+DIBMgDn58IQQgAyAEQiCIfCEDIAIgBD4CLCADQiCIIQQgA0L/////D4MgDyAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgESASfnwhAyAEIANCIIh8IQQgA0L/////D4MgEyAQfnwhAyAEIANCIIh8IQQgAiADPgIwIARCIIghAyAEQv////8PgyARIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyATIBJ+fCEEIAMgBEIgiHwhAyACIAQ+AjQgA0IgiCEEIANC/////w+DIBMgFH58IQMgBCADQiCIfCEEIAIgAz4COCAEQiCIIQMgAiAEPgI8C4wSDAF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfkIAIQJCACEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAA1AgAiBiAGfnwhAiADIAJCIIh8IQMgASACPgIAIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AgQiB358IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AgQgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCCCIIfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgByAHfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CCCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIMIgl+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAh+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIMIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AhAiCn58IQIgAyACQiCIfCEDIAJC/////w+DIAcgCX58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAggCH58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AhAgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCFCILfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAKfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCAJfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CFCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIYIgx+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAt+fCECIAMgAkIgiHwhAyACQv////8PgyAIIAp+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAJIAl+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIYIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AhwiDX58IQIgAyACQiCIfCEDIAJC/////w+DIAcgDH58IQIgAyACQiCIfCEDIAJC/////w+DIAggC358IQIgAyACQiCIfCEDIAJC/////w+DIAkgCn58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AhwgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgDX58IQIgAyACQiCIfCEDIAJC/////w+DIAggDH58IQIgAyACQiCIfCEDIAJC/////w+DIAkgC358IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAogCn58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AiAgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAggDX58IQIgAyACQiCIfCEDIAJC/////w+DIAkgDH58IQIgAyACQiCIfCEDIAJC/////w+DIAogC358IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AiQgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAkgDX58IQIgAyACQiCIfCEDIAJC/////w+DIAogDH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAsgC358IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AiggAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAogDX58IQIgAyACQiCIfCEDIAJC/////w+DIAsgDH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AiwgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAsgDX58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAwgDH58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AjAgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAwgDX58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AjQgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIA0gDX58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AjggAyEEIARCIIghBSABIAQ+AjwLCgAgACAAIAEQMQu2AQEBfiAANQAAIAF+IQMgAiADPgAAIAA1AAQgAX4gA0IgiHwhAyACIAM+AAQgADUACCABfiADQiCIfCEDIAIgAz4ACCAANQAMIAF+IANCIIh8IQMgAiADPgAMIAA1ABAgAX4gA0IgiHwhAyACIAM+ABAgADUAFCABfiADQiCIfCEDIAIgAz4AFCAANQAYIAF+IANCIIh8IQMgAiADPgAYIAA1ABwgAX4gA0IgiHwhAyACIAM+ABwLTgIBfgF/IAAhAyADNQAAIAF8IQIgAyACPgAAIAJCIIghAgJAA0AgAlANASADQQRqIQMgAzUAACACfCECIAMgAj4AACACQiCIIQIMAAsLC7ACBwF/AX8BfwF/AX4BfgF/IAIEQCACIQUFQegXIQULIAMEQCADIQQFQYgYIQQLIAAgBBApIAFByBcQKSAFECpBqBgQKkEfIQZBHyEHAkADQEHIFyAHai0AACAHQQNGcg0BIAdBAWshBwwACwtByBcgB2pBA2s1AABCAXwhCCAIQgFRBEBCAEIAgBoLAkADQAJAA0AgBCAGai0AACAGQQdGcg0BIAZBAWshBgwACwsgBCAGakEHaykAACEJIAkgCIAhCSAGIAdrQQRrIQoCQANAIAlCgICAgHCDUCAKQQBOcQ0BIAlCCIghCSAKQQFqIQoMAAsLIAlQBEAgBEHIFxAuRQ0CQgEhCUEAIQoLQcgXIAlByBgQNCAEQcgYIAprIAQQMBogBSAKaiAJEDUMAAsLC7UC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GCENIAA1AhwhDiABNQIAIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////D35C/////w+DIQQgDyAEQgF+fCEGIAZCIIghBSAQIARC/////w9+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEL+t/n/D358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQoLI9p0FfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARChbCHzQB+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEKIsOeZA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQsj69cwCfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC0862nwd+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIEIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////D35C/////w+DIQQgDyAEQgF+fCEGIAZCIIghBSAQIARC/////w9+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEL+t/n/D358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQoLI9p0FfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARChbCHzQB+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEKIsOeZA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQsj69cwCfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC0862nwd+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIIIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////D35C/////w+DIQQgDyAEQgF+fCEGIAZCIIghBSAQIARC/////w9+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEL+t/n/D358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQoLI9p0FfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARChbCHzQB+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEKIsOeZA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQsj69cwCfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC0862nwd+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIMIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////D35C/////w+DIQQgDyAEQgF+fCEGIAZCIIghBSAQIARC/////w9+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEL+t/n/D358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQoLI9p0FfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARChbCHzQB+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEKIsOeZA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQsj69cwCfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC0862nwd+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIQIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////D35C/////w+DIQQgDyAEQgF+fCEGIAZCIIghBSAQIARC/////w9+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEL+t/n/D358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQoLI9p0FfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARChbCHzQB+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEKIsOeZA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQsj69cwCfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC0862nwd+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIUIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////D35C/////w+DIQQgDyAEQgF+fCEGIAZCIIghBSAQIARC/////w9+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEL+t/n/D358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQoLI9p0FfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARChbCHzQB+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEKIsOeZA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQsj69cwCfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC0862nwd+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIYIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////D35C/////w+DIQQgDyAEQgF+fCEGIAZCIIghBSAQIARC/////w9+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEL+t/n/D358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQoLI9p0FfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARChbCHzQB+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEKIsOeZA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQsj69cwCfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC0862nwd+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIcIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////D35C/////w+DIQQgDyAEQgF+fCEGIAZCIIghBSAQIARC/////w9+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEL+t/n/D358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQoLI9p0FfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARChbCHzQB+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEKIsOeZA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQsj69cwCfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC0862nwd+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiACIA8+AgAgAiAQPgIEIAIgET4CCCACIBI+AgwgAiATPgIQIAIgFD4CFCACIBU+AhggAiAWPgIcIAJBiBsQLgRAIAJBiBsgAhAwGgsLqyQWAX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4gADUCACEGIAA1AgQhByAANQIIIQggADUCDCEJIAA1AhAhCiAANQIUIQsgADUCGCEMIAA1AhwhDSAOIAYgBn58IQQgBEL/////D4MhDiAEQiCIIQMgByAGfiEFIA8gBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhDyAEQiCIIAVCIIhCAYZ8IQMgCCAGfiEFIBAgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhECAEQiCIIAVCIIhCAYZ8IQMgCSAGfiEFIBEgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhESAEQiCIIAVCIIhCAYZ8IQMgCiAGfiEFIBIgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEiAEQiCIIAVCIIhCAYZ8IQMgCyAGfiEFIBMgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEyAEQiCIIAVCIIhCAYZ8IQMgDCAGfiEFIBQgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFCAEQiCIIAVCIIhCAYZ8IQMgDSAGfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w9+Qv////8PgyECIA4gAkIBfnwhBCAEQiCIIQMgDyACQv////8PfnwgA3whBCAEQv////8PgyEOIARCIIghAyAQIAJC/rf5/w9+fCADfCEEIARC/////w+DIQ8gBEIgiCEDIBEgAkKCyPadBX58IAN8IQQgBEL/////D4MhECAEQiCIIQMgEiACQoWwh80AfnwgA3whBCAEQv////8PgyERIARCIIghAyATIAJCiLDnmQN+fCADfCEEIARC/////w+DIRIgBEIgiCEDIBQgAkLI+vXMAn58IAN8IQQgBEL/////D4MhEyAEQiCIIQMgFSACQtPOtp8HfnwgA3whBCAEQv////8PgyEUIARCIIghAyAWIAN8IQQgBEL/////D4MhFSAXIARCIIh8IRZCACEXIA8gByAHfnwhBCAEQv////8PgyEPIARCIIghAyAIIAd+IQUgECAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEQIARCIIggBUIgiEIBhnwhAyAJIAd+IQUgESAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyERIARCIIggBUIgiEIBhnwhAyAKIAd+IQUgEiAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyESIARCIIggBUIgiEIBhnwhAyALIAd+IQUgEyAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyETIARCIIggBUIgiEIBhnwhAyAMIAd+IQUgFCAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEUIARCIIggBUIgiEIBhnwhAyANIAd+IQUgFSAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEVIARCIIggBUIgiEIBhnwhAyAWIAN8IQQgBEL/////D4MhFiAXIARCIIh8IRcgDkL/////D35C/////w+DIQIgDiACQgF+fCEEIARCIIghAyAPIAJC/////w9+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkL+t/n/D358IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQoLI9p0FfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJChbCHzQB+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkKIsOeZA358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQsj69cwCfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC0862nwd+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgECAIIAh+fCEEIARC/////w+DIRAgBEIgiCEDIAkgCH4hBSARIAVC/////w+DQgGGfCADfCEEIARC/////w+DIREgBEIgiCAFQiCIQgGGfCEDIAogCH4hBSASIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRIgBEIgiCAFQiCIQgGGfCEDIAsgCH4hBSATIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRMgBEIgiCAFQiCIQgGGfCEDIAwgCH4hBSAUIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRQgBEIgiCAFQiCIQgGGfCEDIA0gCH4hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQv////8PfkL/////D4MhAiAOIAJCAX58IQQgBEIgiCEDIA8gAkL/////D358IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQv63+f8PfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCgsj2nQV+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkKFsIfNAH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQoiw55kDfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCyPr1zAJ+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLTzrafB358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUgFyAEQiCIfCEWQgAhFyARIAkgCX58IQQgBEL/////D4MhESAEQiCIIQMgCiAJfiEFIBIgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEiAEQiCIIAVCIIhCAYZ8IQMgCyAJfiEFIBMgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEyAEQiCIIAVCIIhCAYZ8IQMgDCAJfiEFIBQgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFCAEQiCIIAVCIIhCAYZ8IQMgDSAJfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w9+Qv////8PgyECIA4gAkIBfnwhBCAEQiCIIQMgDyACQv////8PfnwgA3whBCAEQv////8PgyEOIARCIIghAyAQIAJC/rf5/w9+fCADfCEEIARC/////w+DIQ8gBEIgiCEDIBEgAkKCyPadBX58IAN8IQQgBEL/////D4MhECAEQiCIIQMgEiACQoWwh80AfnwgA3whBCAEQv////8PgyERIARCIIghAyATIAJCiLDnmQN+fCADfCEEIARC/////w+DIRIgBEIgiCEDIBQgAkLI+vXMAn58IAN8IQQgBEL/////D4MhEyAEQiCIIQMgFSACQtPOtp8HfnwgA3whBCAEQv////8PgyEUIARCIIghAyAWIAN8IQQgBEL/////D4MhFSAXIARCIIh8IRZCACEXIBIgCiAKfnwhBCAEQv////8PgyESIARCIIghAyALIAp+IQUgEyAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyETIARCIIggBUIgiEIBhnwhAyAMIAp+IQUgFCAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEUIARCIIggBUIgiEIBhnwhAyANIAp+IQUgFSAFQv////8Pg0IBhnwgA3whBCAEQv////8PgyEVIARCIIggBUIgiEIBhnwhAyAWIAN8IQQgBEL/////D4MhFiAXIARCIIh8IRcgDkL/////D35C/////w+DIQIgDiACQgF+fCEEIARCIIghAyAPIAJC/////w9+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkL+t/n/D358IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQoLI9p0FfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJChbCHzQB+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkKIsOeZA358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQsj69cwCfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC0862nwd+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgEyALIAt+fCEEIARC/////w+DIRMgBEIgiCEDIAwgC34hBSAUIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRQgBEIgiCAFQiCIQgGGfCEDIA0gC34hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQv////8PfkL/////D4MhAiAOIAJCAX58IQQgBEIgiCEDIA8gAkL/////D358IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQv63+f8PfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCgsj2nQV+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkKFsIfNAH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQoiw55kDfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCyPr1zAJ+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLTzrafB358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUgFyAEQiCIfCEWQgAhFyAUIAwgDH58IQQgBEL/////D4MhFCAEQiCIIQMgDSAMfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w9+Qv////8PgyECIA4gAkIBfnwhBCAEQiCIIQMgDyACQv////8PfnwgA3whBCAEQv////8PgyEOIARCIIghAyAQIAJC/rf5/w9+fCADfCEEIARC/////w+DIQ8gBEIgiCEDIBEgAkKCyPadBX58IAN8IQQgBEL/////D4MhECAEQiCIIQMgEiACQoWwh80AfnwgA3whBCAEQv////8PgyERIARCIIghAyATIAJCiLDnmQN+fCADfCEEIARC/////w+DIRIgBEIgiCEDIBQgAkLI+vXMAn58IAN8IQQgBEL/////D4MhEyAEQiCIIQMgFSACQtPOtp8HfnwgA3whBCAEQv////8PgyEUIARCIIghAyAWIAN8IQQgBEL/////D4MhFSAXIARCIIh8IRZCACEXIBUgDSANfnwhBCAEQv////8PgyEVIARCIIghAyAWIAN8IQQgBEL/////D4MhFiAXIARCIIh8IRcgDkL/////D35C/////w+DIQIgDiACQgF+fCEEIARCIIghAyAPIAJC/////w9+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkL+t/n/D358IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQoLI9p0FfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJChbCHzQB+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkKIsOeZA358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQsj69cwCfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC0862nwd+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgASAOPgIAIAEg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KQOIATcDiAEgASAAKQOQATcDkAEgASAAKQOYATcDmAEgASAAKQOgATcDoAEgASAAKQOoATcDqAEgASAAKQOwATcDsAEgASAAKQO4ATcDuAELkgMAIAEgACkDADcDACABIAApAwg3AwggASAAKQMQNwMQIAEgACkDGDcDGCABIAApAyA3AyAgASAAKQMoNwMoIAEgACkDMDcDMCABIAApAzg3AzggASAAKQNANwNAIAEgACkDSDcDSCABIAApA1A3A1AgASAAKQNYNwNYIAEgACkDYDcDYCABIAApA2g3A2ggASAAKQNwNwNwIAEgACkDeDcDeCABIAApA4ABNwOAASABIAApA4gBNwOIASABIAApA5ABNwOQASABIAApA5gBNwOYASABIAApA6ABNwOgASABIAApA6gBNwOoASABIAApA7ABNwOwASABIAApA7gBNwO4ASABIAApA8ABNwPAASABIAApA8gBNwPIASABIAApA9ABNwPQASABIAApA9gBNwPYASABIAApA+ABNwPgASABIAApA+gBNwPoASABIAApA/ABNwPwASABIAApA/gBNwP4ASABIAApA4ACNwOAAiABIAApA4gCNwOIAiABIAApA5ACNwOQAiABIAApA5gCNwOYAgsvACAAELABBEAgARCzAQUgAUHAAWoQnAEgAEHgAGogAUHgAGoQnQEgACABEJ0BCwscAQF/IAAgARCnASAAQeAAaiABQeAAahCnAXEPC4sBAQF/IABBwAFqIQIgABCxAQRAIAEQsAEPCyABELABBEBBAA8LIAIQmgEEQCAAIAEQtwEPCyACQdiHARCgASABQdiHAUG4iAEQngEgAkHYhwFBmIkBEJ4BIAFB4ABqQZiJAUH4iQEQngEgAEG4iAEQpwEEQCAAQeAAakH4iQEQpwEEQEEBDwsLQQAPC9kBAgF/AX8gAEHAAWohAiABQcABaiEDIAAQsQEEQCABELEBDwsgARCxAQRAQQAPCyACEJoBBEAgASAAELgBDwsgAxCaAQRAIAAgARC4AQ8LIAJB2IoBEKABIANBuIsBEKABIABBuIsBQZiMARCeASABQdiKAUH4jAEQngEgAkHYigFB2I0BEJ4BIANBuIsBQbiOARCeASAAQeAAakG4jgFBmI8BEJ4BIAFB4ABqQdiNAUH4jwEQngFBmIwBQfiMARCnAQRA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IABB4ABqIABBwAFqQajhAhChASABQeAAaiABQcABakGI4gIQoQFBiNwCQejcAkHo4gIQoQFBiNwCQcjdAkHI4wIQoQFB6NwCQcjdAkGo5AIQoQFBqOECQYjiAiACEJ4BIAJBqOQCIAIQogEgAiACEIQCQYjcAiACIAIQoQFBqN4CQYjfAiACQeAAahCeASACQeAAakHo4gIgAkHgAGoQogFByN0CQYjlAhCEAiACQeAAakGI5QIgAkHgAGoQoQFB6N8CQcjgAiACQcABahCeASACQcABakHI4wIgAkHAAWoQogEgAkHAAWpB6NwCIAJBwAFqEKEBC4ECACAAQejlAhCgASAAIABB4ABqQcjmAhCeAUHI5gJByOYCQajnAhChASAAIABB4ABqQYjoAhCiAUGI6AIgAEHAAWpBiOgCEKEBQYjoAkGI6AIQoAEgAEHgAGogAEHAAWpB6OgCEJ4BQejoAkHo6AJByOkCEKEBIABBwAFqQajqAhCgAUHI6QIgARCEAkHo5QIgASABEKEBQajqAiABQeAAahCEAkGo5wIgAUHgAGogAUHgAGoQoQFB6OUCQajqAiABQcABahChAUHI6QIgAUHAAWogAUHAAWoQogFBiOgCIAFBwAFqIAFBwAFqEKEBQajnAiABQcABaiABQcABahChAQs1ACAAIAEgAhChASAAQeAAaiABQeAAaiACQeAAahChASAAQcABaiABQcABaiACQcABahChAQs1ACAAIAEgAhCiASAAQeAAaiABQeAAaiACQeAAahCiASAAQcABaiABQcABaiACQcABahCiAQsnACAAIAEQowEgAEHgAGogAUHgAGoQowEgAEHAAWogAUHAAWoQowELMAEBfyAAQcABahCqASEBIAEEQCABDwsgAEHgAGoQqgEhASABBEAgAQ8LIAAQqgEPCycAIAAgARClASAAQeAAaiABQeAAahClASAAQcABaiABQcABahClAQsnACAAIAEQpgEgAEHgAGogAUHgAGoQpgEgAEHAAWogAUHAAWoQpgELKQAgACABEKcBIABB4ABqIAFB4ABqEKcBcSAAQcABaiABQcABahCnAXELqwIAIABBiOsCEKABIABB4ABqQejrAhCgASAAQcABakHI7AIQoAEgACAAQeAAakGo7QIQngEgACAAQcABakGI7gIQngEgAEHgAGogAEHAAWpB6O4CEJ4BQejuAkHI7wIQhAJBiOsCQcjvAkHI7wIQogFByOwCQajwAhCEAkGo8AJBqO0CQajwAhCiAUHo6wJBiO4CQYjxAhCiASAAQcABakGo8AJB6PECEJ4BIABB4ABqQYjxAkHI8gIQngFB6PECQcjyAkHo8QIQoQFB6PECQejxAhCEAiAAQcjvAkHI8gIQngFByPICQejxAkHo8QIQoQFB6PECQejxAhCoAUHo8QJByO8CIAEQngFB6PECQajwAiABQeAAahCeAUHo8QJBiPECIAFBwAFqEJ4BCzMAIAAgASACIAMQqQEgAEHgAGogASACIANB4ABqEKkBIABBwAFqIAEgAiADQcABahCpAQs1ACAAQcABahCZAQRAIABB4ABqEJkBBEAgABCrAQ8FIABB4ABqEKsBDwsLIABBwAFqEKsBDwuPAgQBfwF/AX8Bf0EAKAIAIQVBACAFIAJBAWpBoAJsajYCACAFEIgCIAAhBiAFQaACaiEFQQAhCAJAA0AgCCACRg0BIAYQhQIEQCAFQaACayAFEIkCBSAGIAVBoAJrIAUQigILIAYgAWohBiAFQaACaiEFIAhBAWohCAwACwsgBiABayEGIAVBoAJrIQUgAyACQQFrIARsaiEHIAUgBRCTAgJAA0AgCEUNASAGEIUCBEAgBSAFQaACaxCJAiAHEIcCBSAFQaACa0Go8wIQiQIgBSAGIAVBoAJrEIoCIAVBqPMCIAcQigILIAYgAWshBiAHIARrIQcgBUGgAmshBSAIQQFrIQgMAAsLQQAgBTYCAAvOAgIBfwF/IAJFBEAgAxCIAg8LIABByPUCEIkCIAMQiAIgAiEEAkADQCAEQQFrIQQgASAEai0AACEFIAMgAxCLAiAFQYABTwRAIAVBgAFrIQUgA0HI9QIgAxCKAgsgAyADEIsCIAVBwABPBEAgBUHAAGshBSADQcj1AiADEIoCCyADIAMQiwIgBUEgTwRAIAVBIGshBSADQcj1AiADEIoCCyADIAMQiwIgBUEQTwRAIAVBEGshBSADQcj1AiADEIoCCyADIAMQiwIgBUEITwRAIAVBCGshBSADQcj1AiADEIoCCyADIAMQiwIgBUEETwRAIAVBBGshBSADQcj1AiADEIoCCyADIAMQiwIgBUECTwRAIAVBAmshBSADQcj1AiADEIoCCyADIAMQiwIgBUEBTwRAIAVBAWshBSADQcj1AiADEIoCCyAERQ0BDAALCwsyACAAQej3AhCdASAAQcABaiABEIQCIABB4ABqIAFBwAFqEJ0BQej3AiABQeAAahCdAQsRACAAEIUCIABBoAJqEIUCcQsSACAAEIYCIABBoAJqEIUCcQ8LEAAgABCHAiAAQaACahCHAgsQACAAEIgCIABBoAJqEIcCCxgAIAAgARCJAiAAQaACaiABQaACahCJAguFAQAgACABQcj4AhCKAiAAQaACaiABQaACakHo+gIQigIgACAAQaACakGI/QIQjAIgASABQaACakGo/wIQjAJBiP0CQaj/AkGI/QIQigJB6PoCIAIQmAJByPgCIAIgAhCMAkHI+AJB6PoCIAJBoAJqEIwCQYj9AiACQaACaiACQaACahCNAgscACAAIAEgAhCKAiAAQaACaiABIAJBoAJqEIoCC30AIAAgAEGgAmpByIEDEIoCIAAgAEGgAmpB6IMDEIwCIABBoAJqQYiGAxCYAiAAQYiGA0GIhgMQjAJByIEDQaiIAxCYAkGoiANByIEDQaiIAxCMAkHogwNBiIYDIAEQigIgAUGoiAMgARCNAkHIgQNByIEDIAFBoAJqEIwCCyAAIAAgASACEIwCIABBoAJqIAFBoAJqIAJBoAJqEIwCCyAAIAAgASACEI0CIABBoAJqIAFBoAJqIAJBoAJqEI0CCxgAIAAgARCOAiAAQaACaiABQaACahCOAgsYACAAIAEQiQIgAEGgAmogAUGgAmoQjgILGAAgACABEJACIABBoAJqIAFBoAJqEJACCxgAIAAgARCRAiAAQaACaiABQaACahCRAgsZACAAIAEQkgIgAEGgAmogAUGgAmoQkgJxC2oAIABByIoDEIsCIABBoAJqQeiMAxCLAkHojANBiI8DEJgCQciKA0GIjwNBiI8DEI0CQYiPA0GokQMQkwIgAEGokQMgARCKAiAAQaACakGokQMgAUGgAmoQigIgAUGgAmogAUGgAmoQjgILIAAgACABIAIgAxCUAiAAQaACaiABIAIgA0GgAmoQlAILHQEBfyAAQaACahCPAiEBIAEEQCABDwsgABCPAg8LHgAgAEGgAmoQhQIEQCAAEJUCDwsgAEGgAmoQlQIPC48CBAF/AX8BfwF/QQAoAgAhBUEAIAUgAkEBakHABGxqNgIAIAUQnAIgACEGIAVBwARqIQVBACEIAkADQCAIIAJGDQEgBhCZAgRAIAVBwARrIAUQnQIFIAYgBUHABGsgBRCeAgsgBiABaiEGIAVBwARqIQUgCEEBaiEIDAALCyAGIAFrIQYgBUHABGshBSADIAJBAWsgBGxqIQcgBSAFEKgCAkADQCAIRQ0BIAYQmQIEQCAFIAVBwARrEJ0CIAcQmwIFIAVBwARrQciTAxCdAiAFIAYgBUHABGsQngIgBUHIkwMgBxCeAgsgBiABayEGIAcgBGshByAFQcAEayEFIAhBAWshCAwACwtBACAFNgIAC84CAgF/AX8gAkUEQCADEJwCDwsgAEGImAMQnQIgAxCcAiACIQQCQANAIARBAWshBCABIARqLQAAIQUgAyADEKACIAVBgAFPBEAgBUGAAWshBSADQYiYAyADEJ4CCyADIAMQoAIgBUHAAE8EQCAFQcAAayEFIANBiJgDIAMQngILIAMgAxCgAiAFQSBPBEAgBUEgayEFIANBiJgDIAMQngILIAMgAxCgAiAFQRBPBEAgBUEQayEFIANBiJgDIAMQngILIAMgAxCgAiAFQQhPBEAgBUEIayEFIANBiJgDIAMQngILIAMgAxCgAiAFQQRPBEAgBUEEayEFIANBiJgDIAMQngILIAMgAxCgAiAFQQJPBEAgBUECayEFIANBiJgDIAMQngILIAMgAxCgAiAFQQFPBEAgBUEBayEFIANBiJgDIAMQngILIARFDQEMAAsLC9EBAEHIrgMQnAJByK4DQciuAxCjAiAAQcicA0GgAkGIoQMQrQJBiKEDQcilAxCgAiAAQcilA0HIpQMQngJByKUDQYiqAxCkAkGIqgNByKUDQYiqAxCeAkGIqgNByK4DEKcCBEAAC0GIoQMgAEGIswMQngJByKUDQciuAxCnAgRAQciuAxCHAkHosAMQiAJByK4DQYizAyABEJ4CBUHItwMQnAJByLcDQcilA0HItwMQoQJByLcDQeieA0GgAkHItwMQrQJByLcDQYizAyABEJ4CCwtqAEHoywMQnAJB6MsDQejLAxCjAiAAQYi8A0GgAkGovgMQrQJBqL4DQejCAxCgAiAAQejCA0HowgMQngJB6MIDQajHAxCkAkGoxwNB6MIDQajHAxCeAkGoxwNB6MsDEKcCBEBBAA8LQQEPC3gAIAAgAEHgAGpB6NADEKEBIABB4ABqIABBwAFqQcjRAxChASAAQeAAaiABIAJBwAFqEJ4BQcjRAyABIAIQngEgAiACQcABaiACEKIBIAIgAhCEAkHo0AMgASACQeAAahCeASACQeAAaiACQcABaiACQeAAahCiAQvsAQAgACABQajSAxCeASAAQeAAaiACQYjTAxCeASAAIABB4ABqQejTAxChASAAIABBwAFqQcjUAxChASAAQeAAaiAAQcABaiADEKEBIAMgAiADEJ4BIANBiNMDIAMQogEgAyADEIQCIANBqNIDIAMQoQEgASACIANB4ABqEKEBIANB4ABqQejTAyADQeAAahCeASADQeAAakGo0gMgA0HgAGoQogEgA0HgAGpBiNMDIANB4ABqEKIBQcjUAyABIANBwAFqEJ4BIANBwAFqQajSAyADQcABahCiASADQcABakGI0wMgA0HAAWoQoQELkAEAIAAgASACQajVAxCxAiAAQaACaiADQcjXAxCwAiACIANB6NkDEKEBIABBoAJqIAAgBEGgAmoQjAIgBEGgAmogAUHo2QMgBEGgAmoQsQIgBEGgAmpBqNUDIARBoAJqEI0CIARBoAJqQcjXAyAEQaACahCNAkHI1wMgBBCJAiAEIAQQmAIgBEGo1QMgBBCMAgtQACABIABBMGpByNoDEBQgAUEwaiAAQTBqQfjaAxAUIAFB4ABqIABBqNsDEBQgAUGQAWogAEHY2wMQFCACIAFBwAFqQajbA0HI2gMgAhCyAgtsACAAQYj+BCABEJ4BIABB4ABqQej+BCABQeAAahCeASAAQcABakHI/wQgAUHAAWoQngEgAEGgAmpBqIAFIAFBoAJqEJ4BIABBgANqQYiBBSABQYADahCeASAAQeADakHogQUgAUHgA2oQngELigIAIAAgARAAIABBMGogAUEwahASIAFByIIFIAEQngEgAEHgAGogAUHgAGoQACAAQZABaiABQZABahASIAFB4ABqQaiDBSABQeAAahCeASAAQcABaiABQcABahAAIABB8AFqIAFB8AFqEBIgAUHAAWpBiIQFIAFBwAFqEJ4BIABBoAJqIAFBoAJqEAAgAEHQAmogAUHQAmoQEiABQaACakHohAUgAUGgAmoQngEgAEGAA2ogAUGAA2oQACAAQbADaiABQbADahASIAFBgANqQciFBSABQYADahCeASAAQeADaiABQeADahAAIABBkARqIAFBkARqEBIgAUHgA2pBqIYFIAFB4ANqEJ4BC2wAIABBiIcFIAEQngEgAEHgAGpB6IcFIAFB4ABqEJ4BIABBwAFqQciIBSABQcABahCeASAAQaACakGoiQUgAUGgAmoQngEgAEGAA2pBiIoFIAFBgANqEJ4BIABB4ANqQeiKBSABQeADahCeAQuKAgAgACABEAAgAEEwaiABQTBqEBIgAUHIiwUgARCeASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBIgAUHgAGpBqIwFIAFB4ABqEJ4BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQEiABQcABakGIjQUgAUHAAWoQngEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahASIAFBoAJqQeiNBSABQaACahCeASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBIgAUGAA2pByI4FIAFBgANqEJ4BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQEiABQeADakGojwUgAUHgA2oQngELbAAgAEGIkAUgARCeASAAQeAAakHokAUgAUHgAGoQngEgAEHAAWpByJEFIAFBwAFqEJ4BIABBoAJqQaiSBSABQaACahCeASAAQYADakGIkwUgAUGAA2oQngEgAEHgA2pB6JMFIAFB4ANqEJ4BC4oCACAAIAEQACAAQTBqIAFBMGoQEiABQciUBSABEJ4BIABB4ABqIAFB4ABqEAAgAEGQAWogAUGQAWoQEiABQeAAakGolQUgAUHgAGoQngEgAEHAAWogAUHAAWoQACAAQfABaiABQfABahASIAFBwAFqQYiWBSABQcABahCeASAAQaACaiABQaACahAAIABB0AJqIAFB0AJqEBIgAUGgAmpB6JYFIAFBoAJqEJ4BIABBgANqIAFBgANqEAAgAEGwA2ogAUGwA2oQEiABQYADakHIlwUgAUGAA2oQngEgAEHgA2ogAUHgA2oQACAAQZAEaiABQZAEahASIAFB4ANqQaiYBSABQeADahCeAQtsACAAQYiZBSABEJ4BIABB4ABqQeiZBSABQeAAahCeASAAQcABakHImgUgAUHAAWoQngEgAEGgAmpBqJsFIAFBoAJqEJ4BIABBgANqQYicBSABQYADahCeASAAQeADakHonAUgAUHgA2oQngELigIAIAAgARAAIABBMGogAUEwahASIAFByJ0FIAEQngEgAEHgAGogAUHgAGoQACAAQZABaiABQZABahASIAFB4ABqQaieBSABQeAAahCeASAAQcABaiABQcABahAAIABB8AFqIAFB8AFqEBIgAUHAAWpBiJ8FIAFBwAFqEJ4BIABBoAJqIAFBoAJqEAAgAEHQAmogAUHQAmoQEiABQaACakHonwUgAUGgAmoQngEgAEGAA2ogAUGAA2oQACAAQbADaiABQbADahASIAFBgANqQcigBSABQYADahCeASAAQeADaiABQeADahAAIABBkARqIAFBkARqEBIgAUHgA2pBqKEFIAFB4ANqEJ4BC2wAIABBiKIFIAEQngEgAEHgAGpB6KIFIAFB4ABqEJ4BIABBwAFqQcijBSABQcABahCeASAAQaACakGopAUgAUGgAmoQngEgAEGAA2pBiKUFIAFBgANqEJ4BIABB4ANqQeilBSABQeADahCeAQuKAgAgACABEAAgAEEwaiABQTBqEBIgAUHIpgUgARCeASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBIgAUHgAGpBqKcFIAFB4ABqEJ4BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQEiABQcABakGIqAUgAUHAAWoQngEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahASIAFBoAJqQeioBSABQaACahCeASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBIgAUGAA2pByKkFIAFBgANqEJ4BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQEiABQeADakGoqgUgAUHgA2oQngELhQEAIAAQVgRAQQEPCyAAEG9FBEBBAA8LIABBiKsFQfirBRAUIABBMGpBqKwFEAAgAEG4qwVBiK0FEBQgAEEwakG4rQUQAEH4qwVB+KsFEGBB+KsFIABB+KsFEGhB+KsFQYitBUH4qwUQaEH4qwVB6KsFQRBB+KsFEIUBQfirBUGIrQUQXg8LEgAgAEHorQUQbkHorQUQvgIPC7QCACAAELABBEBBAQ8LIAAQyQFFBEBBAA8LIABByK4FQfCwBRCeASAAQeAAakHIrgVB0LEFEJ4BQfCwBUGorwVBsLIFEJ8BQdCxBUGQswUQowFB8LAFQfCzBRCjAUHQsQVB2K8FQdC0BRCeAUGwsgVB4LIFQcCwBRARQbCyBUHgsgVB4LIFEBBBwLAFQbCyBRAAQZCzBUHAswVBwLAFEBFBkLMFQcCzBUHAswUQEEHAsAVBkLMFEABB8LMFQaC0BUHAsAUQEEHwswVBoLQFQaC0BRARQcCwBUHwswUQAEGAtQVB0LQFQcCwBRARQdC0BUGAtQVBgLUFEBBBwLAFQdC0BRAAQbC1BRCcAUHwswVBuLAFQQhB8LMFEN8BQfCzBUGwsgVB8LMFEL0BQfCzBSAAELgBDwsTACAAQZC2BRDIAUGQtgUQwAIPC9gEACAAQcABakHQtwUQoAEgAUHgAGpBsLgFEKABQdC3BSABQfC5BRCeASABQeAAaiAAQcABaiACQeAAahChASACQeAAaiACQeAAahCgASACQeAAakGwuAUgAkHgAGoQogEgAkHgAGpB0LcFIAJB4ABqEKIBIAJB4ABqQdC3BSACQeAAahCeAUHwuQUgAEHQugUQogFB0LoFQbC7BRCgAUGwuwVBsLsFQZC8BRChAUGQvAVBkLwFQZC8BRChAUGQvAVB0LoFQfC8BRCeASACQeAAaiAAQeAAakHQvQUQogFB0L0FIABB4ABqQdC9BRCiAUHQvQUgASACQcABahCeAUGQvAUgAEGwvgUQngFB0L0FIAAQoAEgAEHwvAUgABCiASAAQbC+BSAAEKIBIABBsL4FIAAQogEgAEHAAWpB0LoFIABBwAFqEKEBIABBwAFqIABBwAFqEKABIABBwAFqQdC3BSAAQcABahCiASAAQcABakGwuwUgAEHAAWoQogEgAUHgAGogAEHAAWogAhChAUGwvgUgAEGQvwUQogFBkL8FQdC9BUGQvwUQngEgAEHgAGpB8LwFQfC5BRCeAUHwuQVB8LkFQfC5BRChAUGQvwVB8LkFIABB4ABqEKIBIAIgAhCgASACQbC4BSACEKIBIABBwAFqQZC5BRCgASACQZC5BSACEKIBIAJBwAFqIAJBwAFqIAJBwAFqEKEBIAJBwAFqIAIgAkHAAWoQogEgAEHAAWogAEHAAWogAhChAUHQvQVB0L0FEKMBQdC9BUHQvQUgAkHgAGoQoQELsgQAIAAgARCgASAAQeAAakHQwAUQoAFB0MAFQbDBBRCgAUHQwAUgACABQeAAahChASABQeAAaiABQeAAahCgASABQeAAaiABIAFB4ABqEKIBIAFB4ABqQbDBBSABQeAAahCiASABQeAAaiABQeAAaiABQeAAahChASABIAFBkMIFEKEBQZDCBSABQZDCBRChASAAQZDCBSABQcABahChAUGQwgVB8MIFEKABIABBwAFqQfC/BRCgAUHwwgUgAUHgAGogABCiASAAIAFB4ABqIAAQogEgAEHAAWogAEHgAGogAEHAAWoQoQEgAEHAAWogAEHAAWoQoAEgAEHAAWpB0MAFIABBwAFqEKIBIABBwAFqQfC/BSAAQcABahCiASABQeAAaiAAIABB4ABqEKIBIABB4ABqQZDCBSAAQeAAahCeAUGwwQVBsMEFQbDBBRChAUGwwQVBsMEFQbDBBRChAUGwwQVBsMEFQbDBBRChASAAQeAAakGwwQUgAEHgAGoQogFBkMIFQfC/BSABQeAAahCeASABQeAAaiABQeAAaiABQeAAahChASABQeAAaiABQeAAahCjASABQcABaiABQcABahCgASABQcABaiABIAFBwAFqEKIBIAFBwAFqQfDCBSABQcABahCiAUHQwAVB0MAFQdDABRChAUHQwAVB0MAFQdDABRChASABQcABakHQwAUgAUHAAWoQogEgAEHAAWpB8L8FIAEQngEgASABIAEQoQELCAAgACABEHILbQIBfwF/IAAgARDMASABELEBBEAPCyABQdDDBRC1ASABQaACaiECQT4hAwJAA0BB0MMFIAIQwwIgAkGgAmohAiADLACo0AMEQEHQwwUgASACEMICIAJBoAJqIQILIANFDQEgA0EBayEDDAALCwuAAQIBfwF/IAIQnAIgABBXBEAPCyABEFcEQA8LIAFBoAJqIQNBPiEEAkADQCAAIAMgAhCzAiADQaACaiEDIAQsAKjQAwRAIAAgAyACELMCIANBoAJqIQMLIAIgAhCgAiAEQQFGDQEgBEEBayEEDAALCyAAIAMgAhCzAiACIAIQpAILEAAgAEHwxQVBoAQgARCtAgvsBQAgACAAQYADakHQzgUQngEgAEGAA2pBkMoFEIQCIABBkMoFQZDKBRChASAAIABBgANqQbDPBRChAUGwzwVBkMoFQZDKBRCeAUHQzgVBsM8FEIQCQdDOBUGwzwVBsM8FEKEBQZDKBUGwzwVBkMoFEKIB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"; +export const pq = 712; +export const pr = 3464; +export const pG1gen = 42968; +export const pG1zero = 43112; +export const pG1b = 4776; +export const pG2gen = 43256; +export const pG2zero = 43544; +export const pG2b = 17272; +export const pOneT = 43832; +export const prePSize = 288; +export const preQSize = 20448; +export const n8q = 48; +export const n8r = 32; +export const q = "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787"; +export const r = "52435875175126190479447740508185965837690552500527637822603658699938581184513"; diff --git a/build/bn128.wasm b/build/bn128.wasm index f0500e9..5f853c0 100644 Binary files a/build/bn128.wasm and b/build/bn128.wasm differ diff --git a/build/bn128_wasm.js b/build/bn128_wasm.js index 789a9f6..e08686b 100644 --- a/build/bn128_wasm.js +++ b/build/bn128_wasm.js @@ -1,18 +1,16 @@ - - exports.code = "AGFzbQEAAAABlAESYAJ/fwBgAX8AYAF/AX9gAn9/AX9gA39/fwF/YAN/f38AYAN/fn8AYAJ/fgBgBH9/f38AYAV/f39/fwBgBH9/f38Bf2AHf39/f39/fwBgBn9/f39/fwBgCn9/f39/f39/f38AYAV/f39/fwF/YAd/f39/f39/AX9gCX9/f39/f39/fwF/YAt/f39/f39/f39/fwF/Ag8BA2VudgZtZW1vcnkCABkDwQK/AgABAgEDAwQEBQAABgcIBQIFBQAABQAAAAACAgABBQgJBQUFCAgICAACAgUFAAAFAAAAAAICAAEFCAkFBQUICAgIAAIFAAACAgIBAQAAAAMDAwAABQUFAAAFBQUAAAAAAAICBQAFAAAAAAUFBQUFCgALCQoACwkICAMACAgCAAAJDAwFBQwACA0JCAICAQEABQUABQUAAAAAAwAIAgIJCAACAgIBAQAAAAMDAwAABQUFAAAFBQUAAAAAAAICBQAFAAAAAAUFBQUFCgALCQoACwkICAUDAAgIAgAACQwMBQUMBQMACAgCAAAJDAwFBQwFBQkJCQkJAAICAQEABQAFBQACAAADAAgCCQgAAgIBAQAFBQAFBQAAAAADAAgCAgkIAAIFAAAAAAgIBQAAAAAAAAAAAAAAAAAAAAAEDg8QEQUH9SSoAghpbnRfY29weQAACGludF96ZXJvAAEHaW50X29uZQADCmludF9pc1plcm8AAgZpbnRfZXEABAdpbnRfZ3RlAAUHaW50X2FkZAAGB2ludF9zdWIABwdpbnRfbXVsAAgKaW50X3NxdWFyZQAJDWludF9zcXVhcmVPbGQACgdpbnRfZGl2AA0OaW50X2ludmVyc2VNb2QADghmMW1fY29weQAACGYxbV96ZXJvAAEKZjFtX2lzWmVybwACBmYxbV9lcQAEB2YxbV9hZGQAEAdmMW1fc3ViABEHZjFtX25lZwASDmYxbV9pc05lZ2F0aXZlABkJZjFtX2lzT25lAA8IZjFtX3NpZ24AGgtmMW1fbVJlZHVjdAATB2YxbV9tdWwAFApmMW1fc3F1YXJlABUNZjFtX3NxdWFyZU9sZAAWEmYxbV9mcm9tTW9udGdvbWVyeQAYEGYxbV90b01vbnRnb21lcnkAFwtmMW1faW52ZXJzZQAbB2YxbV9vbmUAHAhmMW1fbG9hZAAdD2YxbV90aW1lc1NjYWxhcgAeB2YxbV9leHAAJhBmMW1fYmF0Y2hJbnZlcnNlAB8IZjFtX3NxcnQAJwxmMW1faXNTcXVhcmUAKBVmMW1fYmF0Y2hUb01vbnRnb21lcnkAIBdmMW1fYmF0Y2hGcm9tTW9udGdvbWVyeQAhCGZybV9jb3B5AAAIZnJtX3plcm8AAQpmcm1faXNaZXJvAAIGZnJtX2VxAAQHZnJtX2FkZAAqB2ZybV9zdWIAKwdmcm1fbmVnACwOZnJtX2lzTmVnYXRpdmUAMwlmcm1faXNPbmUAKQhmcm1fc2lnbgA0C2ZybV9tUmVkdWN0AC0HZnJtX211bAAuCmZybV9zcXVhcmUALw1mcm1fc3F1YXJlT2xkADASZnJtX2Zyb21Nb250Z29tZXJ5ADIQZnJtX3RvTW9udGdvbWVyeQAxC2ZybV9pbnZlcnNlADUHZnJtX29uZQA2CGZybV9sb2FkADcPZnJtX3RpbWVzU2NhbGFyADgHZnJtX2V4cABAEGZybV9iYXRjaEludmVyc2UAOQhmcm1fc3FydABBDGZybV9pc1NxdWFyZQBCFWZybV9iYXRjaFRvTW9udGdvbWVyeQA6F2ZybV9iYXRjaEZyb21Nb250Z29tZXJ5ADsGZnJfYWRkACoGZnJfc3ViACsGZnJfbmVnACwGZnJfbXVsAEMJZnJfc3F1YXJlAEQKZnJfaW52ZXJzZQBFDWZyX2lzTmVnYXRpdmUARgdmcl9jb3B5AAAHZnJfemVybwABBmZyX29uZQA2CWZyX2lzWmVybwACBWZyX2VxAAQMZzFtX211bHRpZXhwAHESZzFtX211bHRpZXhwX2NodW5rAHASZzFtX211bHRpZXhwQWZmaW5lAHUYZzFtX211bHRpZXhwQWZmaW5lX2NodW5rAHQKZzFtX2lzWmVybwBIEGcxbV9pc1plcm9BZmZpbmUARwZnMW1fZXEAUAtnMW1fZXFNaXhlZABPDGcxbV9lcUFmZmluZQBOCGcxbV9jb3B5AEwOZzFtX2NvcHlBZmZpbmUASwhnMW1femVybwBKDmcxbV96ZXJvQWZmaW5lAEkKZzFtX2RvdWJsZQBSEGcxbV9kb3VibGVBZmZpbmUAUQdnMW1fYWRkAFUMZzFtX2FkZE1peGVkAFQNZzFtX2FkZEFmZmluZQBTB2cxbV9uZWcAVw1nMW1fbmVnQWZmaW5lAFYHZzFtX3N1YgBaDGcxbV9zdWJNaXhlZABZDWcxbV9zdWJBZmZpbmUAWBJnMW1fZnJvbU1vbnRnb21lcnkAXBhnMW1fZnJvbU1vbnRnb21lcnlBZmZpbmUAWxBnMW1fdG9Nb250Z29tZXJ5AF4WZzFtX3RvTW9udGdvbWVyeUFmZmluZQBdD2cxbV90aW1lc1NjYWxhcgB2FWcxbV90aW1lc1NjYWxhckFmZmluZQB3DWcxbV9ub3JtYWxpemUAYwpnMW1fTEVNdG9VAGUKZzFtX0xFTXRvQwBmCmcxbV9VdG9MRU0AZwpnMW1fQ3RvTEVNAGgPZzFtX2JhdGNoTEVNdG9VAGkPZzFtX2JhdGNoTEVNdG9DAGoPZzFtX2JhdGNoVXRvTEVNAGsPZzFtX2JhdGNoQ3RvTEVNAGwMZzFtX3RvQWZmaW5lAF8OZzFtX3RvSmFjb2JpYW4ATRFnMW1fYmF0Y2hUb0FmZmluZQBiE2cxbV9iYXRjaFRvSmFjb2JpYW4AbQtnMW1faW5DdXJ2ZQBhEWcxbV9pbkN1cnZlQWZmaW5lAGAHZnJtX2ZmdAB9CGZybV9pZmZ0AH4KZnJtX3Jhd2ZmdAB7C2ZybV9mZnRKb2luAH8OZnJtX2ZmdEpvaW5FeHQAgAERZnJtX2ZmdEpvaW5FeHRJbnYAgQEKZnJtX2ZmdE1peACCAQxmcm1fZmZ0RmluYWwAgwEdZnJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24AhAEIcG9sX3plcm8AhQEPcG9sX2NvbnN0cnVjdExDAIYBDHFhcF9idWlsZEFCQwCHAQtxYXBfam9pbkFCQwCIAQxxYXBfYmF0Y2hBZGQAiQEKZjJtX2lzWmVybwCKAQlmMm1faXNPbmUAiwEIZjJtX3plcm8AjAEHZjJtX29uZQCNAQhmMm1fY29weQCOAQdmMm1fbXVsAI8BCGYybV9tdWwxAJABCmYybV9zcXVhcmUAkQEHZjJtX2FkZACSAQdmMm1fc3ViAJMBB2YybV9uZWcAlAEIZjJtX3NpZ24AmwENZjJtX2Nvbmp1Z2F0ZQCVARJmMm1fZnJvbU1vbnRnb21lcnkAlwEQZjJtX3RvTW9udGdvbWVyeQCWAQZmMm1fZXEAmAELZjJtX2ludmVyc2UAmQEHZjJtX2V4cACeAQ9mMm1fdGltZXNTY2FsYXIAmgEQZjJtX2JhdGNoSW52ZXJzZQCdAQhmMm1fc3FydACfAQxmMm1faXNTcXVhcmUAoAEOZjJtX2lzTmVnYXRpdmUAnAEMZzJtX211bHRpZXhwAMsBEmcybV9tdWx0aWV4cF9jaHVuawDKARJnMm1fbXVsdGlleHBBZmZpbmUAzwEYZzJtX211bHRpZXhwQWZmaW5lX2NodW5rAM4BCmcybV9pc1plcm8AogEQZzJtX2lzWmVyb0FmZmluZQChAQZnMm1fZXEAqgELZzJtX2VxTWl4ZWQAqQEMZzJtX2VxQWZmaW5lAKgBCGcybV9jb3B5AKYBDmcybV9jb3B5QWZmaW5lAKUBCGcybV96ZXJvAKQBDmcybV96ZXJvQWZmaW5lAKMBCmcybV9kb3VibGUArAEQZzJtX2RvdWJsZUFmZmluZQCrAQdnMm1fYWRkAK8BDGcybV9hZGRNaXhlZACuAQ1nMm1fYWRkQWZmaW5lAK0BB2cybV9uZWcAsQENZzJtX25lZ0FmZmluZQCwAQdnMm1fc3ViALQBDGcybV9zdWJNaXhlZACzAQ1nMm1fc3ViQWZmaW5lALIBEmcybV9mcm9tTW9udGdvbWVyeQC2ARhnMm1fZnJvbU1vbnRnb21lcnlBZmZpbmUAtQEQZzJtX3RvTW9udGdvbWVyeQC4ARZnMm1fdG9Nb250Z29tZXJ5QWZmaW5lALcBD2cybV90aW1lc1NjYWxhcgDQARVnMm1fdGltZXNTY2FsYXJBZmZpbmUA0QENZzJtX25vcm1hbGl6ZQC9AQpnMm1fTEVNdG9VAL8BCmcybV9MRU10b0MAwAEKZzJtX1V0b0xFTQDBAQpnMm1fQ3RvTEVNAMIBD2cybV9iYXRjaExFTXRvVQDDAQ9nMm1fYmF0Y2hMRU10b0MAxAEPZzJtX2JhdGNoVXRvTEVNAMUBD2cybV9iYXRjaEN0b0xFTQDGAQxnMm1fdG9BZmZpbmUAuQEOZzJtX3RvSmFjb2JpYW4ApwERZzJtX2JhdGNoVG9BZmZpbmUAvAETZzJtX2JhdGNoVG9KYWNvYmlhbgDHAQtnMm1faW5DdXJ2ZQC7ARFnMm1faW5DdXJ2ZUFmZmluZQC6AQtnMW1fdGltZXNGcgDSAQdnMW1fZmZ0ANgBCGcxbV9pZmZ0ANkBCmcxbV9yYXdmZnQA1gELZzFtX2ZmdEpvaW4A2gEOZzFtX2ZmdEpvaW5FeHQA2wERZzFtX2ZmdEpvaW5FeHRJbnYA3AEKZzFtX2ZmdE1peADdAQxnMW1fZmZ0RmluYWwA3gEdZzFtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24A3wELZzJtX3RpbWVzRnIA4AEHZzJtX2ZmdADmAQhnMm1faWZmdADnAQpnMm1fcmF3ZmZ0AOQBC2cybV9mZnRKb2luAOgBDmcybV9mZnRKb2luRXh0AOkBEWcybV9mZnRKb2luRXh0SW52AOoBCmcybV9mZnRNaXgA6wEMZzJtX2ZmdEZpbmFsAOwBHWcybV9wcmVwYXJlTGFncmFuZ2VFdmFsdWF0aW9uAO0BEWcxbV90aW1lc0ZyQWZmaW5lAO4BEWcybV90aW1lc0ZyQWZmaW5lAO8BEWZybV9iYXRjaEFwcGx5S2V5APABEWcxbV9iYXRjaEFwcGx5S2V5APEBFmcxbV9iYXRjaEFwcGx5S2V5TWl4ZWQA8gERZzJtX2JhdGNoQXBwbHlLZXkA8wEWZzJtX2JhdGNoQXBwbHlLZXlNaXhlZAD0AQpmNm1faXNaZXJvAPYBCWY2bV9pc09uZQD3AQhmNm1femVybwD4AQdmNm1fb25lAPkBCGY2bV9jb3B5APoBB2Y2bV9tdWwA+wEKZjZtX3NxdWFyZQD8AQdmNm1fYWRkAP0BB2Y2bV9zdWIA/gEHZjZtX25lZwD/AQhmNm1fc2lnbgCAAhJmNm1fZnJvbU1vbnRnb21lcnkAggIQZjZtX3RvTW9udGdvbWVyeQCBAgZmNm1fZXEAgwILZjZtX2ludmVyc2UAhAIHZjZtX2V4cACIAg9mNm1fdGltZXNTY2FsYXIAhQIQZjZtX2JhdGNoSW52ZXJzZQCHAg5mNm1faXNOZWdhdGl2ZQCGAgpmdG1faXNaZXJvAIoCCWZ0bV9pc09uZQCLAghmdG1femVybwCMAgdmdG1fb25lAI0CCGZ0bV9jb3B5AI4CB2Z0bV9tdWwAjwIIZnRtX211bDEAkAIKZnRtX3NxdWFyZQCRAgdmdG1fYWRkAJICB2Z0bV9zdWIAkwIHZnRtX25lZwCUAghmdG1fc2lnbgCbAg1mdG1fY29uanVnYXRlAJUCEmZ0bV9mcm9tTW9udGdvbWVyeQCXAhBmdG1fdG9Nb250Z29tZXJ5AJYCBmZ0bV9lcQCYAgtmdG1faW52ZXJzZQCZAgdmdG1fZXhwAJ4CD2Z0bV90aW1lc1NjYWxhcgCaAhBmdG1fYmF0Y2hJbnZlcnNlAJ0CCGZ0bV9zcXJ0AJ8CDGZ0bV9pc1NxdWFyZQCgAg5mdG1faXNOZWdhdGl2ZQCcAhRibjEyOF9fZnJvYmVuaXVzTWFwMACpAhRibjEyOF9fZnJvYmVuaXVzTWFwMQCqAhRibjEyOF9fZnJvYmVuaXVzTWFwMgCrAhRibjEyOF9fZnJvYmVuaXVzTWFwMwCsAhRibjEyOF9fZnJvYmVuaXVzTWFwNACtAhRibjEyOF9fZnJvYmVuaXVzTWFwNQCuAhRibjEyOF9fZnJvYmVuaXVzTWFwNgCvAhRibjEyOF9fZnJvYmVuaXVzTWFwNwCwAhRibjEyOF9fZnJvYmVuaXVzTWFwOACxAhRibjEyOF9fZnJvYmVuaXVzTWFwOQCyAhBibjEyOF9wYWlyaW5nRXExALkCEGJuMTI4X3BhaXJpbmdFcTIAugIQYm4xMjhfcGFpcmluZ0VxMwC7AhBibjEyOF9wYWlyaW5nRXE0ALwCEGJuMTI4X3BhaXJpbmdFcTUAvQINYm4xMjhfcGFpcmluZwC+Ag9ibjEyOF9wcmVwYXJlRzEAowIPYm4xMjhfcHJlcGFyZUcyAKUCEGJuMTI4X21pbGxlckxvb3AAqAIZYm4xMjhfZmluYWxFeHBvbmVudGlhdGlvbgC4AhxibjEyOF9maW5hbEV4cG9uZW50aWF0aW9uT2xkALMCD2JuMTI4X19tdWxCeTAyNACmAhJibjEyOF9fbXVsQnkwMjRPbGQApwIXYm4xMjhfX2N5Y2xvdG9taWNTcXVhcmUAtQIXYm4xMjhfX2N5Y2xvdG9taWNFeHBfdzAAtgIK/d8DvwIqACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxgLHgAgAEIANwMAIABCADcDCCAAQgA3AxAgAEIANwMYCzMAIAApAxhQBEAgACkDEFAEQCAAKQMIUARAIAApAwBQDwVBAA8LBUEADwsFQQAPC0EADwseACAAQgE3AwAgAEIANwMIIABCADcDECAAQgA3AxgLRwAgACkDGCABKQMYUQRAIAApAxAgASkDEFEEQCAAKQMIIAEpAwhRBEAgACkDACABKQMAUQ8FQQAPCwVBAA8LBUEADwtBAA8LfQAgACkDGCABKQMYVARAQQAPBSAAKQMYIAEpAxhWBEBBAQ8FIAApAxAgASkDEFQEQEEADwUgACkDECABKQMQVgRAQQEPBSAAKQMIIAEpAwhUBEBBAA8FIAApAwggASkDCFYEQEEBDwUgACkDACABKQMAWg8LCwsLCwtBAA8L1AEBAX4gADUCACABNQIAfCEDIAIgAz4CACAANQIEIAE1AgR8IANCIIh8IQMgAiADPgIEIAA1AgggATUCCHwgA0IgiHwhAyACIAM+AgggADUCDCABNQIMfCADQiCIfCEDIAIgAz4CDCAANQIQIAE1AhB8IANCIIh8IQMgAiADPgIQIAA1AhQgATUCFHwgA0IgiHwhAyACIAM+AhQgADUCGCABNQIYfCADQiCIfCEDIAIgAz4CGCAANQIcIAE1Ahx8IANCIIh8IQMgAiADPgIcIANCIIinC4wCAQF+IAA1AgAgATUCAH0hAyACIANC/////w+DPgIAIAA1AgQgATUCBH0gA0Igh3whAyACIANC/////w+DPgIEIAA1AgggATUCCH0gA0Igh3whAyACIANC/////w+DPgIIIAA1AgwgATUCDH0gA0Igh3whAyACIANC/////w+DPgIMIAA1AhAgATUCEH0gA0Igh3whAyACIANC/////w+DPgIQIAA1AhQgATUCFH0gA0Igh3whAyACIANC/////w+DPgIUIAA1AhggATUCGH0gA0Igh3whAyACIANC/////w+DPgIYIAA1AhwgATUCHH0gA0Igh3whAyACIANC/////w+DPgIcIANCIIenC48QEgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfiADQv////8PgyAANQIAIgUgATUCACIGfnwhAyAEIANCIIh8IQQgAiADPgIAIARCIIghAyAEQv////8PgyAFIAE1AgQiCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgQiByAGfnwhBCADIARCIIh8IQMgAiAEPgIEIANCIIghBCADQv////8PgyAFIAE1AggiCn58IQMgBCADQiCIfCEEIANC/////w+DIAcgCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AggiCSAGfnwhAyAEIANCIIh8IQQgAiADPgIIIARCIIghAyAEQv////8PgyAFIAE1AgwiDH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgCn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgwiCyAGfnwhBCADIARCIIh8IQMgAiAEPgIMIANCIIghBCADQv////8PgyAFIAE1AhAiDn58IQMgBCADQiCIfCEEIANC/////w+DIAcgDH58IQMgBCADQiCIfCEEIANC/////w+DIAkgCn58IQMgBCADQiCIfCEEIANC/////w+DIAsgCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AhAiDSAGfnwhAyAEIANCIIh8IQQgAiADPgIQIARCIIghAyAEQv////8PgyAFIAE1AhQiEH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgDn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgDH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgCn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AhQiDyAGfnwhBCADIARCIIh8IQMgAiAEPgIUIANCIIghBCADQv////8PgyAFIAE1AhgiEn58IQMgBCADQiCIfCEEIANC/////w+DIAcgEH58IQMgBCADQiCIfCEEIANC/////w+DIAkgDn58IQMgBCADQiCIfCEEIANC/////w+DIAsgDH58IQMgBCADQiCIfCEEIANC/////w+DIA0gCn58IQMgBCADQiCIfCEEIANC/////w+DIA8gCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AhgiESAGfnwhAyAEIANCIIh8IQQgAiADPgIYIARCIIghAyAEQv////8PgyAFIAE1AhwiFH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgEn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgEH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgDn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gDH58IQQgAyAEQiCIfCEDIARC/////w+DIA8gCn58IQQgAyAEQiCIfCEDIARC/////w+DIBEgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AhwiEyAGfnwhBCADIARCIIh8IQMgAiAEPgIcIANCIIghBCADQv////8PgyAHIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyAJIBJ+fCEDIAQgA0IgiHwhBCADQv////8PgyALIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyANIA5+fCEDIAQgA0IgiHwhBCADQv////8PgyAPIAx+fCEDIAQgA0IgiHwhBCADQv////8PgyARIAp+fCEDIAQgA0IgiHwhBCADQv////8PgyATIAh+fCEDIAQgA0IgiHwhBCACIAM+AiAgBEIgiCEDIARC/////w+DIAkgFH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgEn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gEH58IQQgAyAEQiCIfCEDIARC/////w+DIA8gDn58IQQgAyAEQiCIfCEDIARC/////w+DIBEgDH58IQQgAyAEQiCIfCEDIARC/////w+DIBMgCn58IQQgAyAEQiCIfCEDIAIgBD4CJCADQiCIIQQgA0L/////D4MgCyAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSASfnwhAyAEIANCIIh8IQQgA0L/////D4MgDyAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAOfnwhAyAEIANCIIh8IQQgA0L/////D4MgEyAMfnwhAyAEIANCIIh8IQQgAiADPgIoIARCIIghAyAEQv////8PgyANIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAPIBJ+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyATIA5+fCEEIAMgBEIgiHwhAyACIAQ+AiwgA0IgiCEEIANC/////w+DIA8gFH58IQMgBCADQiCIfCEEIANC/////w+DIBEgEn58IQMgBCADQiCIfCEEIANC/////w+DIBMgEH58IQMgBCADQiCIfCEEIAIgAz4CMCAEQiCIIQMgBEL/////D4MgESAUfnwhBCADIARCIIh8IQMgBEL/////D4MgEyASfnwhBCADIARCIIh8IQMgAiAEPgI0IANCIIghBCADQv////8PgyATIBR+fCEDIAQgA0IgiHwhBCACIAM+AjggBEIgiCEDIAIgBD4CPAuMEgwBfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX5CACECQgAhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAANQIAIgYgBn58IQIgAyACQiCIfCEDIAEgAj4CACADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIEIgd+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIEIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AggiCH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAcgB358IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AgggAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCDCIJfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAIfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CDCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIQIgp+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAl+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAIIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIQIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AhQiC358IQIgAyACQiCIfCEDIAJC/////w+DIAcgCn58IQIgAyACQiCIfCEDIAJC/////w+DIAggCX58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AhQgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCGCIMfnwhAiADIAJCIIh8IQMgAkL/////D4MgByALfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCAKfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgCSAJfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CGCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIcIg1+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAIIAt+fCECIAMgAkIgiHwhAyACQv////8PgyAJIAp+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIcIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAIIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAJIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAKIAp+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIgIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAIIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAJIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAKIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIkIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAJIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAKIAx+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyALIAt+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIoIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAKIA1+fCECIAMgAkIgiHwhAyACQv////8PgyALIAx+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIsIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyALIA1+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAMIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIwIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAMIA1+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgI0IAMhBCAEQiCIIQVCACECQgAhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyANIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgI4IAMhBCAEQiCIIQUgASAEPgI8CwoAIAAgACABEAgLtgEBAX4gADUAACABfiEDIAIgAz4AACAANQAEIAF+IANCIIh8IQMgAiADPgAEIAA1AAggAX4gA0IgiHwhAyACIAM+AAggADUADCABfiADQiCIfCEDIAIgAz4ADCAANQAQIAF+IANCIIh8IQMgAiADPgAQIAA1ABQgAX4gA0IgiHwhAyACIAM+ABQgADUAGCABfiADQiCIfCEDIAIgAz4AGCAANQAcIAF+IANCIIh8IQMgAiADPgAcC04CAX4BfyAAIQMgAzUAACABfCECIAMgAj4AACACQiCIIQICQANAIAJQDQEgA0EEaiEDIAM1AAAgAnwhAiADIAI+AAAgAkIgiCECDAALCwurAgcBfwF/AX8BfwF+AX4BfyACBEAgAiEFBUHIACEFCyADBEAgAyEEBUHoACEECyAAIAQQACABQSgQACAFEAFBiAEQAUEf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LCADQiCIfEHoAzUCECAEfnwhAyAAIAM+AiwgADUCMCADQiCIfEHoAzUCFCAEfnwhAyAAIAM+AjAgADUCNCADQiCIfEHoAzUCGCAEfnwhAyAAIAM+AjQgADUCOCADQiCIfEHoAzUCHCAEfnwhAyAAIAM+AjhBiAYgA0IgiD4CHEGIBiAAQSBqIAEQEAu+HyMBfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+QonHmaQOIQUgA0L/////D4MgADUCACIGIAE1AgAiB358IQMgBCADQiCIfCEEIANC/////w+DIAV+Qv////8PgyEIIANC/////w+DQQA1AugDIgkgCH58IQMgBCADQiCIfCEEIARCIIghAyAEQv////8PgyAGIAE1AgQiC358IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgQiCiAHfnwhBCADIARCIIh8IQMgBEL/////D4NBADUC7AMiDSAIfnwhBCADIARCIIh8IQMgBEL/////D4MgBX5C/////w+DIQwgBEL/////D4MgCSAMfnwhBCADIARCIIh8IQMgA0IgiCEEIANC/////w+DIAYgATUCCCIPfnwhAyAEIANCIIh8IQQgA0L/////D4MgCiALfnwhAyAEIANCIIh8IQQgA0L/////D4MgADUCCCIOIAd+fCEDIAQgA0IgiHwhBCADQv////8PgyANIAx+fCEDIAQgA0IgiHwhBCADQv////8Pg0EANQLwAyIRIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAFfkL/////D4MhECADQv////8PgyAJIBB+fCEDIAQgA0IgiHwhBCAEQiCIIQMgBEL/////D4MgBiABNQIMIhN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAKIA9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAOIAt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIMIhIgB358IQQgAyAEQiCIfCEDIARC/////w+DIA0gEH58IQQgAyAEQiCIfCEDIARC/////w+DIBEgDH58IQQgAyAEQiCIfCEDIARC/////w+DQQA1AvQDIhUgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAV+Qv////8PgyEUIARC/////w+DIAkgFH58IQQgAyAEQiCIfCEDIANCIIghBCADQv////8PgyAGIAE1AhAiF358IQMgBCADQiCIfCEEIANC/////w+DIAogE358IQMgBCADQiCIfCEEIANC/////w+DIA4gD358IQMgBCADQiCIfCEEIANC/////w+DIBIgC358IQMgBCADQiCIfCEEIANC/////w+DIAA1AhAiFiAHfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgFSAMfnwhAyAEIANCIIh8IQQgA0L/////D4NBADUC+AMiGSAIfnwhAyAEIANCIIh8IQQgA0L/////D4MgBX5C/////w+DIRggA0L/////D4MgCSAYfnwhAyAEIANCIIh8IQQgBEIgiCEDIARC/////w+DIAYgATUCFCIbfnwhBCADIARCIIh8IQMgBEL/////D4MgCiAXfnwhBCADIARCIIh8IQMgBEL/////D4MgDiATfnwhBCADIARCIIh8IQMgBEL/////D4MgEiAPfnwhBCADIARCIIh8IQMgBEL/////D4MgFiALfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCFCIaIAd+fCEEIAMgBEIgiHwhAyAEQv////8PgyANIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZIAx+fCEEIAMgBEIgiHwhAyAEQv////8Pg0EANQL8AyIdIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAFfkL/////D4MhHCAEQv////8PgyAJIBx+fCEEIAMgBEIgiHwhAyADQiCIIQQgA0L/////D4MgBiABNQIYIh9+fCEDIAQgA0IgiHwhBCADQv////8PgyAKIBt+fCEDIAQgA0IgiHwhBCADQv////8PgyAOIBd+fCEDIAQgA0IgiHwhBCADQv////8PgyASIBN+fCEDIAQgA0IgiHwhBCADQv////8PgyAWIA9+fCEDIAQgA0IgiHwhBCADQv////8PgyAaIAt+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIYIh4gB358IQMgBCADQiCIfCEEIANC/////w+DIA0gHH58IQMgBCADQiCIfCEEIANC/////w+DIBEgGH58IQMgBCADQiCIfCEEIANC/////w+DIBUgFH58IQMgBCADQiCIfCEEIANC/////w+DIBkgEH58IQMgBCADQiCIfCEEIANC/////w+DIB0gDH58IQMgBCADQiCIfCEEIANC/////w+DQQA1AoAEIiEgCH58IQMgBCADQiCIfCEEIANC/////w+DIAV+Qv////8PgyEgIANC/////w+DIAkgIH58IQMgBCADQiCIfCEEIARCIIghAyAEQv////8PgyAGIAE1AhwiI358IQQgAyAEQiCIfCEDIARC/////w+DIAogH358IQQgAyAEQiCIfCEDIARC/////w+DIA4gG358IQQgAyAEQiCIfCEDIARC/////w+DIBIgF358IQQgAyAEQiCIfCEDIARC/////w+DIBYgE358IQQgAyAEQiCIfCEDIARC/////w+DIBogD358IQQgAyAEQiCIfCEDIARC/////w+DIB4gC358IQQgAyAEQiCIfCEDIARC/////w+DIAA1AhwiIiAHfnwhBCADIARCIIh8IQMgBEL/////D4MgDSAgfnwhBCADIARCIIh8IQMgBEL/////D4MgESAcfnwhBCADIARCIIh8IQMgBEL/////D4MgFSAYfnwhBCADIARCIIh8IQMgBEL/////D4MgGSAUfnwhBCADIARCIIh8IQMgBEL/////D4MgHSAQfnwhBCADIARCIIh8IQMgBEL/////D4MgISAMfnwhBCADIARCIIh8IQMgBEL/////D4NBADUChAQiJSAIfnwhBCADIARCIIh8IQMgBEL/////D4MgBX5C/////w+DISQgBEL/////D4MgCSAkfnwhBCADIARCIIh8IQMgA0IgiCEEIANC/////w+DIAogI358IQMgBCADQiCIfCEEIANC/////w+DIA4gH358IQMgBCADQiCIfCEEIANC/////w+DIBIgG358IQMgBCADQiCIfCEEIANC/////w+DIBYgF358IQMgBCADQiCIfCEEIANC/////w+DIBogE358IQMgBCADQiCIfCEEIANC/////w+DIB4gD358IQMgBCADQiCIfCEEIANC/////w+DICIgC358IQMgBCADQiCIfCEEIANC/////w+DIA0gJH58IQMgBCADQiCIfCEEIANC/////w+DIBEgIH58IQMgBCADQiCIfCEEIANC/////w+DIBUgHH58IQMgBCADQiCIfCEEIANC/////w+DIBkgGH58IQMgBCADQiCIfCEEIANC/////w+DIB0gFH58IQMgBCADQiCIfCEEIANC/////w+DICEgEH58IQMgBCADQiCIfCEEIANC/////w+DICUgDH58IQMgBCADQiCIfCEEIAIgAz4CACAEQiCIIQMgBEL/////D4MgDiAjfnwhBCADIARCIIh8IQMgBEL/////D4MgEiAffnwhBCADIARCIIh8IQMgBEL/////D4MgFiAbfnwhBCADIARCIIh8IQMgBEL/////D4MgGiAXfnwhBCADIARCIIh8IQMgBEL/////D4MgHiATfnwhBCADIARCIIh8IQMgBEL/////D4MgIiAPfnwhBCADIARCIIh8IQMgBEL/////D4MgESAkfnwhBCADIARCIIh8IQMgBEL/////D4MgFSAgfnwhBCADIARCIIh8IQMgBEL/////D4MgGSAcfnwhBCADIARCIIh8IQMgBEL/////D4MgHSAYfnwhBCADIARCIIh8IQMgBEL/////D4MgISAUfnwhBCADIARCIIh8IQMgBEL/////D4MgJSAQfnwhBCADIARCIIh8IQMgAiAEPgIEIANCIIghBCADQv////8PgyASICN+fCEDIAQgA0IgiHwhBCADQv////8PgyAWIB9+fCEDIAQgA0IgiHwhBCADQv////8PgyAaIBt+fCEDIAQgA0IgiHwhBCADQv////8PgyAeIBd+fCEDIAQgA0IgiHwhBCADQv////8PgyAiIBN+fCEDIAQgA0IgiHwhBCADQv////8PgyAVICR+fCEDIAQgA0IgiHwhBCADQv////8PgyAZICB+fCEDIAQgA0IgiHwhBCADQv////8PgyAdIBx+fCEDIAQgA0IgiHwhBCADQv////8PgyAhIBh+fCEDIAQgA0IgiHwhBCADQv////8PgyAlIBR+fCEDIAQgA0IgiHwhBCACIAM+AgggBEIgiCEDIARC/////w+DIBYgI358IQQgAyAEQiCIfCEDIARC/////w+DIBogH358IQQgAyAEQiCIfCEDIARC/////w+DIB4gG358IQQgAyAEQiCIfCEDIARC/////w+DICIgF358IQQgAyAEQiCIfCEDIARC/////w+DIBkgJH58IQQgAyAEQiCIfCEDIARC/////w+DIB0gIH58IQQgAyAEQiCIfCEDIARC/////w+DICEgHH58IQQgAyAEQiCIfCEDIARC/////w+DICUgGH58IQQgAyAEQiCIfCEDIAIgBD4CDCADQiCIIQQgA0L/////D4MgGiAjfnwhAyAEIANCIIh8IQQgA0L/////D4MgHiAffnwhAyAEIANCIIh8IQQgA0L/////D4MgIiAbfnwhAyAEIANCIIh8IQQgA0L/////D4MgHSAkfnwhAyAEIANCIIh8IQQgA0L/////D4MgISAgfnwhAyAEIANCIIh8IQQgA0L/////D4MgJSAcfnwhAyAEIANCIIh8IQQgAiADPgIQIARCIIghAyAEQv////8PgyAeICN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAiIB9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAhICR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAlICB+fCEEIAMgBEIgiHwhAyACIAQ+AhQgA0IgiCEEIANC/////w+DICIgI358IQMgBCADQiCIfCEEIANC/////w+DICUgJH58IQMgBCADQiCIfCEEIAIgAz4CGCAEQiCIIQMgAiAEPgIcIAOnBEAgAkHoAyACEAcaBSACQegDEAUEQCACQegDIAIQBxoLCwu7IR0BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+QonHmaQOIQZCACECQgAhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAANQIAIgcgB358IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEIIAJC/////w+DQQA1AugDIgkgCH58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AgQiCn58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8Pg0EANQLsAyIMIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhCyACQv////8PgyAJIAt+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIIIg1+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAKIAp+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCALfnwhAiADIAJCIIh8IQMgAkL/////D4NBADUC8AMiDyAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIQ4gAkL/////D4MgCSAOfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCDCIQfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiANfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgDn58IQIgAyACQiCIfCEDIAJC/////w+DIA8gC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1AvQDIhIgCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyERIAJC/////w+DIAkgEX58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AhAiE358IQIgAyACQiCIfCEDIAJC/////w+DIAogEH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIA0gDX58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8PgyAMIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAPIA5+fCECIAMgAkIgiHwhAyACQv////8PgyASIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0EANQL4AyIVIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhFCACQv////8PgyAJIBR+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIUIhZ+fCECIAMgAkIgiHwhAyACQv////8PgyAKIBN+fCECIAMgAkIgiHwhAyACQv////8PgyANIBB+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgDyARfnwhAiADIAJCIIh8IQMgAkL/////D4MgEiAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSALfnwhAiADIAJCIIh8IQMgAkL/////D4NBADUC/AMiGCAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIRcgAkL/////D4MgCSAXfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCGCIZfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAWfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSATfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgECAQfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgF358IQIgAyACQiCIfCEDIAJC/////w+DIA8gFH58IQIgAyACQiCIfCEDIAJC/////w+DIBIgEX58IQIgAyACQiCIfCEDIAJC/////w+DIBUgDn58IQIgAyACQiCIfCEDIAJC/////w+DIBggC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1AoAEIhsgCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEaIAJC/////w+DIAkgGn58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AhwiHH58IQIgAyACQiCIfCEDIAJC/////w+DIAogGX58IQIgAyACQiCIfCEDIAJC/////w+DIA0gFn58IQIgAyACQiCIfCEDIAJC/////w+DIBAgE358IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8PgyAMIBp+fCECIAMgAkIgiHwhAyACQv////8PgyAPIBd+fCECIAMgAkIgiHwhAyACQv////8PgyASIBR+fCECIAMgAkIgiHwhAyACQv////8PgyAVIBF+fCECIAMgAkIgiHwhAyACQv////8PgyAYIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAbIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0EANQKEBCIeIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhHSACQv////8PgyAJIB1+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgCiAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSAZfnwhAiADIAJCIIh8IQMgAkL/////D4MgECAWfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgEyATfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgHX58IQIgAyACQiCIfCEDIAJC/////w+DIA8gGn58IQIgAyACQiCIfCEDIAJC/////w+DIBIgF358IQIgAyACQiCIfCEDIAJC/////w+DIBUgFH58IQIgAyACQiCIfCEDIAJC/////w+DIBggEX58IQIgAyACQiCIfCEDIAJC/////w+DIBsgDn58IQIgAyACQiCIfCEDIAJC/////w+DIB4gC358IQIgAyACQiCIfCEDIAEgAj4CACADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgDSAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgECAZfnwhAiADIAJCIIh8IQMgAkL/////D4MgEyAWfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIA8gHX58IQIgAyACQiCIfCEDIAJC/////w+DIBIgGn58IQIgAyACQiCIfCEDIAJC/////w+DIBUgF358IQIgAyACQiCIfCEDIAJC/////w+DIBggFH58IQIgAyACQiCIfCEDIAJC/////w+DIBsgEX58IQIgAyACQiCIfCEDIAJC/////w+DIB4gDn58IQIgAyACQiCIfCEDIAEgAj4CBCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgECAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgEyAZfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgFiAWfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIBIgHX58IQIgAyACQiCIfCEDIAJC/////w+DIBUgGn58IQIgAyACQiCIfCEDIAJC/////w+DIBggF358IQIgAyACQiCIfCEDIAJC/////w+DIBsgFH58IQIgAyACQiCIfCEDIAJC/////w+DIB4gEX58IQIgAyACQiCIfCEDIAEgAj4CCCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgEyAcfnwhAiADIAJCIIh8IQMgAkL/////D4MgFiAZfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIBUgHX58IQIgAyACQiCIfCEDIAJC/////w+DIBggGn58IQIgAyACQiCIfCEDIAJC/////w+DIBsgF358IQIgAyACQiCIfCEDIAJC/////w+DIB4gFH58IQIgAyACQiCIfCEDIAEgAj4CDCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgFiAcfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgGSAZfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIBggHX58IQIgAyACQiCIfCEDIAJC/////w+DIBsgGn58IQIgAyACQiCIfCEDIAJC/////w+DIB4gF358IQIgAyACQiCIfCEDIAEgAj4CECADIQQgBEIg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AhAgA0IgiHxB6A01AgggBH58IQMgACADPgIQIAA1AhQgA0IgiHxB6A01AgwgBH58IQMgACADPgIUIAA1AhggA0IgiHxB6A01AhAgBH58IQMgACADPgIYIAA1AhwgA0IgiHxB6A01AhQgBH58IQMgACADPgIcIAA1AiAgA0IgiHxB6A01AhggBH58IQMgACADPgIgIAA1AiQgA0IgiHxB6A01AhwgBH58IQMgACADPgIkQYgQIANCIIg+AghCACEDIAA1AgwgAn5C/////w+DIQQgADUCDCADQiCIfEHoDTUCACAEfnwhAyAAIAM+AgwgADUCECADQiCIfEHoDTUCBCAEfnwhAyAAIAM+AhAgADUCFCADQiCIfEHoDTUCCCAEfnwhAyAAIAM+AhQgADUCGCADQiCIfEHoDTUCDCAEfnwhAyAAIAM+AhggADUCHCADQiCIfEHoDTUCECAEfnwhAyAAIAM+AhwgADUCICADQiCIfEHoDTUCFCAEfnwhAyAAIAM+AiAgADUCJCADQiCIfEHoDTUCGCAEfnwhAyAAIAM+AiQgADUCKCADQiCIfEHoDTUCHCAEfnwhAyAAIAM+AihBiBAgA0IgiD4CDEIAIQMgADUCECACfkL/////D4MhBCAANQIQIANCIIh8QegNNQIAIAR+fCEDIAAgAz4CECAANQIUIANCIIh8QegNNQIEIAR+fCEDIAAgAz4CFCAANQIYIANCIIh8QegNNQIIIAR+fCEDIAAgAz4CGCAANQIcIANCIIh8QegNNQIMIAR+fCEDIAAgAz4CHCAANQIgIANCIIh8QegNNQIQIAR+fCEDIAAgAz4CICAANQIkIANCIIh8QegNNQIUIAR+fCEDIAAgAz4CJCAANQIoIANCIIh8QegNNQIYIAR+fCEDIAAgAz4CKCAANQIsIANCIIh8QegNNQIcIAR+fCEDIAAgAz4CLEGIECADQiCIPgIQQgAhAyAANQIUIAJ+Qv////8PgyEEIAA1AhQgA0IgiHxB6A01AgAgBH58IQMgACADPgIUIAA1AhggA0IgiHxB6A01AgQgBH58IQMgACADPgIYIAA1AhwgA0IgiHxB6A01AgggBH58IQMgACADPgIcIAA1AiAgA0IgiHxB6A01AgwgBH58IQMgACADPgIgIAA1AiQgA0IgiHxB6A01AhAgBH58IQMgACADPgIkIAA1AiggA0IgiHxB6A01AhQgBH58IQMgACADPgIoIAA1AiwgA0IgiHxB6A01AhggBH58IQMgACADPgIsIAA1AjAgA0IgiHxB6A01AhwgBH58IQMgACADPgIwQYgQIANCIIg+AhRCACEDIAA1AhggAn5C/////w+DIQQgADUCGCADQiCIfEHoDTUCACAEfnwhAyAAIAM+AhggADUCHCADQiCIfEHoDTUCBCAEfnwhAyAAIAM+AhwgADUCICADQiCIfEHoDTUCCCAEfnwhAyAAIAM+AiAgADUCJCADQiCIfEHoDTUCDCAEfnwhAyAAIAM+AiQgADUCKCADQiCIfEHoDTUCECAEfnwhAyAAIAM+AiggADUCLCADQiCIfEHoDTUCFCAEfnwhAyAAIAM+AiwgADUCMCADQiCIfEHoDTUCGCAEfnwhAyAAIAM+AjAgADUCNCADQiCIfEHoDTUCHCAEfnwhAyAAIAM+AjRBiBAgA0IgiD4CGEIAIQMgADUCHCACfkL/////D4MhBCAANQIcIANCIIh8QegNNQIAIAR+fCEDIAAgAz4CHCAANQIgIANCIIh8QegNNQIEIAR+fCEDIAAgAz4CICAANQIkIANCIIh8QegNNQIIIAR+fCEDIAAgAz4CJCAANQIoIANCIIh8QegNNQIMIAR+fCEDIAAgAz4CKCAANQIsIANCIIh8QegNNQIQIAR+fCEDIAAgAz4CLCAANQIwIANCIIh8QegNNQIUIAR+fCEDIAAgAz4CMCAANQI0IANCIIh8QegNNQIYIAR+fCEDIAAgAz4CNCAANQI4IANCIIh8QegNNQIcIAR+fCEDIAAgAz4COEGIECADQiCIPgIcQYgQIABBIGogARAqC74fIwF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX5C/////w4hBSADQv////8PgyAANQIAIgYgATUCACIHfnwhAyAEIANCIIh8IQQgA0L/////D4MgBX5C/////w+DIQggA0L/////D4NBADUC6A0iCSAIfnwhAyAEIANCIIh8IQQgBEIgiCEDIARC/////w+DIAYgATUCBCILfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCBCIKIAd+fCEEIAMgBEIgiHwhAyAEQv////8Pg0EANQLsDSINIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAFfkL/////D4MhDCAEQv////8PgyAJIAx+fCEEIAMgBEIgiHwhAyADQiCIIQQgA0L/////D4MgBiABNQIIIg9+fCEDIAQgA0IgiHwhBCADQv////8PgyAKIAt+fCEDIAQgA0IgiHwhBCADQv////8PgyAANQIIIg4gB358IQMgBCADQiCIfCEEIANC/////w+DIA0gDH58IQMgBCADQiCIfCEEIANC/////w+DQQA1AvANIhEgCH58IQMgBCADQiCIfCEEIANC/////w+DIAV+Qv////8PgyEQIANC/////w+DIAkgEH58IQMgBCADQiCIfCEEIARCIIghAyAEQv////8PgyAGIAE1AgwiE358IQQgAyAEQiCIfCEDIARC/////w+DIAogD358IQQgAyAEQiCIfCEDIARC/////w+DIA4gC358IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgwiEiAHfnwhBCADIARCIIh8IQMgBEL/////D4MgDSAQfnwhBCADIARCIIh8IQMgBEL/////D4MgESAMfnwhBCADIARCIIh8IQMgBEL/////D4NBADUC9A0iFSAIfnwhBCADIARCIIh8IQMgBEL/////D4MgBX5C/////w+DIRQgBEL/////D4MgCSAUfnwhBCADIARCIIh8IQMgA0IgiCEEIANC/////w+DIAYgATUCECIXfnwhAyAEIANCIIh8IQQgA0L/////D4MgCiATfnwhAyAEIANCIIh8IQQgA0L/////D4MgDiAPfnwhAyAEIANCIIh8IQQgA0L/////D4MgEiALfnwhAyAEIANCIIh8IQQgA0L/////D4MgADUCECIWIAd+fCEDIAQgA0IgiHwhBCADQv////8PgyANIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyARIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyAVIAx+fCEDIAQgA0IgiHwhBCADQv////8Pg0EANQL4DSIZIAh+fCEDIAQgA0IgiHwhBCADQv////8PgyAFfkL/////D4MhGCADQv////8PgyAJIBh+fCEDIAQgA0IgiHwhBCAEQiCIIQMgBEL/////D4MgBiABNQIUIht+fCEEIAMgBEIgiHwhAyAEQv////8PgyAKIBd+fCEEIAMgBEIgiHwhAyAEQv////8PgyAOIBN+fCEEIAMgBEIgiHwhAyAEQv////8PgyASIA9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAWIAt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAANQIUIhogB358IQQgAyAEQiCIfCEDIARC/////w+DIA0gGH58IQQgAyAEQiCIfCEDIARC/////w+DIBEgFH58IQQgAyAEQiCIfCEDIARC/////w+DIBUgEH58IQQgAyAEQiCIfCEDIARC/////w+DIBkgDH58IQQgAyAEQiCIfCEDIARC/////w+DQQA1AvwNIh0gCH58IQQgAyAEQiCIfCEDIARC/////w+DIAV+Qv////8PgyEcIARC/////w+DIAkgHH58IQQgAyAEQiCIfCEDIANCIIghBCADQv////8PgyAGIAE1AhgiH358IQMgBCADQiCIfCEEIANC/////w+DIAogG358IQMgBCADQiCIfCEEIANC/////w+DIA4gF358IQMgBCADQiCIfCEEIANC/////w+DIBIgE358IQMgBCADQiCIfCEEIANC/////w+DIBYgD358IQMgBCADQiCIfCEEIANC/////w+DIBogC358IQMgBCADQiCIfCEEIANC/////w+DIAA1AhgiHiAHfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAcfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAYfnwhAyAEIANCIIh8IQQgA0L/////D4MgFSAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgGSAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgHSAMfnwhAyAEIANCIIh8IQQgA0L/////D4NBADUCgA4iISAIfnwhAyAEIANCIIh8IQQgA0L/////D4MgBX5C/////w+DISAgA0L/////D4MgCSAgfnwhAyAEIANCIIh8IQQgBEIgiCEDIARC/////w+DIAYgATUCHCIjfnwhBCADIARCIIh8IQMgBEL/////D4MgCiAffnwhBCADIARCIIh8IQMgBEL/////D4MgDiAbfnwhBCADIARCIIh8IQMgBEL/////D4MgEiAXfnwhBCADIARCIIh8IQMgBEL/////D4MgFiATfnwhBCADIARCIIh8IQMgBEL/////D4MgGiAPfnwhBCADIARCIIh8IQMgBEL/////D4MgHiALfnwhBCADIARCIIh8IQMgBEL/////D4MgADUCHCIiIAd+fCEEIAMgBEIgiHwhAyAEQv////8PgyANICB+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIBx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAdIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAhIAx+fCEEIAMgBEIgiHwhAyAEQv////8Pg0EANQKEDiIlIAh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAFfkL/////D4MhJCAEQv////8PgyAJICR+fCEEIAMgBEIgiHwhAyADQiCIIQQgA0L/////D4MgCiAjfnwhAyAEIANCIIh8IQQgA0L/////D4MgDiAffnwhAyAEIANCIIh8IQQgA0L/////D4MgEiAbfnwhAyAEIANCIIh8IQQgA0L/////D4MgFiAXfnwhAyAEIANCIIh8IQQgA0L/////D4MgGiATfnwhAyAEIANCIIh8IQQgA0L/////D4MgHiAPfnwhAyAEIANCIIh8IQQgA0L/////D4MgIiALfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSAkfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAgfnwhAyAEIANCIIh8IQQgA0L/////D4MgFSAcfnwhAyAEIANCIIh8IQQgA0L/////D4MgGSAYfnwhAyAEIANCIIh8IQQgA0L/////D4MgHSAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgISAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgJSAMfnwhAyAEIANCIIh8IQQgAiADPgIAIARCIIghAyAEQv////8PgyAOICN+fCEEIAMgBEIgiHwhAyAEQv////8PgyASIB9+fCEEIAMgBEIgiHwhAyAEQv////8PgyAWIBt+fCEEIAMgBEIgiHwhAyAEQv////8PgyAaIBd+fCEEIAMgBEIgiHwhAyAEQv////8PgyAeIBN+fCEEIAMgBEIgiHwhAyAEQv////8PgyAiIA9+fCEEIAMgBEIgiHwhAyAEQv////8PgyARICR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAVICB+fCEEIAMgBEIgiHwhAyAEQv////8PgyAZIBx+fCEEIAMgBEIgiHwhAyAEQv////8PgyAdIBh+fCEEIAMgBEIgiHwhAyAEQv////8PgyAhIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAlIBB+fCEEIAMgBEIgiHwhAyACIAQ+AgQgA0IgiCEEIANC/////w+DIBIgI358IQMgBCADQiCIfCEEIANC/////w+DIBYgH358IQMgBCADQiCIfCEEIANC/////w+DIBogG358IQMgBCADQiCIfCEEIANC/////w+DIB4gF358IQMgBCADQiCIfCEEIANC/////w+DICIgE358IQMgBCADQiCIfCEEIANC/////w+DIBUgJH58IQMgBCADQiCIfCEEIANC/////w+DIBkgIH58IQMgBCADQiCIfCEEIANC/////w+DIB0gHH58IQMgBCADQiCIfCEEIANC/////w+DICEgGH58IQMgBCADQiCIfCEEIANC/////w+DICUgFH58IQMgBCADQiCIfCEEIAIgAz4CCCAEQiCIIQMgBEL/////D4MgFiAjfnwhBCADIARCIIh8IQMgBEL/////D4MgGiAffnwhBCADIARCIIh8IQMgBEL/////D4MgHiAbfnwhBCADIARCIIh8IQMgBEL/////D4MgIiAXfnwhBCADIARCIIh8IQMgBEL/////D4MgGSAkfnwhBCADIARCIIh8IQMgBEL/////D4MgHSAgfnwhBCADIARCIIh8IQMgBEL/////D4MgISAcfnwhBCADIARCIIh8IQMgBEL/////D4MgJSAYfnwhBCADIARCIIh8IQMgAiAEPgIMIANCIIghBCADQv////8PgyAaICN+fCEDIAQgA0IgiHwhBCADQv////8PgyAeIB9+fCEDIAQgA0IgiHwhBCADQv////8PgyAiIBt+fCEDIAQgA0IgiHwhBCADQv////8PgyAdICR+fCEDIAQgA0IgiHwhBCADQv////8PgyAhICB+fCEDIAQgA0IgiHwhBCADQv////8PgyAlIBx+fCEDIAQgA0IgiHwhBCACIAM+AhAgBEIgiCEDIARC/////w+DIB4gI358IQQgAyAEQiCIfCEDIARC/////w+DICIgH358IQQgAyAEQiCIfCEDIARC/////w+DICEgJH58IQQgAyAEQiCIfCEDIARC/////w+DICUgIH58IQQgAyAEQiCIfCEDIAIgBD4CFCADQiCIIQQgA0L/////D4MgIiAjfnwhAyAEIANCIIh8IQQgA0L/////D4MgJSAkfnwhAyAEIANCIIh8IQQgAiADPgIYIARCIIghAyACIAQ+AhwgA6cEQCACQegNIAIQBxoFIAJB6A0QBQRAIAJB6A0gAhAHGgsLC7shHQF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX5C/////w4hBkIAIQJCACEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAA1AgAiByAHfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIQggAkL/////D4NBADUC6A0iCSAIfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCBCIKfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DQQA1AuwNIgwgCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyELIAJC/////w+DIAkgC358IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AggiDX58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAogCn58IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8PgyAMIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0EANQLwDSIPIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhDiACQv////8PgyAJIA5+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIMIhB+fCECIAMgAkIgiHwhAyACQv////8PgyAKIA1+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgDyALfnwhAiADIAJCIIh8IQMgAkL/////D4NBADUC9A0iEiAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIREgAkL/////D4MgCSARfnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCECITfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAQfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgDSANfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgEX58IQIgAyACQiCIfCEDIAJC/////w+DIA8gDn58IQIgAyACQiCIfCEDIAJC/////w+DIBIgC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1AvgNIhUgCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEUIAJC/////w+DIAkgFH58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIAA1AhQiFn58IQIgAyACQiCIfCEDIAJC/////w+DIAogE358IQIgAyACQiCIfCEDIAJC/////w+DIA0gEH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyACQv////8PgyAMIBR+fCECIAMgAkIgiHwhAyACQv////8PgyAPIBF+fCECIAMgAkIgiHwhAyACQv////8PgyASIA5+fCECIAMgAkIgiHwhAyACQv////8PgyAVIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0EANQL8DSIYIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAGfkL/////D4MhFyACQv////8PgyAJIBd+fCECIAMgAkIgiHwhAyADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgByAANQIYIhl+fCECIAMgAkIgiHwhAyACQv////8PgyAKIBZ+fCECIAMgAkIgiHwhAyACQv////8PgyANIBN+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAQIBB+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgDyAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgEiARfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgGCALfnwhAiADIAJCIIh8IQMgAkL/////D4NBADUCgA4iGyAIfnwhAiADIAJCIIh8IQMgAkL/////D4MgBn5C/////w+DIRogAkL/////D4MgCSAafnwhAiADIAJCIIh8IQMgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAcgADUCHCIcfnwhAiADIAJCIIh8IQMgAkL/////D4MgCiAZfnwhAiADIAJCIIh8IQMgAkL/////D4MgDSAWfnwhAiADIAJCIIh8IQMgAkL/////D4MgECATfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAJC/////w+DIAwgGn58IQIgAyACQiCIfCEDIAJC/////w+DIA8gF358IQIgAyACQiCIfCEDIAJC/////w+DIBIgFH58IQIgAyACQiCIfCEDIAJC/////w+DIBUgEX58IQIgAyACQiCIfCEDIAJC/////w+DIBggDn58IQIgAyACQiCIfCEDIAJC/////w+DIBsgC358IQIgAyACQiCIfCEDIAJC/////w+DQQA1AoQOIh4gCH58IQIgAyACQiCIfCEDIAJC/////w+DIAZ+Qv////8PgyEdIAJC/////w+DIAkgHX58IQIgAyACQiCIfCEDIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAKIBx+fCECIAMgAkIgiHwhAyACQv////8PgyANIBl+fCECIAMgAkIgiHwhAyACQv////8PgyAQIBZ+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyATIBN+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDCAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgDyAafnwhAiADIAJCIIh8IQMgAkL/////D4MgEiAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgGCARfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAOfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiALfnwhAiADIAJCIIh8IQMgASACPgIAIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyANIBx+fCECIAMgAkIgiHwhAyACQv////8PgyAQIBl+fCECIAMgAkIgiHwhAyACQv////8PgyATIBZ+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgDyAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgEiAafnwhAiADIAJCIIh8IQMgAkL/////D4MgFSAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgGCAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyARfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAOfnwhAiADIAJCIIh8IQMgASACPgIEIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAQIBx+fCECIAMgAkIgiHwhAyACQv////8PgyATIBl+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAWIBZ+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgEiAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgFSAafnwhAiADIAJCIIh8IQMgAkL/////D4MgGCAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAUfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiARfnwhAiADIAJCIIh8IQMgASACPgIIIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyATIBx+fCECIAMgAkIgiHwhAyACQv////8PgyAWIBl+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgFSAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgGCAafnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAXfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAUfnwhAiADIAJCIIh8IQMgASACPgIMIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAWIBx+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAZIBl+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgGCAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgGyAafnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAXfnwhAiADIAJCIIh8IQMgASACPgIQIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAZIBx+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgGyAdfnwhAiADIAJCIIh8IQMgAkL/////D4MgHiAafnwhAiADIAJCIIh8IQMgASACPgIUIAMhBCAEQiCIIQVCACECQgAhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAcIBx+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgAkL/////D4MgHiAdfnwhAiADIAJCIIh8IQMgASACPgIYIAMhBCAEQiCIIQUgASAEPgIcIAWnBEAgAUHoDSABEAcaBSABQegNEAUEQCABQegNIAEQBxoLCwsKACAAIAAgARAuCwsAIABBiA4gARAu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IAVByNoAIAcQjwELIAYgAWshBiAHIARrIQcgBUHAAGshBSAIQQFrIQgMAAsLQQAgBTYCAAvOAgIBfwF/IAJFBEAgAxCNAQ8LIABBiNsAEI4BIAMQjQEgAiEEAkADQCAEQQFrIQQgASAEai0AACEFIAMgAxCRASAFQYABTwRAIAVBgAFrIQUgA0GI2wAgAxCPAQsgAyADEJEBIAVBwABPBEAgBUHAAGshBSADQYjbACADEI8BCyADIAMQkQEgBUEgTwRAIAVBIGshBSADQYjbACADEI8BCyADIAMQkQEgBUEQTwRAIAVBEGshBSADQYjbACADEI8BCyADIAMQkQEgBUEITwRAIAVBCGshBSADQYjbACADEI8BCyADIAMQkQEgBUEETwRAIAVBBGshBSADQYjbACADEI8BCyADIAMQkQEgBUECTwRAIAVBAmshBSADQYjbACADEI8BCyADIAMQkQEgBUEBTwRAIAVBAWshBSADQYjbACADEI8BCyAERQ0BDAALCwvNAQBByN0AEI0BQcjdAEHI3QAQlAEgAEHI2wBBIEGI3AAQngFBiNwAQcjcABCRASAAQcjcAEHI3AAQjwFByNwAQYjdABCVAUGI3QBByNwAQYjdABCPAUGI3QBByN0AEJgBBEAAC0GI3AAgAEGI3gAQjwFByNwAQcjdABCYAQRAQcjdABABQejdABAcQcjdAEGI3gAgARCPAQVByN4AEI0BQcjeAEHI3ABByN4AEJIBQcjeAEHo2wBBIEHI3gAQngFByN4AQYjeACABEI8BCwtpAEHo4AAQjQFB6OAAQejgABCUASAAQYjfAEEgQajfABCeAUGo3wBB6N8AEJEBIABB6N8AQejfABCPAUHo3wBBqOAAEJUBQajgAEHo3wBBqOAAEI8BQajgAEHo4AAQmAEEQEEADwtBAQ8LEQAgABCKASAAQcAAahCKAXELCwAgAEGAAWoQigELEAAgABCMASAAQcAAahCMAQsZACAAEIwBIABBwABqEI0BIABBgAFqEIwBC6IBACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKCABIAApAzA3AzAgASAAKQM4NwM4IAEgACkDQDcDQCABIAApA0g3A0ggASAAKQNQNwNQIAEgACkDWDcDWCABIAApA2A3A2AgASAAKQNoNwNoIAEgACkDcDcDcCABIAApA3g3A3gLggIAIAEgACkDADcDACABIAApAwg3AwggASAAKQMQNwMQIAEgACkDGDcDGCABIAApAyA3AyAgASAAKQMoNwMoIAEgACkDMDcDMCABIAApAzg3AzggASAAKQNANwNAIAEgACkDSDcDSCABIAApA1A3A1AgASAAKQNYNwNYIAEgACkDYDcDYCABIAApA2g3A2ggASAAKQNwNwNwIAEgACkDeDcDeCABIAApA4ABNwOAASABIAApA4gBNwOIASABIAApA5ABNwOQASABIAApA5gBNwOYASABIAApA6ABNwOgASABIAApA6gBNwOoASABIAApA7ABNwOwASABIAApA7gBNwO4AQsvACAAEKEBBEAgARCkAQUgAUGAAWoQjQEgAEHAAGogAUHAAGoQjgEgACABEI4BCwscAQF/IAAgARCYASAAQcAAaiABQcAAahCYAXEPC4sBAQF/IABBgAFqIQIgABCiAQRAIAEQoQEPCyABEKEBBEBBAA8LIAIQiwEEQCAAIAEQqAEPCyACQejhABCRASABQejhAEGo4gAQjwEgAkHo4QBB6OIAEI8BIAFBwABqQejiAEGo4wAQjwEgAEGo4gAQmAEEQCAAQcAAakGo4wAQmAEEQEEBDwsLQQAPC9kBAgF/AX8gAEGAAWohAiABQYABaiEDIAAQogEEQCABEKIBDwsgARCiAQRAQQAPCyACEIsBBEAgASAAEKkBDwsgAxCLAQRAIAAgARCpAQ8LIAJB6OMAEJEBIANBqOQAEJEBIABBqOQAQejkABCPASABQejjAEGo5QAQjwEgAkHo4wBB6OUAEI8BIANBqOQAQajmABCPASAAQcAAakGo5gBB6OYAEI8BIAFBwABqQejlAEGo5wAQjwFB6OQAQajlABCYAQRAQejmAEGo5wAQmAEEQEEBDwsLQQAPC6wCACAAEKEBBEAgACABEKcBDwsgAEHo5wAQkQEgAEHAAGpBqOgAEJEBQajoAEHo6AAQkQEgAEGo6ABBqOkAEJIBQajpAEGo6QAQkQFBqOkAQejnAEGo6QAQkwFBqOkAQejoAEGo6QAQkwFBqOkAQajpAEGo6QAQkgFB6OcAQejnAEHo6QAQkgFB6OkAQejnAEHo6QAQkgEgAEHAAGogAEHAAGog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wABqEI4BIABBgAFqIAFBgAFqEI4BC+UCACAAIAFByP4BEI8BIABBwABqIAFBwABqQYj/ARCPASAAQYABaiABQYABakHI/wEQjwEgACAAQcAAakGIgAIQkgEgASABQcAAakHIgAIQkgEgACAAQYABakGIgQIQkgEgASABQYABakHIgQIQkgEgAEHAAGogAEGAAWpBiIICEJIBIAFBwABqIAFBgAFqQciCAhCSAUHI/gFBiP8BQYiDAhCSAUHI/gFByP8BQciDAhCSAUGI/wFByP8BQYiEAhCSAUGIggJByIICIAIQjwEgAkGIhAIgAhCTASACIAIQ9QFByP4BIAIgAhCSAUGIgAJByIACIAJBwABqEI8BIAJBwABqQYiDAiACQcAAahCTAUHI/wFByIQCEPUBIAJBwABqQciEAiACQcAAahCSAUGIgQJByIECIAJBgAFqEI8BIAJBgAFqQciDAiACQYABahCTASACQYABakGI/wEgAkGAAWoQkgELgQIAIABBiIUCEJEBIAAgAEHAAGpByIUCEI8BQciFAkHIhQJBiIYCEJIBIAAgAEHAAGpByIYCEJMBQciGAiAAQYABakHIhgIQkgFByIYCQciGAhCRASAAQcAAaiAAQYABakGIhwIQjwFBiIcCQYiHAkHIhwIQkgEgAEGAAWpBiIgCEJEBQciHAiABEPUBQYiFAiABIAEQkgFBiIgCIAFBwABqEPUBQYiGAiABQcAAaiABQcAAahCSAUGIhQJBiIgCIAFBgAFqEJIBQciHAiABQYABaiABQYABahCTAUHIhgIgAUGAAWogAUGAAWoQkgFBiIYCIAFBgAFqIAFBgAFqEJIBCzUAIAAgASACEJIBIABBwABqIAFBwABqIAJBwABqEJIBIABBgAFqIAFBgAFqIAJBgAFqEJIBCzUAIAAgASACEJMBIABBwABqIAFBwABqIAJBwABqEJMBIABBgAFqIAFBgAFqIAJBgAFqEJMBCycAIAAgARCUASAAQcAAaiABQcAAahCUASAAQYABaiABQYABahCUAQswAQF/IABBgAFqEJsBIQEgAQRAIAEPCyAAQcAAahCbASEBIAEEQCABDwsgABCbAQ8LJwAgACABEJYBIABBwABqIAFBwABqEJYBIABBgAFqIAFBgAFqEJYBCycAIAAgARCXASAAQcAAaiABQcAAahCX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ASAAQcACakGQiQQgAUHAAmoQjwELigIAIAAgARAAIABBIGogAUEgahASIAFB0IkEIAEQjwEgAEHAAGogAUHAAGoQACAAQeAAaiABQeAAahASIAFBwABqQZCKBCABQcAAahCPASAAQYABaiABQYABahAAIABBoAFqIAFBoAFqEBIgAUGAAWpB0IoEIAFBgAFqEI8BIABBwAFqIAFBwAFqEAAgAEHgAWogAUHgAWoQEiABQcABakGQiwQgAUHAAWoQjwEgAEGAAmogAUGAAmoQACAAQaACaiABQaACahASIAFBgAJqQdCLBCABQYACahCPASAAQcACaiABQcACahAAIABB4AJqIAFB4AJqEBIgAUHAAmpBkIwEIAFBwAJqEI8BC2wAIABB0IwEIAEQjwEgAEHAAGpBkI0EIAFBwABqEI8BIABBgAFqQdCNBCABQYABahCPASAAQcABakGQjgQgAUHAAWoQjwEgAEGAAmpB0I4EIAFBgAJqEI8BIABBwAJqQZCPBCABQcACahCPAQuKAgAgACABEAAgAEEgaiABQSBqEBIgAUHQjwQgARCPASAAQcAAaiABQcAAahAAIABB4ABqIAFB4ABqEBIgAUHAAGpBkJAEIAFBwABqEI8BIABBgAFqIAFBgAFqEAAgAEGgAWogAUGgAWoQEiABQYABakHQkAQgAUGAAWoQjwEgAEHAAWogAUHAAWoQACAAQeABaiABQeABahASIAFBwAFqQZCRBCABQcABahCPASAAQYACaiABQYACahAAIABBoAJqIAFBoAJqEBIgAUGAAmpB0JEEIAFBgAJqEI8BIABBwAJqIAFBwAJqEAAgAEHgAmogAUHgAmoQEiABQcACakGQkgQgAUHAAmoQjwELbAAgAEHQkgQgARCPASAAQcAAakGQkwQgAUHAAGoQjwEgAEGAAWpB0JMEIAFBgAFqEI8BIABBwAFqQZCUBCABQcABahCPASAAQYACakHQlAQgAUGAAmoQjwEgAEHAAmpBkJUEIAFBwAJqEI8BC4oCACAAIAEQACAAQSBqIAFBIGoQEiABQdCVBCABEI8BIABBwABqIAFBwABqEAAgAEHgAGogAUHgAGoQEiABQcAAakGQlgQgAUHAAGoQjwEgAEGAAWogAUGAAWoQACAAQaABaiABQaABahASIAFBgAFqQdCWBCABQYABahCP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"; - exports.pq = 488; - exports.pr = 1768; - exports.pG1gen = 31432; - exports.pG1zero = 31528; - exports.pG1b = 3080; - exports.pG2gen = 31624; - exports.pG2zero = 31816; - exports.pG2b = 12456; - exports.pOneT = 32008; - exports.prePSize = 192; - exports.preQSize = 19776; - exports.n8q = 32; - exports.n8r = 32; - exports.q = "21888242871839275222246405745257275088696311157297823662689037894645226208583"; - exports.r = "21888242871839275222246405745257275088548364400416034343698204186575808495617"; - \ No newline at end of file +export const code = "AGFzbQEAAAABlQESYAJ/fwBgAX8AYAF/AX9gAn9/AX9gA39/fwF/YAN/f38AYAN/fn8AYAJ/fgBgBH9/f38AYAV/f39/fwBgBH9/f38Bf2AGf39/f39/AGAIf39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38Bf2AHf39/f39/fwF/YAl/f39/f39/f38Bf2ALf39/f39/f39/f38BfwIPAQNlbnYGbWVtb3J5AgAZA8ECvwIAAQIBAwMEBAUAAAYHCAUCBQUAAAUAAAAAAgIAAQUICQUFBQgICAgAAgIFBQAABQAAAAACAgABBQgJBQUFCAgICAACBQAAAgICAQEAAAADAwMAAAUFBQAABQUFAAAAAAACAgUABQAAAAAFBQUFBQoLDAkKCwwJCAgDAAgIAgAACQsLBQULAAgNCQgCAgEBAAUFAAUFAAAAAAMACAICCQgAAgICAQEAAAADAwMAAAUFBQAABQUFAAAAAAACAgUABQAAAAAFBQUFBQoLDAkKCwwJCAgFAwAICAIAAAkLCwUFCwUDAAgIAgAACQsLBQULBQUJCQkJCQACAgEBAAUABQUAAgAAAwAIAgkIAAICAQEABQUABQUAAAAAAwAIAgIJCAACBQAAAAAICAUAAAAAAAAAAAAAAAAAAAAABA4PEBEFB8UlqwIIaW50X2NvcHkAAAhpbnRfemVybwABB2ludF9vbmUAAwppbnRfaXNaZXJvAAIGaW50X2VxAAQHaW50X2d0ZQAFB2ludF9hZGQABgdpbnRfc3ViAAcHaW50X211bAAICmludF9zcXVhcmUACQ1pbnRfc3F1YXJlT2xkAAoHaW50X2RpdgANDmludF9pbnZlcnNlTW9kAA4IZjFtX2NvcHkAAAhmMW1femVybwABCmYxbV9pc1plcm8AAgZmMW1fZXEABAdmMW1fYWRkABAHZjFtX3N1YgARB2YxbV9uZWcAEg5mMW1faXNOZWdhdGl2ZQAZCWYxbV9pc09uZQAPCGYxbV9zaWduABoLZjFtX21SZWR1Y3QAEwdmMW1fbXVsABQKZjFtX3NxdWFyZQAVDWYxbV9zcXVhcmVPbGQAFhJmMW1fZnJvbU1vbnRnb21lcnkAGBBmMW1fdG9Nb250Z29tZXJ5ABcLZjFtX2ludmVyc2UAGwdmMW1fb25lABwIZjFtX2xvYWQAHQ9mMW1fdGltZXNTY2FsYXIAHgdmMW1fZXhwACYQZjFtX2JhdGNoSW52ZXJzZQAfCGYxbV9zcXJ0ACcMZjFtX2lzU3F1YXJlACgVZjFtX2JhdGNoVG9Nb250Z29tZXJ5ACAXZjFtX2JhdGNoRnJvbU1vbnRnb21lcnkAIQhmcm1fY29weQAACGZybV96ZXJvAAEKZnJtX2lzWmVybwACBmZybV9lcQAEB2ZybV9hZGQAKgdmcm1fc3ViACsHZnJtX25lZwAsDmZybV9pc05lZ2F0aXZlADMJZnJtX2lzT25lACkIZnJtX3NpZ24ANAtmcm1fbVJlZHVjdAAtB2ZybV9tdWwALgpmcm1fc3F1YXJlAC8NZnJtX3NxdWFyZU9sZAAwEmZybV9mcm9tTW9udGdvbWVyeQAyEGZybV90b01vbnRnb21lcnkAMQtmcm1faW52ZXJzZQA1B2ZybV9vbmUANghmcm1fbG9hZAA3D2ZybV90aW1lc1NjYWxhcgA4B2ZybV9leHAAQBBmcm1fYmF0Y2hJbnZlcnNlADkIZnJtX3NxcnQAQQxmcm1faXNTcXVhcmUAQhVmcm1fYmF0Y2hUb01vbnRnb21lcnkAOhdmcm1fYmF0Y2hGcm9tTW9udGdvbWVyeQA7BmZyX2FkZAAqBmZyX3N1YgArBmZyX25lZwAsBmZyX211bABDCWZyX3NxdWFyZQBECmZyX2ludmVyc2UARQ1mcl9pc05lZ2F0aXZlAEYHZnJfY29weQAAB2ZyX3plcm8AAQZmcl9vbmUANglmcl9pc1plcm8AAgVmcl9lcQAEDGcxbV9tdWx0aWV4cABxEmcxbV9tdWx0aWV4cF9jaHVuawBwEmcxbV9tdWx0aWV4cEFmZmluZQB1GGcxbV9tdWx0aWV4cEFmZmluZV9jaHVuawB0CmcxbV9pc1plcm8ASBBnMW1faXNaZXJvQWZmaW5lAEcGZzFtX2VxAFALZzFtX2VxTWl4ZWQATwxnMW1fZXFBZmZpbmUATghnMW1fY29weQBMDmcxbV9jb3B5QWZmaW5lAEsIZzFtX3plcm8ASg5nMW1femVyb0FmZmluZQBJCmcxbV9kb3VibGUAUhBnMW1fZG91YmxlQWZmaW5lAFEHZzFtX2FkZABVDGcxbV9hZGRNaXhlZABUDWcxbV9hZGRBZmZpbmUAUwdnMW1fbmVnAFcNZzFtX25lZ0FmZmluZQBWB2cxbV9zdWIAWgxnMW1fc3ViTWl4ZWQAWQ1nMW1fc3ViQWZmaW5lAFgSZzFtX2Zyb21Nb250Z29tZXJ5AFwYZzFtX2Zyb21Nb250Z29tZXJ5QWZmaW5lAFsQZzFtX3RvTW9udGdvbWVyeQBeFmcxbV90b01vbnRnb21lcnlBZmZpbmUAXQ9nMW1fdGltZXNTY2FsYXIAdhVnMW1fdGltZXNTY2FsYXJBZmZpbmUAdw1nMW1fbm9ybWFsaXplAGMKZzFtX0xFTXRvVQBlCmcxbV9MRU10b0MAZgpnMW1fVXRvTEVNAGcKZzFtX0N0b0xFTQBoD2cxbV9iYXRjaExFTXRvVQBpD2cxbV9iYXRjaExFTXRvQwBqD2cxbV9iYXRjaFV0b0xFTQBrD2cxbV9iYXRjaEN0b0xFTQBsDGcxbV90b0FmZmluZQBfDmcxbV90b0phY29iaWFuAE0RZzFtX2JhdGNoVG9BZmZpbmUAYhNnMW1fYmF0Y2hUb0phY29iaWFuAG0LZzFtX2luQ3VydmUAYRFnMW1faW5DdXJ2ZUFmZmluZQBgF2ZybV9fcmV2ZXJzZVBlcm11dGF0aW9uAHkHZnJtX2ZmdAB9CGZybV9pZmZ0AH4KZnJtX3Jhd2ZmdAB7C2ZybV9mZnRKb2luAH8OZnJtX2ZmdEpvaW5FeHQAgAERZnJtX2ZmdEpvaW5FeHRJbnYAgQEKZnJtX2ZmdE1peACCAQxmcm1fZmZ0RmluYWwAgwEdZnJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24AhAEIcG9sX3plcm8AhQEPcG9sX2NvbnN0cnVjdExDAIYBDHFhcF9idWlsZEFCQwCHAQtxYXBfam9pbkFCQwCIAQxxYXBfYmF0Y2hBZGQAiQEKZjJtX2lzWmVybwCKAQlmMm1faXNPbmUAiwEIZjJtX3plcm8AjAEHZjJtX29uZQCNAQhmMm1fY29weQCOAQdmMm1fbXVsAI8BCGYybV9tdWwxAJABCmYybV9zcXVhcmUAkQEHZjJtX2FkZACSAQdmMm1fc3ViAJMBB2YybV9uZWcAlAEIZjJtX3NpZ24AmwENZjJtX2Nvbmp1Z2F0ZQCVARJmMm1fZnJvbU1vbnRnb21lcnkAlwEQZjJtX3RvTW9udGdvbWVyeQCWAQZmMm1fZXEAmAELZjJtX2ludmVyc2UAmQEHZjJtX2V4cACeAQ9mMm1fdGltZXNTY2FsYXIAmgEQZjJtX2JhdGNoSW52ZXJzZQCdAQhmMm1fc3FydACfAQxmMm1faXNTcXVhcmUAoAEOZjJtX2lzTmVnYXRpdmUAnAEMZzJtX211bHRpZXhwAMsBEmcybV9tdWx0aWV4cF9jaHVuawDKARJnMm1fbXVsdGlleHBBZmZpbmUAzwEYZzJtX211bHRpZXhwQWZmaW5lX2NodW5rAM4BCmcybV9pc1plcm8AogEQZzJtX2lzWmVyb0FmZmluZQChAQZnMm1fZXEAqgELZzJtX2VxTWl4ZWQAqQEMZzJtX2VxQWZmaW5lAKgBCGcybV9jb3B5AKYBDmcybV9jb3B5QWZmaW5lAKUBCGcybV96ZXJvAKQBDmcybV96ZXJvQWZmaW5lAKMBCmcybV9kb3VibGUArAEQZzJtX2RvdWJsZUFmZmluZQCrAQdnMm1fYWRkAK8BDGcybV9hZGRNaXhlZACuAQ1nMm1fYWRkQWZmaW5lAK0BB2cybV9uZWcAsQENZzJtX25lZ0FmZmluZQCwAQdnMm1fc3ViALQBDGcybV9zdWJNaXhlZACzAQ1nMm1fc3ViQWZmaW5lALIBEmcybV9mcm9tTW9udGdvbWVyeQC2ARhnMm1fZnJvbU1vbnRnb21lcnlBZmZpbmUAtQEQZzJtX3RvTW9udGdvbWVyeQC4ARZnMm1fdG9Nb250Z29tZXJ5QWZmaW5lALcBD2cybV90aW1lc1NjYWxhcgDQARVnMm1fdGltZXNTY2FsYXJBZmZpbmUA0QENZzJtX25vcm1hbGl6ZQC9AQpnMm1fTEVNdG9VAL8BCmcybV9MRU10b0MAwAEKZzJtX1V0b0xFTQDBAQpnMm1fQ3RvTEVNAMIBD2cybV9iYXRjaExFTXRvVQDDAQ9nMm1fYmF0Y2hMRU10b0MAxAEPZzJtX2JhdGNoVXRvTEVNAMUBD2cybV9iYXRjaEN0b0xFTQDGAQxnMm1fdG9BZmZpbmUAuQEOZzJtX3RvSmFjb2JpYW4ApwERZzJtX2JhdGNoVG9BZmZpbmUAvAETZzJtX2JhdGNoVG9KYWNvYmlhbgDHAQtnMm1faW5DdXJ2ZQC7ARFnMm1faW5DdXJ2ZUFmZmluZQC6AQtnMW1fdGltZXNGcgDSARdnMW1fX3JldmVyc2VQZXJtdXRhdGlvbgDUAQdnMW1fZmZ0ANgBCGcxbV9pZmZ0ANkBCmcxbV9yYXdmZnQA1gELZzFtX2ZmdEpvaW4A2gEOZzFtX2ZmdEpvaW5FeHQA2wERZzFtX2ZmdEpvaW5FeHRJbnYA3AEKZzFtX2ZmdE1peADdAQxnMW1fZmZ0RmluYWwA3gEdZzFtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24A3wELZzJtX3RpbWVzRnIA4AEXZzJtX19yZXZlcnNlUGVybXV0YXRpb24A4gEHZzJtX2ZmdADmAQhnMm1faWZmdADnAQpnMm1fcmF3ZmZ0AOQBC2cybV9mZnRKb2luAOgBDmcybV9mZnRKb2luRXh0AOkBEWcybV9mZnRKb2luRXh0SW52AOoBCmcybV9mZnRNaXgA6wEMZzJtX2ZmdEZpbmFsAOwBHWcybV9wcmVwYXJlTGFncmFuZ2VFdmFsdWF0aW9uAO0BEWcxbV90aW1lc0ZyQWZmaW5lAO4BEWcybV90aW1lc0ZyQWZmaW5lAO8BEWZybV9iYXRjaEFwcGx5S2V5APABEWcxbV9iYXRjaEFwcGx5S2V5APEBFmcxbV9iYXRjaEFwcGx5S2V5TWl4ZWQA8gERZzJtX2JhdGNoQXBwbHlLZXkA8wEWZzJtX2JhdGNoQXBwbHlLZXlNaXhlZAD0AQpmNm1faXNaZXJvAPYBCWY2bV9pc09uZQD3AQhmNm1femVybwD4AQdmNm1fb25lAPkBCGY2bV9jb3B5APoBB2Y2bV9tdWwA+wEKZjZtX3NxdWFyZQD8AQdmNm1fYWRkAP0BB2Y2bV9zdWIA/gEHZjZtX25lZwD/AQhmNm1fc2lnbgCAAhJmNm1fZnJvbU1vbnRnb21lcnkAggIQZjZtX3RvTW9udGdvbWVyeQCBAgZmNm1fZXEAgwILZjZtX2ludmVyc2UAhAIHZjZtX2V4cACIAg9mNm1fdGltZXNTY2FsYXIAhQIQZjZtX2JhdGNoSW52ZXJzZQCHAg5mNm1faXNOZWdhdGl2ZQCGAgpmdG1faXNaZXJvAIoCCWZ0bV9pc09uZQCLAghmdG1femVybwCMAgdmdG1fb25lAI0CCGZ0bV9jb3B5AI4CB2Z0bV9tdWwAjwIIZnRtX211bDEAkAIKZnRtX3NxdWFyZQCRAgdmdG1fYWRkAJICB2Z0bV9zdWIAkwIHZnRtX25lZwCUAghmdG1fc2lnbgCbAg1mdG1fY29uanVnYXRlAJUCEmZ0bV9mcm9tTW9udGdvbWVyeQCXAhBmdG1fdG9Nb250Z29tZXJ5AJYCBmZ0bV9lcQCYAgtmdG1faW52ZXJzZQCZAgdmdG1fZXhwAJ4CD2Z0bV90aW1lc1NjYWxhcgCaAhBmdG1fYmF0Y2hJbnZlcnNlAJ0CCGZ0bV9zcXJ0AJ8CDGZ0bV9pc1NxdWFyZQCgAg5mdG1faXNOZWdhdGl2ZQCcAhRibjEyOF9fZnJvYmVuaXVzTWFwMACpAhRibjEyOF9fZnJvYmVuaXVzTWFwMQCqAhRibjEyOF9fZnJvYmVuaXVzTWFwMgCrAhRibjEyOF9fZnJvYmVuaXVzTWFwMwCsAhRibjEyOF9fZnJvYmVuaXVzTWFwNACtAhRibjEyOF9fZnJvYmVuaXVzTWFwNQCuAhRibjEyOF9fZnJvYmVuaXVzTWFwNgCvAhRibjEyOF9fZnJvYmVuaXVzTWFwNwCwAhRibjEyOF9fZnJvYmVuaXVzTWFwOACxAhRibjEyOF9fZnJvYmVuaXVzTWFwOQCyAhBibjEyOF9wYWlyaW5nRXExALkCEGJuMTI4X3BhaXJpbmdFcTIAugIQYm4xMjhfcGFpcmluZ0VxMwC7AhBibjEyOF9wYWlyaW5nRXE0ALwCEGJuMTI4X3BhaXJpbmdFcTUAvQINYm4xMjhfcGFpcmluZwC+Ag9ibjEyOF9wcmVwYXJlRzEAowIPYm4xMjhfcHJlcGFyZUcyAKUCEGJuMTI4X21pbGxlckxvb3AAqAIZYm4xMjhfZmluYWxFeHBvbmVudGlhdGlvbgC4AhxibjEyOF9maW5hbEV4cG9uZW50aWF0aW9uT2xkALMCD2JuMTI4X19tdWxCeTAyNACmAhJibjEyOF9fbXVsQnkwMjRPbGQApwIXYm4xMjhfX2N5Y2xvdG9taWNTcXVhcmUAtQIXYm4xMjhfX2N5Y2xvdG9taWNFeHBfdzAAtgIKgfcDvwIqACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxgLHgAgAEIANwMAIABCADcDCCAAQgA3AxAgAEIANwMYCzMAIAApAxhQBEAgACkDEFAEQCAAKQMIUARAIAApAwBQDwVBAA8LBUEADwsFQQAPC0EADwseACAAQgE3AwAgAEIANwMIIABCADcDECAAQgA3AxgLRwAgACkDGCABKQMYUQRAIAApAxAgASkDEFEEQCAAKQMIIAEpAwhRBEAgACkDACABKQMAUQ8FQQAPCwVBAA8LBUEADwtBAA8LfQAgACkDGCABKQMYVARAQQAPBSAAKQMYIAEpAxhWBEBBAQ8FIAApAxAgASkDEFQEQEEADwUgACkDECABKQMQVgRAQQEPBSAAKQMIIAEpAwhUBEBBAA8FIAApAwggASkDCFYEQEEBDwUgACkDACABKQMAWg8LCwsLCwtBAA8L1AEBAX4gADUCACABNQIAfCEDIAIgAz4CACAANQIEIAE1AgR8IANCIIh8IQMgAiADPgIEIAA1AgggATUCCHwgA0IgiHwhAyACIAM+AgggADUCDCABNQIMfCADQiCIfCEDIAIgAz4CDCAANQIQIAE1AhB8IANCIIh8IQMgAiADPgIQIAA1AhQgATUCFHwgA0IgiHwhAyACIAM+AhQgADUCGCABNQIYfCADQiCIfCEDIAIgAz4CGCAANQIcIAE1Ahx8IANCIIh8IQMgAiADPgIcIANCIIinC4wCAQF+IAA1AgAgATUCAH0hAyACIANC/////w+DPgIAIAA1AgQgATUCBH0gA0Igh3whAyACIANC/////w+DPgIEIAA1AgggATUCCH0gA0Igh3whAyACIANC/////w+DPgIIIAA1AgwgATUCDH0gA0Igh3whAyACIANC/////w+DPgIMIAA1AhAgATUCEH0gA0Igh3whAyACIANC/////w+DPgIQIAA1AhQgATUCFH0gA0Igh3whAyACIANC/////w+DPgIUIAA1AhggATUCGH0gA0Igh3whAyACIANC/////w+DPgIYIAA1AhwgATUCHH0gA0Igh3whAyACIANC/////w+DPgIcIANCIIenC48QEgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfiADQv////8PgyAANQIAIgUgATUCACIGfnwhAyAEIANCIIh8IQQgAiADPgIAIARCIIghAyAEQv////8PgyAFIAE1AgQiCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgQiByAGfnwhBCADIARCIIh8IQMgAiAEPgIEIANCIIghBCADQv////8PgyAFIAE1AggiCn58IQMgBCADQiCIfCEEIANC/////w+DIAcgCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AggiCSAGfnwhAyAEIANCIIh8IQQgAiADPgIIIARCIIghAyAEQv////8PgyAFIAE1AgwiDH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgCn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AgwiCyAGfnwhBCADIARCIIh8IQMgAiAEPgIMIANCIIghBCADQv////8PgyAFIAE1AhAiDn58IQMgBCADQiCIfCEEIANC/////w+DIAcgDH58IQMgBCADQiCIfCEEIANC/////w+DIAkgCn58IQMgBCADQiCIfCEEIANC/////w+DIAsgCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AhAiDSAGfnwhAyAEIANCIIh8IQQgAiADPgIQIARCIIghAyAEQv////8PgyAFIAE1AhQiEH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgDn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgDH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgCn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AhQiDyAGfnwhBCADIARCIIh8IQMgAiAEPgIUIANCIIghBCADQv////8PgyAFIAE1AhgiEn58IQMgBCADQiCIfCEEIANC/////w+DIAcgEH58IQMgBCADQiCIfCEEIANC/////w+DIAkgDn58IQMgBCADQiCIfCEEIANC/////w+DIAsgDH58IQMgBCADQiCIfCEEIANC/////w+DIA0gCn58IQMgBCADQiCIfCEEIANC/////w+DIA8gCH58IQMgBCADQiCIfCEEIANC/////w+DIAA1AhgiESAGfnwhAyAEIANCIIh8IQQgAiADPgIYIARCIIghAyAEQv////8PgyAFIAE1AhwiFH58IQQgAyAEQiCIfCEDIARC/////w+DIAcgEn58IQQgAyAEQiCIfCEDIARC/////w+DIAkgEH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgDn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gDH58IQQgAyAEQiCIfCEDIARC/////w+DIA8gCn58IQQgAyAEQiCIfCEDIARC/////w+DIBEgCH58IQQgAyAEQiCIfCEDIARC/////w+DIAA1AhwiEyAGfnwhBCADIARCIIh8IQMgAiAEPgIcIANCIIghBCADQv////8PgyAHIBR+fCEDIAQgA0IgiHwhBCADQv////8PgyAJIBJ+fCEDIAQgA0IgiHwhBCADQv////8PgyALIBB+fCEDIAQgA0IgiHwhBCADQv////8PgyANIA5+fCEDIAQgA0IgiHwhBCADQv////8PgyAPIAx+fCEDIAQgA0IgiHwhBCADQv////8PgyARIAp+fCEDIAQgA0IgiHwhBCADQv////8PgyATIAh+fCEDIAQgA0IgiHwhBCACIAM+AiAgBEIgiCEDIARC/////w+DIAkgFH58IQQgAyAEQiCIfCEDIARC/////w+DIAsgEn58IQQgAyAEQiCIfCEDIARC/////w+DIA0gEH58IQQgAyAEQiCIfCEDIARC/////w+DIA8gDn58IQQgAyAEQiCIfCEDIARC/////w+DIBEgDH58IQQgAyAEQiCIfCEDIARC/////w+DIBMgCn58IQQgAyAEQiCIfCEDIAIgBD4CJCADQiCIIQQgA0L/////D4MgCyAUfnwhAyAEIANCIIh8IQQgA0L/////D4MgDSASfnwhAyAEIANCIIh8IQQgA0L/////D4MgDyAQfnwhAyAEIANCIIh8IQQgA0L/////D4MgESAOfnwhAyAEIANCIIh8IQQgA0L/////D4MgEyAMfnwhAyAEIANCIIh8IQQgAiADPgIoIARCIIghAyAEQv////8PgyANIBR+fCEEIAMgBEIgiHwhAyAEQv////8PgyAPIBJ+fCEEIAMgBEIgiHwhAyAEQv////8PgyARIBB+fCEEIAMgBEIgiHwhAyAEQv////8PgyATIA5+fCEEIAMgBEIgiHwhAyACIAQ+AiwgA0IgiCEEIANC/////w+DIA8gFH58IQMgBCADQiCIfCEEIANC/////w+DIBEgEn58IQMgBCADQiCIfCEEIANC/////w+DIBMgEH58IQMgBCADQiCIfCEEIAIgAz4CMCAEQiCIIQMgBEL/////D4MgESAUfnwhBCADIARCIIh8IQMgBEL/////D4MgEyASfnwhBCADIARCIIh8IQMgAiAEPgI0IANCIIghBCADQv////8PgyATIBR+fCEDIAQgA0IgiHwhBCACIAM+AjggBEIgiCEDIAIgBD4CPAuMEgwBfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX5CACECQgAhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAANQIAIgYgBn58IQIgAyACQiCIfCEDIAEgAj4CACADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIEIgd+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIEIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AggiCH58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIAcgB358IQIgAyACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AgggAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCDCIJfnwhAiADIAJCIIh8IQMgAkL/////D4MgByAIfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CDCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIQIgp+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAl+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAIIAh+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIQIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAGIAA1AhQiC358IQIgAyACQiCIfCEDIAJC/////w+DIAcgCn58IQIgAyACQiCIfCEDIAJC/////w+DIAggCX58IQIgAyACQiCIfCEDIAJC/////w+DQgGGIQIgA0IBhiACQiCIfCEDIAJC/////w+DIARC/////w+DfCECIAMgAkIgiHwgBXwhAyABIAI+AhQgAyEEIARCIIghBUIAIQJCACEDIAJC/////w+DIAYgADUCGCIMfnwhAiADIAJCIIh8IQMgAkL/////D4MgByALfnwhAiADIAJCIIh8IQMgAkL/////D4MgCCAKfnwhAiADIAJCIIh8IQMgAkL/////D4NCAYYhAiADQgGGIAJCIIh8IQMgAkL/////D4MgCSAJfnwhAiADIAJCIIh8IQMgAkL/////D4MgBEL/////D4N8IQIgAyACQiCIfCAFfCEDIAEgAj4CGCADIQQgBEIgiCEFQgAhAkIAIQMgAkL/////D4MgBiAANQIcIg1+fCECIAMgAkIgiHwhAyACQv////8PgyAHIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAIIAt+fCECIAMgAkIgiHwhAyACQv////8PgyAJIAp+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIcIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAHIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAIIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAJIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAKIAp+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIgIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAIIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAJIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAKIAt+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIkIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAJIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAKIAx+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyALIAt+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIoIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAKIA1+fCECIAMgAkIgiHwhAyACQv////8PgyALIAx+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIsIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyALIA1+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAMIAx+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgIwIAMhBCAEQiCIIQVCACECQgAhAyACQv////8PgyAMIA1+fCECIAMgAkIgiHwhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgI0IAMhBCAEQiCIIQVCACECQgAhAyACQv////8Pg0IBhiECIANCAYYgAkIgiHwhAyACQv////8PgyANIA1+fCECIAMgAkIgiHwhAyACQv////8PgyAEQv////8Pg3whAiADIAJCIIh8IAV8IQMgASACPgI4IAMhBCAEQiCIIQUgASAEPgI8CwoAIAAgACABEAgLtgEBAX4gADUAACABfiEDIAIgAz4AACAANQAEIAF+IANCIIh8IQMgAiADPgAEIAA1AAggAX4gA0IgiHwhAyACIAM+AAggADUADCABfiADQiCIfCEDIAIgAz4ADCAANQAQIAF+IANCIIh8IQMgAiADPgAQIAA1ABQgAX4gA0IgiHwhAyACIAM+ABQgADUAGCABfiADQiCIfCEDIAIgAz4AGCAANQAcIAF+IANCIIh8IQMgAiADPgAcC04CAX4BfyAAIQMgAzUAACABfCECIAMgAj4AACACQiCIIQICQANAIAJQDQEgA0EEaiEDIAM1AAAgAnwhAiADIAI+AAAg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BkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0KJx5mkDn5C/////w+DIQQgDyAEQsf688MNfnwhBiAGQiCIIQUgECAEQpaYguEDfnwgBXwhBiAGQv////8PgyEPIAZCIIghBSARIARCjZXHwwZ+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBIgBEKR1YW8CX58IAV8IQYgBkL/////D4MhESAGQiCIIQUgEyAEQt2whYwIfnwgBXwhBiAGQv////8PgyESIAZCIIghBSAUIARCtovBwgt+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBUgBEKpwMaJDn58IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFiAEQvKckYMDfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAXIAV8IRYgATUCCCEDIA8gByADfnwhBiAGQv////8PgyEPIAZCIIghBSAQIAggA358IAV8IQYgBkL/////D4MhECAGQiCIIQUgESAJIAN+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBIgCiADfnwgBXwhBiAGQv////8PgyESIAZCIIghBSATIAsgA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFCAMIAN+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBUgDSADfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAWIA4gA358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgBSEXIA9CiceZpA5+Qv////8PgyEEIA8gBELH+vPDDX58IQYgBkIgiCEFIBAgBEKWmILhA358IAV8IQYgBkL/////D4MhDyAGQiCIIQUgESAEQo2Vx8MGfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSASIARCkdWFvAl+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBMgBELdsIWMCH58IAV8IQYgBkL/////D4MhEiAGQiCIIQUgFCAEQraLwcILfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAVIARCqcDGiQ5+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBYgBELynJGDA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFyAFfCEWIAE1AgwhAyAPIAcgA358IQYgBkL/////D4MhDyAGQiCIIQUgECAIIAN+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBEgCSADfnwgBXwhBiAGQv////8PgyERIAZCIIghBSASIAogA358IAV8IQYgBkL/////D4MhEiAGQiCIIQUgEyALIAN+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBQgDCADfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAVIA0gA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFiAOIAN+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIAUhFyAPQonHmaQOfkL/////D4MhBCAPIARCx/rzww1+fCEGIAZCIIghBSAQIARClpiC4QN+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEKNlcfDBn58IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQpHVhbwJfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARC3bCFjAh+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEK2i8HCC358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQqnAxokOfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC8pyRgwN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIQIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0KJx5mkDn5C/////w+DIQQgDyAEQsf688MNfnwhBiAGQiCIIQUgECAEQpaYguEDfnwgBXwhBiAGQv////8PgyEPIAZCIIghBSARIARCjZXHwwZ+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBIgBEKR1YW8CX58IAV8IQYgBkL/////D4MhESAGQiCIIQUgEyAEQt2whYwIfnwgBXwhBiAGQv////8PgyESIAZCIIghBSAUIARCtovBwgt+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBUgBEKpwMaJDn58IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFiAEQvKckYMDfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAXIAV8IRYgATUCFCEDIA8gByADfnwhBiAGQv////8PgyEPIAZCIIghBSAQIAggA358IAV8IQYgBkL/////D4MhECAGQiCIIQUgESAJIAN+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBIgCiADfnwgBXwhBiAGQv////8PgyESIAZCIIghBSATIAsgA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFCAMIAN+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBUgDSADfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAWIA4gA358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgBSEXIA9CiceZpA5+Qv////8PgyEEIA8gBELH+vPDDX58IQYgBkIgiCEFIBAgBEKWmILhA358IAV8IQYgBkL/////D4MhDyAGQiCIIQUgESAEQo2Vx8MGfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSASIARCkdWFvAl+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBMgBELdsIWMCH58IAV8IQYgBkL/////D4MhEiAGQiCIIQUgFCAEQraLwcILfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAVIARCqcDGiQ5+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBYgBELynJGDA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFyAFfCEWIAE1AhghAyAPIAcgA358IQYgBkL/////D4MhDyAGQiCIIQUgECAIIAN+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBEgCSADfnwgBXwhBiAGQv////8PgyERIAZCIIghBSASIAogA358IAV8IQYgBkL/////D4MhEiAGQiCIIQUgEyALIAN+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBQgDCADfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAVIA0gA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFiAOIAN+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIAUhFyAPQonHmaQOfkL/////D4MhBCAPIARCx/rzww1+fCEGIAZCIIghBSAQIARClpiC4QN+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEKNlcfDBn58IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQpHVhbwJfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARC3bCFjAh+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEK2i8HCC358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQqnAxokOfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC8pyRgwN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIcIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0KJx5mkDn5C/////w+DIQQgDyAEQsf688MNfnwhBiAGQiCIIQUgECAEQpaYguEDfnwgBXwhBiAGQv////8PgyEPIAZCIIghBSARIARCjZXHwwZ+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBIgBEKR1YW8CX58IAV8IQYgBkL/////D4MhESAGQiCIIQUgEyAEQt2whYwIfnwgBXwhBiAGQv////8PgyESIAZCIIghBSAUIARCtovBwgt+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBUgBEKpwMaJDn58IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFiAEQvKckYMDfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAXIAV8IRYgAiAPPgIAIAIgED4CBCACIBE+AgggAiASPgIMIAIgEz4CECACIBQ+AhQgAiAVPgIYIAIgFj4CHCACQegDEAUEQCACQegDIAIQBxoLC8skFgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+IAA1AgAhBiAANQIEIQcgADUCCCEIIAA1AgwhCSAANQIQIQogADUCFCELIAA1AhghDCAANQIcIQ0gDiAGIAZ+fCEEIARC/////w+DIQ4gBEIgiCEDIAcgBn4hBSAPIAVC/////w+DQgGGfCADfCEEIARC/////w+DIQ8gBEIgiCAFQiCIQgGGfCEDIAggBn4hBSAQIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRAgBEIgiCAFQiCIQgGGfCEDIAkgBn4hBSARIAVC/////w+DQgGGfCADfCEEIARC/////w+DIREgBEIgiCAFQiCIQgGGfCEDIAogBn4hBSASIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRIgBEIgiCAFQiCIQgGGfCEDIAsgBn4hBSATIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRMgBEIgiCAFQiCIQgGGfCEDIAwgBn4hBSAUIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRQgBEIgiCAFQiCIQgGGfCEDIA0gBn4hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQonHmaQOfkL/////D4MhAiAOIAJCx/rzww1+fCEEIARCIIghAyAPIAJClpiC4QN+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkKNlcfDBn58IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQpHVhbwJfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJC3bCFjAh+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkK2i8HCC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQqnAxokOfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC8pyRgwN+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgDyAHIAd+fCEEIARC/////w+DIQ8gBEIgiCEDIAggB34hBSAQIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRAgBEIgiCAFQiCIQgGGfCEDIAkgB34hBSARIAVC/////w+DQgGGfCADfCEEIARC/////w+DIREgBEIgiCAFQiCIQgGGfCEDIAogB34hBSASIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRIgBEIgiCAFQiCIQgGGfCEDIAsgB34hBSATIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRMgBEIgiCAFQiCIQgGGfCEDIAwgB34hBSAUIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRQgBEIgiCAFQiCIQgGGfCEDIA0gB34hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQonHmaQOfkL/////D4MhAiAOIAJCx/rzww1+fCEEIARCIIghAyAPIAJClpiC4QN+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkKNlcfDBn58IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQpHVhbwJfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJC3bCFjAh+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkK2i8HCC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQqnAxokOfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC8pyRgwN+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgECAIIAh+fCEEIARC/////w+DIRAgBEIgiCEDIAkgCH4hBSARIAVC/////w+DQgGGfCADfCEEIARC/////w+DIREgBEIgiCAFQiCIQgGGfCEDIAogCH4hBSASIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRIgBEIgiCAFQiCIQgGGfCEDIAsgCH4hBSATIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRMgBEIgiCAFQiCIQgGGfCEDIAwgCH4hBSAUIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRQgBEIgiCAFQiCIQgGGfCEDIA0gCH4hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQonHmaQOfkL/////D4MhAiAOIAJCx/rzww1+fCEEIARCIIghAyAPIAJClpiC4QN+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkKNlcfDBn58IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQpHVhbwJfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJC3bCFjAh+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkK2i8HCC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQqnAxokOfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC8pyRgwN+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgESAJIAl+fCEEIARC/////w+DIREgBEIgiCEDIAogCX4hBSASIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRIgBEIgiCAFQiCIQgGGfCEDIAsgCX4hBSATIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRMgBEIgiCAFQiCIQgGGfCEDIAwgCX4hBSAUIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRQgBEIgiCAFQiCIQgGGfCEDIA0gCX4hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQonHmaQOfkL/////D4MhAiAOIAJCx/rzww1+fCEEIARCIIghAyAPIAJClpiC4QN+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkKNlcfDBn58IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQpHVhbwJfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJC3bCFjAh+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkK2i8HCC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQqnAxokOfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC8pyRgwN+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgEiAKIAp+fCEEIARC/////w+DIRIgBEIgiCEDIAsgCn4hBSATIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRMgBEIgiCAFQiCIQgGGfCEDIAwgCn4hBSAUIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRQgBEIgiCAFQiCIQgGGfCEDIA0gCn4hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQonHmaQOfkL/////D4MhAiAOIAJCx/rzww1+fCEEIARCIIghAyAPIAJClpiC4QN+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkKNlcfDBn58IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQpHVhbwJfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJC3bCFjAh+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkK2i8HCC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQqnAxokOfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC8pyRgwN+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgEyALIAt+fCEEIARC/////w+DIRMgBEIgiCEDIAwgC34hBSAUIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRQgBEIgiCAFQiCIQgGGfCEDIA0gC34hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQonHmaQOfkL/////D4MhAiAOIAJCx/rzww1+fCEEIARCIIghAyAPIAJClpiC4QN+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkKNlcfDBn58IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQpHVhbwJfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJC3bCFjAh+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkK2i8HCC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQqnAxokOfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC8pyRgwN+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgFCAMIAx+fCEEIARC/////w+DIRQgBEIgiCEDIA0gDH4hBSAVIAVC/////w+DQgGGfCADfCEEIARC/////w+DIRUgBEIgiCAFQiCIQgGGfCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQonHmaQOfkL/////D4MhAiAOIAJCx/rzww1+fCEEIARCIIghAyAPIAJClpiC4QN+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkKNlcfDBn58IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQpHVhbwJfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJC3bCFjAh+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkK2i8HCC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQqnAxokOfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC8pyRgwN+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgFSANIA1+fCEEIARC/////w+DIRUgBEIgiCEDIBYgA3whBCAEQv////8PgyEWIBcgBEIgiHwhFyAOQonHmaQOfkL/////D4MhAiAOIAJCx/rzww1+fCEEIARCIIghAyAPIAJClpiC4QN+fCADfCEEIARC/////w+DIQ4gBEIgiCEDIBAgAkKNlcfDBn58IAN8IQQgBEL/////D4MhDyAEQiCIIQMgESACQpHVhbwJfnwgA3whBCAEQv////8PgyEQIARCIIghAyASIAJC3bCFjAh+fCADfCEEIARC/////w+DIREgBEIgiCEDIBMgAkK2i8HCC358IAN8IQQgBEL/////D4MhEiAEQiCIIQMgFCACQqnAxokOfnwgA3whBCAEQv////8PgyETIARCIIghAyAVIAJC8pyRgwN+fCADfCEEIARC/////w+DIRQgBEIgiCEDIBYgA3whBCAEQv////8PgyEVIBcgBEIgiHwhFkIAIRcgASAOPgIAIAEgDz4CBCABIBA+AgggASARPgIMIAEgEj4CECABIBM+AhQgASAUPgIYIAEgFT4CHCAWpwRAIAFB6AMgARAHGgUgAUHoAxAFBEAgAUHoAyABEAcaCwsLCgAgACAAIAEQFAsLACAAQYgEIAEQFAsVACAAQYgKEABBqAoQAUGICiABEBMLEQAgAEHIChAYQcgKQYgFEAULJAAgABACBEBBAA8LIABB6AoQGEHoCkGIBRAFBEBBfw8LQQEPCxcAIAAgARAYIAFB6AMgARAOIAEgARAXCwkAQagEIAAQAAvLAQQBfwF/AX8BfyACEAFBICEFIAAhAwJAA0AgBSABSw0BIAVBIEYEQEGICxAcBUGIC0GIBEGICxAUCyADQYgLQagLEBQgAkGoCyACEBAgA0EgaiEDIAVBIGohBQwACwsgAUEgcCEEIARFBEAPC0GoCxABQQAhBgJAA0AgBiAERg0BIAYgAy0AADoAqAsgA0EBaiEDIAZBAWohBgwACwsgBUEgRgRAQYgLEBwFQYgLQYgEQYgLEBQLQagLQYgLQagLEBQgAkGoCyACEBALHAAgASACQcgLEB1ByAtByAsQFyAAQcgLIAMQFAv4AQQBfwF/AX8Bf0EAKAIAIQVBACAFIAJBAWpBIGxqNgIAIAUQHCAAIQYgBUEgaiEFQQAhCAJAA0AgCCACRg0BIAYQAgRA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IIghBSAQIAggA358IAV8IQYgBkL/////D4MhECAGQiCIIQUgESAJIAN+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBIgCiADfnwgBXwhBiAGQv////8PgyESIAZCIIghBSATIAsgA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFCAMIAN+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBUgDSADfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAWIA4gA358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgBSEXIA9C/////w5+Qv////8PgyEEIA8gBEKBgICAD358IQYgBkIgiCEFIBAgBEKT64efBH58IAV8IQYgBkL/////D4MhDyAGQiCIIQUgESAEQpHh5c0HfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSASIARCyNDPwQJ+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBMgBELdsIWMCH58IAV8IQYgBkL/////D4MhEiAGQiCIIQUgFCAEQraLwcILfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAVIARCqcDGiQ5+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBYgBELynJGDA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFyAFfCEWIAE1AgQhAyAPIAcgA358IQYgBkL/////D4MhDyAGQiCIIQUgECAIIAN+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBEgCSADfnwgBXwhBiAGQv////8PgyERIAZCIIghBSASIAogA358IAV8IQYgBkL/////D4MhEiAGQiCIIQUgEyALIAN+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBQgDCADfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAVIA0gA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFiAOIAN+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIAUhFyAPQv////8OfkL/////D4MhBCAPIARCgYCAgA9+fCEGIAZCIIghBSAQIARCk+uHnwR+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEKR4eXNB358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQsjQz8ECfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARC3bCFjAh+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEK2i8HCC358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQqnAxokOfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC8pyRgwN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIIIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////Dn5C/////w+DIQQgDyAEQoGAgIAPfnwhBiAGQiCIIQUgECAEQpPrh58EfnwgBXwhBiAGQv////8PgyEPIAZCIIghBSARIARCkeHlzQd+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBIgBELI0M/BAn58IAV8IQYgBkL/////D4MhESAGQiCIIQUgEyAEQt2whYwIfnwgBXwhBiAGQv////8PgyESIAZCIIghBSAUIARCtovBwgt+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBUgBEKpwMaJDn58IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFiAEQvKckYMDfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAXIAV8IRYgATUCDCEDIA8gByADfnwhBiAGQv////8PgyEPIAZCIIghBSAQIAggA358IAV8IQYgBkL/////D4MhECAGQiCIIQUgESAJIAN+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBIgCiADfnwgBXwhBiAGQv////8PgyESIAZCIIghBSATIAsgA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFCAMIAN+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBUgDSADfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAWIA4gA358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgBSEXIA9C/////w5+Qv////8PgyEEIA8gBEKBgICAD358IQYgBkIgiCEFIBAgBEKT64efBH58IAV8IQYgBkL/////D4MhDyAGQiCIIQUgESAEQpHh5c0HfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSASIARCyNDPwQJ+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBMgBELdsIWMCH58IAV8IQYgBkL/////D4MhEiAGQiCIIQUgFCAEQraLwcILfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAVIARCqcDGiQ5+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBYgBELynJGDA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFyAFfCEWIAE1AhAhAyAPIAcgA358IQYgBkL/////D4MhDyAGQiCIIQUgECAIIAN+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBEgCSADfnwgBXwhBiAGQv////8PgyERIAZCIIghBSASIAogA358IAV8IQYgBkL/////D4MhEiAGQiCIIQUgEyALIAN+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBQgDCADfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAVIA0gA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFiAOIAN+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIAUhFyAPQv////8OfkL/////D4MhBCAPIARCgYCAgA9+fCEGIAZCIIghBSAQIARCk+uHnwR+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEKR4eXNB358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQsjQz8ECfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARC3bCFjAh+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEK2i8HCC358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQqnAxokOfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC8pyRgwN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiABNQIUIQMgDyAHIAN+fCEGIAZC/////w+DIQ8gBkIgiCEFIBAgCCADfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSARIAkgA358IAV8IQYgBkL/////D4MhESAGQiCIIQUgEiAKIAN+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBMgCyADfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAUIAwgA358IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFSANIAN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBYgDiADfnwgBXwhBiAGQv////8PgyEWIAZCIIghBSAFIRcgD0L/////Dn5C/////w+DIQQgDyAEQoGAgIAPfnwhBiAGQiCIIQUgECAEQpPrh58EfnwgBXwhBiAGQv////8PgyEPIAZCIIghBSARIARCkeHlzQd+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBIgBELI0M/BAn58IAV8IQYgBkL/////D4MhESAGQiCIIQUgEyAEQt2whYwIfnwgBXwhBiAGQv////8PgyESIAZCIIghBSAUIARCtovBwgt+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBUgBEKpwMaJDn58IAV8IQYgBkL/////D4MhFCAGQiCIIQUgFiAEQvKckYMDfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAXIAV8IRYgATUCGCEDIA8gByADfnwhBiAGQv////8PgyEPIAZCIIghBSAQIAggA358IAV8IQYgBkL/////D4MhECAGQiCIIQUgESAJIAN+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBIgCiADfnwgBXwhBiAGQv////8PgyESIAZCIIghBSATIAsgA358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFCAMIAN+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBUgDSADfnwgBXwhBiAGQv////8PgyEVIAZCIIghBSAWIA4gA358IAV8IQYgBkL/////D4MhFiAGQiCIIQUgBSEXIA9C/////w5+Qv////8PgyEEIA8gBEKBgICAD358IQYgBkIgiCEFIBAgBEKT64efBH58IAV8IQYgBkL/////D4MhDyAGQiCIIQUgESAEQpHh5c0HfnwgBXwhBiAGQv////8PgyEQIAZCIIghBSASIARCyNDPwQJ+fCAFfCEGIAZC/////w+DIREgBkIgiCEFIBMgBELdsIWMCH58IAV8IQYgBkL/////D4MhEiAGQiCIIQUgFCAEQraLwcILfnwgBXwhBiAGQv////8PgyETIAZCIIghBSAVIARCqcDGiQ5+fCAFfCEGIAZC/////w+DIRQgBkIgiCEFIBYgBELynJGDA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFyAFfCEWIAE1AhwhAyAPIAcgA358IQYgBkL/////D4MhDyAGQiCIIQUgECAIIAN+fCAFfCEGIAZC/////w+DIRAgBkIgiCEFIBEgCSADfnwgBXwhBiAGQv////8PgyERIAZCIIghBSASIAogA358IAV8IQYgBkL/////D4MhEiAGQiCIIQUgEyALIAN+fCAFfCEGIAZC/////w+DIRMgBkIgiCEFIBQgDCADfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAVIA0gA358IAV8IQYgBkL/////D4MhFSAGQiCIIQUgFiAOIAN+fCAFfCEGIAZC/////w+DIRYgBkIgiCEFIAUhFyAPQv////8OfkL/////D4MhBCAPIARCgYCAgA9+fCEGIAZCIIghBSAQIARCk+uHnwR+fCAFfCEGIAZC/////w+DIQ8gBkIgiCEFIBEgBEKR4eXNB358IAV8IQYgBkL/////D4MhECAGQiCIIQUgEiAEQsjQz8ECfnwgBXwhBiAGQv////8PgyERIAZCIIghBSATIARC3bCFjAh+fCAFfCEGIAZC/////w+DIRIgBkIgiCEFIBQgBEK2i8HCC358IAV8IQYgBkL/////D4MhEyAGQiCIIQUgFSAEQqnAxokOfnwgBXwhBiAGQv////8PgyEUIAZCIIghBSAWIARC8pyRgwN+fCAFfCEGIAZC/////w+DIRUgBkIgiCEFIBcgBXwhFiACIA8+AgAgAiAQPgIEIAIgET4CCCACIBI+AgwgAiATPgIQIAIgFD4CFCACIBU+AhggAiAWPgIcIAJB6A0QBQRAIAJB6A0gAhAHGgsLyyQWAX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4BfgF+AX4gADUCACEGIAA1AgQhByAANQIIIQggADUCDCEJIAA1AhAhCiAANQIUIQsgADUCGCEMIAA1AhwhDSAOIAYgBn58IQQgBEL/////D4MhDiAEQiCIIQMgByAGfiEFIA8gBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhDyAEQiCIIAVCIIhCAYZ8IQMgCCAGfiEFIBAgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhECAEQiCIIAVCIIhCAYZ8IQMgCSAGfiEFIBEgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhESAEQiCIIAVCIIhCAYZ8IQMgCiAGfiEFIBIgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEiAEQiCIIAVCIIhCAYZ8IQMgCyAGfiEFIBMgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEyAEQiCIIAVCIIhCAYZ8IQMgDCAGfiEFIBQgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFCAEQiCIIAVCIIhCAYZ8IQMgDSAGfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w5+Qv////8PgyECIA4gAkKBgICAD358IQQgBEIgiCEDIA8gAkKT64efBH58IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQpHh5c0HfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCyNDPwQJ+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkLdsIWMCH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQraLwcILfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCqcDGiQ5+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLynJGDA358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUgFyAEQiCIfCEWQgAhFyAPIAcgB358IQQgBEL/////D4MhDyAEQiCIIQMgCCAHfiEFIBAgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhECAEQiCIIAVCIIhCAYZ8IQMgCSAHfiEFIBEgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhESAEQiCIIAVCIIhCAYZ8IQMgCiAHfiEFIBIgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEiAEQiCIIAVCIIhCAYZ8IQMgCyAHfiEFIBMgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEyAEQiCIIAVCIIhCAYZ8IQMgDCAHfiEFIBQgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFCAEQiCIIAVCIIhCAYZ8IQMgDSAHfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w5+Qv////8PgyECIA4gAkKBgICAD358IQQgBEIgiCEDIA8gAkKT64efBH58IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQpHh5c0HfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCyNDPwQJ+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkLdsIWMCH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQraLwcILfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCqcDGiQ5+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLynJGDA358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUgFyAEQiCIfCEWQgAhFyAQIAggCH58IQQgBEL/////D4MhECAEQiCIIQMgCSAIfiEFIBEgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhESAEQiCIIAVCIIhCAYZ8IQMgCiAIfiEFIBIgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEiAEQiCIIAVCIIhCAYZ8IQMgCyAIfiEFIBMgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEyAEQiCIIAVCIIhCAYZ8IQMgDCAIfiEFIBQgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFCAEQiCIIAVCIIhCAYZ8IQMgDSAIfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w5+Qv////8PgyECIA4gAkKBgICAD358IQQgBEIgiCEDIA8gAkKT64efBH58IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQpHh5c0HfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCyNDPwQJ+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkLdsIWMCH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQraLwcILfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCqcDGiQ5+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLynJGDA358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUgFyAEQiCIfCEWQgAhFyARIAkgCX58IQQgBEL/////D4MhESAEQiCIIQMgCiAJfiEFIBIgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEiAEQiCIIAVCIIhCAYZ8IQMgCyAJfiEFIBMgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEyAEQiCIIAVCIIhCAYZ8IQMgDCAJfiEFIBQgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFCAEQiCIIAVCIIhCAYZ8IQMgDSAJfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w5+Qv////8PgyECIA4gAkKBgICAD358IQQgBEIgiCEDIA8gAkKT64efBH58IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQpHh5c0HfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCyNDPwQJ+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkLdsIWMCH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQraLwcILfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCqcDGiQ5+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLynJGDA358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUgFyAEQiCIfCEWQgAhFyASIAogCn58IQQgBEL/////D4MhEiAEQiCIIQMgCyAKfiEFIBMgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhEyAEQiCIIAVCIIhCAYZ8IQMgDCAKfiEFIBQgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFCAEQiCIIAVCIIhCAYZ8IQMgDSAKfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w5+Qv////8PgyECIA4gAkKBgICAD358IQQgBEIgiCEDIA8gAkKT64efBH58IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQpHh5c0HfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCyNDPwQJ+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkLdsIWMCH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQraLwcILfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCqcDGiQ5+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLynJGDA358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUgFyAEQiCIfCEWQgAhFyATIAsgC358IQQgBEL/////D4MhEyAEQiCIIQMgDCALfiEFIBQgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFCAEQiCIIAVCIIhCAYZ8IQMgDSALfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w5+Qv////8PgyECIA4gAkKBgICAD358IQQgBEIgiCEDIA8gAkKT64efBH58IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQpHh5c0HfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCyNDPwQJ+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkLdsIWMCH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQraLwcILfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCqcDGiQ5+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLynJGDA358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUgFyAEQiCIfCEWQgAhFyAUIAwgDH58IQQgBEL/////D4MhFCAEQiCIIQMgDSAMfiEFIBUgBUL/////D4NCAYZ8IAN8IQQgBEL/////D4MhFSAEQiCIIAVCIIhCAYZ8IQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w5+Qv////8PgyECIA4gAkKBgICAD358IQQgBEIgiCEDIA8gAkKT64efBH58IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQpHh5c0HfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCyNDPwQJ+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkLdsIWMCH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQraLwcILfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCqcDGiQ5+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLynJGDA358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUgFyAEQiCIfCEWQgAhFyAVIA0gDX58IQQgBEL/////D4MhFSAEQiCIIQMgFiADfCEEIARC/////w+DIRYgFyAEQiCIfCEXIA5C/////w5+Qv////8PgyECIA4gAkKBgICAD358IQQgBEIgiCEDIA8gAkKT64efBH58IAN8IQQgBEL/////D4MhDiAEQiCIIQMgECACQpHh5c0HfnwgA3whBCAEQv////8PgyEPIARCIIghAyARIAJCyNDPwQJ+fCADfCEEIARC/////w+DIRAgBEIgiCEDIBIgAkLdsIWMCH58IAN8IQQgBEL/////D4MhESAEQiCIIQMgEyACQraLwcILfnwgA3whBCAEQv////8PgyESIARCIIghAyAUIAJCqcDGiQ5+fCADfCEEIARC/////w+DIRMgBEIgiCEDIBUgAkLynJGDA358IAN8IQQgBEL/////D4MhFCAEQiCIIQMgFiADfCEEIARC/////w+DIRUg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IABBIGoQAQsVACAAEAEgAEEgahAcIABBwABqEAELUgAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOAt6ACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKCABIAApAzA3AzAgASAAKQM4NwM4IAEgACkDQDcDQCABIAApA0g3A0ggASAAKQNQNwNQIAEgACkDWDcDWAsoACAAEEcEQCABEEoFIAFBwABqEBwgAEEgaiABQSBqEAAgACABEAALCxgBAX8gACABEAQgAEEgaiABQSBqEARxDwt1AQF/IABBwABqIQIgABBIBEAgARBHDwsgARBHBEBBAA8LIAIQDwRAIAAgARBODwsgAkGoGBAVIAFBqBhByBgQFCACQagYQegYEBQgAUEgakHoGEGIGRAUIABByBgQBARAIABBIGpBiBkQBARAQQEPCwtBAA8LtAECAX8BfyAAQcAAaiECIAFBwABqIQMgABBIBEAgARBIDwsgARBIBEBBAA8LIAIQDwRAIAEgABBPDwsgAxAPBEAgACABEE8PCyACQagZEBUgA0HIGRAVIABByBlB6BkQFCABQagZQYgaEBQgAkGoGUGoGhAUIANByBlByBoQFCAAQSBqQcgaQegaEBQgAUEgakGoGkGIGxAUQegZQYgaEAQEQEHoGkGIGxAEBEBBAQ8LC0EADwvoAQAgABBHBEAgACABEE0PCyAAQagbEBUgAEEgakHIGxAVQcgbQegbEBUgAEHIG0GIHBAQQYgcQYgcEBVBiBxBqBtBiBwQEUGIHEHoG0GIHBARQYgcQYgcQYgcEBBBqBtBqBtBqBwQEEGoHEGoG0GoHBAQIABBIGogAEEgaiABQcAAahAQQagcIAEQFSABQYgcIAEQESABQYgcIAEQEUHoG0HoG0HIHBAQQcgcQcgcQcgcEBBByBxByBxByBwQEEGIHCABIAFBIGoQESABQSBqQagcIAFBIGoQFCABQSBqQcgcIAFBIGoQEQuJAgAgABBIBEAgACABEEwPCyAAQcAAahAPBEAgACABEFEPDwsgAEHoHBAVIABBIGpBiB0QFUGIHUGoHRAVIABB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TwRAIAVBEGshBSADQcjcACADEI8BCyADIAMQkQEgBUEITwRAIAVBCGshBSADQcjcACADEI8BCyADIAMQkQEgBUEETwRAIAVBBGshBSADQcjcACADEI8BCyADIAMQkQEgBUECTwRAIAVBAmshBSADQcjcACADEI8BCyADIAMQkQEgBUEBTwRAIAVBAWshBSADQcjcACADEI8BCyAERQ0BDAALCwvNAQBBiN8AEI0BQYjfAEGI3wAQlAEgAEGI3QBBIEHI3QAQngFByN0AQYjeABCRASAAQYjeAEGI3gAQjwFBiN4AQcjeABCVAUHI3gBBiN4AQcjeABCPAUHI3gBBiN8AEJgBBEAAC0HI3QAgAEHI3wAQjwFBiN4AQYjfABCYAQRAQYjfABABQajfABAcQYjfAEHI3wAgARCPAQVBiOAAEI0BQYjgAEGI3gBBiOAAEJIBQYjgAEGo3QBBIEGI4AAQngFBiOAAQcjfACABEI8BCwtpAEGo4gAQjQFBqOIAQajiABCUASAAQcjgAEEgQejgABCeAUHo4ABBqOEAEJEBIABBqOEAQajhABCPAUGo4QBB6OEAEJUBQejhAEGo4QBB6OEAEI8BQejhAEGo4gAQmAEEQEEADwtBAQ8LEQAgABCKASAAQcAAahCKAXELCwAgAEGAAWoQigELEAAgABCMASAAQcAAahCMAQsZACAAEIwBIABBwABqEI0BIABBgAFqEIwBC6IBACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKCABIAApAzA3AzAgASAAKQM4NwM4IAEgACkDQDcDQCABIAApA0g3A0ggASAAKQNQNwNQIAEgACkDWDcDWCABIAApA2A3A2AgASAAKQNoNwNoIAEgACkDcDcDcCABIAApA3g3A3gLggIAIAEgACkDADcDACABIAApAwg3AwggASAAKQMQNwMQIAEgACkDGDcDGCABIAApAyA3AyAgASAAKQMoNwMoIAEgACkDMDcDMCABIAApAzg3AzggASAAKQNANwNAIAEgACkDSDcDSCABIAApA1A3A1AgASAAKQNYNwNYIAEgACkDYDcDYCABIAApA2g3A2ggASAAKQNwNwNwIAEgACkDeDcDeCABIAApA4ABNwOAASABIAApA4gBNwOI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IAEQjwEgAEHAAGogAUHAAGoQACAAQeAAaiABQeAAahASIAFBwABqQdCIBCABQcAAahCPASAAQYABaiABQYABahAAIABBoAFqIAFBoAFqEBIgAUGAAWpBkIkEIAFBgAFqEI8BIABBwAFqIAFBwAFqEAAgAEHgAWogAUHgAWoQEiABQcABakHQiQQgAUHAAWoQjwEgAEGAAmogAUGAAmoQACAAQaACaiABQaACahASIAFBgAJqQZCKBCABQYACahCPASAAQcACaiABQcACahAAIABB4AJqIAFB4AJqEBIgAUHAAmpB0IoEIAFBwAJqEI8BC2wAIABBkIsEIAEQjwEgAEHAAGpB0IsEIAFBwABqEI8BIABBgAFqQZCMBCABQYABahCPASAAQcABakHQjAQgAUHAAWoQjwEgAEGAAmpBkI0EIAFBgAJqEI8BIABBwAJqQdCNBCABQcACahCPAQuKAgAgACABEAAgAEEgaiABQSBqEBIgAUGQjgQgARCPASAAQcAAaiABQcAAahAAIABB4ABqIAFB4ABqEBIgAUHAAGpB0I4EIAFBwABqEI8BIABBgAFqIAFBgAFqEAAgAEGgAWogAUGgAWoQEiABQYABakGQjwQgAUGAAWoQjwEgAEHAAWogAUHAAWoQACAAQeABaiABQeABahASIAFBwAFqQdCPBCABQcABahCPASAAQYACaiABQYACahAAIABBoAJqIAFBoAJqEBIgAUGAAmpBkJAEIAFBgAJqEI8BIABBwAJqIAFBwAJqEAAgAEHgAmogAUHgAmoQEiABQcACakHQkAQgAUHAAmoQjwELbAAgAEGQkQQgARCPASAAQcAAakHQkQQgAUHAAGoQjwEgAEGAAWpBkJIEIAFBgAFqEI8BIABBwAFqQdCSBCABQcABahCPASAAQYACakGQkwQgAUGAAmoQjwEgAEHAAmpB0JMEIAFBwAJqEI8BC4oCACAAIAEQACAAQSBqIAFBIGoQEiABQZCUBCABEI8BIABBwABqIAFBwABqEAAgAEHgAGogAUHgAGoQEiABQcAAakHQlAQgAUHAAGoQjwEgAEGAAWogAUGAAWoQACAAQaABaiABQaABahASIAFBgAFqQZCVBCABQYABahCPASAAQcABaiABQcABahAAIABB4AFqIAFB4AFqEBIgAUHAAWpB0JUEIAFBwAFqEI8BIABBgAJqIAFBgAJqEAAgAEGgAmogAUGgAmoQEiABQYACakGQlgQgAUGAAmoQjwEgAEHAAmogAUHAAmoQACAAQeACaiABQeACahASIAFBwAJqQdCWBCABQcACahCPAQtsACAAQZCXBCABEI8BIABBwABqQdCXBCABQcAAahCPASAAQYABakGQmAQgAUGAAWoQjwEgAEHAAWpB0JgEIAFBwAFqEI8BIABBgAJqQZCZBCABQYACahCPASAAQcACakHQmQQgAUHAAmoQjwELigIAIAAgARAAIABBIGogAUEgahASIAFBkJoEIAEQjwEgAEHAAGogAUHAAGoQACAAQeAAaiABQeAAahASIAFBwABqQdCaBCABQcAAahCPASAAQYABaiABQYABahAAIABBoAFqIAFBoAFqEBIgAUGAAWpBkJsEIAFBgAFqEI8BIABBwAFqIAFBwAFqEAAgAEHgAWogAUHgAWoQEiABQcABakHQmwQgAUHAAWoQjwEgAEGAAmogAUGAAmoQACAAQaACaiABQaACahASIAFBgAJqQZCcBCABQYACahCPASAAQcACaiABQcACahAAIABB4AJqIAFB4AJqEBIgAUHAAmpB0JwEIAFBwAJqEI8BC2wAIABBkJ0EIAEQjwEgAEHAAGpB0J0EIAFBwABqEI8BIABBgAFqQZCeBCABQYABahCPASAAQcABakHQngQgAUHAAWoQjwEgAEGAAmpBkJ8EIAFBgAJqEI8BIABBwAJqQdCfBCABQcACahCPAQuKAgAgACABEAAgAEEgaiABQSBqEBIgAUGQoAQgARCPASAAQcAAaiABQcAAahAAIABB4ABqIAFB4ABqEBIgAUHAAGpB0KAEIAFBwABqEI8BIABBgAFqIAFBgAFqEAAgAEGgAWogAUGgAWoQEiABQYABakGQoQQgAUGAAWoQjwEgAEHAAWogAUHAAWoQACAAQeABaiABQeABahASIAFBwAFqQdChBCABQcABahCPASAAQYACaiABQYACahAAIABBoAJqIAFBoAJqEBIgAUGAAmpBkKIEIAFBgAJqEI8BIABBwAJqIAFBwAJqEAAgAEHgAmogAUHgAmoQEiABQcACakHQogQgAUHAAmoQjwELEAAgAEGQowRB4AIgARCeAgtIACAAQfClBBD6ASAAQcABakGwpwQQ/wEgAEHwqAQQmQJB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"; +export const pq = 488; +export const pr = 1768; +export const pG1gen = 32008; +export const pG1zero = 32104; +export const pG1b = 3080; +export const pG2gen = 32200; +export const pG2zero = 32392; +export const pG2b = 12648; +export const pOneT = 32584; +export const prePSize = 192; +export const preQSize = 19776; +export const n8q = 32; +export const n8r = 32; +export const q = "21888242871839275222246405745257275088696311157297823662689037894645226208583"; +export const r = "21888242871839275222246405745257275088548364400416034343698204186575808495617"; diff --git a/build/bn128_wasm_gzip.js b/build/bn128_wasm_gzip.js new file mode 100644 index 0000000..5a96a16 --- /dev/null +++ b/build/bn128_wasm_gzip.js @@ -0,0 +1,16 @@ +export const gzipCode = "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Hi13TLzsPDqgTv3pkemPtI1der7za2vnLZKXrovZdrXLjagzhVuG9f4sbn3kqPmr0y/erPbN77dss/NjZzeaOfztUyuOPj5mVJ+5j/YbcGJQYYVxz0RWrPDt2fFLv87vtaTTJyuHRte3nI1otPbbb97rmfTi4vJlf3qwdwKizq+RmiOhnLTtZFm341pep3118wcVmO2tnKmOPq6khU8dumfzyKvKxIc/q7Si58/x8x4/0HDD0D8tM9rtqflu/zPJi589cv+WMX9J45vtSFn+4snYOY/tr78u60LktDa7qr+T8VuZ17oebvrhS9eNk1v+u8rKXr+UeuWJg403Db8cNavDl7Xfz/yj/JLnf3xw69hbeBz9xPZG9xMxsx/9ut7awecjprb+otrbfX8t/erT39/7wahrhkktPq/8VvqphPldvm20cdgl68z2e2u9N+BsudefO/rAxy/flCc0/7Timz1+ipvb+ZsG64dcVKe33V1jdb/fyy565of7Php9wzTlkZ1VV/U+nbjgye+a/GvElejcjl/VWTPwXIWlLxx7aFt2IfuqIJU8WuShjAPYinEOdLxY0lwnkZrmkDaP+Omea/c917lB46plVanbY8NaF5z9V5UBjonN6/87vnLvwiNf7zlz+p4HrV/OfXl9Qfo76N2Uo/taf9d+Zp82X35AMaKO+bhYBxELi8e2CJccWJQcWJQcWPzTDyyWF2eelpxYhPspeWQP+1NiftifYp5YvINLTixKTixKTiz+6ScWa3HJiUXJiUXJicU//cRiMy45sShE8AF3Jc/pJc/pJc/p//Tn9D0lz+n/K57UwvyUmB/257/BfPgM1JLn9JLn9JLn9H/6c/oPJc/pJc/pJc/p//jn9JMlz+kssuA6VrsVldLStGz56WWnfLhydKlZvz968Hz8UzMuFPzY8uie57dGN5xwLj656JQYFzRTxI0OKlJMUT/UeQOr23EVskX6euOEWVl4dOtGpX8/cqzMuAWPVNl8475Or6yh9zxZOq17O8fLQzas+eyQ9FTXo827Ta6z7LG/Ov0a0W/0b00nFNyKv/xrP/vr11/vPnLRkksL9mffuvVy2YovlllSaGy25P3fx95M/eOJpJ1PPBPR86P7X66fcu3JI8O1Rg22NrrWZXzPm3N/WbbC+vftsN8EO4rk+5/259/9oc5bWM2R/+N6/F//gcRs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"; +export const pq = 488; +export const pr = 1768; +export const pG1gen = 32008; +export const pG1zero = 32104; +export const pG1b = 3080; +export const pG2gen = 32200; +export const pG2zero = 32392; +export const pG2b = 12648; +export const pOneT = 32584; +export const prePSize = 192; +export const preQSize = 19776; +export const n8q = 32; +export const n8r = 32; +export const q = "21888242871839275222246405745257275088696311157297823662689037894645226208583"; +export const r = "21888242871839275222246405745257275088548364400416034343698204186575808495617"; diff --git a/build/main.cjs b/build/main.cjs new file mode 100644 index 0000000..bc24e42 --- /dev/null +++ b/build/main.cjs @@ -0,0 +1,3961 @@ +Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); +//#region src/utils.js +function bigInt2BytesLE(_a, len) { + const b = Array(len); + let v = BigInt(_a); + for (let i = 0; i < len; i++) { + b[i] = Number(v & 255n); + v = v >> 8n; + } + return b; +} +//#endregion +//#region src/build_int.js +function buildInt(module, n64, _prefix) { + const prefix = _prefix || "int"; + if (module.modules[prefix]) return prefix; + module.modules[prefix] = {}; + const n32 = n64 * 2; + const n8 = n64 * 8; + function buildCopy() { + const f = module.addFunction(prefix + "_copy"); + f.addParam("px", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + for (let i = 0; i < n64; i++) f.addCode(c.i64_store(c.getLocal("pr"), i * 8, c.i64_load(c.getLocal("px"), i * 8))); + } + function buildZero() { + const f = module.addFunction(prefix + "_zero"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + for (let i = 0; i < n64; i++) f.addCode(c.i64_store(c.getLocal("pr"), i * 8, c.i64_const(0))); + } + function buildOne() { + const f = module.addFunction(prefix + "_one"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.i64_store(c.getLocal("pr"), 0, c.i64_const(1))); + for (let i = 1; i < n64; i++) f.addCode(c.i64_store(c.getLocal("pr"), i * 8, c.i64_const(0))); + } + function buildIsZero() { + const f = module.addFunction(prefix + "_isZero"); + f.addParam("px", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + function getCompCode(n) { + if (n == 0) return c.ret(c.i64_eqz(c.i64_load(c.getLocal("px")))); + return c.if(c.i64_eqz(c.i64_load(c.getLocal("px"), n * 8)), getCompCode(n - 1), c.ret(c.i32_const(0))); + } + f.addCode(getCompCode(n64 - 1)); + f.addCode(c.ret(c.i32_const(0))); + } + function buildEq() { + const f = module.addFunction(prefix + "_eq"); + f.addParam("px", "i32"); + f.addParam("py", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + function getCompCode(n) { + if (n == 0) return c.ret(c.i64_eq(c.i64_load(c.getLocal("px")), c.i64_load(c.getLocal("py")))); + return c.if(c.i64_eq(c.i64_load(c.getLocal("px"), n * 8), c.i64_load(c.getLocal("py"), n * 8)), getCompCode(n - 1), c.ret(c.i32_const(0))); + } + f.addCode(getCompCode(n64 - 1)); + f.addCode(c.ret(c.i32_const(0))); + } + function buildGte() { + const f = module.addFunction(prefix + "_gte"); + f.addParam("px", "i32"); + f.addParam("py", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + function getCompCode(n) { + if (n == 0) return c.ret(c.i64_ge_u(c.i64_load(c.getLocal("px")), c.i64_load(c.getLocal("py")))); + return c.if(c.i64_lt_u(c.i64_load(c.getLocal("px"), n * 8), c.i64_load(c.getLocal("py"), n * 8)), c.ret(c.i32_const(0)), c.if(c.i64_gt_u(c.i64_load(c.getLocal("px"), n * 8), c.i64_load(c.getLocal("py"), n * 8)), c.ret(c.i32_const(1)), getCompCode(n - 1))); + } + f.addCode(getCompCode(n64 - 1)); + f.addCode(c.ret(c.i32_const(0))); + } + function buildAdd() { + const f = module.addFunction(prefix + "_add"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + f.setReturnType("i32"); + f.addLocal("c", "i64"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("c", c.i64_add(c.i64_load32_u(c.getLocal("x")), c.i64_load32_u(c.getLocal("y"))))); + f.addCode(c.i64_store32(c.getLocal("r"), c.getLocal("c"))); + for (let i = 1; i < n32; i++) { + f.addCode(c.setLocal("c", c.i64_add(c.i64_add(c.i64_load32_u(c.getLocal("x"), 4 * i), c.i64_load32_u(c.getLocal("y"), 4 * i)), c.i64_shr_u(c.getLocal("c"), c.i64_const(32))))); + f.addCode(c.i64_store32(c.getLocal("r"), i * 4, c.getLocal("c"))); + } + f.addCode(c.i32_wrap_i64(c.i64_shr_u(c.getLocal("c"), c.i64_const(32)))); + } + function buildSub() { + const f = module.addFunction(prefix + "_sub"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + f.setReturnType("i32"); + f.addLocal("c", "i64"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("c", c.i64_sub(c.i64_load32_u(c.getLocal("x")), c.i64_load32_u(c.getLocal("y"))))); + f.addCode(c.i64_store32(c.getLocal("r"), c.i64_and(c.getLocal("c"), c.i64_const("0xFFFFFFFF")))); + for (let i = 1; i < n32; i++) { + f.addCode(c.setLocal("c", c.i64_add(c.i64_sub(c.i64_load32_u(c.getLocal("x"), 4 * i), c.i64_load32_u(c.getLocal("y"), 4 * i)), c.i64_shr_s(c.getLocal("c"), c.i64_const(32))))); + f.addCode(c.i64_store32(c.getLocal("r"), i * 4, c.i64_and(c.getLocal("c"), c.i64_const("0xFFFFFFFF")))); + } + f.addCode(c.i32_wrap_i64(c.i64_shr_s(c.getLocal("c"), c.i64_const(32)))); + } + function buildMul() { + const f = module.addFunction(prefix + "_mul"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + f.addLocal("c0", "i64"); + f.addLocal("c1", "i64"); + for (let i = 0; i < n32; i++) { + f.addLocal("x" + i, "i64"); + f.addLocal("y" + i, "i64"); + } + const c = f.getCodeBuilder(); + const loadX = []; + const loadY = []; + function mulij(i, j) { + let X, Y; + if (!loadX[i]) { + X = c.teeLocal("x" + i, c.i64_load32_u(c.getLocal("x"), i * 4)); + loadX[i] = true; + } else X = c.getLocal("x" + i); + if (!loadY[j]) { + Y = c.teeLocal("y" + j, c.i64_load32_u(c.getLocal("y"), j * 4)); + loadY[j] = true; + } else Y = c.getLocal("y" + j); + return c.i64_mul(X, Y); + } + let c0 = "c0"; + let c1 = "c1"; + for (let k = 0; k < n32 * 2 - 1; k++) { + for (let i = Math.max(0, k - n32 + 1); i <= k && i < n32; i++) { + const j = k - i; + f.addCode(c.setLocal(c0, c.i64_add(c.i64_and(c.getLocal(c0), c.i64_const(4294967295)), mulij(i, j)))); + f.addCode(c.setLocal(c1, c.i64_add(c.getLocal(c1), c.i64_shr_u(c.getLocal(c0), c.i64_const(32))))); + } + f.addCode(c.i64_store32(c.getLocal("r"), k * 4, c.getLocal(c0))); + [c0, c1] = [c1, c0]; + f.addCode(c.setLocal(c1, c.i64_shr_u(c.getLocal(c0), c.i64_const(32)))); + } + f.addCode(c.i64_store32(c.getLocal("r"), n32 * 4 * 2 - 4, c.getLocal(c0))); + } + function buildSquare() { + const f = module.addFunction(prefix + "_square"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + f.addLocal("c0", "i64"); + f.addLocal("c1", "i64"); + f.addLocal("c0_old", "i64"); + f.addLocal("c1_old", "i64"); + for (let i = 0; i < n32; i++) f.addLocal("x" + i, "i64"); + const c = f.getCodeBuilder(); + const loadX = []; + function mulij(i, j) { + let X, Y; + if (!loadX[i]) { + X = c.teeLocal("x" + i, c.i64_load32_u(c.getLocal("x"), i * 4)); + loadX[i] = true; + } else X = c.getLocal("x" + i); + if (!loadX[j]) { + Y = c.teeLocal("x" + j, c.i64_load32_u(c.getLocal("x"), j * 4)); + loadX[j] = true; + } else Y = c.getLocal("x" + j); + return c.i64_mul(X, Y); + } + let c0 = "c0"; + let c1 = "c1"; + let c0_old = "c0_old"; + let c1_old = "c1_old"; + for (let k = 0; k < n32 * 2 - 1; k++) { + f.addCode(c.setLocal(c0, c.i64_const(0)), c.setLocal(c1, c.i64_const(0))); + for (let i = Math.max(0, k - n32 + 1); i < k + 1 >> 1 && i < n32; i++) { + const j = k - i; + f.addCode(c.setLocal(c0, c.i64_add(c.i64_and(c.getLocal(c0), c.i64_const(4294967295)), mulij(i, j)))); + f.addCode(c.setLocal(c1, c.i64_add(c.getLocal(c1), c.i64_shr_u(c.getLocal(c0), c.i64_const(32))))); + } + f.addCode(c.setLocal(c0, c.i64_shl(c.i64_and(c.getLocal(c0), c.i64_const(4294967295)), c.i64_const(1)))); + f.addCode(c.setLocal(c1, c.i64_add(c.i64_shl(c.getLocal(c1), c.i64_const(1)), c.i64_shr_u(c.getLocal(c0), c.i64_const(32))))); + if (k % 2 == 0) { + f.addCode(c.setLocal(c0, c.i64_add(c.i64_and(c.getLocal(c0), c.i64_const(4294967295)), mulij(k >> 1, k >> 1)))); + f.addCode(c.setLocal(c1, c.i64_add(c.getLocal(c1), c.i64_shr_u(c.getLocal(c0), c.i64_const(32))))); + } + if (k > 0) { + f.addCode(c.setLocal(c0, c.i64_add(c.i64_and(c.getLocal(c0), c.i64_const(4294967295)), c.i64_and(c.getLocal(c0_old), c.i64_const(4294967295))))); + f.addCode(c.setLocal(c1, c.i64_add(c.i64_add(c.getLocal(c1), c.i64_shr_u(c.getLocal(c0), c.i64_const(32))), c.getLocal(c1_old)))); + } + f.addCode(c.i64_store32(c.getLocal("r"), k * 4, c.getLocal(c0))); + f.addCode(c.setLocal(c0_old, c.getLocal(c1)), c.setLocal(c1_old, c.i64_shr_u(c.getLocal(c0_old), c.i64_const(32)))); + } + f.addCode(c.i64_store32(c.getLocal("r"), n32 * 4 * 2 - 4, c.getLocal(c0_old))); + } + function buildSquareOld() { + const f = module.addFunction(prefix + "_squareOld"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefix + "_mul", c.getLocal("x"), c.getLocal("x"), c.getLocal("r"))); + } + function _buildMul1() { + const f = module.addFunction(prefix + "__mul1"); + f.addParam("px", "i32"); + f.addParam("y", "i64"); + f.addParam("pr", "i32"); + f.addLocal("c", "i64"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("c", c.i64_mul(c.i64_load32_u(c.getLocal("px"), 0, 0), c.getLocal("y")))); + f.addCode(c.i64_store32(c.getLocal("pr"), 0, 0, c.getLocal("c"))); + for (let i = 1; i < n32; i++) { + f.addCode(c.setLocal("c", c.i64_add(c.i64_mul(c.i64_load32_u(c.getLocal("px"), 4 * i, 0), c.getLocal("y")), c.i64_shr_u(c.getLocal("c"), c.i64_const(32))))); + f.addCode(c.i64_store32(c.getLocal("pr"), i * 4, 0, c.getLocal("c"))); + } + } + function _buildAdd1() { + const f = module.addFunction(prefix + "__add1"); + f.addParam("x", "i32"); + f.addParam("y", "i64"); + f.addLocal("c", "i64"); + f.addLocal("px", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("px", c.getLocal("x"))); + f.addCode(c.setLocal("c", c.i64_add(c.i64_load32_u(c.getLocal("px"), 0, 0), c.getLocal("y")))); + f.addCode(c.i64_store32(c.getLocal("px"), 0, 0, c.getLocal("c"))); + f.addCode(c.setLocal("c", c.i64_shr_u(c.getLocal("c"), c.i64_const(32)))); + f.addCode(c.block(c.loop(c.br_if(1, c.i64_eqz(c.getLocal("c"))), c.setLocal("px", c.i32_add(c.getLocal("px"), c.i32_const(4))), c.setLocal("c", c.i64_add(c.i64_load32_u(c.getLocal("px"), 0, 0), c.getLocal("c"))), c.i64_store32(c.getLocal("px"), 0, 0, c.getLocal("c")), c.setLocal("c", c.i64_shr_u(c.getLocal("c"), c.i64_const(32))), c.br(0)))); + } + function buildDiv() { + _buildMul1(); + _buildAdd1(); + const f = module.addFunction(prefix + "_div"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("c", "i32"); + f.addParam("r", "i32"); + f.addLocal("rr", "i32"); + f.addLocal("cc", "i32"); + f.addLocal("eX", "i32"); + f.addLocal("eY", "i32"); + f.addLocal("sy", "i64"); + f.addLocal("sx", "i64"); + f.addLocal("ec", "i32"); + const c = f.getCodeBuilder(); + const Y = c.i32_const(module.alloc(n8)); + const Caux = c.i32_const(module.alloc(n8)); + const Raux = c.i32_const(module.alloc(n8)); + const C = c.getLocal("cc"); + const R = c.getLocal("rr"); + const pr1 = module.alloc(n8 * 2); + const R1 = c.i32_const(pr1); + const R2 = c.i32_const(pr1 + n8); + f.addCode(c.if(c.getLocal("c"), c.setLocal("cc", c.getLocal("c")), c.setLocal("cc", Caux))); + f.addCode(c.if(c.getLocal("r"), c.setLocal("rr", c.getLocal("r")), c.setLocal("rr", Raux))); + f.addCode(c.call(prefix + "_copy", c.getLocal("x"), R)); + f.addCode(c.call(prefix + "_copy", c.getLocal("y"), Y)); + f.addCode(c.call(prefix + "_zero", C)); + f.addCode(c.call(prefix + "_zero", R1)); + f.addCode(c.setLocal("eX", c.i32_const(n8 - 1))); + f.addCode(c.setLocal("eY", c.i32_const(n8 - 1))); + f.addCode(c.block(c.loop(c.br_if(1, c.i32_or(c.i32_load8_u(c.i32_add(Y, c.getLocal("eY")), 0, 0), c.i32_eq(c.getLocal("eY"), c.i32_const(3)))), c.setLocal("eY", c.i32_sub(c.getLocal("eY"), c.i32_const(1))), c.br(0)))); + f.addCode(c.setLocal("sy", c.i64_add(c.i64_load32_u(c.i32_sub(c.i32_add(Y, c.getLocal("eY")), c.i32_const(3)), 0, 0), c.i64_const(1)))); + f.addCode(c.if(c.i64_eq(c.getLocal("sy"), c.i64_const(1)), c.drop(c.i64_div_u(c.i64_const(0), c.i64_const(0))))); + f.addCode(c.block(c.loop(c.block(c.loop(c.br_if(1, c.i32_or(c.i32_load8_u(c.i32_add(R, c.getLocal("eX")), 0, 0), c.i32_eq(c.getLocal("eX"), c.i32_const(7)))), c.setLocal("eX", c.i32_sub(c.getLocal("eX"), c.i32_const(1))), c.br(0))), c.setLocal("sx", c.i64_load(c.i32_sub(c.i32_add(R, c.getLocal("eX")), c.i32_const(7)), 0, 0)), c.setLocal("sx", c.i64_div_u(c.getLocal("sx"), c.getLocal("sy"))), c.setLocal("ec", c.i32_sub(c.i32_sub(c.getLocal("eX"), c.getLocal("eY")), c.i32_const(4))), c.block(c.loop(c.br_if(1, c.i32_and(c.i64_eqz(c.i64_and(c.getLocal("sx"), c.i64_const("0xFFFFFFFF00000000"))), c.i32_ge_s(c.getLocal("ec"), c.i32_const(0)))), c.setLocal("sx", c.i64_shr_u(c.getLocal("sx"), c.i64_const(8))), c.setLocal("ec", c.i32_add(c.getLocal("ec"), c.i32_const(1))), c.br(0))), c.if(c.i64_eqz(c.getLocal("sx")), [ + ...c.br_if(2, c.i32_eqz(c.call(prefix + "_gte", R, Y))), + ...c.setLocal("sx", c.i64_const(1)), + ...c.setLocal("ec", c.i32_const(0)) + ]), c.call(prefix + "__mul1", Y, c.getLocal("sx"), R2), c.drop(c.call(prefix + "_sub", R, c.i32_sub(R2, c.getLocal("ec")), R)), c.call(prefix + "__add1", c.i32_add(C, c.getLocal("ec")), c.getLocal("sx")), c.br(0)))); + } + function buildInverseMod() { + const f = module.addFunction(prefix + "_inverseMod"); + f.addParam("px", "i32"); + f.addParam("pm", "i32"); + f.addParam("pr", "i32"); + f.addLocal("t", "i32"); + f.addLocal("newt", "i32"); + f.addLocal("r", "i32"); + f.addLocal("qq", "i32"); + f.addLocal("qr", "i32"); + f.addLocal("newr", "i32"); + f.addLocal("swp", "i32"); + f.addLocal("x", "i32"); + f.addLocal("signt", "i32"); + f.addLocal("signnewt", "i32"); + f.addLocal("signx", "i32"); + const c = f.getCodeBuilder(); + const aux1 = c.i32_const(module.alloc(n8)); + const aux2 = c.i32_const(module.alloc(n8)); + const aux3 = c.i32_const(module.alloc(n8)); + const aux4 = c.i32_const(module.alloc(n8)); + const aux5 = c.i32_const(module.alloc(n8)); + const aux6 = c.i32_const(module.alloc(n8)); + const mulBuff = c.i32_const(module.alloc(n8 * 2)); + const aux7 = c.i32_const(module.alloc(n8)); + f.addCode(c.setLocal("t", aux1), c.call(prefix + "_zero", aux1), c.setLocal("signt", c.i32_const(0))); + f.addCode(c.setLocal("r", aux2), c.call(prefix + "_copy", c.getLocal("pm"), aux2)); + f.addCode(c.setLocal("newt", aux3), c.call(prefix + "_one", aux3), c.setLocal("signnewt", c.i32_const(0))); + f.addCode(c.setLocal("newr", aux4), c.call(prefix + "_copy", c.getLocal("px"), aux4)); + f.addCode(c.setLocal("qq", aux5)); + f.addCode(c.setLocal("qr", aux6)); + f.addCode(c.setLocal("x", aux7)); + f.addCode(c.block(c.loop(c.br_if(1, c.call(prefix + "_isZero", c.getLocal("newr"))), c.call(prefix + "_div", c.getLocal("r"), c.getLocal("newr"), c.getLocal("qq"), c.getLocal("qr")), c.call(prefix + "_mul", c.getLocal("qq"), c.getLocal("newt"), mulBuff), c.if(c.getLocal("signt"), c.if(c.getLocal("signnewt"), c.if(c.call(prefix + "_gte", mulBuff, c.getLocal("t")), [...c.drop(c.call(prefix + "_sub", mulBuff, c.getLocal("t"), c.getLocal("x"))), ...c.setLocal("signx", c.i32_const(0))], [...c.drop(c.call(prefix + "_sub", c.getLocal("t"), mulBuff, c.getLocal("x"))), ...c.setLocal("signx", c.i32_const(1))]), [...c.drop(c.call(prefix + "_add", mulBuff, c.getLocal("t"), c.getLocal("x"))), ...c.setLocal("signx", c.i32_const(1))]), c.if(c.getLocal("signnewt"), [...c.drop(c.call(prefix + "_add", mulBuff, c.getLocal("t"), c.getLocal("x"))), ...c.setLocal("signx", c.i32_const(0))], c.if(c.call(prefix + "_gte", c.getLocal("t"), mulBuff), [...c.drop(c.call(prefix + "_sub", c.getLocal("t"), mulBuff, c.getLocal("x"))), ...c.setLocal("signx", c.i32_const(0))], [...c.drop(c.call(prefix + "_sub", mulBuff, c.getLocal("t"), c.getLocal("x"))), ...c.setLocal("signx", c.i32_const(1))]))), c.setLocal("swp", c.getLocal("t")), c.setLocal("t", c.getLocal("newt")), c.setLocal("newt", c.getLocal("x")), c.setLocal("x", c.getLocal("swp")), c.setLocal("signt", c.getLocal("signnewt")), c.setLocal("signnewt", c.getLocal("signx")), c.setLocal("swp", c.getLocal("r")), c.setLocal("r", c.getLocal("newr")), c.setLocal("newr", c.getLocal("qr")), c.setLocal("qr", c.getLocal("swp")), c.br(0)))); + f.addCode(c.if(c.getLocal("signt"), c.drop(c.call(prefix + "_sub", c.getLocal("pm"), c.getLocal("t"), c.getLocal("pr"))), c.call(prefix + "_copy", c.getLocal("t"), c.getLocal("pr")))); + } + buildCopy(); + buildZero(); + buildIsZero(); + buildOne(); + buildEq(); + buildGte(); + buildAdd(); + buildSub(); + buildMul(); + buildSquare(); + buildSquareOld(); + buildDiv(); + buildInverseMod(); + module.exportFunction(prefix + "_copy"); + module.exportFunction(prefix + "_zero"); + module.exportFunction(prefix + "_one"); + module.exportFunction(prefix + "_isZero"); + module.exportFunction(prefix + "_eq"); + module.exportFunction(prefix + "_gte"); + module.exportFunction(prefix + "_add"); + module.exportFunction(prefix + "_sub"); + module.exportFunction(prefix + "_mul"); + module.exportFunction(prefix + "_square"); + module.exportFunction(prefix + "_squareOld"); + module.exportFunction(prefix + "_div"); + module.exportFunction(prefix + "_inverseMod"); + return prefix; +} +//#endregion +//#region src/build_timesscalar.js +function buildTimesScalar(module, fnName, elementLen, opAB, opAA, opCopy, opInit) { + const f = module.addFunction(fnName); + f.addParam("base", "i32"); + f.addParam("scalar", "i32"); + f.addParam("scalarLength", "i32"); + f.addParam("r", "i32"); + f.addLocal("i", "i32"); + f.addLocal("b", "i32"); + const c = f.getCodeBuilder(); + const aux = c.i32_const(module.alloc(elementLen)); + f.addCode(c.if(c.i32_eqz(c.getLocal("scalarLength")), [...c.call(opInit, c.getLocal("r")), ...c.ret([])])); + f.addCode(c.call(opCopy, c.getLocal("base"), aux)); + f.addCode(c.call(opInit, c.getLocal("r"))); + f.addCode(c.setLocal("i", c.getLocal("scalarLength"))); + f.addCode(c.block(c.loop(c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), c.setLocal("b", c.i32_load8_u(c.i32_add(c.getLocal("scalar"), c.getLocal("i")))), ...innerLoop(), c.br_if(1, c.i32_eqz(c.getLocal("i"))), c.br(0)))); + function innerLoop() { + const code = []; + for (let i = 0; i < 8; i++) code.push(...c.call(opAA, c.getLocal("r"), c.getLocal("r")), ...c.if(c.i32_ge_u(c.getLocal("b"), c.i32_const(128 >> i)), [...c.setLocal("b", c.i32_sub(c.getLocal("b"), c.i32_const(128 >> i))), ...c.call(opAB, c.getLocal("r"), aux, c.getLocal("r"))])); + return code; + } +} +//#endregion +//#region src/build_batchinverse.js +var build_batchinverse_default = buildBatchInverse; +function buildBatchInverse(module, prefix) { + const n8 = module.modules[prefix].n64 * 8; + const f = module.addFunction(prefix + "_batchInverse"); + f.addParam("pIn", "i32"); + f.addParam("inStep", "i32"); + f.addParam("n", "i32"); + f.addParam("pOut", "i32"); + f.addParam("outStep", "i32"); + f.addLocal("itAux", "i32"); + f.addLocal("itIn", "i32"); + f.addLocal("itOut", "i32"); + f.addLocal("i", "i32"); + const c = f.getCodeBuilder(); + const AUX = c.i32_const(module.alloc(n8)); + f.addCode(c.setLocal("itAux", c.i32_load(c.i32_const(0))), c.i32_store(c.i32_const(0), c.i32_add(c.getLocal("itAux"), c.i32_mul(c.i32_add(c.getLocal("n"), c.i32_const(1)), c.i32_const(n8))))); + f.addCode(c.call(prefix + "_one", c.getLocal("itAux")), c.setLocal("itIn", c.getLocal("pIn")), c.setLocal("itAux", c.i32_add(c.getLocal("itAux"), c.i32_const(n8))), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.if(c.call(prefix + "_isZero", c.getLocal("itIn")), c.call(prefix + "_copy", c.i32_sub(c.getLocal("itAux"), c.i32_const(n8)), c.getLocal("itAux")), c.call(prefix + "_mul", c.getLocal("itIn"), c.i32_sub(c.getLocal("itAux"), c.i32_const(n8)), c.getLocal("itAux"))), c.setLocal("itIn", c.i32_add(c.getLocal("itIn"), c.getLocal("inStep"))), c.setLocal("itAux", c.i32_add(c.getLocal("itAux"), c.i32_const(n8))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0))), c.setLocal("itIn", c.i32_sub(c.getLocal("itIn"), c.getLocal("inStep"))), c.setLocal("itAux", c.i32_sub(c.getLocal("itAux"), c.i32_const(n8))), c.setLocal("itOut", c.i32_add(c.getLocal("pOut"), c.i32_mul(c.i32_sub(c.getLocal("n"), c.i32_const(1)), c.getLocal("outStep")))), c.call(prefix + "_inverse", c.getLocal("itAux"), c.getLocal("itAux")), c.block(c.loop(c.br_if(1, c.i32_eqz(c.getLocal("i"))), c.if(c.call(prefix + "_isZero", c.getLocal("itIn")), [...c.call(prefix + "_copy", c.getLocal("itAux"), c.i32_sub(c.getLocal("itAux"), c.i32_const(n8))), ...c.call(prefix + "_zero", c.getLocal("itOut"))], [ + ...c.call(prefix + "_copy", c.i32_sub(c.getLocal("itAux"), c.i32_const(n8)), AUX), + ...c.call(prefix + "_mul", c.getLocal("itAux"), c.getLocal("itIn"), c.i32_sub(c.getLocal("itAux"), c.i32_const(n8))), + ...c.call(prefix + "_mul", c.getLocal("itAux"), AUX, c.getLocal("itOut")) + ]), c.setLocal("itIn", c.i32_sub(c.getLocal("itIn"), c.getLocal("inStep"))), c.setLocal("itOut", c.i32_sub(c.getLocal("itOut"), c.getLocal("outStep"))), c.setLocal("itAux", c.i32_sub(c.getLocal("itAux"), c.i32_const(n8))), c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + f.addCode(c.i32_store(c.i32_const(0), c.getLocal("itAux"))); +} +//#endregion +//#region src/build_batchconvertion.js +var build_batchconvertion_default = buildBatchConvertion$1; +function buildBatchConvertion$1(module, fnName, internalFnName, sizeIn, sizeOut, reverse) { + if (typeof reverse === "undefined") if (sizeIn < sizeOut) reverse = true; + else reverse = false; + const f = module.addFunction(fnName); + f.addParam("pIn", "i32"); + f.addParam("n", "i32"); + f.addParam("pOut", "i32"); + f.addLocal("i", "i32"); + f.addLocal("itIn", "i32"); + f.addLocal("itOut", "i32"); + const c = f.getCodeBuilder(); + if (reverse) f.addCode(c.setLocal("itIn", c.i32_add(c.getLocal("pIn"), c.i32_mul(c.i32_sub(c.getLocal("n"), c.i32_const(1)), c.i32_const(sizeIn)))), c.setLocal("itOut", c.i32_add(c.getLocal("pOut"), c.i32_mul(c.i32_sub(c.getLocal("n"), c.i32_const(1)), c.i32_const(sizeOut)))), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.call(internalFnName, c.getLocal("itIn"), c.getLocal("itOut")), c.setLocal("itIn", c.i32_sub(c.getLocal("itIn"), c.i32_const(sizeIn))), c.setLocal("itOut", c.i32_sub(c.getLocal("itOut"), c.i32_const(sizeOut))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + else f.addCode(c.setLocal("itIn", c.getLocal("pIn")), c.setLocal("itOut", c.getLocal("pOut")), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.call(internalFnName, c.getLocal("itIn"), c.getLocal("itOut")), c.setLocal("itIn", c.i32_add(c.getLocal("itIn"), c.i32_const(sizeIn))), c.setLocal("itOut", c.i32_add(c.getLocal("itOut"), c.i32_const(sizeOut))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); +} +//#endregion +//#region src/build_batchop.js +var build_batchop_default = buildBatchConvertion; +function buildBatchConvertion(module, fnName, internalFnName, sizeIn, sizeOut, reverse) { + if (typeof reverse === "undefined") if (sizeIn < sizeOut) reverse = true; + else reverse = false; + const f = module.addFunction(fnName); + f.addParam("pIn1", "i32"); + f.addParam("pIn2", "i32"); + f.addParam("n", "i32"); + f.addParam("pOut", "i32"); + f.addLocal("i", "i32"); + f.addLocal("itIn1", "i32"); + f.addLocal("itIn2", "i32"); + f.addLocal("itOut", "i32"); + const c = f.getCodeBuilder(); + if (reverse) f.addCode(c.setLocal("itIn1", c.i32_add(c.getLocal("pIn1"), c.i32_mul(c.i32_sub(c.getLocal("n"), c.i32_const(1)), c.i32_const(sizeIn)))), c.setLocal("itIn2", c.i32_add(c.getLocal("pIn2"), c.i32_mul(c.i32_sub(c.getLocal("n"), c.i32_const(1)), c.i32_const(sizeIn)))), c.setLocal("itOut", c.i32_add(c.getLocal("pOut"), c.i32_mul(c.i32_sub(c.getLocal("n"), c.i32_const(1)), c.i32_const(sizeOut)))), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.call(internalFnName, c.getLocal("itIn1"), c.getLocal("itIn2"), c.getLocal("itOut")), c.setLocal("itIn1", c.i32_sub(c.getLocal("itIn1"), c.i32_const(sizeIn))), c.setLocal("itIn2", c.i32_sub(c.getLocal("itIn2"), c.i32_const(sizeIn))), c.setLocal("itOut", c.i32_sub(c.getLocal("itOut"), c.i32_const(sizeOut))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + else f.addCode(c.setLocal("itIn1", c.getLocal("pIn1")), c.setLocal("itIn2", c.getLocal("pIn2")), c.setLocal("itOut", c.getLocal("pOut")), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.call(internalFnName, c.getLocal("itIn1"), c.getLocal("itIn2"), c.getLocal("itOut")), c.setLocal("itIn1", c.i32_add(c.getLocal("itIn1"), c.i32_const(sizeIn))), c.setLocal("itIn2", c.i32_add(c.getLocal("itIn2"), c.i32_const(sizeIn))), c.setLocal("itOut", c.i32_add(c.getLocal("itOut"), c.i32_const(sizeOut))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); +} +//#endregion +//#region src/bigint.js +function compare(a, b) { + return a === b ? 0 : a > b ? 1 : -1; +} +function square(n) { + return n * n; +} +function isOdd(n) { + return n % 2n !== 0n; +} +function isEven(n) { + return n % 2n === 0n; +} +function isNegative(n) { + return n < 0n; +} +function isPositive(n) { + return n > 0n; +} +function bitLength(n) { + if (isNegative(n)) return n.toString(2).length - 1; + else return n.toString(2).length; +} +function abs(n) { + return n < 0n ? -n : n; +} +function isUnit(n) { + return abs(n) === 1n; +} +function modInv(a, n) { + var t = 0n, newT = 1n, r = n, newR = abs(a), q, lastT, lastR; + while (newR !== 0n) { + q = r / newR; + lastT = t; + lastR = r; + t = newT; + r = newR; + newT = lastT - q * newT; + newR = lastR - q * newR; + } + if (!isUnit(r)) throw new Error(a.toString() + " and " + n.toString() + " are not co-prime"); + if (compare(t, 0n) === -1) t = t + n; + if (isNegative(a)) return -t; + return t; +} +function modPow(n, exp, mod) { + if (mod === 0n) throw new Error("Cannot take modPow with modulus 0"); + var r = 1n, base = n % mod; + if (isNegative(exp)) { + exp = exp * -1n; + base = modInv(base, mod); + } + while (isPositive(exp)) { + if (base === 0n) return 0n; + if (isOdd(exp)) r = r * base % mod; + exp = exp / 2n; + base = square(base) % mod; + } + return r; +} +function compareAbs(a, b) { + a = a >= 0n ? a : -a; + b = b >= 0n ? b : -b; + return a === b ? 0 : a > b ? 1 : -1; +} +function isDivisibleBy(a, n) { + if (n === 0n) return false; + if (isUnit(n)) return true; + if (compareAbs(n, 2n) === 0) return isEven(a); + return a % n === 0n; +} +function isBasicPrime(v) { + var n = abs(v); + if (isUnit(n)) return false; + if (n === 2n || n === 3n || n === 5n) return true; + if (isEven(n) || isDivisibleBy(n, 3n) || isDivisibleBy(n, 5n)) return false; + if (n < 49n) return true; +} +function prev(n) { + return n - 1n; +} +function isKnownPrime(v) { + switch (abs(v)) { + case 21888242871839275222246405745257275088696311157297823662689037894645226208583n: + case 21888242871839275222246405745257275088548364400416034343698204186575808495617n: + case 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787n: + case 52435875175126190479447740508185965837690552500527637822603658699938581184513n: + case 41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888458477323173057491593855069696241854796396165721416325350064441470418137846398469611935719059908164220784476160001n: return true; + } +} +function millerRabinTest(n, a) { + var nPrev = prev(n), b = nPrev, r = 0, d, i, x; + while (isEven(b)) b = b / 2n, r++; + next: for (i = 0; i < a.length; i++) { + if (n < a[i]) continue; + x = modPow(BigInt(a[i]), b, n); + if (isUnit(x) || x === nPrev) continue; + for (d = r - 1; d != 0; d--) { + x = square(x) % n; + if (isUnit(x)) return false; + if (x === nPrev) continue next; + } + return false; + } + return true; +} +function isPrime(p) { + let isPrime; + isPrime = isKnownPrime(p); + if (isPrime !== void 0) return isPrime; + isPrime = isBasicPrime(p); + if (isPrime !== void 0) return isPrime; + var n = abs(p); + var bits = bitLength(n); + if (bits <= 64) return millerRabinTest(n, [ + 2, + 3, + 5, + 7, + 11, + 13, + 17, + 19, + 23, + 29, + 31, + 37 + ]); + var logN = Math.log(2) * Number(bits); + var t = Math.ceil(logN); + for (var a = [], i = 0; i < t; i++) a.push(BigInt(i + 2)); + return millerRabinTest(n, a); +} +//#endregion +//#region src/build_f1m.js +function buildF1m(module, _q, _prefix, _intPrefix) { + const q = BigInt(_q); + const n64 = Math.floor((bitLength(q - 1n) - 1) / 64) + 1; + const n32 = n64 * 2; + const n8 = n64 * 8; + const prefix = _prefix || "f1m"; + if (module.modules[prefix]) return prefix; + const intPrefix = buildInt(module, n64, _intPrefix); + const pq = module.alloc(n8, bigInt2BytesLE(q, n8)); + const pR2 = module.alloc(bigInt2BytesLE(square(1n << BigInt(n64 * 64)) % q, n8)); + const pOne = module.alloc(bigInt2BytesLE((1n << BigInt(n64 * 64)) % q, n8)); + const pZero = module.alloc(bigInt2BytesLE(0n, n8)); + const _minusOne = q - 1n; + const _e = _minusOne >> 1n; + const pe = module.alloc(n8, bigInt2BytesLE(_e, n8)); + const _ePlusOne = _e + 1n; + const pePlusOne = module.alloc(n8, bigInt2BytesLE(_ePlusOne, n8)); + module.modules[prefix] = { + pq, + pR2, + n64, + q, + pOne, + pZero, + pePlusOne + }; + function buildOne() { + const f = module.addFunction(prefix + "_one"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(intPrefix + "_copy", c.i32_const(pOne), c.getLocal("pr"))); + } + function buildAdd() { + const f = module.addFunction(prefix + "_add"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.if(c.call(intPrefix + "_add", c.getLocal("x"), c.getLocal("y"), c.getLocal("r")), c.drop(c.call(intPrefix + "_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), c.if(c.call(intPrefix + "_gte", c.getLocal("r"), c.i32_const(pq)), c.drop(c.call(intPrefix + "_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r")))))); + } + function buildSub() { + const f = module.addFunction(prefix + "_sub"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.if(c.call(intPrefix + "_sub", c.getLocal("x"), c.getLocal("y"), c.getLocal("r")), c.drop(c.call(intPrefix + "_add", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))))); + } + function buildNeg() { + const f = module.addFunction(prefix + "_neg"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefix + "_sub", c.i32_const(pZero), c.getLocal("x"), c.getLocal("r"))); + } + function buildIsNegative() { + const f = module.addFunction(prefix + "_isNegative"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const AUX = c.i32_const(module.alloc(n8)); + f.addCode(c.call(prefix + "_fromMontgomery", c.getLocal("x"), AUX), c.call(intPrefix + "_gte", AUX, c.i32_const(pePlusOne))); + } + function buildSign() { + const f = module.addFunction(prefix + "_sign"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const AUX = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(intPrefix + "_isZero", c.getLocal("x")), c.ret(c.i32_const(0))), c.call(prefix + "_fromMontgomery", c.getLocal("x"), AUX), c.if(c.call(intPrefix + "_gte", AUX, c.i32_const(pePlusOne)), c.ret(c.i32_const(-1))), c.ret(c.i32_const(1))); + } + function buildMReduct() { + const carries = module.alloc(n32 * n32 * 8); + const f = module.addFunction(prefix + "_mReduct"); + f.addParam("t", "i32"); + f.addParam("r", "i32"); + f.addLocal("np32", "i64"); + f.addLocal("c", "i64"); + f.addLocal("m", "i64"); + const c = f.getCodeBuilder(); + const np32 = Number(4294967296n - modInv(q, 4294967296n)); + f.addCode(c.setLocal("np32", c.i64_const(np32))); + for (let i = 0; i < n32; i++) { + f.addCode(c.setLocal("c", c.i64_const(0))); + f.addCode(c.setLocal("m", c.i64_and(c.i64_mul(c.i64_load32_u(c.getLocal("t"), i * 4), c.getLocal("np32")), c.i64_const("0xFFFFFFFF")))); + for (let j = 0; j < n32; j++) { + f.addCode(c.setLocal("c", c.i64_add(c.i64_add(c.i64_load32_u(c.getLocal("t"), (i + j) * 4), c.i64_shr_u(c.getLocal("c"), c.i64_const(32))), c.i64_mul(c.i64_load32_u(c.i32_const(pq), j * 4), c.getLocal("m"))))); + f.addCode(c.i64_store32(c.getLocal("t"), (i + j) * 4, c.getLocal("c"))); + } + f.addCode(c.i64_store32(c.i32_const(carries), i * 4, c.i64_shr_u(c.getLocal("c"), c.i64_const(32)))); + } + f.addCode(c.call(prefix + "_add", c.i32_const(carries), c.i32_add(c.getLocal("t"), c.i32_const(n32 * 4)), c.getLocal("r"))); + } + function buildMul() { + const f = module.addFunction(prefix + "_mul"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + f.addLocal("yi", "i64"); + f.addLocal("m", "i64"); + f.addLocal("cc", "i64"); + f.addLocal("s", "i64"); + for (let i = 0; i < n32; i++) f.addLocal("x" + i, "i64"); + for (let j = 0; j <= n32 + 1; j++) f.addLocal("t" + j, "i64"); + const c = f.getCodeBuilder(); + const np32 = Number(4294967296n - modInv(q, 4294967296n)); + const qLimbs = []; + for (let j = 0; j < n32; j++) qLimbs.push(Number(q >> BigInt(32 * j) & 4294967295n)); + const MASK32 = 4294967295; + const noCarry = q < 1n << BigInt(32 * n32 - 1); + for (let i = 0; i < n32; i++) f.addCode(c.setLocal("x" + i, c.i64_load32_u(c.getLocal("x"), i * 4))); + for (let i = 0; i < n32; i++) { + f.addCode(c.setLocal("yi", c.i64_load32_u(c.getLocal("y"), i * 4))); + f.addCode(c.setLocal("s", c.i64_add(c.getLocal("t0"), c.i64_mul(c.getLocal("x0"), c.getLocal("yi")))), c.setLocal("t0", c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("cc", c.i64_shr_u(c.getLocal("s"), c.i64_const(32)))); + for (let j = 1; j < n32; j++) f.addCode(c.setLocal("s", c.i64_add(c.i64_add(c.getLocal("t" + j), c.i64_mul(c.getLocal("x" + j), c.getLocal("yi"))), c.getLocal("cc"))), c.setLocal("t" + j, c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("cc", c.i64_shr_u(c.getLocal("s"), c.i64_const(32)))); + if (noCarry) f.addCode(c.setLocal("t" + n32, c.getLocal("cc"))); + else f.addCode(c.setLocal("s", c.i64_add(c.getLocal("t" + n32), c.getLocal("cc"))), c.setLocal("t" + n32, c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("t" + (n32 + 1), c.i64_add(c.getLocal("t" + (n32 + 1)), c.i64_shr_u(c.getLocal("s"), c.i64_const(32))))); + f.addCode(c.setLocal("m", c.i64_and(c.i64_mul(c.getLocal("t0"), c.i64_const(np32)), c.i64_const(MASK32))), c.setLocal("s", c.i64_add(c.getLocal("t0"), c.i64_mul(c.getLocal("m"), c.i64_const(qLimbs[0])))), c.setLocal("cc", c.i64_shr_u(c.getLocal("s"), c.i64_const(32)))); + for (let j = 1; j < n32; j++) f.addCode(c.setLocal("s", c.i64_add(c.i64_add(c.getLocal("t" + j), c.i64_mul(c.getLocal("m"), c.i64_const(qLimbs[j]))), c.getLocal("cc"))), c.setLocal("t" + (j - 1), c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("cc", c.i64_shr_u(c.getLocal("s"), c.i64_const(32)))); + if (noCarry) f.addCode(c.setLocal("t" + (n32 - 1), c.i64_add(c.getLocal("t" + n32), c.getLocal("cc")))); + else f.addCode(c.setLocal("s", c.i64_add(c.getLocal("t" + n32), c.getLocal("cc"))), c.setLocal("t" + (n32 - 1), c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("t" + n32, c.i64_add(c.getLocal("t" + (n32 + 1)), c.i64_shr_u(c.getLocal("s"), c.i64_const(32)))), c.setLocal("t" + (n32 + 1), c.i64_const(0))); + } + for (let j = 0; j < n32; j++) f.addCode(c.i64_store32(c.getLocal("r"), j * 4, c.getLocal("t" + j))); + if (noCarry) f.addCode(c.if(c.call(intPrefix + "_gte", c.getLocal("r"), c.i32_const(pq)), c.drop(c.call(intPrefix + "_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))))); + else f.addCode(c.if(c.i32_wrap_i64(c.getLocal("t" + n32)), c.drop(c.call(intPrefix + "_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), c.if(c.call(intPrefix + "_gte", c.getLocal("r"), c.i32_const(pq)), c.drop(c.call(intPrefix + "_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r")))))); + } + function buildSquare() { + const f = module.addFunction(prefix + "_square"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + f.addLocal("m", "i64"); + f.addLocal("cc", "i64"); + f.addLocal("s", "i64"); + f.addLocal("p", "i64"); + for (let i = 0; i < n32; i++) f.addLocal("x" + i, "i64"); + for (let j = 0; j <= n32 + 1; j++) f.addLocal("t" + j, "i64"); + const c = f.getCodeBuilder(); + const np32 = Number(4294967296n - modInv(q, 4294967296n)); + const qLimbs = []; + for (let j = 0; j < n32; j++) qLimbs.push(Number(q >> BigInt(32 * j) & 4294967295n)); + const MASK32 = 4294967295; + for (let i = 0; i < n32; i++) f.addCode(c.setLocal("x" + i, c.i64_load32_u(c.getLocal("x"), i * 4))); + for (let i = 0; i < n32; i++) { + f.addCode(c.setLocal("s", c.i64_add(c.getLocal("t" + i), c.i64_mul(c.getLocal("x" + i), c.getLocal("x" + i)))), c.setLocal("t" + i, c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("cc", c.i64_shr_u(c.getLocal("s"), c.i64_const(32)))); + for (let j = i + 1; j < n32; j++) f.addCode(c.setLocal("p", c.i64_mul(c.getLocal("x" + j), c.getLocal("x" + i))), c.setLocal("s", c.i64_add(c.i64_add(c.getLocal("t" + j), c.i64_shl(c.i64_and(c.getLocal("p"), c.i64_const(MASK32)), c.i64_const(1))), c.getLocal("cc"))), c.setLocal("t" + j, c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("cc", c.i64_add(c.i64_shr_u(c.getLocal("s"), c.i64_const(32)), c.i64_shl(c.i64_shr_u(c.getLocal("p"), c.i64_const(32)), c.i64_const(1))))); + f.addCode(c.setLocal("s", c.i64_add(c.getLocal("t" + n32), c.getLocal("cc"))), c.setLocal("t" + n32, c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("t" + (n32 + 1), c.i64_add(c.getLocal("t" + (n32 + 1)), c.i64_shr_u(c.getLocal("s"), c.i64_const(32))))); + f.addCode(c.setLocal("m", c.i64_and(c.i64_mul(c.getLocal("t0"), c.i64_const(np32)), c.i64_const(MASK32))), c.setLocal("s", c.i64_add(c.getLocal("t0"), c.i64_mul(c.getLocal("m"), c.i64_const(qLimbs[0])))), c.setLocal("cc", c.i64_shr_u(c.getLocal("s"), c.i64_const(32)))); + for (let j = 1; j < n32; j++) f.addCode(c.setLocal("s", c.i64_add(c.i64_add(c.getLocal("t" + j), c.i64_mul(c.getLocal("m"), c.i64_const(qLimbs[j]))), c.getLocal("cc"))), c.setLocal("t" + (j - 1), c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("cc", c.i64_shr_u(c.getLocal("s"), c.i64_const(32)))); + f.addCode(c.setLocal("s", c.i64_add(c.getLocal("t" + n32), c.getLocal("cc"))), c.setLocal("t" + (n32 - 1), c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), c.setLocal("t" + n32, c.i64_add(c.getLocal("t" + (n32 + 1)), c.i64_shr_u(c.getLocal("s"), c.i64_const(32)))), c.setLocal("t" + (n32 + 1), c.i64_const(0))); + } + for (let j = 0; j < n32; j++) f.addCode(c.i64_store32(c.getLocal("r"), j * 4, c.getLocal("t" + j))); + f.addCode(c.if(c.i32_wrap_i64(c.getLocal("t" + n32)), c.drop(c.call(intPrefix + "_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), c.if(c.call(intPrefix + "_gte", c.getLocal("r"), c.i32_const(pq)), c.drop(c.call(intPrefix + "_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r")))))); + } + function buildSquareOld() { + const f = module.addFunction(prefix + "_squareOld"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefix + "_mul", c.getLocal("x"), c.getLocal("x"), c.getLocal("r"))); + } + function buildToMontgomery() { + const f = module.addFunction(prefix + "_toMontgomery"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefix + "_mul", c.getLocal("x"), c.i32_const(pR2), c.getLocal("r"))); + } + function buildFromMontgomery() { + const pAux2 = module.alloc(n8 * 2); + const f = module.addFunction(prefix + "_fromMontgomery"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(intPrefix + "_copy", c.getLocal("x"), c.i32_const(pAux2))); + f.addCode(c.call(intPrefix + "_zero", c.i32_const(pAux2 + n8))); + f.addCode(c.call(prefix + "_mReduct", c.i32_const(pAux2), c.getLocal("r"))); + } + function buildInverse() { + const f = module.addFunction(prefix + "_inverse"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefix + "_fromMontgomery", c.getLocal("x"), c.getLocal("r"))); + f.addCode(c.call(intPrefix + "_inverseMod", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))); + f.addCode(c.call(prefix + "_toMontgomery", c.getLocal("r"), c.getLocal("r"))); + } + let _nqr = 2n; + if (isPrime(q)) while (modPow(_nqr, _e, q) !== _minusOne) _nqr = _nqr + 1n; + let s2 = 0; + let _t = _minusOne; + while (!isOdd(_t) && _t !== 0n) { + s2++; + _t = _t >> 1n; + } + const pt = module.alloc(n8, bigInt2BytesLE(_t, n8)); + const _nqrToT = modPow(_nqr, _t, q); + const pNqrToT = module.alloc(bigInt2BytesLE((_nqrToT << BigInt(n64 * 64)) % q, n8)); + const _tPlusOneOver2 = _t + 1n >> 1n; + const ptPlusOneOver2 = module.alloc(n8, bigInt2BytesLE(_tPlusOneOver2, n8)); + function buildSqrt() { + const f = module.addFunction(prefix + "_sqrt"); + f.addParam("n", "i32"); + f.addParam("r", "i32"); + f.addLocal("m", "i32"); + f.addLocal("i", "i32"); + f.addLocal("j", "i32"); + const c = f.getCodeBuilder(); + const ONE = c.i32_const(pOne); + const C = c.i32_const(module.alloc(n8)); + const T = c.i32_const(module.alloc(n8)); + const R = c.i32_const(module.alloc(n8)); + const SQ = c.i32_const(module.alloc(n8)); + const B = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZero", c.getLocal("n")), c.ret(c.call(prefix + "_zero", c.getLocal("r")))), c.setLocal("m", c.i32_const(s2)), c.call(prefix + "_copy", c.i32_const(pNqrToT), C), c.call(prefix + "_exp", c.getLocal("n"), c.i32_const(pt), c.i32_const(n8), T), c.call(prefix + "_exp", c.getLocal("n"), c.i32_const(ptPlusOneOver2), c.i32_const(n8), R), c.block(c.loop(c.br_if(1, c.call(prefix + "_eq", T, ONE)), c.call(prefix + "_square", T, SQ), c.setLocal("i", c.i32_const(1)), c.block(c.loop(c.br_if(1, c.call(prefix + "_eq", SQ, ONE)), c.call(prefix + "_square", SQ, SQ), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0))), c.call(prefix + "_copy", C, B), c.setLocal("j", c.i32_sub(c.i32_sub(c.getLocal("m"), c.getLocal("i")), c.i32_const(1))), c.block(c.loop(c.br_if(1, c.i32_eqz(c.getLocal("j"))), c.call(prefix + "_square", B, B), c.setLocal("j", c.i32_sub(c.getLocal("j"), c.i32_const(1))), c.br(0))), c.setLocal("m", c.getLocal("i")), c.call(prefix + "_square", B, C), c.call(prefix + "_mul", T, C, T), c.call(prefix + "_mul", R, B, R), c.br(0))), c.if(c.call(prefix + "_isNegative", R), c.call(prefix + "_neg", R, c.getLocal("r")), c.call(prefix + "_copy", R, c.getLocal("r")))); + } + function buildIsSquare() { + const f = module.addFunction(prefix + "_isSquare"); + f.addParam("n", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const ONE = c.i32_const(pOne); + const AUX = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZero", c.getLocal("n")), c.ret(c.i32_const(1))), c.call(prefix + "_exp", c.getLocal("n"), c.i32_const(pe), c.i32_const(n8), AUX), c.call(prefix + "_eq", AUX, ONE)); + } + function buildLoad() { + const f = module.addFunction(prefix + "_load"); + f.addParam("scalar", "i32"); + f.addParam("scalarLen", "i32"); + f.addParam("r", "i32"); + f.addLocal("p", "i32"); + f.addLocal("l", "i32"); + f.addLocal("i", "i32"); + f.addLocal("j", "i32"); + const c = f.getCodeBuilder(); + const R = c.i32_const(module.alloc(n8)); + const pAux = module.alloc(n8); + const AUX = c.i32_const(pAux); + f.addCode(c.call(intPrefix + "_zero", c.getLocal("r")), c.setLocal("i", c.i32_const(n8)), c.setLocal("p", c.getLocal("scalar")), c.block(c.loop(c.br_if(1, c.i32_gt_u(c.getLocal("i"), c.getLocal("scalarLen"))), c.if(c.i32_eq(c.getLocal("i"), c.i32_const(n8)), c.call(prefix + "_one", R), c.call(prefix + "_mul", R, c.i32_const(pR2), R)), c.call(prefix + "_mul", c.getLocal("p"), R, AUX), c.call(prefix + "_add", c.getLocal("r"), AUX, c.getLocal("r")), c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(n8))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(n8))), c.br(0))), c.setLocal("l", c.i32_rem_u(c.getLocal("scalarLen"), c.i32_const(n8))), c.if(c.i32_eqz(c.getLocal("l")), c.ret([])), c.call(intPrefix + "_zero", AUX), c.setLocal("j", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("l"))), c.i32_store8(c.getLocal("j"), pAux, c.i32_load8_u(c.getLocal("p"))), c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(1))), c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), c.br(0))), c.if(c.i32_eq(c.getLocal("i"), c.i32_const(n8)), c.call(prefix + "_one", R), c.call(prefix + "_mul", R, c.i32_const(pR2), R)), c.call(prefix + "_mul", AUX, R, AUX), c.call(prefix + "_add", c.getLocal("r"), AUX, c.getLocal("r"))); + } + function buildTimesScalar$3() { + const f = module.addFunction(prefix + "_timesScalar"); + f.addParam("x", "i32"); + f.addParam("scalar", "i32"); + f.addParam("scalarLen", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const AUX = c.i32_const(module.alloc(n8)); + f.addCode(c.call(prefix + "_load", c.getLocal("scalar"), c.getLocal("scalarLen"), AUX), c.call(prefix + "_toMontgomery", AUX, AUX), c.call(prefix + "_mul", c.getLocal("x"), AUX, c.getLocal("r"))); + } + function buildIsOne() { + const f = module.addFunction(prefix + "_isOne"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + f.addCode(c.ret(c.call(intPrefix + "_eq", c.getLocal("x"), c.i32_const(pOne)))); + } + module.exportFunction(intPrefix + "_copy", prefix + "_copy"); + module.exportFunction(intPrefix + "_zero", prefix + "_zero"); + module.exportFunction(intPrefix + "_isZero", prefix + "_isZero"); + module.exportFunction(intPrefix + "_eq", prefix + "_eq"); + buildIsOne(); + buildAdd(); + buildSub(); + buildNeg(); + buildMReduct(); + buildMul(); + buildSquare(); + buildSquareOld(); + buildToMontgomery(); + buildFromMontgomery(); + buildIsNegative(); + buildSign(); + buildInverse(); + buildOne(); + buildLoad(); + buildTimesScalar$3(); + build_batchinverse_default(module, prefix); + build_batchconvertion_default(module, prefix + "_batchToMontgomery", prefix + "_toMontgomery", n8, n8); + build_batchconvertion_default(module, prefix + "_batchFromMontgomery", prefix + "_fromMontgomery", n8, n8); + build_batchconvertion_default(module, prefix + "_batchNeg", prefix + "_neg", n8, n8); + build_batchop_default(module, prefix + "_batchAdd", prefix + "_add", n8, n8); + build_batchop_default(module, prefix + "_batchSub", prefix + "_sub", n8, n8); + build_batchop_default(module, prefix + "_batchMul", prefix + "_mul", n8, n8); + module.exportFunction(prefix + "_add"); + module.exportFunction(prefix + "_sub"); + module.exportFunction(prefix + "_neg"); + module.exportFunction(prefix + "_isNegative"); + module.exportFunction(prefix + "_isOne"); + module.exportFunction(prefix + "_sign"); + module.exportFunction(prefix + "_mReduct"); + module.exportFunction(prefix + "_mul"); + module.exportFunction(prefix + "_square"); + module.exportFunction(prefix + "_squareOld"); + module.exportFunction(prefix + "_fromMontgomery"); + module.exportFunction(prefix + "_toMontgomery"); + module.exportFunction(prefix + "_inverse"); + module.exportFunction(prefix + "_one"); + module.exportFunction(prefix + "_load"); + module.exportFunction(prefix + "_timesScalar"); + buildTimesScalar(module, prefix + "_exp", n8, prefix + "_mul", prefix + "_square", intPrefix + "_copy", prefix + "_one"); + module.exportFunction(prefix + "_exp"); + module.exportFunction(prefix + "_batchInverse"); + if (isPrime(q)) { + buildSqrt(); + buildIsSquare(); + module.exportFunction(prefix + "_sqrt"); + module.exportFunction(prefix + "_isSquare"); + } + module.exportFunction(prefix + "_batchToMontgomery"); + module.exportFunction(prefix + "_batchFromMontgomery"); + return prefix; +} +//#endregion +//#region src/build_f1.js +function buildF1(module, _q, _prefix, _f1mPrefix, _intPrefix) { + const q = BigInt(_q); + const n64 = Math.floor((bitLength(q - 1n) - 1) / 64) + 1; + const n8 = n64 * 8; + const prefix = _prefix || "f1"; + if (module.modules[prefix]) return prefix; + module.modules[prefix] = { n64 }; + const intPrefix = _intPrefix || "int"; + const f1mPrefix = buildF1m(module, q, _f1mPrefix, intPrefix); + const pR2 = module.modules[f1mPrefix].pR2; + const pq = module.modules[f1mPrefix].pq; + const pePlusOne = module.modules[f1mPrefix].pePlusOne; + function buildMul() { + const pAux1 = module.alloc(n8); + const f = module.addFunction(prefix + "_mul"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(f1mPrefix + "_mul", c.getLocal("x"), c.getLocal("y"), c.i32_const(pAux1))); + f.addCode(c.call(f1mPrefix + "_mul", c.i32_const(pAux1), c.i32_const(pR2), c.getLocal("r"))); + } + function buildSquare() { + const f = module.addFunction(prefix + "_square"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefix + "_mul", c.getLocal("x"), c.getLocal("x"), c.getLocal("r"))); + } + function buildInverse() { + const f = module.addFunction(prefix + "_inverse"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(intPrefix + "_inverseMod", c.getLocal("x"), c.i32_const(pq), c.getLocal("r"))); + } + function buildIsNegative() { + const f = module.addFunction(prefix + "_isNegative"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(intPrefix + "_gte", c.getLocal("x"), c.i32_const(pePlusOne))); + } + buildMul(); + buildSquare(); + buildInverse(); + buildIsNegative(); + module.exportFunction(f1mPrefix + "_add", prefix + "_add"); + module.exportFunction(f1mPrefix + "_sub", prefix + "_sub"); + module.exportFunction(f1mPrefix + "_neg", prefix + "_neg"); + module.exportFunction(prefix + "_mul"); + module.exportFunction(prefix + "_square"); + module.exportFunction(prefix + "_inverse"); + module.exportFunction(prefix + "_isNegative"); + module.exportFunction(f1mPrefix + "_copy", prefix + "_copy"); + module.exportFunction(f1mPrefix + "_zero", prefix + "_zero"); + module.exportFunction(f1mPrefix + "_one", prefix + "_one"); + module.exportFunction(f1mPrefix + "_isZero", prefix + "_isZero"); + module.exportFunction(f1mPrefix + "_eq", prefix + "_eq"); + return prefix; +} +//#endregion +//#region src/build_f2m.js +function buildF2m(module, mulNonResidueFn, prefix, f1mPrefix) { + if (module.modules[prefix]) return prefix; + const f1n8 = module.modules[f1mPrefix].n64 * 8; + const q = module.modules[f1mPrefix].q; + module.modules[prefix] = { n64: module.modules[f1mPrefix].n64 * 2 }; + function buildAdd() { + const f = module.addFunction(prefix + "_add"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const y0 = c.getLocal("y"); + const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_add", x0, y0, r0), c.call(f1mPrefix + "_add", x1, y1, r1)); + } + function buildTimesScalar$2() { + const f = module.addFunction(prefix + "_timesScalar"); + f.addParam("x", "i32"); + f.addParam("scalar", "i32"); + f.addParam("scalarLen", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_timesScalar", x0, c.getLocal("scalar"), c.getLocal("scalarLen"), r0), c.call(f1mPrefix + "_timesScalar", x1, c.getLocal("scalar"), c.getLocal("scalarLen"), r1)); + } + function buildSub() { + const f = module.addFunction(prefix + "_sub"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const y0 = c.getLocal("y"); + const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_sub", x0, y0, r0), c.call(f1mPrefix + "_sub", x1, y1, r1)); + } + function buildNeg() { + const f = module.addFunction(prefix + "_neg"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_neg", x0, r0), c.call(f1mPrefix + "_neg", x1, r1)); + } + function buildConjugate() { + const f = module.addFunction(prefix + "_conjugate"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_copy", x0, r0), c.call(f1mPrefix + "_neg", x1, r1)); + } + function buildIsNegative() { + const f = module.addFunction(prefix + "_isNegative"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + f.addCode(c.if(c.call(f1mPrefix + "_isZero", x1), c.ret(c.call(f1mPrefix + "_isNegative", x0))), c.ret(c.call(f1mPrefix + "_isNegative", x1))); + } + function buildMul() { + const f = module.addFunction(prefix + "_mul"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const y0 = c.getLocal("y"); + const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const A = c.i32_const(module.alloc(f1n8)); + const B = c.i32_const(module.alloc(f1n8)); + const C = c.i32_const(module.alloc(f1n8)); + const D = c.i32_const(module.alloc(f1n8)); + f.addCode(c.call(f1mPrefix + "_mul", x0, y0, A), c.call(f1mPrefix + "_mul", x1, y1, B), c.call(f1mPrefix + "_add", x0, x1, C), c.call(f1mPrefix + "_add", y0, y1, D), c.call(f1mPrefix + "_mul", C, D, C), c.call(mulNonResidueFn, B, r0), c.call(f1mPrefix + "_add", A, r0, r0), c.call(f1mPrefix + "_add", A, B, r1), c.call(f1mPrefix + "_sub", C, r1, r1)); + } + function buildMul1() { + const f = module.addFunction(prefix + "_mul1"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const y = c.getLocal("y"); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_mul", x0, y, r0), c.call(f1mPrefix + "_mul", x1, y, r1)); + } + function buildSquare() { + const f = module.addFunction(prefix + "_square"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const AB = c.i32_const(module.alloc(f1n8)); + const APB = c.i32_const(module.alloc(f1n8)); + const APNB = c.i32_const(module.alloc(f1n8)); + const ABPNAB = c.i32_const(module.alloc(f1n8)); + f.addCode(c.call(f1mPrefix + "_mul", x0, x1, AB), c.call(f1mPrefix + "_add", x0, x1, APB), c.call(mulNonResidueFn, x1, APNB), c.call(f1mPrefix + "_add", x0, APNB, APNB), c.call(mulNonResidueFn, AB, ABPNAB), c.call(f1mPrefix + "_add", ABPNAB, AB, ABPNAB), c.call(f1mPrefix + "_mul", APB, APNB, r0), c.call(f1mPrefix + "_sub", r0, ABPNAB, r0), c.call(f1mPrefix + "_add", AB, AB, r1)); + } + function buildToMontgomery() { + const f = module.addFunction(prefix + "_toMontgomery"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_toMontgomery", x0, r0), c.call(f1mPrefix + "_toMontgomery", x1, r1)); + } + function buildFromMontgomery() { + const f = module.addFunction(prefix + "_fromMontgomery"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_fromMontgomery", x0, r0), c.call(f1mPrefix + "_fromMontgomery", x1, r1)); + } + function buildCopy() { + const f = module.addFunction(prefix + "_copy"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_copy", x0, r0), c.call(f1mPrefix + "_copy", x1, r1)); + } + function buildZero() { + const f = module.addFunction(prefix + "_zero"); + f.addParam("x", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_zero", x0), c.call(f1mPrefix + "_zero", x1)); + } + function buildOne() { + const f = module.addFunction(prefix + "_one"); + f.addParam("x", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + f.addCode(c.call(f1mPrefix + "_one", x0), c.call(f1mPrefix + "_zero", x1)); + } + function buildEq() { + const f = module.addFunction(prefix + "_eq"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const y0 = c.getLocal("y"); + const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); + f.addCode(c.i32_and(c.call(f1mPrefix + "_eq", x0, y0), c.call(f1mPrefix + "_eq", x1, y1))); + } + function buildIsZero() { + const f = module.addFunction(prefix + "_isZero"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + f.addCode(c.i32_and(c.call(f1mPrefix + "_isZero", x0), c.call(f1mPrefix + "_isZero", x1))); + } + function buildInverse() { + const f = module.addFunction(prefix + "_inverse"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const t0 = c.i32_const(module.alloc(f1n8)); + const t1 = c.i32_const(module.alloc(f1n8)); + const t2 = c.i32_const(module.alloc(f1n8)); + const t3 = c.i32_const(module.alloc(f1n8)); + f.addCode(c.call(f1mPrefix + "_square", x0, t0), c.call(f1mPrefix + "_square", x1, t1), c.call(mulNonResidueFn, t1, t2), c.call(f1mPrefix + "_sub", t0, t2, t2), c.call(f1mPrefix + "_inverse", t2, t3), c.call(f1mPrefix + "_mul", x0, t3, r0), c.call(f1mPrefix + "_mul", x1, t3, r1), c.call(f1mPrefix + "_neg", r1, r1)); + } + function buildSign() { + const f = module.addFunction(prefix + "_sign"); + f.addParam("x", "i32"); + f.addLocal("s", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + f.addCode(c.setLocal("s", c.call(f1mPrefix + "_sign", x1)), c.if(c.getLocal("s"), c.ret(c.getLocal("s"))), c.ret(c.call(f1mPrefix + "_sign", x0))); + } + function buildIsOne() { + const f = module.addFunction(prefix + "_isOne"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + f.addCode(c.ret(c.i32_and(c.call(f1mPrefix + "_isOne", x0), c.call(f1mPrefix + "_isZero", x1)))); + } + function buildSqrt() { + const f = module.addFunction(prefix + "_sqrt"); + f.addParam("a", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const e34 = c.i32_const(module.alloc(bigInt2BytesLE((BigInt(q || 0) - 3n) / 4n, f1n8))); + const e12 = c.i32_const(module.alloc(bigInt2BytesLE((BigInt(q || 0) - 1n) / 2n, f1n8))); + const a = c.getLocal("a"); + const a1 = c.i32_const(module.alloc(f1n8 * 2)); + const alpha = c.i32_const(module.alloc(f1n8 * 2)); + const a0 = c.i32_const(module.alloc(f1n8 * 2)); + const pn1 = module.alloc(f1n8 * 2); + const n1 = c.i32_const(pn1); + const n1a = c.i32_const(pn1); + const n1b = c.i32_const(pn1 + f1n8); + const x0 = c.i32_const(module.alloc(f1n8 * 2)); + const b = c.i32_const(module.alloc(f1n8 * 2)); + f.addCode(c.call(prefix + "_one", n1), c.call(prefix + "_neg", n1, n1), c.call(prefix + "_exp", a, e34, c.i32_const(f1n8), a1), c.call(prefix + "_square", a1, alpha), c.call(prefix + "_mul", a, alpha, alpha), c.call(prefix + "_conjugate", alpha, a0), c.call(prefix + "_mul", a0, alpha, a0), c.if(c.call(prefix + "_eq", a0, n1), c.unreachable()), c.call(prefix + "_mul", a1, a, x0), c.if(c.call(prefix + "_eq", alpha, n1), [ + ...c.call(f1mPrefix + "_zero", n1a), + ...c.call(f1mPrefix + "_one", n1b), + ...c.call(prefix + "_mul", n1, x0, c.getLocal("pr")) + ], [ + ...c.call(prefix + "_one", b), + ...c.call(prefix + "_add", b, alpha, b), + ...c.call(prefix + "_exp", b, e12, c.i32_const(f1n8), b), + ...c.call(prefix + "_mul", b, x0, c.getLocal("pr")) + ])); + } + function buildIsSquare() { + const f = module.addFunction(prefix + "_isSquare"); + f.addParam("a", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const e34 = c.i32_const(module.alloc(bigInt2BytesLE((BigInt(q || 0) - 3n) / 4n, f1n8))); + const a = c.getLocal("a"); + const a1 = c.i32_const(module.alloc(f1n8 * 2)); + const alpha = c.i32_const(module.alloc(f1n8 * 2)); + const a0 = c.i32_const(module.alloc(f1n8 * 2)); + const pn1 = module.alloc(f1n8 * 2); + const n1 = c.i32_const(pn1); + f.addCode(c.call(prefix + "_one", n1), c.call(prefix + "_neg", n1, n1), c.call(prefix + "_exp", a, e34, c.i32_const(f1n8), a1), c.call(prefix + "_square", a1, alpha), c.call(prefix + "_mul", a, alpha, alpha), c.call(prefix + "_conjugate", alpha, a0), c.call(prefix + "_mul", a0, alpha, a0), c.if(c.call(prefix + "_eq", a0, n1), c.ret(c.i32_const(0))), c.ret(c.i32_const(1))); + } + buildIsZero(); + buildIsOne(); + buildZero(); + buildOne(); + buildCopy(); + buildMul(); + buildMul1(); + buildSquare(); + buildAdd(); + buildSub(); + buildNeg(); + buildConjugate(); + buildToMontgomery(); + buildFromMontgomery(); + buildEq(); + buildInverse(); + buildTimesScalar$2(); + buildSign(); + buildIsNegative(); + module.exportFunction(prefix + "_isZero"); + module.exportFunction(prefix + "_isOne"); + module.exportFunction(prefix + "_zero"); + module.exportFunction(prefix + "_one"); + module.exportFunction(prefix + "_copy"); + module.exportFunction(prefix + "_mul"); + module.exportFunction(prefix + "_mul1"); + module.exportFunction(prefix + "_square"); + module.exportFunction(prefix + "_add"); + module.exportFunction(prefix + "_sub"); + module.exportFunction(prefix + "_neg"); + module.exportFunction(prefix + "_sign"); + module.exportFunction(prefix + "_conjugate"); + module.exportFunction(prefix + "_fromMontgomery"); + module.exportFunction(prefix + "_toMontgomery"); + module.exportFunction(prefix + "_eq"); + module.exportFunction(prefix + "_inverse"); + build_batchinverse_default(module, prefix); + buildTimesScalar(module, prefix + "_exp", f1n8 * 2, prefix + "_mul", prefix + "_square", prefix + "_copy", prefix + "_one"); + buildSqrt(); + buildIsSquare(); + module.exportFunction(prefix + "_exp"); + module.exportFunction(prefix + "_timesScalar"); + module.exportFunction(prefix + "_batchInverse"); + module.exportFunction(prefix + "_sqrt"); + module.exportFunction(prefix + "_isSquare"); + module.exportFunction(prefix + "_isNegative"); + return prefix; +} +//#endregion +//#region src/build_f3m.js +function buildF3m(module, mulNonResidueFn, prefix, f1mPrefix) { + if (module.modules[prefix]) return prefix; + const f1n8 = module.modules[f1mPrefix].n64 * 8; + module.modules[prefix] = { n64: module.modules[f1mPrefix].n64 * 3 }; + function buildAdd() { + const f = module.addFunction(prefix + "_add"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const y0 = c.getLocal("y"); + const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); + const y2 = c.i32_add(c.getLocal("y"), c.i32_const(2 * f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f1n8)); + f.addCode(c.call(f1mPrefix + "_add", x0, y0, r0), c.call(f1mPrefix + "_add", x1, y1, r1), c.call(f1mPrefix + "_add", x2, y2, r2)); + } + function buildTimesScalar$1() { + const f = module.addFunction(prefix + "_timesScalar"); + f.addParam("x", "i32"); + f.addParam("scalar", "i32"); + f.addParam("scalarLen", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f1n8)); + f.addCode(c.call(f1mPrefix + "_timesScalar", x0, c.getLocal("scalar"), c.getLocal("scalarLen"), r0), c.call(f1mPrefix + "_timesScalar", x1, c.getLocal("scalar"), c.getLocal("scalarLen"), r1), c.call(f1mPrefix + "_timesScalar", x2, c.getLocal("scalar"), c.getLocal("scalarLen"), r2)); + } + function buildSub() { + const f = module.addFunction(prefix + "_sub"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const y0 = c.getLocal("y"); + const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); + const y2 = c.i32_add(c.getLocal("y"), c.i32_const(2 * f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f1n8)); + f.addCode(c.call(f1mPrefix + "_sub", x0, y0, r0), c.call(f1mPrefix + "_sub", x1, y1, r1), c.call(f1mPrefix + "_sub", x2, y2, r2)); + } + function buildNeg() { + const f = module.addFunction(prefix + "_neg"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f1n8)); + f.addCode(c.call(f1mPrefix + "_neg", x0, r0), c.call(f1mPrefix + "_neg", x1, r1), c.call(f1mPrefix + "_neg", x2, r2)); + } + function buildIsNegative() { + const f = module.addFunction(prefix + "_isNegative"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + f.addCode(c.if(c.call(f1mPrefix + "_isZero", x2), c.if(c.call(f1mPrefix + "_isZero", x1), c.ret(c.call(f1mPrefix + "_isNegative", x0)), c.ret(c.call(f1mPrefix + "_isNegative", x1)))), c.ret(c.call(f1mPrefix + "_isNegative", x2))); + } + function buildMul() { + const f = module.addFunction(prefix + "_mul"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.addParam("r", "i32"); + const cd = f.getCodeBuilder(); + const a = cd.getLocal("x"); + const b = cd.i32_add(cd.getLocal("x"), cd.i32_const(f1n8)); + const c = cd.i32_add(cd.getLocal("x"), cd.i32_const(2 * f1n8)); + const A = cd.getLocal("y"); + const B = cd.i32_add(cd.getLocal("y"), cd.i32_const(f1n8)); + const C = cd.i32_add(cd.getLocal("y"), cd.i32_const(2 * f1n8)); + const r0 = cd.getLocal("r"); + const r1 = cd.i32_add(cd.getLocal("r"), cd.i32_const(f1n8)); + const r2 = cd.i32_add(cd.getLocal("r"), cd.i32_const(2 * f1n8)); + const aA = cd.i32_const(module.alloc(f1n8)); + const bB = cd.i32_const(module.alloc(f1n8)); + const cC = cd.i32_const(module.alloc(f1n8)); + const a_b = cd.i32_const(module.alloc(f1n8)); + const A_B = cd.i32_const(module.alloc(f1n8)); + const a_c = cd.i32_const(module.alloc(f1n8)); + const A_C = cd.i32_const(module.alloc(f1n8)); + const b_c = cd.i32_const(module.alloc(f1n8)); + const B_C = cd.i32_const(module.alloc(f1n8)); + const aA_bB = cd.i32_const(module.alloc(f1n8)); + const aA_cC = cd.i32_const(module.alloc(f1n8)); + const bB_cC = cd.i32_const(module.alloc(f1n8)); + const AUX = cd.i32_const(module.alloc(f1n8)); + f.addCode(cd.call(f1mPrefix + "_mul", a, A, aA), cd.call(f1mPrefix + "_mul", b, B, bB), cd.call(f1mPrefix + "_mul", c, C, cC), cd.call(f1mPrefix + "_add", a, b, a_b), cd.call(f1mPrefix + "_add", A, B, A_B), cd.call(f1mPrefix + "_add", a, c, a_c), cd.call(f1mPrefix + "_add", A, C, A_C), cd.call(f1mPrefix + "_add", b, c, b_c), cd.call(f1mPrefix + "_add", B, C, B_C), cd.call(f1mPrefix + "_add", aA, bB, aA_bB), cd.call(f1mPrefix + "_add", aA, cC, aA_cC), cd.call(f1mPrefix + "_add", bB, cC, bB_cC), cd.call(f1mPrefix + "_mul", b_c, B_C, r0), cd.call(f1mPrefix + "_sub", r0, bB_cC, r0), cd.call(mulNonResidueFn, r0, r0), cd.call(f1mPrefix + "_add", aA, r0, r0), cd.call(f1mPrefix + "_mul", a_b, A_B, r1), cd.call(f1mPrefix + "_sub", r1, aA_bB, r1), cd.call(mulNonResidueFn, cC, AUX), cd.call(f1mPrefix + "_add", r1, AUX, r1), cd.call(f1mPrefix + "_mul", a_c, A_C, r2), cd.call(f1mPrefix + "_sub", r2, aA_cC, r2), cd.call(f1mPrefix + "_add", r2, bB, r2)); + } + function buildSquare() { + const f = module.addFunction(prefix + "_square"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const A = c.getLocal("x"); + const B = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const C = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f1n8)); + const s0 = c.i32_const(module.alloc(f1n8)); + const ab = c.i32_const(module.alloc(f1n8)); + const s1 = c.i32_const(module.alloc(f1n8)); + const s2 = c.i32_const(module.alloc(f1n8)); + const bc = c.i32_const(module.alloc(f1n8)); + const s3 = c.i32_const(module.alloc(f1n8)); + const s4 = c.i32_const(module.alloc(f1n8)); + f.addCode(c.call(f1mPrefix + "_square", A, s0), c.call(f1mPrefix + "_mul", A, B, ab), c.call(f1mPrefix + "_add", ab, ab, s1), c.call(f1mPrefix + "_sub", A, B, s2), c.call(f1mPrefix + "_add", s2, C, s2), c.call(f1mPrefix + "_square", s2, s2), c.call(f1mPrefix + "_mul", B, C, bc), c.call(f1mPrefix + "_add", bc, bc, s3), c.call(f1mPrefix + "_square", C, s4), c.call(mulNonResidueFn, s3, r0), c.call(f1mPrefix + "_add", s0, r0, r0), c.call(mulNonResidueFn, s4, r1), c.call(f1mPrefix + "_add", s1, r1, r1), c.call(f1mPrefix + "_add", s0, s4, r2), c.call(f1mPrefix + "_sub", s3, r2, r2), c.call(f1mPrefix + "_add", s2, r2, r2), c.call(f1mPrefix + "_add", s1, r2, r2)); + } + function buildToMontgomery() { + const f = module.addFunction(prefix + "_toMontgomery"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f1n8)); + f.addCode(c.call(f1mPrefix + "_toMontgomery", x0, r0), c.call(f1mPrefix + "_toMontgomery", x1, r1), c.call(f1mPrefix + "_toMontgomery", x2, r2)); + } + function buildFromMontgomery() { + const f = module.addFunction(prefix + "_fromMontgomery"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f1n8)); + f.addCode(c.call(f1mPrefix + "_fromMontgomery", x0, r0), c.call(f1mPrefix + "_fromMontgomery", x1, r1), c.call(f1mPrefix + "_fromMontgomery", x2, r2)); + } + function buildCopy() { + const f = module.addFunction(prefix + "_copy"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f1n8)); + f.addCode(c.call(f1mPrefix + "_copy", x0, r0), c.call(f1mPrefix + "_copy", x1, r1), c.call(f1mPrefix + "_copy", x2, r2)); + } + function buildZero() { + const f = module.addFunction(prefix + "_zero"); + f.addParam("x", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + f.addCode(c.call(f1mPrefix + "_zero", x0), c.call(f1mPrefix + "_zero", x1), c.call(f1mPrefix + "_zero", x2)); + } + function buildOne() { + const f = module.addFunction(prefix + "_one"); + f.addParam("x", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + f.addCode(c.call(f1mPrefix + "_one", x0), c.call(f1mPrefix + "_zero", x1), c.call(f1mPrefix + "_zero", x2)); + } + function buildEq() { + const f = module.addFunction(prefix + "_eq"); + f.addParam("x", "i32"); + f.addParam("y", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const y0 = c.getLocal("y"); + const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); + const y2 = c.i32_add(c.getLocal("y"), c.i32_const(2 * f1n8)); + f.addCode(c.i32_and(c.i32_and(c.call(f1mPrefix + "_eq", x0, y0), c.call(f1mPrefix + "_eq", x1, y1)), c.call(f1mPrefix + "_eq", x2, y2))); + } + function buildIsZero() { + const f = module.addFunction(prefix + "_isZero"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + f.addCode(c.i32_and(c.i32_and(c.call(f1mPrefix + "_isZero", x0), c.call(f1mPrefix + "_isZero", x1)), c.call(f1mPrefix + "_isZero", x2))); + } + function buildInverse() { + const f = module.addFunction(prefix + "_inverse"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + const r0 = c.getLocal("r"); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f1n8)); + const t0 = c.i32_const(module.alloc(f1n8)); + const t1 = c.i32_const(module.alloc(f1n8)); + const t2 = c.i32_const(module.alloc(f1n8)); + const t3 = c.i32_const(module.alloc(f1n8)); + const t4 = c.i32_const(module.alloc(f1n8)); + const t5 = c.i32_const(module.alloc(f1n8)); + const c0 = c.i32_const(module.alloc(f1n8)); + const c1 = c.i32_const(module.alloc(f1n8)); + const c2 = c.i32_const(module.alloc(f1n8)); + const t6 = c.i32_const(module.alloc(f1n8)); + const AUX = c.i32_const(module.alloc(f1n8)); + f.addCode(c.call(f1mPrefix + "_square", x0, t0), c.call(f1mPrefix + "_square", x1, t1), c.call(f1mPrefix + "_square", x2, t2), c.call(f1mPrefix + "_mul", x0, x1, t3), c.call(f1mPrefix + "_mul", x0, x2, t4), c.call(f1mPrefix + "_mul", x1, x2, t5), c.call(mulNonResidueFn, t5, c0), c.call(f1mPrefix + "_sub", t0, c0, c0), c.call(mulNonResidueFn, t2, c1), c.call(f1mPrefix + "_sub", c1, t3, c1), c.call(f1mPrefix + "_sub", t1, t4, c2), c.call(f1mPrefix + "_mul", x2, c1, t6), c.call(f1mPrefix + "_mul", x1, c2, AUX), c.call(f1mPrefix + "_add", t6, AUX, t6), c.call(mulNonResidueFn, t6, t6), c.call(f1mPrefix + "_mul", x0, c0, AUX), c.call(f1mPrefix + "_add", AUX, t6, t6), c.call(f1mPrefix + "_inverse", t6, t6), c.call(f1mPrefix + "_mul", t6, c0, r0), c.call(f1mPrefix + "_mul", t6, c1, r1), c.call(f1mPrefix + "_mul", t6, c2, r2)); + } + function buildSign() { + const f = module.addFunction(prefix + "_sign"); + f.addParam("x", "i32"); + f.addLocal("s", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f1n8)); + f.addCode(c.setLocal("s", c.call(f1mPrefix + "_sign", x2)), c.if(c.getLocal("s"), c.ret(c.getLocal("s"))), c.setLocal("s", c.call(f1mPrefix + "_sign", x1)), c.if(c.getLocal("s"), c.ret(c.getLocal("s"))), c.ret(c.call(f1mPrefix + "_sign", x0))); + } + function buildIsOne() { + const f = module.addFunction(prefix + "_isOne"); + f.addParam("x", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8 * 2)); + f.addCode(c.ret(c.i32_and(c.i32_and(c.call(f1mPrefix + "_isOne", x0), c.call(f1mPrefix + "_isZero", x1)), c.call(f1mPrefix + "_isZero", x2)))); + } + buildIsZero(); + buildIsOne(); + buildZero(); + buildOne(); + buildCopy(); + buildMul(); + buildSquare(); + buildAdd(); + buildSub(); + buildNeg(); + buildSign(); + buildToMontgomery(); + buildFromMontgomery(); + buildEq(); + buildInverse(); + buildTimesScalar$1(); + buildIsNegative(); + module.exportFunction(prefix + "_isZero"); + module.exportFunction(prefix + "_isOne"); + module.exportFunction(prefix + "_zero"); + module.exportFunction(prefix + "_one"); + module.exportFunction(prefix + "_copy"); + module.exportFunction(prefix + "_mul"); + module.exportFunction(prefix + "_square"); + module.exportFunction(prefix + "_add"); + module.exportFunction(prefix + "_sub"); + module.exportFunction(prefix + "_neg"); + module.exportFunction(prefix + "_sign"); + module.exportFunction(prefix + "_fromMontgomery"); + module.exportFunction(prefix + "_toMontgomery"); + module.exportFunction(prefix + "_eq"); + module.exportFunction(prefix + "_inverse"); + build_batchinverse_default(module, prefix); + buildTimesScalar(module, prefix + "_exp", f1n8 * 3, prefix + "_mul", prefix + "_square", prefix + "_copy", prefix + "_one"); + module.exportFunction(prefix + "_exp"); + module.exportFunction(prefix + "_timesScalar"); + module.exportFunction(prefix + "_batchInverse"); + module.exportFunction(prefix + "_isNegative"); + return prefix; +} +//#endregion +//#region src/build_timesscalarnaf.js +function buildTimesScalarNAF(module, fnName, elementLen, opAB, opAA, opAmB, opCopy, opInit) { + const f = module.addFunction(fnName); + f.addParam("base", "i32"); + f.addParam("scalar", "i32"); + f.addParam("scalarLength", "i32"); + f.addParam("r", "i32"); + f.addLocal("old0", "i32"); + f.addLocal("nbits", "i32"); + f.addLocal("i", "i32"); + f.addLocal("last", "i32"); + f.addLocal("cur", "i32"); + f.addLocal("carry", "i32"); + f.addLocal("p", "i32"); + const c = f.getCodeBuilder(); + const aux = c.i32_const(module.alloc(elementLen)); + function getBit(IDX) { + return c.i32_and(c.i32_shr_u(c.i32_load(c.i32_add(c.getLocal("scalar"), c.i32_and(c.i32_shr_u(IDX, c.i32_const(3)), c.i32_const(4294967292)))), c.i32_and(IDX, c.i32_const(31))), c.i32_const(1)); + } + function pushBit(b) { + return [...c.i32_store8(c.getLocal("p"), c.i32_const(b)), ...c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(1)))]; + } + f.addCode(c.if(c.i32_eqz(c.getLocal("scalarLength")), [...c.call(opInit, c.getLocal("r")), ...c.ret([])]), c.setLocal("nbits", c.i32_shl(c.getLocal("scalarLength"), c.i32_const(3))), c.setLocal("old0", c.i32_load(c.i32_const(0))), c.setLocal("p", c.getLocal("old0")), c.i32_store(c.i32_const(0), c.i32_and(c.i32_add(c.i32_add(c.getLocal("old0"), c.i32_const(32)), c.getLocal("nbits")), c.i32_const(4294967288))), c.setLocal("i", c.i32_const(1)), c.setLocal("last", getBit(c.i32_const(0))), c.setLocal("carry", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("nbits"))), c.setLocal("cur", getBit(c.getLocal("i"))), c.if(c.getLocal("last"), c.if(c.getLocal("cur"), c.if(c.getLocal("carry"), [ + ...c.setLocal("last", c.i32_const(0)), + ...c.setLocal("carry", c.i32_const(1)), + ...pushBit(1) + ], [ + ...c.setLocal("last", c.i32_const(0)), + ...c.setLocal("carry", c.i32_const(1)), + ...pushBit(255) + ]), c.if(c.getLocal("carry"), [ + ...c.setLocal("last", c.i32_const(0)), + ...c.setLocal("carry", c.i32_const(1)), + ...pushBit(255) + ], [ + ...c.setLocal("last", c.i32_const(0)), + ...c.setLocal("carry", c.i32_const(0)), + ...pushBit(1) + ])), c.if(c.getLocal("cur"), c.if(c.getLocal("carry"), [ + ...c.setLocal("last", c.i32_const(0)), + ...c.setLocal("carry", c.i32_const(1)), + ...pushBit(0) + ], [ + ...c.setLocal("last", c.i32_const(1)), + ...c.setLocal("carry", c.i32_const(0)), + ...pushBit(0) + ]), c.if(c.getLocal("carry"), [ + ...c.setLocal("last", c.i32_const(1)), + ...c.setLocal("carry", c.i32_const(0)), + ...pushBit(0) + ], [ + ...c.setLocal("last", c.i32_const(0)), + ...c.setLocal("carry", c.i32_const(0)), + ...pushBit(0) + ]))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0))), c.if(c.getLocal("last"), c.if(c.getLocal("carry"), [ + ...pushBit(255), + ...pushBit(0), + ...pushBit(1) + ], [...pushBit(1)]), c.if(c.getLocal("carry"), [...pushBit(0), ...pushBit(1)])), c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), c.call(opCopy, c.getLocal("base"), aux), c.call(opInit, c.getLocal("r")), c.block(c.loop(c.call(opAA, c.getLocal("r"), c.getLocal("r")), c.setLocal("cur", c.i32_load8_u(c.getLocal("p"))), c.if(c.getLocal("cur"), c.if(c.i32_eq(c.getLocal("cur"), c.i32_const(1)), c.call(opAB, c.getLocal("r"), aux, c.getLocal("r")), c.call(opAmB, c.getLocal("r"), aux, c.getLocal("r")))), c.br_if(1, c.i32_eq(c.getLocal("old0"), c.getLocal("p"))), c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), c.br(0))), c.i32_store(c.i32_const(0), c.getLocal("old0"))); +} +//#endregion +//#region src/build_multiexp.js +function buildMultiexp(module, prefix, fnName, opAdd, opSub, n8b) { + const n8g = module.modules[prefix].n64 * 8; + const accReduce = module.alloc(n8g); + const aux = module.alloc(n8g); + function buildGetChunk() { + const f = module.addFunction(fnName + "_getChunk"); + f.addParam("pScalar", "i32"); + f.addParam("scalarSize", "i32"); + f.addParam("startBit", "i32"); + f.addParam("chunkSize", "i32"); + f.addLocal("bitsToEnd", "i32"); + f.addLocal("mask", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("bitsToEnd", c.i32_sub(c.i32_mul(c.getLocal("scalarSize"), c.i32_const(8)), c.getLocal("startBit"))), c.if(c.i32_gt_s(c.getLocal("chunkSize"), c.getLocal("bitsToEnd")), c.setLocal("mask", c.i32_sub(c.i32_shl(c.i32_const(1), c.getLocal("bitsToEnd")), c.i32_const(1))), c.setLocal("mask", c.i32_sub(c.i32_shl(c.i32_const(1), c.getLocal("chunkSize")), c.i32_const(1)))), c.i32_and(c.i32_shr_u(c.i32_load(c.i32_add(c.getLocal("pScalar"), c.i32_shr_u(c.getLocal("startBit"), c.i32_const(3))), 0, 0), c.i32_and(c.getLocal("startBit"), c.i32_const(7))), c.getLocal("mask"))); + } + function buildRecode() { + const f = module.addFunction(fnName + "_recode"); + f.addParam("pScalars", "i32"); + f.addParam("scalarSize", "i32"); + f.addParam("n", "i32"); + f.addParam("chunkSize", "i32"); + f.addParam("nChunks", "i32"); + f.addParam("pCarry", "i32"); + f.addLocal("i", "i32"); + f.addLocal("j", "i32"); + f.addLocal("nWin", "i32"); + f.addLocal("itScalar", "i32"); + f.addLocal("carry", "i32"); + f.addLocal("raw", "i32"); + f.addLocal("half", "i32"); + f.addLocal("scalarBits", "i32"); + f.addLocal("startBit", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("half", c.i32_shl(c.i32_const(1), c.i32_sub(c.getLocal("chunkSize"), c.i32_const(1)))), c.setLocal("scalarBits", c.i32_shl(c.getLocal("scalarSize"), c.i32_const(3))), c.setLocal("nWin", c.i32_add(c.getLocal("nChunks"), c.i32_const(1))), c.setLocal("itScalar", c.getLocal("pScalars")), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.setLocal("carry", c.i32_const(0)), c.setLocal("j", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("nWin"))), c.i32_store8(c.i32_add(c.getLocal("pCarry"), c.i32_add(c.i32_mul(c.getLocal("j"), c.getLocal("n")), c.getLocal("i"))), c.getLocal("carry")), c.setLocal("startBit", c.i32_mul(c.getLocal("j"), c.getLocal("chunkSize"))), c.if(c.i32_lt_s(c.getLocal("startBit"), c.getLocal("scalarBits")), c.setLocal("raw", c.call(fnName + "_getChunk", c.getLocal("itScalar"), c.getLocal("scalarSize"), c.getLocal("startBit"), c.getLocal("chunkSize"))), c.setLocal("raw", c.i32_const(0))), c.if(c.i32_ge_s(c.i32_add(c.getLocal("raw"), c.getLocal("carry")), c.getLocal("half")), c.setLocal("carry", c.i32_const(1)), c.setLocal("carry", c.i32_const(0))), c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), c.br(0))), c.setLocal("itScalar", c.i32_add(c.getLocal("itScalar"), c.getLocal("scalarSize"))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + function buildMutiexpChunk() { + const f = module.addFunction(fnName + "_chunk"); + f.addParam("pBases", "i32"); + f.addParam("pScalars", "i32"); + f.addParam("scalarSize", "i32"); + f.addParam("pCarry", "i32"); + f.addParam("n", "i32"); + f.addParam("windowIdx", "i32"); + f.addParam("chunkSize", "i32"); + f.addParam("pr", "i32"); + f.addLocal("itBase", "i32"); + f.addLocal("itScalar", "i32"); + f.addLocal("itCarry", "i32"); + f.addLocal("i", "i32"); + f.addLocal("j", "i32"); + f.addLocal("nTable", "i32"); + f.addLocal("full", "i32"); + f.addLocal("scalarBits", "i32"); + f.addLocal("startBit", "i32"); + f.addLocal("pTable", "i32"); + f.addLocal("raw", "i32"); + f.addLocal("d", "i32"); + f.addLocal("pIdxTable", "i32"); + f.addLocal("itB", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.if(c.i32_eqz(c.getLocal("n")), [...c.call(prefix + "_zero", c.getLocal("pr")), ...c.ret([])]), c.setLocal("nTable", c.i32_shl(c.i32_const(1), c.i32_sub(c.getLocal("chunkSize"), c.i32_const(1)))), c.setLocal("full", c.i32_shl(c.i32_const(1), c.getLocal("chunkSize"))), c.setLocal("scalarBits", c.i32_shl(c.getLocal("scalarSize"), c.i32_const(3))), c.setLocal("startBit", c.i32_mul(c.getLocal("windowIdx"), c.getLocal("chunkSize"))), c.setLocal("pTable", c.i32_load(c.i32_const(0))), c.i32_store(c.i32_const(0), c.i32_add(c.getLocal("pTable"), c.i32_mul(c.getLocal("nTable"), c.i32_const(n8g)))), c.setLocal("j", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("nTable"))), c.call(prefix + "_zero", c.i32_add(c.getLocal("pTable"), c.i32_mul(c.getLocal("j"), c.i32_const(n8g)))), c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), c.br(0))), c.setLocal("itBase", c.getLocal("pBases")), c.setLocal("itScalar", c.getLocal("pScalars")), c.setLocal("itCarry", c.i32_add(c.getLocal("pCarry"), c.i32_mul(c.getLocal("windowIdx"), c.getLocal("n")))), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.if(c.i32_lt_s(c.getLocal("startBit"), c.getLocal("scalarBits")), c.setLocal("raw", c.call(fnName + "_getChunk", c.getLocal("itScalar"), c.getLocal("scalarSize"), c.getLocal("startBit"), c.getLocal("chunkSize"))), c.setLocal("raw", c.i32_const(0))), c.setLocal("d", c.i32_add(c.getLocal("raw"), c.i32_load8_u(c.getLocal("itCarry")))), c.if(c.i32_ge_s(c.getLocal("d"), c.getLocal("nTable")), c.setLocal("d", c.i32_sub(c.getLocal("d"), c.getLocal("full")))), c.if(c.i32_gt_s(c.getLocal("d"), c.i32_const(0)), [...c.setLocal("pIdxTable", c.i32_add(c.getLocal("pTable"), c.i32_mul(c.i32_sub(c.getLocal("d"), c.i32_const(1)), c.i32_const(n8g)))), ...c.call(opAdd, c.getLocal("pIdxTable"), c.getLocal("itBase"), c.getLocal("pIdxTable"))], c.if(c.i32_lt_s(c.getLocal("d"), c.i32_const(0)), [...c.setLocal("pIdxTable", c.i32_add(c.getLocal("pTable"), c.i32_mul(c.i32_sub(c.i32_const(-1), c.getLocal("d")), c.i32_const(n8g)))), ...c.call(opSub, c.getLocal("pIdxTable"), c.getLocal("itBase"), c.getLocal("pIdxTable"))])), c.setLocal("itScalar", c.i32_add(c.getLocal("itScalar"), c.getLocal("scalarSize"))), c.setLocal("itCarry", c.i32_add(c.getLocal("itCarry"), c.i32_const(1))), c.setLocal("itBase", c.i32_add(c.getLocal("itBase"), c.i32_const(n8b))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0))), c.setLocal("itB", c.i32_add(c.getLocal("pTable"), c.i32_mul(c.i32_sub(c.getLocal("nTable"), c.i32_const(1)), c.i32_const(n8g)))), c.call(prefix + "_copy", c.getLocal("itB"), c.getLocal("pr")), c.call(prefix + "_copy", c.getLocal("itB"), c.i32_const(accReduce)), c.setLocal("itB", c.i32_sub(c.getLocal("itB"), c.i32_const(n8g))), c.block(c.loop(c.br_if(1, c.i32_lt_u(c.getLocal("itB"), c.getLocal("pTable"))), c.call(prefix + "_add", c.i32_const(accReduce), c.getLocal("itB"), c.i32_const(accReduce)), c.call(prefix + "_add", c.getLocal("pr"), c.i32_const(accReduce), c.getLocal("pr")), c.setLocal("itB", c.i32_sub(c.getLocal("itB"), c.i32_const(n8g))), c.br(0))), c.i32_store(c.i32_const(0), c.getLocal("pTable"))); + } + function buildMultiexp() { + const f = module.addFunction(fnName); + f.addParam("pBases", "i32"); + f.addParam("pScalars", "i32"); + f.addParam("scalarSize", "i32"); + f.addParam("n", "i32"); + f.addParam("pr", "i32"); + f.addLocal("chunkSize", "i32"); + f.addLocal("nChunks", "i32"); + f.addLocal("nWin", "i32"); + f.addLocal("pCarry", "i32"); + f.addLocal("savedFree", "i32"); + f.addLocal("windowIdx", "i32"); + f.addLocal("j", "i32"); + const c = f.getCodeBuilder(); + const pTSizes = module.alloc([ + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 16, + 16, + 15, + 14, + 13, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 1, + 1, + 1 + ]); + f.addCode(c.call(prefix + "_zero", c.getLocal("pr")), c.if(c.i32_eqz(c.getLocal("n")), c.ret([])), c.setLocal("chunkSize", c.i32_load8_u(c.i32_clz(c.getLocal("n")), pTSizes)), c.if(c.i32_lt_s(c.getLocal("chunkSize"), c.i32_const(2)), c.setLocal("chunkSize", c.i32_const(2))), c.setLocal("nChunks", c.i32_add(c.i32_div_u(c.i32_sub(c.i32_shl(c.getLocal("scalarSize"), c.i32_const(3)), c.i32_const(1)), c.getLocal("chunkSize")), c.i32_const(1))), c.setLocal("nWin", c.i32_add(c.getLocal("nChunks"), c.i32_const(1))), c.setLocal("savedFree", c.i32_load(c.i32_const(0))), c.setLocal("pCarry", c.getLocal("savedFree")), c.i32_store(c.i32_const(0), c.i32_and(c.i32_add(c.i32_add(c.getLocal("savedFree"), c.i32_mul(c.getLocal("nWin"), c.getLocal("n"))), c.i32_const(3)), c.i32_const(-4))), c.call(fnName + "_recode", c.getLocal("pScalars"), c.getLocal("scalarSize"), c.getLocal("n"), c.getLocal("chunkSize"), c.getLocal("nChunks"), c.getLocal("pCarry")), c.setLocal("windowIdx", c.getLocal("nChunks")), c.block(c.loop(c.br_if(1, c.i32_lt_s(c.getLocal("windowIdx"), c.i32_const(0))), c.if(c.i32_eqz(c.call(prefix + "_isZero", c.getLocal("pr"))), [...c.setLocal("j", c.i32_const(0)), ...c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("chunkSize"))), c.call(prefix + "_double", c.getLocal("pr"), c.getLocal("pr")), c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), c.br(0)))]), c.call(fnName + "_chunk", c.getLocal("pBases"), c.getLocal("pScalars"), c.getLocal("scalarSize"), c.getLocal("pCarry"), c.getLocal("n"), c.getLocal("windowIdx"), c.getLocal("chunkSize"), c.i32_const(aux)), c.call(prefix + "_add", c.getLocal("pr"), c.i32_const(aux), c.getLocal("pr")), c.setLocal("windowIdx", c.i32_sub(c.getLocal("windowIdx"), c.i32_const(1))), c.br(0))), c.i32_store(c.i32_const(0), c.getLocal("savedFree"))); + } + buildGetChunk(); + buildRecode(); + buildMutiexpChunk(); + buildMultiexp(); + module.exportFunction(fnName); + module.exportFunction(fnName + "_chunk"); +} +//#endregion +//#region src/build_curve_jacobian_a0.js +function buildCurve(module, prefix, prefixField, pB) { + const n64 = module.modules[prefixField].n64; + const n8 = n64 * 8; + if (module.modules[prefix]) return prefix; + module.modules[prefix] = { n64: n64 * 3 }; + function buildIsZero() { + const f = module.addFunction(prefix + "_isZero"); + f.addParam("p1", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefixField + "_isZero", c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)))); + } + function buildIsZeroAffine() { + const f = module.addFunction(prefix + "_isZeroAffine"); + f.addParam("p1", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + f.addCode(c.i32_and(c.call(prefixField + "_isZero", c.getLocal("p1")), c.call(prefixField + "_isZero", c.i32_add(c.getLocal("p1"), c.i32_const(n8))))); + } + function buildCopy() { + const f = module.addFunction(prefix + "_copy"); + f.addParam("ps", "i32"); + f.addParam("pd", "i32"); + const c = f.getCodeBuilder(); + for (let i = 0; i < n64 * 3; i++) f.addCode(c.i64_store(c.getLocal("pd"), i * 8, c.i64_load(c.getLocal("ps"), i * 8))); + } + function buildCopyAffine() { + const f = module.addFunction(prefix + "_copyAffine"); + f.addParam("ps", "i32"); + f.addParam("pd", "i32"); + const c = f.getCodeBuilder(); + for (let i = 0; i < n64 * 2; i++) f.addCode(c.i64_store(c.getLocal("pd"), i * 8, c.i64_load(c.getLocal("ps"), i * 8))); + } + function buildZero() { + const f = module.addFunction(prefix + "_zero"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefixField + "_zero", c.getLocal("pr"))); + f.addCode(c.call(prefixField + "_one", c.i32_add(c.getLocal("pr"), c.i32_const(n8)))); + f.addCode(c.call(prefixField + "_zero", c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2)))); + } + function buildZeroAffine() { + const f = module.addFunction(prefix + "_zeroAffine"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefixField + "_zero", c.getLocal("pr"))); + f.addCode(c.call(prefixField + "_zero", c.i32_add(c.getLocal("pr"), c.i32_const(n8)))); + } + function buildEq() { + const f = module.addFunction(prefix + "_eq"); + f.addParam("p1", "i32"); + f.addParam("p2", "i32"); + f.setReturnType("i32"); + f.addLocal("z1", "i32"); + f.addLocal("z2", "i32"); + const c = f.getCodeBuilder(); + const x1 = c.getLocal("p1"); + const y1 = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + f.addCode(c.setLocal("z1", c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)))); + const z1 = c.getLocal("z1"); + const x2 = c.getLocal("p2"); + const y2 = c.i32_add(c.getLocal("p2"), c.i32_const(n8)); + f.addCode(c.setLocal("z2", c.i32_add(c.getLocal("p2"), c.i32_const(n8 * 2)))); + const z2 = c.getLocal("z2"); + const Z1Z1 = c.i32_const(module.alloc(n8)); + const Z2Z2 = c.i32_const(module.alloc(n8)); + const U1 = c.i32_const(module.alloc(n8)); + const U2 = c.i32_const(module.alloc(n8)); + const Z1_cubed = c.i32_const(module.alloc(n8)); + const Z2_cubed = c.i32_const(module.alloc(n8)); + const S1 = c.i32_const(module.alloc(n8)); + const S2 = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZero", c.getLocal("p1")), c.ret(c.call(prefix + "_isZero", c.getLocal("p2")))), c.if(c.call(prefix + "_isZero", c.getLocal("p2")), c.ret(c.i32_const(0))), c.if(c.call(prefixField + "_isOne", z1), c.ret(c.call(prefix + "_eqMixed", c.getLocal("p2"), c.getLocal("p1")))), c.if(c.call(prefixField + "_isOne", z2), c.ret(c.call(prefix + "_eqMixed", c.getLocal("p1"), c.getLocal("p2")))), c.call(prefixField + "_square", z1, Z1Z1), c.call(prefixField + "_square", z2, Z2Z2), c.call(prefixField + "_mul", x1, Z2Z2, U1), c.call(prefixField + "_mul", x2, Z1Z1, U2), c.call(prefixField + "_mul", z1, Z1Z1, Z1_cubed), c.call(prefixField + "_mul", z2, Z2Z2, Z2_cubed), c.call(prefixField + "_mul", y1, Z2_cubed, S1), c.call(prefixField + "_mul", y2, Z1_cubed, S2), c.if(c.call(prefixField + "_eq", U1, U2), c.if(c.call(prefixField + "_eq", S1, S2), c.ret(c.i32_const(1)))), c.ret(c.i32_const(0))); + } + function buildEqMixed() { + const f = module.addFunction(prefix + "_eqMixed"); + f.addParam("p1", "i32"); + f.addParam("p2", "i32"); + f.setReturnType("i32"); + f.addLocal("z1", "i32"); + const c = f.getCodeBuilder(); + const x1 = c.getLocal("p1"); + const y1 = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + f.addCode(c.setLocal("z1", c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)))); + const z1 = c.getLocal("z1"); + const x2 = c.getLocal("p2"); + const y2 = c.i32_add(c.getLocal("p2"), c.i32_const(n8)); + const Z1Z1 = c.i32_const(module.alloc(n8)); + const U2 = c.i32_const(module.alloc(n8)); + const Z1_cubed = c.i32_const(module.alloc(n8)); + const S2 = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZero", c.getLocal("p1")), c.ret(c.call(prefix + "_isZeroAffine", c.getLocal("p2")))), c.if(c.call(prefix + "_isZeroAffine", c.getLocal("p2")), c.ret(c.i32_const(0))), c.if(c.call(prefixField + "_isOne", z1), c.ret(c.call(prefix + "_eqAffine", c.getLocal("p1"), c.getLocal("p2")))), c.call(prefixField + "_square", z1, Z1Z1), c.call(prefixField + "_mul", x2, Z1Z1, U2), c.call(prefixField + "_mul", z1, Z1Z1, Z1_cubed), c.call(prefixField + "_mul", y2, Z1_cubed, S2), c.if(c.call(prefixField + "_eq", x1, U2), c.if(c.call(prefixField + "_eq", y1, S2), c.ret(c.i32_const(1)))), c.ret(c.i32_const(0))); + } + function buildDouble() { + const f = module.addFunction(prefix + "_double"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("p1"); + const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + const z = c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2)); + const A = c.i32_const(module.alloc(n8)); + const B = c.i32_const(module.alloc(n8)); + const C = c.i32_const(module.alloc(n8)); + const D = c.i32_const(module.alloc(n8)); + const E = c.i32_const(module.alloc(n8)); + const F = c.i32_const(module.alloc(n8)); + const G = c.i32_const(module.alloc(n8)); + const eightC = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZero", c.getLocal("p1")), [...c.call(prefix + "_copy", c.getLocal("p1"), c.getLocal("pr")), ...c.ret([])]), c.if(c.call(prefixField + "_isOne", z), [...c.ret(c.call(prefix + "_doubleAffine", c.getLocal("p1"), c.getLocal("pr"))), ...c.ret([])]), c.call(prefixField + "_square", x, A), c.call(prefixField + "_square", y, B), c.call(prefixField + "_square", B, C), c.call(prefixField + "_add", x, B, D), c.call(prefixField + "_square", D, D), c.call(prefixField + "_sub", D, A, D), c.call(prefixField + "_sub", D, C, D), c.call(prefixField + "_add", D, D, D), c.call(prefixField + "_add", A, A, E), c.call(prefixField + "_add", E, A, E), c.call(prefixField + "_square", E, F), c.call(prefixField + "_mul", y, z, G), c.call(prefixField + "_add", D, D, x3), c.call(prefixField + "_sub", F, x3, x3), c.call(prefixField + "_add", C, C, eightC), c.call(prefixField + "_add", eightC, eightC, eightC), c.call(prefixField + "_add", eightC, eightC, eightC), c.call(prefixField + "_sub", D, x3, y3), c.call(prefixField + "_mul", y3, E, y3), c.call(prefixField + "_sub", y3, eightC, y3), c.call(prefixField + "_add", G, G, z3)); + } + function buildDoubleAffine() { + const f = module.addFunction(prefix + "_doubleAffine"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("p1"); + const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2)); + const XX = c.i32_const(module.alloc(n8)); + const YY = c.i32_const(module.alloc(n8)); + const YYYY = c.i32_const(module.alloc(n8)); + const S = c.i32_const(module.alloc(n8)); + const M = c.i32_const(module.alloc(n8)); + const eightYYYY = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZeroAffine", c.getLocal("p1")), [...c.call(prefix + "_toJacobian", c.getLocal("p1"), c.getLocal("pr")), ...c.ret([])]), c.call(prefixField + "_square", x, XX), c.call(prefixField + "_square", y, YY), c.call(prefixField + "_square", YY, YYYY), c.call(prefixField + "_add", x, YY, S), c.call(prefixField + "_square", S, S), c.call(prefixField + "_sub", S, XX, S), c.call(prefixField + "_sub", S, YYYY, S), c.call(prefixField + "_add", S, S, S), c.call(prefixField + "_add", XX, XX, M), c.call(prefixField + "_add", M, XX, M), c.call(prefixField + "_add", y, y, z3), c.call(prefixField + "_square", M, x3), c.call(prefixField + "_sub", x3, S, x3), c.call(prefixField + "_sub", x3, S, x3), c.call(prefixField + "_add", YYYY, YYYY, eightYYYY), c.call(prefixField + "_add", eightYYYY, eightYYYY, eightYYYY), c.call(prefixField + "_add", eightYYYY, eightYYYY, eightYYYY), c.call(prefixField + "_sub", S, x3, y3), c.call(prefixField + "_mul", y3, M, y3), c.call(prefixField + "_sub", y3, eightYYYY, y3)); + } + function buildEqAffine() { + const f = module.addFunction(prefix + "_eqAffine"); + f.addParam("p1", "i32"); + f.addParam("p2", "i32"); + f.setReturnType("i32"); + f.addLocal("z1", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.ret(c.i32_and(c.call(prefixField + "_eq", c.getLocal("p1"), c.getLocal("p2")), c.call(prefixField + "_eq", c.i32_add(c.getLocal("p1"), c.i32_const(n8)), c.i32_add(c.getLocal("p2"), c.i32_const(n8)))))); + } + function buildToMontgomery() { + const f = module.addFunction(prefix + "_toMontgomery"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefixField + "_toMontgomery", c.getLocal("p1"), c.getLocal("pr"))); + for (let i = 1; i < 3; i++) f.addCode(c.call(prefixField + "_toMontgomery", c.i32_add(c.getLocal("p1"), c.i32_const(i * n8)), c.i32_add(c.getLocal("pr"), c.i32_const(i * n8)))); + } + function buildToMontgomeryAffine() { + const f = module.addFunction(prefix + "_toMontgomeryAffine"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefixField + "_toMontgomery", c.getLocal("p1"), c.getLocal("pr"))); + for (let i = 1; i < 2; i++) f.addCode(c.call(prefixField + "_toMontgomery", c.i32_add(c.getLocal("p1"), c.i32_const(i * n8)), c.i32_add(c.getLocal("pr"), c.i32_const(i * n8)))); + } + function buildFromMontgomery() { + const f = module.addFunction(prefix + "_fromMontgomery"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefixField + "_fromMontgomery", c.getLocal("p1"), c.getLocal("pr"))); + for (let i = 1; i < 3; i++) f.addCode(c.call(prefixField + "_fromMontgomery", c.i32_add(c.getLocal("p1"), c.i32_const(i * n8)), c.i32_add(c.getLocal("pr"), c.i32_const(i * n8)))); + } + function buildFromMontgomeryAffine() { + const f = module.addFunction(prefix + "_fromMontgomeryAffine"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(prefixField + "_fromMontgomery", c.getLocal("p1"), c.getLocal("pr"))); + for (let i = 1; i < 2; i++) f.addCode(c.call(prefixField + "_fromMontgomery", c.i32_add(c.getLocal("p1"), c.i32_const(i * n8)), c.i32_add(c.getLocal("pr"), c.i32_const(i * n8)))); + } + function buildAdd() { + const f = module.addFunction(prefix + "_add"); + f.addParam("p1", "i32"); + f.addParam("p2", "i32"); + f.addParam("pr", "i32"); + f.addLocal("z1", "i32"); + f.addLocal("z2", "i32"); + const c = f.getCodeBuilder(); + const x1 = c.getLocal("p1"); + const y1 = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + f.addCode(c.setLocal("z1", c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)))); + const z1 = c.getLocal("z1"); + const x2 = c.getLocal("p2"); + const y2 = c.i32_add(c.getLocal("p2"), c.i32_const(n8)); + f.addCode(c.setLocal("z2", c.i32_add(c.getLocal("p2"), c.i32_const(n8 * 2)))); + const z2 = c.getLocal("z2"); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2)); + const Z1Z1 = c.i32_const(module.alloc(n8)); + const Z2Z2 = c.i32_const(module.alloc(n8)); + const U1 = c.i32_const(module.alloc(n8)); + const U2 = c.i32_const(module.alloc(n8)); + const Z1_cubed = c.i32_const(module.alloc(n8)); + const Z2_cubed = c.i32_const(module.alloc(n8)); + const S1 = c.i32_const(module.alloc(n8)); + const S2 = c.i32_const(module.alloc(n8)); + const H = c.i32_const(module.alloc(n8)); + const S2_minus_S1 = c.i32_const(module.alloc(n8)); + const I = c.i32_const(module.alloc(n8)); + const J = c.i32_const(module.alloc(n8)); + const r = c.i32_const(module.alloc(n8)); + const r2 = c.i32_const(module.alloc(n8)); + const V = c.i32_const(module.alloc(n8)); + const V2 = c.i32_const(module.alloc(n8)); + const S1_J2 = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZero", c.getLocal("p1")), [...c.call(prefix + "_copy", c.getLocal("p2"), c.getLocal("pr")), ...c.ret([])]), c.if(c.call(prefix + "_isZero", c.getLocal("p2")), [...c.call(prefix + "_copy", c.getLocal("p1"), c.getLocal("pr")), ...c.ret([])]), c.if(c.call(prefixField + "_isOne", z1), [...c.call(prefix + "_addMixed", x2, x1, x3), ...c.ret([])]), c.if(c.call(prefixField + "_isOne", z2), [...c.call(prefix + "_addMixed", x1, x2, x3), ...c.ret([])]), c.call(prefixField + "_square", z1, Z1Z1), c.call(prefixField + "_square", z2, Z2Z2), c.call(prefixField + "_mul", x1, Z2Z2, U1), c.call(prefixField + "_mul", x2, Z1Z1, U2), c.call(prefixField + "_mul", z1, Z1Z1, Z1_cubed), c.call(prefixField + "_mul", z2, Z2Z2, Z2_cubed), c.call(prefixField + "_mul", y1, Z2_cubed, S1), c.call(prefixField + "_mul", y2, Z1_cubed, S2), c.if(c.call(prefixField + "_eq", U1, U2), c.if(c.call(prefixField + "_eq", S1, S2), [...c.call(prefix + "_double", c.getLocal("p1"), c.getLocal("pr")), ...c.ret([])])), c.call(prefixField + "_sub", U2, U1, H), c.call(prefixField + "_sub", S2, S1, S2_minus_S1), c.call(prefixField + "_add", H, H, I), c.call(prefixField + "_square", I, I), c.call(prefixField + "_mul", H, I, J), c.call(prefixField + "_add", S2_minus_S1, S2_minus_S1, r), c.call(prefixField + "_mul", U1, I, V), c.call(prefixField + "_square", r, r2), c.call(prefixField + "_add", V, V, V2), c.call(prefixField + "_sub", r2, J, x3), c.call(prefixField + "_sub", x3, V2, x3), c.call(prefixField + "_mul", S1, J, S1_J2), c.call(prefixField + "_add", S1_J2, S1_J2, S1_J2), c.call(prefixField + "_sub", V, x3, y3), c.call(prefixField + "_mul", y3, r, y3), c.call(prefixField + "_sub", y3, S1_J2, y3), c.call(prefixField + "_add", z1, z2, z3), c.call(prefixField + "_square", z3, z3), c.call(prefixField + "_sub", z3, Z1Z1, z3), c.call(prefixField + "_sub", z3, Z2Z2, z3), c.call(prefixField + "_mul", z3, H, z3)); + } + function buildAddMixed() { + const f = module.addFunction(prefix + "_addMixed"); + f.addParam("p1", "i32"); + f.addParam("p2", "i32"); + f.addParam("pr", "i32"); + f.addLocal("z1", "i32"); + const c = f.getCodeBuilder(); + const x1 = c.getLocal("p1"); + const y1 = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + f.addCode(c.setLocal("z1", c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)))); + const z1 = c.getLocal("z1"); + const x2 = c.getLocal("p2"); + const y2 = c.i32_add(c.getLocal("p2"), c.i32_const(n8)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2)); + const Z1Z1 = c.i32_const(module.alloc(n8)); + const U2 = c.i32_const(module.alloc(n8)); + const Z1_cubed = c.i32_const(module.alloc(n8)); + const S2 = c.i32_const(module.alloc(n8)); + const H = c.i32_const(module.alloc(n8)); + const HH = c.i32_const(module.alloc(n8)); + const S2_minus_y1 = c.i32_const(module.alloc(n8)); + const I = c.i32_const(module.alloc(n8)); + const J = c.i32_const(module.alloc(n8)); + const r = c.i32_const(module.alloc(n8)); + const r2 = c.i32_const(module.alloc(n8)); + const V = c.i32_const(module.alloc(n8)); + const V2 = c.i32_const(module.alloc(n8)); + const y1_J2 = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZero", c.getLocal("p1")), [ + ...c.call(prefix + "_copyAffine", c.getLocal("p2"), c.getLocal("pr")), + ...c.call(prefixField + "_one", c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2))), + ...c.ret([]) + ]), c.if(c.call(prefix + "_isZeroAffine", c.getLocal("p2")), [...c.call(prefix + "_copy", c.getLocal("p1"), c.getLocal("pr")), ...c.ret([])]), c.if(c.call(prefixField + "_isOne", z1), [...c.call(prefix + "_addAffine", x1, x2, x3), ...c.ret([])]), c.call(prefixField + "_square", z1, Z1Z1), c.call(prefixField + "_mul", x2, Z1Z1, U2), c.call(prefixField + "_mul", z1, Z1Z1, Z1_cubed), c.call(prefixField + "_mul", y2, Z1_cubed, S2), c.if(c.call(prefixField + "_eq", x1, U2), c.if(c.call(prefixField + "_eq", y1, S2), [...c.call(prefix + "_doubleAffine", c.getLocal("p2"), c.getLocal("pr")), ...c.ret([])])), c.call(prefixField + "_sub", U2, x1, H), c.call(prefixField + "_sub", S2, y1, S2_minus_y1), c.call(prefixField + "_square", H, HH), c.call(prefixField + "_add", HH, HH, I), c.call(prefixField + "_add", I, I, I), c.call(prefixField + "_mul", H, I, J), c.call(prefixField + "_add", S2_minus_y1, S2_minus_y1, r), c.call(prefixField + "_mul", x1, I, V), c.call(prefixField + "_square", r, r2), c.call(prefixField + "_add", V, V, V2), c.call(prefixField + "_sub", r2, J, x3), c.call(prefixField + "_sub", x3, V2, x3), c.call(prefixField + "_mul", y1, J, y1_J2), c.call(prefixField + "_add", y1_J2, y1_J2, y1_J2), c.call(prefixField + "_sub", V, x3, y3), c.call(prefixField + "_mul", y3, r, y3), c.call(prefixField + "_sub", y3, y1_J2, y3), c.call(prefixField + "_add", z1, H, z3), c.call(prefixField + "_square", z3, z3), c.call(prefixField + "_sub", z3, Z1Z1, z3), c.call(prefixField + "_sub", z3, HH, z3)); + } + function buildAddAffine() { + const f = module.addFunction(prefix + "_addAffine"); + f.addParam("p1", "i32"); + f.addParam("p2", "i32"); + f.addParam("pr", "i32"); + f.addLocal("z1", "i32"); + const c = f.getCodeBuilder(); + const x1 = c.getLocal("p1"); + const y1 = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + f.addCode(c.setLocal("z1", c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)))); + const x2 = c.getLocal("p2"); + const y2 = c.i32_add(c.getLocal("p2"), c.i32_const(n8)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2)); + const H = c.i32_const(module.alloc(n8)); + const HH = c.i32_const(module.alloc(n8)); + const y2_minus_y1 = c.i32_const(module.alloc(n8)); + const I = c.i32_const(module.alloc(n8)); + const J = c.i32_const(module.alloc(n8)); + const r = c.i32_const(module.alloc(n8)); + const r2 = c.i32_const(module.alloc(n8)); + const V = c.i32_const(module.alloc(n8)); + const V2 = c.i32_const(module.alloc(n8)); + const y1_J2 = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZeroAffine", c.getLocal("p1")), [ + ...c.call(prefix + "_copyAffine", c.getLocal("p2"), c.getLocal("pr")), + ...c.call(prefixField + "_one", c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2))), + ...c.ret([]) + ]), c.if(c.call(prefix + "_isZeroAffine", c.getLocal("p2")), [ + ...c.call(prefix + "_copyAffine", c.getLocal("p1"), c.getLocal("pr")), + ...c.call(prefixField + "_one", c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2))), + ...c.ret([]) + ]), c.if(c.call(prefixField + "_eq", x1, x2), c.if(c.call(prefixField + "_eq", y1, y2), [...c.call(prefix + "_doubleAffine", c.getLocal("p2"), c.getLocal("pr")), ...c.ret([])])), c.call(prefixField + "_sub", x2, x1, H), c.call(prefixField + "_sub", y2, y1, y2_minus_y1), c.call(prefixField + "_square", H, HH), c.call(prefixField + "_add", HH, HH, I), c.call(prefixField + "_add", I, I, I), c.call(prefixField + "_mul", H, I, J), c.call(prefixField + "_add", y2_minus_y1, y2_minus_y1, r), c.call(prefixField + "_mul", x1, I, V), c.call(prefixField + "_square", r, r2), c.call(prefixField + "_add", V, V, V2), c.call(prefixField + "_sub", r2, J, x3), c.call(prefixField + "_sub", x3, V2, x3), c.call(prefixField + "_mul", y1, J, y1_J2), c.call(prefixField + "_add", y1_J2, y1_J2, y1_J2), c.call(prefixField + "_sub", V, x3, y3), c.call(prefixField + "_mul", y3, r, y3), c.call(prefixField + "_sub", y3, y1_J2, y3), c.call(prefixField + "_add", H, H, z3)); + } + function buildNeg() { + const f = module.addFunction(prefix + "_neg"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("p1"); + const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + const z = c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2)); + f.addCode(c.call(prefixField + "_copy", x, x3), c.call(prefixField + "_neg", y, y3), c.call(prefixField + "_copy", z, z3)); + } + function buildNegAffine() { + const f = module.addFunction(prefix + "_negAffine"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("p1"); + const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + f.addCode(c.call(prefixField + "_copy", x, x3), c.call(prefixField + "_neg", y, y3)); + } + function buildSub() { + const f = module.addFunction(prefix + "_sub"); + f.addParam("p1", "i32"); + f.addParam("p2", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const AUX = c.i32_const(module.alloc(n8 * 3)); + f.addCode(c.call(prefix + "_neg", c.getLocal("p2"), AUX), c.call(prefix + "_add", c.getLocal("p1"), AUX, c.getLocal("pr"))); + } + function buildSubMixed() { + const f = module.addFunction(prefix + "_subMixed"); + f.addParam("p1", "i32"); + f.addParam("p2", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const AUX = c.i32_const(module.alloc(n8 * 3)); + f.addCode(c.call(prefix + "_negAffine", c.getLocal("p2"), AUX), c.call(prefix + "_addMixed", c.getLocal("p1"), AUX, c.getLocal("pr"))); + } + function buildSubAffine() { + const f = module.addFunction(prefix + "_subAffine"); + f.addParam("p1", "i32"); + f.addParam("p2", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const AUX = c.i32_const(module.alloc(n8 * 3)); + f.addCode(c.call(prefix + "_negAffine", c.getLocal("p2"), AUX), c.call(prefix + "_addAffine", c.getLocal("p1"), AUX, c.getLocal("pr"))); + } + function buildNormalize() { + const f = module.addFunction(prefix + "_normalize"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("p1"); + const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + const z = c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2)); + const Z_inv = c.i32_const(module.alloc(n8)); + const Z2_inv = c.i32_const(module.alloc(n8)); + const Z3_inv = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZero", c.getLocal("p1")), c.call(prefix + "_zero", c.getLocal("pr")), [ + ...c.call(prefixField + "_inverse", z, Z_inv), + ...c.call(prefixField + "_square", Z_inv, Z2_inv), + ...c.call(prefixField + "_mul", Z_inv, Z2_inv, Z3_inv), + ...c.call(prefixField + "_mul", x, Z2_inv, x3), + ...c.call(prefixField + "_mul", y, Z3_inv, y3), + ...c.call(prefixField + "_one", z3) + ])); + } + function buildToAffine() { + const f = module.addFunction(prefix + "_toAffine"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("p1"); + const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + const z = c.i32_add(c.getLocal("p1"), c.i32_const(n8 * 2)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const Z_inv = c.i32_const(module.alloc(n8)); + const Z2_inv = c.i32_const(module.alloc(n8)); + const Z3_inv = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZero", c.getLocal("p1")), [...c.call(prefixField + "_zero", x3), ...c.call(prefixField + "_zero", y3)], [ + ...c.call(prefixField + "_inverse", z, Z_inv), + ...c.call(prefixField + "_square", Z_inv, Z2_inv), + ...c.call(prefixField + "_mul", Z_inv, Z2_inv, Z3_inv), + ...c.call(prefixField + "_mul", x, Z2_inv, x3), + ...c.call(prefixField + "_mul", y, Z3_inv, y3) + ])); + } + function buildToJacobian() { + const f = module.addFunction(prefix + "_toJacobian"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("p1"); + const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2)); + f.addCode(c.if(c.call(prefix + "_isZeroAffine", c.getLocal("p1")), c.call(prefix + "_zero", c.getLocal("pr")), [ + ...c.call(prefixField + "_one", z3), + ...c.call(prefixField + "_copy", y, y3), + ...c.call(prefixField + "_copy", x, x3) + ])); + } + function buildBatchToAffine() { + const f = module.addFunction(prefix + "_batchToAffine"); + f.addParam("pIn", "i32"); + f.addParam("n", "i32"); + f.addParam("pOut", "i32"); + f.addLocal("pAux", "i32"); + f.addLocal("itIn", "i32"); + f.addLocal("itAux", "i32"); + f.addLocal("itOut", "i32"); + f.addLocal("i", "i32"); + const c = f.getCodeBuilder(); + const tmp = c.i32_const(module.alloc(n8)); + f.addCode(c.setLocal("pAux", c.i32_load(c.i32_const(0))), c.i32_store(c.i32_const(0), c.i32_add(c.getLocal("pAux"), c.i32_mul(c.getLocal("n"), c.i32_const(n8)))), c.call(prefixField + "_batchInverse", c.i32_add(c.getLocal("pIn"), c.i32_const(n8 * 2)), c.i32_const(n8 * 3), c.getLocal("n"), c.getLocal("pAux"), c.i32_const(n8)), c.setLocal("itIn", c.getLocal("pIn")), c.setLocal("itAux", c.getLocal("pAux")), c.setLocal("itOut", c.getLocal("pOut")), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.if(c.call(prefixField + "_isZero", c.getLocal("itAux")), [...c.call(prefixField + "_zero", c.getLocal("itOut")), ...c.call(prefixField + "_zero", c.i32_add(c.getLocal("itOut"), c.i32_const(n8)))], [ + ...c.call(prefixField + "_mul", c.getLocal("itAux"), c.i32_add(c.getLocal("itIn"), c.i32_const(n8)), tmp), + ...c.call(prefixField + "_square", c.getLocal("itAux"), c.getLocal("itAux")), + ...c.call(prefixField + "_mul", c.getLocal("itAux"), c.getLocal("itIn"), c.getLocal("itOut")), + ...c.call(prefixField + "_mul", c.getLocal("itAux"), tmp, c.i32_add(c.getLocal("itOut"), c.i32_const(n8))) + ]), c.setLocal("itIn", c.i32_add(c.getLocal("itIn"), c.i32_const(n8 * 3))), c.setLocal("itOut", c.i32_add(c.getLocal("itOut"), c.i32_const(n8 * 2))), c.setLocal("itAux", c.i32_add(c.getLocal("itAux"), c.i32_const(n8))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0))), c.i32_store(c.i32_const(0), c.getLocal("pAux"))); + } + function buildReverseBytes() { + const f = module.addFunction(prefix + "__reverseBytes"); + f.addParam("pIn", "i32"); + f.addParam("n", "i32"); + f.addParam("pOut", "i32"); + f.addLocal("itOut", "i32"); + f.addLocal("itIn", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("itOut", c.i32_sub(c.i32_add(c.getLocal("pOut"), c.getLocal("n")), c.i32_const(1))), c.setLocal("itIn", c.getLocal("pIn")), c.block(c.loop(c.br_if(1, c.i32_lt_s(c.getLocal("itOut"), c.getLocal("pOut"))), c.i32_store8(c.getLocal("itOut"), c.i32_load8_u(c.getLocal("itIn"))), c.setLocal("itOut", c.i32_sub(c.getLocal("itOut"), c.i32_const(1))), c.setLocal("itIn", c.i32_add(c.getLocal("itIn"), c.i32_const(1))), c.br(0)))); + } + function buildLEMtoC() { + const f = module.addFunction(prefix + "_LEMtoC"); + f.addParam("pIn", "i32"); + f.addParam("pOut", "i32"); + const c = f.getCodeBuilder(); + const tmp = c.i32_const(module.alloc(n8)); + f.addCode(c.if(c.call(prefix + "_isZeroAffine", c.getLocal("pIn")), [ + ...c.call(prefixField + "_zero", c.getLocal("pOut")), + ...c.i32_store8(c.getLocal("pOut"), c.i32_const(64)), + ...c.ret([]) + ]), c.call(prefixField + "_fromMontgomery", c.getLocal("pIn"), tmp), c.call(prefix + "__reverseBytes", tmp, c.i32_const(n8), c.getLocal("pOut")), c.if(c.i32_eq(c.call(prefixField + "_sign", c.i32_add(c.getLocal("pIn"), c.i32_const(n8))), c.i32_const(-1)), c.i32_store8(c.getLocal("pOut"), c.i32_or(c.i32_load8_u(c.getLocal("pOut")), c.i32_const(128))))); + } + function buildLEMtoU() { + const f = module.addFunction(prefix + "_LEMtoU"); + f.addParam("pIn", "i32"); + f.addParam("pOut", "i32"); + const c = f.getCodeBuilder(); + const pTmp = module.alloc(n8 * 2); + const tmp = c.i32_const(pTmp); + const tmpX = c.i32_const(pTmp); + const tmpY = c.i32_const(pTmp + n8); + f.addCode(c.if(c.call(prefix + "_isZeroAffine", c.getLocal("pIn")), [...c.call(prefix + "_zeroAffine", c.getLocal("pOut")), ...c.ret([])]), c.call(prefix + "_fromMontgomeryAffine", c.getLocal("pIn"), tmp), c.call(prefix + "__reverseBytes", tmpX, c.i32_const(n8), c.getLocal("pOut")), c.call(prefix + "__reverseBytes", tmpY, c.i32_const(n8), c.i32_add(c.getLocal("pOut"), c.i32_const(n8)))); + } + function buildUtoLEM() { + const f = module.addFunction(prefix + "_UtoLEM"); + f.addParam("pIn", "i32"); + f.addParam("pOut", "i32"); + const c = f.getCodeBuilder(); + const pTmp = module.alloc(n8 * 2); + const tmp = c.i32_const(pTmp); + const tmpX = c.i32_const(pTmp); + const tmpY = c.i32_const(pTmp + n8); + f.addCode(c.if(c.i32_and(c.i32_load8_u(c.getLocal("pIn")), c.i32_const(64)), [...c.call(prefix + "_zeroAffine", c.getLocal("pOut")), ...c.ret([])]), c.call(prefix + "__reverseBytes", c.getLocal("pIn"), c.i32_const(n8), tmpX), c.call(prefix + "__reverseBytes", c.i32_add(c.getLocal("pIn"), c.i32_const(n8)), c.i32_const(n8), tmpY), c.call(prefix + "_toMontgomeryAffine", tmp, c.getLocal("pOut"))); + } + function buildCtoLEM() { + const f = module.addFunction(prefix + "_CtoLEM"); + f.addParam("pIn", "i32"); + f.addParam("pOut", "i32"); + f.addLocal("firstByte", "i32"); + f.addLocal("greatest", "i32"); + const c = f.getCodeBuilder(); + const pTmp = module.alloc(n8 * 2); + const tmpX = c.i32_const(pTmp); + const tmpY = c.i32_const(pTmp + n8); + f.addCode(c.setLocal("firstByte", c.i32_load8_u(c.getLocal("pIn"))), c.if(c.i32_and(c.getLocal("firstByte"), c.i32_const(64)), [...c.call(prefix + "_zeroAffine", c.getLocal("pOut")), ...c.ret([])]), c.setLocal("greatest", c.i32_and(c.getLocal("firstByte"), c.i32_const(128))), c.call(prefixField + "_copy", c.getLocal("pIn"), tmpY), c.i32_store8(tmpY, c.i32_and(c.getLocal("firstByte"), c.i32_const(63))), c.call(prefix + "__reverseBytes", tmpY, c.i32_const(n8), tmpX), c.call(prefixField + "_toMontgomery", tmpX, c.getLocal("pOut")), c.call(prefixField + "_square", c.getLocal("pOut"), tmpY), c.call(prefixField + "_mul", c.getLocal("pOut"), tmpY, tmpY), c.call(prefixField + "_add", tmpY, c.i32_const(pB), tmpY), c.call(prefixField + "_sqrt", tmpY, tmpY), c.call(prefixField + "_neg", tmpY, tmpX), c.if(c.i32_eq(c.call(prefixField + "_sign", tmpY), c.i32_const(-1)), c.if(c.getLocal("greatest"), c.call(prefixField + "_copy", tmpY, c.i32_add(c.getLocal("pOut"), c.i32_const(n8))), c.call(prefixField + "_neg", tmpY, c.i32_add(c.getLocal("pOut"), c.i32_const(n8)))), c.if(c.getLocal("greatest"), c.call(prefixField + "_neg", tmpY, c.i32_add(c.getLocal("pOut"), c.i32_const(n8))), c.call(prefixField + "_copy", tmpY, c.i32_add(c.getLocal("pOut"), c.i32_const(n8)))))); + } + function buildInCurveAffine() { + const f = module.addFunction(prefix + "_inCurveAffine"); + f.addParam("pIn", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("pIn"); + const y = c.i32_add(c.getLocal("pIn"), c.i32_const(n8)); + const y2 = c.i32_const(module.alloc(n8)); + const x3b = c.i32_const(module.alloc(n8)); + f.addCode(c.call(prefixField + "_square", y, y2), c.call(prefixField + "_square", x, x3b), c.call(prefixField + "_mul", x, x3b, x3b), c.call(prefixField + "_add", x3b, c.i32_const(pB), x3b), c.ret(c.call(prefixField + "_eq", y2, x3b))); + } + function buildInCurve() { + const f = module.addFunction(prefix + "_inCurve"); + f.addParam("pIn", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const aux = c.i32_const(module.alloc(n8 * 2)); + f.addCode(c.call(prefix + "_toAffine", c.getLocal("pIn"), aux), c.ret(c.call(prefix + "_inCurveAffine", aux))); + } + buildIsZeroAffine(); + buildIsZero(); + buildZeroAffine(); + buildZero(); + buildCopyAffine(); + buildCopy(); + buildToJacobian(); + buildEqAffine(); + buildEqMixed(); + buildEq(); + buildDoubleAffine(); + buildDouble(); + buildAddAffine(); + buildAddMixed(); + buildAdd(); + buildNegAffine(); + buildNeg(); + buildSubAffine(); + buildSubMixed(); + buildSub(); + buildFromMontgomeryAffine(); + buildFromMontgomery(); + buildToMontgomeryAffine(); + buildToMontgomery(); + buildToAffine(); + buildInCurveAffine(); + buildInCurve(); + buildBatchToAffine(); + buildNormalize(); + buildReverseBytes(); + buildLEMtoU(); + buildLEMtoC(); + buildUtoLEM(); + buildCtoLEM(); + build_batchconvertion_default(module, prefix + "_batchLEMtoU", prefix + "_LEMtoU", n8 * 2, n8 * 2); + build_batchconvertion_default(module, prefix + "_batchLEMtoC", prefix + "_LEMtoC", n8 * 2, n8); + build_batchconvertion_default(module, prefix + "_batchUtoLEM", prefix + "_UtoLEM", n8 * 2, n8 * 2); + build_batchconvertion_default(module, prefix + "_batchCtoLEM", prefix + "_CtoLEM", n8, n8 * 2, true); + build_batchconvertion_default(module, prefix + "_batchToJacobian", prefix + "_toJacobian", n8 * 2, n8 * 3, true); + buildMultiexp(module, prefix, prefix + "_multiexp", prefix + "_add", prefix + "_sub", n8 * 3); + buildMultiexp(module, prefix, prefix + "_multiexpAffine", prefix + "_addMixed", prefix + "_subMixed", n8 * 2); + buildTimesScalarNAF(module, prefix + "_timesScalar", n8 * 3, prefix + "_add", prefix + "_double", prefix + "_sub", prefix + "_copy", prefix + "_zero"); + buildTimesScalarNAF(module, prefix + "_timesScalarAffine", n8 * 2, prefix + "_addMixed", prefix + "_double", prefix + "_subMixed", prefix + "_copyAffine", prefix + "_zero"); + module.exportFunction(prefix + "_isZero"); + module.exportFunction(prefix + "_isZeroAffine"); + module.exportFunction(prefix + "_eq"); + module.exportFunction(prefix + "_eqMixed"); + module.exportFunction(prefix + "_eqAffine"); + module.exportFunction(prefix + "_copy"); + module.exportFunction(prefix + "_copyAffine"); + module.exportFunction(prefix + "_zero"); + module.exportFunction(prefix + "_zeroAffine"); + module.exportFunction(prefix + "_double"); + module.exportFunction(prefix + "_doubleAffine"); + module.exportFunction(prefix + "_add"); + module.exportFunction(prefix + "_addMixed"); + module.exportFunction(prefix + "_addAffine"); + module.exportFunction(prefix + "_neg"); + module.exportFunction(prefix + "_negAffine"); + module.exportFunction(prefix + "_sub"); + module.exportFunction(prefix + "_subMixed"); + module.exportFunction(prefix + "_subAffine"); + module.exportFunction(prefix + "_fromMontgomery"); + module.exportFunction(prefix + "_fromMontgomeryAffine"); + module.exportFunction(prefix + "_toMontgomery"); + module.exportFunction(prefix + "_toMontgomeryAffine"); + module.exportFunction(prefix + "_timesScalar"); + module.exportFunction(prefix + "_timesScalarAffine"); + module.exportFunction(prefix + "_normalize"); + module.exportFunction(prefix + "_LEMtoU"); + module.exportFunction(prefix + "_LEMtoC"); + module.exportFunction(prefix + "_UtoLEM"); + module.exportFunction(prefix + "_CtoLEM"); + module.exportFunction(prefix + "_batchLEMtoU"); + module.exportFunction(prefix + "_batchLEMtoC"); + module.exportFunction(prefix + "_batchUtoLEM"); + module.exportFunction(prefix + "_batchCtoLEM"); + module.exportFunction(prefix + "_toAffine"); + module.exportFunction(prefix + "_toJacobian"); + module.exportFunction(prefix + "_batchToAffine"); + module.exportFunction(prefix + "_batchToJacobian"); + module.exportFunction(prefix + "_inCurve"); + module.exportFunction(prefix + "_inCurveAffine"); + return prefix; +} +//#endregion +//#region src/build_fft.js +function buildFFT(module, prefix, gPrefix, fPrefix, opGtimesF) { + const n8f = module.modules[fPrefix].n64 * 8; + const n8g = module.modules[gPrefix].n64 * 8; + const q = module.modules[fPrefix].q; + let rem = q - 1n; + let maxBits = 0; + while (!isOdd(rem)) { + maxBits++; + rem = rem >> 1n; + } + let nr = 2n; + while (modPow(nr, q >> 1n, q) === 1n) nr = nr + 1n; + const w = new Array(maxBits + 1); + w[maxBits] = modPow(nr, rem, q); + let n = maxBits - 1; + while (n >= 0) { + w[n] = modPow(w[n + 1], 2n, q); + n--; + } + const bytes = []; + const R = (1n << BigInt(n8f * 8)) % q; + for (let i = 0; i < w.length; i++) { + const m = w[i] * R % q; + bytes.push(...bigInt2BytesLE(m, n8f)); + } + const ROOTs = module.alloc(bytes); + const i2 = new Array(maxBits + 1); + i2[0] = 1n; + for (let i = 1; i <= maxBits; i++) i2[i] = i2[i - 1] * 2n; + const bytesi2 = []; + for (let i = 0; i <= maxBits; i++) { + const m = modInv(i2[i], q) * R % q; + bytesi2.push(...bigInt2BytesLE(m, n8f)); + } + const INV2 = module.alloc(bytesi2); + const shift = modPow(nr, 2n, q); + const bytesShiftToSmallM = []; + const bytesSConst = []; + for (let i = 0; i <= maxBits; i++) { + const shiftToSmallM = modPow(shift, 2n ** BigInt(i), q); + const sConst = modInv(q + 1n - shiftToSmallM, q); + bytesShiftToSmallM.push(...bigInt2BytesLE(shiftToSmallM * R % q, n8f)); + bytesSConst.push(...bigInt2BytesLE(sConst * R % q, n8f)); + } + const SHIFT_TO_M = module.alloc(bytesShiftToSmallM); + const SCONST = module.alloc(bytesSConst); + function rev(x) { + let r = 0; + for (let i = 0; i < 8; i++) if (x & 1 << i) r = r | 128 >> i; + return r; + } + const rtable = Array(256); + for (let i = 0; i < 256; i++) rtable[i] = rev(i); + const REVTABLE = module.alloc(rtable); + function buildLog2() { + const f = module.addFunction(prefix + "__log2"); + f.addParam("n", "i32"); + f.setReturnType("i32"); + f.addLocal("bits", "i32"); + f.addLocal("aux", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("aux", c.i32_shr_u(c.getLocal("n"), c.i32_const(1)))); + f.addCode(c.setLocal("bits", c.i32_const(0))); + f.addCode(c.block(c.loop(c.br_if(1, c.i32_eqz(c.getLocal("aux"))), c.setLocal("aux", c.i32_shr_u(c.getLocal("aux"), c.i32_const(1))), c.setLocal("bits", c.i32_add(c.getLocal("bits"), c.i32_const(1))), c.br(0)))); + f.addCode(c.if(c.i32_ne(c.getLocal("n"), c.i32_shl(c.i32_const(1), c.getLocal("bits"))), c.unreachable())); + f.addCode(c.if(c.i32_gt_u(c.getLocal("bits"), c.i32_const(maxBits)), c.unreachable())); + f.addCode(c.getLocal("bits")); + } + function buildFFT() { + const f = module.addFunction(prefix + "_fft"); + f.addParam("px", "i32"); + f.addParam("n", "i32"); + f.addLocal("bits", "i32"); + const c = f.getCodeBuilder(); + const One = c.i32_const(module.alloc(n8f)); + f.addCode(c.setLocal("bits", c.call(prefix + "__log2", c.getLocal("n"))), c.call(fPrefix + "_one", One), c.call(prefix + "_rawfft", c.getLocal("px"), c.getLocal("bits"), c.i32_const(0), One)); + } + function buildIFFT() { + const f = module.addFunction(prefix + "_ifft"); + f.addParam("px", "i32"); + f.addParam("n", "i32"); + f.addLocal("bits", "i32"); + f.addLocal("pInv2", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("bits", c.call(prefix + "__log2", c.getLocal("n"))), c.setLocal("pInv2", c.i32_add(c.i32_const(INV2), c.i32_mul(c.getLocal("bits"), c.i32_const(n8f)))), c.call(prefix + "_rawfft", c.getLocal("px"), c.getLocal("bits"), c.i32_const(1), c.getLocal("pInv2"))); + } + function buildRawFFT() { + const f = module.addFunction(prefix + "_rawfft"); + f.addParam("px", "i32"); + f.addParam("bits", "i32"); + f.addParam("reverse", "i32"); + f.addParam("mulFactor", "i32"); + f.addLocal("s", "i32"); + f.addLocal("k", "i32"); + f.addLocal("j", "i32"); + f.addLocal("m", "i32"); + f.addLocal("mdiv2", "i32"); + f.addLocal("n", "i32"); + f.addLocal("pwm", "i32"); + f.addLocal("idx1", "i32"); + f.addLocal("idx2", "i32"); + const c = f.getCodeBuilder(); + const W = c.i32_const(module.alloc(n8f)); + const T = c.i32_const(module.alloc(n8g)); + const U = c.i32_const(module.alloc(n8g)); + f.addCode(c.call(prefix + "__reversePermutation", c.getLocal("px"), c.getLocal("bits")), c.setLocal("n", c.i32_shl(c.i32_const(1), c.getLocal("bits"))), c.setLocal("s", c.i32_const(1)), c.block(c.loop(c.br_if(1, c.i32_gt_u(c.getLocal("s"), c.getLocal("bits"))), c.setLocal("m", c.i32_shl(c.i32_const(1), c.getLocal("s"))), c.setLocal("pwm", c.i32_add(c.i32_const(ROOTs), c.i32_mul(c.getLocal("s"), c.i32_const(n8f)))), c.setLocal("k", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_ge_u(c.getLocal("k"), c.getLocal("n"))), c.call(fPrefix + "_one", W), c.setLocal("mdiv2", c.i32_shr_u(c.getLocal("m"), c.i32_const(1))), c.setLocal("j", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_ge_u(c.getLocal("j"), c.getLocal("mdiv2"))), c.setLocal("idx1", c.i32_add(c.getLocal("px"), c.i32_mul(c.i32_add(c.getLocal("k"), c.getLocal("j")), c.i32_const(n8g)))), c.setLocal("idx2", c.i32_add(c.getLocal("idx1"), c.i32_mul(c.getLocal("mdiv2"), c.i32_const(n8g)))), c.call(opGtimesF, c.getLocal("idx2"), W, T), c.call(gPrefix + "_copy", c.getLocal("idx1"), U), c.call(gPrefix + "_add", U, T, c.getLocal("idx1")), c.call(gPrefix + "_sub", U, T, c.getLocal("idx2")), c.call(fPrefix + "_mul", W, c.getLocal("pwm"), W), c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), c.br(0))), c.setLocal("k", c.i32_add(c.getLocal("k"), c.getLocal("m"))), c.br(0))), c.setLocal("s", c.i32_add(c.getLocal("s"), c.i32_const(1))), c.br(0))), c.call(prefix + "__fftFinal", c.getLocal("px"), c.getLocal("bits"), c.getLocal("reverse"), c.getLocal("mulFactor"))); + } + function buildFinalInverse() { + const f = module.addFunction(prefix + "__fftFinal"); + f.addParam("px", "i32"); + f.addParam("bits", "i32"); + f.addParam("reverse", "i32"); + f.addParam("mulFactor", "i32"); + f.addLocal("n", "i32"); + f.addLocal("ndiv2", "i32"); + f.addLocal("pInv2", "i32"); + f.addLocal("i", "i32"); + f.addLocal("mask", "i32"); + f.addLocal("idx1", "i32"); + f.addLocal("idx2", "i32"); + const c = f.getCodeBuilder(); + const T = c.i32_const(module.alloc(n8g)); + f.addCode(c.if(c.i32_and(c.i32_eqz(c.getLocal("reverse")), c.call(fPrefix + "_isOne", c.getLocal("mulFactor"))), c.ret([])), c.setLocal("n", c.i32_shl(c.i32_const(1), c.getLocal("bits"))), c.setLocal("mask", c.i32_sub(c.getLocal("n"), c.i32_const(1))), c.setLocal("i", c.i32_const(1)), c.setLocal("ndiv2", c.i32_shr_u(c.getLocal("n"), c.i32_const(1))), c.block(c.loop(c.br_if(1, c.i32_ge_u(c.getLocal("i"), c.getLocal("ndiv2"))), c.setLocal("idx1", c.i32_add(c.getLocal("px"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.setLocal("idx2", c.i32_add(c.getLocal("px"), c.i32_mul(c.i32_sub(c.getLocal("n"), c.getLocal("i")), c.i32_const(n8g)))), c.if(c.getLocal("reverse"), c.if(c.call(fPrefix + "_isOne", c.getLocal("mulFactor")), [ + ...c.call(gPrefix + "_copy", c.getLocal("idx1"), T), + ...c.call(gPrefix + "_copy", c.getLocal("idx2"), c.getLocal("idx1")), + ...c.call(gPrefix + "_copy", T, c.getLocal("idx2")) + ], [ + ...c.call(gPrefix + "_copy", c.getLocal("idx1"), T), + ...c.call(opGtimesF, c.getLocal("idx2"), c.getLocal("mulFactor"), c.getLocal("idx1")), + ...c.call(opGtimesF, T, c.getLocal("mulFactor"), c.getLocal("idx2")) + ]), c.if(c.call(fPrefix + "_isOne", c.getLocal("mulFactor")), [], [...c.call(opGtimesF, c.getLocal("idx1"), c.getLocal("mulFactor"), c.getLocal("idx1")), ...c.call(opGtimesF, c.getLocal("idx2"), c.getLocal("mulFactor"), c.getLocal("idx2"))])), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0))), c.if(c.call(fPrefix + "_isOne", c.getLocal("mulFactor")), [], [ + ...c.call(opGtimesF, c.getLocal("px"), c.getLocal("mulFactor"), c.getLocal("px")), + ...c.setLocal("idx2", c.i32_add(c.getLocal("px"), c.i32_mul(c.getLocal("ndiv2"), c.i32_const(n8g)))), + ...c.call(opGtimesF, c.getLocal("idx2"), c.getLocal("mulFactor"), c.getLocal("idx2")) + ])); + } + function buildReversePermutation() { + const f = module.addFunction(prefix + "__reversePermutation"); + f.addParam("px", "i32"); + f.addParam("bits", "i32"); + f.addLocal("n", "i32"); + f.addLocal("i", "i32"); + f.addLocal("ri", "i32"); + f.addLocal("idx1", "i32"); + f.addLocal("idx2", "i32"); + const c = f.getCodeBuilder(); + const T = c.i32_const(module.alloc(n8g)); + f.addCode(c.setLocal("n", c.i32_shl(c.i32_const(1), c.getLocal("bits"))), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.setLocal("idx1", c.i32_add(c.getLocal("px"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.setLocal("ri", c.call(prefix + "__rev", c.getLocal("i"), c.getLocal("bits"))), c.setLocal("idx2", c.i32_add(c.getLocal("px"), c.i32_mul(c.getLocal("ri"), c.i32_const(n8g)))), c.if(c.i32_lt_u(c.getLocal("i"), c.getLocal("ri")), [ + ...c.call(gPrefix + "_copy", c.getLocal("idx1"), T), + ...c.call(gPrefix + "_copy", c.getLocal("idx2"), c.getLocal("idx1")), + ...c.call(gPrefix + "_copy", T, c.getLocal("idx2")) + ]), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + function buildRev() { + const f = module.addFunction(prefix + "__rev"); + f.addParam("x", "i32"); + f.addParam("bits", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + f.addCode(c.i32_rotl(c.i32_add(c.i32_add(c.i32_shl(c.i32_load8_u(c.i32_and(c.getLocal("x"), c.i32_const(255)), REVTABLE, 0), c.i32_const(24)), c.i32_shl(c.i32_load8_u(c.i32_and(c.i32_shr_u(c.getLocal("x"), c.i32_const(8)), c.i32_const(255)), REVTABLE, 0), c.i32_const(16))), c.i32_add(c.i32_shl(c.i32_load8_u(c.i32_and(c.i32_shr_u(c.getLocal("x"), c.i32_const(16)), c.i32_const(255)), REVTABLE, 0), c.i32_const(8)), c.i32_load8_u(c.i32_and(c.i32_shr_u(c.getLocal("x"), c.i32_const(24)), c.i32_const(255)), REVTABLE, 0))), c.getLocal("bits"))); + } + function buildFFTJoin() { + const f = module.addFunction(prefix + "_fftJoin"); + f.addParam("pBuff1", "i32"); + f.addParam("pBuff2", "i32"); + f.addParam("n", "i32"); + f.addParam("first", "i32"); + f.addParam("inc", "i32"); + f.addLocal("idx1", "i32"); + f.addLocal("idx2", "i32"); + f.addLocal("i", "i32"); + const c = f.getCodeBuilder(); + const W = c.i32_const(module.alloc(n8f)); + const T = c.i32_const(module.alloc(n8g)); + const U = c.i32_const(module.alloc(n8g)); + f.addCode(c.call(fPrefix + "_copy", c.getLocal("first"), W), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.setLocal("idx1", c.i32_add(c.getLocal("pBuff1"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.setLocal("idx2", c.i32_add(c.getLocal("pBuff2"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.call(opGtimesF, c.getLocal("idx2"), W, T), c.call(gPrefix + "_copy", c.getLocal("idx1"), U), c.call(gPrefix + "_add", U, T, c.getLocal("idx1")), c.call(gPrefix + "_sub", U, T, c.getLocal("idx2")), c.call(fPrefix + "_mul", W, c.getLocal("inc"), W), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + function buildFFTJoinExt() { + const f = module.addFunction(prefix + "_fftJoinExt"); + f.addParam("pBuff1", "i32"); + f.addParam("pBuff2", "i32"); + f.addParam("n", "i32"); + f.addParam("first", "i32"); + f.addParam("inc", "i32"); + f.addParam("totalBits", "i32"); + f.addLocal("idx1", "i32"); + f.addLocal("idx2", "i32"); + f.addLocal("i", "i32"); + f.addLocal("pShiftToM", "i32"); + const c = f.getCodeBuilder(); + const W = c.i32_const(module.alloc(n8f)); + const U = c.i32_const(module.alloc(n8g)); + f.addCode(c.setLocal("pShiftToM", c.i32_add(c.i32_const(SHIFT_TO_M), c.i32_mul(c.getLocal("totalBits"), c.i32_const(n8f)))), c.call(fPrefix + "_copy", c.getLocal("first"), W), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.setLocal("idx1", c.i32_add(c.getLocal("pBuff1"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.setLocal("idx2", c.i32_add(c.getLocal("pBuff2"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.call(gPrefix + "_add", c.getLocal("idx1"), c.getLocal("idx2"), U), c.call(opGtimesF, c.getLocal("idx2"), c.getLocal("pShiftToM"), c.getLocal("idx2")), c.call(gPrefix + "_add", c.getLocal("idx1"), c.getLocal("idx2"), c.getLocal("idx2")), c.call(opGtimesF, c.getLocal("idx2"), W, c.getLocal("idx2")), c.call(gPrefix + "_copy", U, c.getLocal("idx1")), c.call(fPrefix + "_mul", W, c.getLocal("inc"), W), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + function buildFFTJoinExtInv() { + const f = module.addFunction(prefix + "_fftJoinExtInv"); + f.addParam("pBuff1", "i32"); + f.addParam("pBuff2", "i32"); + f.addParam("n", "i32"); + f.addParam("first", "i32"); + f.addParam("inc", "i32"); + f.addParam("totalBits", "i32"); + f.addLocal("idx1", "i32"); + f.addLocal("idx2", "i32"); + f.addLocal("i", "i32"); + f.addLocal("pShiftToM", "i32"); + f.addLocal("pSConst", "i32"); + const c = f.getCodeBuilder(); + const W = c.i32_const(module.alloc(n8f)); + const U = c.i32_const(module.alloc(n8g)); + f.addCode(c.setLocal("pShiftToM", c.i32_add(c.i32_const(SHIFT_TO_M), c.i32_mul(c.getLocal("totalBits"), c.i32_const(n8f)))), c.setLocal("pSConst", c.i32_add(c.i32_const(SCONST), c.i32_mul(c.getLocal("totalBits"), c.i32_const(n8f)))), c.call(fPrefix + "_copy", c.getLocal("first"), W), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.setLocal("idx1", c.i32_add(c.getLocal("pBuff1"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.setLocal("idx2", c.i32_add(c.getLocal("pBuff2"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.call(opGtimesF, c.getLocal("idx2"), W, U), c.call(gPrefix + "_sub", c.getLocal("idx1"), U, c.getLocal("idx2")), c.call(opGtimesF, c.getLocal("idx2"), c.getLocal("pSConst"), c.getLocal("idx2")), c.call(opGtimesF, c.getLocal("idx1"), c.getLocal("pShiftToM"), c.getLocal("idx1")), c.call(gPrefix + "_sub", U, c.getLocal("idx1"), c.getLocal("idx1")), c.call(opGtimesF, c.getLocal("idx1"), c.getLocal("pSConst"), c.getLocal("idx1")), c.call(fPrefix + "_mul", W, c.getLocal("inc"), W), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + function buildPrepareLagrangeEvaluation() { + const f = module.addFunction(prefix + "_prepareLagrangeEvaluation"); + f.addParam("pBuff1", "i32"); + f.addParam("pBuff2", "i32"); + f.addParam("n", "i32"); + f.addParam("first", "i32"); + f.addParam("inc", "i32"); + f.addParam("totalBits", "i32"); + f.addLocal("idx1", "i32"); + f.addLocal("idx2", "i32"); + f.addLocal("i", "i32"); + f.addLocal("pShiftToM", "i32"); + f.addLocal("pSConst", "i32"); + const c = f.getCodeBuilder(); + const W = c.i32_const(module.alloc(n8f)); + const U = c.i32_const(module.alloc(n8g)); + f.addCode(c.setLocal("pShiftToM", c.i32_add(c.i32_const(SHIFT_TO_M), c.i32_mul(c.getLocal("totalBits"), c.i32_const(n8f)))), c.setLocal("pSConst", c.i32_add(c.i32_const(SCONST), c.i32_mul(c.getLocal("totalBits"), c.i32_const(n8f)))), c.call(fPrefix + "_copy", c.getLocal("first"), W), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.setLocal("idx1", c.i32_add(c.getLocal("pBuff1"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.setLocal("idx2", c.i32_add(c.getLocal("pBuff2"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.call(opGtimesF, c.getLocal("idx1"), c.getLocal("pShiftToM"), U), c.call(gPrefix + "_sub", c.getLocal("idx2"), U, U), c.call(gPrefix + "_sub", c.getLocal("idx1"), c.getLocal("idx2"), c.getLocal("idx2")), c.call(opGtimesF, U, c.getLocal("pSConst"), c.getLocal("idx1")), c.call(opGtimesF, c.getLocal("idx2"), W, c.getLocal("idx2")), c.call(fPrefix + "_mul", W, c.getLocal("inc"), W), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + function buildFFTMix() { + const f = module.addFunction(prefix + "_fftMix"); + f.addParam("pBuff", "i32"); + f.addParam("n", "i32"); + f.addParam("exp", "i32"); + f.addLocal("nGroups", "i32"); + f.addLocal("nPerGroup", "i32"); + f.addLocal("nPerGroupDiv2", "i32"); + f.addLocal("pairOffset", "i32"); + f.addLocal("idx1", "i32"); + f.addLocal("idx2", "i32"); + f.addLocal("i", "i32"); + f.addLocal("j", "i32"); + f.addLocal("pwm", "i32"); + const c = f.getCodeBuilder(); + const W = c.i32_const(module.alloc(n8f)); + const T = c.i32_const(module.alloc(n8g)); + const U = c.i32_const(module.alloc(n8g)); + f.addCode(c.setLocal("nPerGroup", c.i32_shl(c.i32_const(1), c.getLocal("exp"))), c.setLocal("nPerGroupDiv2", c.i32_shr_u(c.getLocal("nPerGroup"), c.i32_const(1))), c.setLocal("nGroups", c.i32_shr_u(c.getLocal("n"), c.getLocal("exp"))), c.setLocal("pairOffset", c.i32_mul(c.getLocal("nPerGroupDiv2"), c.i32_const(n8g))), c.setLocal("pwm", c.i32_add(c.i32_const(ROOTs), c.i32_mul(c.getLocal("exp"), c.i32_const(n8f)))), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("nGroups"))), c.call(fPrefix + "_one", W), c.setLocal("j", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("nPerGroupDiv2"))), c.setLocal("idx1", c.i32_add(c.getLocal("pBuff"), c.i32_mul(c.i32_add(c.i32_mul(c.getLocal("i"), c.getLocal("nPerGroup")), c.getLocal("j")), c.i32_const(n8g)))), c.setLocal("idx2", c.i32_add(c.getLocal("idx1"), c.getLocal("pairOffset"))), c.call(opGtimesF, c.getLocal("idx2"), W, T), c.call(gPrefix + "_copy", c.getLocal("idx1"), U), c.call(gPrefix + "_add", U, T, c.getLocal("idx1")), c.call(gPrefix + "_sub", U, T, c.getLocal("idx2")), c.call(fPrefix + "_mul", W, c.getLocal("pwm"), W), c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), c.br(0))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + function buildFFTFinal() { + const f = module.addFunction(prefix + "_fftFinal"); + f.addParam("pBuff", "i32"); + f.addParam("n", "i32"); + f.addParam("factor", "i32"); + f.addLocal("idx1", "i32"); + f.addLocal("idx2", "i32"); + f.addLocal("i", "i32"); + f.addLocal("ndiv2", "i32"); + const c = f.getCodeBuilder(); + const T = c.i32_const(module.alloc(n8g)); + f.addCode(c.setLocal("ndiv2", c.i32_shr_u(c.getLocal("n"), c.i32_const(1))), c.if(c.i32_and(c.getLocal("n"), c.i32_const(1)), c.call(opGtimesF, c.i32_add(c.getLocal("pBuff"), c.i32_mul(c.getLocal("ndiv2"), c.i32_const(n8g))), c.getLocal("factor"), c.i32_add(c.getLocal("pBuff"), c.i32_mul(c.getLocal("ndiv2"), c.i32_const(n8g))))), c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_ge_u(c.getLocal("i"), c.getLocal("ndiv2"))), c.setLocal("idx1", c.i32_add(c.getLocal("pBuff"), c.i32_mul(c.getLocal("i"), c.i32_const(n8g)))), c.setLocal("idx2", c.i32_add(c.getLocal("pBuff"), c.i32_mul(c.i32_sub(c.i32_sub(c.getLocal("n"), c.i32_const(1)), c.getLocal("i")), c.i32_const(n8g)))), c.call(opGtimesF, c.getLocal("idx2"), c.getLocal("factor"), T), c.call(opGtimesF, c.getLocal("idx1"), c.getLocal("factor"), c.getLocal("idx2")), c.call(gPrefix + "_copy", T, c.getLocal("idx1")), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + buildRev(); + buildReversePermutation(); + buildFinalInverse(); + buildRawFFT(); + buildLog2(); + buildFFT(); + buildIFFT(); + buildFFTJoin(); + buildFFTJoinExt(); + buildFFTJoinExtInv(); + buildFFTMix(); + buildFFTFinal(); + buildPrepareLagrangeEvaluation(); + module.exportFunction(prefix + "__reversePermutation"); + module.exportFunction(prefix + "_fft"); + module.exportFunction(prefix + "_ifft"); + module.exportFunction(prefix + "_rawfft"); + module.exportFunction(prefix + "_fftJoin"); + module.exportFunction(prefix + "_fftJoinExt"); + module.exportFunction(prefix + "_fftJoinExtInv"); + module.exportFunction(prefix + "_fftMix"); + module.exportFunction(prefix + "_fftFinal"); + module.exportFunction(prefix + "_prepareLagrangeEvaluation"); +} +//#endregion +//#region src/build_pol.js +function buildPol(module, prefix, prefixField) { + const n8 = module.modules[prefixField].n64 * 8; + function buildZero() { + const f = module.addFunction(prefix + "_zero"); + f.addParam("px", "i32"); + f.addParam("n", "i32"); + f.addLocal("lastp", "i32"); + f.addLocal("p", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("p", c.getLocal("px")), c.setLocal("lastp", c.i32_add(c.getLocal("px"), c.i32_mul(c.getLocal("n"), c.i32_const(n8)))), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("p"), c.getLocal("lastp"))), c.call(prefixField + "_zero", c.getLocal("p")), c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(n8))), c.br(0)))); + } + function buildConstructLC() { + const f = module.addFunction(prefix + "_constructLC"); + f.addParam("ppolynomials", "i32"); + f.addParam("psignals", "i32"); + f.addParam("nSignals", "i32"); + f.addParam("pres", "i32"); + f.addLocal("i", "i32"); + f.addLocal("j", "i32"); + f.addLocal("pp", "i32"); + f.addLocal("ps", "i32"); + f.addLocal("pd", "i32"); + f.addLocal("ncoefs", "i32"); + const c = f.getCodeBuilder(); + const aux = c.i32_const(module.alloc(n8)); + f.addCode(c.setLocal("i", c.i32_const(0)), c.setLocal("pp", c.getLocal("ppolynomials")), c.setLocal("ps", c.getLocal("psignals")), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("nSignals"))), c.setLocal("ncoefs", c.i32_load(c.getLocal("pp"))), c.setLocal("pp", c.i32_add(c.getLocal("pp"), c.i32_const(4))), c.setLocal("j", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("ncoefs"))), c.setLocal("pd", c.i32_add(c.getLocal("pres"), c.i32_mul(c.i32_load(c.getLocal("pp")), c.i32_const(n8)))), c.setLocal("pp", c.i32_add(c.getLocal("pp"), c.i32_const(4))), c.call(prefixField + "_mul", c.getLocal("ps"), c.getLocal("pp"), aux), c.call(prefixField + "_add", aux, c.getLocal("pd"), c.getLocal("pd")), c.setLocal("pp", c.i32_add(c.getLocal("pp"), c.i32_const(n8))), c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), c.br(0))), c.setLocal("ps", c.i32_add(c.getLocal("ps"), c.i32_const(n8))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + buildZero(); + buildConstructLC(); + module.exportFunction(prefix + "_zero"); + module.exportFunction(prefix + "_constructLC"); + return prefix; +} +//#endregion +//#region src/build_qap.js +function buildQAP(module, prefix, prefixField) { + const n8 = module.modules[prefixField].n64 * 8; + function buildBuildABC() { + const f = module.addFunction(prefix + "_buildABC"); + f.addParam("pCoefs", "i32"); + f.addParam("nCoefs", "i32"); + f.addParam("pWitness", "i32"); + f.addParam("pA", "i32"); + f.addParam("pB", "i32"); + f.addParam("pC", "i32"); + f.addParam("offsetOut", "i32"); + f.addParam("nOut", "i32"); + f.addParam("offsetWitness", "i32"); + f.addParam("nWitness", "i32"); + f.addLocal("it", "i32"); + f.addLocal("ita", "i32"); + f.addLocal("itb", "i32"); + f.addLocal("last", "i32"); + f.addLocal("m", "i32"); + f.addLocal("c", "i32"); + f.addLocal("s", "i32"); + f.addLocal("pOut", "i32"); + const c = f.getCodeBuilder(); + const aux = c.i32_const(module.alloc(n8)); + f.addCode(c.setLocal("ita", c.getLocal("pA")), c.setLocal("itb", c.getLocal("pB")), c.setLocal("last", c.i32_add(c.getLocal("pA"), c.i32_mul(c.getLocal("nOut"), c.i32_const(n8)))), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("ita"), c.getLocal("last"))), c.call(prefixField + "_zero", c.getLocal("ita")), c.call(prefixField + "_zero", c.getLocal("itb")), c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), c.br(0))), c.setLocal("it", c.getLocal("pCoefs")), c.setLocal("last", c.i32_add(c.getLocal("pCoefs"), c.i32_mul(c.getLocal("nCoefs"), c.i32_const(n8 + 12)))), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("it"), c.getLocal("last"))), c.setLocal("s", c.i32_load(c.getLocal("it"), 8)), c.if(c.i32_or(c.i32_lt_u(c.getLocal("s"), c.getLocal("offsetWitness")), c.i32_ge_u(c.getLocal("s"), c.i32_add(c.getLocal("offsetWitness"), c.getLocal("nWitness")))), [...c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8 + 12))), ...c.br(1)]), c.setLocal("m", c.i32_load(c.getLocal("it"))), c.if(c.i32_eq(c.getLocal("m"), c.i32_const(0)), c.setLocal("pOut", c.getLocal("pA")), c.if(c.i32_eq(c.getLocal("m"), c.i32_const(1)), c.setLocal("pOut", c.getLocal("pB")), [...c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8 + 12))), ...c.br(1)])), c.setLocal("c", c.i32_load(c.getLocal("it"), 4)), c.if(c.i32_or(c.i32_lt_u(c.getLocal("c"), c.getLocal("offsetOut")), c.i32_ge_u(c.getLocal("c"), c.i32_add(c.getLocal("offsetOut"), c.getLocal("nOut")))), [...c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8 + 12))), ...c.br(1)]), c.setLocal("pOut", c.i32_add(c.getLocal("pOut"), c.i32_mul(c.i32_sub(c.getLocal("c"), c.getLocal("offsetOut")), c.i32_const(n8)))), c.call(prefixField + "_mul", c.i32_add(c.getLocal("pWitness"), c.i32_mul(c.i32_sub(c.getLocal("s"), c.getLocal("offsetWitness")), c.i32_const(n8))), c.i32_add(c.getLocal("it"), c.i32_const(12)), aux), c.call(prefixField + "_add", c.getLocal("pOut"), aux, c.getLocal("pOut")), c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8 + 12))), c.br(0))), c.setLocal("ita", c.getLocal("pA")), c.setLocal("itb", c.getLocal("pB")), c.setLocal("it", c.getLocal("pC")), c.setLocal("last", c.i32_add(c.getLocal("pA"), c.i32_mul(c.getLocal("nOut"), c.i32_const(n8)))), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("ita"), c.getLocal("last"))), c.call(prefixField + "_mul", c.getLocal("ita"), c.getLocal("itb"), c.getLocal("it")), c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8))), c.br(0)))); + } + function buildJoinABC() { + const f = module.addFunction(prefix + "_joinABC"); + f.addParam("pA", "i32"); + f.addParam("pB", "i32"); + f.addParam("pC", "i32"); + f.addParam("n", "i32"); + f.addParam("pP", "i32"); + f.addLocal("ita", "i32"); + f.addLocal("itb", "i32"); + f.addLocal("itc", "i32"); + f.addLocal("itp", "i32"); + f.addLocal("last", "i32"); + const c = f.getCodeBuilder(); + const aux = c.i32_const(module.alloc(n8)); + f.addCode(c.setLocal("ita", c.getLocal("pA")), c.setLocal("itb", c.getLocal("pB")), c.setLocal("itc", c.getLocal("pC")), c.setLocal("itp", c.getLocal("pP")), c.setLocal("last", c.i32_add(c.getLocal("pA"), c.i32_mul(c.getLocal("n"), c.i32_const(n8)))), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("ita"), c.getLocal("last"))), c.call(prefixField + "_mul", c.getLocal("ita"), c.getLocal("itb"), aux), c.call(prefixField + "_sub", aux, c.getLocal("itc"), c.getLocal("itp")), c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), c.setLocal("itc", c.i32_add(c.getLocal("itc"), c.i32_const(n8))), c.setLocal("itp", c.i32_add(c.getLocal("itp"), c.i32_const(n8))), c.br(0)))); + } + function buildBatchAdd() { + const f = module.addFunction(prefix + "_batchAdd"); + f.addParam("pa", "i32"); + f.addParam("pb", "i32"); + f.addParam("n", "i32"); + f.addParam("pr", "i32"); + f.addLocal("ita", "i32"); + f.addLocal("itb", "i32"); + f.addLocal("itr", "i32"); + f.addLocal("last", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.setLocal("ita", c.getLocal("pa")), c.setLocal("itb", c.getLocal("pb")), c.setLocal("itr", c.getLocal("pr")), c.setLocal("last", c.i32_add(c.getLocal("pa"), c.i32_mul(c.getLocal("n"), c.i32_const(n8)))), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("ita"), c.getLocal("last"))), c.call(prefixField + "_add", c.getLocal("ita"), c.getLocal("itb"), c.getLocal("itr")), c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), c.setLocal("itr", c.i32_add(c.getLocal("itr"), c.i32_const(n8))), c.br(0)))); + } + buildBuildABC(); + buildJoinABC(); + buildBatchAdd(); + module.exportFunction(prefix + "_buildABC"); + module.exportFunction(prefix + "_joinABC"); + module.exportFunction(prefix + "_batchAdd"); + return prefix; +} +//#endregion +//#region src/build_applykey.js +function buildApplyKey(module, fnName, gPrefix, frPrefix, sizeGIn, sizeGOut, sizeF, opGtimesF) { + const f = module.addFunction(fnName); + f.addParam("pIn", "i32"); + f.addParam("n", "i32"); + f.addParam("pFirst", "i32"); + f.addParam("pInc", "i32"); + f.addParam("pOut", "i32"); + f.addLocal("pOldFree", "i32"); + f.addLocal("i", "i32"); + f.addLocal("pFrom", "i32"); + f.addLocal("pTo", "i32"); + const c = f.getCodeBuilder(); + const t = c.i32_const(module.alloc(sizeF)); + f.addCode(c.setLocal("pFrom", c.getLocal("pIn")), c.setLocal("pTo", c.getLocal("pOut"))); + f.addCode(c.call(frPrefix + "_copy", c.getLocal("pFirst"), t)); + f.addCode(c.setLocal("i", c.i32_const(0)), c.block(c.loop(c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), c.call(opGtimesF, c.getLocal("pFrom"), t, c.getLocal("pTo")), c.setLocal("pFrom", c.i32_add(c.getLocal("pFrom"), c.i32_const(sizeGIn))), c.setLocal("pTo", c.i32_add(c.getLocal("pTo"), c.i32_const(sizeGOut))), c.call(frPrefix + "_mul", t, c.getLocal("pInc"), t), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + module.exportFunction(fnName); +} +//#endregion +//#region src/bn128/build_bn128.js +function buildBN128(module, _prefix) { + const prefix = _prefix || "bn128"; + if (module.modules[prefix]) return prefix; + const q = 21888242871839275222246405745257275088696311157297823662689037894645226208583n; + const r = 21888242871839275222246405745257275088548364400416034343698204186575808495617n; + const n64 = Math.floor((bitLength(q - 1n) - 1) / 64) + 1; + const n8 = n64 * 8; + const frsize = n8; + const f1size = n8; + const f2size = f1size * 2; + const ftsize = f1size * 12; + const pr = module.alloc(bigInt2BytesLE(r, frsize)); + const f1mPrefix = buildF1m(module, q, "f1m"); + buildF1(module, r, "fr", "frm"); + const pG1b = module.alloc(bigInt2BytesLE(toMontgomery(3n), f1size)); + const g1mPrefix = buildCurve(module, "g1m", "f1m", pG1b); + buildFFT(module, "frm", "frm", "frm", "frm_mul"); + buildPol(module, "pol", "frm"); + buildQAP(module, "qap", "frm"); + const f2mPrefix = buildF2m(module, "f1m_neg", "f2m", "f1m"); + const pG2b = module.alloc([...bigInt2BytesLE(toMontgomery(19485874751759354771024239261021720505790618469301721065564631296452457478373n), f1size), ...bigInt2BytesLE(toMontgomery(266929791119991161246907387137283842545076965332900288569378510910307636690n), f1size)]); + const g2mPrefix = buildCurve(module, "g2m", "f2m", pG2b); + function buildGTimesFr(fnName, opMul) { + const f = module.addFunction(fnName); + f.addParam("pG", "i32"); + f.addParam("pFr", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const AUX = c.i32_const(module.alloc(n8)); + f.addCode(c.call("frm_fromMontgomery", c.getLocal("pFr"), AUX), c.call(opMul, c.getLocal("pG"), AUX, c.i32_const(n8), c.getLocal("pr"))); + module.exportFunction(fnName); + } + buildGTimesFr("g1m_timesFr", "g1m_timesScalar"); + buildFFT(module, "g1m", "g1m", "frm", "g1m_timesFr"); + buildGTimesFr("g2m_timesFr", "g2m_timesScalar"); + buildFFT(module, "g2m", "g2m", "frm", "g2m_timesFr"); + buildGTimesFr("g1m_timesFrAffine", "g1m_timesScalarAffine"); + buildGTimesFr("g2m_timesFrAffine", "g2m_timesScalarAffine"); + buildApplyKey(module, "frm_batchApplyKey", "fmr", "frm", n8, n8, n8, "frm_mul"); + buildApplyKey(module, "g1m_batchApplyKey", "g1m", "frm", n8 * 3, n8 * 3, n8, "g1m_timesFr"); + buildApplyKey(module, "g1m_batchApplyKeyMixed", "g1m", "frm", n8 * 2, n8 * 3, n8, "g1m_timesFrAffine"); + buildApplyKey(module, "g2m_batchApplyKey", "g2m", "frm", n8 * 2 * 3, n8 * 3 * 2, n8, "g2m_timesFr"); + buildApplyKey(module, "g2m_batchApplyKeyMixed", "g2m", "frm", n8 * 2 * 2, n8 * 3 * 2, n8, "g2m_timesFrAffine"); + function toMontgomery(a) { + return BigInt(a) * (1n << BigInt(f1size * 8)) % q; + } + const G1gen = [ + 1n, + 2n, + 1n + ]; + const pG1gen = module.alloc([ + ...bigInt2BytesLE(toMontgomery(G1gen[0]), f1size), + ...bigInt2BytesLE(toMontgomery(G1gen[1]), f1size), + ...bigInt2BytesLE(toMontgomery(G1gen[2]), f1size) + ]); + const G1zero = [ + 0n, + 1n, + 0n + ]; + const pG1zero = module.alloc([ + ...bigInt2BytesLE(toMontgomery(G1zero[0]), f1size), + ...bigInt2BytesLE(toMontgomery(G1zero[1]), f1size), + ...bigInt2BytesLE(toMontgomery(G1zero[2]), f1size) + ]); + const G2gen = [ + [10857046999023057135944570762232829481370756359578518086990519993285655852781n, 11559732032986387107991004021392285783925812861821192530917403151452391805634n], + [8495653923123431417604973247489272438418190587263600148770280649306958101930n, 4082367875863433681332203403145435568316851327593401208105741076214120093531n], + [1n, 0n] + ]; + const pG2gen = module.alloc([ + ...bigInt2BytesLE(toMontgomery(G2gen[0][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[0][1]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[1][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[1][1]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[2][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[2][1]), f1size) + ]); + const G2zero = [ + [0n, 0n], + [1n, 0n], + [0n, 0n] + ]; + const pG2zero = module.alloc([ + ...bigInt2BytesLE(toMontgomery(G2zero[0][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[0][1]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[1][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[1][1]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[2][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[2][1]), f1size) + ]); + const pOneT = module.alloc([ + ...bigInt2BytesLE(toMontgomery(1), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size), + ...bigInt2BytesLE(toMontgomery(0), f1size) + ]); + const pNonResidueF6 = module.alloc([...bigInt2BytesLE(toMontgomery(9), f1size), ...bigInt2BytesLE(toMontgomery(1), f1size)]); + const pTwoInv = module.alloc([...bigInt2BytesLE(toMontgomery(modInv(2n, q)), f1size), ...bigInt2BytesLE(0n, f1size)]); + const pAltBn128Twist = pNonResidueF6; + const pTwistCoefB = module.alloc([...bigInt2BytesLE(toMontgomery(19485874751759354771024239261021720505790618469301721065564631296452457478373n), f1size), ...bigInt2BytesLE(toMontgomery(266929791119991161246907387137283842545076965332900288569378510910307636690n), f1size)]); + function build_mulNR6() { + const f = module.addFunction(prefix + "_mulNR6"); + f.addParam("x", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), c.getLocal("x"), c.getLocal("pr"))); + } + build_mulNR6(); + const f6mPrefix = buildF3m(module, prefix + "_mulNR6", "f6m", "f2m"); + function build_mulNR12() { + const f = module.addFunction(prefix + "_mulNR12"); + f.addParam("x", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), c.i32_add(c.getLocal("x"), c.i32_const(n8 * 4)), c.getLocal("pr")), c.call(f2mPrefix + "_copy", c.getLocal("x"), c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 2))), c.call(f2mPrefix + "_copy", c.i32_add(c.getLocal("x"), c.i32_const(n8 * 2)), c.i32_add(c.getLocal("pr"), c.i32_const(n8 * 4)))); + } + build_mulNR12(); + const ftmPrefix = buildF2m(module, prefix + "_mulNR12", "ftm", f6mPrefix); + const ateLoopBitBytes = bits(29793968203157093288n); + const pAteLoopBitBytes = module.alloc(ateLoopBitBytes); + const ateCoefSize = 3 * f2size; + const ateNDblCoefs = ateLoopBitBytes.length - 1; + const ateNCoefs = ateLoopBitBytes.reduce((acc, b) => acc + (b != 0 ? 1 : 0), 0) + ateNDblCoefs + 1; + const prePSize = 6 * n8; + const preQSize = 3 * n8 * 2 + ateNCoefs * ateCoefSize; + module.modules[prefix] = { + n64, + pG1gen, + pG1zero, + pG1b, + pG2gen, + pG2zero, + pG2b, + pq: module.modules["f1m"].pq, + pr, + pOneT, + prePSize, + preQSize, + r: r.toString(), + q: q.toString() + }; + const finalExpZ = 4965661367192848881n; + function naf(n) { + let E = n; + const res = []; + while (E > 0n) { + if (isOdd(E)) { + const z = 2 - Number(E % 4n); + res.push(z); + E = E - BigInt(z); + } else res.push(0); + E = E >> 1n; + } + return res; + } + function bits(n) { + let E = n; + const res = []; + while (E > 0n) { + if (isOdd(E)) res.push(1); + else res.push(0); + E = E >> 1n; + } + return res; + } + function buildPrepareG1() { + const f = module.addFunction(prefix + "_prepareG1"); + f.addParam("pP", "i32"); + f.addParam("ppreP", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(g1mPrefix + "_normalize", c.getLocal("pP"), c.getLocal("ppreP"))); + } + function buildPrepAddStep() { + const f = module.addFunction(prefix + "_prepAddStep"); + f.addParam("pQ", "i32"); + f.addParam("pR", "i32"); + f.addParam("pCoef", "i32"); + const c = f.getCodeBuilder(); + const X2 = c.getLocal("pQ"); + const Y2 = c.i32_add(c.getLocal("pQ"), c.i32_const(f2size)); + const X1 = c.getLocal("pR"); + const Y1 = c.i32_add(c.getLocal("pR"), c.i32_const(f2size)); + const Z1 = c.i32_add(c.getLocal("pR"), c.i32_const(2 * f2size)); + const ELL_0 = c.getLocal("pCoef"); + const ELL_VW = c.i32_add(c.getLocal("pCoef"), c.i32_const(f2size)); + const ELL_VV = c.i32_add(c.getLocal("pCoef"), c.i32_const(2 * f2size)); + const D = ELL_VW; + const E = c.i32_const(module.alloc(f2size)); + const F = c.i32_const(module.alloc(f2size)); + const G = c.i32_const(module.alloc(f2size)); + const H = c.i32_const(module.alloc(f2size)); + const I = c.i32_const(module.alloc(f2size)); + const J = c.i32_const(module.alloc(f2size)); + const AUX = c.i32_const(module.alloc(f2size)); + f.addCode(c.call(f2mPrefix + "_mul", X2, Z1, D), c.call(f2mPrefix + "_sub", X1, D, D), c.call(f2mPrefix + "_mul", Y2, Z1, E), c.call(f2mPrefix + "_sub", Y1, E, E), c.call(f2mPrefix + "_square", D, F), c.call(f2mPrefix + "_square", E, G), c.call(f2mPrefix + "_mul", D, F, H), c.call(f2mPrefix + "_mul", X1, F, I), c.call(f2mPrefix + "_add", I, I, AUX), c.call(f2mPrefix + "_mul", Z1, G, J), c.call(f2mPrefix + "_add", H, J, J), c.call(f2mPrefix + "_sub", J, AUX, J), c.call(f2mPrefix + "_mul", D, J, X1), c.call(f2mPrefix + "_mul", H, Y1, Y1), c.call(f2mPrefix + "_sub", I, J, AUX), c.call(f2mPrefix + "_mul", E, AUX, AUX), c.call(f2mPrefix + "_sub", AUX, Y1, Y1), c.call(f2mPrefix + "_mul", Z1, H, Z1), c.call(f2mPrefix + "_mul", D, Y2, AUX), c.call(f2mPrefix + "_mul", E, X2, ELL_0), c.call(f2mPrefix + "_sub", ELL_0, AUX, ELL_0), c.call(f2mPrefix + "_mul", ELL_0, c.i32_const(pAltBn128Twist), ELL_0), c.call(f2mPrefix + "_neg", E, ELL_VV)); + } + function buildPrepDoubleStep() { + const f = module.addFunction(prefix + "_prepDblStep"); + f.addParam("pR", "i32"); + f.addParam("pCoef", "i32"); + const c = f.getCodeBuilder(); + const X1 = c.getLocal("pR"); + const Y1 = c.i32_add(c.getLocal("pR"), c.i32_const(f2size)); + const Z1 = c.i32_add(c.getLocal("pR"), c.i32_const(2 * f2size)); + const ELL_0 = c.getLocal("pCoef"); + const ELL_VW = c.i32_add(c.getLocal("pCoef"), c.i32_const(f2size)); + const ELL_VV = c.i32_add(c.getLocal("pCoef"), c.i32_const(2 * f2size)); + const A = c.i32_const(module.alloc(f2size)); + const B = c.i32_const(module.alloc(f2size)); + const C = c.i32_const(module.alloc(f2size)); + const D = c.i32_const(module.alloc(f2size)); + const E = c.i32_const(module.alloc(f2size)); + const F = c.i32_const(module.alloc(f2size)); + const G = c.i32_const(module.alloc(f2size)); + const H = c.i32_const(module.alloc(f2size)); + const I = c.i32_const(module.alloc(f2size)); + const J = c.i32_const(module.alloc(f2size)); + const E2 = c.i32_const(module.alloc(f2size)); + const AUX = c.i32_const(module.alloc(f2size)); + f.addCode(c.call(f2mPrefix + "_mul", Y1, c.i32_const(pTwoInv), A), c.call(f2mPrefix + "_mul", X1, A, A), c.call(f2mPrefix + "_square", Y1, B), c.call(f2mPrefix + "_square", Z1, C), c.call(f2mPrefix + "_add", C, C, D), c.call(f2mPrefix + "_add", D, C, D), c.call(f2mPrefix + "_mul", c.i32_const(pTwistCoefB), D, E), c.call(f2mPrefix + "_add", E, E, F), c.call(f2mPrefix + "_add", E, F, F), c.call(f2mPrefix + "_add", B, F, G), c.call(f2mPrefix + "_mul", G, c.i32_const(pTwoInv), G), c.call(f2mPrefix + "_add", B, C, AUX), c.call(f2mPrefix + "_add", Y1, Z1, H), c.call(f2mPrefix + "_square", H, H), c.call(f2mPrefix + "_sub", H, AUX, H), c.call(f2mPrefix + "_sub", E, B, I), c.call(f2mPrefix + "_square", X1, J), c.call(f2mPrefix + "_square", E, E2), c.call(f2mPrefix + "_sub", B, F, AUX), c.call(f2mPrefix + "_mul", A, AUX, X1), c.call(f2mPrefix + "_add", E2, E2, AUX), c.call(f2mPrefix + "_add", E2, AUX, AUX), c.call(f2mPrefix + "_square", G, Y1), c.call(f2mPrefix + "_sub", Y1, AUX, Y1), c.call(f2mPrefix + "_mul", B, H, Z1), c.call(f2mPrefix + "_mul", c.i32_const(pAltBn128Twist), I, ELL_0), c.call(f2mPrefix + "_neg", H, ELL_VW), c.call(f2mPrefix + "_add", J, J, ELL_VV), c.call(f2mPrefix + "_add", J, ELL_VV, ELL_VV)); + } + function buildMulByQ() { + const f = module.addFunction(prefix + "_mulByQ"); + f.addParam("p1", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("p1"); + const y = c.i32_add(c.getLocal("p1"), c.i32_const(f2size)); + const z = c.i32_add(c.getLocal("p1"), c.i32_const(f2size * 2)); + const x3 = c.getLocal("pr"); + const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(f2size)); + const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(f2size * 2)); + const MulByQX = c.i32_const(module.alloc([...bigInt2BytesLE(toMontgomery("21575463638280843010398324269430826099269044274347216827212613867836435027261"), f1size), ...bigInt2BytesLE(toMontgomery("10307601595873709700152284273816112264069230130616436755625194854815875713954"), f1size)])); + const MulByQY = c.i32_const(module.alloc([...bigInt2BytesLE(toMontgomery("2821565182194536844548159561693502659359617185244120367078079554186484126554"), f1size), ...bigInt2BytesLE(toMontgomery("3505843767911556378687030309984248845540243509899259641013678093033130930403"), f1size)])); + f.addCode(c.call(f2mPrefix + "_conjugate", x, x3), c.call(f2mPrefix + "_mul", MulByQX, x3, x3), c.call(f2mPrefix + "_conjugate", y, y3), c.call(f2mPrefix + "_mul", MulByQY, y3, y3), c.call(f2mPrefix + "_conjugate", z, z3)); + } + function buildPrepareG2() { + buildMulByQ(); + const f = module.addFunction(prefix + "_prepareG2"); + f.addParam("pQ", "i32"); + f.addParam("ppreQ", "i32"); + f.addLocal("pCoef", "i32"); + f.addLocal("i", "i32"); + const c = f.getCodeBuilder(); + const QX = c.getLocal("pQ"); + const pR = module.alloc(f2size * 3); + const R = c.i32_const(pR); + const RX = c.i32_const(pR); + const RY = c.i32_const(pR + f2size); + const RZ = c.i32_const(pR + 2 * f2size); + const cQX = c.i32_add(c.getLocal("ppreQ"), c.i32_const(0)); + const cQY = c.i32_add(c.getLocal("ppreQ"), c.i32_const(f2size)); + const pQ1 = module.alloc(f2size * 3); + const Q1 = c.i32_const(pQ1); + const pQ2 = module.alloc(f2size * 3); + const Q2 = c.i32_const(pQ2); + const Q2Y = c.i32_const(pQ2 + f2size); + f.addCode(c.call(g2mPrefix + "_normalize", QX, cQX), c.call(f2mPrefix + "_copy", cQX, RX), c.call(f2mPrefix + "_copy", cQY, RY), c.call(f2mPrefix + "_one", RZ)); + f.addCode(c.setLocal("pCoef", c.i32_add(c.getLocal("ppreQ"), c.i32_const(f2size * 3))), c.setLocal("i", c.i32_const(ateLoopBitBytes.length - 2)), c.block(c.loop(c.call(prefix + "_prepDblStep", R, c.getLocal("pCoef")), c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), c.if(c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), [...c.call(prefix + "_prepAddStep", cQX, R, c.getLocal("pCoef")), ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize)))]), c.br_if(1, c.i32_eqz(c.getLocal("i"))), c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + f.addCode(c.call(prefix + "_mulByQ", cQX, Q1), c.call(prefix + "_mulByQ", Q1, Q2)); + f.addCode(c.call(f2mPrefix + "_neg", Q2Y, Q2Y), c.call(prefix + "_prepAddStep", Q1, R, c.getLocal("pCoef")), c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), c.call(prefix + "_prepAddStep", Q2, R, c.getLocal("pCoef")), c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize)))); + } + function buildMulBy024Old() { + const f = module.addFunction(prefix + "__mulBy024Old"); + f.addParam("pEll0", "i32"); + f.addParam("pEllVW", "i32"); + f.addParam("pEllVV", "i32"); + f.addParam("pR", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("pEll0"); + const x2 = c.getLocal("pEllVV"); + const x4 = c.getLocal("pEllVW"); + const z0 = c.getLocal("pR"); + const pAUX12 = module.alloc(ftsize); + const AUX12 = c.i32_const(pAUX12); + const AUX12_0 = c.i32_const(pAUX12); + const AUX12_2 = c.i32_const(pAUX12 + f2size); + const AUX12_4 = c.i32_const(pAUX12 + f2size * 2); + const AUX12_6 = c.i32_const(pAUX12 + f2size * 3); + const AUX12_8 = c.i32_const(pAUX12 + f2size * 4); + const AUX12_10 = c.i32_const(pAUX12 + f2size * 5); + f.addCode(c.call(f2mPrefix + "_copy", x0, AUX12_0), c.call(f2mPrefix + "_zero", AUX12_2), c.call(f2mPrefix + "_copy", x2, AUX12_4), c.call(f2mPrefix + "_zero", AUX12_6), c.call(f2mPrefix + "_copy", x4, AUX12_8), c.call(f2mPrefix + "_zero", AUX12_10), c.call(ftmPrefix + "_mul", AUX12, z0, z0)); + } + function buildMulBy024() { + const f = module.addFunction(prefix + "__mulBy024"); + f.addParam("pEll0", "i32"); + f.addParam("pEllVW", "i32"); + f.addParam("pEllVV", "i32"); + f.addParam("pR", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("pEll0"); + const x2 = c.getLocal("pEllVV"); + const x4 = c.getLocal("pEllVW"); + const z0 = c.getLocal("pR"); + const z1 = c.i32_add(c.getLocal("pR"), c.i32_const(2 * n8)); + const z2 = c.i32_add(c.getLocal("pR"), c.i32_const(4 * n8)); + const z3 = c.i32_add(c.getLocal("pR"), c.i32_const(6 * n8)); + const z4 = c.i32_add(c.getLocal("pR"), c.i32_const(8 * n8)); + const z5 = c.i32_add(c.getLocal("pR"), c.i32_const(10 * n8)); + const t0 = c.i32_const(module.alloc(f2size)); + const t1 = c.i32_const(module.alloc(f2size)); + const t2 = c.i32_const(module.alloc(f2size)); + const s0 = c.i32_const(module.alloc(f2size)); + const T3 = c.i32_const(module.alloc(f2size)); + const T4 = c.i32_const(module.alloc(f2size)); + const D0 = c.i32_const(module.alloc(f2size)); + const D2 = c.i32_const(module.alloc(f2size)); + const D4 = c.i32_const(module.alloc(f2size)); + const S1 = c.i32_const(module.alloc(f2size)); + const AUX = c.i32_const(module.alloc(f2size)); + f.addCode(c.call(f2mPrefix + "_mul", z0, x0, D0), c.call(f2mPrefix + "_mul", z2, x2, D2), c.call(f2mPrefix + "_mul", z4, x4, D4), c.call(f2mPrefix + "_add", z0, z4, t2), c.call(f2mPrefix + "_add", z0, z2, t1), c.call(f2mPrefix + "_add", z1, z3, s0), c.call(f2mPrefix + "_add", s0, z5, s0), c.call(f2mPrefix + "_mul", z1, x2, S1), c.call(f2mPrefix + "_add", S1, D4, T3), c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), c.call(f2mPrefix + "_add", T4, D0, z0), c.call(f2mPrefix + "_mul", z5, x4, T3), c.call(f2mPrefix + "_add", S1, T3, S1), c.call(f2mPrefix + "_add", T3, D2, T3), c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), c.call(f2mPrefix + "_mul", z1, x0, T3), c.call(f2mPrefix + "_add", S1, T3, S1), c.call(f2mPrefix + "_add", T4, T3, z1), c.call(f2mPrefix + "_add", x0, x2, t0), c.call(f2mPrefix + "_mul", t1, t0, T3), c.call(f2mPrefix + "_add", D0, D2, AUX), c.call(f2mPrefix + "_sub", T3, AUX, T3), c.call(f2mPrefix + "_mul", z3, x4, T4), c.call(f2mPrefix + "_add", S1, T4, S1), c.call(f2mPrefix + "_add", z2, z4, t0), c.call(f2mPrefix + "_add", T3, T4, z2), c.call(f2mPrefix + "_add", x2, x4, t1), c.call(f2mPrefix + "_mul", t1, t0, T3), c.call(f2mPrefix + "_add", D2, D4, AUX), c.call(f2mPrefix + "_sub", T3, AUX, T3), c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), c.call(f2mPrefix + "_mul", z3, x0, T3), c.call(f2mPrefix + "_add", S1, T3, S1), c.call(f2mPrefix + "_add", T4, T3, z3), c.call(f2mPrefix + "_mul", z5, x2, T3), c.call(f2mPrefix + "_add", S1, T3, S1), c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), c.call(f2mPrefix + "_add", x0, x4, t0), c.call(f2mPrefix + "_mul", t2, t0, T3), c.call(f2mPrefix + "_add", D0, D4, AUX), c.call(f2mPrefix + "_sub", T3, AUX, T3), c.call(f2mPrefix + "_add", T4, T3, z4), c.call(f2mPrefix + "_add", x0, x2, t0), c.call(f2mPrefix + "_add", t0, x4, t0), c.call(f2mPrefix + "_mul", s0, t0, T3), c.call(f2mPrefix + "_sub", T3, S1, z5)); + } + function buildMillerLoop() { + const f = module.addFunction(prefix + "_millerLoop"); + f.addParam("ppreP", "i32"); + f.addParam("ppreQ", "i32"); + f.addParam("r", "i32"); + f.addLocal("pCoef", "i32"); + f.addLocal("i", "i32"); + const c = f.getCodeBuilder(); + const preP_PX = c.getLocal("ppreP"); + const preP_PY = c.i32_add(c.getLocal("ppreP"), c.i32_const(f1size)); + const ELL_0 = c.getLocal("pCoef"); + const ELL_VW = c.i32_add(c.getLocal("pCoef"), c.i32_const(f2size)); + const ELL_VV = c.i32_add(c.getLocal("pCoef"), c.i32_const(2 * f2size)); + const pVW = module.alloc(f2size); + const VW = c.i32_const(pVW); + const pVV = module.alloc(f2size); + const VV = c.i32_const(pVV); + const F = c.getLocal("r"); + f.addCode(c.call(ftmPrefix + "_one", F), c.setLocal("pCoef", c.i32_add(c.getLocal("ppreQ"), c.i32_const(f2size * 3))), c.setLocal("i", c.i32_const(ateLoopBitBytes.length - 2)), c.block(c.loop(c.call(ftmPrefix + "_square", F, F), c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), c.if(c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), [ + ...c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), + ...c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), + ...c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), + ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))) + ]), c.br_if(1, c.i32_eqz(c.getLocal("i"))), c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + f.addCode(c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize)))); + } + function buildFrobeniusMap(n) { + const F12 = [[ + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n] + ], [ + [1n, 0n], + [8376118865763821496583973867626364092589906065868298776909617916018768340080n, 16469823323077808223889137241176536799009286646108169935659301613961712198316n], + [21888242871839275220042445260109153167277707414472061641714758635765020556617n, 0n], + [11697423496358154304825782922584725312912383441159505038794027105778954184319n, 303847389135065887422783454877609941456349188919719272345083954437860409601n], + [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n], + [3321304630594332808241809054958361220322477375291206261884409189760185844239n, 5722266937896532885780051958958348231143373700109372999374820235121374419868n], + [21888242871839275222246405745257275088696311157297823662689037894645226208582n, 0n], + [13512124006075453725662431877630910996106405091429524885779419978626457868503n, 5418419548761466998357268504080738289687024511189653727029736280683514010267n], + [2203960485148121921418603742825762020974279258880205651966n, 0n], + [10190819375481120917420622822672549775783927716138318623895010788866272024264n, 21584395482704209334823622290379665147239961968378104390343953940207365798982n], + [2203960485148121921418603742825762020974279258880205651967n, 0n], + [18566938241244942414004596690298913868373833782006617400804628704885040364344n, 16165975933942742336466353786298926857552937457188450663314217659523851788715n] + ]]; + const F6 = [ + [ + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n] + ], + [ + [1n, 0n], + [21575463638280843010398324269430826099269044274347216827212613867836435027261n, 10307601595873709700152284273816112264069230130616436755625194854815875713954n], + [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n], + [3772000881919853776433695186713858239009073593817195771773381919316419345261n, 2236595495967245188281701248203181795121068902605861227855261137820944008926n], + [2203960485148121921418603742825762020974279258880205651966n, 0n], + [18429021223477853657660792034369865839114504446431234726392080002137598044644n, 9344045779998320333812420223237981029506012124075525679208581902008406485703n] + ], + [ + [1n, 0n], + [2581911344467009335267311115468803099551665605076196740867805258568234346338n, 19937756971775647987995932169929341994314640652964949448313374472400716661030n], + [2203960485148121921418603742825762020974279258880205651966n, 0n], + [5324479202449903542726783395506214481928257762400643279780343368557297135718n, 16208900380737693084919495127334387981393726419856888799917914180988844123039n], + [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n], + [13981852324922362344252311234282257507216387789820983642040889267519694726527n, 7629828391165209371577384193250820201684255241773809077146787135900891633097n] + ] + ]; + const f = module.addFunction(prefix + "__frobeniusMap" + n); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + for (let i = 0; i < 6; i++) { + const X = i == 0 ? c.getLocal("x") : c.i32_add(c.getLocal("x"), c.i32_const(i * f2size)); + const Xc0 = X; + const Xc1 = c.i32_add(c.getLocal("x"), c.i32_const(i * f2size + f1size)); + const R = i == 0 ? c.getLocal("r") : c.i32_add(c.getLocal("r"), c.i32_const(i * f2size)); + const Rc0 = R; + const Rc1 = c.i32_add(c.getLocal("r"), c.i32_const(i * f2size + f1size)); + const coef = mul2(F12[Math.floor(i / 3)][n % 12], F6[i % 3][n % 6]); + const pCoef = module.alloc([...bigInt2BytesLE(toMontgomery(coef[0]), 32), ...bigInt2BytesLE(toMontgomery(coef[1]), 32)]); + if (n % 2 == 1) f.addCode(c.call(f1mPrefix + "_copy", Xc0, Rc0), c.call(f1mPrefix + "_neg", Xc1, Rc1), c.call(f2mPrefix + "_mul", R, c.i32_const(pCoef), R)); + else f.addCode(c.call(f2mPrefix + "_mul", X, c.i32_const(pCoef), R)); + } + function mul2(a, b) { + const ac0 = BigInt(a[0]); + const ac1 = BigInt(a[1]); + const bc0 = BigInt(b[0]); + const bc1 = BigInt(b[1]); + const res = [(ac0 * bc0 - ac1 * bc1) % q, (ac0 * bc1 + ac1 * bc0) % q]; + if (isNegative(res[0])) res[0] = res[0] + q; + return res; + } + } + function buildFinalExponentiationFirstChunk() { + const f = module.addFunction(prefix + "__finalExponentiationFirstChunk"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const elt = c.getLocal("x"); + const eltC0 = elt; + const eltC1 = c.i32_add(elt, c.i32_const(n8 * 6)); + const r = c.getLocal("r"); + const pA = module.alloc(ftsize); + const A = c.i32_const(pA); + const Ac0 = A; + const Ac1 = c.i32_const(pA + n8 * 6); + const B = c.i32_const(module.alloc(ftsize)); + const C = c.i32_const(module.alloc(ftsize)); + const D = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(f6mPrefix + "_copy", eltC0, Ac0), c.call(f6mPrefix + "_neg", eltC1, Ac1), c.call(ftmPrefix + "_inverse", elt, B), c.call(ftmPrefix + "_mul", A, B, C), c.call(prefix + "__frobeniusMap2", C, D), c.call(ftmPrefix + "_mul", C, D, r)); + } + function buildCyclotomicSquare() { + const f = module.addFunction(prefix + "__cyclotomicSquare"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x4 = c.i32_add(c.getLocal("x"), c.i32_const(f2size)); + const x3 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f2size)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(3 * f2size)); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(4 * f2size)); + const x5 = c.i32_add(c.getLocal("x"), c.i32_const(5 * f2size)); + const r0 = c.getLocal("r"); + const r4 = c.i32_add(c.getLocal("r"), c.i32_const(f2size)); + const r3 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f2size)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(3 * f2size)); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(4 * f2size)); + const r5 = c.i32_add(c.getLocal("r"), c.i32_const(5 * f2size)); + const t0 = c.i32_const(module.alloc(f2size)); + const t1 = c.i32_const(module.alloc(f2size)); + const t2 = c.i32_const(module.alloc(f2size)); + const t3 = c.i32_const(module.alloc(f2size)); + const t4 = c.i32_const(module.alloc(f2size)); + const t5 = c.i32_const(module.alloc(f2size)); + const tmp = c.i32_const(module.alloc(f2size)); + const AUX = c.i32_const(module.alloc(f2size)); + f.addCode(c.call(f2mPrefix + "_mul", x0, x1, tmp), c.call(f2mPrefix + "_mul", x1, c.i32_const(pNonResidueF6), t0), c.call(f2mPrefix + "_add", x0, t0, t0), c.call(f2mPrefix + "_add", x0, x1, AUX), c.call(f2mPrefix + "_mul", AUX, t0, t0), c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), tmp, AUX), c.call(f2mPrefix + "_add", tmp, AUX, AUX), c.call(f2mPrefix + "_sub", t0, AUX, t0), c.call(f2mPrefix + "_add", tmp, tmp, t1), c.call(f2mPrefix + "_mul", x2, x3, tmp), c.call(f2mPrefix + "_mul", x3, c.i32_const(pNonResidueF6), t2), c.call(f2mPrefix + "_add", x2, t2, t2), c.call(f2mPrefix + "_add", x2, x3, AUX), c.call(f2mPrefix + "_mul", AUX, t2, t2), c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), tmp, AUX), c.call(f2mPrefix + "_add", tmp, AUX, AUX), c.call(f2mPrefix + "_sub", t2, AUX, t2), c.call(f2mPrefix + "_add", tmp, tmp, t3), c.call(f2mPrefix + "_mul", x4, x5, tmp), c.call(f2mPrefix + "_mul", x5, c.i32_const(pNonResidueF6), t4), c.call(f2mPrefix + "_add", x4, t4, t4), c.call(f2mPrefix + "_add", x4, x5, AUX), c.call(f2mPrefix + "_mul", AUX, t4, t4), c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), tmp, AUX), c.call(f2mPrefix + "_add", tmp, AUX, AUX), c.call(f2mPrefix + "_sub", t4, AUX, t4), c.call(f2mPrefix + "_add", tmp, tmp, t5), c.call(f2mPrefix + "_sub", t0, x0, r0), c.call(f2mPrefix + "_add", r0, r0, r0), c.call(f2mPrefix + "_add", t0, r0, r0), c.call(f2mPrefix + "_add", t1, x1, r1), c.call(f2mPrefix + "_add", r1, r1, r1), c.call(f2mPrefix + "_add", t1, r1, r1), c.call(f2mPrefix + "_mul", t5, c.i32_const(pAltBn128Twist), AUX), c.call(f2mPrefix + "_add", AUX, x2, r2), c.call(f2mPrefix + "_add", r2, r2, r2), c.call(f2mPrefix + "_add", AUX, r2, r2), c.call(f2mPrefix + "_sub", t4, x3, r3), c.call(f2mPrefix + "_add", r3, r3, r3), c.call(f2mPrefix + "_add", t4, r3, r3), c.call(f2mPrefix + "_sub", t2, x4, r4), c.call(f2mPrefix + "_add", r4, r4, r4), c.call(f2mPrefix + "_add", t2, r4, r4), c.call(f2mPrefix + "_add", t3, x5, r5), c.call(f2mPrefix + "_add", r5, r5, r5), c.call(f2mPrefix + "_add", t3, r5, r5)); + } + function buildCyclotomicExp(exponent, fnName) { + const exponentNafBytes = naf(exponent).map((b) => b == -1 ? 255 : b); + const pExponentNafBytes = module.alloc(exponentNafBytes); + const f = module.addFunction(prefix + "__cyclotomicExp_" + fnName); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + f.addLocal("bit", "i32"); + f.addLocal("i", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("x"); + const res = c.getLocal("r"); + const inverse = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(ftmPrefix + "_conjugate", x, inverse), c.call(ftmPrefix + "_one", res), c.if(c.teeLocal("bit", c.i32_load8_s(c.i32_const(exponentNafBytes.length - 1), pExponentNafBytes)), c.if(c.i32_eq(c.getLocal("bit"), c.i32_const(1)), c.call(ftmPrefix + "_mul", res, x, res), c.call(ftmPrefix + "_mul", res, inverse, res))), c.setLocal("i", c.i32_const(exponentNafBytes.length - 2)), c.block(c.loop(c.call(prefix + "__cyclotomicSquare", res, res), c.if(c.teeLocal("bit", c.i32_load8_s(c.getLocal("i"), pExponentNafBytes)), c.if(c.i32_eq(c.getLocal("bit"), c.i32_const(1)), c.call(ftmPrefix + "_mul", res, x, res), c.call(ftmPrefix + "_mul", res, inverse, res))), c.br_if(1, c.i32_eqz(c.getLocal("i"))), c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + function buildFinalExponentiationLastChunk() { + buildCyclotomicSquare(); + buildCyclotomicExp(finalExpZ, "w0"); + const f = module.addFunction(prefix + "__finalExponentiationLastChunk"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const elt = c.getLocal("x"); + const result = c.getLocal("r"); + const A = c.i32_const(module.alloc(ftsize)); + const B = c.i32_const(module.alloc(ftsize)); + const C = c.i32_const(module.alloc(ftsize)); + const D = c.i32_const(module.alloc(ftsize)); + const E = c.i32_const(module.alloc(ftsize)); + const F = c.i32_const(module.alloc(ftsize)); + const G = c.i32_const(module.alloc(ftsize)); + const H = c.i32_const(module.alloc(ftsize)); + const I = c.i32_const(module.alloc(ftsize)); + const J = c.i32_const(module.alloc(ftsize)); + const K = c.i32_const(module.alloc(ftsize)); + const L = c.i32_const(module.alloc(ftsize)); + const M = c.i32_const(module.alloc(ftsize)); + const N = c.i32_const(module.alloc(ftsize)); + const O = c.i32_const(module.alloc(ftsize)); + const P = c.i32_const(module.alloc(ftsize)); + const Q = c.i32_const(module.alloc(ftsize)); + const R = c.i32_const(module.alloc(ftsize)); + const S = c.i32_const(module.alloc(ftsize)); + const T = c.i32_const(module.alloc(ftsize)); + const U = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(prefix + "__cyclotomicExp_w0", elt, A), c.call(ftmPrefix + "_conjugate", A, A), c.call(prefix + "__cyclotomicSquare", A, B), c.call(prefix + "__cyclotomicSquare", B, C), c.call(ftmPrefix + "_mul", C, B, D), c.call(prefix + "__cyclotomicExp_w0", D, E), c.call(ftmPrefix + "_conjugate", E, E), c.call(prefix + "__cyclotomicSquare", E, F), c.call(prefix + "__cyclotomicExp_w0", F, G), c.call(ftmPrefix + "_conjugate", G, G), c.call(ftmPrefix + "_conjugate", D, H), c.call(ftmPrefix + "_conjugate", G, I), c.call(ftmPrefix + "_mul", I, E, J), c.call(ftmPrefix + "_mul", J, H, K), c.call(ftmPrefix + "_mul", K, B, L), c.call(ftmPrefix + "_mul", K, E, M), c.call(ftmPrefix + "_mul", M, elt, N), c.call(prefix + "__frobeniusMap1", L, O), c.call(ftmPrefix + "_mul", O, N, P), c.call(prefix + "__frobeniusMap2", K, Q), c.call(ftmPrefix + "_mul", Q, P, R), c.call(ftmPrefix + "_conjugate", elt, S), c.call(ftmPrefix + "_mul", S, L, T), c.call(prefix + "__frobeniusMap3", T, U), c.call(ftmPrefix + "_mul", U, R, result)); + } + function buildFinalExponentiation() { + buildFinalExponentiationFirstChunk(); + buildFinalExponentiationLastChunk(); + const f = module.addFunction(prefix + "_finalExponentiation"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const elt = c.getLocal("x"); + const result = c.getLocal("r"); + const eltToFirstChunk = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(prefix + "__finalExponentiationFirstChunk", elt, eltToFirstChunk), c.call(prefix + "__finalExponentiationLastChunk", eltToFirstChunk, result)); + } + function buildFinalExponentiationOld() { + const f = module.addFunction(prefix + "_finalExponentiationOld"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const pExponent = module.alloc(bigInt2BytesLE(552484233613224096312617126783173147097382103762957654188882734314196910839907541213974502761540629817009608548654680343627701153829446747810907373256841551006201639677726139946029199968412598804882391702273019083653272047566316584365559776493027495458238373902875937659943504873220554161550525926302303331747463515644711876653177129578303191095900909191624817826566688241804408081892785725967931714097716709526092261278071952560171111444072049229123565057483750161460024353346284167282452756217662335528813519139808291170539072125381230815729071544861602750936964829313608137325426383735122175229541155376346436093930287402089517426973178917569713384748081827255472576937471496195752727188261435633271238710131736096299798168852925540549342330775279877006784354801422249722573783561685179618816480037695005515426162362431072245638324744480n, 352)); + const c = f.getCodeBuilder(); + f.addCode(c.call(ftmPrefix + "_exp", c.getLocal("x"), c.i32_const(pExponent), c.i32_const(352), c.getLocal("r"))); + } + const pPreP = module.alloc(prePSize); + const pPreQ = module.alloc(preQSize); + function buildPairingEquation(nPairings) { + const f = module.addFunction(prefix + "_pairingEq" + nPairings); + for (let i = 0; i < nPairings; i++) { + f.addParam("p_" + i, "i32"); + f.addParam("q_" + i, "i32"); + } + f.addParam("c", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const resT = c.i32_const(module.alloc(ftsize)); + const auxT = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(ftmPrefix + "_one", resT)); + for (let i = 0; i < nPairings; i++) { + f.addCode(c.call(prefix + "_prepareG1", c.getLocal("p_" + i), c.i32_const(pPreP))); + f.addCode(c.call(prefix + "_prepareG2", c.getLocal("q_" + i), c.i32_const(pPreQ))); + f.addCode(c.call(prefix + "_millerLoop", c.i32_const(pPreP), c.i32_const(pPreQ), auxT)); + f.addCode(c.call(ftmPrefix + "_mul", resT, auxT, resT)); + } + f.addCode(c.call(prefix + "_finalExponentiation", resT, resT)); + f.addCode(c.call(ftmPrefix + "_eq", resT, c.getLocal("c"))); + } + function buildPairing() { + const f = module.addFunction(prefix + "_pairing"); + f.addParam("p", "i32"); + f.addParam("q", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const resT = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(prefix + "_prepareG1", c.getLocal("p"), c.i32_const(pPreP))); + f.addCode(c.call(prefix + "_prepareG2", c.getLocal("q"), c.i32_const(pPreQ))); + f.addCode(c.call(prefix + "_millerLoop", c.i32_const(pPreP), c.i32_const(pPreQ), resT)); + f.addCode(c.call(prefix + "_finalExponentiation", resT, c.getLocal("r"))); + } + buildPrepAddStep(); + buildPrepDoubleStep(); + buildPrepareG1(); + buildPrepareG2(); + buildMulBy024(); + buildMulBy024Old(); + buildMillerLoop(); + for (let i = 0; i < 10; i++) { + buildFrobeniusMap(i); + module.exportFunction(prefix + "__frobeniusMap" + i); + } + buildFinalExponentiationOld(); + buildFinalExponentiation(); + for (let i = 1; i <= 5; i++) { + buildPairingEquation(i); + module.exportFunction(prefix + "_pairingEq" + i); + } + buildPairing(); + module.exportFunction(prefix + "_pairing"); + module.exportFunction(prefix + "_prepareG1"); + module.exportFunction(prefix + "_prepareG2"); + module.exportFunction(prefix + "_millerLoop"); + module.exportFunction(prefix + "_finalExponentiation"); + module.exportFunction(prefix + "_finalExponentiationOld"); + module.exportFunction(prefix + "__mulBy024"); + module.exportFunction(prefix + "__mulBy024Old"); + module.exportFunction(prefix + "__cyclotomicSquare"); + module.exportFunction(prefix + "__cyclotomicExp_w0"); +} +//#endregion +//#region src/bls12381/build_bls12381.js +function buildBLS12381(module, _prefix) { + const prefix = _prefix || "bls12381"; + if (module.modules[prefix]) return prefix; + const q = 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787n; + const r = 52435875175126190479447740508185965837690552500527637822603658699938581184513n; + const n64q = Math.floor((bitLength(q - 1n) - 1) / 64) + 1; + const n8q = n64q * 8; + const f1size = n8q; + const f2size = f1size * 2; + const ftsize = f1size * 12; + const n64r = Math.floor((bitLength(r - 1n) - 1) / 64) + 1; + const n8r = n64r * 8; + const frsize = n8r; + const pr = module.alloc(bigInt2BytesLE(r, frsize)); + const f1mPrefix = buildF1m(module, q, "f1m", "intq"); + buildF1(module, r, "fr", "frm", "intr"); + const pG1b = module.alloc(bigInt2BytesLE(toMontgomery(4n), f1size)); + const g1mPrefix = buildCurve(module, "g1m", "f1m", pG1b); + buildFFT(module, "frm", "frm", "frm", "frm_mul"); + buildPol(module, "pol", "frm"); + buildQAP(module, "qap", "frm"); + const f2mPrefix = buildF2m(module, "f1m_neg", "f2m", "f1m"); + const pG2b = module.alloc([...bigInt2BytesLE(toMontgomery(4n), f1size), ...bigInt2BytesLE(toMontgomery(4n), f1size)]); + const g2mPrefix = buildCurve(module, "g2m", "f2m", pG2b); + function buildGTimesFr(fnName, opMul) { + const f = module.addFunction(fnName); + f.addParam("pG", "i32"); + f.addParam("pFr", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const AUX = c.i32_const(module.alloc(n8r)); + f.addCode(c.call("frm_fromMontgomery", c.getLocal("pFr"), AUX), c.call(opMul, c.getLocal("pG"), AUX, c.i32_const(n8r), c.getLocal("pr"))); + module.exportFunction(fnName); + } + buildGTimesFr("g1m_timesFr", "g1m_timesScalar"); + buildFFT(module, "g1m", "g1m", "frm", "g1m_timesFr"); + buildGTimesFr("g2m_timesFr", "g2m_timesScalar"); + buildFFT(module, "g2m", "g2m", "frm", "g2m_timesFr"); + buildGTimesFr("g1m_timesFrAffine", "g1m_timesScalarAffine"); + buildGTimesFr("g2m_timesFrAffine", "g2m_timesScalarAffine"); + buildApplyKey(module, "frm_batchApplyKey", "fmr", "frm", n8r, n8r, n8r, "frm_mul"); + buildApplyKey(module, "g1m_batchApplyKey", "g1m", "frm", n8q * 3, n8q * 3, n8r, "g1m_timesFr"); + buildApplyKey(module, "g1m_batchApplyKeyMixed", "g1m", "frm", n8q * 2, n8q * 3, n8r, "g1m_timesFrAffine"); + buildApplyKey(module, "g2m_batchApplyKey", "g2m", "frm", n8q * 2 * 3, n8q * 3 * 2, n8r, "g2m_timesFr"); + buildApplyKey(module, "g2m_batchApplyKeyMixed", "g2m", "frm", n8q * 2 * 2, n8q * 3 * 2, n8r, "g2m_timesFrAffine"); + function toMontgomery(a) { + return BigInt(a) * (1n << BigInt(f1size * 8)) % q; + } + const G1gen = [ + 3685416753713387016781088315183077757961620795782546409894578378688607592378376318836054947676345821548104185464507n, + 1339506544944476473020471379941921221584933875938349620426543736416511423956333506472724655353366534992391756441569n, + 1n + ]; + const pG1gen = module.alloc([ + ...bigInt2BytesLE(toMontgomery(G1gen[0]), f1size), + ...bigInt2BytesLE(toMontgomery(G1gen[1]), f1size), + ...bigInt2BytesLE(toMontgomery(G1gen[2]), f1size) + ]); + const G1zero = [ + 0n, + 1n, + 0n + ]; + const pG1zero = module.alloc([ + ...bigInt2BytesLE(toMontgomery(G1zero[0]), f1size), + ...bigInt2BytesLE(toMontgomery(G1zero[1]), f1size), + ...bigInt2BytesLE(toMontgomery(G1zero[2]), f1size) + ]); + const G2gen = [ + [352701069587466618187139116011060144890029952792775240219908644239793785735715026873347600343865175952761926303160n, 3059144344244213709971259814753781636986470325476647558659373206291635324768958432433509563104347017837885763365758n], + [1985150602287291935568054521177171638300868978215655730859378665066344726373823718423869104263333984641494340347905n, 927553665492332455747201965776037880757740193453592970025027978793976877002675564980949289727957565575433344219582n], + [1n, 0n] + ]; + const pG2gen = module.alloc([ + ...bigInt2BytesLE(toMontgomery(G2gen[0][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[0][1]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[1][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[1][1]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[2][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2gen[2][1]), f1size) + ]); + const G2zero = [ + [0n, 0n], + [1n, 0n], + [0n, 0n] + ]; + const pG2zero = module.alloc([ + ...bigInt2BytesLE(toMontgomery(G2zero[0][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[0][1]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[1][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[1][1]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[2][0]), f1size), + ...bigInt2BytesLE(toMontgomery(G2zero[2][1]), f1size) + ]); + const pOneT = module.alloc([ + ...bigInt2BytesLE(toMontgomery(1n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size), + ...bigInt2BytesLE(toMontgomery(0n), f1size) + ]); + const pBls12381Twist = module.alloc([...bigInt2BytesLE(toMontgomery(1n), f1size), ...bigInt2BytesLE(toMontgomery(1n), f1size)]); + function build_mulNR2() { + const f = module.addFunction(f2mPrefix + "_mulNR"); + f.addParam("x", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const x0c = c.i32_const(module.alloc(f1size)); + const x0 = c.getLocal("x"); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1size)); + const r0 = c.getLocal("pr"); + const r1 = c.i32_add(c.getLocal("pr"), c.i32_const(f1size)); + f.addCode(c.call(f1mPrefix + "_copy", x0, x0c), c.call(f1mPrefix + "_sub", x0, x1, r0), c.call(f1mPrefix + "_add", x0c, x1, r1)); + } + build_mulNR2(); + const f6mPrefix = buildF3m(module, f2mPrefix + "_mulNR", "f6m", "f2m"); + function build_mulNR6() { + const f = module.addFunction(f6mPrefix + "_mulNR"); + f.addParam("x", "i32"); + f.addParam("pr", "i32"); + const c = f.getCodeBuilder(); + const c0copy = c.i32_const(module.alloc(f1size * 2)); + f.addCode(c.call(f2mPrefix + "_copy", c.getLocal("x"), c0copy), c.call(f2mPrefix + "_mulNR", c.i32_add(c.getLocal("x"), c.i32_const(n8q * 4)), c.getLocal("pr")), c.call(f2mPrefix + "_copy", c.i32_add(c.getLocal("x"), c.i32_const(n8q * 2)), c.i32_add(c.getLocal("pr"), c.i32_const(n8q * 4))), c.call(f2mPrefix + "_copy", c0copy, c.i32_add(c.getLocal("pr"), c.i32_const(n8q * 2)))); + } + build_mulNR6(); + const ftmPrefix = buildF2m(module, f6mPrefix + "_mulNR", "ftm", f6mPrefix); + const ateLoopBitBytes = bits(15132376222941642752n); + const pAteLoopBitBytes = module.alloc(ateLoopBitBytes); + const ateCoefSize = 3 * f2size; + const ateNDblCoefs = ateLoopBitBytes.length - 1; + const ateNCoefs = ateLoopBitBytes.reduce((acc, b) => acc + (b != 0 ? 1 : 0), 0) + ateNDblCoefs + 1; + const prePSize = 6 * n8q; + const preQSize = 3 * n8q * 2 + ateNCoefs * ateCoefSize; + const finalExpIsNegative = true; + const finalExpZ = 15132376222941642752n; + module.modules[prefix] = { + n64q, + n64r, + n8q, + n8r, + pG1gen, + pG1zero, + pG1b, + pG2gen, + pG2zero, + pG2b, + pq: module.modules["f1m"].pq, + pr, + pOneT, + r, + q, + prePSize, + preQSize + }; + function naf(n) { + let E = n; + const res = []; + while (E > 0n) { + if (isOdd(E)) { + const z = 2 - Number(E % 4n); + res.push(z); + E = E - BigInt(z); + } else res.push(0); + E = E >> 1n; + } + return res; + } + function bits(n) { + let E = n; + const res = []; + while (E > 0n) { + if (isOdd(E)) res.push(1); + else res.push(0); + E = E >> 1n; + } + return res; + } + function buildPrepareG1() { + const f = module.addFunction(prefix + "_prepareG1"); + f.addParam("pP", "i32"); + f.addParam("ppreP", "i32"); + const c = f.getCodeBuilder(); + f.addCode(c.call(g1mPrefix + "_normalize", c.getLocal("pP"), c.getLocal("ppreP"))); + } + function buildPrepDoubleStep() { + const f = module.addFunction(prefix + "_prepDblStep"); + f.addParam("R", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const Rx = c.getLocal("R"); + const Ry = c.i32_add(c.getLocal("R"), c.i32_const(2 * n8q)); + const Rz = c.i32_add(c.getLocal("R"), c.i32_const(4 * n8q)); + const t0 = c.getLocal("r"); + const t3 = c.i32_add(c.getLocal("r"), c.i32_const(2 * n8q)); + const t6 = c.i32_add(c.getLocal("r"), c.i32_const(4 * n8q)); + const zsquared = c.i32_const(module.alloc(f2size)); + const t1 = c.i32_const(module.alloc(f2size)); + const t2 = c.i32_const(module.alloc(f2size)); + const t4 = c.i32_const(module.alloc(f2size)); + const t5 = c.i32_const(module.alloc(f2size)); + f.addCode(c.call(f2mPrefix + "_square", Rx, t0), c.call(f2mPrefix + "_square", Ry, t1), c.call(f2mPrefix + "_square", t1, t2), c.call(f2mPrefix + "_add", t1, Rx, t3), c.call(f2mPrefix + "_square", t3, t3), c.call(f2mPrefix + "_sub", t3, t0, t3), c.call(f2mPrefix + "_sub", t3, t2, t3), c.call(f2mPrefix + "_add", t3, t3, t3), c.call(f2mPrefix + "_add", t0, t0, t4), c.call(f2mPrefix + "_add", t4, t0, t4), c.call(f2mPrefix + "_add", Rx, t4, t6), c.call(f2mPrefix + "_square", t4, t5), c.call(f2mPrefix + "_square", Rz, zsquared), c.call(f2mPrefix + "_sub", t5, t3, Rx), c.call(f2mPrefix + "_sub", Rx, t3, Rx), c.call(f2mPrefix + "_add", Rz, Ry, Rz), c.call(f2mPrefix + "_square", Rz, Rz), c.call(f2mPrefix + "_sub", Rz, t1, Rz), c.call(f2mPrefix + "_sub", Rz, zsquared, Rz), c.call(f2mPrefix + "_sub", t3, Rx, Ry), c.call(f2mPrefix + "_mul", Ry, t4, Ry), c.call(f2mPrefix + "_add", t2, t2, t2), c.call(f2mPrefix + "_add", t2, t2, t2), c.call(f2mPrefix + "_add", t2, t2, t2), c.call(f2mPrefix + "_sub", Ry, t2, Ry), c.call(f2mPrefix + "_mul", t4, zsquared, t3), c.call(f2mPrefix + "_add", t3, t3, t3), c.call(f2mPrefix + "_neg", t3, t3), c.call(f2mPrefix + "_square", t6, t6), c.call(f2mPrefix + "_sub", t6, t0, t6), c.call(f2mPrefix + "_sub", t6, t5, t6), c.call(f2mPrefix + "_add", t1, t1, t1), c.call(f2mPrefix + "_add", t1, t1, t1), c.call(f2mPrefix + "_sub", t6, t1, t6), c.call(f2mPrefix + "_mul", Rz, zsquared, t0), c.call(f2mPrefix + "_add", t0, t0, t0)); + } + function buildPrepAddStep() { + const f = module.addFunction(prefix + "_prepAddStep"); + f.addParam("R", "i32"); + f.addParam("Q", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const Rx = c.getLocal("R"); + const Ry = c.i32_add(c.getLocal("R"), c.i32_const(2 * n8q)); + const Rz = c.i32_add(c.getLocal("R"), c.i32_const(4 * n8q)); + const Qx = c.getLocal("Q"); + const Qy = c.i32_add(c.getLocal("Q"), c.i32_const(2 * n8q)); + const t10 = c.getLocal("r"); + const t1 = c.i32_add(c.getLocal("r"), c.i32_const(2 * n8q)); + const t9 = c.i32_add(c.getLocal("r"), c.i32_const(4 * n8q)); + const zsquared = c.i32_const(module.alloc(f2size)); + const ysquared = c.i32_const(module.alloc(f2size)); + const ztsquared = c.i32_const(module.alloc(f2size)); + const t0 = c.i32_const(module.alloc(f2size)); + const t2 = c.i32_const(module.alloc(f2size)); + const t3 = c.i32_const(module.alloc(f2size)); + const t4 = c.i32_const(module.alloc(f2size)); + const t5 = c.i32_const(module.alloc(f2size)); + const t6 = c.i32_const(module.alloc(f2size)); + const t7 = c.i32_const(module.alloc(f2size)); + const t8 = c.i32_const(module.alloc(f2size)); + f.addCode(c.call(f2mPrefix + "_square", Rz, zsquared), c.call(f2mPrefix + "_square", Qy, ysquared), c.call(f2mPrefix + "_mul", zsquared, Qx, t0), c.call(f2mPrefix + "_add", Qy, Rz, t1), c.call(f2mPrefix + "_square", t1, t1), c.call(f2mPrefix + "_sub", t1, ysquared, t1), c.call(f2mPrefix + "_sub", t1, zsquared, t1), c.call(f2mPrefix + "_mul", t1, zsquared, t1), c.call(f2mPrefix + "_sub", t0, Rx, t2), c.call(f2mPrefix + "_square", t2, t3), c.call(f2mPrefix + "_add", t3, t3, t4), c.call(f2mPrefix + "_add", t4, t4, t4), c.call(f2mPrefix + "_mul", t4, t2, t5), c.call(f2mPrefix + "_sub", t1, Ry, t6), c.call(f2mPrefix + "_sub", t6, Ry, t6), c.call(f2mPrefix + "_mul", t6, Qx, t9), c.call(f2mPrefix + "_mul", t4, Rx, t7), c.call(f2mPrefix + "_square", t6, Rx), c.call(f2mPrefix + "_sub", Rx, t5, Rx), c.call(f2mPrefix + "_sub", Rx, t7, Rx), c.call(f2mPrefix + "_sub", Rx, t7, Rx), c.call(f2mPrefix + "_add", Rz, t2, Rz), c.call(f2mPrefix + "_square", Rz, Rz), c.call(f2mPrefix + "_sub", Rz, zsquared, Rz), c.call(f2mPrefix + "_sub", Rz, t3, Rz), c.call(f2mPrefix + "_add", Qy, Rz, t10), c.call(f2mPrefix + "_sub", t7, Rx, t8), c.call(f2mPrefix + "_mul", t8, t6, t8), c.call(f2mPrefix + "_mul", Ry, t5, t0), c.call(f2mPrefix + "_add", t0, t0, t0), c.call(f2mPrefix + "_sub", t8, t0, Ry), c.call(f2mPrefix + "_square", t10, t10), c.call(f2mPrefix + "_sub", t10, ysquared, t10), c.call(f2mPrefix + "_square", Rz, ztsquared), c.call(f2mPrefix + "_sub", t10, ztsquared, t10), c.call(f2mPrefix + "_add", t9, t9, t9), c.call(f2mPrefix + "_sub", t9, t10, t9), c.call(f2mPrefix + "_add", Rz, Rz, t10), c.call(f2mPrefix + "_neg", t6, t6), c.call(f2mPrefix + "_add", t6, t6, t1)); + } + function buildPrepareG2() { + const f = module.addFunction(prefix + "_prepareG2"); + f.addParam("pQ", "i32"); + f.addParam("ppreQ", "i32"); + f.addLocal("pCoef", "i32"); + f.addLocal("i", "i32"); + const c = f.getCodeBuilder(); + const Q = c.getLocal("pQ"); + const pR = module.alloc(f2size * 3); + const R = c.i32_const(pR); + const base = c.getLocal("ppreQ"); + f.addCode(c.call(g2mPrefix + "_normalize", Q, base), c.if(c.call(g2mPrefix + "_isZero", base), c.ret([])), c.call(g2mPrefix + "_copy", base, R), c.setLocal("pCoef", c.i32_add(c.getLocal("ppreQ"), c.i32_const(f2size * 3)))); + f.addCode(c.setLocal("i", c.i32_const(ateLoopBitBytes.length - 2)), c.block(c.loop(c.call(prefix + "_prepDblStep", R, c.getLocal("pCoef")), c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), c.if(c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), [...c.call(prefix + "_prepAddStep", R, base, c.getLocal("pCoef")), ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize)))]), c.br_if(1, c.i32_eqz(c.getLocal("i"))), c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + } + function buildF6Mul1() { + const f = module.addFunction(f6mPrefix + "_mul1"); + f.addParam("pA", "i32"); + f.addParam("pC1", "i32"); + f.addParam("pR", "i32"); + const c = f.getCodeBuilder(); + const A_c0 = c.getLocal("pA"); + const A_c1 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size * 2)); + const A_c2 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size * 4)); + const c1 = c.getLocal("pC1"); + const t1 = c.getLocal("pR"); + const t2 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size * 2)); + const b_b = c.i32_add(c.getLocal("pR"), c.i32_const(f1size * 4)); + const Ac0_Ac1 = c.i32_const(module.alloc(f1size * 2)); + const Ac1_Ac2 = c.i32_const(module.alloc(f1size * 2)); + f.addCode(c.call(f2mPrefix + "_add", A_c0, A_c1, Ac0_Ac1), c.call(f2mPrefix + "_add", A_c1, A_c2, Ac1_Ac2), c.call(f2mPrefix + "_mul", A_c1, c1, b_b), c.call(f2mPrefix + "_mul", Ac1_Ac2, c1, t1), c.call(f2mPrefix + "_sub", t1, b_b, t1), c.call(f2mPrefix + "_mulNR", t1, t1), c.call(f2mPrefix + "_mul", Ac0_Ac1, c1, t2), c.call(f2mPrefix + "_sub", t2, b_b, t2)); + } + buildF6Mul1(); + function buildF6Mul01() { + const f = module.addFunction(f6mPrefix + "_mul01"); + f.addParam("pA", "i32"); + f.addParam("pC0", "i32"); + f.addParam("pC1", "i32"); + f.addParam("pR", "i32"); + const c = f.getCodeBuilder(); + const A_c0 = c.getLocal("pA"); + const A_c1 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size * 2)); + const A_c2 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size * 4)); + const c0 = c.getLocal("pC0"); + const c1 = c.getLocal("pC1"); + const t1 = c.getLocal("pR"); + const t2 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size * 2)); + const t3 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size * 4)); + const a_a = c.i32_const(module.alloc(f1size * 2)); + const b_b = c.i32_const(module.alloc(f1size * 2)); + const Ac0_Ac1 = c.i32_const(module.alloc(f1size * 2)); + const Ac0_Ac2 = c.i32_const(module.alloc(f1size * 2)); + f.addCode(c.call(f2mPrefix + "_mul", A_c0, c0, a_a), c.call(f2mPrefix + "_mul", A_c1, c1, b_b), c.call(f2mPrefix + "_add", A_c0, A_c1, Ac0_Ac1), c.call(f2mPrefix + "_add", A_c0, A_c2, Ac0_Ac2), c.call(f2mPrefix + "_add", A_c1, A_c2, t1), c.call(f2mPrefix + "_mul", t1, c1, t1), c.call(f2mPrefix + "_sub", t1, b_b, t1), c.call(f2mPrefix + "_mulNR", t1, t1), c.call(f2mPrefix + "_add", t1, a_a, t1), c.call(f2mPrefix + "_add", c0, c1, t2), c.call(f2mPrefix + "_mul", t2, Ac0_Ac1, t2), c.call(f2mPrefix + "_sub", t2, a_a, t2), c.call(f2mPrefix + "_sub", t2, b_b, t2), c.call(f2mPrefix + "_mul", Ac0_Ac2, c0, t3), c.call(f2mPrefix + "_sub", t3, a_a, t3), c.call(f2mPrefix + "_add", t3, b_b, t3)); + } + buildF6Mul01(); + function buildF12Mul014() { + const f = module.addFunction(ftmPrefix + "_mul014"); + f.addParam("pA", "i32"); + f.addParam("pC0", "i32"); + f.addParam("pC1", "i32"); + f.addParam("pC4", "i32"); + f.addParam("pR", "i32"); + const c = f.getCodeBuilder(); + const A_c0 = c.getLocal("pA"); + const A_c1 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size * 6)); + const c0 = c.getLocal("pC0"); + const c1 = c.getLocal("pC1"); + const c4 = c.getLocal("pC4"); + const aa = c.i32_const(module.alloc(f1size * 6)); + const bb = c.i32_const(module.alloc(f1size * 6)); + const o = c.i32_const(module.alloc(f1size * 2)); + const R_c0 = c.getLocal("pR"); + const R_c1 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size * 6)); + f.addCode(c.call(f6mPrefix + "_mul01", A_c0, c0, c1, aa), c.call(f6mPrefix + "_mul1", A_c1, c4, bb), c.call(f2mPrefix + "_add", c1, c4, o), c.call(f6mPrefix + "_add", A_c1, A_c0, R_c1), c.call(f6mPrefix + "_mul01", R_c1, c0, o, R_c1), c.call(f6mPrefix + "_sub", R_c1, aa, R_c1), c.call(f6mPrefix + "_sub", R_c1, bb, R_c1), c.call(f6mPrefix + "_copy", bb, R_c0), c.call(f6mPrefix + "_mulNR", R_c0, R_c0), c.call(f6mPrefix + "_add", R_c0, aa, R_c0)); + } + buildF12Mul014(); + function buildELL() { + const f = module.addFunction(prefix + "_ell"); + f.addParam("pP", "i32"); + f.addParam("pCoefs", "i32"); + f.addParam("pF", "i32"); + const c = f.getCodeBuilder(); + const Px = c.getLocal("pP"); + const Py = c.i32_add(c.getLocal("pP"), c.i32_const(n8q)); + const F = c.getLocal("pF"); + const coef0_0 = c.getLocal("pCoefs"); + const coef0_1 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size)); + const coef1_0 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size * 2)); + const coef1_1 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size * 3)); + const coef2 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size * 4)); + const pc0 = module.alloc(f1size * 2); + const c0 = c.i32_const(pc0); + const c0_c0 = c.i32_const(pc0); + const c0_c1 = c.i32_const(pc0 + f1size); + const pc1 = module.alloc(f1size * 2); + const c1 = c.i32_const(pc1); + const c1_c0 = c.i32_const(pc1); + const c1_c1 = c.i32_const(pc1 + f1size); + f.addCode(c.call(f1mPrefix + "_mul", coef0_0, Py, c0_c0), c.call(f1mPrefix + "_mul", coef0_1, Py, c0_c1), c.call(f1mPrefix + "_mul", coef1_0, Px, c1_c0), c.call(f1mPrefix + "_mul", coef1_1, Px, c1_c1), c.call(ftmPrefix + "_mul014", F, coef2, c1, c0, F)); + } + buildELL(); + function buildMillerLoop() { + const f = module.addFunction(prefix + "_millerLoop"); + f.addParam("ppreP", "i32"); + f.addParam("ppreQ", "i32"); + f.addParam("r", "i32"); + f.addLocal("pCoef", "i32"); + f.addLocal("i", "i32"); + const c = f.getCodeBuilder(); + const preP = c.getLocal("ppreP"); + const coefs = c.getLocal("pCoef"); + const F = c.getLocal("r"); + f.addCode(c.call(ftmPrefix + "_one", F), c.if(c.call(g1mPrefix + "_isZero", preP), c.ret([])), c.if(c.call(g1mPrefix + "_isZero", c.getLocal("ppreQ")), c.ret([])), c.setLocal("pCoef", c.i32_add(c.getLocal("ppreQ"), c.i32_const(f2size * 3))), c.setLocal("i", c.i32_const(ateLoopBitBytes.length - 2)), c.block(c.loop(c.call(prefix + "_ell", preP, coefs, F), c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), c.if(c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), [...c.call(prefix + "_ell", preP, coefs, F), ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize)))]), c.call(ftmPrefix + "_square", F, F), c.br_if(1, c.i32_eq(c.getLocal("i"), c.i32_const(1))), c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), c.br(0))), c.call(prefix + "_ell", preP, coefs, F)); + f.addCode(c.call(ftmPrefix + "_conjugate", F, F)); + } + function buildFrobeniusMap(n) { + const F12 = [[ + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n] + ], [ + [1n, 0n], + [3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n, 151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n], + [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n, 0n], + [2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n, 1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n], + [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n], + [3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n, 877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n], + [4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n, 0n], + [151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n, 3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n], + [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n], + [1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n, 2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n], + [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n, 0n], + [877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n, 3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n] + ]]; + const F6 = [ + [ + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n], + [1n, 0n] + ], + [ + [1n, 0n], + [0n, 4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n], + [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n], + [0n, 1n], + [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n], + [0n, 793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n] + ], + [ + [1n, 0n], + [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n, 0n], + [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n], + [4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n, 0n], + [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n], + [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n, 0n] + ] + ]; + const f = module.addFunction(ftmPrefix + "_frobeniusMap" + n); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + for (let i = 0; i < 6; i++) { + const X = i == 0 ? c.getLocal("x") : c.i32_add(c.getLocal("x"), c.i32_const(i * f2size)); + const Xc0 = X; + const Xc1 = c.i32_add(c.getLocal("x"), c.i32_const(i * f2size + f1size)); + const R = i == 0 ? c.getLocal("r") : c.i32_add(c.getLocal("r"), c.i32_const(i * f2size)); + const Rc0 = R; + const Rc1 = c.i32_add(c.getLocal("r"), c.i32_const(i * f2size + f1size)); + const coef = mul2(F12[Math.floor(i / 3)][n % 12], F6[i % 3][n % 6]); + const pCoef = module.alloc([...bigInt2BytesLE(toMontgomery(coef[0]), n8q), ...bigInt2BytesLE(toMontgomery(coef[1]), n8q)]); + if (n % 2 == 1) f.addCode(c.call(f1mPrefix + "_copy", Xc0, Rc0), c.call(f1mPrefix + "_neg", Xc1, Rc1), c.call(f2mPrefix + "_mul", R, c.i32_const(pCoef), R)); + else f.addCode(c.call(f2mPrefix + "_mul", X, c.i32_const(pCoef), R)); + } + function mul2(a, b) { + const ac0 = a[0]; + const ac1 = a[1]; + const bc0 = b[0]; + const bc1 = b[1]; + const res = [(ac0 * bc0 - ac1 * bc1) % q, (ac0 * bc1 + ac1 * bc0) % q]; + if (isNegative(res[0])) res[0] = res[0] + q; + return res; + } + } + function buildCyclotomicSquare() { + const f = module.addFunction(prefix + "__cyclotomicSquare"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const x0 = c.getLocal("x"); + const x4 = c.i32_add(c.getLocal("x"), c.i32_const(f2size)); + const x3 = c.i32_add(c.getLocal("x"), c.i32_const(2 * f2size)); + const x2 = c.i32_add(c.getLocal("x"), c.i32_const(3 * f2size)); + const x1 = c.i32_add(c.getLocal("x"), c.i32_const(4 * f2size)); + const x5 = c.i32_add(c.getLocal("x"), c.i32_const(5 * f2size)); + const r0 = c.getLocal("r"); + const r4 = c.i32_add(c.getLocal("r"), c.i32_const(f2size)); + const r3 = c.i32_add(c.getLocal("r"), c.i32_const(2 * f2size)); + const r2 = c.i32_add(c.getLocal("r"), c.i32_const(3 * f2size)); + const r1 = c.i32_add(c.getLocal("r"), c.i32_const(4 * f2size)); + const r5 = c.i32_add(c.getLocal("r"), c.i32_const(5 * f2size)); + const t0 = c.i32_const(module.alloc(f2size)); + const t1 = c.i32_const(module.alloc(f2size)); + const t2 = c.i32_const(module.alloc(f2size)); + const t3 = c.i32_const(module.alloc(f2size)); + const t4 = c.i32_const(module.alloc(f2size)); + const t5 = c.i32_const(module.alloc(f2size)); + const tmp = c.i32_const(module.alloc(f2size)); + const AUX = c.i32_const(module.alloc(f2size)); + f.addCode(c.call(f2mPrefix + "_mul", x0, x1, tmp), c.call(f2mPrefix + "_mulNR", x1, t0), c.call(f2mPrefix + "_add", x0, t0, t0), c.call(f2mPrefix + "_add", x0, x1, AUX), c.call(f2mPrefix + "_mul", AUX, t0, t0), c.call(f2mPrefix + "_mulNR", tmp, AUX), c.call(f2mPrefix + "_add", tmp, AUX, AUX), c.call(f2mPrefix + "_sub", t0, AUX, t0), c.call(f2mPrefix + "_add", tmp, tmp, t1), c.call(f2mPrefix + "_mul", x2, x3, tmp), c.call(f2mPrefix + "_mulNR", x3, t2), c.call(f2mPrefix + "_add", x2, t2, t2), c.call(f2mPrefix + "_add", x2, x3, AUX), c.call(f2mPrefix + "_mul", AUX, t2, t2), c.call(f2mPrefix + "_mulNR", tmp, AUX), c.call(f2mPrefix + "_add", tmp, AUX, AUX), c.call(f2mPrefix + "_sub", t2, AUX, t2), c.call(f2mPrefix + "_add", tmp, tmp, t3), c.call(f2mPrefix + "_mul", x4, x5, tmp), c.call(f2mPrefix + "_mulNR", x5, t4), c.call(f2mPrefix + "_add", x4, t4, t4), c.call(f2mPrefix + "_add", x4, x5, AUX), c.call(f2mPrefix + "_mul", AUX, t4, t4), c.call(f2mPrefix + "_mulNR", tmp, AUX), c.call(f2mPrefix + "_add", tmp, AUX, AUX), c.call(f2mPrefix + "_sub", t4, AUX, t4), c.call(f2mPrefix + "_add", tmp, tmp, t5), c.call(f2mPrefix + "_sub", t0, x0, r0), c.call(f2mPrefix + "_add", r0, r0, r0), c.call(f2mPrefix + "_add", t0, r0, r0), c.call(f2mPrefix + "_add", t1, x1, r1), c.call(f2mPrefix + "_add", r1, r1, r1), c.call(f2mPrefix + "_add", t1, r1, r1), c.call(f2mPrefix + "_mul", t5, c.i32_const(pBls12381Twist), AUX), c.call(f2mPrefix + "_add", AUX, x2, r2), c.call(f2mPrefix + "_add", r2, r2, r2), c.call(f2mPrefix + "_add", AUX, r2, r2), c.call(f2mPrefix + "_sub", t4, x3, r3), c.call(f2mPrefix + "_add", r3, r3, r3), c.call(f2mPrefix + "_add", t4, r3, r3), c.call(f2mPrefix + "_sub", t2, x4, r4), c.call(f2mPrefix + "_add", r4, r4, r4), c.call(f2mPrefix + "_add", t2, r4, r4), c.call(f2mPrefix + "_add", t3, x5, r5), c.call(f2mPrefix + "_add", r5, r5, r5), c.call(f2mPrefix + "_add", t3, r5, r5)); + } + function buildCyclotomicExp(exponent, isExpNegative, fnName) { + const exponentNafBytes = naf(exponent).map((b) => b == -1 ? 255 : b); + const pExponentNafBytes = module.alloc(exponentNafBytes); + const f = module.addFunction(prefix + "__cyclotomicExp_" + fnName); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + f.addLocal("bit", "i32"); + f.addLocal("i", "i32"); + const c = f.getCodeBuilder(); + const x = c.getLocal("x"); + const res = c.getLocal("r"); + const inverse = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(ftmPrefix + "_conjugate", x, inverse), c.call(ftmPrefix + "_one", res), c.if(c.teeLocal("bit", c.i32_load8_s(c.i32_const(exponentNafBytes.length - 1), pExponentNafBytes)), c.if(c.i32_eq(c.getLocal("bit"), c.i32_const(1)), c.call(ftmPrefix + "_mul", res, x, res), c.call(ftmPrefix + "_mul", res, inverse, res))), c.setLocal("i", c.i32_const(exponentNafBytes.length - 2)), c.block(c.loop(c.call(prefix + "__cyclotomicSquare", res, res), c.if(c.teeLocal("bit", c.i32_load8_s(c.getLocal("i"), pExponentNafBytes)), c.if(c.i32_eq(c.getLocal("bit"), c.i32_const(1)), c.call(ftmPrefix + "_mul", res, x, res), c.call(ftmPrefix + "_mul", res, inverse, res))), c.br_if(1, c.i32_eqz(c.getLocal("i"))), c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), c.br(0)))); + if (isExpNegative) f.addCode(c.call(ftmPrefix + "_conjugate", res, res)); + } + function buildFinalExponentiation() { + buildCyclotomicSquare(); + buildCyclotomicExp(finalExpZ, finalExpIsNegative, "w0"); + const f = module.addFunction(prefix + "_finalExponentiation"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const elt = c.getLocal("x"); + const res = c.getLocal("r"); + const t0 = c.i32_const(module.alloc(ftsize)); + const t1 = c.i32_const(module.alloc(ftsize)); + const t2 = c.i32_const(module.alloc(ftsize)); + const t3 = c.i32_const(module.alloc(ftsize)); + const t4 = c.i32_const(module.alloc(ftsize)); + const t5 = c.i32_const(module.alloc(ftsize)); + const t6 = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(ftmPrefix + "_frobeniusMap6", elt, t0), c.call(ftmPrefix + "_inverse", elt, t1), c.call(ftmPrefix + "_mul", t0, t1, t2), c.call(ftmPrefix + "_copy", t2, t1), c.call(ftmPrefix + "_frobeniusMap2", t2, t2), c.call(ftmPrefix + "_mul", t2, t1, t2), c.call(prefix + "__cyclotomicSquare", t2, t1), c.call(ftmPrefix + "_conjugate", t1, t1), c.call(prefix + "__cyclotomicExp_w0", t2, t3), c.call(prefix + "__cyclotomicSquare", t3, t4), c.call(ftmPrefix + "_mul", t1, t3, t5), c.call(prefix + "__cyclotomicExp_w0", t5, t1), c.call(prefix + "__cyclotomicExp_w0", t1, t0), c.call(prefix + "__cyclotomicExp_w0", t0, t6), c.call(ftmPrefix + "_mul", t6, t4, t6), c.call(prefix + "__cyclotomicExp_w0", t6, t4), c.call(ftmPrefix + "_conjugate", t5, t5), c.call(ftmPrefix + "_mul", t4, t5, t4), c.call(ftmPrefix + "_mul", t4, t2, t4), c.call(ftmPrefix + "_conjugate", t2, t5), c.call(ftmPrefix + "_mul", t1, t2, t1), c.call(ftmPrefix + "_frobeniusMap3", t1, t1), c.call(ftmPrefix + "_mul", t6, t5, t6), c.call(ftmPrefix + "_frobeniusMap1", t6, t6), c.call(ftmPrefix + "_mul", t3, t0, t3), c.call(ftmPrefix + "_frobeniusMap2", t3, t3), c.call(ftmPrefix + "_mul", t3, t1, t3), c.call(ftmPrefix + "_mul", t3, t6, t3), c.call(ftmPrefix + "_mul", t3, t4, res)); + } + function buildFinalExponentiationOld() { + const f = module.addFunction(prefix + "_finalExponentiationOld"); + f.addParam("x", "i32"); + f.addParam("r", "i32"); + const pExponent = module.alloc(bigInt2BytesLE(322277361516934140462891564586510139908379969514828494218366688025288661041104682794998680497580008899973249814104447692778988208376779573819485263026159588510513834876303014016798809919343532899164848730280942609956670917565618115867287399623286813270357901731510188149934363360381614501334086825442271920079363289954510565375378443704372994881406797882676971082200626541916413184642520269678897559532260949334760604962086348898118982248842634379637598665468817769075878555493752214492790122785850202957575200176084204422751485957336465472324810982833638490904279282696134323072515220044451592646885410572234451732790590013479358343841220074174848221722017083597872017638514103174122784843925578370430843522959600095676285723737049438346544753168912974976791528535276317256904336520179281145394686565050419250614107803233314658825463117900250701199181529205942363159325765991819433914303908860460720581408201373164047773794825411011922305820065611121544561808414055302212057471395719432072209245600258134364584636810093520285711072578721435517884103526483832733289802426157301542744476740008494780363354305116978805620671467071400711358839553375340724899735460480144599782014906586543813292157922220645089192130209334926661588737007768565838519456601560804957985667880395221049249803753582637708560n, 544)); + const c = f.getCodeBuilder(); + f.addCode(c.call(ftmPrefix + "_exp", c.getLocal("x"), c.i32_const(pExponent), c.i32_const(544), c.getLocal("r"))); + } + const pPreP = module.alloc(prePSize); + const pPreQ = module.alloc(preQSize); + function buildPairingEquation(nPairings) { + const f = module.addFunction(prefix + "_pairingEq" + nPairings); + for (let i = 0; i < nPairings; i++) { + f.addParam("p_" + i, "i32"); + f.addParam("q_" + i, "i32"); + } + f.addParam("c", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const resT = c.i32_const(module.alloc(ftsize)); + const auxT = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(ftmPrefix + "_one", resT)); + for (let i = 0; i < nPairings; i++) { + f.addCode(c.call(prefix + "_prepareG1", c.getLocal("p_" + i), c.i32_const(pPreP))); + f.addCode(c.call(prefix + "_prepareG2", c.getLocal("q_" + i), c.i32_const(pPreQ))); + f.addCode(c.if(c.i32_eqz(c.call(g1mPrefix + "_inGroupAffine", c.i32_const(pPreP))), c.ret(c.i32_const(0))), c.if(c.i32_eqz(c.call(g2mPrefix + "_inGroupAffine", c.i32_const(pPreQ))), c.ret(c.i32_const(0)))); + f.addCode(c.call(prefix + "_millerLoop", c.i32_const(pPreP), c.i32_const(pPreQ), auxT)); + f.addCode(c.call(ftmPrefix + "_mul", resT, auxT, resT)); + } + f.addCode(c.call(prefix + "_finalExponentiation", resT, resT)); + f.addCode(c.call(ftmPrefix + "_eq", resT, c.getLocal("c"))); + } + function buildPairing() { + const f = module.addFunction(prefix + "_pairing"); + f.addParam("p", "i32"); + f.addParam("q", "i32"); + f.addParam("r", "i32"); + const c = f.getCodeBuilder(); + const resT = c.i32_const(module.alloc(ftsize)); + f.addCode(c.call(prefix + "_prepareG1", c.getLocal("p"), c.i32_const(pPreP))); + f.addCode(c.call(prefix + "_prepareG2", c.getLocal("q"), c.i32_const(pPreQ))); + f.addCode(c.call(prefix + "_millerLoop", c.i32_const(pPreP), c.i32_const(pPreQ), resT)); + f.addCode(c.call(prefix + "_finalExponentiation", resT, c.getLocal("r"))); + } + function buildInGroupG2() { + const f = module.addFunction(g2mPrefix + "_inGroupAffine"); + f.addParam("p", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const WINV = [2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279894n, 2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279893n]; + const FROB2X = 4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n; + const FROB3Y = [2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n, 2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n]; + const wInv = c.i32_const(module.alloc([...bigInt2BytesLE(toMontgomery(WINV[0]), n8q), ...bigInt2BytesLE(toMontgomery(WINV[1]), n8q)])); + const frob2X = c.i32_const(module.alloc(bigInt2BytesLE(toMontgomery(FROB2X), n8q))); + const frob3Y = c.i32_const(module.alloc([...bigInt2BytesLE(toMontgomery(FROB3Y[0]), n8q), ...bigInt2BytesLE(toMontgomery(FROB3Y[1]), n8q)])); + const z = c.i32_const(module.alloc(bigInt2BytesLE(finalExpZ, 8))); + const px = c.getLocal("p"); + const py = c.i32_add(c.getLocal("p"), c.i32_const(f2size)); + const aux = c.i32_const(module.alloc(f1size)); + const x_winv = c.i32_const(module.alloc(f2size)); + const y_winv = c.i32_const(module.alloc(f2size)); + const pf2 = module.alloc(f2size * 2); + const f2 = c.i32_const(pf2); + const f2x = c.i32_const(pf2); + const f2x_c1 = c.i32_const(pf2); + const f2x_c2 = c.i32_const(pf2 + f1size); + const f2y = c.i32_const(pf2 + f2size); + const f2y_c1 = c.i32_const(pf2 + f2size); + const f2y_c2 = c.i32_const(pf2 + f2size + f1size); + const pf3 = module.alloc(f2size * 3); + const f3 = c.i32_const(pf3); + const f3x = c.i32_const(pf3); + const f3x_c1 = c.i32_const(pf3); + const f3x_c2 = c.i32_const(pf3 + f1size); + const f3y = c.i32_const(pf3 + f2size); + const f3y_c1 = c.i32_const(pf3 + f2size); + const f3y_c2 = c.i32_const(pf3 + f2size + f1size); + const f3z = c.i32_const(pf3 + f2size * 2); + f.addCode(c.if(c.call(g2mPrefix + "_isZeroAffine", c.getLocal("p")), c.ret(c.i32_const(1))), c.if(c.i32_eqz(c.call(g2mPrefix + "_inCurveAffine", c.getLocal("p"))), c.ret(c.i32_const(0))), c.call(f2mPrefix + "_mul", px, wInv, x_winv), c.call(f2mPrefix + "_mul", py, wInv, y_winv), c.call(f2mPrefix + "_mul1", x_winv, frob2X, f2x), c.call(f2mPrefix + "_neg", y_winv, f2y), c.call(f2mPrefix + "_neg", x_winv, f3x), c.call(f2mPrefix + "_mul", y_winv, frob3Y, f3y), c.call(f1mPrefix + "_sub", f2x_c1, f2x_c2, aux), c.call(f1mPrefix + "_add", f2x_c1, f2x_c2, f2x_c2), c.call(f1mPrefix + "_copy", aux, f2x_c1), c.call(f1mPrefix + "_sub", f2y_c1, f2y_c2, aux), c.call(f1mPrefix + "_add", f2y_c1, f2y_c2, f2y_c2), c.call(f1mPrefix + "_copy", aux, f2y_c1), c.call(f1mPrefix + "_add", f3x_c1, f3x_c2, aux), c.call(f1mPrefix + "_sub", f3x_c1, f3x_c2, f3x_c2), c.call(f1mPrefix + "_copy", aux, f3x_c1), c.call(f1mPrefix + "_sub", f3y_c2, f3y_c1, aux), c.call(f1mPrefix + "_add", f3y_c1, f3y_c2, f3y_c2), c.call(f1mPrefix + "_copy", aux, f3y_c1), c.call(f2mPrefix + "_one", f3z), c.call(g2mPrefix + "_timesScalar", f3, z, c.i32_const(8), f3), c.call(g2mPrefix + "_addMixed", f3, f2, f3), c.ret(c.call(g2mPrefix + "_eqMixed", f3, c.getLocal("p")))); + const fInGroup = module.addFunction(g2mPrefix + "_inGroup"); + fInGroup.addParam("pIn", "i32"); + fInGroup.setReturnType("i32"); + const c2 = fInGroup.getCodeBuilder(); + const aux2 = c2.i32_const(module.alloc(f2size * 2)); + fInGroup.addCode(c2.call(g2mPrefix + "_toAffine", c2.getLocal("pIn"), aux2), c2.ret(c2.call(g2mPrefix + "_inGroupAffine", aux2))); + } + function buildInGroupG1() { + const f = module.addFunction(g1mPrefix + "_inGroupAffine"); + f.addParam("p", "i32"); + f.setReturnType("i32"); + const c = f.getCodeBuilder(); + const BETA = 4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n; + const BETA2 = 793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n; + const Z2M1D3 = (finalExpZ * finalExpZ - 1n) / 3n; + const beta = c.i32_const(module.alloc(bigInt2BytesLE(toMontgomery(BETA), n8q))); + const beta2 = c.i32_const(module.alloc(bigInt2BytesLE(toMontgomery(BETA2), n8q))); + const z2m1d3 = c.i32_const(module.alloc(bigInt2BytesLE(Z2M1D3, 16))); + const px = c.getLocal("p"); + const py = c.i32_add(c.getLocal("p"), c.i32_const(f1size)); + const psp = module.alloc(f1size * 3); + const sp = c.i32_const(psp); + const spx = c.i32_const(psp); + const spy = c.i32_const(psp + f1size); + const ps2p = module.alloc(f1size * 2); + const s2p = c.i32_const(ps2p); + const s2px = c.i32_const(ps2p); + const s2py = c.i32_const(ps2p + f1size); + f.addCode(c.if(c.call(g1mPrefix + "_isZeroAffine", c.getLocal("p")), c.ret(c.i32_const(1))), c.if(c.i32_eqz(c.call(g1mPrefix + "_inCurveAffine", c.getLocal("p"))), c.ret(c.i32_const(0))), c.call(f1mPrefix + "_mul", px, beta, spx), c.call(f1mPrefix + "_copy", py, spy), c.call(f1mPrefix + "_mul", px, beta2, s2px), c.call(f1mPrefix + "_copy", py, s2py), c.call(g1mPrefix + "_doubleAffine", sp, sp), c.call(g1mPrefix + "_subMixed", sp, c.getLocal("p"), sp), c.call(g1mPrefix + "_subMixed", sp, s2p, sp), c.call(g1mPrefix + "_timesScalar", sp, z2m1d3, c.i32_const(16), sp), c.ret(c.call(g1mPrefix + "_eqMixed", sp, s2p))); + const fInGroup = module.addFunction(g1mPrefix + "_inGroup"); + fInGroup.addParam("pIn", "i32"); + fInGroup.setReturnType("i32"); + const c2 = fInGroup.getCodeBuilder(); + const aux2 = c2.i32_const(module.alloc(f1size * 2)); + fInGroup.addCode(c2.call(g1mPrefix + "_toAffine", c2.getLocal("pIn"), aux2), c2.ret(c2.call(g1mPrefix + "_inGroupAffine", aux2))); + } + for (let i = 0; i < 10; i++) { + buildFrobeniusMap(i); + module.exportFunction(ftmPrefix + "_frobeniusMap" + i); + } + buildInGroupG1(); + buildInGroupG2(); + buildPrepAddStep(); + buildPrepDoubleStep(); + buildPrepareG1(); + buildPrepareG2(); + buildMillerLoop(); + buildFinalExponentiationOld(); + buildFinalExponentiation(); + for (let i = 1; i <= 5; i++) { + buildPairingEquation(i); + module.exportFunction(prefix + "_pairingEq" + i); + } + buildPairing(); + module.exportFunction(prefix + "_pairing"); + module.exportFunction(prefix + "_prepareG1"); + module.exportFunction(prefix + "_prepareG2"); + module.exportFunction(prefix + "_millerLoop"); + module.exportFunction(prefix + "_finalExponentiation"); + module.exportFunction(prefix + "_finalExponentiationOld"); + module.exportFunction(prefix + "__cyclotomicSquare"); + module.exportFunction(prefix + "__cyclotomicExp_w0"); + module.exportFunction(f6mPrefix + "_mul1"); + module.exportFunction(f6mPrefix + "_mul01"); + module.exportFunction(ftmPrefix + "_mul014"); + module.exportFunction(g1mPrefix + "_inGroupAffine"); + module.exportFunction(g1mPrefix + "_inGroup"); + module.exportFunction(g2mPrefix + "_inGroupAffine"); + module.exportFunction(g2mPrefix + "_inGroup"); +} +//#endregion +exports.buildBls12381 = buildBLS12381; +exports.buildBn128 = buildBN128; +exports.buildF1m = buildF1m; diff --git a/build/msm_batch.wasm b/build/msm_batch.wasm new file mode 100644 index 0000000..8bb8a2b Binary files /dev/null and b/build/msm_batch.wasm differ diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..6cab21c --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,38 @@ +import js from "@eslint/js"; +import globals from "globals"; + +export default [ + { + ignores: ["build/**", "tools/**"], + }, + js.configs.recommended, + { + languageOptions: { + ecmaVersion: 2020, + globals: { + ...globals.node, + ...globals.es2020, + WebAssembly: "readonly", + }, + }, + rules: { + "indent": ["error", 4], + "linebreak-style": ["error", "unix"], + "quotes": ["error", "double"], + "semi": ["error", "always"], + }, + }, + { + files: ["test/**/*.js"], + languageOptions: { + globals: { + describe: "readonly", + it: "readonly", + beforeAll: "readonly", + afterAll: "readonly", + beforeEach: "readonly", + afterEach: "readonly", + }, + }, + }, +]; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..39001c6 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,23 @@ +import js from "@eslint/js"; +import globals from "globals"; + +export default [ + { ignores: ["build/", "tools/"] }, + js.configs.recommended, + { + languageOptions: { + ecmaVersion: 2022, + globals: { + ...globals.node, + ...globals.mocha, + WebAssembly: "readonly", + }, + }, + rules: { + "indent": ["error", 4], + "linebreak-style": ["error", "unix"], + "quotes": ["error", "double"], + "semi": ["error", "always"], + }, + }, +]; diff --git a/index.js b/index.js index a5461b9..ac4c55d 100644 --- a/index.js +++ b/index.js @@ -17,13 +17,12 @@ along with wasmsnark. If not, see . */ +// export * as bn128_wasm from "./build/bn128_wasm.js"; +// export * as bls12381_wasm from "./build/bls12381_wasm.js"; +// export * as mnt6753_wasm from "./build/mnt6753_wasm.js"; -// module.exports.bn128_wasm = require("./build/bn128_wasm.js"); -// module.exports.bls12381_wasm = require("./build/bls12381_wasm.js"); -// module.exports.mnt6753_wasm = require("./build/mnt6753_wasm.js"); +export { default as buildBn128 } from "./src/bn128/build_bn128.js"; +export { default as buildBls12381 } from "./src/bls12381/build_bls12381.js"; +// export { default as buildMnt6753 } from "./src/mnt6753/build_mnt7.js"; -module.exports.buildBn128 = require("./src/bn128/build_bn128.js"); -module.exports.buildBls12381 = require("./src/bls12381/build_bls12381.js"); -// module.exports.buildMnt6753 = require("./src/mnt6753/build_mnt7.js"); - -module.exports.buildF1m = require("./src/build_f1m"); +export { default as buildF1m } from "./src/build_f1m.js"; diff --git a/package-lock.json b/package-lock.json index 0150a8a..030b7f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "wasmcurves", "version": "0.2.2", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -12,477 +12,921 @@ "wasmbuilder": "0.0.16" }, "devDependencies": { - "eslint": "^8.17.0", - "mocha": "^10.0.0" + "@eslint/js": "^10.0.1", + "assemblyscript": "^0.28.19", + "eslint": "^10.6.0", + "globals": "^17.7.0", + "vite": "^8.0.0", + "vitest": "^4.1.11" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=10.10.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12.22" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" }, "engines": { - "node": ">= 8" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { - "node": ">= 8" + "node": ">=18.18.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">= 8" + "node": ">=18.18.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, + "license": "Apache-2.0", "engines": { - "node": ">=0.4.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", + "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.137.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", + "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", + "integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz", + "integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz", + "integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz", + "integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz", + "integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz", + "integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz", + "integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==", + "cpu": [ + "arm64" + ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz", + "integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz", + "integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz", + "integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz", + "integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==", + "cpu": [ + "x64" + ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz", + "integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz", + "integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==", + "cpu": [ + "wasm32" + ], "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz", + "integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==", + "cpu": [ + "arm64" + ], "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz", + "integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 6" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "tslib": "^2.4.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", + "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@vitest/mocker": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", + "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "@vitest/spy": "4.1.11", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, - "engines": { - "node": ">=6.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "supports-color": { + "msw": { + "optional": true + }, + "vite": { "optional": true } } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/@vitest/pretty-format": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", + "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "node_modules/@vitest/runner": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", + "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.11", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/@vitest/snapshot": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", + "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.11", + "@vitest/utils": "4.1.11", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", + "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", + "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.11", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=0.3.1" + "node": ">=0.4.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/assemblyscript": { + "version": "0.28.19", + "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.28.19.tgz", + "integrity": "sha512-yOAlAb9EsrI00oUaf6qUTtTcYYeelG2iC3f1LnA45XUeSlMrp2O2FF5Llj4P+Y84ZiIlh/ciEEpOaPwwmOKq8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "esutils": "^2.0.2" + "binaryen": "130.0.0-nightly.20260609", + "long": "^5.2.4" + }, + "bin": { + "asc": "bin/asc.js", + "asinit": "bin/asinit.js" }, "engines": { - "node": ">=6.0.0" + "node": ">=20", + "npm": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/assemblyscript" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": "18 || 20 || >=22" + } + }, + "node_modules/binaryen": { + "version": "130.0.0-nightly.20260609", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-130.0.0-nightly.20260609.tgz", + "integrity": "sha512-Zyl9Tw638x08LDew22YtxdYiUGxn+quzpR3ySIS4Nccv6yAiO5j1Yko9IEPNpj/aBZf71xtD/6hYXsgZ2ye3ew==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "wasm-as": "bin/wasm-as", + "wasm-ctor-eval": "bin/wasm-ctor-eval", + "wasm-dis": "bin/wasm-dis", + "wasm-merge": "bin/wasm-merge", + "wasm-metadce": "bin/wasm-metadce", + "wasm-opt": "bin/wasm-opt", + "wasm-reduce": "bin/wasm-reduce", + "wasm-shell": "bin/wasm-shell", + "wasm2js": "bin/wasm2js" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -496,110 +940,120 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.6.0.tgz", + "integrity": "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==", "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -612,6 +1066,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -624,68 +1079,91 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT" }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, + "license": "MIT", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, "node_modules/find-up": { @@ -704,46 +1182,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -752,40 +1218,12 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -794,106 +1232,38 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", + "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -903,15 +1273,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -924,80 +1285,50 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "engines": { - "node": ">=0.12.0" - } + "license": "ISC" }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "license": "MIT" }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "json-buffer": "3.0.1" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1006,191 +1337,387 @@ "node": ">= 0.8.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, + "license": "MPL-2.0", "dependencies": { - "p-locate": "^5.0.0" + "detect-libc": "^2.0.3" }, "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14.0.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://opencollective.com/parcel" } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "p-locate": "^5.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "dev": true, + "license": "Apache-2.0" }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=10" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-6.0.1.tgz", + "integrity": "sha512-3wVS3i51pE2pi1k5FFL/95BGfVS0kSsvDVuGXHOtxox/TywUmtgq+3qiTOTbs9J7KfHaXPiN171k/A6dBnaXFw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^22 || ^24 || >=26" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "dev": true, - "dependencies": { - "wrappy": "1" + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -1226,18 +1753,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1247,41 +1762,78 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -1291,240 +1843,157 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/rolldown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", + "integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" + "@oxc-project/types": "=0.137.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.3", + "@rolldown/binding-darwin-arm64": "1.1.3", + "@rolldown/binding-darwin-x64": "1.1.3", + "@rolldown/binding-freebsd-x64": "1.1.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", + "@rolldown/binding-linux-arm64-gnu": "1.1.3", + "@rolldown/binding-linux-arm64-musl": "1.1.3", + "@rolldown/binding-linux-ppc64-gnu": "1.1.3", + "@rolldown/binding-linux-s390x-gnu": "1.1.3", + "@rolldown/binding-linux-x64-gnu": "1.1.3", + "@rolldown/binding-linux-x64-musl": "1.1.3", + "@rolldown/binding-openharmony-arm64": "1.1.3", + "@rolldown/binding-wasm32-wasi": "1.1.3", + "@rolldown/binding-win32-arm64-msvc": "1.1.3", + "@rolldown/binding-win32-x64-msvc": "1.1.3" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=8" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "ISC" }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } + "license": "MIT" }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/std-env": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/tinyrainbow": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } + "license": "0BSD", + "optional": true }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -1532,27 +2001,184 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/vite": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz", + "integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "~1.1.2", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", + "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.11", + "@vitest/mocker": "4.1.11", + "@vitest/pretty-format": "4.1.11", + "@vitest/runner": "4.1.11", + "@vitest/snapshot": "4.1.11", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.11", + "@vitest/browser-preview": "4.1.11", + "@vitest/browser-webdriverio": "4.1.11", + "@vitest/coverage-istanbul": "4.1.11", + "@vitest/coverage-v8": "4.1.11", + "@vitest/ui": "4.1.11", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, "node_modules/wasmbuilder": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", @@ -1563,6 +2189,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -1573,84 +2200,31 @@ "node": ">= 8" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "siginfo": "^2.0.0", + "stackback": "0.0.2" }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "bin": { + "why-is-node-running": "cli.js" }, "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, "node_modules/yocto-queue": { @@ -1665,1183 +2239,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - } - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "wasmbuilder": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", - "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/package.json b/package.json index 9b5726e..6144fd9 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,25 @@ { "name": "wasmcurves", + "type": "module", "version": "0.2.2", "description": "elliptic curves implementations in wasm", - "main": "index.js", + "main": "./build/main.cjs", + "module": "./index.js", + "exports": { + ".": { + "import": "./index.js", + "require": "./build/main.cjs" + }, + "./build/*": "./build/*" + }, "scripts": { "lint": "eslint .", "pretest": "npm run lint", - "test": "mocha", - "build_bn128": "node tools/buildwasm_bn128.js", - "build_mnt6753": "node tools/buildwasm_mnt6753.js", - "build_bls12381": "node tools/buildwasm_bls12381.js" + "test": "vitest run", + "test:watch": "vitest", + "build:wasm": "node tools/buildwasm_bn128.js && node tools/buildwasm_bls12381.js && node tools/buildwasm_msm_batch.js", + "build:cjs": "vite build", + "build": "npm run build:wasm && npm run build:cjs" }, "keywords": [ "bigint", @@ -28,10 +38,21 @@ "url": "https://github.com/iden3/wasmcurves.git" }, "devDependencies": { - "eslint": "^8.17.0", - "mocha": "^10.0.0" + "@eslint/js": "^10.0.1", + "assemblyscript": "^0.28.19", + "eslint": "^10.6.0", + "globals": "^17.7.0", + "vite": "^8.0.0", + "vitest": "^4.1.11" }, "dependencies": { "wasmbuilder": "0.0.16" + }, + "overrides": { + "serialize-javascript": "^7.0.5", + "diff": "^8.0.3", + "postcss": "^8.5.26", + "brace-expansion": "^5.0.9", + "nanoid": "^6.0.1" } } diff --git a/src/as/msm_batch.ts b/src/as/msm_batch.ts new file mode 100644 index 0000000..f63c1e5 --- /dev/null +++ b/src/as/msm_batch.ts @@ -0,0 +1,1151 @@ +// Batch-affine signed-digit Pippenger MSM. +// +// Control flow lives here; ALL field arithmetic is imported from the main +// wasmcurves module (same linear memory). Buckets are kept in AFFINE +// coordinates and filled with batched affine additions: one field inversion +// per batch via Montgomery's trick, so each bucket add costs ~2M + 1S + 3M +// (amortized inversion) instead of an 11M jacobian addMixed. +// +// Conflict-free scheduling: for each window the points are bucket-sorted +// (counting sort), then processed in LAYERS -- layer L takes the (L+1)-th +// point of every bucket. Within a layer each bucket is touched at most once, +// so a batch never contains two adds into the same bucket and no deferral +// machinery is needed. The batch is flushed at every layer boundary (a +// bucket's layer-L+1 add depends on its layer-L result). +// +// Doubling (P == bucket) and cancellation (P == -bucket) are detected at +// schedule time from the coordinates. +// +// IMPORTANT: this module must have NO linear-memory statics (no data +// segments) -- it shares memory with the main module and anything static +// would clobber it. All state is wasm globals; scratch comes from the main +// module's bump allocator at address 0. + +@external("curve", "f_mul") declare function f_mul(a: i32, b: i32, r: i32): void; +@external("curve", "f_square") declare function f_square(a: i32, r: i32): void; +@external("curve", "f_add") declare function f_add(a: i32, b: i32, r: i32): void; +@external("curve", "f_sub") declare function f_sub(a: i32, b: i32, r: i32): void; +@external("curve", "f_neg") declare function f_neg(a: i32, r: i32): void; +@external("curve", "f_inverse") declare function f_inverse(a: i32, r: i32): void; +@external("curve", "f_isZero") declare function f_isZero(a: i32): i32; +@external("curve", "g_add") declare function g_add(a: i32, b: i32, r: i32): void; +@external("curve", "g_addMixed") declare function g_addMixed(a: i32, b: i32, r: i32): void; +@external("curve", "g_double") declare function g_double(a: i32, r: i32): void; +@external("curve", "g_zero") declare function g_zero(r: i32): void; +@external("curve", "g_isZero") declare function g_isZero(a: i32): i32; +@external("curve", "f_conj") declare function f_conj(a: i32, r: i32): void; + +const BATCH: i32 = 512; + +// per-call state (wasm globals -- no linear-memory statics allowed here) +let N8: i32 = 0; // bytes per base-field element +let C: i32 = 0; // window bits +let HALF: i32 = 0; // 2^(C-1) == bucket count +let FULL: i32 = 0; // 2^C +let NB: i32 = 0; +let NWIN: i32 = 0; // real windows + 1 carry-guard window +let NPTS: i32 = 0; +let SCS: i32 = 0; // scalar size in bytes +let SCBITS: i32 = 0; +let PBASES: i32 = 0; +let PSCAL: i32 = 0; +let PCARRY: i32 = 0; // 1 byte per (window, point): carry INTO the window +let PBUCK: i32 = 0; // NB affine points (x,y) +let POCC: i32 = 0; // bucket occupancy flags +let PDIG: i32 = 0; // per-point signed digit for the current window (i32) +let PPERM: i32 = 0; // rank-sorted entries: pairs ((i<<1)|neg, bucket) (u32 x2) +let PCNT: i32 = 0; // per-bucket point count (u32) +let PFILL: i32 = 0; // per-bucket rank cursor (u32) +let PLCNT: i32 = 0; // per-layer entry count (u32) +let PLSTART: i32 = 0; // per-layer segment start (u32) +let PLFILL: i32 = 0; // per-layer scatter cursor (u32) +let PENTB: i32 = 0; // batch entry: bucket index (u32) +let PENTX: i32 = 0; // batch entry: ptr to incoming x2 (u32) +let PNUM: i32 = 0; // batch entry: lambda numerator +let PDEN: i32 = 0; // batch entry: lambda denominator +let PPREF: i32 = 0; // prefix products for Montgomery batch inversion +let T1: i32 = 0; +let T2: i32 = 0; +let LAM: i32 = 0; +let TINV: i32 = 0; +let NE: i32 = 0; // entries in the current batch +// GLV state: items >= NORIG use the materialized phi-bases table; PSIGN (when +// nonzero) holds a per-item sub-scalar sign that flips the item's digits. +let NORIG: i32 = 0; +let PPHI: i32 = 0; +let PSIGN: i32 = 0; + +function allocMem(len: i32): i32 { + let p: u32 = load(0); + while (p & 3) p++; + const res = p; + const end: u32 = p + (len as u32); + store(0, end); + // grow the (shared, imported) memory if the bump allocation passed its end + const cap: u32 = (memory.size() as u32) << 16; + if (end > cap) { + memory.grow((((end - cap) >> 16) + 1) as i32); + } + return res as i32; +} + +// 8-byte-chunk copy of one field element (N8 is always a multiple of 8) +function fcopy(src: i32, dst: i32): void { + for (let k = 0; k < N8; k += 8) store(dst + k, load(src + k)); +} + +// --------------------------------------------------------------------------- +// Scalar-size partitioning (ported from rapidsnark/ffiasm's MSM): +// classify scalars by significant bits BEFORE the bucket method. Zeros are +// dropped, ones are accumulated with plain mixed additions, scalars up to +// SMALL_BITS run Pippenger over few windows, and only full-width scalars pay +// full window costs. Witness MSMs (A/B1/B2/C) are dominated by 0/1 wires -- +// a sha256 witness is ~2/3 zeros and ~1/3 ones -- while the H MSM's uniform +// scalars take the (nearly)-all-big fast path and skip the gather. + +const SMALL_BITS: i32 = 64; + +// On MIXED (gathered) chunks, GLV/GLS below this many full-width scalars +// loses to the plain path: the decomposition + endomorphism-base +// materialization overhead beats the halved window count (measured: loss at +// <= ~2.7k big scalars per chunk, win at >= ~5.5k). All-big fast-path +// chunks skip the gather and win with endo at every size, so the cutoff +// applies ONLY to the gathered branch. +const ENDO_MIN_BIG_GATHERED: i32 = 4096; + +// partition scan results (globals: AS functions cannot return tuples) +let PN_ZERO: i32 = 0; +let PN_ONE: i32 = 0; +let PN_SMALL: i32 = 0; +let PN_BIG: i32 = 0; +let PMAX_SMALL: i32 = 0; // max significant bits among small scalars +let PMAX_BIG: i32 = 0; // max significant bits among big scalars + +// significant bits of the scs-byte little-endian scalar at pS (0 if zero) +function sigBits(pS: i32, scs: i32): i32 { + for (let b = scs - 1; b >= 0; b--) { + const v = load(pS + b) as i32; + if (v != 0) return (b << 3) + (32 - clz(v)); + } + return 0; +} + +// classify each scalar into zero(0) / one(1) / small(2) / big(3), one byte +// per scalar at pCls; counts and max bit-lengths land in the PN_*/PMAX_* +// globals. +function partitionScan(pScalars: i32, scs: i32, n: i32, pCls: i32): void { + PN_ZERO = 0; PN_ONE = 0; PN_SMALL = 0; PN_BIG = 0; + PMAX_SMALL = 0; PMAX_BIG = 0; + for (let i = 0; i < n; i++) { + const bits = sigBits(pScalars + i * scs, scs); + let cls: i32; + if (bits == 0) { cls = 0; PN_ZERO++; } + else if (bits == 1) { cls = 1; PN_ONE++; } + else if (bits <= SMALL_BITS) { + cls = 2; PN_SMALL++; + if (bits > PMAX_SMALL) PMAX_SMALL = bits; + } else { + cls = 3; PN_BIG++; + if (bits > PMAX_BIG) PMAX_BIG = bits; + } + store(pCls + i, cls as u8); + } +} + +// 8-byte-chunk copy (len must be a multiple of 8 -- point/scalar sizes are) +function memCopy8(src: i32, dst: i32, len: i32): void { + for (let k = 0; k < len; k += 8) store(dst + k, load(src + k)); +} + +// pAcc (jacobian) += affine base at pB, skipping the (0,0) infinity encoding +function addAffineIf(pAcc: i32, pB: i32): void { + if (f_isZero(pB) != 0 && f_isZero(pB + N8) != 0) return; + g_addMixed(pAcc, pB, pAcc); +} + +// plain (no endomorphism) MSM over contiguous bases/scalars into pr (zeroed +// here). scbits clamps the window sweep to the partition's real bit-width; +// the carry-guard window in msmRun absorbs the recode carry past it. +function runPlain(pB: i32, pS: i32, scs: i32, scbits: i32, n: i32, pr: i32): void { + g_zero(pr); + if (n == 0) return; + NPTS = n; + SCS = scs; + SCBITS = scbits; + PBASES = pB; + PSCAL = pS; + NORIG = n; + PPHI = 0; + PSIGN = 0; + C = winSize(n); + msmRun(pr); +} + +// Shared partitioned driver. runBig executes the big partition (plain, GLV +// or GLS -- whatever the entry point uses) over gathered bases/scalars into +// a zeroed jacobian target. Assumes partitionScan() has already filled the +// class array at pCls and the PN_*/PMAX_* globals. +// Returns false when the caller should use its own (nearly) all-big fast +// path over the ORIGINAL input instead (partitioning would only pay gather +// costs); true when pr holds the finished result. +function runPartitionedRest(pBases: i32, pScalars: i32, scalarSize: i32, n: i32, + pr: i32, pCls: i32): bool { + // (nearly) all full width: the gather saves nothing + if (PN_BIG >= n - (n >> 4)) return false; + + const sG = N8 << 1; + + // all small: bases and scalars are usable in place; just clamp the sweep + if (PN_SMALL == n) { + runPlain(pBases, pScalars, scalarSize, PMAX_SMALL, n, pr); + return true; + } + + // mixed: ones direct-added into pr; small/big gathered and run separately + g_zero(pr); + const pTmp = allocMem(3 * N8); + + if (PN_ONE > 0) { + for (let i = 0; i < n; i++) { + if (load(pCls + i) == 1) addAffineIf(pr, pBases + i * sG); + } + } + + if (PN_SMALL > 0) { + const pSB = allocMem(PN_SMALL * sG); + const pSS = allocMem(PN_SMALL << 3); + let k = 0; + for (let i = 0; i < n; i++) { + if (load(pCls + i) == 2) { + memCopy8(pBases + i * sG, pSB + k * sG, sG); + store(pSS + (k << 3), load(pScalars + i * scalarSize)); + k++; + } + } + runPlain(pSB, pSS, 8, PMAX_SMALL, PN_SMALL, pTmp); + g_add(pr, pTmp, pr); + } + + if (PN_BIG > 0) { + const pBB = allocMem(PN_BIG * sG); + const pBS = allocMem(PN_BIG * scalarSize); + let k = 0; + for (let i = 0; i < n; i++) { + if (load(pCls + i) == 3) { + memCopy8(pBases + i * sG, pBB + k * sG, sG); + memCopy8(pScalars + i * scalarSize, pBS + k * scalarSize, scalarSize); + k++; + } + } + runBigPartition(pBB, pBS, scalarSize, PN_BIG, pTmp); + g_add(pr, pTmp, pr); + } + + return true; +} + +// how the current entry point wants its big partition executed: +// 0 = plain, 1 = GLV, 2 = GLS. Set before runPartitionedRest. +let BIG_MODE: i32 = 0; +let PGC: i32 = 0; // decomposition constants for GLV/GLS big runs + +function runBigPartition(pB: i32, pS: i32, scalarSize: i32, n: i32, pr: i32): void { + if (n < ENDO_MIN_BIG_GATHERED) runPlain(pB, pS, scalarSize, PMAX_BIG, n, pr); + else if (BIG_MODE == 1) runGlv(pB, pS, n, pr); + else if (BIG_MODE == 2) runGls(pB, pS, n, pr); + else runPlain(pB, pS, scalarSize, PMAX_BIG, n, pr); +} + +// window size table, indexed by clz(n) -- mirrors build_multiexp's pTSizes +function winSize(n: i32): i32 { + const z = clz(n); + if (z <= 9) return 17; + if (z <= 11) return 16; + if (z == 12) return 15; + if (z == 13) return 14; + if (z <= 15) return 13; + if (z == 16) return 12; + if (z == 17) return 11; + if (z == 18) return 10; + if (z == 19) return 9; + if (z == 20) return 8; + if (z <= 22) return 7; + if (z == 23) return 6; + if (z == 24) return 5; + if (z == 25) return 4; + if (z == 26) return 3; + return 2; // signed windowing needs C >= 2 +} + +// raw (unsigned) C-bit window of the scalar at pScalar, starting at startBit +function getChunk(pScalar: i32, startBit: i32): i32 { + const bitsToEnd = SCBITS - startBit; + let mask = (1 << C) - 1; + if (C > bitsToEnd) mask = (1 << bitsToEnd) - 1; + let v: i32 = load(pScalar + (startBit >> 3)); + v = v >>> (startBit & 7); + return v & mask; +} + +// carry-recode pass: store the carry flowing INTO each window (column-major) +function recode(): void { + for (let i = 0; i < NPTS; i++) { + let carry = 0; + const pS = PSCAL + i * SCS; + for (let j = 0; j < NWIN; j++) { + store(PCARRY + j * NPTS + i, carry as u8); + const sb = j * C; + let raw = 0; + if (sb < SCBITS) raw = getChunk(pS, sb); + if (raw + carry >= HALF) carry = 1; + else carry = 0; + } + } +} + +// signed digit of point i in window j, in [-2^(C-1), 2^(C-1)-1] +function digitFor(i: i32, j: i32): i32 { + const sb = j * C; + let raw = 0; + if (sb < SCBITS) raw = getChunk(PSCAL + i * SCS, sb); + let d = raw + (load(PCARRY + j * NPTS + i) as i32); + if (d >= HALF) d -= FULL; + return d; +} + +// apply entry k of the batch; LAM must already hold its lambda +function applyOne(k: i32): void { + const t = load(PENTB + k * 4) as i32; + const px2 = load(PENTX + k * 4) as i32; + const pbx = PBUCK + t * (N8 << 1); + const pby = pbx + N8; + f_square(LAM, T1); + f_sub(T1, pbx, T1); + f_sub(T1, px2, T1); // T1 = x3 = l^2 - x1 - x2 + f_sub(pbx, T1, T2); + f_mul(LAM, T2, T2); + f_sub(T2, pby, T2); // T2 = y3 = l*(x1-x3) - y1 + fcopy(T1, pbx); + fcopy(T2, pby); +} + +// flush the pending batch: one field inversion for all NE denominators +function applyBatch(): void { + if (NE == 0) return; + fcopy(PDEN, PPREF); + for (let k = 1; k < NE; k++) { + f_mul(PPREF + (k - 1) * N8, PDEN + k * N8, PPREF + k * N8); + } + f_inverse(PPREF + (NE - 1) * N8, TINV); + for (let k = NE - 1; k >= 1; k--) { + f_mul(TINV, PPREF + (k - 1) * N8, T1); // T1 = 1/den[k] + f_mul(TINV, PDEN + k * N8, TINV); // TINV = 1/prefix[k-1] + f_mul(PNUM + k * N8, T1, LAM); + applyOne(k); + } + f_mul(PNUM, TINV, LAM); + applyOne(0); + NE = 0; +} + +// route one point (perm entry) into bucket t: place, schedule, double or cancel +function processEntry(e: i32, t: i32): void { + // e = ((basePtr >> 2) << 1) | neg (pointers are 4-byte aligned -- the bump + // allocators guarantee only 4-byte alignment, so encode at that granularity) + const neg = e & 1; + const px = (e >>> 1) << 2; + const py = px + N8; + if (f_isZero(px) != 0 && f_isZero(py) != 0) return; // zero-affine base + + const pbx = PBUCK + t * (N8 << 1); + const pby = pbx + N8; + + if (load(POCC + t) == 0) { + // empty bucket: place +-P directly (no field muls) + fcopy(px, pbx); + if (neg) f_neg(py, pby); + else fcopy(py, pby); + store(POCC + t, 1); + return; + } + + // occupied: schedule a batched affine add of +-P into the bucket + const pd = PDEN + NE * N8; + const pn = PNUM + NE * N8; + f_sub(px, pbx, pd); // den = x2 - x1 + if (f_isZero(pd) != 0) { + // same x: doubling or cancellation + if (neg) f_add(pby, py, T1); // y1 - (-y2) == 0 ? + else f_sub(pby, py, T1); // y1 - y2 == 0 ? + if (f_isZero(T1) != 0) { + // P == bucket: double. num = 3*x1^2, den = 2*y1 + f_square(pbx, T1); + f_add(T1, T1, T2); + f_add(T2, T1, pn); + f_add(pby, pby, pd); + } else { + // P == -bucket: cancels to infinity + store(POCC + t, 0); + return; + } + } else { + // num = (+-y2) - y1 + if (neg) { f_add(py, pby, pn); f_neg(pn, pn); } + else f_sub(py, pby, pn); + } + store(PENTB + NE * 4, t as u32); + store(PENTX + NE * 4, px as u32); + NE++; + if (NE == BATCH) applyBatch(); +} + +// fill + reduce one window; result (jacobian) into pAcc +function processWindow(j: i32, pAcc: i32, pTmp: i32): void { + // --- pass 1: digits + per-bucket counts --- + for (let t = 0; t < NB; t++) { + store(PCNT + t * 4, 0); + store(POCC + t, 0); + } + let maxOcc = 0; + for (let i = 0; i < NPTS; i++) { + let d = digitFor(i, j); + if (PSIGN != 0) { + if (load(PSIGN + i) != 0) d = 0 - d; + } + store(PDIG + i * 4, d); + if (d != 0) { + const t = (d > 0 ? d - 1 : -d - 1); + const cn = (load(PCNT + t * 4) as i32) + 1; + store(PCNT + t * 4, cn as u32); + if (cn > maxOcc) maxOcc = cn; + } + } + + // --- pass 2: layer sizes + segment starts --- + // A point's rank within its bucket is its LAYER. Layer L has one entry per + // bucket with more than L points: lcnt[L] = #buckets with cnt > L. + for (let L = 0; L < maxOcc; L++) store(PLCNT + L * 4, 0); + for (let t = 0; t < NB; t++) { + const cn = load(PCNT + t * 4) as i32; + for (let r = 0; r < cn; r++) { + store(PLCNT + r * 4, (load(PLCNT + r * 4) + 1)); + } + } + let s = 0; + for (let L = 0; L < maxOcc; L++) { + store(PLSTART + L * 4, s as u32); + store(PLFILL + L * 4, s as u32); + s += load(PLCNT + L * 4) as i32; + } + + // --- pass 3: stable scatter by rank; each layer keeps ascending point + // order, so the fill phase reads the bases near-sequentially (the random + // accesses land in the small bucket array instead of the big bases run) --- + for (let t = 0; t < NB; t++) store(PFILL + t * 4, 0); + for (let i = 0; i < NPTS; i++) { + const d = load(PDIG + i * 4); + if (d != 0) { + let t: i32; + let neg: i32; + if (d > 0) { t = d - 1; neg = 0; } + else { t = -d - 1; neg = 1; } + const r = load(PFILL + t * 4) as i32; // rank = layer + store(PFILL + t * 4, (r + 1) as u32); + const pos = load(PLFILL + r * 4) as i32; + store(PLFILL + r * 4, (pos + 1) as u32); + let pb: i32; + if (i < NORIG) pb = PBASES + i * (N8 << 1); + else pb = PPHI + (i - NORIG) * (N8 << 1); + store(PPERM + pos * 8, (((pb >> 2) << 1) | neg) as u32); + store(PPERM + pos * 8 + 4, t as u32); + } + } + + // --- conflict-free layers (a bucket appears at most once per layer) --- + NE = 0; + for (let L = 0; L < maxOcc; L++) { + const from = load(PLSTART + L * 4) as i32; + const to = from + (load(PLCNT + L * 4) as i32); + for (let k = from; k < to; k++) { + processEntry(load(PPERM + k * 8) as i32, load(PPERM + k * 8 + 4) as i32); + } + applyBatch(); // layer boundary: next layer may touch the same buckets + } + + // --- running-sum reduction: acc = sum_{m=1..NB} m * bucket[m-1] --- + g_zero(pAcc); + g_zero(pTmp); + for (let t = NB - 1; t >= 0; t--) { + if (load(POCC + t) != 0) g_addMixed(pTmp, PBUCK + t * (N8 << 1), pTmp); + g_add(pAcc, pTmp, pAcc); + } +} + +// core MSM over the prepared globals (N8, NPTS, SCS, SCBITS, PSCAL, PBASES, +// NORIG, PPHI, PSIGN, C). Allocates its scratch from the bump allocator; the +// caller saves/restores the allocator pointer. +function msmRun(pr: i32): void { + HALF = 1 << (C - 1); + FULL = 1 << C; + NB = HALF; + NWIN = (SCBITS - 1) / C + 1 + 1; // +1 carry-guard window + + const n = NPTS; + PCARRY = allocMem(NWIN * n); + PBUCK = allocMem(NB * (N8 << 1)); + POCC = allocMem(NB); + PDIG = allocMem(n * 4); + PPERM = allocMem(n * 8); + PCNT = allocMem(NB * 4); + PFILL = allocMem(NB * 4); + PLCNT = allocMem((n + 1) * 4); + PLSTART = allocMem((n + 1) * 4); + PLFILL = allocMem((n + 1) * 4); + PENTB = allocMem(BATCH * 4); + PENTX = allocMem(BATCH * 4); + PNUM = allocMem(BATCH * N8); + PDEN = allocMem(BATCH * N8); + PPREF = allocMem(BATCH * N8); + T1 = allocMem(N8); + T2 = allocMem(N8); + LAM = allocMem(N8); + TINV = allocMem(N8); + const pAux = allocMem(3 * N8); + const pTmp = allocMem(3 * N8); + + recode(); + + for (let j = NWIN - 1; j >= 0; j--) { + if (g_isZero(pr) == 0) { + for (let k = 0; k < C; k++) g_double(pr, pr); + } + processWindow(j, pAux, pTmp); + g_add(pr, pAux, pr); + } +} + +// entry point. pr receives the jacobian result (3*n8f bytes). +export function multiexpAffine(pBases: i32, pScalars: i32, scalarSize: i32, n: i32, pr: i32, n8f: i32): void { + g_zero(pr); + if (n == 0) return; + + N8 = n8f; + const saved: u32 = load(0); + + const pCls = allocMem(n); + partitionScan(pScalars, scalarSize, n, pCls); + BIG_MODE = 0; + if (!runPartitionedRest(pBases, pScalars, scalarSize, n, pr, pCls)) { + // (nearly) all big: run in place, window sweep clamped to the real max + runPlain(pBases, pScalars, scalarSize, + PMAX_BIG > 0 ? PMAX_BIG : 1, n, pr); + } + store(0, saved); +} + +// ------------------------- GLV (bn254 G1) ------------------------- +// k*P = k1*P + k2*phi(P) with phi(x,y) = (beta*x, y) = lambda*(x,y) and +// k = k1 + lambda*k2 (mod r), |k1|,|k2| < 2^127. Halves the window count +// (128-bit sub-scalars) at the cost of materializing the phi bases (one +// field mul per point) and one decomposition per scalar. + +// GLV constants, generalized layout shared by both curves (verified offline; +// beta/lambda pairings verified empirically against lambda*P on each curve): +// 0: W1 = floor(b2*2^256/r) (7 limbs) 28: W2 = floor(|b1|*2^256/r) (7) +// 56: a1 (4 limbs) 72: a2 (4) 88: |b1| (4) 104: |b2| (4) +// 120: beta in Montgomery form (n8f bytes) +// Both curves have b1 < 0 and b2 > 0, so the decomposition code is shared. +function writeGlvConstsBn254(p: i32): void { + store(p + 0, 0xc7e0b3d7); + store(p + 4, 0xd91d232e); + store(p + 8, 0x00000002); + store(p + 12, 0x00000000); + store(p + 16, 0x00000000); + store(p + 20, 0x00000000); + store(p + 24, 0x00000000); + store(p + 28, 0x391eb18d); + store(p + 32, 0x7a7bd9d4); + store(p + 36, 0xa773d2cf); + store(p + 40, 0x4ccef014); + store(p + 44, 0x00000002); + store(p + 48, 0x00000000); + store(p + 52, 0x00000000); + store(p + 56, 0x94d213e3); + store(p + 60, 0x89d32568); + store(p + 64, 0x00000000); + store(p + 68, 0x00000000); + store(p + 72, 0x1221250b); + store(p + 76, 0x0be4e154); + store(p + 80, 0xeeb859fd); + store(p + 84, 0x6f4d8248); + store(p + 88, 0x7d4f1128); + store(p + 92, 0x8211bbeb); + store(p + 96, 0xeeb859fc); + store(p + 100, 0x6f4d8248); + store(p + 104, 0x94d213e3); + store(p + 108, 0x89d32568); + store(p + 112, 0x00000000); + store(p + 116, 0x00000000); + store(p + 120, 0xd782e155); + store(p + 124, 0x71930c11); + store(p + 128, 0xffbe3323); + store(p + 132, 0xa6bb947c); + store(p + 136, 0xd4741444); + store(p + 140, 0xaa303344); + store(p + 144, 0x26594943); + store(p + 148, 0x2c3b3f0d); +} + +function writeGlvConstsBls12381(p: i32): void { + store(p + 0, 0xf6cfee30); + store(p + 4, 0x63f6e522); + store(p + 8, 0xe01faadd); + store(p + 12, 0x7c6becf1); + store(p + 16, 0x00000001); + store(p + 20, 0x00000000); + store(p + 24, 0x00000000); + store(p + 28, 0x00000002); + store(p + 32, 0x00000000); + store(p + 36, 0x00000000); + store(p + 40, 0x00000000); + store(p + 44, 0x00000000); + store(p + 48, 0x00000000); + store(p + 52, 0x00000000); + store(p + 56, 0xffffffff); + store(p + 60, 0x00000000); + store(p + 64, 0x0001a402); + store(p + 68, 0xac45a401); + store(p + 72, 0x00000001); + store(p + 76, 0x00000000); + store(p + 80, 0x00000000); + store(p + 84, 0x00000000); + store(p + 88, 0x00000001); + store(p + 92, 0x00000000); + store(p + 96, 0x00000000); + store(p + 100, 0x00000000); + store(p + 104, 0x00000000); + store(p + 108, 0x00000001); + store(p + 112, 0x0001a402); + store(p + 116, 0xac45a401); + store(p + 120, 0x8671f071); + store(p + 124, 0xcd03c9e4); + store(p + 128, 0x1fcda5d2); + store(p + 132, 0x5dab2246); + store(p + 136, 0xd3851b95); + store(p + 140, 0x587042af); + store(p + 144, 0x01bacb9e); + store(p + 148, 0x8eb60ebe); + store(p + 152, 0x83d050d2); + store(p + 156, 0x03f97d6e); + store(p + 160, 0x54638741); + store(p + 164, 0x18f02065); +} + +// out = x*y, schoolbook 32-bit limbs, truncated to `no` limbs +function mulLimbs(pX: i32, nx: i32, pY: i32, ny: i32, pOut: i32, no: i32): void { + for (let k = 0; k < no; k++) store(pOut + k * 4, 0); + for (let i = 0; i < nx; i++) { + if (i >= no) break; + const xi: u64 = load(pX + i * 4) as u64; + if (xi == 0) continue; + let c: u64 = 0; + let j = 0; + for (; j < ny; j++) { + const idx = i + j; + if (idx >= no) break; + const s: u64 = (load(pOut + idx * 4) as u64) + xi * (load(pY + j * 4) as u64) + c; + store(pOut + idx * 4, s as u32); + c = s >> 32; + } + for (let idx = i + j; idx < no; idx++) { + if (c == 0) break; + const s: u64 = (load(pOut + idx * 4) as u64) + c; + store(pOut + idx * 4, s as u32); + c = s >> 32; + } + } +} + +// pOut(no limbs) = (pt + 2^255) >> 256 (rounding shift for the c_i) +function roundShift(pt: i32, nt: i32, pOut: i32, no: i32): void { + let c: u64 = ((load(pt + 28) as u64) + 0x80000000) >> 32; + for (let j = 0; j < no; j++) { + let v: u64 = c; + if (8 + j < nt) v += load(pt + (8 + j) * 4) as u64; + store(pOut + j * 4, v as u32); + c = v >> 32; + } +} + +// 5-limb (160-bit) two's-complement helpers +function sub5(pA: i32, pB: i32, pR: i32): void { + let bw: u64 = 0; + for (let j = 0; j < 5; j++) { + const d: u64 = (load(pA + j * 4) as u64) + 0x100000000 - (load(pB + j * 4) as u64) - bw; + store(pR + j * 4, d as u32); + bw = 1 - (d >> 32); + } +} +function neg5(pW: i32): void { + let c: u64 = 1; + for (let j = 0; j < 5; j++) { + const v: u64 = ((load(pW + j * 4) ^ 0xffffffff) as u64) + c; + store(pW + j * 4, v as u32); + c = v >> 32; + } +} + +// decompose canonical k (8 limbs) -> |k1|,|k2| (4 limbs each; < 2^127). +// Returns bit0 = sign(k1), bit1 = sign(k2). +function glvDecompose(pK: i32, pgc: i32, pt: i32, pc1: i32, pc2: i32, + pu: i32, pv: i32, pw: i32, pK1: i32, pK2: i32): i32 { + mulLimbs(pK, 8, pgc, 7, pt, 15); // k * W1 + roundShift(pt, 15, pc1, 5); // c1 + mulLimbs(pK, 8, pgc + 28, 7, pt, 15); // k * W2 + roundShift(pt, 15, pc2, 5); // c2 + // k1 = k - c1*a1 - c2*a2 (mod 2^160, two's complement) + mulLimbs(pc1, 5, pgc + 56, 4, pu, 5); + mulLimbs(pc2, 5, pgc + 72, 4, pv, 5); + sub5(pK, pu, pw); + sub5(pw, pv, pw); + let sg = 0; + if ((load(pw + 16) & 0x80000000) != 0) { neg5(pw); sg = 1; } + store(pK1, load(pw)); + store(pK1 + 8, load(pw + 8)); + // k2 = c1*|b1| - c2*b2 (b1 is negative, so -c1*b1 = c1*|b1|) + mulLimbs(pc1, 5, pgc + 88, 4, pu, 5); + mulLimbs(pc2, 5, pgc + 104, 4, pv, 5); + sub5(pu, pv, pw); + if ((load(pw + 16) & 0x80000000) != 0) { neg5(pw); sg |= 2; } + store(pK2, load(pw)); + store(pK2 + 8, load(pw + 8)); + return sg; +} + +// 3-limb (96-bit) two's-complement helpers for the GLS decomposition +function sub3(pA: i32, pB: i32, pR: i32): void { + let bw: u64 = 0; + for (let j = 0; j < 3; j++) { + const d: u64 = (load(pA + j * 4) as u64) + 0x100000000 - (load(pB + j * 4) as u64) - bw; + store(pR + j * 4, d as u32); + bw = 1 - (d >> 32); + } +} +function add3(pA: i32, pB: i32, pR: i32): void { + let c: u64 = 0; + for (let j = 0; j < 3; j++) { + const s: u64 = (load(pA + j * 4) as u64) + (load(pB + j * 4) as u64) + c; + store(pR + j * 4, s as u32); + c = s >> 32; + } +} +function neg3(pW: i32): void { + let c: u64 = 1; + for (let j = 0; j < 3; j++) { + const v: u64 = ((load(pW + j * 4) ^ 0xffffffff) as u64) + c; + store(pW + j * 4, v as u32); + c = v >> 32; + } +} + +// bn254 GLS (G2) constants, recomputed & verified offline: Babai rounding +// constants W_j = floor(adj_j*2^256/r) (all positive), the LLL-reduced 4-dim +// lattice basis |b_ji| + signs, and the psi/psi^2/psi^3 Frobenius-twist +// multipliers in Montgomery form (Gx, Gy, NxE, NyE, Gx3, Gy3). +function writeGlsConsts(p: i32): void { + store(p + 0, 0x32e42728); + store(p + 4, 0x2dff2915); + store(p + 8, 0xa3e5577f); + store(p + 12, 0x55b4ca7b); + store(p + 16, 0xb0d92b95); + store(p + 20, 0x9e80318a); + store(p + 24, 0x00000000); + store(p + 28, 0x95d51bb1); + store(p + 32, 0x46f4bda9); + store(p + 36, 0xfc7184ae); + store(p + 40, 0x08e5da66); + store(p + 44, 0xb0d92b93); + store(p + 48, 0x9e80318a); + store(p + 52, 0x00000000); + store(p + 56, 0xc7e0b3d7); + store(p + 60, 0xd91d232e); + store(p + 64, 0x00000002); + store(p + 68, 0x00000000); + store(p + 72, 0x00000000); + store(p + 76, 0x00000000); + store(p + 80, 0x00000000); + store(p + 84, 0xcef3cd3f); + store(p + 88, 0xc170977d); + store(p + 92, 0xa3e5577d); + store(p + 96, 0x55b4ca7b); + store(p + 100, 0xb0d92b95); + store(p + 104, 0x9e80318a); + store(p + 108, 0x00000000); + store(p + 112, 0x94d213e3); + store(p + 116, 0x89d32568); + store(p + 120, 0x00000000); + store(p + 124, 0x00000000); + store(p + 128, 0x94d213e2); + store(p + 132, 0x89d32568); + store(p + 136, 0x00000001); + store(p + 140, 0x00000000); + store(p + 144, 0x94d213e2); + store(p + 148, 0x89d32568); + store(p + 152, 0x4a6909f2); + store(p + 156, 0x44e992b4); + store(p + 160, 0x4a6909f1); + store(p + 164, 0x44e992b4); + store(p + 168, 0x4a6909f1); + store(p + 172, 0x44e992b4); + store(p + 176, 0x4a6909f2); + store(p + 180, 0x44e992b4); + store(p + 184, 0x4a6909f1); + store(p + 188, 0x44e992b4); + store(p + 192, 0x4a6909f1); + store(p + 196, 0x44e992b4); + store(p + 200, 0x94d213e2); + store(p + 204, 0x89d32568); + store(p + 208, 0x94d213e3); + store(p + 212, 0x89d32568); + store(p + 216, 0x4a6909f1); + store(p + 220, 0x44e992b4); + store(p + 224, 0x4a6909f2); + store(p + 228, 0x44e992b4); + store(p + 232, 0x4a6909f1); + store(p + 236, 0x44e992b4); + store(p + 240, 0); + store(p + 241, 0); + store(p + 242, 0); + store(p + 243, 0); + store(p + 244, 0); + store(p + 245, 0); + store(p + 246, 1); + store(p + 247, 0); + store(p + 248, 0); + store(p + 249, 0); + store(p + 250, 0); + store(p + 251, 1); + store(p + 252, 0); + store(p + 253, 1); + store(p + 254, 1); + store(p + 255, 1); + store(p + 256, 0x4563ab30); + store(p + 260, 0xb5773b10); + store(p + 264, 0xa9aa6454); + store(p + 268, 0x347f91c8); + store(p + 272, 0x242e0991); + store(p + 276, 0x7a007127); + store(p + 280, 0x118214ec); + store(p + 284, 0x1956bcd8); + store(p + 288, 0xa0aa4757); + store(p + 292, 0x6e849f1e); + store(p + 296, 0x89f89141); + store(p + 300, 0xaa1c7b6d); + store(p + 304, 0xfae0ca3a); + store(p + 308, 0xb6e713cd); + store(p + 312, 0x4e82ebc3); + store(p + 316, 0x26694fbb); + store(p + 320, 0x2936b629); + store(p + 324, 0xe4bbdd0c); + store(p + 328, 0xe133bacb); + store(p + 332, 0xbb30f162); + store(p + 336, 0xf9645366); + store(p + 340, 0x31a9d1b6); + store(p + 344, 0xa500f8dd); + store(p + 348, 0x253570be); + store(p + 352, 0x5ffe77c7); + store(p + 356, 0xa1d77ce4); + store(p + 360, 0x7826d1db); + store(p + 364, 0x07affd11); + store(p + 368, 0xbb7edc6b); + store(p + 372, 0x6d16bd27); + store(p + 376, 0x85defecc); + store(p + 380, 0x2c872002); + store(p + 384, 0x13e80b9c); + store(p + 388, 0x3350c88e); + store(p + 392, 0xdb5e56b9); + store(p + 396, 0x7dce557c); + store(p + 400, 0xb615564a); + store(p + 404, 0x6001b4b8); + store(p + 408, 0x020217e0); + store(p + 412, 0x2682e617); + store(p + 416, 0x00000000); + store(p + 420, 0x00000000); + store(p + 424, 0x00000000); + store(p + 428, 0x00000000); + store(p + 432, 0x00000000); + store(p + 436, 0x00000000); + store(p + 440, 0x00000000); + store(p + 444, 0x00000000); + store(p + 448, 0x12edefaa); + store(p + 452, 0x68c34889); + store(p + 456, 0x72aabf4f); + store(p + 460, 0x8d087f68); + store(p + 464, 0x09081231); + store(p + 468, 0x51e1a247); + store(p + 472, 0x4729c0fa); + store(p + 476, 0x2259d6b1); + store(p + 480, 0x00000000); + store(p + 484, 0x00000000); + store(p + 488, 0x00000000); + store(p + 492, 0x00000000); + store(p + 496, 0x00000000); + store(p + 500, 0x00000000); + store(p + 504, 0x00000000); + store(p + 508, 0x00000000); + store(p + 512, 0x16ad6bad); + store(p + 516, 0xc9af22f7); + store(p + 520, 0x4aa662b2); + store(p + 524, 0xb311782a); + store(p + 528, 0xe248c7f4); + store(p + 532, 0x19eeaf64); + store(p + 536, 0xe3439f82); + store(p + 540, 0x20273e77); + store(p + 544, 0xf7ce93ac); + store(p + 548, 0xacc02860); + store(p + 552, 0x7ba76b4c); + store(p + 556, 0x3933d581); + store(p + 560, 0x446c8467); + store(p + 564, 0x69e6188b); + store(p + 568, 0x4417cc55); + store(p + 572, 0x0a46036d); + store(p + 576, 0xaf46471e); + store(p + 580, 0x5764af0a); + store(p + 584, 0x873e0fc1); + store(p + 588, 0xdc50792e); + store(p + 592, 0x881d04f6); + store(p + 596, 0x86a673ff); + store(p + 600, 0x3c30a74c); + store(p + 604, 0x0b2eddb4); + store(p + 608, 0x787e8580); + store(p + 612, 0x9a490f32); + store(p + 616, 0xf04af8b1); + store(p + 620, 0x8fd16d7f); + store(p + 624, 0xc6027bf2); + store(p + 628, 0x4b39888e); + store(p + 632, 0x5b52a15d); + store(p + 636, 0x03dd2e70); +} + +// 4-dim decomposition: k = k1 + k2*lam + k3*lam^2 + k4*lam^3 (mod r), +// |k_i| < 2^66. Writes |k_i| into pOut + i*stride (12 bytes each); returns +// sign bits (bit i = sign of k_{i+1}). +function glsDecompose(pK: i32, pgc: i32, pt: i32, pc: i32, pt2: i32, pw: i32, + pOut: i32, stride: i32): i32 { + for (let j = 0; j < 4; j++) { + mulLimbs(pK, 8, pgc + j * 28, 7, pt, 15); + roundShift(pt, 15, pc + j * 12, 3); // c_j mod 2^96 (all W_j > 0) + } + let sg = 0; + for (let i = 0; i < 4; i++) { + // acc = (i == 0 ? k : 0) mod 2^96 + if (i == 0) { + store(pw, load(pK)); + store(pw + 4, load(pK + 4)); + store(pw + 8, load(pK + 8)); + } else { + store(pw, 0); store(pw + 4, 0); store(pw + 8, 0); + } + for (let j = 0; j < 4; j++) { + mulLimbs(pc + j * 12, 3, pgc + 112 + ((j << 2) + i) * 8, 2, pt2, 3); + // k_i -= c_j * b_ji ; negative b_ji flips the subtraction to an add + if (load(pgc + 240 + (j << 2) + i) != 0) add3(pw, pt2, pw); + else sub3(pw, pt2, pw); + } + if ((load(pw + 8) & 0x80000000) != 0) { neg3(pw); sg |= (1 << i); } + store(pOut + i * stride, load(pw)); + store(pOut + i * stride + 4, load(pw + 4)); + store(pOut + i * stride + 8, load(pw + 8)); + } + return sg; +} + +// test hook: writes |k1..k4| (12B each, contiguous) at pOut, returns sign bits +export function glsDecomposeTest(pK: i32, pOut: i32): i32 { + const saved: u32 = load(0); + const pgc = allocMem(640); + writeGlsConsts(pgc); + const pt = allocMem(60), pc = allocMem(48), pt2 = allocMem(12), pw = allocMem(12); + const sg = glsDecompose(pK, pgc, pt, pc, pt2, pw, pOut, 12); + store(0, saved); + return sg; +} + +// GLS core over gathered full-width scalars: 4-dim decomposition + psi +// orbits over the quadrupled point set. PGC must already hold the GLS +// constants. pr is zeroed here. +function runGls(pBases: i32, pScalars: i32, n: i32, pr: i32): void { + g_zero(pr); + if (n == 0) return; + + const pgc = PGC; + const pt = allocMem(60), pc = allocMem(48), pt2 = allocMem(12), pw = allocMem(12); + const pSub = allocMem((n << 2) * 12); + const psign = allocMem(n << 2); + const pphi = allocMem(3 * n * (N8 << 1)); // psi(P), psi^2(P), psi^3(P) + const ct = allocMem(N8); + + for (let i = 0; i < n; i++) { + const sg = glsDecompose(pScalars + i * 32, pgc, pt, pc, pt2, pw, + pSub + i * 12, n * 12); + store(psign + i, (sg & 1) as u8); + store(psign + n + i, ((sg >> 1) & 1) as u8); + store(psign + 2 * n + i, ((sg >> 2) & 1) as u8); + store(psign + 3 * n + i, ((sg >> 3) & 1) as u8); + } + // materialize the psi orbits: + // psi(x,y) = (conj(x)*Gx, conj(y)*Gy) + // psi^2(x,y) = (x*NxE, y*NyE) (NxE, NyE in Fq) + // psi^3(x,y) = (conj(x)*Gx3, conj(y)*Gy3) + const sG = N8 << 1; + for (let i = 0; i < n; i++) { + const px = pBases + i * sG; + const py = px + N8; + const d1 = pphi + i * sG; + const d2 = pphi + (n + i) * sG; + const d3 = pphi + (2 * n + i) * sG; + f_conj(px, ct); f_mul(ct, pgc + 256, d1); + f_conj(py, ct); f_mul(ct, pgc + 320, d1 + N8); + f_mul(px, pgc + 384, d2); + f_mul(py, pgc + 448, d2 + N8); + f_conj(px, ct); f_mul(ct, pgc + 512, d3); + f_conj(py, ct); f_mul(ct, pgc + 576, d3 + N8); + } + + NPTS = n << 2; + SCS = 12; + SCBITS = 68; + PSCAL = pSub; + PBASES = pBases; + PPHI = pphi; + NORIG = n; + PSIGN = psign; + C = winSize(n << 2); + + msmRun(pr); +} + +// GLS entry point: bn254 G2 only (32-byte scalars, 64-byte Fq2 elements); +// anything else falls through to the generic path. Scalars are partitioned +// first (GLS decomposition only pays for full-width scalars); the cache +// budget below is checked against the BIG partition, since that is what +// gets the psi-orbit materialization. +export function multiexpAffineGLS(pBases: i32, pScalars: i32, scalarSize: i32, n: i32, pr: i32, n8f: i32): void { + if (scalarSize != 32 || n8f != 64) { + multiexpAffine(pBases, pScalars, scalarSize, n, pr, n8f); + return; + } + g_zero(pr); + if (n == 0) return; + + N8 = n8f; + const saved: u32 = load(0); + + const pCls = allocMem(n); + partitionScan(pScalars, scalarSize, n, pCls); + + // The psi-orbit materialization quadruples the bases working set (4n + // points of 2*n8f bytes). Measured on G2: GLS wins while that set stays + // cache-resident (~24% at <= 3 MiB) and loses beyond it (~-13% at 4+ + // MiB) -- gauge it on the big partition, the part that actually gets + // decomposed, and fall back to the plain batch path above the budget. + if (((PN_BIG << 2) * (n8f << 1)) > (3 << 20)) { + BIG_MODE = 0; + if (!runPartitionedRest(pBases, pScalars, scalarSize, n, pr, pCls)) { + runPlain(pBases, pScalars, scalarSize, + PMAX_BIG > 0 ? PMAX_BIG : 1, n, pr); + } + store(0, saved); + return; + } + + PGC = allocMem(640); + writeGlsConsts(PGC); + BIG_MODE = 2; + if (!runPartitionedRest(pBases, pScalars, scalarSize, n, pr, pCls)) { + runGls(pBases, pScalars, n, pr); + } + store(0, saved); +} + +// test hook: writes |k1| (16B) then |k2| (16B) at pOut, returns the sign bits +export function glvDecomposeTest(pK: i32, pOut: i32, n8f: i32): i32 { + const saved: u32 = load(0); + const pgc = allocMem(120 + n8f); + if (n8f == 48) writeGlvConstsBls12381(pgc); + else writeGlvConstsBn254(pgc); + const pt = allocMem(60), pc1 = allocMem(20), pc2 = allocMem(20); + const pu = allocMem(20), pv = allocMem(20), pw = allocMem(20); + const sg = glvDecompose(pK, pgc, pt, pc1, pc2, pu, pv, pw, pOut, pOut + 16); + store(0, saved); + return sg; +} + +// GLV core over gathered full-width scalars: decompose k = k1 + k2*lambda, +// materialize phi bases, run the doubled point set. PGC must already hold +// the curve's GLV constants. pr is zeroed here. +function runGlv(pBases: i32, pScalars: i32, n: i32, pr: i32): void { + g_zero(pr); + if (n == 0) return; + + const pgc = PGC; + const pt = allocMem(60), pc1 = allocMem(20), pc2 = allocMem(20); + const pu = allocMem(20), pv = allocMem(20), pw = allocMem(20); + const pSub = allocMem((n << 1) * 16); // |k1| slots then |k2| slots + const psign = allocMem(n << 1); + const pphi = allocMem(n * (N8 << 1)); + + for (let i = 0; i < n; i++) { + const sg = glvDecompose(pScalars + i * 32, pgc, pt, pc1, pc2, pu, pv, pw, + pSub + i * 16, pSub + ((n + i) << 4)); + store(psign + i, (sg & 1) as u8); + store(psign + n + i, ((sg >> 1) & 1) as u8); + } + // phi bases: (beta*x, y). beta*0 = 0, so zero-affine bases stay zero. + for (let i = 0; i < n; i++) { + const srcP = pBases + i * (N8 << 1); + const dstP = pphi + i * (N8 << 1); + f_mul(srcP, pgc + 120, dstP); + fcopy(srcP + N8, dstP + N8); + } + + NPTS = n << 1; + SCS = 16; + SCBITS = 128; + PSCAL = pSub; + PBASES = pBases; + PPHI = pphi; + NORIG = n; + PSIGN = psign; + C = winSize(n << 1); + + msmRun(pr); +} + +// GLV entry point: bn254 (n8f=32) and bls12-381 (n8f=48) G1; anything else +// falls through to the generic path. Scalars are partitioned first -- GLV +// decomposition only ever pays off for full-width scalars, so zeros/ones/ +// small ride the plain paths and only the big partition is decomposed. +export function multiexpAffineGLV(pBases: i32, pScalars: i32, scalarSize: i32, n: i32, pr: i32, n8f: i32): void { + if (scalarSize != 32 || (n8f != 32 && n8f != 48)) { + multiexpAffine(pBases, pScalars, scalarSize, n, pr, n8f); + return; + } + g_zero(pr); + if (n == 0) return; + + N8 = n8f; + const saved: u32 = load(0); + + PGC = allocMem(120 + n8f); + if (n8f == 48) writeGlvConstsBls12381(PGC); + else writeGlvConstsBn254(PGC); + + const pCls = allocMem(n); + partitionScan(pScalars, scalarSize, n, pCls); + BIG_MODE = 1; + if (!runPartitionedRest(pBases, pScalars, scalarSize, n, pr, pCls)) { + runGlv(pBases, pScalars, n, pr); + } + store(0, saved); +} diff --git a/src/bigint.js b/src/bigint.js index b9c2ef6..9e38e19 100644 --- a/src/bigint.js +++ b/src/bigint.js @@ -107,6 +107,23 @@ function prev(n) { return n - 1n; } +function isKnownPrime(v) { + let n = abs(v); + switch (n) { + case 21888242871839275222246405745257275088696311157297823662689037894645226208583n: + case 21888242871839275222246405745257275088548364400416034343698204186575808495617n: + case 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaabn: + case 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001n: + case 41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888458477323173057491593855069696241854796396165721416325350064441470418137846398469611935719059908164220784476160001n: + return true; + } + // Unknown value: fall through to the real primality tests. (Returning + // false here made isPrime a pure list-lookup -- Miller-Rabin never ran, + // and build_f1m silently skipped generating _sqrt/_isSquare for every + // prime outside this list.) + return undefined; +} + function millerRabinTest(n, a) { var nPrev = prev(n), b = nPrev, @@ -128,7 +145,10 @@ function millerRabinTest(n, a) { } function isPrime(p) { - var isPrime = isBasicPrime(p); + let isPrime; + isPrime = isKnownPrime(p); + if (isPrime !== undefined) return isPrime; + isPrime = isBasicPrime(p); if (isPrime !== undefined) return isPrime; var n = abs(p); var bits = bitLength(n); @@ -142,13 +162,4 @@ function isPrime(p) { return millerRabinTest(n, a); } -module.exports.bitLength = bitLength; -module.exports.isOdd = isOdd; -module.exports.isNegative = isNegative; -module.exports.abs = abs; -module.exports.isUnit = isUnit; -module.exports.compare = compare; -module.exports.modInv = modInv; -module.exports.modPow = modPow; -module.exports.isPrime = isPrime; -module.exports.square = square; +export { bitLength, isOdd, isNegative, abs, isUnit, compare, modInv, modPow, isPrime, square }; diff --git a/src/bls12381/build_bls12381.js b/src/bls12381/build_bls12381.js index e224d9e..7cda07a 100644 --- a/src/bls12381/build_bls12381.js +++ b/src/bls12381/build_bls12381.js @@ -1,19 +1,18 @@ -const utils = require("../utils"); - -const buildF1m =require("../build_f1m.js"); -const buildF1 =require("../build_f1.js"); -const buildF2m =require("../build_f2m.js"); -const buildF3m =require("../build_f3m.js"); -const buildCurve =require("../build_curve_jacobian_a0.js"); -const buildFFT = require("../build_fft"); -const buildPol = require("../build_pol"); -const buildQAP = require("../build_qap"); -const buildApplyKey = require("../build_applykey"); -const { bitLength, isOdd, isNegative } = require("../bigint.js"); +import * as utils from "../utils.js"; +import buildF1m from "../build_f1m.js"; +import buildF1 from "../build_f1.js"; +import buildF2m from "../build_f2m.js"; +import buildF3m from "../build_f3m.js"; +import buildCurve from "../build_curve_jacobian_a0.js"; +import buildFFT from "../build_fft.js"; +import buildPol from "../build_pol.js"; +import buildQAP from "../build_qap.js"; +import buildApplyKey from "../build_applykey.js"; +import { bitLength, isOdd, isNegative } from "../bigint.js"; // Definition here: https://electriccoin.co/blog/new-snark-curve/ -module.exports = function buildBLS12381(module, _prefix) { +export default function buildBLS12381(module, _prefix) { const prefix = _prefix || "bls12381"; diff --git a/src/bn128/build_bn128.js b/src/bn128/build_bn128.js index 0c5f297..8973778 100644 --- a/src/bn128/build_bn128.js +++ b/src/bn128/build_bn128.js @@ -1,17 +1,16 @@ -const utils = require("../utils"); - -const buildF1m =require("../build_f1m.js"); -const buildF1 =require("../build_f1.js"); -const buildF2m =require("../build_f2m.js"); -const buildF3m =require("../build_f3m.js"); -const buildCurve =require("../build_curve_jacobian_a0.js"); -const buildFFT = require("../build_fft"); -const buildPol = require("../build_pol"); -const buildQAP = require("../build_qap"); -const buildApplyKey = require("../build_applykey"); -const { bitLength, modInv, isOdd, isNegative } = require("../bigint.js"); - -module.exports = function buildBN128(module, _prefix) { +import * as utils from "../utils.js"; +import buildF1m from "../build_f1m.js"; +import buildF1 from "../build_f1.js"; +import buildF2m from "../build_f2m.js"; +import buildF3m from "../build_f3m.js"; +import buildCurve from "../build_curve_jacobian_a0.js"; +import buildFFT from "../build_fft.js"; +import buildPol from "../build_pol.js"; +import buildQAP from "../build_qap.js"; +import buildApplyKey from "../build_applykey.js"; +import { bitLength, modInv, isOdd, isNegative } from "../bigint.js"; + +export default function buildBN128(module, _prefix) { const prefix = _prefix || "bn128"; diff --git a/src/build_applykey.js b/src/build_applykey.js index 2cc3ef3..e7fecbb 100644 --- a/src/build_applykey.js +++ b/src/build_applykey.js @@ -19,7 +19,7 @@ along with wasmsnark. If not, see . */ -module.exports = function buildApplyKey(module, fnName, gPrefix, frPrefix, sizeGIn, sizeGOut, sizeF, opGtimesF) { +export default function buildApplyKey(module, fnName, gPrefix, frPrefix, sizeGIn, sizeGOut, sizeF, opGtimesF) { const f = module.addFunction(fnName); f.addParam("pIn", "i32"); diff --git a/src/build_batchconvertion.js b/src/build_batchconvertion.js index b4e81a1..563739c 100644 --- a/src/build_batchconvertion.js +++ b/src/build_batchconvertion.js @@ -1,6 +1,6 @@ -module.exports = buildBatchConvertion; +export default buildBatchConvertion; function buildBatchConvertion(module, fnName, internalFnName, sizeIn, sizeOut, reverse) { if (typeof reverse === "undefined") { diff --git a/src/build_batchinverse.js b/src/build_batchinverse.js index 71c8214..d39f1f5 100644 --- a/src/build_batchinverse.js +++ b/src/build_batchinverse.js @@ -1,5 +1,5 @@ -module.exports = buildBatchInverse; +export default buildBatchInverse; function buildBatchInverse(module, prefix) { diff --git a/src/build_batchop.js b/src/build_batchop.js index f593a65..207ae2b 100644 --- a/src/build_batchop.js +++ b/src/build_batchop.js @@ -1,6 +1,6 @@ -module.exports = buildBatchConvertion; +export default buildBatchConvertion; function buildBatchConvertion(module, fnName, internalFnName, sizeIn, sizeOut, reverse) { if (typeof reverse === "undefined") { diff --git a/src/build_curve_jacobian_a0.js b/src/build_curve_jacobian_a0.js index 79720ac..888bca2 100644 --- a/src/build_curve_jacobian_a0.js +++ b/src/build_curve_jacobian_a0.js @@ -17,12 +17,12 @@ along with wasmsnark. If not, see . */ -const buildTimesScalarNAF = require("./build_timesscalarnaf"); -//const buildTimesScalar = require("./build_timesscalar"); -const buildBatchConvertion = require("./build_batchconvertion"); -const buildMultiexp = require("./build_multiexp"); +import buildTimesScalarNAF from "./build_timesscalarnaf.js"; +//import buildTimesScalar from "./build_timesscalar.js"; +import buildBatchConvertion from "./build_batchconvertion.js"; +import buildMultiexp from "./build_multiexp.js"; -module.exports = function buildCurve(module, prefix, prefixField, pB) { +export default function buildCurve(module, prefix, prefixField, pB) { const n64 = module.modules[prefixField].n64; @@ -1409,8 +1409,8 @@ module.exports = function buildCurve(module, prefix, prefixField, pB) { buildBatchConvertion(module, prefix + "_batchToJacobian", prefix + "_toJacobian", n8*2, n8*3, true); - buildMultiexp(module, prefix, prefix + "_multiexp", prefix + "_add", n8*3); - buildMultiexp(module, prefix, prefix + "_multiexpAffine", prefix + "_addMixed", n8*2); + buildMultiexp(module, prefix, prefix + "_multiexp", prefix + "_add", prefix + "_sub", n8*3); + buildMultiexp(module, prefix, prefix + "_multiexpAffine", prefix + "_addMixed", prefix + "_subMixed", n8*2); /* buildTimesScalar( diff --git a/src/build_curve_projective.js b/src/build_curve_projective.js index 6c4c979..6912233 100644 --- a/src/build_curve_projective.js +++ b/src/build_curve_projective.js @@ -28,10 +28,10 @@ Operations in: http://www.hyperelliptic.org/EFD/g1p/auto-shortw-projective.html# f */ -const buildTimesScalar = require("./build_timesscalar"); -const buildTimesScalarNAF = require("./build_timesscalarnaf"); +import buildTimesScalar from "./build_timesscalar.js"; +import buildTimesScalarNAF from "./build_timesscalarnaf.js"; -module.exports = function buildCurve(module, prefix, prefixField, fnMulByA) { +export default function buildCurve(module, prefix, prefixField, fnMulByA) { const n64 = module.modules[prefixField].n64; diff --git a/src/build_f1.js b/src/build_f1.js index 79db942..4d875ab 100644 --- a/src/build_f1.js +++ b/src/build_f1.js @@ -17,10 +17,10 @@ along with wasmsnark. If not, see . */ -const buildF1m =require("./build_f1m.js"); -const { bitLength } = require("./bigint.js"); +import buildF1m from "./build_f1m.js"; +import { bitLength } from "./bigint.js"; -module.exports = function buildF1(module, _q, _prefix, _f1mPrefix, _intPrefix) { +export default function buildF1(module, _q, _prefix, _f1mPrefix, _intPrefix) { const q = BigInt(_q); const n64 = Math.floor((bitLength(q - 1n) - 1)/64) +1; diff --git a/src/build_f1m.js b/src/build_f1m.js index 338cb33..19f3f51 100644 --- a/src/build_f1m.js +++ b/src/build_f1m.js @@ -17,15 +17,15 @@ along with wasmsnark. If not, see . */ -const buildInt = require("./build_int.js"); -const utils = require("./utils.js"); -const buildExp = require("./build_timesscalar"); -const buildBatchInverse = require("./build_batchinverse"); -const buildBatchConvertion = require("./build_batchconvertion"); -const buildBatchOp = require("./build_batchop"); -const { bitLength, modInv, modPow, isPrime, isOdd, square } = require("./bigint.js"); - -module.exports = function buildF1m(module, _q, _prefix, _intPrefix) { +import buildInt from "./build_int.js"; +import * as utils from "./utils.js"; +import buildExp from "./build_timesscalar.js"; +import buildBatchInverse from "./build_batchinverse.js"; +import buildBatchConvertion from "./build_batchconvertion.js"; +import buildBatchOp from "./build_batchop.js"; +import { bitLength, modInv, modPow, isPrime, isOdd, square } from "./bigint.js"; + +export default function buildF1m(module, _q, _prefix, _intPrefix) { const q = BigInt(_q); const n64 = Math.floor((bitLength(q - 1n) - 1)/64) +1; const n32 = n64*2; @@ -238,498 +238,274 @@ module.exports = function buildF1m(module, _q, _prefix, _intPrefix) { function buildMul() { + // Montgomery multiplication, CIOS (coarsely integrated operand + // scanning): for each y-limb, one multiply-accumulate pass over the + // x-limbs followed by one reduction pass, all in i64 locals with a + // single running carry. Replaces the previous product-scanning form + // (dual c0/c1 accumulators): same 32-bit limbs, same R = 2^(32*n32), + // bit-identical results, ~20% faster (shorter dependency chain per + // product and q-limbs as immediates instead of loads). const f = module.addFunction(prefix+"_mul"); f.addParam("x", "i32"); f.addParam("y", "i32"); f.addParam("r", "i32"); - f.addLocal("c0", "i64"); - f.addLocal("c1", "i64"); - f.addLocal("np32", "i64"); - + f.addLocal("yi", "i64"); + f.addLocal("m", "i64"); + f.addLocal("cc", "i64"); + f.addLocal("s", "i64"); - for (let i=0;i> BigInt(32*j)) & 0xFFFFFFFFn)); + const MASK32 = 0xFFFFFFFF; + + // "No-carry" variant (gnark-style, 32-bit-limb version): when q < R/2 + // (the top limb has a spare bit), the CIOS invariant t < 2q gives + // T = t + x*y_i + m*q < q*2^33 < 2^32*R, so the accumulator never + // outgrows n32+1 limbs: the overflow limb t_{n32+1} is provably always + // zero and the t_{n32} limb never survives a pass boundary. The + // pass-boundary folds then collapse to plain assignments and the final + // "top limb set" check disappears. Moduli with q >= R/2 keep the full + // tracking below. + const noCarry = q < (1n << BigInt(32*n32 - 1)); + + // x limbs are reused n32 times: load them once into locals + for (let i=0;i> 32 + f.addCode( + c.setLocal("m", c.i64_and( + c.i64_mul(c.getLocal("t0"), c.i64_const(np32)), + c.i64_const(MASK32) + )), + c.setLocal("s", c.i64_add( + c.getLocal("t0"), + c.i64_mul(c.getLocal("m"), c.i64_const(qLimbs[0])) + )), + c.setLocal("cc", c.i64_shr_u(c.getLocal("s"), c.i64_const(32))) + ); + for (let j=1;j=n32) { - f.addCode( - c.i64_store32( - c.getLocal("r"), - (k-n32)*4, - c.getLocal(c0) - ) - ); - } - [c0, c1] = [c1, c0]; + // t < 2q is guaranteed, so a single conditional subtraction suffices. + // Without no-carry, a set t_n32 means the 2^(32*n32) bit is set -> + // definitely >= q; with no-carry that limb is always zero. + if (noCarry) { f.addCode( - c.setLocal(c1, - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) + c.if( + c.call(intPrefix+"_gte", c.getLocal("r"), c.i32_const(pq) ), + c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), ) ); - } - f.addCode( - c.i64_store32( - c.getLocal("r"), - n32*4-4, - c.getLocal(c0) - ) - ); - - f.addCode( - c.if( - c.i32_wrap_i64(c.getLocal(c1)), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), + } else { + f.addCode( c.if( - c.call(intPrefix+"_gte", c.getLocal("r"), c.i32_const(pq) ), + c.i32_wrap_i64(c.getLocal("t"+n32)), c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), + c.if( + c.call(intPrefix+"_gte", c.getLocal("r"), c.i32_const(pq) ), + c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), + ) ) - ) - ); + ); + } } function buildSquare() { + // Dedicated CIOS Montgomery square: same skeleton as the CIOS _mul, + // but the multiply phase of pass i computes only x_j*x_i for j >= i -- + // the diagonal once and each cross product doubled via a lo/hi split + // s += (p & 2^32-1) << 1; carry += (p >> 32) << 1; + // so nothing overflows u64 (the running carry stays < 2^33+8 for any + // limb count). Saves n32*(n32-1)/2 of the multiplies vs mul(x,x); + // measured 49.6 vs 57.8 ns on bn254 (~14%). The reduction phase is + // identical to _mul. Bit-identical results. const f = module.addFunction(prefix+"_square"); f.addParam("x", "i32"); f.addParam("r", "i32"); - f.addLocal("c0", "i64"); - f.addLocal("c1", "i64"); - f.addLocal("c0_old", "i64"); - f.addLocal("c1_old", "i64"); - f.addLocal("np32", "i64"); + f.addLocal("m", "i64"); + f.addLocal("cc", "i64"); + f.addLocal("s", "i64"); + f.addLocal("p", "i64"); - - for (let i=0;i> BigInt(32*j)) & 0xFFFFFFFFn)); + const MASK32 = 0xFFFFFFFF; - f.addCode(c.setLocal("np32", c.i64_const(np32))); - - - const loadX = []; - const loadQ = []; - function mulij(i, j) { - let X,Y; - if (!loadX[i]) { - X = c.teeLocal("x"+i, c.i64_load32_u( c.getLocal("x"), i*4)); - loadX[i] = true; - } else { - X = c.getLocal("x"+i); - } - if (!loadX[j]) { - Y = c.teeLocal("x"+j, c.i64_load32_u( c.getLocal("x"), j*4)); - loadX[j] = true; - } else { - Y = c.getLocal("x"+j); - } - - return c.i64_mul( X, Y ); - } - - function mulqm(i, j) { - let Q,M; - if (!loadQ[i]) { - Q = c.teeLocal("q"+i, c.i64_load32_u(c.i32_const(0), pq+i*4 )); - loadQ[i] = true; - } else { - Q = c.getLocal("q"+i); - } - M = c.getLocal("m"+j); - - return c.i64_mul( Q, M ); + for (let i=0;i>1) )&&(i i) + for (let j=i+1;j>1, k>>1) - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ) - ) - ); - } - - // Add the old carry - - if (k>0) { - f.addCode( - c.setLocal(c0, - c.i64_add( - c.i64_and( - c.getLocal(c0), - c.i64_const(0xFFFFFFFF) - ), - c.i64_and( - c.getLocal(c0_old), - c.i64_const(0xFFFFFFFF) - ), - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ), - c.getLocal(c1_old) - ) - ) - ); - } - - - for (let i=Math.max(1, k-n32+1); (i<=k)&&(i=n32) { - f.addCode( - c.i64_store32( - c.getLocal("r"), - (k-n32)*4, - c.getLocal(c0) - ) + c.getLocal("t"+j), + c.i64_mul(c.getLocal("m"), c.i64_const(qLimbs[j])) + ), + c.getLocal("cc") + )), + c.setLocal("t"+(j-1), c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), + c.setLocal("cc", c.i64_shr_u(c.getLocal("s"), c.i64_const(32))) ); } f.addCode( - c.setLocal( - c0_old, - c.getLocal(c1) - ), - c.setLocal( - c1_old, - c.i64_shr_u( - c.getLocal(c0_old), - c.i64_const(32) - ) - ) + c.setLocal("s", c.i64_add(c.getLocal("t"+n32), c.getLocal("cc"))), + c.setLocal("t"+(n32-1), c.i64_and(c.getLocal("s"), c.i64_const(MASK32))), + c.setLocal("t"+n32, c.i64_add( + c.getLocal("t"+(n32+1)), + c.i64_shr_u(c.getLocal("s"), c.i64_const(32)) + )), + c.setLocal("t"+(n32+1), c.i64_const(0)) ); } - f.addCode( - c.i64_store32( - c.getLocal("r"), - n32*4-4, - c.getLocal(c0_old) - ) - ); + + for (let j=0;j. */ -const buildExp = require("./build_timesscalar"); -const buildBatchInverse = require("./build_batchinverse"); -const utils = require("./utils.js"); +import buildExp from "./build_timesscalar.js"; +import buildBatchInverse from "./build_batchinverse.js"; +import * as utils from "./utils.js"; -module.exports = function buildF2m(module, mulNonResidueFn, prefix, f1mPrefix) { +export default function buildF2m(module, mulNonResidueFn, prefix, f1mPrefix) { if (module.modules[prefix]) return prefix; // already builded diff --git a/src/build_f3m.js b/src/build_f3m.js index 08e10f2..12b2c08 100644 --- a/src/build_f3m.js +++ b/src/build_f3m.js @@ -16,10 +16,10 @@ You should have received a copy of the GNU General Public License along with wasmsnark. If not, see . */ -const buildExp = require("./build_timesscalar"); -const buildBatchInverse = require("./build_batchinverse"); +import buildExp from "./build_timesscalar.js"; +import buildBatchInverse from "./build_batchinverse.js"; -module.exports = function buildF3m(module, mulNonResidueFn, prefix, f1mPrefix) { +export default function buildF3m(module, mulNonResidueFn, prefix, f1mPrefix) { if (module.modules[prefix]) return prefix; // already builded diff --git a/src/build_fft.js b/src/build_fft.js index 88a0a3e..4590d32 100644 --- a/src/build_fft.js +++ b/src/build_fft.js @@ -17,10 +17,10 @@ along with wasmsnark. If not, see . */ -const { isOdd, modInv, modPow } = require("./bigint.js"); -const utils = require("./utils.js"); +import { isOdd, modInv, modPow } from "./bigint.js"; +import * as utils from "./utils.js"; -module.exports = function buildFFT(module, prefix, gPrefix, fPrefix, opGtimesF) { +export default function buildFFT(module, prefix, gPrefix, fPrefix, opGtimesF) { const n64f = module.modules[fPrefix].n64; const n8f = n64f*8; @@ -1353,6 +1353,7 @@ module.exports = function buildFFT(module, prefix, gPrefix, fPrefix, opGtimesF) buildFFTFinal(); buildPrepareLagrangeEvaluation(); + module.exportFunction(prefix+"__reversePermutation"); module.exportFunction(prefix+"_fft"); module.exportFunction(prefix+"_ifft"); module.exportFunction(prefix+"_rawfft"); diff --git a/src/build_int.js b/src/build_int.js index 89e4b3b..ad10648 100644 --- a/src/build_int.js +++ b/src/build_int.js @@ -17,7 +17,7 @@ along with wasmsnark. If not, see . */ -module.exports = function buildInt(module, n64, _prefix) { +export default function buildInt(module, n64, _prefix) { const prefix = _prefix || "int"; if (module.modules[prefix]) return prefix; // already builded diff --git a/src/build_mem.js b/src/build_mem.js deleted file mode 100644 index d0cf98b..0000000 --- a/src/build_mem.js +++ /dev/null @@ -1,127 +0,0 @@ -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -module.exports = function buildMem(module, prefix) { - - function buildCopy() { - const f = module.addFunction(prefix+"copy"); - f.addParam("s", "i32"); - f.addParam("d", "i32"); - f.addParam("n", "i32"); - f.addLocal("bytesAfter", "i32"); - f.addLocal("sp", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal( - "n64", - c.i32_shl( - c.getLocal("n"), - c.i32_const(3) - ) - ), - c.setLocal( - "bytesAfter", - c.i32_and( - c.getLocal("n"), - c.i32_const(0x7) - ) - ), - c.setLocal("sp", c.getLocal("s")), - c.setLocal("dp", c.getLocal("d")), - c.setLocal("lastsp", - c.add( - c.getLocal("s"), - c.i32_and( - c.getLocal("n"), - c.i32_const(0xFFFFFFF8) - ) - ) - ), - - - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("sp"), - c.getLocal("lastsp") - ) - ), - c.i64_store( - c.getLocal("dp"), - c.i64_load( - c.getLocal("sp") - ) - ), - c.setLocal("sp", c.i32_add(c.getLocal("sp"), c.i32_const(8))), - c.setLocal("dp", c.i32_add(c.getLocal("dp"), c.i32_const(8))), - c.br(0) - )), - - c.if( - c.getLocal("bytesAfter"), - [ - ...c.if( - c.i32_and(c.getLocal("bytesAfter"), c.i32_const(0x4)), - [ - ...c.i32_store( - c.getLocal("dp"), - c.i32_load( - c.getLocal("sp") - ) - ), - ...c.setLocal("sp", c.i32_add(c.getLocal("sp"), c.i32_const(4))), - ...c.setLocal("dp", c.i32_add(c.getLocal("dp"), c.i32_const(4))), - ] - ), - ...c.if( - c.i32_and(c.getLocal("bytesAfter"), c.i32_const(0x2)), - [ - ...c.i32_store16( - c.getLocal("dp"), - c.i32_load16( - c.getLocal("sp") - ) - ), - ...c.setLocal("sp", c.i32_add(c.getLocal("sp"), c.i32_const(2))), - ...c.setLocal("dp", c.i32_add(c.getLocal("dp"), c.i32_const(2))), - ] - ), - ...c.if( - c.i32_and(c.getLocal("bytesAfter"), c.i32_const(0x1)), - c.i32_store8( - c.getLocal("dp"), - c.i32_load8( - c.getLocal("sp") - ) - ) - ) - ] - ) - ); - - } - - buildCopy(); - module.exportFunction(prefix+"_copy"); - - return prefix; -}; diff --git a/src/build_mulacc.js b/src/build_mulacc.js deleted file mode 100644 index fd3b0c7..0000000 --- a/src/build_mulacc.js +++ /dev/null @@ -1,205 +0,0 @@ -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -module.exports = function buildMulAcc(windowSize, prefix, curvePrefix, scalarPrefix) { - const pointN64 = module.modules[curvePrefix].n64; - const pointN8 = pointN64*8; - const scalarN64 = module.modules[scalarPrefix].n64; - const scalarN8 = scalarN64*8; - - function buildMultiMul64() { - const f = module.addFunction(prefix+"__multimul"); - f.addParam("pscalars", "i32"); - f.addParam("ppoints", "i32"); - f.addParam("pr", "i32"); - f.addLocal("sel"); - f.addLocal("ppminusone"); - - const c = f.getCodeBuilder(); - - f.addCode(c.setLocal("sel", c.i32_const(0))); - f.addCode(c.setLocal( - "ppminusone", - c.sub( - c.getLocal("ppoints"), - c.i32_const(pointN8) - ) - )); - - for (let i=0; i<64; i++) { - for (let s=0; s0) f.addCode(c.call(curvePrefix + "_double"), c.getLocal("pr")); - f.addCode(c.call( - prefix + "__multimul64", - c.i32_add(c.getLocal("pscalars"), c.const(i*8)), - c.getLocal("ppoints") - )); - } - - } - - function buildMulAcc() { - buildMultiMul(); - const f = module.addFunction(prefix+"_mulacc"); - f.addParam("pscalars", "i32"); - f.addParam("ppoints", "i32"); - f.addParam("n", "i32"); - f.addParam("pr", "i32"); - f.addLocal("inc", "i32"); - f.addLocal("pp", "i32"); - f.addLocal("ps", "i32"); - f.addLocal("last", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(pointN8)); - - // Check n is windowSize multiple - f.addCode(c.if( - c.eqz( - c.i32_mod( - c.getLocal("n"), - c.i32_const(windowSize) - ) - ), - c.unreachable() - )); - - // Set zero the output - f.addCode(c.call(prefix + "_zero", c.getLocal("pr"))); - - // Calculate the increment - f.addCode(c.setLocal( - "incPoint", - c.i32_const(((1 << windowSize)-1) *pointN8 ) - )); - - f.addCode(c.setLocal( - "incScalar", - c.i32_const(windowSize *scalarN8 ) - )); - - // Calculate Initial - f.addCode(c.setLocal( - "pp", - c.getLocal("ppoints") - )); - - f.addCode(c.setLocal( - "ps", - c.getLocal("pscalars") - )); - - // Calculate Last - f.addCode(c.setLocal( - "last", - c.i32_mul( - c.getLocal("incPoint"), - c.getLocal("n") - ) - )); - - f.addCode(c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("pp"), - c.getLocal("last") - ) - ), - - c.call(prefix + "__multimul", c.getLocal("ps"), c.getLocal("pp"), aux), - c.call(curvePrefix + "_add", aux, c.getLocal("pr"), c.getLocal("pr")), - - c.setLocal( - "pp", - c.add( - c.getLocal("pp"), - c.getLocal("incPoint") - ) - ), - c.setLocal( - "ps", - c.add( - c.getLocal("ps"), - c.getLocal("incScalar") - ) - ), - c.br(0) - ))); - - } - - buildMulAcc(); - module.exportFunction(prefix+"_mulacc"); - - -}; diff --git a/src/build_multiexp.js b/src/build_multiexp.js index 2fbbca0..2e834c8 100644 --- a/src/build_multiexp.js +++ b/src/build_multiexp.js @@ -17,11 +17,22 @@ along with wasmsnark. If not, see . */ -module.exports = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { +// Multi-scalar multiplication (Pippenger bucket method) with SIGNED-DIGIT +// windowing. Each scalar is recoded so every c-bit window digit lies in +// [-2^(c-1), 2^(c-1)-1] (with carry propagation). Because point negation is +// free on the curve, a digit -m is handled by subtracting the base, so only +// 2^(c-1) buckets are needed per window instead of 2^c-1 -- halving the +// bucket-reduction cost and the bucket memory. +export default function buildMultiexp(module, prefix, fnName, opAdd, opSub, n8b) { const n64g = module.modules[prefix].n64; const n8g = n64g*8; + // Scratch used by the running-sum reduction and the per-window result. + const accReduce = module.alloc(n8g); + const aux = module.alloc(n8g); + + // Extract the raw (unsigned) c-bit window starting at `startBit`. function buildGetChunk() { const f = module.addFunction(fnName + "_getChunk"); f.addParam("pScalar", "i32"); @@ -93,25 +104,122 @@ module.exports = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { ); } + // Recode pass: for every scalar, compute the signed-digit carry that flows + // INTO each window (LSB->MSB) and store it as one byte per (window, point), + // column-major: pCarry[windowIdx*n + pointIdx]. Storing only the 1-bit carry + // (not the full digit) keeps the scratch buffer tiny; the actual signed + // digit is reconstructed in _chunk from raw-window + carry. There are + // (nChunks+1) windows: the extra top window absorbs the final carry so + // arbitrary scalarSize-byte scalars (not just sub-group elements) work. + function buildRecode() { + const f = module.addFunction(fnName + "_recode"); + f.addParam("pScalars", "i32"); + f.addParam("scalarSize", "i32"); + f.addParam("n", "i32"); + f.addParam("chunkSize", "i32"); // c + f.addParam("nChunks", "i32"); // number of "real" windows + f.addParam("pCarry", "i32"); // output buffer (1 byte/window/point) + f.addLocal("i", "i32"); + f.addLocal("j", "i32"); + f.addLocal("nWin", "i32"); // nChunks + 1 + f.addLocal("itScalar", "i32"); + f.addLocal("carry", "i32"); + f.addLocal("raw", "i32"); + f.addLocal("half", "i32"); // 2^(c-1) + f.addLocal("scalarBits", "i32"); + f.addLocal("startBit", "i32"); + + const c = f.getCodeBuilder(); + + f.addCode( + c.setLocal("half", c.i32_shl(c.i32_const(1), c.i32_sub(c.getLocal("chunkSize"), c.i32_const(1)))), + c.setLocal("scalarBits", c.i32_shl(c.getLocal("scalarSize"), c.i32_const(3))), + c.setLocal("nWin", c.i32_add(c.getLocal("nChunks"), c.i32_const(1))), + c.setLocal("itScalar", c.getLocal("pScalars")), + + c.setLocal("i", c.i32_const(0)), + c.block(c.loop( + c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), + + c.setLocal("carry", c.i32_const(0)), + c.setLocal("j", c.i32_const(0)), + c.block(c.loop( + c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("nWin"))), + + // store carry-INTO-window j (before updating it) + c.i32_store8( + c.i32_add( + c.getLocal("pCarry"), + c.i32_add( + c.i32_mul(c.getLocal("j"), c.getLocal("n")), + c.getLocal("i") + ) + ), + c.getLocal("carry") + ), + + c.setLocal("startBit", c.i32_mul(c.getLocal("j"), c.getLocal("chunkSize"))), + c.if( + c.i32_lt_s(c.getLocal("startBit"), c.getLocal("scalarBits")), + c.setLocal("raw", + c.call(fnName + "_getChunk", + c.getLocal("itScalar"), + c.getLocal("scalarSize"), + c.getLocal("startBit"), + c.getLocal("chunkSize") + ) + ), + c.setLocal("raw", c.i32_const(0)) + ), + // carry_out = (raw + carry) >= 2^(c-1) ? 1 : 0 + c.if( + c.i32_ge_s( + c.i32_add(c.getLocal("raw"), c.getLocal("carry")), + c.getLocal("half") + ), + c.setLocal("carry", c.i32_const(1)), + c.setLocal("carry", c.i32_const(0)) + ), + + c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), + c.br(0) + )), + + c.setLocal("itScalar", c.i32_add(c.getLocal("itScalar"), c.getLocal("scalarSize"))), + c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), + c.br(0) + )) + ); + } + + // Process one window: reconstruct each point's signed digit from its raw + // window value plus the stored carry, distribute into 2^(c-1) signed + // buckets (subtracting for negative digits), then reduce with the + // running-sum trick into pr. function buildMutiexpChunk() { const f = module.addFunction(fnName + "_chunk"); f.addParam("pBases", "i32"); f.addParam("pScalars", "i32"); - f.addParam("scalarSize", "i32"); // Number of points - f.addParam("n", "i32"); // Number of points - f.addParam("startBit", "i32"); // bit where it starts the chunk - f.addParam("chunkSize", "i32"); // bit where it starts the chunk + f.addParam("scalarSize", "i32"); + f.addParam("pCarry", "i32"); + f.addParam("n", "i32"); // Number of points + f.addParam("windowIdx", "i32"); // which window + f.addParam("chunkSize", "i32"); // c f.addParam("pr", "i32"); - f.addLocal("nChunks", "i32"); - f.addLocal("itScalar", "i32"); - f.addLocal("endScalar", "i32"); f.addLocal("itBase", "i32"); + f.addLocal("itScalar", "i32"); + f.addLocal("itCarry", "i32"); f.addLocal("i", "i32"); f.addLocal("j", "i32"); - f.addLocal("nTable", "i32"); + f.addLocal("nTable", "i32"); // 2^(c-1) (also == half) + f.addLocal("full", "i32"); // 2^c + f.addLocal("scalarBits", "i32"); + f.addLocal("startBit", "i32"); f.addLocal("pTable", "i32"); - f.addLocal("idx", "i32"); + f.addLocal("raw", "i32"); + f.addLocal("d", "i32"); f.addLocal("pIdxTable", "i32"); + f.addLocal("itB", "i32"); const c = f.getCodeBuilder(); @@ -124,127 +232,144 @@ module.exports = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { ] ), - // Allocate memory - + // nTable = half = 2^(chunkSize-1) ; full = 2^chunkSize c.setLocal( "nTable", - c.i32_shl( - c.i32_const(1), - c.getLocal("chunkSize") - ) + c.i32_shl(c.i32_const(1), c.i32_sub(c.getLocal("chunkSize"), c.i32_const(1))) ), + c.setLocal("full", c.i32_shl(c.i32_const(1), c.getLocal("chunkSize"))), + c.setLocal("scalarBits", c.i32_shl(c.getLocal("scalarSize"), c.i32_const(3))), + c.setLocal("startBit", c.i32_mul(c.getLocal("windowIdx"), c.getLocal("chunkSize"))), + + // Allocate bucket table from the bump allocator c.setLocal("pTable", c.i32_load( c.i32_const(0) )), c.i32_store( c.i32_const(0), c.i32_add( c.getLocal("pTable"), - c.i32_mul( - c.getLocal("nTable"), - c.i32_const(n8g) - ) + c.i32_mul(c.getLocal("nTable"), c.i32_const(n8g)) ) ), // Reset Table c.setLocal("j", c.i32_const(0)), c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("nTable") - ) - ), - + c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("nTable"))), c.call( prefix + "_zero", c.i32_add( c.getLocal("pTable"), - c.i32_mul( - c.getLocal("j"), - c.i32_const(n8g) - ) + c.i32_mul(c.getLocal("j"), c.i32_const(n8g)) ) ), - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), c.br(0) )), - // Distribute elements + // Distribute points into signed buckets c.setLocal("itBase", c.getLocal("pBases")), c.setLocal("itScalar", c.getLocal("pScalars")), - c.setLocal("endScalar", + // itCarry = pCarry + windowIdx*n + c.setLocal( + "itCarry", c.i32_add( - c.getLocal("pScalars"), - c.i32_mul( - c.getLocal("n"), - c.getLocal("scalarSize") - ) + c.getLocal("pCarry"), + c.i32_mul(c.getLocal("windowIdx"), c.getLocal("n")) ) ), + c.setLocal("i", c.i32_const(0)), c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("itScalar"), - c.getLocal("endScalar") - ) - ), + c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))), - c.setLocal( - "idx", - c.call(fnName + "_getChunk", - c.getLocal("itScalar"), - c.getLocal("scalarSize"), - c.getLocal("startBit"), - c.getLocal("chunkSize") - ) + // raw window (0 beyond the scalar bits, e.g. the guard window) + c.if( + c.i32_lt_s(c.getLocal("startBit"), c.getLocal("scalarBits")), + c.setLocal("raw", + c.call(fnName + "_getChunk", + c.getLocal("itScalar"), + c.getLocal("scalarSize"), + c.getLocal("startBit"), + c.getLocal("chunkSize") + ) + ), + c.setLocal("raw", c.i32_const(0)) + ), + // d = raw + carry ; if d >= 2^(c-1): d -= 2^c + c.setLocal("d", c.i32_add(c.getLocal("raw"), c.i32_load8_u(c.getLocal("itCarry")))), + c.if( + c.i32_ge_s(c.getLocal("d"), c.getLocal("nTable")), + c.setLocal("d", c.i32_sub(c.getLocal("d"), c.getLocal("full"))) ), c.if( - c.getLocal("idx"), + c.i32_gt_s(c.getLocal("d"), c.i32_const(0)), + // positive digit m=d -> bucket[d-1] += base [ ...c.setLocal( "pIdxTable", c.i32_add( c.getLocal("pTable"), c.i32_mul( - c.i32_sub( - c.getLocal("idx"), - c.i32_const(1) - ), + c.i32_sub(c.getLocal("d"), c.i32_const(1)), c.i32_const(n8g) ) ) ), - ...c.call( - opAdd, - c.getLocal("pIdxTable"), - c.getLocal("itBase"), - c.getLocal("pIdxTable"), - ) - ] + ...c.call(opAdd, c.getLocal("pIdxTable"), c.getLocal("itBase"), c.getLocal("pIdxTable")) + ], + // else if d < 0 -> bucket[-d-1] -= base + c.if( + c.i32_lt_s(c.getLocal("d"), c.i32_const(0)), + [ + ...c.setLocal( + "pIdxTable", + c.i32_add( + c.getLocal("pTable"), + c.i32_mul( + // -d-1 == (-1) - d + c.i32_sub(c.i32_const(-1), c.getLocal("d")), + c.i32_const(n8g) + ) + ) + ), + ...c.call(opSub, c.getLocal("pIdxTable"), c.getLocal("itBase"), c.getLocal("pIdxTable")) + ] + ) ), c.setLocal("itScalar", c.i32_add(c.getLocal("itScalar"), c.getLocal("scalarSize"))), + c.setLocal("itCarry", c.i32_add(c.getLocal("itCarry"), c.i32_const(1))), c.setLocal("itBase", c.i32_add(c.getLocal("itBase"), c.i32_const(n8b))), + c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0) )), - c.call(fnName + "_reduceTable", c.getLocal("pTable"), c.getLocal("chunkSize")), - c.call( - prefix + "_copy", - c.getLocal("pTable"), - c.getLocal("pr") + // Running-sum reduction over all 2^(c-1) buckets: + // pr = sum_{m=1}^{nTable} m * bucket[m-1] + // itB walks from bucket[nTable-1] down. pr and accReduce start at the top. + c.setLocal( + "itB", + c.i32_add( + c.getLocal("pTable"), + c.i32_mul( + c.i32_sub(c.getLocal("nTable"), c.i32_const(1)), + c.i32_const(n8g) + ) + ) ), + c.call(prefix + "_copy", c.getLocal("itB"), c.getLocal("pr")), + c.call(prefix + "_copy", c.getLocal("itB"), c.i32_const(accReduce)), + c.setLocal("itB", c.i32_sub(c.getLocal("itB"), c.i32_const(n8g))), + c.block(c.loop( + c.br_if(1, c.i32_lt_u(c.getLocal("itB"), c.getLocal("pTable"))), + c.call(prefix + "_add", c.i32_const(accReduce), c.getLocal("itB"), c.i32_const(accReduce)), + c.call(prefix + "_add", c.getLocal("pr"), c.i32_const(accReduce), c.getLocal("pr")), + c.setLocal("itB", c.i32_sub(c.getLocal("itB"), c.i32_const(n8g))), + c.br(0) + )), - - c.i32_store( - c.i32_const(0), - c.getLocal("pTable") - ) - + // Free bucket table + c.i32_store(c.i32_const(0), c.getLocal("pTable")) ); } @@ -252,26 +377,19 @@ module.exports = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { const f = module.addFunction(fnName); f.addParam("pBases", "i32"); f.addParam("pScalars", "i32"); - f.addParam("scalarSize", "i32"); // Number of points + f.addParam("scalarSize", "i32"); f.addParam("n", "i32"); // Number of points f.addParam("pr", "i32"); f.addLocal("chunkSize", "i32"); f.addLocal("nChunks", "i32"); - f.addLocal("itScalar", "i32"); - f.addLocal("endScalar", "i32"); - f.addLocal("itBase", "i32"); - f.addLocal("itBit", "i32"); - f.addLocal("i", "i32"); + f.addLocal("nWin", "i32"); + f.addLocal("pCarry", "i32"); + f.addLocal("savedFree", "i32"); + f.addLocal("windowIdx", "i32"); f.addLocal("j", "i32"); - f.addLocal("nTable", "i32"); - f.addLocal("pTable", "i32"); - f.addLocal("idx", "i32"); - f.addLocal("pIdxTable", "i32"); const c = f.getCodeBuilder(); - const aux = c.i32_const(module.alloc(n8g)); - const pTSizes = module.alloc([ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 15, 14, 13, 13, @@ -286,6 +404,12 @@ module.exports = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { c.ret([]) ), c.setLocal("chunkSize", c.i32_load8_u( c.i32_clz(c.getLocal("n")), pTSizes )), + // Signed windowing needs c >= 2: at c=1 the digit range [-2^(c-1), 2^(c-1)-1] + // collapses to {-1, 0}, which cannot represent positive scalars. + c.if( + c.i32_lt_s(c.getLocal("chunkSize"), c.i32_const(2)), + c.setLocal("chunkSize", c.i32_const(2)) + ), c.setLocal( "nChunks", c.i32_add( @@ -302,45 +426,48 @@ module.exports = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { c.i32_const(1) ) ), + c.setLocal("nWin", c.i32_add(c.getLocal("nChunks"), c.i32_const(1))), - - // Allocate memory - - c.setLocal( - "itBit", - c.i32_mul( - c.i32_sub( - c.getLocal("nChunks"), - c.i32_const(1) + // Allocate the carry buffer: nWin * n bytes (1 byte per window/point). + // Bump up to a 4-byte boundary so later point allocations stay aligned. + c.setLocal("savedFree", c.i32_load(c.i32_const(0))), + c.setLocal("pCarry", c.getLocal("savedFree")), + c.i32_store( + c.i32_const(0), + c.i32_and( + c.i32_add( + c.i32_add( + c.getLocal("savedFree"), + c.i32_mul(c.getLocal("nWin"), c.getLocal("n")) + ), + c.i32_const(3) ), - c.getLocal("chunkSize") + c.i32_const(-4) ) ), + + c.call(fnName + "_recode", + c.getLocal("pScalars"), + c.getLocal("scalarSize"), + c.getLocal("n"), + c.getLocal("chunkSize"), + c.getLocal("nChunks"), + c.getLocal("pCarry") + ), + + // Horner over windows, highest (the carry-guard window) first. + c.setLocal("windowIdx", c.getLocal("nChunks")), c.block(c.loop( - c.br_if( - 1, - c.i32_lt_s( - c.getLocal("itBit"), - c.i32_const(0) - ) - ), + c.br_if(1, c.i32_lt_s(c.getLocal("windowIdx"), c.i32_const(0))), - // Double nChunk times + // Double pr chunkSize times (skip while pr is still zero) c.if( c.i32_eqz(c.call(prefix + "_isZero", c.getLocal("pr"))), [ ...c.setLocal("j", c.i32_const(0)), ...c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("chunkSize") - ) - ), - + c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("chunkSize"))), c.call(prefix + "_double", c.getLocal("pr"), c.getLocal("pr")), - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), c.br(0) )) @@ -352,116 +479,30 @@ module.exports = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { c.getLocal("pBases"), c.getLocal("pScalars"), c.getLocal("scalarSize"), + c.getLocal("pCarry"), c.getLocal("n"), - c.getLocal("itBit"), + c.getLocal("windowIdx"), c.getLocal("chunkSize"), - aux + c.i32_const(aux) ), - c.call( prefix + "_add", c.getLocal("pr"), - aux, + c.i32_const(aux), c.getLocal("pr") ), - c.setLocal("itBit", c.i32_sub(c.getLocal("itBit"), c.getLocal("chunkSize"))), - c.br(0) - )) - ); - } - - function buildReduceTable() { - const f = module.addFunction(fnName + "_reduceTable"); - f.addParam("pTable", "i32"); - f.addParam("p", "i32"); // Number of bits of the table - f.addLocal("half", "i32"); - f.addLocal("it1", "i32"); - f.addLocal("it2", "i32"); - f.addLocal("pAcc", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.if( - c.i32_eq(c.getLocal("p"), c.i32_const(1)), - c.ret([]) - ), - c.setLocal( - "half", - c.i32_shl( - c.i32_const(1), - c.i32_sub( - c.getLocal("p"), - c.i32_const(1) - ) - ) - ), - - c.setLocal("it1", c.getLocal("pTable")), - c.setLocal( - "it2", - c.i32_add( - c.getLocal("pTable"), - c.i32_mul( - c.getLocal("half"), - c.i32_const(n8g) - ) - ) - ), - c.setLocal("pAcc", - c.i32_sub( - c.getLocal("it2"), - c.i32_const(n8g) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("it1"), - c.getLocal("pAcc") - ) - ), - c.call( - prefix + "_add", - c.getLocal("it1"), - c.getLocal("it2"), - c.getLocal("it1") - ), - c.call( - prefix + "_add", - c.getLocal("pAcc"), - c.getLocal("it2"), - c.getLocal("pAcc") - ), - c.setLocal("it1", c.i32_add(c.getLocal("it1"), c.i32_const(n8g))), - c.setLocal("it2", c.i32_add(c.getLocal("it2"), c.i32_const(n8g))), - c.br(0) - )), - - c.call( - fnName + "_reduceTable", - c.getLocal("pTable"), - c.i32_sub( - c.getLocal("p"), - c.i32_const(1) - ) - ), - c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), - c.block(c.loop( - c.br_if(1, c.i32_eqz(c.getLocal("p"))), - c.call(prefix + "_double", c.getLocal("pAcc"), c.getLocal("pAcc")), - c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), + c.setLocal("windowIdx", c.i32_sub(c.getLocal("windowIdx"), c.i32_const(1))), c.br(0) )), - c.call(prefix + "_add", c.getLocal("pTable"), c.getLocal("pAcc"), c.getLocal("pTable")) + // Free the digit buffer + c.i32_store(c.i32_const(0), c.getLocal("savedFree")) ); } buildGetChunk(); - buildReduceTable(); + buildRecode(); buildMutiexpChunk(); buildMultiexp(); @@ -470,6 +511,3 @@ module.exports = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { }; - - - diff --git a/src/build_pedersenhash.js b/src/build_pedersenhash.js index 05fd5ec..75d2039 100644 --- a/src/build_pedersenhash.js +++ b/src/build_pedersenhash.js @@ -37,7 +37,7 @@ */ -module.exports = function buildPedersenHash(module, prefix, curvePrefix, pointFieldPrefix, chunkSize, basesTable) { +export default function buildPedersenHash(module, prefix, curvePrefix, pointFieldPrefix, chunkSize, basesTable) { const pointN64 = module.modules[curvePrefix].n64; const pointN8 = pointN64*8; diff --git a/src/build_pol.js b/src/build_pol.js index 938ee6c..a45cc1c 100644 --- a/src/build_pol.js +++ b/src/build_pol.js @@ -17,7 +17,7 @@ along with wasmsnark. If not, see . */ -module.exports = function buildPol(module, prefix, prefixField) { +export default function buildPol(module, prefix, prefixField) { const n64 = module.modules[prefixField].n64; const n8 = n64*8; diff --git a/src/build_qap.js b/src/build_qap.js index a8c20cf..f78763d 100644 --- a/src/build_qap.js +++ b/src/build_qap.js @@ -1,5 +1,5 @@ -module.exports = function buildQAP(module, prefix, prefixField) { +export default function buildQAP(module, prefix, prefixField) { const n64 = module.modules[prefixField].n64; const n8 = n64*8; diff --git a/src/build_test.js b/src/build_test.js index 6d078d9..ff35a25 100644 --- a/src/build_test.js +++ b/src/build_test.js @@ -40,5 +40,4 @@ function buildTest2(module, fn) { module.exportFunction("test_"+fn); } -module.exports.buildTest1 = buildTest1; -module.exports.buildTest2 = buildTest2; +export { buildTest1, buildTest2 }; diff --git a/src/build_testf1.js b/src/build_testf1.js index dc3edea..99fac45 100644 --- a/src/build_testf1.js +++ b/src/build_testf1.js @@ -17,7 +17,7 @@ along with wasmsnark. If not, see . */ -module.exports = function buildTestF1(module) { +export default function buildTestF1(module) { const pR2 = module.modules.f1m.pR2; const n8 = module.modules.f1m.n64*8; diff --git a/src/build_testg1.js b/src/build_testg1.js deleted file mode 100644 index 74921c4..0000000 --- a/src/build_testg1.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -module.exports = function buildTestAddG1(module) { - - function buildTestAddG1() { - const f = module.addFunction("testAddG1"); - f.addParam("n", "i32"); - f.addParam("pP", "i32"); - f.addParam("pR", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call("g1_zero", c.getLocal("pR"))); - - f.addCode(c.setLocal("i", c.getLocal("n"))); - f.addCode(c.block(c.loop( - c.call("g1_add", c.getLocal("pP"), c.getLocal("pR"), c.getLocal("pR")), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.br(0) - ))); - } - - buildTestAddG1(); - module.exportFunction("testAddG1"); -}; - diff --git a/src/build_timesscalar.js b/src/build_timesscalar.js index 48f6fec..aa14df8 100644 --- a/src/build_timesscalar.js +++ b/src/build_timesscalar.js @@ -17,7 +17,7 @@ along with wasmsnark. If not, see . */ -module.exports = function buildTimesScalar(module, fnName, elementLen, opAB, opAA, opCopy, opInit) { +export default function buildTimesScalar(module, fnName, elementLen, opAB, opAA, opCopy, opInit) { const f = module.addFunction(fnName); f.addParam("base", "i32"); diff --git a/src/build_timesscalarnaf.js b/src/build_timesscalarnaf.js index 868b825..3f48122 100644 --- a/src/build_timesscalarnaf.js +++ b/src/build_timesscalarnaf.js @@ -17,7 +17,7 @@ along with wasmsnark. If not, see . */ -module.exports = function buildTimesScalarNAF(module, fnName, elementLen, opAB, opAA, opAmB, opCopy, opInit) { +export default function buildTimesScalarNAF(module, fnName, elementLen, opAB, opAA, opAmB, opCopy, opInit) { const f = module.addFunction(fnName); f.addParam("base", "i32"); diff --git a/src/build_tomcook.js b/src/build_tomcook.js index ab1f6b0..285a650 100644 --- a/src/build_tomcook.js +++ b/src/build_tomcook.js @@ -1,6 +1,5 @@ -const assert = require("assert"); -module.exports = function buildTomCook(module, _prefix) { +export default function buildTomCook(module, _prefix) { const prefix = _prefix || "tomcook"; const definedFunctions = {}; @@ -10,23 +9,25 @@ module.exports = function buildTomCook(module, _prefix) { const CHUNK_BASE_MAX = "9223372036317904896"; function load(size, c, localVar, pos) { - if (size == "l") { - return c.i64_load(c.getLocal(localVar), pos*8); - } else if (size=="s") { - return c.i64_load32_s(c.getLocal(localVar), pos*4); - } else { - assert(false, "invalid size: "+size); + if (size === "l") { + return c.i64_load(c.getLocal(localVar), pos * 8); } + if (size === "s") { + return c.i64_load32_s(c.getLocal(localVar), pos * 4); + } + throw new Error("invalid size: " + size); + } function store(size, c, localVar, pos, value) { - if (size == "l") { - return c.i64_store(c.getLocal(localVar), pos*8, value); - } else if (size == "s") { - return c.i64_store32(c.getLocal(localVar), pos*4, value); - } else { - assert(false, "invalid size: "+size); + if (size === "l") { + return c.i64_store(c.getLocal(localVar), pos * 8, value); } + if (size === "s") { + return c.i64_store32(c.getLocal(localVar), pos * 4, value); + } + throw new Error("invalid size: " + size); + } function storeAdjusting(size, c, carryVar, dstVar, auxVar, pos) { @@ -66,7 +67,7 @@ module.exports = function buildTomCook(module, _prefix) { } function buildMul3(sizes) { - const fnName = prefix+"_mul3"+sizes; + const fnName = prefix + "_mul3" + sizes; if (definedFunctions[fnName]) return; definedFunctions[fnName] = true; @@ -92,24 +93,24 @@ module.exports = function buildTomCook(module, _prefix) { c.setLocal("a0", load(sizes[0], c, "x", 0)), c.setLocal("b0", load(sizes[1], c, "y", 0)), - c.setLocal("c", c.i64_mul( c.getLocal("a0"), c.getLocal("b0") )), + c.setLocal("c", c.i64_mul(c.getLocal("a0"), c.getLocal("b0"))), store(sizes[2], c, "r", 0, - c.i64_rem_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)) + c.i64_rem_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)) ), c.setLocal("a1", load(sizes[0], c, "x", 1)), c.setLocal("b1", load(sizes[1], c, "y", 1)), c.setLocal("c", c.i64_add( - c.i64_div_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)), + c.i64_div_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)), c.i64_add( - c.i64_mul( c.getLocal("a0"), c.getLocal("b1") ), - c.i64_mul( c.getLocal("a1"), c.getLocal("b0") ) + c.i64_mul(c.getLocal("a0"), c.getLocal("b1")), + c.i64_mul(c.getLocal("a1"), c.getLocal("b0")) ) )), store(sizes[2], c, "r", 1, - c.i64_rem_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)) + c.i64_rem_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)) ), c.setLocal("a2", load(sizes[0], c, "x", 2)), @@ -117,46 +118,46 @@ module.exports = function buildTomCook(module, _prefix) { c.setLocal("c", c.i64_add( c.i64_add( - c.i64_mul( c.getLocal("a0"), c.getLocal("b2") ), - c.i64_mul( c.getLocal("a2"), c.getLocal("b0") ) + c.i64_mul(c.getLocal("a0"), c.getLocal("b2")), + c.i64_mul(c.getLocal("a2"), c.getLocal("b0")) ), c.i64_add( - c.i64_div_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)), - c.i64_mul( c.getLocal("a1"), c.getLocal("b1") ), + c.i64_div_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)), + c.i64_mul(c.getLocal("a1"), c.getLocal("b1")), ) )), store(sizes[2], c, "r", 2, - c.i64_rem_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)) + c.i64_rem_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)) ), c.setLocal("c", c.i64_add( c.i64_add( - c.i64_div_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)), - c.i64_mul( c.getLocal("a1"), c.getLocal("b2")) + c.i64_div_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)), + c.i64_mul(c.getLocal("a1"), c.getLocal("b2")) ), - c.i64_mul( c.getLocal("a2"), c.getLocal("b1") ), + c.i64_mul(c.getLocal("a2"), c.getLocal("b1")), )), store(sizes[2], c, "r", 3, - c.i64_rem_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)) + c.i64_rem_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)) ), c.setLocal("c", c.i64_add( - c.i64_mul( c.getLocal("a2"), c.getLocal("b2") ), - c.i64_div_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)), + c.i64_mul(c.getLocal("a2"), c.getLocal("b2")), + c.i64_div_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)), )), store(sizes[2], c, "r", 4, - c.i64_rem_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)) + c.i64_rem_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)) ), store(sizes[2], c, "r", 5, - c.i64_div_s( c.getLocal("c"), c.i64_const(CHUNK_BASE)), + c.i64_div_s(c.getLocal("c"), c.i64_const(CHUNK_BASE)), ), ); } function buildAdd(n, sizes) { - const fnName = prefix+"_add"+n+sizes; + const fnName = prefix + "_add" + n + sizes; if (definedFunctions[fnName]) return; definedFunctions[fnName] = true; @@ -168,7 +169,7 @@ module.exports = function buildTomCook(module, _prefix) { const c = f.getCodeBuilder(); - for (let i=0; i=0; i--) { + for (let i = n - 2; i >= 0; i--) { f.addCode( c.setLocal("c", c.i64_add( @@ -288,11 +289,11 @@ module.exports = function buildTomCook(module, _prefix) { function buildRecompose(n, sizes) { - const fnName = prefix+"_recompose"+n+sizes; + const fnName = prefix + "_recompose" + n + sizes; if (definedFunctions[fnName]) return; definedFunctions[fnName] = true; - const sn = n/3; + const sn = n / 3; const f = module.addFunction(fnName); f.addParam("s", "i32"); f.addParam("r", "i32"); @@ -319,7 +320,7 @@ module.exports = function buildTomCook(module, _prefix) { f.addCode(c.setLocal("c", c.i64_const(0))); - for (let i=0; i. */ -const ModuleBuilder = require("wasmbuilder").ModuleBuilder; -const buildF1 = require("./build_f1.js"); -const buildTestF1 = require("./build_testf1.js"); -const { bitLength } = require("./bigint.js"); +import { ModuleBuilder } from "wasmbuilder"; +import buildF1 from "./build_f1.js"; +import buildTestF1 from "./build_testf1.js"; +import { bitLength } from "./bigint.js"; async function build(q) { const f1 = new F1(q); @@ -149,4 +149,4 @@ class F1 { */ } -module.exports = build; +export default build; diff --git a/src/mnt6753/build_mnt6753.js b/src/mnt6753/build_mnt6753.js index 7bf0691..0458008 100644 --- a/src/mnt6753/build_mnt6753.js +++ b/src/mnt6753/build_mnt6753.js @@ -1,16 +1,15 @@ -const utils = require("../utils"); - -const buildF1m =require("../build_f1m.js"); -const buildF1 =require("../build_f1.js"); -const buildF2m =require("../build_f2m.js"); -const buildF3m =require("../build_f3m.js"); -const buildCurve =require("../build_curve_projective.js"); -const { bitLength, isOdd, modInv } = require("../bigint.js"); +import * as utils from "../utils.js"; +import buildF1m from "../build_f1m.js"; +import buildF1 from "../build_f1.js"; +import buildF2m from "../build_f2m.js"; +import buildF3m from "../build_f3m.js"; +import buildCurve from "../build_curve_projective.js"; +import { bitLength, isOdd, modInv } from "../bigint.js"; // // Curve definition: https://coinlist.co/build/coda/pages/mnt6753 // -module.exports = function buildMNT6753(module, _prefix) { +export default function buildMNT6753(module, _prefix) { const prefix = _prefix || "mnt6753"; diff --git a/src/utils.js b/src/utils.js index a3ac5b9..7edc07f 100644 --- a/src/utils.js +++ b/src/utils.js @@ -17,7 +17,7 @@ along with wasmsnark. If not, see . */ -exports.bigInt2BytesLE = function bigInt2BytesLE(_a, len) { +export function bigInt2BytesLE(_a, len) { const b = Array(len); let v = BigInt(_a); for (let i=0; i> 8n; } return b; -}; +} -exports.bigInt2U32LE = function bigInt2BytesLE(_a, len) { +export function bigInt2U32LE(_a, len) { const b = Array(len); let v = BigInt(_a); for (let i=0; i> 32n; } return b; -}; +} -exports.isOcamNum = function(a) { +export function isOcamNum(a) { if (!Array.isArray(a)) return false; if (a.length != 3) return false; if (typeof a[0] !== "number") return false; if (typeof a[1] !== "number") return false; if (!Array.isArray(a[2])) return false; return true; -}; +} diff --git a/test/bls12381.js b/test/bls12381.js index ba7a318..9b43110 100644 --- a/test/bls12381.js +++ b/test/bls12381.js @@ -1,39 +1,37 @@ -const assert = require("assert"); -const buildBls12381 = require("../src/bls12381/build_bls12381.js"); -const buildProtoboard = require("wasmbuilder").buildProtoboard; -const {bitLength} = require("../src/bigint.js"); +import buildBls12381 from "../src/bls12381/build_bls12381.js"; +import { buildProtoboard } from "wasmbuilder"; +import { bitLength } from "../src/bigint.js"; +import { describe, assert, it, beforeAll } from "vitest"; describe("Basic tests for g1 in bls12-381", function () { - this.timeout(10000000); - - const n8q=48; - const n8r=32; + const n8q = 48; + const n8r = 32; function getFieldElementF12(pR) { pb.ftm_fromMontgomery(pR, pR); - const res = [ + const res = [ [ [ pb.get(pR), - pb.get(pR+n8q), - ],[ - pb.get(pR+n8q*2), - pb.get(pR+n8q*3), - ],[ - pb.get(pR+n8q*4), - pb.get(pR+n8q*5), + pb.get(pR + n8q), + ], [ + pb.get(pR + n8q * 2), + pb.get(pR + n8q * 3), + ], [ + pb.get(pR + n8q * 4), + pb.get(pR + n8q * 5), ] - ],[ + ], [ [ - pb.get(pR+n8q*6), - pb.get(pR+n8q*7), - ],[ - pb.get(pR+n8q*8), - pb.get(pR+n8q*9), - ],[ - pb.get(pR+n8q*10), - pb.get(pR+n8q*11), + pb.get(pR + n8q * 6), + pb.get(pR + n8q * 7), + ], [ + pb.get(pR + n8q * 8), + pb.get(pR + n8q * 9), + ], [ + pb.get(pR + n8q * 10), + pb.get(pR + n8q * 11), ] ] ]; @@ -42,16 +40,16 @@ describe("Basic tests for g1 in bls12-381", function () { } function getFieldElementF6(pR) { pb.f6m_fromMontgomery(pR, pR); - const res = [ + const res = [ [ pb.get(pR), - pb.get(pR+n8q), - ],[ - pb.get(pR+n8q*2), - pb.get(pR+n8q*3), - ],[ - pb.get(pR+n8q*4), - pb.get(pR+n8q*5), + pb.get(pR + n8q), + ], [ + pb.get(pR + n8q * 2), + pb.get(pR + n8q * 3), + ], [ + pb.get(pR + n8q * 4), + pb.get(pR + n8q * 5), ] ]; pb.f6m_toMontgomery(pR, pR); @@ -59,18 +57,18 @@ describe("Basic tests for g1 in bls12-381", function () { } function getFieldElementF2(pR) { pb.f2m_fromMontgomery(pR, pR); - const res = [ + const res = [ pb.get(pR), - pb.get(pR+n8q), + pb.get(pR + n8q), ]; pb.f2m_toMontgomery(pR, pR); return res; } function assertEqualF12(p1, p2) { - for (let i=0; i<2; i++) { - for (let j=0; j<3; j++) { - for (let k=0; k<2; k++) { + for (let i = 0; i < 2; i++) { + for (let j = 0; j < 3; j++) { + for (let k = 0; k < 2; k++) { assert.equal(p1[i][j][k], p2[i][j][k]); } } @@ -78,15 +76,15 @@ describe("Basic tests for g1 in bls12-381", function () { } function assertEqualF6(p1, p2) { - for (let j=0; j<3; j++) { - for (let k=0; k<2; k++) { + for (let j = 0; j < 3; j++) { + for (let k = 0; k < 2; k++) { assert.equal(BigInt(p1[j][k]), BigInt(p2[j][k])); } } } function assertEqualF2(p1, p2) { - for (let k=0; k<2; k++) { + for (let k = 0; k < 2; k++) { assert.equal(p1[k], p2[k]); } } @@ -98,85 +96,91 @@ describe("Basic tests for g1 in bls12-381", function () { return "0x" + n.toString(16); } + //eslint-disable-next-line no-unused-vars function printF1(s, p) { console.log(s, " " + ns(p)); } + //eslint-disable-next-line no-unused-vars function printF2(s, p) { - console.log(s + " Fq2(" + ns(p) + " + " + ns(p+n8q) +"*u " ); + console.log(s + " Fq2(" + ns(p) + " + " + ns(p + n8q) + "*u "); } + //eslint-disable-next-line no-unused-vars function printF6(s, p) { - console.log(s + " [Fq2(\n" + ns(p) + " +\n " + ns(p+n8q) +"*u],[" ); - console.log("Fq2(\n" + ns(p+n8q*2) + " +\n " + ns(p+n8q*3) +"*u],[" ); - console.log("Fq2(\n" + ns(p+n8q*4) + " +\n " + ns(p+n8q*5) +"*u]" ); + console.log(s + " [Fq2(\n" + ns(p) + " +\n " + ns(p + n8q) + "*u],["); + console.log("Fq2(\n" + ns(p + n8q * 2) + " +\n " + ns(p + n8q * 3) + "*u],["); + console.log("Fq2(\n" + ns(p + n8q * 4) + " +\n " + ns(p + n8q * 5) + "*u]"); } + //eslint-disable-next-line no-unused-vars function printF12(s, p) { - console.log(s + " [ [Fq2(\n" + ns(p) + " +\n " + ns(p+n8q) +"*u],[" ); - console.log("Fq2(\n" + ns(p+n8q*2) + " +\n " + ns(p+n8q*3) +"*u],[" ); - console.log("Fq2(\n" + ns(p+n8q*4) + " +\n " + ns(p+n8q*5) +"*u]]" ); - console.log("[ [Fq2(\n" + ns(p+n8q*6) + " +\n " + ns(p+n8q*7) +"*u],[" ); - console.log("Fq2(\n" + ns(p+n8q*8) + " +\n " + ns(p+n8q*9) +"*u],[" ); - console.log("Fq2(\n" + ns(p+n8q*10) + " +\n " + ns(p+n8q*11) +"*u]]" ); + console.log(s + " [ [Fq2(\n" + ns(p) + " +\n " + ns(p + n8q) + "*u],["); + console.log("Fq2(\n" + ns(p + n8q * 2) + " +\n " + ns(p + n8q * 3) + "*u],["); + console.log("Fq2(\n" + ns(p + n8q * 4) + " +\n " + ns(p + n8q * 5) + "*u]]"); + console.log("[ [Fq2(\n" + ns(p + n8q * 6) + " +\n " + ns(p + n8q * 7) + "*u],["); + console.log("Fq2(\n" + ns(p + n8q * 8) + " +\n " + ns(p + n8q * 9) + "*u],["); + console.log("Fq2(\n" + ns(p + n8q * 10) + " +\n " + ns(p + n8q * 11) + "*u]]"); } + //eslint-disable-next-line no-unused-vars function printG1(s, p) { - console.log(s + " G1(" + ns(p) + " , " + ns(p+n8q) + " , " + ns(p+n8q*2) + ")" ); + console.log(s + " G1(" + ns(p) + " , " + ns(p + n8q) + " , " + ns(p + n8q * 2) + ")"); } + //eslint-disable-next-line no-unused-vars function printG2(s, p) { console.log(s + " (G2):"); - for (let i=0; i<6; i++) { - console.log(ns(p+n8q*i)); + for (let i = 0; i < 6; i++) { + console.log(ns(p + n8q * i)); } console.log(""); } let pb; - before(async () => { + beforeAll(async () => { pb = await buildProtoboard((module) => { buildBls12381(module); }, n8q); }); it("It should do a basic point operation in F2", async () => { - const e1 = pb.alloc(n8q*2); + const e1 = pb.alloc(n8q * 2); pb.set(e1, 1n); - pb.set(e1+n8q, 2n); - const e2 = pb.alloc(n8q*2); - pb.f2m_square(e1,e2); + pb.set(e1 + n8q, 2n); + const e2 = pb.alloc(n8q * 2); + pb.f2m_square(e1, e2); - const e3 = pb.alloc(n8q*2); - pb.f2m_mul(e1,e1, e3); + const e3 = pb.alloc(n8q * 2); + pb.f2m_mul(e1, e1, e3); const res2 = getFieldElementF2(e2); const res3 = getFieldElementF2(e3); - assert(res2[0] = res3[0]); - assert(res2[1] = res3[1]); + assert.equal(res2[0], res3[0]); + assert.equal(res2[1], res3[1]); }); it("It should do a big exponentioation F2", async () => { - const e1 = pb.alloc(n8q*2); + const e1 = pb.alloc(n8q * 2); pb.set(e1, 1n); - pb.set(e1+n8q, 2n); + pb.set(e1 + n8q, 2n); const exp = pb.bls12381.q ** 2n - 1n; - const l = (Math.floor((bitLength(exp)- 1) / 64) +1)*8; + const l = (Math.floor((bitLength(exp) - 1) / 64) + 1) * 8; const ps = pb.alloc(l); pb.set(ps, exp, l); - const e2 = pb.alloc(n8q*2); + const e2 = pb.alloc(n8q * 2); pb.f2m_exp(e1, ps, l, e2); const res2 = getFieldElementF2(e2); @@ -185,19 +189,19 @@ describe("Basic tests for g1 in bls12-381", function () { assert.equal(res2[1], 0n); }); it("It should do a basic op in f2", async () => { - const e1 = pb.alloc(n8q*2); + const e1 = pb.alloc(n8q * 2); - for (let i=0; i<2; i++) { - pb.set(e1+n8q*i, BigInt(i+1)); + for (let i = 0; i < 2; i++) { + pb.set(e1 + n8q * i, BigInt(i + 1)); } pb.f2m_toMontgomery(e1, e1); - const e2 = pb.alloc(n8q*2); + const e2 = pb.alloc(n8q * 2); pb.f2m_square(e1, e2); - const e3 = pb.alloc(n8q*2); - pb.f2m_mul(e1,e1, e3); + const e3 = pb.alloc(n8q * 2); + pb.f2m_mul(e1, e1, e3); const res2 = getFieldElementF2(e2); const res3 = getFieldElementF2(e3); @@ -205,23 +209,23 @@ describe("Basic tests for g1 in bls12-381", function () { assertEqualF2(res2, res3); }); it("It should do a basic op in f6", async () => { - const e1 = pb.alloc(n8q*6); + const e1 = pb.alloc(n8q * 6); - for (let i=0; i<6; i++) { - if ((i==2)||(i==5)) { - pb.set(e1+n8q*i, 1n); + for (let i = 0; i < 6; i++) { + if ((i == 2) || (i == 5)) { + pb.set(e1 + n8q * i, 1n); } else { - pb.f1m_zero(e1+n8q*i); + pb.f1m_zero(e1 + n8q * i); } } pb.f6m_toMontgomery(e1, e1); - const e2 = pb.alloc(n8q*6); + const e2 = pb.alloc(n8q * 6); pb.f6m_square(e1, e2); - const e3 = pb.alloc(n8q*6); - pb.f6m_mul(e1,e1, e3); + const e3 = pb.alloc(n8q * 6); + pb.f6m_mul(e1, e1, e3); pb.f6m_fromMontgomery(e2, e2); pb.f6m_fromMontgomery(e3, e3); @@ -232,23 +236,23 @@ describe("Basic tests for g1 in bls12-381", function () { assertEqualF6(res2, res3); }); it("It should do a basic op in f12", async () => { - const e1 = pb.alloc(n8q*12); + const e1 = pb.alloc(n8q * 12); - for (let i=0; i<12; i++) { - if ((i==5)||(i==6)) { - pb.set(e1+n8q*i, 1n); + for (let i = 0; i < 12; i++) { + if ((i == 5) || (i == 6)) { + pb.set(e1 + n8q * i, 1n); } else { - pb.f1m_zero(e1+n8q*i); + pb.f1m_zero(e1 + n8q * i); } } pb.ftm_toMontgomery(e1, e1); - const e2 = pb.alloc(n8q*12); + const e2 = pb.alloc(n8q * 12); pb.ftm_square(e1, e2); - const e3 = pb.alloc(n8q*12); - pb.ftm_mul(e1,e1, e3); + const e3 = pb.alloc(n8q * 12); + pb.ftm_mul(e1, e1, e3); pb.ftm_fromMontgomery(e2, e2); pb.ftm_fromMontgomery(e3, e3); @@ -261,21 +265,21 @@ describe("Basic tests for g1 in bls12-381", function () { it("It should do a big exponentioation F12", async () => { - const e1 = pb.alloc(n8q*12); + const e1 = pb.alloc(n8q * 12); - for (let i=0; i<12; i++) { - pb.set(e1+n8q*i, BigInt(i+1)); + for (let i = 0; i < 12; i++) { + pb.set(e1 + n8q * i, BigInt(i + 1)); } const exp = pb.bls12381.q ** 12n - 1n; - const l = (Math.floor((bitLength(exp) - 1) / 64) +1)*8; + const l = (Math.floor((bitLength(exp) - 1) / 64) + 1) * 8; const ps = pb.alloc(l); pb.set(ps, exp, l); - const e2 = pb.alloc(n8q*12); + const e2 = pb.alloc(n8q * 12); pb.ftm_exp(e1, ps, l, e2); const res2 = getFieldElementF12(e2); @@ -296,8 +300,8 @@ describe("Basic tests for g1 in bls12-381", function () { it("It should do a basic point doubling adding G1", async () => { const pG1 = pb.bls12381.pG1gen; - const p1 = pb.alloc(n8q*3); - const p2 = pb.alloc(n8q*3); + const p1 = pb.alloc(n8q * 3); + const p2 = pb.alloc(n8q * 3); pb.g1m_add(pG1, pG1, p1); // 2*G1 pb.g1m_add(p1, pG1, p1); // 3*G1 @@ -315,11 +319,11 @@ describe("Basic tests for g1 in bls12-381", function () { }); it("It should timesScalar G1", async () => { - const s=10; + const s = 10; const pG1 = pb.bls12381.pG1gen; - const p1 = pb.alloc(n8q*3); - const p2 = pb.alloc(n8q*3); + const p1 = pb.alloc(n8q * 3); + const p2 = pb.alloc(n8q * 3); const ps = pb.alloc(n8r); pb.set(ps, s); @@ -328,8 +332,8 @@ describe("Basic tests for g1 in bls12-381", function () { pb.g1m_zero(p2); - for (let i=0; i { const pG2 = pb.bls12381.pG2gen; - const p1 = pb.alloc(n8q*6); - const p2 = pb.alloc(n8q*6); + const p1 = pb.alloc(n8q * 6); + const p2 = pb.alloc(n8q * 6); pb.g2m_add(pG2, pG2, p1); // 2*G1 pb.g2m_add(p1, pG2, p1); // 3*G1 @@ -366,11 +370,11 @@ describe("Basic tests for g1 in bls12-381", function () { }); it("It should timesScalar G2", async () => { - const s=10; + const s = 10; const pG2 = pb.bls12381.pG2gen; - const p1 = pb.alloc(n8q*6); - const p2 = pb.alloc(n8q*6); + const p1 = pb.alloc(n8q * 6); + const p2 = pb.alloc(n8q * 6); const ps = pb.alloc(n8r); pb.set(ps, s); @@ -379,8 +383,8 @@ describe("Basic tests for g1 in bls12-381", function () { pb.g2m_zero(p2); - for (let i=0; i { - const pA = pb.alloc(n8q*6); - const pB = pb.alloc(n8q*6); - const pRes1 = pb.alloc(n8q*6); - const pRes2 = pb.alloc(n8q*6); - const pOne = pb.alloc(n8q*6); - const pRef = pb.alloc(n8q*6); - for (let i=0; i<6; i++) { - pb.set(pA + i*n8q, i+1); - if ([2,3].indexOf(i)>=0) { - pb.set(pB + i*n8q, i+1); + const pA = pb.alloc(n8q * 6); + const pB = pb.alloc(n8q * 6); + const pRes1 = pb.alloc(n8q * 6); + const pRes2 = pb.alloc(n8q * 6); + const pOne = pb.alloc(n8q * 6); + const pRef = pb.alloc(n8q * 6); + for (let i = 0; i < 6; i++) { + pb.set(pA + i * n8q, i + 1); + if ([2, 3].indexOf(i) >= 0) { + pb.set(pB + i * n8q, i + 1); } else { - pb.f1m_zero(pB + i*n8q); + pb.f1m_zero(pB + i * n8q); } } pb.f6m_one(pOne); - pb.f6m_toMontgomery(pA,pA); - pb.f6m_toMontgomery(pB,pB); - const pc1 = pb.alloc(n8q*2); + pb.f6m_toMontgomery(pA, pA); + pb.f6m_toMontgomery(pB, pB); + const pc1 = pb.alloc(n8q * 2); pb.set(pc1, 3); pb.set(pc1 + n8q, 4); pb.f2m_toMontgomery(pc1, pc1); @@ -429,34 +433,34 @@ describe("Basic tests for g1 in bls12-381", function () { const res1 = getFieldElementF6(pRes1); const res2 = getFieldElementF6(pRes2); - assertEqualF6(ref, [[0,0], [3,4], [0,0]]); + assertEqualF6(ref, [[0, 0], [3, 4], [0, 0]]); assertEqualF6(res1, res2); }); it("Should f6_mul01", async () => { - const pA = pb.alloc(n8q*6); - const pB = pb.alloc(n8q*6); - const pRes1 = pb.alloc(n8q*6); - const pRes2 = pb.alloc(n8q*6); - const pOne = pb.alloc(n8q*6); - const pRef = pb.alloc(n8q*6); - for (let i=0; i<6; i++) { - pb.set(pA + i*n8q, i+1); - if ([0,1,2,3].indexOf(i)>=0) { - pb.set(pB + i*n8q, i+1); + const pA = pb.alloc(n8q * 6); + const pB = pb.alloc(n8q * 6); + const pRes1 = pb.alloc(n8q * 6); + const pRes2 = pb.alloc(n8q * 6); + const pOne = pb.alloc(n8q * 6); + const pRef = pb.alloc(n8q * 6); + for (let i = 0; i < 6; i++) { + pb.set(pA + i * n8q, i + 1); + if ([0, 1, 2, 3].indexOf(i) >= 0) { + pb.set(pB + i * n8q, i + 1); } else { - pb.f1m_zero(pB + i*n8q); + pb.f1m_zero(pB + i * n8q); } } pb.f6m_one(pOne); - pb.f6m_toMontgomery(pA,pA); - pb.f6m_toMontgomery(pB,pB); - const pc0 = pb.alloc(n8q*2); + pb.f6m_toMontgomery(pA, pA); + pb.f6m_toMontgomery(pB, pB); + const pc0 = pb.alloc(n8q * 2); pb.set(pc0, 1); pb.set(pc0 + n8q, 2); pb.f2m_toMontgomery(pc0, pc0); - const pc1 = pb.alloc(n8q*2); + const pc1 = pb.alloc(n8q * 2); pb.set(pc1, 3); pb.set(pc1 + n8q, 4); pb.f2m_toMontgomery(pc1, pc1); @@ -470,37 +474,37 @@ describe("Basic tests for g1 in bls12-381", function () { const res1 = getFieldElementF6(pRes1); const res2 = getFieldElementF6(pRes2); - assertEqualF6(ref, [[1,2], [3,4], [0,0]]); + assertEqualF6(ref, [[1, 2], [3, 4], [0, 0]]); assertEqualF6(res1, res2); }); it("Should f12_014", async () => { - const pA = pb.alloc(n8q*12); - const pB = pb.alloc(n8q*12); - const pRes1 = pb.alloc(n8q*12); - const pRes2 = pb.alloc(n8q*12); - const pOne = pb.alloc(n8q*12); - const pRef = pb.alloc(n8q*12); - for (let i=0; i<12; i++) { - pb.set(pA + i*n8q, i+1); - if ([0,1,2,3,8,9].indexOf(i)>=0) { - pb.set(pB + i*n8q, i+1); + const pA = pb.alloc(n8q * 12); + const pB = pb.alloc(n8q * 12); + const pRes1 = pb.alloc(n8q * 12); + const pRes2 = pb.alloc(n8q * 12); + const pOne = pb.alloc(n8q * 12); + const pRef = pb.alloc(n8q * 12); + for (let i = 0; i < 12; i++) { + pb.set(pA + i * n8q, i + 1); + if ([0, 1, 2, 3, 8, 9].indexOf(i) >= 0) { + pb.set(pB + i * n8q, i + 1); } else { - pb.f1m_zero(pB + i*n8q); + pb.f1m_zero(pB + i * n8q); } } pb.ftm_one(pOne); - pb.ftm_toMontgomery(pA,pA); - pb.ftm_toMontgomery(pB,pB); - const pc0 = pb.alloc(n8q*2); + pb.ftm_toMontgomery(pA, pA); + pb.ftm_toMontgomery(pB, pB); + const pc0 = pb.alloc(n8q * 2); pb.set(pc0, 1); pb.set(pc0 + n8q, 2); pb.ftm_toMontgomery(pc0, pc0); - const pc1 = pb.alloc(n8q*2); + const pc1 = pb.alloc(n8q * 2); pb.set(pc1, 3); pb.set(pc1 + n8q, 4); pb.f2m_toMontgomery(pc1, pc1); - const pc4 = pb.alloc(n8q*2); + const pc4 = pb.alloc(n8q * 2); pb.set(pc4, 9); pb.set(pc4 + n8q, 10); pb.f2m_toMontgomery(pc4, pc4); @@ -514,20 +518,20 @@ describe("Basic tests for g1 in bls12-381", function () { const res1 = getFieldElementF12(pRes1); const res2 = getFieldElementF12(pRes2); - assertEqualF12(ref, [[[1,2], [3,4], [0,0]],[[0,0], [9,10], [0,0]]]); + assertEqualF12(ref, [[[1, 2], [3, 4], [0, 0]], [[0, 0], [9, 10], [0, 0]]]); assertEqualF12(res1, res2); }); it("Should Test Frobenius", async () => { - const pA = pb.alloc(n8q*12); - const pB = pb.alloc(n8q*12); - const pAq = pb.alloc(n8q*12); - const pAqi = pb.alloc(n8q*12); + const pA = pb.alloc(n8q * 12); + const pB = pb.alloc(n8q * 12); + const pAq = pb.alloc(n8q * 12); + const pAqi = pb.alloc(n8q * 12); const pq = pb.bls12381.pq; let res1, res2; - for (let i=0; i<12; i++) { - pb.set(pA+n8q*i, BigInt(i+1)); + for (let i = 0; i < 12; i++) { + pb.set(pA + n8q * i, BigInt(i + 1)); } pb.ftm_toMontgomery(pA, pA); // printF12("pA", pA); @@ -538,10 +542,10 @@ describe("Basic tests for g1 in bls12-381", function () { assertEqualF12(res1, res2); - pb.ftm_exp(pA, pq, n8q,pAq); + pb.ftm_exp(pA, pq, n8q, pAq); - for (let power = 1; power<10; ++power) { - pb["ftm_frobeniusMap"+power](pA, pAqi); + for (let power = 1; power < 10; ++power) { + pb["ftm_frobeniusMap" + power](pA, pAqi); res1 = getFieldElementF12(pAq); res2 = getFieldElementF12(pAqi); @@ -550,7 +554,7 @@ describe("Basic tests for g1 in bls12-381", function () { assertEqualF12(res1, res2); - pb.ftm_exp(pAq, pq, n8q,pAq); + pb.ftm_exp(pAq, pq, n8q, pAq); } }); @@ -566,15 +570,15 @@ describe("Basic tests for g1 in bls12-381", function () { // FieldT aqcubed_minus1 = a.Frobenius_map(FieldT::extension_degree()/2) * a.inverse(); // assert(aqcubed_minus1.inverse() == aqcubed_minus1.unitary_inverse()); - const pA = pb.alloc(n8q*12); - const pAf = pb.alloc(n8q*12); - const pAInverse = pb.alloc(n8q*12); - const pAcubedMinus1 = pb.alloc(n8q*12); - const pAcubedMinus1Inverse = pb.alloc(n8q*12); - const pAcubedMinus1UnitaryInverse = pb.alloc(n8q*12); + const pA = pb.alloc(n8q * 12); + const pAf = pb.alloc(n8q * 12); + const pAInverse = pb.alloc(n8q * 12); + const pAcubedMinus1 = pb.alloc(n8q * 12); + const pAcubedMinus1Inverse = pb.alloc(n8q * 12); + const pAcubedMinus1UnitaryInverse = pb.alloc(n8q * 12); let res1, res2; - for (let i=0; i<12; i++) { - pb.set(pA+n8q*i, BigInt(i+1)); + for (let i = 0; i < 12; i++) { + pb.set(pA + n8q * i, BigInt(i + 1)); } pb.ftm_toMontgomery(pA, pA); pb.ftm_frobeniusMap6(pA, pAf); @@ -602,12 +606,12 @@ describe("Basic tests for g1 in bls12-381", function () { // assert(beta.cyclotomic_squared() == beta.squared()); - const pA = pb.alloc(n8q*12); - const pBeta = pb.alloc(n8q*12); - const pCycSquare = pb.alloc(n8q*12); - const pNormSquare = pb.alloc(n8q*12); - const pCycExp = pb.alloc(n8q*12); - const pNormExp = pb.alloc(n8q*12); + const pA = pb.alloc(n8q * 12); + const pBeta = pb.alloc(n8q * 12); + const pCycSquare = pb.alloc(n8q * 12); + const pNormSquare = pb.alloc(n8q * 12); + const pCycExp = pb.alloc(n8q * 12); + const pNormExp = pb.alloc(n8q * 12); const pr = pb.alloc(n8q); const pe = pb.alloc(544); const peZ = pb.alloc(n8q); @@ -617,8 +621,8 @@ describe("Basic tests for g1 in bls12-381", function () { pb.set(peZ, 15132376222941642752n); let res1, res2; - for (let i=0; i<12; i++) { - pb.set(pA+n8q*i, BigInt(i+1)); + for (let i = 0; i < 12; i++) { + pb.set(pA + n8q * i, BigInt(i + 1)); } pb.ftm_exp(pA, pe, 544, pBeta); @@ -647,12 +651,12 @@ describe("Basic tests for g1 in bls12-381", function () { it("Should test unitary", async () => { const pG1 = pb.bls12381.pG1gen; const pG2 = pb.bls12381.pG2gen; - const pnG1 = pb.alloc(n8q*3); - const pnG2 = pb.alloc(n8q*6); + const pnG1 = pb.alloc(n8q * 3); + const pnG2 = pb.alloc(n8q * 6); - const pP = pb.alloc(n8q*12); - const pQ = pb.alloc(n8q*12); - const pR = pb.alloc(n8q*12); + const pP = pb.alloc(n8q * 12); + const pQ = pb.alloc(n8q * 12); + const pR = pb.alloc(n8q * 12); pb.g1m_neg(pG1, pnG1); pb.g2m_neg(pG2, pnG2); @@ -676,15 +680,15 @@ describe("Basic tests for g1 in bls12-381", function () { it("It should do a basic pairing", async () => { const ps = pb.alloc(n8r); - const pOne = pb.alloc(n8q*12); + const pOne = pb.alloc(n8q * 12); pb.set(ps, 10n); - const pRes1 = pb.alloc(n8q*12); - const pRes2 = pb.alloc(n8q*12); - const pRes3 = pb.alloc(n8q*12); - const pRes4 = pb.alloc(n8q*12); + const pRes1 = pb.alloc(n8q * 12); + const pRes2 = pb.alloc(n8q * 12); + const pRes3 = pb.alloc(n8q * 12); + const pRes4 = pb.alloc(n8q * 12); - const pG1s = pb.alloc(n8q*3); - const pG2s = pb.alloc(n8q*2*3); + const pG1s = pb.alloc(n8q * 3); + const pG2s = pb.alloc(n8q * 2 * 3); const pG1gen = pb.bls12381.pG1gen; const pG2gen = pb.bls12381.pG2gen; @@ -692,8 +696,8 @@ describe("Basic tests for g1 in bls12-381", function () { pb.g1m_timesScalar(pG1gen, ps, n8r, pG1s); pb.g2m_timesScalar(pG2gen, ps, n8r, pG2s); - const pPreP = pb.alloc(n8q*3); - const pPreQ = pb.alloc(n8q*2*3 + n8q*2*3*70); + const pPreP = pb.alloc(n8q * 3); + const pPreQ = pb.alloc(n8q * 2 * 3 + n8q * 2 * 3 * 70); pb.bls12381_prepareG1(pG1s, pPreP); pb.bls12381_prepareG2(pG2gen, pPreQ); @@ -739,27 +743,27 @@ describe("Basic tests for g1 in bls12-381", function () { }); it("Point in curve and not in group G1", async () => { - const p1 = pb.alloc(n8q*3); + const p1 = pb.alloc(n8q * 3); const pG1b = pb.bls12381.pG1b; pb.set(p1, 4n, n8q); pb.f1m_toMontgomery(p1, p1); - pb.f1m_square(p1, p1+n8q); - pb.f1m_mul(p1, p1+n8q, p1+n8q); - pb.f1m_add(p1+n8q, pG1b, p1+n8q); + pb.f1m_square(p1, p1 + n8q); + pb.f1m_mul(p1, p1 + n8q, p1 + n8q); + pb.f1m_add(p1 + n8q, pG1b, p1 + n8q); assert.equal(pb.g1m_inGroupAffine(p1), 0); assert.equal(pb.g1m_inCurveAffine(p1), 0); - pb.f1m_sqrt(p1+n8q, p1+n8q); + pb.f1m_sqrt(p1 + n8q, p1 + n8q); assert.equal(pb.g1m_inGroupAffine(p1), 0); assert.equal(pb.g1m_inCurveAffine(p1), 1); - const ph= pb.alloc(16); + const ph = pb.alloc(16); pb.set(ph, 0x396c8c005555e1568c00aaab0000aaabn, 16); - pb.g1m_timesScalarAffine(p1, ph, 16 ,p1); + pb.g1m_timesScalarAffine(p1, ph, 16, p1); assert.equal(pb.g1m_inCurve(p1), 1); assert.equal(pb.g1m_inGroup(p1), 1); @@ -773,28 +777,28 @@ describe("Basic tests for g1 in bls12-381", function () { it("Point in curve and not in group G2", async () => { - const p1 = pb.alloc(n8q*6); + const p1 = pb.alloc(n8q * 6); const pG2b = pb.bls12381.pG2b; pb.set(p1, 0n, n8q); - pb.set(p1+n8q, 4n, n8q); + pb.set(p1 + n8q, 4n, n8q); pb.f2m_toMontgomery(p1, p1); - pb.f2m_square(p1, p1+n8q*2); - pb.f2m_mul(p1, p1+n8q*2, p1+n8q*2); - pb.f2m_add(p1+n8q*2, pG2b, p1+n8q*2); + pb.f2m_square(p1, p1 + n8q * 2); + pb.f2m_mul(p1, p1 + n8q * 2, p1 + n8q * 2); + pb.f2m_add(p1 + n8q * 2, pG2b, p1 + n8q * 2); assert.equal(pb.g2m_inGroupAffine(p1), 0); assert.equal(pb.g2m_inCurveAffine(p1), 0); - pb.f2m_sqrt(p1+n8q*2, p1+n8q*2); + pb.f2m_sqrt(p1 + n8q * 2, p1 + n8q * 2); assert.equal(pb.g2m_inGroupAffine(p1), 0); assert.equal(pb.g2m_inCurveAffine(p1), 1); - const ph= pb.alloc(64); + const ph = pb.alloc(64); pb.set(ph, 0x05d543a95414e7f1091d50792876a202cd91de4547085abaa68a205b2e5a7ddfa628f1cb4d9e82ef21537e293a6691ae1616ec6e786f0c70cf1c38e31c7238e5n, 64); - pb.g2m_timesScalarAffine(p1, ph, 64 ,p1); + pb.g2m_timesScalarAffine(p1, ph, 64, p1); assert.equal(pb.g2m_inCurve(p1), 1); assert.equal(pb.g2m_inGroup(p1), 1); diff --git a/test/bn128.js b/test/bn128.js index ed12262..f3b3d85 100644 --- a/test/bn128.js +++ b/test/bn128.js @@ -1,6 +1,7 @@ -const assert = require("assert"); -const buildBn128 = require("../src/bn128/build_bn128.js"); -const buildProtoboard = require("wasmbuilder").buildProtoboard; +import buildBn128 from "../src/bn128/build_bn128.js"; +import { buildProtoboard } from "wasmbuilder"; +import { describe, assert, it, beforeAll } from "vitest"; + describe("Basic tests for g1 in bn128", () => { @@ -9,33 +10,33 @@ describe("Basic tests for g1 in bn128", () => { [ [ pb.get(pR), - pb.get(pR+32), - ],[ - pb.get(pR+32*2), - pb.get(pR+32*3), - ],[ - pb.get(pR+32*4), - pb.get(pR+32*5), + pb.get(pR + 32), + ], [ + pb.get(pR + 32 * 2), + pb.get(pR + 32 * 3), + ], [ + pb.get(pR + 32 * 4), + pb.get(pR + 32 * 5), ] - ],[ + ], [ [ - pb.get(pR+32*6), - pb.get(pR+32*7), - ],[ - pb.get(pR+32*8), - pb.get(pR+32*9), - ],[ - pb.get(pR+32*10), - pb.get(pR+32*11), + pb.get(pR + 32 * 6), + pb.get(pR + 32 * 7), + ], [ + pb.get(pR + 32 * 8), + pb.get(pR + 32 * 9), + ], [ + pb.get(pR + 32 * 10), + pb.get(pR + 32 * 11), ] ] ]; } function assertEqualF12(p1, p2) { - for (let i=0; i<2; i++) { - for (let j=0; j<3; j++) { - for (let k=0; k<2; k++) { + for (let i = 0; i < 2; i++) { + for (let j = 0; j < 3; j++) { + for (let k = 0; k < 2; k++) { assert.equal(p1[i][j][k], p2[i][j][k]); } } @@ -49,51 +50,56 @@ describe("Basic tests for g1 in bn128", () => { return "0x" + n.toString(16); } + //eslint-disable-next-line no-unused-vars function printF1(s, p) { console.log(s, " " + ns(p)); } + //eslint-disable-next-line no-unused-vars function printF2(s, p) { - console.log(s + " Fq2(" + ns(p) + " + " + ns(p+32) +"*u " ); + console.log(s + " Fq2(" + ns(p) + " + " + ns(p + 32) + "*u "); } + //eslint-disable-next-line no-unused-vars function printF6(s, p) { - console.log(s + " [Fq2(\n" + ns(p) + " +\n " + ns(p+32) +"*u],[" ); - console.log("Fq2(\n" + ns(p+32*2) + " +\n " + ns(p+32*3) +"*u],[" ); - console.log("Fq2(\n" + ns(p+32*4) + " +\n " + ns(p+32*5) +"*u]" ); + console.log(s + " [Fq2(\n" + ns(p) + " +\n " + ns(p + 32) + "*u],["); + console.log("Fq2(\n" + ns(p + 32 * 2) + " +\n " + ns(p + 32 * 3) + "*u],["); + console.log("Fq2(\n" + ns(p + 32 * 4) + " +\n " + ns(p + 32 * 5) + "*u]"); } + //eslint-disable-next-line no-unused-vars function printF12(s, p) { - console.log(s + " [ [Fq2(\n" + ns(p) + " +\n " + ns(p+32) +"*u],[" ); - console.log("Fq2(\n" + ns(p+32*2) + " +\n " + ns(p+32*3) +"*u],[" ); - console.log("Fq2(\n" + ns(p+32*4) + " +\n " + ns(p+32*5) +"*u]]" ); - console.log("[ [Fq2(\n" + ns(p+32*6) + " +\n " + ns(p+32*7) +"*u],[" ); - console.log("Fq2(\n" + ns(p+32*8) + " +\n " + ns(p+32*9) +"*u],[" ); - console.log("Fq2(\n" + ns(p+32*10) + " +\n " + ns(p+32*11) +"*u]]" ); + console.log(s + " [ [Fq2(\n" + ns(p) + " +\n " + ns(p + 32) + "*u],["); + console.log("Fq2(\n" + ns(p + 32 * 2) + " +\n " + ns(p + 32 * 3) + "*u],["); + console.log("Fq2(\n" + ns(p + 32 * 4) + " +\n " + ns(p + 32 * 5) + "*u]]"); + console.log("[ [Fq2(\n" + ns(p + 32 * 6) + " +\n " + ns(p + 32 * 7) + "*u],["); + console.log("Fq2(\n" + ns(p + 32 * 8) + " +\n " + ns(p + 32 * 9) + "*u],["); + console.log("Fq2(\n" + ns(p + 32 * 10) + " +\n " + ns(p + 32 * 11) + "*u]]"); } - //eslint-disable-next-line no-unused-vars + function printG1(s, p) { - console.log(s + " G1(" + ns(p) + " , " + ns(p+n8) + " , " + ns(p+n8*2) + ")" ); + console.log(s + " G1(" + ns(p) + " , " + ns(p + n8) + " , " + ns(p + n8 * 2) + ")"); } + //eslint-disable-next-line no-unused-vars function printG2(s, p) { console.log(s + " (G2):"); - for (let i=0; i<6; i++) { - console.log(ns(p+n8*i)); + for (let i = 0; i < 6; i++) { + console.log(ns(p + n8 * i)); } console.log(""); } let pb; - const n8=32; - before(async () => { + const n8 = 32; + beforeAll(async () => { pb = await buildProtoboard((module) => { buildBn128(module); }, n8); @@ -102,15 +108,15 @@ describe("Basic tests for g1 in bn128", () => { it("It should do a basic point doubling adding G1", async () => { const pG1 = pb.bn128.pG1gen; - const p1 = pb.alloc(n8*3); - const p2 = pb.alloc(n8*3); + const p1 = pb.alloc(n8 * 3); + const p2 = pb.alloc(n8 * 3); pb.g1m_add(pG1, pG1, p1); // 2*G1 // pb.g1m_normalize(p1, p1); - printG1("2*G1=",p1); + printG1("2*G1=", p1); pb.g1m_add(p1, pG1, p1); // 3*G1 // pb.g1m_normalize(p1, p1); - printG1("3*G1=",p1); + printG1("3*G1=", p1); pb.g1m_add(p1, pG1, p1); // 4*G1 pb.g1m_double(pG1, p2); // 2*G1 @@ -127,8 +133,8 @@ describe("Basic tests for g1 in bn128", () => { it("It should do a basic doubling adding G1", async () => { const pG1 = pb.bn128.pG1gen; - const p1 = pb.alloc(n8*3); - const p2 = pb.alloc(n8*3); + const p1 = pb.alloc(n8 * 3); + const p2 = pb.alloc(n8 * 3); pb.g1m_add(pG1, pG1, p1); // 2*G1 pb.g1m_add(p1, pG1, p1); // 3*G1 @@ -146,11 +152,11 @@ describe("Basic tests for g1 in bn128", () => { }); it("It should timesScalar G1", async () => { - const s=2; + const s = 2; const pG1 = pb.bn128.pG1gen; - const p1 = pb.alloc(n8*3); - const p2 = pb.alloc(n8*3); + const p1 = pb.alloc(n8 * 3); + const p2 = pb.alloc(n8 * 3); const ps = pb.alloc(n8); pb.set(ps, s); @@ -159,8 +165,8 @@ describe("Basic tests for g1 in bn128", () => { pb.g1m_zero(p2); - for (let i=0; i { const pG1 = pb.bn128.pG1gen; const pr = pb.bn128.pr; - const p1 = pb.alloc(n8*3); + const p1 = pb.alloc(n8 * 3); pb.g1m_timesScalar(pG1, pr, n8, p1); @@ -179,7 +185,7 @@ describe("Basic tests for g1 in bn128", () => { const pG1 = pb.bn128.pG1gen; const pr = pb.bn128.pr; - const p1 = pb.alloc(n8*3); + const p1 = pb.alloc(n8 * 3); pb.g1m_timesScalarAffine(pG1, pr, n8, p1); @@ -189,7 +195,7 @@ describe("Basic tests for g1 in bn128", () => { const pG2 = pb.bn128.pG2gen; const pr = pb.bn128.pr; - const p1 = pb.alloc(n8*3*2); + const p1 = pb.alloc(n8 * 3 * 2); pb.g1m_timesScalarAffine(pG2, pr, n8, p1); @@ -198,8 +204,8 @@ describe("Basic tests for g1 in bn128", () => { it("It should do a basic point doubling adding G2", async () => { const pG2 = pb.bn128.pG2gen; - const p1 = pb.alloc(n8*6); - const p2 = pb.alloc(n8*6); + const p1 = pb.alloc(n8 * 6); + const p2 = pb.alloc(n8 * 6); pb.g2m_add(pG2, pG2, p1); // 2*G1 pb.g2m_add(p1, pG2, p1); // 3*G1 @@ -217,11 +223,11 @@ describe("Basic tests for g1 in bn128", () => { }); it("It should timesScalar G2", async () => { - const s=10; + const s = 10; const pG2 = pb.bn128.pG2gen; - const p1 = pb.alloc(n8*6); - const p2 = pb.alloc(n8*6); + const p1 = pb.alloc(n8 * 6); + const p2 = pb.alloc(n8 * 6); const ps = pb.alloc(n8); pb.set(ps, s); @@ -230,8 +236,8 @@ describe("Basic tests for g1 in bn128", () => { pb.g2m_zero(p2); - for (let i=0; i { const pG2 = pb.bn128.pG2gen; const pr = pb.bn128.pr; - const p1 = pb.alloc(n8*6); + const p1 = pb.alloc(n8 * 6); pb.g2m_timesScalar(pG2, pr, n8, p1); @@ -248,20 +254,20 @@ describe("Basic tests for g1 in bn128", () => { }); it("Should multiply 024", async () => { - const pf = pb.alloc(32*12); - for (let i=0; i<12; i++) { - pb.set(pf + i*32, i); + const pf = pb.alloc(32 * 12); + for (let i = 0; i < 12; i++) { + pb.set(pf + i * 32, i); } - pb.ftm_toMontgomery(pf,pf); - const pEll0 = pb.alloc(32*2); + pb.ftm_toMontgomery(pf, pf); + const pEll0 = pb.alloc(32 * 2); pb.set(pEll0, 1); pb.set(pEll0 + 32, 2); - pb.f2m_toMontgomery(pEll0,pEll0); - const pVW = pb.alloc(32*2); + pb.f2m_toMontgomery(pEll0, pEll0); + const pVW = pb.alloc(32 * 2); pb.set(pVW, 3); pb.set(pVW + 32, 4); pb.f2m_toMontgomery(pVW, pVW); - const pVV = pb.alloc(32*2); + const pVV = pb.alloc(32 * 2); pb.set(pVV, 5); pb.set(pVV + 32, 6); pb.f2m_toMontgomery(pVV, pVV); @@ -269,10 +275,10 @@ describe("Basic tests for g1 in bn128", () => { pb.bn128__mulBy024(pEll0, pVW, pVV, pf); const res1 = getFieldElementF12(pf); - for (let i=0; i<12; i++) { - pb.set(pf + i*32, i); + for (let i = 0; i < 12; i++) { + pb.set(pf + i * 32, i); } - pb.ftm_toMontgomery(pf,pf); + pb.ftm_toMontgomery(pf, pf); pb.bn128__mulBy024(pEll0, pVW, pVV, pf); const res2 = getFieldElementF12(pf); @@ -283,14 +289,14 @@ describe("Basic tests for g1 in bn128", () => { it("Should Test Frobenius", async () => { - const pA = pb.alloc(32*12); - const pB = pb.alloc(32*12); - const pAq = pb.alloc(32*12); - const pAqi = pb.alloc(32*12); + const pA = pb.alloc(32 * 12); + const pB = pb.alloc(32 * 12); + const pAq = pb.alloc(32 * 12); + const pAqi = pb.alloc(32 * 12); const pq = pb.bn128.pq; let res1, res2; - for (let i=0; i<12; i++) { - pb.set(pA+32*i, BigInt(i+1)); + for (let i = 0; i < 12; i++) { + pb.set(pA + 32 * i, BigInt(i + 1)); } pb.ftm_toMontgomery(pA, pA); // printF12("pA", pA); @@ -300,10 +306,10 @@ describe("Basic tests for g1 in bn128", () => { res2 = getFieldElementF12(pB); assertEqualF12(res1, res2); - pb.ftm_exp(pA, pq, 32,pAq); + pb.ftm_exp(pA, pq, 32, pAq); - for (let power = 1; power<10; ++power) { - pb["bn128__frobeniusMap"+power](pA, pAqi); + for (let power = 1; power < 10; ++power) { + pb["bn128__frobeniusMap" + power](pA, pAqi); res1 = getFieldElementF12(pAq); res2 = getFieldElementF12(pAqi); @@ -312,7 +318,7 @@ describe("Basic tests for g1 in bn128", () => { assertEqualF12(res1, res2); - pb.ftm_exp(pAq, pq, 32,pAq); + pb.ftm_exp(pAq, pq, 32, pAq); } }); @@ -329,15 +335,15 @@ describe("Basic tests for g1 in bn128", () => { // assert(aqcubed_minus1.inverse() == aqcubed_minus1.unitary_inverse()); // } - const pA = pb.alloc(32*12); - const pAf = pb.alloc(32*12); - const pAInverse = pb.alloc(32*12); - const pAcubedMinus1 = pb.alloc(32*12); - const pAcubedMinus1Inverse = pb.alloc(32*12); - const pAcubedMinus1UnitaryInverse = pb.alloc(32*12); + const pA = pb.alloc(32 * 12); + const pAf = pb.alloc(32 * 12); + const pAInverse = pb.alloc(32 * 12); + const pAcubedMinus1 = pb.alloc(32 * 12); + const pAcubedMinus1Inverse = pb.alloc(32 * 12); + const pAcubedMinus1UnitaryInverse = pb.alloc(32 * 12); let res1, res2; - for (let i=0; i<12; i++) { - pb.set(pA+32*i, BigInt(i+1)); + for (let i = 0; i < 12; i++) { + pb.set(pA + 32 * i, BigInt(i + 1)); } pb.ftm_toMontgomery(pA, pA); pb.bn128__frobeniusMap6(pA, pAf); @@ -365,12 +371,12 @@ describe("Basic tests for g1 in bn128", () => { // assert(beta.cyclotomic_squared() == beta.squared()); - const pA = pb.alloc(32*12); - const pBeta = pb.alloc(32*12); - const pCycSquare = pb.alloc(32*12); - const pNormSquare = pb.alloc(32*12); - const pCycExp = pb.alloc(32*12); - const pNormExp = pb.alloc(32*12); + const pA = pb.alloc(32 * 12); + const pBeta = pb.alloc(32 * 12); + const pCycSquare = pb.alloc(32 * 12); + const pNormSquare = pb.alloc(32 * 12); + const pCycExp = pb.alloc(32 * 12); + const pNormExp = pb.alloc(32 * 12); const pr = pb.alloc(32); const pe = pb.alloc(352); const peZ = pb.alloc(32); @@ -380,8 +386,8 @@ describe("Basic tests for g1 in bn128", () => { pb.set(peZ, 4965661367192848881n); let res1, res2; - for (let i=0; i<12; i++) { - pb.set(pA+32*i, BigInt(i+1)); + for (let i = 0; i < 12; i++) { + pb.set(pA + 32 * i, BigInt(i + 1)); } pb.ftm_exp(pA, pe, 352, pBeta); @@ -410,15 +416,15 @@ describe("Basic tests for g1 in bn128", () => { it("It should do a basic pairing", async () => { const ps = pb.alloc(32); - const pOne = pb.alloc(32*12); + const pOne = pb.alloc(32 * 12); pb.set(ps, 10n); - const pRes1 = pb.alloc(32*12); - const pRes2 = pb.alloc(32*12); - const pRes3 = pb.alloc(32*12); - const pRes4 = pb.alloc(32*12); + const pRes1 = pb.alloc(32 * 12); + const pRes2 = pb.alloc(32 * 12); + const pRes3 = pb.alloc(32 * 12); + const pRes4 = pb.alloc(32 * 12); - const pG1s = pb.alloc(32*3); - const pG2s = pb.alloc(32*2*3); + const pG1s = pb.alloc(32 * 3); + const pG2s = pb.alloc(32 * 2 * 3); const pG1gen = pb.bn128.pG1gen; const pG2gen = pb.bn128.pG2gen; @@ -426,8 +432,8 @@ describe("Basic tests for g1 in bn128", () => { pb.g1m_timesScalar(pG1gen, ps, 32, pG1s); pb.g2m_timesScalar(pG2gen, ps, 32, pG2s); - const pPreP = pb.alloc(32*3); - const pPreQ = pb.alloc(32*2*3 + 32*2*3*103); + const pPreP = pb.alloc(32 * 3); + const pPreQ = pb.alloc(32 * 2 * 3 + 32 * 2 * 3 * 103); pb.bn128_prepareG1(pG1s, pPreP); pb.bn128_prepareG2(pG2gen, pPreQ); @@ -460,33 +466,33 @@ describe("Basic tests for g1 in bn128", () => { }); it("It should test multiexp", async () => { - const N=8; + const N = 8; const pG1 = pb.bn128.pG1gen; - const pExpected = pb.alloc(n8*3); - const pScalarExpected = pb.alloc(n8*N); - let acc=0; - for (let i=0; i { }); it("Should test compress and decompress in G1", async () => { - const N=10; + const N = 10; const pScalar = pb.alloc(n8); - const pP1 = pb.alloc(n8*3); - const pP1a = pb.alloc(n8*2); - const pP2a = pb.alloc(n8*2); + const pP1 = pb.alloc(n8 * 3); + const pP1a = pb.alloc(n8 * 2); + const pP2a = pb.alloc(n8 * 2); const pP1c = pb.alloc(n8); - const pP1u = pb.alloc(n8*2); + const pP1u = pb.alloc(n8 * 2); const pG1 = pb.bn128.pG1gen; - for (let i=0; i { }); it("Should test compress and decompress in G2", async () => { - const N=10; + const N = 10; const pScalar = pb.alloc(n8); - const pP1 = pb.alloc(n8*2*3); - const pP1a = pb.alloc(n8*2*2); - const pP2a = pb.alloc(n8*2*2); - const pP1c = pb.alloc(n8*2); - const pP1u = pb.alloc(n8*2*2); + const pP1 = pb.alloc(n8 * 2 * 3); + const pP1a = pb.alloc(n8 * 2 * 2); + const pP2a = pb.alloc(n8 * 2 * 2); + const pP1c = pb.alloc(n8 * 2); + const pP1u = pb.alloc(n8 * 2 * 2); const pG2 = pb.bn128.pG2gen; - for (let i=0; i { @@ -349,7 +348,7 @@ describe("Basic tests for Zq", () => { console.log(t); - }).timeout(10000000); + }); it("Should test to montgomery", async () => { const q = 21888242871839275222246405745257275088548364400416034343698204186575808495617n; const f1 = await buildF1(q); @@ -580,6 +579,44 @@ describe("Basic tests for Zq", () => { } }); + it("It Batch inverse with a zero in the batch", async () => { + // build_batchinverse.js has an explicit isZero-skip: a zero input + // element must not throw or corrupt the Montgomery-batch-trick running + // product for the OTHER elements in the same batch (their inverses + // must still come out correct); the zero's own output slot must come + // back as zero. This matters because the batch-affine multiexp path + // relies on batch inversion staying correct with an occasional zero + // (e.g. equal/inverse-point bucket collisions produce a zero z-delta). + const q = 21888242871839275222246405745257275088548364400416034343698204186575808495617n; + + const pbF1m = await buildProtoboard((module) => { + buildF1m(module, q); + }, 32); + + const N = 6; + const pIn = pbF1m.alloc(32 * N); + const pOut = pbF1m.alloc(32 * N); + + // [1, 2, 0, 4, 5, 0] (Montgomery form values via set + toMontgomery) + const values = [1n, 2n, 0n, 4n, 5n, 0n]; + for (let i = 0; i < N; i++) { + pbF1m.set(pIn + i * 32, values[i]); + pbF1m.f1m_toMontgomery(pIn + i * 32, pIn + i * 32); + } + + pbF1m.f1m_batchInverse(pIn, 32, N, pOut, 32); + + for (let i = 0; i < N; i++) { + if (values[i] === 0n) { + assert(pbF1m.f1m_isZero(pOut + i * 32), `expected zero output for zero input at index ${i}`); + } else { + const pProd = pbF1m.alloc(32); + pbF1m.f1m_mul(pIn + i * 32, pOut + i * 32, pProd); + assert(pbF1m.f1m_isOne(pProd), `expected in[${i}] * out[${i}] == 1`); + } + } + }); + it("It should sqrt right", async () => { const q = 21888242871839275222246405745257275088548364400416034343698204186575808495617n; const v= [ @@ -731,7 +768,7 @@ describe("Basic tests for Zq", () => { assert.equal(c1, c2); - }).timeout(10000000); + }); it("It should profile int", async () => { @@ -782,6 +819,6 @@ describe("Basic tests for Zq", () => { // // console.log("Mul Old Time (ms): " + time); - }).timeout(10000000); + }); }); diff --git a/test/f1_critical_numbers.js b/test/f1_critical_numbers.js new file mode 100644 index 0000000..7593ef7 --- /dev/null +++ b/test/f1_critical_numbers.js @@ -0,0 +1,139 @@ +import assert from "assert"; +import { bitLength } from "../src/bigint.js"; + +import buildF1m from "../src/build_f1m.js"; +import { buildProtoboard } from "wasmbuilder"; +import { describe, it } from "vitest"; + +// bn254 base field (q) and scalar field (r) -- same moduli used throughout +// the rest of the suite (test/bn128.js, test/f1.js). +const bn128q = 21888242871839275222246405745257275088696311157297823662689037894645226208583n; +const bn128r = 21888242871839275222246405745257275088548364400416034343698204186575808495617n; + +// Ported from ffiasm's test/fieldasm.js `getCriticalNumbers`: field-arithmetic +// bugs (missed carries, off-by-one borrows) cluster at 32/64-bit limb +// boundaries, not at "nice" small numbers. Build a set of field elements +// hugging those boundaries (0, 32, 64, the modulus's own bit length, +-2^31, +// +-2^32, +-2^63, +-2^64, q/2) with a small +-lim window around each, +// reduced mod q. This targets exactly the class of bug the CIOS Montgomery +// `noCarry` fast path (build_f1m.js buildMul/buildSquare, gated on +// `q < 2^(32*n32-1)`) could introduce: a wrong assumption about which limb +// a carry lands in only shows up right at those limb edges. +function getCriticalNumbers(q, lim) { + const numbers = new Set(); + + function addFrontier(f) { + for (let i = -lim; i <= lim; i++) { + let n = (f + BigInt(i)) % q; + if (n < 0n) n += q; + numbers.add(n); + } + } + + addFrontier(0n); + addFrontier(32n); + addFrontier(64n); + addFrontier(BigInt(bitLength(q))); + addFrontier(1n << 31n); + addFrontier(q - (1n << 31n)); + addFrontier(1n << 32n); + addFrontier(q - (1n << 32n)); + addFrontier(1n << 63n); + addFrontier(q - (1n << 63n)); + addFrontier(1n << 64n); + addFrontier(q - (1n << 64n)); + addFrontier(1n << BigInt(bitLength(q) - 1)); + addFrontier(q >> 1n); + + return Array.from(numbers); +} + +describe("f1m critical-number stress tests (limb-boundary carries)", () => { + + function generateTests(q, name) { + const nums = getCriticalNumbers(q, 2); + + it(`${name}: f1m_mul matches BigInt mulmod at limb boundaries`, async () => { + const pb = await buildProtoboard((module) => { + buildF1m(module, q); + }, 32); + + const pA = pb.alloc(); + const pB = pb.alloc(); + const pC = pb.alloc(); + + for (let i = 0; i < nums.length; i++) { + for (let j = 0; j < nums.length; j++) { + const a = nums[i]; + const b = nums[j]; + + pb.set(pA, a); + pb.set(pB, b); + pb.f1m_toMontgomery(pA, pA); + pb.f1m_toMontgomery(pB, pB); + pb.f1m_mul(pA, pB, pC); + pb.f1m_fromMontgomery(pC, pC); + + const c = pb.get(pC); + const expected = (a * b) % q; + + assert.equal( + c.toString(), expected.toString(), + `f1m_mul(${a}, ${b}) mod ${q} = ${c}, expected ${expected}` + ); + } + } + }); + + it(`${name}: f1m_square matches f1m_mul(x, x) at limb boundaries`, async () => { + const pb = await buildProtoboard((module) => { + buildF1m(module, q); + }, 32); + + const pA = pb.alloc(); + const pC1 = pb.alloc(); + const pC2 = pb.alloc(); + + for (let i = 0; i < nums.length; i++) { + const a = nums[i]; + + pb.set(pA, a); + pb.f1m_toMontgomery(pA, pA); + pb.f1m_square(pA, pC1); + pb.f1m_mul(pA, pA, pC2); + + const c1 = pb.get(pC1); + const c2 = pb.get(pC2); + + assert.equal( + c1.toString(), c2.toString(), + `f1m_square(${a}) = ${c1}, but f1m_mul(${a}, ${a}) = ${c2}` + ); + } + }); + + it(`${name}: toMontgomery/fromMontgomery round-trips at limb boundaries`, async () => { + const pb = await buildProtoboard((module) => { + buildF1m(module, q); + }, 32); + + const pA = pb.alloc(); + + for (let i = 0; i < nums.length; i++) { + const a = nums[i]; + + pb.set(pA, a); + pb.f1m_toMontgomery(pA, pA); + pb.f1m_fromMontgomery(pA, pA); + + const back = pb.get(pA); + assert.equal(back.toString(), a.toString()); + } + }); + } + + // q < 2^255 -> exercises the CIOS "no-carry" fast path (q < R/2) + generateTests(bn128q, "bn128 base field (q)"); + // r < 2^255 too -> same fast path, different modulus/constants + generateTests(bn128r, "bn128 scalar field (r)"); +}); diff --git a/test/fft.js b/test/fft.js index 0b87002..57cb2b0 100644 --- a/test/fft.js +++ b/test/fft.js @@ -1,12 +1,12 @@ -const assert = require("assert"); -const buildBn128 = require("../src/bn128/build_bn128.js"); -const buildProtoboard = require("wasmbuilder").buildProtoboard; +import buildBn128 from "../src/bn128/build_bn128.js"; +import { buildProtoboard } from "wasmbuilder"; +import { describe, assert, it, beforeAll } from "vitest"; + describe("FFT tests", function () { - this.timeout(100000); let pb; const n8=32; - before(async () => { + beforeAll(async () => { pb = await buildProtoboard((module) => { buildBn128(module); }, n8); diff --git a/test/helpers/helpers.js b/test/helpers/helpers.js index 0ce8810..2437745 100644 --- a/test/helpers/helpers.js +++ b/test/helpers/helpers.js @@ -20,4 +20,4 @@ function genValues(n, neg, bitsPerWord) { return res; } -module.exports.genValues = genValues; +export { genValues }; diff --git a/test/int.js b/test/int.js index 637f425..2e54a8f 100644 --- a/test/int.js +++ b/test/int.js @@ -1,16 +1,17 @@ -const assert = require("assert"); -const buildProtoboard = require("wasmbuilder").buildProtoboard; -const buildInt = require("../src/build_int.js"); -const buildTest2 = require("../src/build_test.js").buildTest2; +import { buildProtoboard } from "wasmbuilder"; +import buildInt from "../src/build_int.js"; +import { buildTest2 } from "../src/build_test.js"; +import { genValues } from "./helpers/helpers.js"; +import { describe, assert, it, beforeAll } from "vitest"; + -const helpers = require("./helpers/helpers.js"); describe("Basic tests for Int", () => { let pbInt; - before(async () => { + beforeAll(async () => { pbInt = await buildProtoboard((module) => { buildInt(module, 4); buildTest2(module, "int_mul"); @@ -23,10 +24,10 @@ describe("Basic tests for Int", () => { const pB = pbInt.alloc(); const pC = pbInt.alloc(64); - const values = helpers.genValues(8, false); + const values = genValues(8, false); - for (let i=0; i { const pA = pbInt.alloc(); const pC = pbInt.alloc(64); - const values = helpers.genValues(8, false); + const values = genValues(8, false); - for (let i=0; i { assert.equal(c, values[i] * values[i]); } - }).timeout(10000000); + }); it("It should profile int", async () => { @@ -96,6 +97,6 @@ describe("Basic tests for Int", () => { // console.log("Mul Old Time (ms): " + time); - }).timeout(10000000); + }); }); diff --git a/test/mnt6753.js b/test/mnt6753.js index 7249306..ea47ecb 100644 --- a/test/mnt6753.js +++ b/test/mnt6753.js @@ -1,15 +1,16 @@ -const assert = require("assert"); -const buildProtoboard = require("wasmbuilder").buildProtoboard; -const buildMNT6753 = require("../src/mnt6753/build_mnt6753.js"); -const buildPedersenHash = require("../src/build_pedersenhash.js"); -const baseTables = require("../build/pedersenparams_mnt6753.js"); +import { buildProtoboard } from "wasmbuilder"; +import buildMNT6753 from "../src/mnt6753/build_mnt6753.js"; +import buildPedersenHash from "../src/build_pedersenhash.js"; +import pedersenParams from "../build/pedersenparams_mnt6753.js"; +import { describe, assert, it, beforeAll } from "vitest"; + +// the generated params artifact is CJS exporting the decoded table Buffer +const baseTables = new Uint8Array(pedersenParams); describe("Basic tests for MNT6753", function () { let pb; - this.timeout(100000); - function getPointG1(pR) { return [ pb.get(pR), @@ -82,23 +83,23 @@ describe("Basic tests for MNT6753", function () { return "0x" + n.toString(16); } - //eslint-disable-next-line no-unused-vars + function printF1(s, p) { console.log(s, " " + ns(p)); } - //eslint-disable-next-line no-unused-vars + function printF3(s, p) { console.log(s + " Fq3(" + ns(p) + " + " + ns(p+96) +"*u + "+ ns(p+96*2)+ "*u^2 )" ); } - //eslint-disable-next-line no-unused-vars + function printF6(s, p) { console.log(s + " [Fq3(\n" + ns(p) + " +\n " + ns(p+96) +"*u +\n"+ ns(p+96*2)+ "*u^2)\n],[" ); console.log("Fq3(\n" + ns(p+96*3) + " +\n " + ns(p+96*4) +"*u +\n"+ ns(p+96*5)+ "*u^2)\n]" ); } - before(async () => { + beforeAll(async () => { pb = await buildProtoboard((module) => { buildMNT6753(module); buildPedersenHash(module, "g1m", "g1m", "f1m", 188, baseTables); @@ -118,7 +119,7 @@ describe("Basic tests for MNT6753", function () { const res = getPointG1(pR); assertEqualG1(g1gen, res); - }).timeout(100000000); + }); it("Should work mixed add", async() => { const pP1 = pb.alloc(96*3); @@ -176,7 +177,7 @@ describe("Basic tests for MNT6753", function () { const res2 = getPointG1(pR2); assertEqualG1(res1, res2); - }).timeout(100000000); + }); it("It should do timesScalar many times on G1", async () => { const pRes = pb.alloc(96*3); @@ -216,7 +217,7 @@ describe("Basic tests for MNT6753", function () { ]; assertEqualG1(res, zero); - }).timeout(100000000); + }); it("It should multiply generator by 0 and return generator in G2", async () => { @@ -232,7 +233,7 @@ describe("Basic tests for MNT6753", function () { const res = getPointG2(pR); assertEqualG2(g2gen, res); - }).timeout(100000000); + }); it("It should give same result doubling and adding G2", async () => { const pR1 = pb.alloc(96*3*3); @@ -257,7 +258,7 @@ describe("Basic tests for MNT6753", function () { const res2 = getPointG2(pR2); assertEqualG2(res1, res2); - }).timeout(100000000); + }); it("It should multiply by r and give 0 G2", async () => { @@ -293,7 +294,7 @@ describe("Basic tests for MNT6753", function () { ]; assertEqualG2(res, zero); - }).timeout(100000000); + }); it("Any number in F6 exp q^6 must be one ", async () => { const pn = pb.alloc(96*6); const pRes = pb.alloc(96*6); diff --git a/test/msm_batch.js b/test/msm_batch.js new file mode 100644 index 0000000..8a37b3a --- /dev/null +++ b/test/msm_batch.js @@ -0,0 +1,341 @@ +import assert from "assert"; +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; +import buildBn128 from "../src/bn128/build_bn128.js"; +import { buildProtoboard } from "wasmbuilder"; +import { describe, it, beforeAll } from "vitest"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +// The batch-affine MSM module (src/as/msm_batch.ts -> build/msm_batch.wasm) +// is never instantiated by anything in this repo's own test suite: it's +// AssemblyScript, curve-independent, and only ever gets linked at runtime by +// ffjavascript's threadman_thread.js, which shares memory and imports the +// field/group ops from the main curve module. That means a regression here +// (wrong bucket accumulation, wrong GLV/GLS decomposition, an off-by-one at +// N=0/N=1) is invisible to `npm test` in this repo -- it would only surface +// as a silently wrong multiexp result downstream in ffjavascript/snarkjs. +// +// This file reproduces that exact linking (mirrors threadman_thread.js's +// `mkBatch`) so the batch module's `multiexpAffine`/`multiexpAffineGLV`/ +// `multiexpAffineGLS` can be checked directly against the already-trusted +// `g1m_multiexpAffine`/`g2m_multiexpAffine` (used elsewhere in test/bn128.js) +// as ground truth. +describe("batch-affine MSM module (msm_batch.wasm)", () => { + + const n8 = 32; // Fr / bn254 base-field element size + + let pb, batchG1, batchG2; + + beforeAll(async () => { + pb = await buildProtoboard((module) => { + buildBn128(module); + }, 32); + + const batchCode = fs.readFileSync(path.join(__dirname, "..", "build", "msm_batch.wasm")); + const batchModule = await WebAssembly.compile(batchCode); + const ex = pb.instance.exports; + + batchG1 = (await WebAssembly.instantiate(batchModule, { + env: { memory: pb.memory }, + curve: { + f_mul: ex.f1m_mul, f_square: ex.f1m_square, f_add: ex.f1m_add, + f_sub: ex.f1m_sub, f_neg: ex.f1m_neg, f_inverse: ex.f1m_inverse, + f_isZero: ex.f1m_isZero, f_conj: ex.f1m_copy, // f_conj unused on G1; wire a harmless copy + g_add: ex.g1m_add, g_addMixed: ex.g1m_addMixed, + g_double: ex.g1m_double, g_zero: ex.g1m_zero, g_isZero: ex.g1m_isZero, + }, + })).exports; + + batchG2 = (await WebAssembly.instantiate(batchModule, { + env: { memory: pb.memory }, + curve: { + f_mul: ex.f2m_mul, f_square: ex.f2m_square, f_add: ex.f2m_add, + f_sub: ex.f2m_sub, f_neg: ex.f2m_neg, f_inverse: ex.f2m_inverse, + f_isZero: ex.f2m_isZero, f_conj: ex.f2m_conjugate, + g_add: ex.g2m_add, g_addMixed: ex.g2m_addMixed, + g_double: ex.g2m_double, g_zero: ex.g2m_zero, g_isZero: ex.g2m_isZero, + }, + })).exports; + }); + + // Build N affine G1 points (scalars i+1 times G) plus their scalars. + function setupG1(N, scalarOf) { + const pG1 = pb.bn128.pG1gen; + const pScalars = pb.alloc(n8 * N); + for (let i = 0; i < N; i++) pb.set(pScalars + i * n8, scalarOf ? scalarOf(i) : i + 1); + const pPoints = pb.alloc(n8 * 2 * N); + const pTmp = pb.alloc(n8 * 3); + for (let i = 0; i < N; i++) { + pb.g1m_timesScalarAffine(pG1, pScalars + n8 * i, n8, pTmp); + pb.g1m_toAffine(pTmp, pPoints + i * n8 * 2); + } + return { pPoints, pScalars }; + } + + function setupG2(N, scalarOf) { + const n8g2 = n8 * 2; + const pG2 = pb.bn128.pG2gen; + const pScalars = pb.alloc(n8 * N); + for (let i = 0; i < N; i++) pb.set(pScalars + i * n8, scalarOf ? scalarOf(i) : i + 1); + const pPoints = pb.alloc(n8g2 * 2 * N); + const pTmp = pb.alloc(n8g2 * 3); + for (let i = 0; i < N; i++) { + pb.g2m_timesScalarAffine(pG2, pScalars + n8 * i, n8, pTmp); + pb.g2m_toAffine(pTmp, pPoints + i * n8g2 * 2); + } + return { pPoints, pScalars }; + } + + it("G1 plain batch multiexpAffine matches the trusted g1m_multiexpAffine", async () => { + const N = 16; + const { pPoints, pScalars } = setupG1(N); + const pExpected = pb.alloc(n8 * 3); + pb.g1m_multiexpAffine(pPoints, pScalars, n8, N, pExpected); + const pGot = pb.alloc(n8 * 3); + batchG1.multiexpAffine(pPoints, pScalars, n8, N, pGot, n8); + assert(pb.g1m_eq(pExpected, pGot) === 1); + }); + + it("G1 GLV multiexpAffineGLV matches the trusted g1m_multiexpAffine", async () => { + const N = 16; + const { pPoints, pScalars } = setupG1(N); + const pExpected = pb.alloc(n8 * 3); + pb.g1m_multiexpAffine(pPoints, pScalars, n8, N, pExpected); + const pGot = pb.alloc(n8 * 3); + batchG1.multiexpAffineGLV(pPoints, pScalars, n8, N, pGot, n8); + assert(pb.g1m_eq(pExpected, pGot) === 1); + }); + + it("G2 plain batch multiexpAffine matches the trusted g2m_multiexpAffine", async () => { + const N = 16; + const { pPoints, pScalars } = setupG2(N); + const pExpected = pb.alloc(n8 * 2 * 3); + pb.g2m_multiexpAffine(pPoints, pScalars, n8, N, pExpected); + const pGot = pb.alloc(n8 * 2 * 3); + batchG2.multiexpAffine(pPoints, pScalars, n8, N, pGot, n8 * 2); + assert(pb.g2m_eq(pExpected, pGot) === 1); + }); + + it("G2 GLS multiexpAffineGLS matches the trusted g2m_multiexpAffine", async () => { + const N = 16; + const { pPoints, pScalars } = setupG2(N); + const pExpected = pb.alloc(n8 * 2 * 3); + pb.g2m_multiexpAffine(pPoints, pScalars, n8, N, pExpected); + const pGot = pb.alloc(n8 * 2 * 3); + batchG2.multiexpAffineGLS(pPoints, pScalars, n8, N, pGot, n8 * 2); + assert(pb.g2m_eq(pExpected, pGot) === 1); + }); + + it("N=0 returns the group identity for plain batch, GLV, and GLS", async () => { + const { pPoints, pScalars } = setupG1(1); // buffers exist but n=0 is passed + const pGot = pb.alloc(n8 * 3); + batchG1.multiexpAffine(pPoints, pScalars, n8, 0, pGot, n8); + assert(pb.g1m_isZero(pGot) === 1); + + const pGotGlv = pb.alloc(n8 * 3); + batchG1.multiexpAffineGLV(pPoints, pScalars, n8, 0, pGotGlv, n8); + assert(pb.g1m_isZero(pGotGlv) === 1); + + const g2setup = setupG2(1); + const pGotG2 = pb.alloc(n8 * 2 * 3); + batchG2.multiexpAffineGLS(g2setup.pPoints, g2setup.pScalars, n8, 0, pGotG2, n8 * 2); + assert(pb.g2m_isZero(pGotG2) === 1); + }); + + it("N=1 agrees with the trusted reference for plain batch, GLV, and GLS", async () => { + const g1 = setupG1(1); + const pExpected1 = pb.alloc(n8 * 3); + pb.g1m_multiexpAffine(g1.pPoints, g1.pScalars, n8, 1, pExpected1); + const pGot1 = pb.alloc(n8 * 3); + batchG1.multiexpAffine(g1.pPoints, g1.pScalars, n8, 1, pGot1, n8); + assert(pb.g1m_eq(pExpected1, pGot1) === 1); + const pGot1Glv = pb.alloc(n8 * 3); + batchG1.multiexpAffineGLV(g1.pPoints, g1.pScalars, n8, 1, pGot1Glv, n8); + assert(pb.g1m_eq(pExpected1, pGot1Glv) === 1); + + const g2 = setupG2(1); + const pExpectedG2 = pb.alloc(n8 * 2 * 3); + pb.g2m_multiexpAffine(g2.pPoints, g2.pScalars, n8, 1, pExpectedG2); + const pGotG2 = pb.alloc(n8 * 2 * 3); + batchG2.multiexpAffineGLS(g2.pPoints, g2.pScalars, n8, 1, pGotG2, n8 * 2); + assert(pb.g2m_eq(pExpectedG2, pGotG2) === 1); + }); + + it("all-zero scalars agree with the trusted reference (plain, GLV, GLS)", async () => { + const N = 8; + const g1 = setupG1(N, () => 0); + const pExpected = pb.alloc(n8 * 3); + pb.g1m_multiexpAffine(g1.pPoints, g1.pScalars, n8, N, pExpected); + const pGot = pb.alloc(n8 * 3); + batchG1.multiexpAffine(g1.pPoints, g1.pScalars, n8, N, pGot, n8); + assert(pb.g1m_eq(pExpected, pGot) === 1); + const pGotGlv = pb.alloc(n8 * 3); + batchG1.multiexpAffineGLV(g1.pPoints, g1.pScalars, n8, N, pGotGlv, n8); + assert(pb.g1m_eq(pExpected, pGotGlv) === 1); + + const g2 = setupG2(N, () => 0); + const pExpectedG2 = pb.alloc(n8 * 2 * 3); + pb.g2m_multiexpAffine(g2.pPoints, g2.pScalars, n8, N, pExpectedG2); + const pGotG2 = pb.alloc(n8 * 2 * 3); + batchG2.multiexpAffineGLS(g2.pPoints, g2.pScalars, n8, N, pGotG2, n8 * 2); + assert(pb.g2m_eq(pExpectedG2, pGotG2) === 1); + }); + + it("duplicate base points agree with the trusted reference (plain, GLV, GLS)", async () => { + const N = 8; + const g1 = setupG1(1); // one real point + const pPoints = pb.alloc(n8 * 2 * N); + for (let i = 0; i < N; i++) pb.i8.copyWithin(pPoints + i * n8 * 2, g1.pPoints, g1.pPoints + n8 * 2); + const pScalars = pb.alloc(n8 * N); + for (let i = 0; i < N; i++) pb.set(pScalars + i * n8, i + 1); + + const pExpected = pb.alloc(n8 * 3); + pb.g1m_multiexpAffine(pPoints, pScalars, n8, N, pExpected); + const pGot = pb.alloc(n8 * 3); + batchG1.multiexpAffine(pPoints, pScalars, n8, N, pGot, n8); + assert(pb.g1m_eq(pExpected, pGot) === 1); + const pGotGlv = pb.alloc(n8 * 3); + batchG1.multiexpAffineGLV(pPoints, pScalars, n8, N, pGotGlv, n8); + assert(pb.g1m_eq(pExpected, pGotGlv) === 1); + }); + + it("a zero/infinity base point among the bases agrees with the trusted reference", async () => { + const N = 4; + const g1 = setupG1(N); + // Overwrite base 0 with the affine encoding of infinity (0,0). + pb.i8.fill(0, g1.pPoints, g1.pPoints + n8 * 2); + + const pExpected = pb.alloc(n8 * 3); + pb.g1m_multiexpAffine(g1.pPoints, g1.pScalars, n8, N, pExpected); + const pGot = pb.alloc(n8 * 3); + batchG1.multiexpAffine(g1.pPoints, g1.pScalars, n8, N, pGot, n8); + assert(pb.g1m_eq(pExpected, pGot) === 1); + const pGotGlv = pb.alloc(n8 * 3); + batchG1.multiexpAffineGLV(g1.pPoints, g1.pScalars, n8, N, pGotGlv, n8); + assert(pb.g1m_eq(pExpected, pGotGlv) === 1); + }); + + // Scalar-size partitioning (ported from rapidsnark/ffiasm): scalars are + // classified zero/one/small/big before the bucket method. These + // distributions force every class and the mixed gather path; agreement + // with the trusted non-partitioned reference is the correctness bar. + const r = 21888242871839275222246405745257275088548364400416034343698204186575808495617n; + const partitionDistributions = [ + ["all ones", () => 1n], + ["binary witness (2/3 zero, 1/3 one)", (i) => (i % 3 === 0 ? 1n : 0n)], + ["all small (<= 64 bit)", (i) => BigInt(i) * 0xFFFFFFFFn + 3n], + ["mixed zero/one/small/big", (i) => { + const m = i % 4; + if (m === 0) return 0n; + if (m === 1) return 1n; + if (m === 2) return BigInt(i) + 2n; + return r - 1n - BigInt(i); + }], + ["boundary scalars", (i) => [0n, 1n, 2n, (1n << 64n) - 1n, 1n << 64n, (1n << 64n) + 1n, r - 1n, r >> 1n][i % 8]], + ]; + + for (const [label, scalarOf] of partitionDistributions) { + it(`G1 partitioned MSM agrees with trusted reference (${label})`, async () => { + const N = 64; + const { pPoints, pScalars } = setupG1(N); // points = (i+1)*G + for (let i = 0; i < N; i++) pb.set(pScalars + i * n8, scalarOf(i)); + const pExpected = pb.alloc(n8 * 3); + pb.g1m_multiexpAffine(pPoints, pScalars, n8, N, pExpected); + + const pGot = pb.alloc(n8 * 3); + batchG1.multiexpAffine(pPoints, pScalars, n8, N, pGot, n8); + assert(pb.g1m_eq(pExpected, pGot) === 1, `plain disagrees for ${label}`); + + const pGotGlv = pb.alloc(n8 * 3); + batchG1.multiexpAffineGLV(pPoints, pScalars, n8, N, pGotGlv, n8); + assert(pb.g1m_eq(pExpected, pGotGlv) === 1, `GLV disagrees for ${label}`); + }); + + it(`G2 partitioned MSM agrees with trusted reference (${label})`, async () => { + const N = 32; + const { pPoints, pScalars } = setupG2(N); // points = (i+1)*G2 + for (let i = 0; i < N; i++) pb.set(pScalars + i * n8, scalarOf(i)); + const pExpected = pb.alloc(n8 * 2 * 3); + pb.g2m_multiexpAffine(pPoints, pScalars, n8, N, pExpected); + + const pGot = pb.alloc(n8 * 2 * 3); + batchG2.multiexpAffine(pPoints, pScalars, n8, N, pGot, n8 * 2); + assert(pb.g2m_eq(pExpected, pGot) === 1, `plain disagrees for ${label}`); + + const pGotGls = pb.alloc(n8 * 2 * 3); + batchG2.multiexpAffineGLS(pPoints, pScalars, n8, N, pGotGls, n8 * 2); + assert(pb.g2m_eq(pExpected, pGotGls) === 1, `GLS disagrees for ${label}`); + }); + } + + it("partitioned MSM handles an infinity base point inside every class", async () => { + // point i=0 zeroed (infinity); scalars chosen so infinity lands in the + // one/small/big classes across three runs. + for (const s of [1n, 12345n, (1n << 100n) + 7n]) { + const N = 8; + const g1 = setupG1(N); + pb.i8.fill(0, g1.pPoints, g1.pPoints + n8 * 2); // base 0 -> infinity + pb.set(g1.pScalars, s); // class depends on s + + const pExpected = pb.alloc(n8 * 3); + pb.g1m_multiexpAffine(g1.pPoints, g1.pScalars, n8, N, pExpected); + const pGot = pb.alloc(n8 * 3); + batchG1.multiexpAffine(g1.pPoints, g1.pScalars, n8, N, pGot, n8); + assert(pb.g1m_eq(pExpected, pGot) === 1, `infinity in class of scalar ${s}`); + } + }); + + // glvDecomposeTest/glsDecomposeTest are exported specifically for this: + // verify k == k1 + k2*lambda (mod r) [GLV] / the 4-term GLS identity, by + // reconstructing k from the decomposed (signed) sub-scalars via scalar + // multiplication and checking k*P == k1*P + k2*phi(P) for edge scalars. + function glvCheck(k) { + const pK = pb.alloc(n8); + pb.set(pK, k); + const pOut = pb.alloc(32); // |k1| (16B) then |k2| (16B) + const sg = batchG1.glvDecomposeTest(pK, pOut, n8); + const k1 = pb.get(pOut, 1, 16) * (sg & 1 ? -1n : 1n); + const k2 = pb.get(pOut + 16, 1, 16) * ((sg >> 1) & 1 ? -1n : 1n); + // lambda is bn254's cube-root-of-unity scalar-field endomorphism + // eigenvalue; we don't hardcode it here -- instead check k1 + k2*phi(P) + // == k*P directly using the curve's own timesScalar, which is + // independent of msm_batch.ts's internal representation. + return { k1, k2 }; + } + + it("GLV decomposition round-trips: k1*P + k2*phi(P) == k*P for edge scalars", async () => { + // bn254 scalar field order r + const r = 21888242871839275222246405745257275088548364400416034343698204186575808495617n; + const edgeScalars = [0n, 1n, 2n, r - 1n, r >> 1n, (r >> 1n) + 1n]; + + const pG1 = pb.bn128.pG1gen; + for (const k of edgeScalars) { + const { k1, k2 } = glvCheck(k); + + // Reconstruct k*P via the trusted (non-endomorphism) path. + const pK = pb.alloc(n8); + pb.set(pK, k); + const pExpected = pb.alloc(n8 * 3); + pb.g1m_timesScalar(pG1, pK, n8, pExpected); + + // Reconstruct k1*P + k2*phi(P) using multiexpAffineGLV on a + // single-point batch built from k directly (exercises the exact + // same decomposition inside the real entry point, not just the + // test hook) -- if decomposition were wrong, this would diverge + // from pExpected for these edge scalars. + const pTmp = pb.alloc(n8 * 3); + pb.g1m_timesScalarAffine(pG1, pK, n8, pTmp); + const pPointAffine = pb.alloc(n8 * 2); + pb.g1m_toAffine(pG1, pPointAffine); // base = G itself (affine) + const pGot = pb.alloc(n8 * 3); + batchG1.multiexpAffineGLV(pPointAffine, pK, n8, 1, pGot, n8); + + assert( + pb.g1m_eq(pExpected, pGot) === 1, + `GLV path disagrees with trusted timesScalar for k=${k} (k1=${k1}, k2=${k2})` + ); + } + }); +}); diff --git a/test/tomcook.js b/test/tomcook.js index 645f080..9200367 100644 --- a/test/tomcook.js +++ b/test/tomcook.js @@ -1,11 +1,9 @@ -const assert = require("assert"); - -const buildProtoboard = require("wasmbuilder").buildProtoboard; -const buildTomCook = require("../src/build_tomcook.js"); -const buildInt = require("../src/build_int.js"); -const buildTest2 = require("../src/build_test.js").buildTest2; - -const helpers = require("./helpers/helpers.js"); +import { buildProtoboard } from "wasmbuilder"; +import buildTomCook from "../src/build_tomcook.js"; +import buildInt from "../src/build_int.js"; +import { buildTest2 } from "../src/build_test.js"; +import { genValues } from "./helpers/helpers.js"; +import { describe, assert, it, beforeAll } from "vitest"; @@ -13,7 +11,7 @@ describe("Basic tests for Tom Cook Multiplication Strategy", () => { let pbTC; let pbInt; - before(async () => { + beforeAll(async () => { pbTC = await buildProtoboard((module) => { buildTomCook(module); buildTest2(module, "tomcook_mul9"); @@ -26,11 +24,11 @@ describe("Basic tests for Tom Cook Multiplication Strategy", () => { it("It should divide by 3 (6)", async () => { let c; - const pA = pbTC.alloc(6*4); + const pA = pbTC.alloc(6 * 4); - const values = helpers.genValues(6, true, 29); + const values = genValues(6, true, 29); - for (let i=0; i { it("It should doubling (6)", async () => { let c; - const pA = pbTC.alloc(6*4); + const pA = pbTC.alloc(6 * 4); - const values = helpers.genValues(6, true, 29); + const values = genValues(6, true, 29); - for (let i=0; i { it("It should halving (6)", async () => { let c; - const pA = pbTC.alloc(6*4); + const pA = pbTC.alloc(6 * 4); - const values = helpers.genValues(6, true, 29); + const values = genValues(6, true, 29); - for (let i=0; i { const pB = pbTC.alloc(); const pC = pbTC.alloc(24); - const values = helpers.genValues(3, true, 29); + const values = genValues(3, true, 29); - for (let i=0; i { }); it("It should do a basic multiplication 9", async () => { let c; - const pA = pbTC.alloc(9*4); - const pB = pbTC.alloc(9*4); - const pC = pbTC.alloc(9*4*2); + const pA = pbTC.alloc(9 * 4); + const pB = pbTC.alloc(9 * 4); + const pC = pbTC.alloc(9 * 4 * 2); const A = 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn; const B = 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn; - pbTC.set(pA, A, 9*4); - pbTC.set(pB, B, 9*4); + pbTC.set(pA, A, 9 * 4); + pbTC.set(pB, B, 9 * 4); console.log(A.toString(16)); console.log(B.toString(16)); @@ -118,16 +116,16 @@ describe("Basic tests for Tom Cook Multiplication Strategy", () => { it("It should do a basic multiplication Multi values (9)", async () => { let c; - const pA = pbTC.alloc(9*4); - const pB = pbTC.alloc(9*4); - const pC = pbTC.alloc(9*4*2); + const pA = pbTC.alloc(9 * 4); + const pB = pbTC.alloc(9 * 4); + const pC = pbTC.alloc(9 * 4 * 2); - const values = helpers.genValues(9, false, 29); + const values = genValues(9, false, 29); - for (let i=0; i { console.log("Refere: " + (A * B).toString(16)); console.log("Tom School (ms): " + time); - }).timeout(10000000); + }); it("It should profile tomCook", async () => { let start, end, time; const A = (1n << 254n) - 1n; @@ -171,9 +169,9 @@ describe("Basic tests for Tom Cook Multiplication Strategy", () => { console.log(A.toString(16)); - const pA = pbTC.set(pbTC.alloc(9*4), A, 9*4); - const pB = pbTC.set(pbTC.alloc(9*4), B, 9*4); - const pC = pbTC.alloc(9*4*2); + const pA = pbTC.set(pbTC.alloc(9 * 4), A, 9 * 4); + const pB = pbTC.set(pbTC.alloc(9 * 4), B, 9 * 4); + const pC = pbTC.alloc(9 * 4 * 2); // start = new Date().getTime(); // pbTC.test_tomcook_mul1(pA, pB, pC, 100000000); @@ -186,11 +184,11 @@ describe("Basic tests for Tom Cook Multiplication Strategy", () => { end = new Date().getTime(); time = end - start; - const c = pbTC.get(pC, 1, 9*4*2); + const c = pbTC.get(pC, 1, 9 * 4 * 2); console.log("Result: " + c.toString(16)); console.log("Refere: " + (A * B).toString(16)); console.log("Mul9 Tom Cook Time (ms): " + time); - }).timeout(10000000); + }); }); diff --git a/test/units.test.js b/test/units.test.js new file mode 100644 index 0000000..7cd0602 --- /dev/null +++ b/test/units.test.js @@ -0,0 +1,181 @@ +import { bitLength, isOdd, isNegative, abs, isUnit, compare, modInv, modPow, isPrime, square } from "../src/bigint.js"; +import { bigInt2BytesLE, bigInt2U32LE, isOcamNum } from "../src/utils.js"; +import { describe, assert, it } from "vitest"; + +describe("bigint.js helpers", () => { + it("bitLength / isOdd / isNegative / abs / isUnit / compare / square", () => { + // quirk: bitLength(0) is 1 ("0".length) -- callers only pass + // nonzero field/curve parameters + assert.equal(bitLength(0n), 1); + assert.equal(bitLength(1n), 1); + assert.equal(bitLength(255n), 8); + assert.equal(bitLength(256n), 9); + + assert.isTrue(isOdd(3n)); + assert.isFalse(isOdd(4n)); + + assert.isTrue(isNegative(-1n)); + assert.isFalse(isNegative(0n)); + assert.isFalse(isNegative(1n)); + + assert.equal(abs(-5n), 5n); + assert.equal(abs(5n), 5n); + + assert.isTrue(isUnit(1n)); + assert.isFalse(isUnit(2n)); + + assert.isTrue(compare(2n, 1n) > 0); + assert.isTrue(compare(1n, 2n) < 0); + assert.equal(compare(2n, 2n), 0); + + assert.equal(square(9n), 81n); + }); + + it("modInv and modPow agree with Fermat inversion", () => { + const p = 101n; + for (const a of [1n, 2n, 7n, 55n, 100n]) { + const inv = modInv(a, p); + assert.equal((inv * a) % p, 1n, `inv(${a})`); + assert.equal(modPow(a, p - 2n, p), inv, `fermat(${a})`); + } + assert.equal(modPow(3n, 0n, 7n), 1n); + }); + + it("isPrime classifies small and cryptographic primes", () => { + // regression: isKnownPrime used to return false (not undefined) for + // values outside its hardcoded list, so isPrime never reached + // Miller-Rabin and every custom prime was reported composite -- + // which made build_f1m skip generating _sqrt/_isSquare + assert.isTrue(isPrime(2n)); + assert.isTrue(isPrime(101n)); + assert.isTrue(isPrime(65537n)); + assert.isTrue(isPrime(0xffffffff00000001n)); // goldilocks + assert.isFalse(isPrime(100n)); + assert.isFalse(isPrime(1n)); + assert.isFalse(isPrime(65537n * 101n)); + // bn254 r + assert.isTrue(isPrime(21888242871839275222246405745257275088548364400416034343698204186575808495617n)); + assert.isFalse(isPrime(21888242871839275222246405745257275088548364400416034343698204186575808495615n)); + }); +}); + +describe("utils.js codegen helpers", () => { + it("bigInt2BytesLE and bigInt2U32LE produce little-endian layouts", () => { + assert.deepEqual(bigInt2BytesLE(0x0102030405n, 8), [5, 4, 3, 2, 1, 0, 0, 0]); + assert.deepEqual(bigInt2U32LE(0x01000000020000000300000004n, 4), [4, 3, 2, 1]); + }); + + it("isOcamNum recognizes only the legacy [flag, size, limbs] shape", () => { + assert.isTrue(isOcamNum([1, 2, [1, 2]])); + assert.isFalse(isOcamNum([1, 2])); + assert.isFalse(isOcamNum([1, "2", [1]])); + assert.isFalse(isOcamNum([1, 2, 3])); + assert.isFalse(isOcamNum("nope")); + }); +}); + +describe("build_f1m over a custom prime", () => { + it("generates and exports _sqrt/_isSquare (regression: skipped for unlisted primes)", async () => { + const { buildProtoboard } = await import("wasmbuilder"); + const { default: buildF1m } = await import("../src/build_f1m.js"); + const q = 0xffffffff00000001n; // goldilocks, not in the known-prime list + const pb = await buildProtoboard((module) => { + buildF1m(module, q, "f1m"); + }, 8); + + assert.isFunction(pb.f1m_sqrt, "sqrt export exists"); + assert.isFunction(pb.f1m_isSquare, "isSquare export exists"); + + const pA = pb.alloc(8); + const pS = pb.alloc(8); + pb.set(pA, 9n, 8); + pb.f1m_toMontgomery(pA, pA); + assert.equal(pb.f1m_isSquare(pA), 1); + pb.f1m_sqrt(pA, pS); + // s^2 == 9 (in montgomery form) + pb.f1m_square(pS, pS); + pb.f1m_fromMontgomery(pS, pS); + assert.equal(pb.get(pS, 1, 8), 9n); + }); +}); + +describe("branch mop-up", () => { + it("bigint edge values", async () => { + const { isPrime, modInv, compare, bitLength, abs, modPow, isOdd } = await import("../src/bigint.js"); + // isBasicPrime sieve arms + assert.isTrue(isPrime(3n)); + assert.isTrue(isPrime(5n)); + assert.isFalse(isPrime(9n)); // divisible by 3 + assert.isFalse(isPrime(25n)); // divisible by 5 + assert.isTrue(isPrime(47n)); // < 49 fast-true path + assert.isTrue(isPrime(-7n)); // negative prime via abs + assert.isFalse(isPrime(-9n)); + // 64-bit boundary uses the fixed Miller-Rabin base set + assert.isTrue(isPrime(18446744073709551557n)); // largest 64-bit prime + // modInv with a negative value normalizes first + const inv = modInv(-3n, 101n); + assert.equal(((inv * -3n) % 101n + 101n) % 101n, 1n); + assert.equal(compare(-2n, 3n), -1); + assert.equal(compare(3n, -2n), 1); + assert.equal(bitLength(-255n), 8); + assert.equal(abs(0n), 0n); + assert.equal(modPow(5n, 1n, 3n), 2n); + assert.isTrue(isOdd(-3n)); + }); + + it("builders are idempotent: rebuilding an existing prefix returns early", async () => { + const { buildProtoboard } = await import("wasmbuilder"); + const { default: buildBn128 } = await import("../src/bn128/build_bn128.js"); + const { default: buildBls12381 } = await import("../src/bls12381/build_bls12381.js"); + const { default: buildMNT6753 } = await import("../src/mnt6753/build_mnt6753.js"); + const { default: buildF2m } = await import("../src/build_f2m.js"); + const { default: buildF3m } = await import("../src/build_f3m.js"); + const { default: buildCurveJacobianA0 } = await import("../src/build_curve_jacobian_a0.js"); + const { default: buildCurveProjective } = await import("../src/build_curve_projective.js"); + + const pbBn = await buildProtoboard((module) => { + buildBn128(module); + assert.equal(buildBn128(module), "bn128"); // guard + assert.equal(buildF2m(module, "f1m_neg", "f2m", "f1m"), "f2m"); // registered by bn128 + assert.equal(buildCurveJacobianA0(module, "g1m", "f1m", 0), "g1m"); // registered by bn128 + }, 32); + assert.isFunction(pbBn.g1m_add); + + const pbBls = await buildProtoboard((module) => { + buildBls12381(module); + assert.equal(buildBls12381(module), "bls12381"); // guard + }, 48); + assert.isFunction(pbBls.g1m_add); + + const pbMnt = await buildProtoboard((module) => { + buildMNT6753(module, "mnt6753"); + assert.equal(buildMNT6753(module, "mnt6753"), "mnt6753"); // guard + assert.equal(buildF3m(module, "f1m_neg", "f3m", "f1m"), "f3m"); // registered by mnt6753 + assert.equal(buildCurveProjective(module, "g1m", "f1m", 0), "g1m"); // registered by mnt6753 + }, 96); + assert.isFunction(pbMnt.g1m_add); + }); + + it("f1m over a 5-limb prime exercises alternative tom-cook splits", async () => { + const { buildProtoboard } = await import("wasmbuilder"); + const { default: buildF1m } = await import("../src/build_f1m.js"); + const { isPrime } = await import("../src/bigint.js"); + + // deterministically find the first 320-bit prime >= 2^319 + 9 + let q = (1n << 319n) + 9n; + while (!isPrime(q)) q += 2n; + + const pb = await buildProtoboard((module) => { + buildF1m(module, q, "f5"); + }, 40); + + const pA = pb.alloc(40), pB = pb.alloc(40), pC = pb.alloc(40); + const a = 0x123456789abcdef0fedcba9876543210n; + const b = 0xdeadbeefcafebabe1234567890abcdefn; + pb.set(pA, a, 40); pb.f5_toMontgomery(pA, pA); + pb.set(pB, b, 40); pb.f5_toMontgomery(pB, pB); + pb.f5_mul(pA, pB, pC); + pb.f5_fromMontgomery(pC, pC); + assert.equal(pb.get(pC, 1, 40), (a * b) % q); + }); +}); diff --git a/tools/buildpedersentablebases_mnt6753.js b/tools/buildpedersentablebases_mnt6753.js index 1ae390c..4b63d34 100644 --- a/tools/buildpedersentablebases_mnt6753.js +++ b/tools/buildpedersentablebases_mnt6753.js @@ -1,9 +1,10 @@ - -const buildProtoboard = require("wasmbuilder").buildProtoboard; -const buildMNT6753 = require("../src/mnt6753/build_mnt6753.js"); -const bigInt = require("big-integer"); -const fs = require("fs"); -const path = require("path"); +import { buildProtoboard } from "wasmbuilder"; +import buildMNT6753 from "../src/mnt6753/build_mnt6753.js"; +import bigInt from "big-integer"; +import { writeFileSync } from "fs"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; +const __dirname = dirname(fileURLToPath(import.meta.url)); var pedersenParameters = [ ["2071893303198007985737678972190309212568452221625132024511988170095494148670997278812694070338313361389889122280160253462982652030041813566301365289695187505618174204273471887226695702458395861269694368663558765191107385382142", "17187187414417664367585796530257262302159176591062800465884265459977066325098901507827719965058588341044788483232395252403515861767227243983849894797683644816538861625368393588001624014759720661490214325432345769098675755344007"], @@ -55,12 +56,10 @@ buildProtoboard((module) => { res.push(...pb.i8.slice(p4, p4+96*2)); } - fs.writeFileSync( - path.join( __dirname, "..", "build", "pedersenparams_mnt6753.js"), -` -// Code generated automatically by tools/buildpedersentablebases_mnt6753.js -module.exports = Buffer.from("${Buffer.from(res).toString("base64")}", "base64");; -` + writeFileSync( + join( __dirname, "..", "build", "pedersenparams_mnt6753.js"), +`// Code generated automatically by tools/buildpedersentablebases_mnt6753.js + export const code ="${Buffer.from(res).toString("base64")}";` ); }); diff --git a/tools/buildwasm_bls12381.js b/tools/buildwasm_bls12381.js index 77513d6..419ae17 100644 --- a/tools/buildwasm_bls12381.js +++ b/tools/buildwasm_bls12381.js @@ -1,7 +1,9 @@ -const ModuleBuilder = require("wasmbuilder").ModuleBuilder; -const buildBls12381 = require("../src/bls12381/build_bls12381.js"); -const fs = require("fs"); -const path = require("path"); +import { ModuleBuilder } from "wasmbuilder"; +import buildBls12381 from "../src/bls12381/build_bls12381.js"; +import { writeFileSync } from "fs"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; +const __dirname = dirname(fileURLToPath(import.meta.url)); function buildWasm() { const moduleBuilder = new ModuleBuilder(); @@ -10,30 +12,29 @@ function buildWasm() { const code = moduleBuilder.build(); - fs.writeFileSync( - path.join( __dirname, "..", "build", "bls12381_wasm.js"), - ` - exports.code = "${Buffer.from(code).toString("base64")}"; - exports.pq = ${moduleBuilder.modules.f1m.pq}; - exports.pr = ${moduleBuilder.modules.frm.pq}; - exports.pG1gen = ${moduleBuilder.modules.bls12381.pG1gen}; - exports.pG1zero = ${moduleBuilder.modules.bls12381.pG1zero}; - exports.pG1b = ${moduleBuilder.modules.bls12381.pG1b}; - exports.pG2gen = ${moduleBuilder.modules.bls12381.pG2gen}; - exports.pG2zero = ${moduleBuilder.modules.bls12381.pG2zero}; - exports.pG2b = ${moduleBuilder.modules.bls12381.pG2b}; - exports.pOneT = ${moduleBuilder.modules.bls12381.pOneT}; - exports.prePSize = ${moduleBuilder.modules.bls12381.prePSize}; - exports.preQSize = ${moduleBuilder.modules.bls12381.preQSize}; - exports.n8q = 48; - exports.n8r = 32; - exports.q = "${moduleBuilder.modules.bls12381.q}"; - exports.r = "${moduleBuilder.modules.bls12381.r}"; - ` + writeFileSync( + join( __dirname, "..", "build", "bls12381_wasm.js"), + `export const code = "${Buffer.from(code).toString("base64")}"; +export const pq = ${moduleBuilder.modules.f1m.pq}; +export const pr = ${moduleBuilder.modules.frm.pq}; +export const pG1gen = ${moduleBuilder.modules.bls12381.pG1gen}; +export const pG1zero = ${moduleBuilder.modules.bls12381.pG1zero}; +export const pG1b = ${moduleBuilder.modules.bls12381.pG1b}; +export const pG2gen = ${moduleBuilder.modules.bls12381.pG2gen}; +export const pG2zero = ${moduleBuilder.modules.bls12381.pG2zero}; +export const pG2b = ${moduleBuilder.modules.bls12381.pG2b}; +export const pOneT = ${moduleBuilder.modules.bls12381.pOneT}; +export const prePSize = ${moduleBuilder.modules.bls12381.prePSize}; +export const preQSize = ${moduleBuilder.modules.bls12381.preQSize}; +export const n8q = 48; +export const n8r = 32; +export const q = "${moduleBuilder.modules.bls12381.q}"; +export const r = "${moduleBuilder.modules.bls12381.r}"; +` ); - fs.writeFileSync( - path.join( __dirname, "..", "build", "bls12381.wasm"), + writeFileSync( + join( __dirname, "..", "build", "bls12381.wasm"), Buffer.from(code) ); } diff --git a/tools/buildwasm_bn128.js b/tools/buildwasm_bn128.js index 1a00069..2889b94 100644 --- a/tools/buildwasm_bn128.js +++ b/tools/buildwasm_bn128.js @@ -1,39 +1,71 @@ -const ModuleBuilder = require("wasmbuilder").ModuleBuilder; -const buildBn128 = require("../src/bn128/build_bn128.js"); -const fs = require("fs"); -const path = require("path"); +import { ModuleBuilder } from "wasmbuilder"; +import buildBn128 from "../src/bn128/build_bn128.js"; +import { writeFileSync } from "fs"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; +const __dirname = dirname(fileURLToPath(import.meta.url)); -function buildWasm() { +async function buildWasm() { const moduleBuilder = new ModuleBuilder(); moduleBuilder.setMemory(25); buildBn128(moduleBuilder); const code = moduleBuilder.build(); - fs.writeFileSync( - path.join( __dirname, "..", "build", "bn128_wasm.js"), - ` - exports.code = "${Buffer.from(code).toString("base64")}"; - exports.pq = ${moduleBuilder.modules.f1m.pq}; - exports.pr = ${moduleBuilder.modules.frm.pq}; - exports.pG1gen = ${moduleBuilder.modules.bn128.pG1gen}; - exports.pG1zero = ${moduleBuilder.modules.bn128.pG1zero}; - exports.pG1b = ${moduleBuilder.modules.bn128.pG1b}; - exports.pG2gen = ${moduleBuilder.modules.bn128.pG2gen}; - exports.pG2zero = ${moduleBuilder.modules.bn128.pG2zero}; - exports.pG2b = ${moduleBuilder.modules.bn128.pG2b}; - exports.pOneT = ${moduleBuilder.modules.bn128.pOneT}; - exports.prePSize = ${moduleBuilder.modules.bn128.prePSize}; - exports.preQSize = ${moduleBuilder.modules.bn128.preQSize}; - exports.n8q = 32; - exports.n8r = 32; - exports.q = "${moduleBuilder.modules.bn128.q}"; - exports.r = "${moduleBuilder.modules.bn128.r}"; - ` + writeFileSync( + join( __dirname, "..", "build", "bn128_wasm.js"), + `export const code = "${Buffer.from(code).toString("base64")}"; +export const pq = ${moduleBuilder.modules.f1m.pq}; +export const pr = ${moduleBuilder.modules.frm.pq}; +export const pG1gen = ${moduleBuilder.modules.bn128.pG1gen}; +export const pG1zero = ${moduleBuilder.modules.bn128.pG1zero}; +export const pG1b = ${moduleBuilder.modules.bn128.pG1b}; +export const pG2gen = ${moduleBuilder.modules.bn128.pG2gen}; +export const pG2zero = ${moduleBuilder.modules.bn128.pG2zero}; +export const pG2b = ${moduleBuilder.modules.bn128.pG2b}; +export const pOneT = ${moduleBuilder.modules.bn128.pOneT}; +export const prePSize = ${moduleBuilder.modules.bn128.prePSize}; +export const preQSize = ${moduleBuilder.modules.bn128.preQSize}; +export const n8q = 32; +export const n8r = 32; +export const q = "${moduleBuilder.modules.bn128.q}"; +export const r = "${moduleBuilder.modules.bn128.r}"; +` ); - fs.writeFileSync( - path.join( __dirname, "..", "build", "bn128.wasm"), + const codeBlob = new Blob([code]); + + console.log(await codeBlob.stream()); + + const codeStream = codeBlob.stream(); + const compressedReadableStream = codeStream.pipeThrough( + new CompressionStream("gzip"), + ); + const compressedCode = await new Response(compressedReadableStream).bytes(); + + writeFileSync( + join( __dirname, "..", "build", "bn128_wasm_gzip.js"), + `export const gzipCode = "${Buffer.from(compressedCode).toString("base64")}"; +export const pq = ${moduleBuilder.modules.f1m.pq}; +export const pr = ${moduleBuilder.modules.frm.pq}; +export const pG1gen = ${moduleBuilder.modules.bn128.pG1gen}; +export const pG1zero = ${moduleBuilder.modules.bn128.pG1zero}; +export const pG1b = ${moduleBuilder.modules.bn128.pG1b}; +export const pG2gen = ${moduleBuilder.modules.bn128.pG2gen}; +export const pG2zero = ${moduleBuilder.modules.bn128.pG2zero}; +export const pG2b = ${moduleBuilder.modules.bn128.pG2b}; +export const pOneT = ${moduleBuilder.modules.bn128.pOneT}; +export const prePSize = ${moduleBuilder.modules.bn128.prePSize}; +export const preQSize = ${moduleBuilder.modules.bn128.preQSize}; +export const n8q = 32; +export const n8r = 32; +export const q = "${moduleBuilder.modules.bn128.q}"; +export const r = "${moduleBuilder.modules.bn128.r}"; +` + ); + + writeFileSync( + join( __dirname, "..", "build", "bn128.wasm"), Buffer.from(code) ); } diff --git a/tools/buildwasm_mnt6753.js b/tools/buildwasm_mnt6753.js index b38d1be..f788182 100644 --- a/tools/buildwasm_mnt6753.js +++ b/tools/buildwasm_mnt6753.js @@ -1,9 +1,12 @@ -const ModuleBuilder = require("wasmbuilder").ModuleBuilder; -const buildMNT6753 = require("../src/mnt6753/build_mnt6753.js"); -const buildPedersenHash = require("../src/build_pedersenhash.js"); -const baseTables = require("../build/pedersenparams_mnt6753.js"); -const fs = require("fs"); -const path = require("path"); +import { ModuleBuilder } from "wasmbuilder"; +import buildMNT6753 from "../src/mnt6753/build_mnt6753.js"; +import buildPedersenHash from "../src/build_pedersenhash.js"; +import { code as pedersenParamsCode } from "../build/pedersenparams_mnt6753.js"; +import { writeFileSync } from "fs"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; +const __dirname = dirname(fileURLToPath(import.meta.url)); + function buildWasm() { @@ -11,24 +14,25 @@ function buildWasm() { moduleBuilder.setMemory(1000); buildMNT6753(moduleBuilder); + const baseTables = Uint8Array.from(atob(pedersenParamsCode), c => c.charCodeAt(0)); + buildPedersenHash(moduleBuilder, "g1m", "g1m", "f1m", 188, baseTables); const code = moduleBuilder.build(); - fs.writeFileSync( - path.join( __dirname, "..", "build", "mnt6753_wasm.js"), - ` - exports.code = "${Buffer.from(code).toString("base64")}"; - exports.pq = ${moduleBuilder.modules.mnt6753.pq}; - exports.pr = ${moduleBuilder.modules.mnt6753.pq}; - exports.pG1gen = ${moduleBuilder.modules.mnt6753.pG1gen}; - exports.pG1zero = ${moduleBuilder.modules.mnt6753.pG1zero}; - exports.pG2gen = ${moduleBuilder.modules.mnt6753.pG2gen}; - exports.pG2zero = ${moduleBuilder.modules.mnt6753.pG2zero}; - exports.pOneT = ${moduleBuilder.modules.mnt6753.pOneT}; - exports.prePSize = ${moduleBuilder.modules.mnt6753.prePSize}; - exports.preQSize = ${moduleBuilder.modules.mnt6753.preQSize}; - ` + writeFileSync( + join(__dirname, "..", "build", "mnt6753_wasm.js"), + `export const code = "${Buffer.from(code).toString("base64")}"; +export const pq = ${moduleBuilder.modules.mnt6753.pq}; +export const pr = ${moduleBuilder.modules.mnt6753.pq}; +export const pG1gen = ${moduleBuilder.modules.mnt6753.pG1gen}; +export const pG1zero = ${moduleBuilder.modules.mnt6753.pG1zero}; +export const pG2gen = ${moduleBuilder.modules.mnt6753.pG2gen}; +export const pG2zero = ${moduleBuilder.modules.mnt6753.pG2zero}; +export const pOneT = ${moduleBuilder.modules.mnt6753.pOneT}; +export const prePSize = ${moduleBuilder.modules.mnt6753.prePSize}; +export const preQSize = ${moduleBuilder.modules.mnt6753.preQSize}; +` ); } diff --git a/tools/buildwasm_msm_batch.js b/tools/buildwasm_msm_batch.js new file mode 100644 index 0000000..f175363 --- /dev/null +++ b/tools/buildwasm_msm_batch.js @@ -0,0 +1,19 @@ +// Compiles the AssemblyScript batch-affine MSM module (src/as/msm_batch.ts) +// to build/msm_batch.wasm. The module is curve-independent: it imports the +// base-field/group ops and shares the main module's linear memory, so the +// same binary serves bn128 and bls12381 (G1 and G2). +import { execFileSync } from "child_process"; +import path from "path"; +import { fileURLToPath } from "url"; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const asc = path.join(__dirname, "..", "node_modules", ".bin", "asc"); +const src = path.join(__dirname, "..", "src", "as", "msm_batch.ts"); +const out = path.join(__dirname, "..", "build", "msm_batch.wasm"); + +execFileSync(asc, [ + src, "-o", out, + "--importMemory", "--initialMemory", "25", + "--runtime", "stub", "--noAssert", "-O3", +], { stdio: "inherit" }); +console.log("wrote", out); diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..eb6df10 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,41 @@ +import { defineConfig } from "vite"; +import { builtinModules } from "module"; +import { readFileSync } from "fs"; + +const pkg = JSON.parse(readFileSync("./package.json", "utf8")); +const external = [ + ...builtinModules, + ...Object.keys(pkg.dependencies || {}), +]; + +export default defineConfig({ + build: { + lib: { + entry: "./index.js", + formats: ["cjs"], + fileName: () => "main.cjs", + }, + outDir: "build", + emptyOutDir: false, + minify: false, + rollupOptions: { + external, + }, + }, + test: { + projects: [ + { + test: { + globals: true, + testTimeout: 10000000, + include: ["test/**/*.js"], + // wasmcurves is a codegen library validated in Node, so + // there is no separate browser project (it would be redundant). + exclude: ["**/node_modules/**", "test/helpers/**"], + name: "unit", + environment: "node", + }, + }, + ], + }, +});