pax_global_header00006660000000000000000000000064151242251470014515gustar00rootroot0000000000000052 comment=14b597891fed214d00d460fe5679e66f34c15b3c golang-filippo-nistec-0.0.4/000077500000000000000000000000001512422514700157105ustar00rootroot00000000000000golang-filippo-nistec-0.0.4/.github/000077500000000000000000000000001512422514700172505ustar00rootroot00000000000000golang-filippo-nistec-0.0.4/.github/workflows/000077500000000000000000000000001512422514700213055ustar00rootroot00000000000000golang-filippo-nistec-0.0.4/.github/workflows/test.yml000066400000000000000000000030221512422514700230040ustar00rootroot00000000000000name: Go tests on: push: pull_request: schedule: # daily at 09:42 UTC - cron: '42 9 * * *' workflow_dispatch: permissions: contents: read jobs: test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: go: - { go-version: stable } - { go-version: oldstable } - { go-version-file: go.mod } deps: - locked - latest steps: - uses: actions/checkout@v5 with: persist-credentials: false - uses: actions/setup-go@v6 with: go-version: ${{ matrix.go.go-version }} go-version-file: ${{ matrix.go.go-version-file }} - run: go get -u if: matrix.deps == 'latest' - run: go test ./... - run: go test -tags purego ./... - run: go test -race -short ./... - run: GOARCH=arm64 go test -c - run: GOARCH=ppc64le go test -c - run: GOARCH=s390x go test -c - run: GOARCH=arm go test -c staticcheck: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 with: persist-credentials: false - uses: actions/setup-go@v6 with: go-version: stable - run: go run honnef.co/go/tools/cmd/staticcheck@latest ./... govulncheck: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 with: persist-credentials: false - uses: actions/setup-go@v6 with: go-version: stable - run: go run golang.org/x/vuln/cmd/govulncheck@latest ./... golang-filippo-nistec-0.0.4/LICENSE000066400000000000000000000026551512422514700167250ustar00rootroot00000000000000Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. golang-filippo-nistec-0.0.4/README.md000066400000000000000000000024371512422514700171750ustar00rootroot00000000000000# filippo.io/nistec ``` import "filippo.io/nistec" ``` This package implements the NIST P elliptic curves, according to FIPS 186-4 and SEC 1, Version 2.0, exposing the necessary APIs to build a wide array of higher-level primitives. It's an exported version of `crypto/internal/fips140/nistec` in the standard library, which powers `crypto/elliptic`, `crypto/ecdsa`, and `crypto/ecdh`. The git history has been preserved, and new upstream changes are applied periodically. This package uses fiat-crypto or specialized assembly and Go code for its backend field arithmetic (not math/big) and exposes constant-time, heap allocation-free, byte slice-based safe APIs. Group operations use modern and safe complete addition formulas where possible. The point at infinity is handled and encoded according to SEC 1, Version 2.0, and invalid curve points can't be represented. This makes it particularly suitable to be used as a prime order group implementation. Use the `purego` build tag to exclude the assembly and rely entirely on formally verified fiat-crypto arithmetic and complete addition formulas. Read the docs at [pkg.go.dev/filippo.io/nistec](https://pkg.go.dev/filippo.io/nistec). This repository generally does not accept contributions. Any changes should be submitted upstream to the Go project. golang-filippo-nistec-0.0.4/_asm/000077500000000000000000000000001512422514700166275ustar00rootroot00000000000000golang-filippo-nistec-0.0.4/_asm/go.mod000066400000000000000000000003401512422514700177320ustar00rootroot00000000000000module crypto/internal/fips140/nistec/_asm go 1.24 require github.com/mmcloughlin/avo v0.6.0 require ( golang.org/x/mod v0.20.0 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/tools v0.24.0 // indirect ) golang-filippo-nistec-0.0.4/_asm/go.sum000066400000000000000000000011721512422514700177630ustar00rootroot00000000000000github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY= github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8= golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang-filippo-nistec-0.0.4/_asm/p256_asm.go000066400000000000000000001620431512422514700205200ustar00rootroot00000000000000// Copyright 2024 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This file contains constant-time, 64-bit assembly implementation of // P256. The optimizations performed here are described in detail in: // S.Gueron and V.Krasnov, "Fast prime field elliptic-curve cryptography with // 256-bit primes" // https://link.springer.com/article/10.1007%2Fs13389-014-0090-x // https://eprint.iacr.org/2013/816.pdf package main import ( "os" "strings" . "github.com/mmcloughlin/avo/build" "github.com/mmcloughlin/avo/ir" . "github.com/mmcloughlin/avo/operand" . "github.com/mmcloughlin/avo/reg" ) //go:generate go run . -out ../p256_asm_amd64.s var ( res_ptr GPPhysical = RDI x_ptr = RSI y_ptr = RCX ) // These variables have been versioned as they get redfined in the reference implementation. // This is done to produce a minimal semantic diff. var ( acc0_v1 GPPhysical = R8 acc1_v1 = R9 acc2_v1 = R10 acc3_v1 = R11 acc4_v1 = R12 acc5_v1 = R13 t0_v1 = R14 t1_v1 = R15 ) func main() { Package("crypto/internal/fips140/nistec") ConstraintExpr("!purego") p256MovCond() p256NegCond() p256Sqr() p256Mul() p256FromMont() p256Select() p256SelectAffine() p256OrdMul() p256OrdSqr() p256SubInternal() p256MulInternal() p256SqrInternal() p256PointAddAffineAsm() p256IsZero() p256PointAddAsm() p256PointDoubleAsm() Generate() internalFunctions := []string{ "·p256SubInternal", "·p256MulInternal", "·p256SqrInternal", "·p256IsZero", } removePeskyUnicodeDot(internalFunctions, "../p256_asm_amd64.s") } // Implements: // // func p256MovCond(res, a, b *P256Point, cond int) func p256MovCond() { Implement("p256MovCond") Attributes(NOSPLIT) Load(Param("res"), res_ptr) Load(Param("a"), x_ptr) Load(Param("b"), y_ptr) Load(Param("cond"), X12) PXOR(X13, X13) PSHUFD(Imm(0), X12, X12) PCMPEQL(X13, X12) MOVOU(X12, X0) MOVOU(Mem{Base: x_ptr}.Offset(16*0), X6) PANDN(X6, X0) MOVOU(X12, X1) MOVOU(Mem{Base: x_ptr}.Offset(16*1), X7) PANDN(X7, X1) MOVOU(X12, X2) MOVOU(Mem{Base: x_ptr}.Offset(16*2), X8) PANDN(X8, X2) MOVOU(X12, X3) MOVOU(Mem{Base: x_ptr}.Offset(16*3), X9) PANDN(X9, X3) MOVOU(X12, X4) MOVOU(Mem{Base: x_ptr}.Offset(16*4), X10) PANDN(X10, X4) MOVOU(X12, X5) MOVOU(Mem{Base: x_ptr}.Offset(16*5), X11) PANDN(X11, X5) MOVOU(Mem{Base: y_ptr}.Offset(16*0), X6) MOVOU(Mem{Base: y_ptr}.Offset(16*1), X7) MOVOU(Mem{Base: y_ptr}.Offset(16*2), X8) MOVOU(Mem{Base: y_ptr}.Offset(16*3), X9) MOVOU(Mem{Base: y_ptr}.Offset(16*4), X10) MOVOU(Mem{Base: y_ptr}.Offset(16*5), X11) PAND(X12, X6) PAND(X12, X7) PAND(X12, X8) PAND(X12, X9) PAND(X12, X10) PAND(X12, X11) PXOR(X6, X0) PXOR(X7, X1) PXOR(X8, X2) PXOR(X9, X3) PXOR(X10, X4) PXOR(X11, X5) MOVOU(X0, Mem{Base: res_ptr}.Offset(16*0)) MOVOU(X1, Mem{Base: res_ptr}.Offset(16*1)) MOVOU(X2, Mem{Base: res_ptr}.Offset(16*2)) MOVOU(X3, Mem{Base: res_ptr}.Offset(16*3)) MOVOU(X4, Mem{Base: res_ptr}.Offset(16*4)) MOVOU(X5, Mem{Base: res_ptr}.Offset(16*5)) RET() } // Implements: // // func p256NegCond(val *p256Element, cond int) func p256NegCond() { Implement("p256NegCond") Attributes(NOSPLIT) Load(Param("val"), res_ptr) Load(Param("cond"), t0_v1) Comment("acc = poly") MOVQ(I32(-1), acc0_v1) p256const0 := p256const0_DATA() MOVQ(p256const0, acc1_v1) MOVQ(I32(0), acc2_v1) p256const1 := p256const1_DATA() MOVQ(p256const1, acc3_v1) Comment("Load the original value") MOVQ(Mem{Base: res_ptr}.Offset(8*0), acc5_v1) MOVQ(Mem{Base: res_ptr}.Offset(8*1), x_ptr) MOVQ(Mem{Base: res_ptr}.Offset(8*2), y_ptr) MOVQ(Mem{Base: res_ptr}.Offset(8*3), t1_v1) Comment("Speculatively subtract") SUBQ(acc5_v1, acc0_v1) SBBQ(x_ptr, acc1_v1) SBBQ(y_ptr, acc2_v1) SBBQ(t1_v1, acc3_v1) Comment("If condition is 0, keep original value") TESTQ(t0_v1, t0_v1) CMOVQEQ(acc5_v1, acc0_v1) CMOVQEQ(x_ptr, acc1_v1) CMOVQEQ(y_ptr, acc2_v1) CMOVQEQ(t1_v1, acc3_v1) Comment("Store result") MOVQ(acc0_v1, Mem{Base: res_ptr}.Offset(8*0)) MOVQ(acc1_v1, Mem{Base: res_ptr}.Offset(8*1)) MOVQ(acc2_v1, Mem{Base: res_ptr}.Offset(8*2)) MOVQ(acc3_v1, Mem{Base: res_ptr}.Offset(8*3)) RET() } // Implements: // // func p256Sqr(res, in *p256Element, n int) func p256Sqr() { Implement("p256Sqr") Attributes(NOSPLIT) Load(Param("res"), res_ptr) Load(Param("in"), x_ptr) Load(Param("n"), RBX) Label("sqrLoop") Comment("y[1:] * y[0]") MOVQ(Mem{Base: x_ptr}.Offset(8*0), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) MOVQ(RAX, acc1_v1) MOVQ(RDX, acc2_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc3_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc4_v1) Comment("y[2:] * y[1]") MOVQ(Mem{Base: x_ptr}.Offset(8*1), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc5_v1) Comment("y[3] * y[2]") MOVQ(Mem{Base: x_ptr}.Offset(8*2), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(RAX, acc5_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, y_ptr) XORQ(t1_v1, t1_v1) Comment("*2") ADDQ(acc1_v1, acc1_v1) ADCQ(acc2_v1, acc2_v1) ADCQ(acc3_v1, acc3_v1) ADCQ(acc4_v1, acc4_v1) ADCQ(acc5_v1, acc5_v1) ADCQ(y_ptr, y_ptr) ADCQ(Imm(0), t1_v1) Comment("Missing products") MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(RAX) MOVQ(RAX, acc0_v1) MOVQ(RDX, t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(RAX) ADDQ(t0_v1, acc1_v1) ADCQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(RAX) ADDQ(t0_v1, acc3_v1) ADCQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(RAX) ADDQ(t0_v1, acc5_v1) ADCQ(RAX, y_ptr) ADCQ(RDX, t1_v1) MOVQ(t1_v1, x_ptr) Comment("First reduction step") MOVQ(acc0_v1, RAX) MOVQ(acc0_v1, t1_v1) SHLQ(Imm(32), acc0_v1) p256const1 := p256const1_DATA() MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc0_v1, acc1_v1) ADCQ(t1_v1, acc2_v1) ADCQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc0_v1) Comment("Second reduction step") MOVQ(acc1_v1, RAX) MOVQ(acc1_v1, t1_v1) SHLQ(Imm(32), acc1_v1) MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc1_v1, acc2_v1) ADCQ(t1_v1, acc3_v1) ADCQ(RAX, acc0_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc1_v1) Comment("Third reduction step") MOVQ(acc2_v1, RAX) MOVQ(acc2_v1, t1_v1) SHLQ(Imm(32), acc2_v1) MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc2_v1, acc3_v1) ADCQ(t1_v1, acc0_v1) ADCQ(RAX, acc1_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc2_v1) Comment("Last reduction step") XORQ(t0_v1, t0_v1) MOVQ(acc3_v1, RAX) MOVQ(acc3_v1, t1_v1) SHLQ(Imm(32), acc3_v1) MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc3_v1, acc0_v1) ADCQ(t1_v1, acc1_v1) ADCQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc3_v1) Comment("Add bits [511:256] of the sqr result") ADCQ(acc4_v1, acc0_v1) ADCQ(acc5_v1, acc1_v1) ADCQ(y_ptr, acc2_v1) ADCQ(x_ptr, acc3_v1) ADCQ(Imm(0), t0_v1) MOVQ(acc0_v1, acc4_v1) MOVQ(acc1_v1, acc5_v1) MOVQ(acc2_v1, y_ptr) MOVQ(acc3_v1, t1_v1) Comment("Subtract p256") SUBQ(I8(-1), acc0_v1) p256const0 := p256const0_DATA() SBBQ(p256const0, acc1_v1) SBBQ(Imm(0), acc2_v1) SBBQ(p256const1, acc3_v1) SBBQ(Imm(0), t0_v1) CMOVQCS(acc4_v1, acc0_v1) CMOVQCS(acc5_v1, acc1_v1) CMOVQCS(y_ptr, acc2_v1) CMOVQCS(t1_v1, acc3_v1) MOVQ(acc0_v1, Mem{Base: res_ptr}.Offset(8*0)) MOVQ(acc1_v1, Mem{Base: res_ptr}.Offset(8*1)) MOVQ(acc2_v1, Mem{Base: res_ptr}.Offset(8*2)) MOVQ(acc3_v1, Mem{Base: res_ptr}.Offset(8*3)) MOVQ(res_ptr, x_ptr) DECQ(RBX) JNE(LabelRef("sqrLoop")) RET() } // Implements: // // func p256Mul(res, in1, in2 *p256Element) func p256Mul() { Implement("p256Mul") Attributes(NOSPLIT) Load(Param("res"), res_ptr) Load(Param("in1"), x_ptr) Load(Param("in2"), y_ptr) Comment("x * y[0]") MOVQ(Mem{Base: y_ptr}.Offset(8*0), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(t0_v1) MOVQ(RAX, acc0_v1) MOVQ(RDX, acc1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) ADDQ(RAX, acc1_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc2_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc3_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc4_v1) XORQ(acc5_v1, acc5_v1) Comment("First reduction step") MOVQ(acc0_v1, RAX) MOVQ(acc0_v1, t1_v1) SHLQ(Imm(32), acc0_v1) p256const1 := p256const1_DATA() MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc0_v1, acc1_v1) ADCQ(t1_v1, acc2_v1) ADCQ(RAX, acc3_v1) ADCQ(RDX, acc4_v1) ADCQ(Imm(0), acc5_v1) XORQ(acc0_v1, acc0_v1) Comment("x * y[1]") MOVQ(Mem{Base: y_ptr}.Offset(8*1), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(t0_v1) ADDQ(RAX, acc1_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc2_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc3_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(RDX, acc5_v1) ADCQ(Imm(0), acc0_v1) Comment("Second reduction step") MOVQ(acc1_v1, RAX) MOVQ(acc1_v1, t1_v1) SHLQ(Imm(32), acc1_v1) MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc1_v1, acc2_v1) ADCQ(t1_v1, acc3_v1) ADCQ(RAX, acc4_v1) ADCQ(RDX, acc5_v1) ADCQ(Imm(0), acc0_v1) XORQ(acc1_v1, acc1_v1) Comment("x * y[2]") MOVQ(Mem{Base: y_ptr}.Offset(8*2), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(t0_v1) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc3_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc5_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc5_v1) ADCQ(RDX, acc0_v1) ADCQ(Imm(0), acc1_v1) Comment("Third reduction step") MOVQ(acc2_v1, RAX) MOVQ(acc2_v1, t1_v1) SHLQ(Imm(32), acc2_v1) MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc2_v1, acc3_v1) ADCQ(t1_v1, acc4_v1) ADCQ(RAX, acc5_v1) ADCQ(RDX, acc0_v1) ADCQ(Imm(0), acc1_v1) XORQ(acc2_v1, acc2_v1) Comment("x * y[3]") MOVQ(Mem{Base: y_ptr}.Offset(8*3), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc5_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc5_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc0_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc0_v1) ADCQ(RDX, acc1_v1) ADCQ(Imm(0), acc2_v1) Comment("Last reduction step") MOVQ(acc3_v1, RAX) MOVQ(acc3_v1, t1_v1) SHLQ(Imm(32), acc3_v1) MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc3_v1, acc4_v1) ADCQ(t1_v1, acc5_v1) ADCQ(RAX, acc0_v1) ADCQ(RDX, acc1_v1) ADCQ(Imm(0), acc2_v1) Comment("Copy result [255:0]") MOVQ(acc4_v1, x_ptr) MOVQ(acc5_v1, acc3_v1) MOVQ(acc0_v1, t0_v1) MOVQ(acc1_v1, t1_v1) Comment("Subtract p256") SUBQ(I8(-1), acc4_v1) p256const0 := p256const0_DATA() SBBQ(p256const0, acc5_v1) SBBQ(Imm(0), acc0_v1) // SBBQ p256const1<>(SB), acc1_v1 SBBQ(p256const1, acc1_v1) SBBQ(Imm(0), acc2_v1) CMOVQCS(x_ptr, acc4_v1) CMOVQCS(acc3_v1, acc5_v1) CMOVQCS(t0_v1, acc0_v1) CMOVQCS(t1_v1, acc1_v1) MOVQ(acc4_v1, Mem{Base: res_ptr}.Offset(8*0)) MOVQ(acc5_v1, Mem{Base: res_ptr}.Offset(8*1)) MOVQ(acc0_v1, Mem{Base: res_ptr}.Offset(8*2)) MOVQ(acc1_v1, Mem{Base: res_ptr}.Offset(8*3)) RET() } // Implements: // // func p256FromMont(res, in *p256Element) func p256FromMont() { Implement("p256FromMont") Attributes(NOSPLIT) Load(Param("res"), res_ptr) Load(Param("in"), x_ptr) MOVQ(Mem{Base: x_ptr}.Offset(8*0), acc0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), acc1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), acc2_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), acc3_v1) XORQ(acc4_v1, acc4_v1) Comment("Only reduce, no multiplications are needed") Comment("First stage") MOVQ(acc0_v1, RAX) MOVQ(acc0_v1, t1_v1) SHLQ(Imm(32), acc0_v1) p256const1 := p256const1_DATA() MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc0_v1, acc1_v1) ADCQ(t1_v1, acc2_v1) ADCQ(RAX, acc3_v1) ADCQ(RDX, acc4_v1) XORQ(acc5_v1, acc5_v1) Comment("Second stage") MOVQ(acc1_v1, RAX) MOVQ(acc1_v1, t1_v1) SHLQ(Imm(32), acc1_v1) MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc1_v1, acc2_v1) ADCQ(t1_v1, acc3_v1) ADCQ(RAX, acc4_v1) ADCQ(RDX, acc5_v1) XORQ(acc0_v1, acc0_v1) Comment("Third stage") MOVQ(acc2_v1, RAX) MOVQ(acc2_v1, t1_v1) SHLQ(Imm(32), acc2_v1) MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc2_v1, acc3_v1) ADCQ(t1_v1, acc4_v1) ADCQ(RAX, acc5_v1) ADCQ(RDX, acc0_v1) XORQ(acc1_v1, acc1_v1) Comment("Last stage") MOVQ(acc3_v1, RAX) MOVQ(acc3_v1, t1_v1) SHLQ(Imm(32), acc3_v1) MULQ(p256const1) SHRQ(Imm(32), t1_v1) ADDQ(acc3_v1, acc4_v1) ADCQ(t1_v1, acc5_v1) ADCQ(RAX, acc0_v1) ADCQ(RDX, acc1_v1) MOVQ(acc4_v1, x_ptr) MOVQ(acc5_v1, acc3_v1) MOVQ(acc0_v1, t0_v1) MOVQ(acc1_v1, t1_v1) SUBQ(I8(-1), acc4_v1) p256const0 := p256const0_DATA() SBBQ(p256const0, acc5_v1) SBBQ(Imm(0), acc0_v1) SBBQ(p256const1, acc1_v1) CMOVQCS(x_ptr, acc4_v1) CMOVQCS(acc3_v1, acc5_v1) CMOVQCS(t0_v1, acc0_v1) CMOVQCS(t1_v1, acc1_v1) MOVQ(acc4_v1, Mem{Base: res_ptr}.Offset(8*0)) MOVQ(acc5_v1, Mem{Base: res_ptr}.Offset(8*1)) MOVQ(acc0_v1, Mem{Base: res_ptr}.Offset(8*2)) MOVQ(acc1_v1, Mem{Base: res_ptr}.Offset(8*3)) RET() } // Implements: // // func p256Select(res *P256Point, table *p256Table, idx int) func p256Select() { Implement("p256Select") Attributes(NOSPLIT) Load(Param("idx"), RAX) Load(Param("table"), RDI) Load(Param("res"), RDX) PXOR(X15, X15) // X15 = 0 PCMPEQL(X14, X14) // X14 = -1 PSUBL(X14, X15) // X15 = 1 // Force Avo to emit: // MOVL AX, X14 Instruction(&ir.Instruction{ Opcode: "MOVL", Operands: []Op{ EAX, X14, }, }) PSHUFD(Imm(0), X14, X14) PXOR(X0, X0) PXOR(X1, X1) PXOR(X2, X2) PXOR(X3, X3) PXOR(X4, X4) PXOR(X5, X5) MOVQ(U32(16), RAX) MOVOU(X15, X13) Label("loop_select") MOVOU(X13, X12) PADDL(X15, X13) PCMPEQL(X14, X12) MOVOU(Mem{Base: DI}.Offset(16*0), X6) MOVOU(Mem{Base: DI}.Offset(16*1), X7) MOVOU(Mem{Base: DI}.Offset(16*2), X8) MOVOU(Mem{Base: DI}.Offset(16*3), X9) MOVOU(Mem{Base: DI}.Offset(16*4), X10) MOVOU(Mem{Base: DI}.Offset(16*5), X11) ADDQ(U8(16*6), RDI) PAND(X12, X6) PAND(X12, X7) PAND(X12, X8) PAND(X12, X9) PAND(X12, X10) PAND(X12, X11) PXOR(X6, X0) PXOR(X7, X1) PXOR(X8, X2) PXOR(X9, X3) PXOR(X10, X4) PXOR(X11, X5) DECQ(RAX) JNE(LabelRef("loop_select")) MOVOU(X0, Mem{Base: DX}.Offset(16*0)) MOVOU(X1, Mem{Base: DX}.Offset(16*1)) MOVOU(X2, Mem{Base: DX}.Offset(16*2)) MOVOU(X3, Mem{Base: DX}.Offset(16*3)) MOVOU(X4, Mem{Base: DX}.Offset(16*4)) MOVOU(X5, Mem{Base: DX}.Offset(16*5)) RET() } // Implements: // // func p256SelectAffine(res *p256AffinePoint, table *p256AffineTable, idx int) func p256SelectAffine() { Implement("p256SelectAffine") Attributes(NOSPLIT) Load(Param("idx"), RAX) Load(Param("table"), RDI) Load(Param("res"), RDX) PXOR(X15, X15) // X15 = 0 PCMPEQL(X14, X14) // X14 = -1 PSUBL(X14, X15) // X15 = 1 // Hack to get Avo to emit: // MOVL AX, X14 Instruction(&ir.Instruction{Opcode: "MOVL", Operands: []Op{RAX, X14}}) PSHUFD(Imm(0), X14, X14) PXOR(X0, X0) PXOR(X1, X1) PXOR(X2, X2) PXOR(X3, X3) MOVQ(U32(16), RAX) MOVOU(X15, X13) Label("loop_select_base") MOVOU(X13, X12) PADDL(X15, X13) PCMPEQL(X14, X12) MOVOU(Mem{Base: DI}.Offset(16*0), X4) MOVOU(Mem{Base: DI}.Offset(16*1), X5) MOVOU(Mem{Base: DI}.Offset(16*2), X6) MOVOU(Mem{Base: DI}.Offset(16*3), X7) MOVOU(Mem{Base: DI}.Offset(16*4), X8) MOVOU(Mem{Base: DI}.Offset(16*5), X9) MOVOU(Mem{Base: DI}.Offset(16*6), X10) MOVOU(Mem{Base: DI}.Offset(16*7), X11) ADDQ(Imm(16*8), RDI) PAND(X12, X4) PAND(X12, X5) PAND(X12, X6) PAND(X12, X7) MOVOU(X13, X12) PADDL(X15, X13) PCMPEQL(X14, X12) PAND(X12, X8) PAND(X12, X9) PAND(X12, X10) PAND(X12, X11) PXOR(X4, X0) PXOR(X5, X1) PXOR(X6, X2) PXOR(X7, X3) PXOR(X8, X0) PXOR(X9, X1) PXOR(X10, X2) PXOR(X11, X3) DECQ(RAX) JNE(LabelRef("loop_select_base")) MOVOU(X0, Mem{Base: DX}.Offset(16*0)) MOVOU(X1, Mem{Base: DX}.Offset(16*1)) MOVOU(X2, Mem{Base: DX}.Offset(16*2)) MOVOU(X3, Mem{Base: DX}.Offset(16*3)) RET() } // Implements: // // func p256OrdMul(res, in1, in2 *p256OrdElement) func p256OrdMul() { Implement("p256OrdMul") Attributes(NOSPLIT) Load(Param("res"), res_ptr) Load(Param("in1"), x_ptr) Load(Param("in2"), y_ptr) Comment("x * y[0]") MOVQ(Mem{Base: y_ptr}.Offset(8*0), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(t0_v1) MOVQ(RAX, acc0_v1) MOVQ(RDX, acc1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) ADDQ(RAX, acc1_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc2_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc3_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc4_v1) XORQ(acc5_v1, acc5_v1) Comment("First reduction step") MOVQ(acc0_v1, RAX) p256ordK0 := p256ordK0_DATA() MULQ(p256ordK0) MOVQ(RAX, t0_v1) p256ord := p256ord_DATA() MOVQ(p256ord.Offset(0x00), RAX) MULQ(t0_v1) ADDQ(RAX, acc0_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x08), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc1_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc1_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x10), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc2_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x18), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc3_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc3_v1) ADCQ(RDX, acc4_v1) ADCQ(Imm(0), acc5_v1) Comment("x * y[1]") MOVQ(Mem{Base: y_ptr}.Offset(8*1), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(t0_v1) ADDQ(RAX, acc1_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc2_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc3_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(RDX, acc5_v1) ADCQ(Imm(0), acc0_v1) Comment("Second reduction step") MOVQ(acc1_v1, RAX) MULQ(p256ordK0) MOVQ(RAX, t0_v1) MOVQ(p256ord.Offset(0x00), RAX) MULQ(t0_v1) ADDQ(RAX, acc1_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x08), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc2_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x10), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc3_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x18), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(RDX, acc5_v1) ADCQ(Imm(0), acc0_v1) Comment("x * y[2]") MOVQ(Mem{Base: y_ptr}.Offset(8*2), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(t0_v1) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc3_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc5_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc5_v1) ADCQ(RDX, acc0_v1) ADCQ(Imm(0), acc1_v1) Comment("Third reduction step") MOVQ(acc2_v1, RAX) MULQ(p256ordK0) MOVQ(RAX, t0_v1) MOVQ(p256ord.Offset(0x00), RAX) MULQ(t0_v1) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x08), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc3_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x10), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x18), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc5_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc5_v1) ADCQ(RDX, acc0_v1) ADCQ(Imm(0), acc1_v1) Comment("x * y[3]") MOVQ(Mem{Base: y_ptr}.Offset(8*3), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc5_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc5_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc0_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc0_v1) ADCQ(RDX, acc1_v1) ADCQ(Imm(0), acc2_v1) Comment("Last reduction step") MOVQ(acc3_v1, RAX) MULQ(p256ordK0) MOVQ(RAX, t0_v1) MOVQ(p256ord.Offset(0x00), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x08), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x10), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc5_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc5_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x18), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc0_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc0_v1) ADCQ(RDX, acc1_v1) ADCQ(Imm(0), acc2_v1) Comment("Copy result [255:0]") MOVQ(acc4_v1, x_ptr) MOVQ(acc5_v1, acc3_v1) MOVQ(acc0_v1, t0_v1) MOVQ(acc1_v1, t1_v1) Comment("Subtract p256") SUBQ(p256ord.Offset(0x00), acc4_v1) SBBQ(p256ord.Offset(0x08), acc5_v1) SBBQ(p256ord.Offset(0x10), acc0_v1) SBBQ(p256ord.Offset(0x18), acc1_v1) SBBQ(Imm(0), acc2_v1) CMOVQCS(x_ptr, acc4_v1) CMOVQCS(acc3_v1, acc5_v1) CMOVQCS(t0_v1, acc0_v1) CMOVQCS(t1_v1, acc1_v1) MOVQ(acc4_v1, Mem{Base: res_ptr}.Offset(8*0)) MOVQ(acc5_v1, Mem{Base: res_ptr}.Offset(8*1)) MOVQ(acc0_v1, Mem{Base: res_ptr}.Offset(8*2)) MOVQ(acc1_v1, Mem{Base: res_ptr}.Offset(8*3)) RET() } // Implements: // // func p256OrdSqr(res, in *p256OrdElement, n int) func p256OrdSqr() { Implement("p256OrdSqr") Attributes(NOSPLIT) Load(Param("res"), res_ptr) Load(Param("in"), x_ptr) Load(Param("n"), RBX) Label("ordSqrLoop") Comment("y[1:] * y[0]") MOVQ(Mem{Base: x_ptr}.Offset(8*0), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(t0_v1) MOVQ(RAX, acc1_v1) MOVQ(RDX, acc2_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc3_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc4_v1) Comment("y[2:] * y[1]") MOVQ(Mem{Base: x_ptr}.Offset(8*1), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc4_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, acc5_v1) Comment("y[3] * y[2]") MOVQ(Mem{Base: x_ptr}.Offset(8*2), t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(t0_v1) ADDQ(RAX, acc5_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, y_ptr) XORQ(t1_v1, t1_v1) Comment("*2") ADDQ(acc1_v1, acc1_v1) ADCQ(acc2_v1, acc2_v1) ADCQ(acc3_v1, acc3_v1) ADCQ(acc4_v1, acc4_v1) ADCQ(acc5_v1, acc5_v1) ADCQ(y_ptr, y_ptr) ADCQ(Imm(0), t1_v1) Comment("Missing products") MOVQ(Mem{Base: x_ptr}.Offset(8*0), RAX) MULQ(RAX) MOVQ(RAX, acc0_v1) MOVQ(RDX, t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*1), RAX) MULQ(RAX) ADDQ(t0_v1, acc1_v1) ADCQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*2), RAX) MULQ(RAX) ADDQ(t0_v1, acc3_v1) ADCQ(RAX, acc4_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t0_v1) MOVQ(Mem{Base: x_ptr}.Offset(8*3), RAX) MULQ(RAX) ADDQ(t0_v1, acc5_v1) ADCQ(RAX, y_ptr) ADCQ(RDX, t1_v1) MOVQ(t1_v1, x_ptr) Comment("First reduction step") MOVQ(acc0_v1, RAX) p256ordK0 := p256ordK0_DATA() MULQ(p256ordK0) MOVQ(RAX, t0_v1) p256ord := p256ord_DATA() MOVQ(p256ord.Offset(0x00), RAX) MULQ(t0_v1) ADDQ(RAX, acc0_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x08), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc1_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc1_v1) MOVQ(t0_v1, t1_v1) ADCQ(RDX, acc2_v1) ADCQ(Imm(0), t1_v1) SUBQ(t0_v1, acc2_v1) SBBQ(Imm(0), t1_v1) MOVQ(t0_v1, RAX) MOVQ(t0_v1, RDX) MOVQ(t0_v1, acc0_v1) SHLQ(Imm(32), RAX) SHRQ(Imm(32), RDX) ADDQ(t1_v1, acc3_v1) ADCQ(Imm(0), acc0_v1) SUBQ(RAX, acc3_v1) SBBQ(RDX, acc0_v1) Comment("Second reduction step") MOVQ(acc1_v1, RAX) MULQ(p256ordK0) MOVQ(RAX, t0_v1) MOVQ(p256ord.Offset(0x00), RAX) MULQ(t0_v1) ADDQ(RAX, acc1_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x08), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc2_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc2_v1) MOVQ(t0_v1, t1_v1) ADCQ(RDX, acc3_v1) ADCQ(Imm(0), t1_v1) SUBQ(t0_v1, acc3_v1) SBBQ(Imm(0), t1_v1) MOVQ(t0_v1, RAX) MOVQ(t0_v1, RDX) MOVQ(t0_v1, acc1_v1) SHLQ(Imm(32), RAX) SHRQ(Imm(32), RDX) ADDQ(t1_v1, acc0_v1) ADCQ(Imm(0), acc1_v1) SUBQ(RAX, acc0_v1) SBBQ(RDX, acc1_v1) Comment("Third reduction step") MOVQ(acc2_v1, RAX) MULQ(p256ordK0) MOVQ(RAX, t0_v1) MOVQ(p256ord.Offset(0x00), RAX) MULQ(t0_v1) ADDQ(RAX, acc2_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x08), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc3_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc3_v1) MOVQ(t0_v1, t1_v1) ADCQ(RDX, acc0_v1) ADCQ(Imm(0), t1_v1) SUBQ(t0_v1, acc0_v1) SBBQ(Imm(0), t1_v1) MOVQ(t0_v1, RAX) MOVQ(t0_v1, RDX) MOVQ(t0_v1, acc2_v1) SHLQ(Imm(32), RAX) SHRQ(Imm(32), RDX) ADDQ(t1_v1, acc1_v1) ADCQ(Imm(0), acc2_v1) SUBQ(RAX, acc1_v1) SBBQ(RDX, acc2_v1) Comment("Last reduction step") MOVQ(acc3_v1, RAX) MULQ(p256ordK0) MOVQ(RAX, t0_v1) MOVQ(p256ord.Offset(0x00), RAX) MULQ(t0_v1) ADDQ(RAX, acc3_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(p256ord.Offset(0x08), RAX) MULQ(t0_v1) ADDQ(t1_v1, acc0_v1) ADCQ(Imm(0), RDX) ADDQ(RAX, acc0_v1) ADCQ(Imm(0), RDX) MOVQ(RDX, t1_v1) MOVQ(t0_v1, t1_v1) ADCQ(RDX, acc1_v1) ADCQ(Imm(0), t1_v1) SUBQ(t0_v1, acc1_v1) SBBQ(Imm(0), t1_v1) MOVQ(t0_v1, RAX) MOVQ(t0_v1, RDX) MOVQ(t0_v1, acc3_v1) SHLQ(Imm(32), RAX) SHRQ(Imm(32), RDX) ADDQ(t1_v1, acc2_v1) ADCQ(Imm(0), acc3_v1) SUBQ(RAX, acc2_v1) SBBQ(RDX, acc3_v1) XORQ(t0_v1, t0_v1) Comment("Add bits [511:256] of the sqr result") ADCQ(acc4_v1, acc0_v1) ADCQ(acc5_v1, acc1_v1) ADCQ(y_ptr, acc2_v1) ADCQ(x_ptr, acc3_v1) ADCQ(Imm(0), t0_v1) MOVQ(acc0_v1, acc4_v1) MOVQ(acc1_v1, acc5_v1) MOVQ(acc2_v1, y_ptr) MOVQ(acc3_v1, t1_v1) Comment("Subtract p256") SUBQ(p256ord.Offset(0x00), acc0_v1) SBBQ(p256ord.Offset(0x08), acc1_v1) SBBQ(p256ord.Offset(0x10), acc2_v1) SBBQ(p256ord.Offset(0x18), acc3_v1) SBBQ(Imm(0), t0_v1) CMOVQCS(acc4_v1, acc0_v1) CMOVQCS(acc5_v1, acc1_v1) CMOVQCS(y_ptr, acc2_v1) CMOVQCS(t1_v1, acc3_v1) MOVQ(acc0_v1, Mem{Base: res_ptr}.Offset(8*0)) MOVQ(acc1_v1, Mem{Base: res_ptr}.Offset(8*1)) MOVQ(acc2_v1, Mem{Base: res_ptr}.Offset(8*2)) MOVQ(acc3_v1, Mem{Base: res_ptr}.Offset(8*3)) MOVQ(res_ptr, x_ptr) DECQ(RBX) JNE(LabelRef("ordSqrLoop")) RET() } // These variables have been versioned as they get redfined in the reference implementation. // This is done to produce a minimal semantic diff. var ( mul0_v2 = RAX mul1_v2 = RDX acc0_v2 = RBX acc1_v2 = RCX acc2_v2 = R8 acc3_v2 = R9 acc4_v2 = R10 acc5_v2 = R11 acc6_v2 = R12 acc7_v2 = R13 t0_v2 = R14 t1_v2 = R15 t2_v2 = RDI t3_v2 = RSI hlp_v2 = RBP ) func p256SubInternal() { Function("p256SubInternal") Attributes(NOSPLIT) XORQ(mul0_v2, mul0_v2) SUBQ(t0_v2, acc4_v2) SBBQ(t1_v2, acc5_v2) SBBQ(t2_v2, acc6_v2) SBBQ(t3_v2, acc7_v2) SBBQ(Imm(0), mul0_v2) MOVQ(acc4_v2, acc0_v2) MOVQ(acc5_v2, acc1_v2) MOVQ(acc6_v2, acc2_v2) MOVQ(acc7_v2, acc3_v2) ADDQ(I8(-1), acc4_v2) p256const0 := p256const0_DATA() ADCQ(p256const0, acc5_v2) ADCQ(Imm(0), acc6_v2) p256const1 := p256const1_DATA() ADCQ(p256const1, acc7_v2) ANDQ(Imm(1), mul0_v2) CMOVQEQ(acc0_v2, acc4_v2) CMOVQEQ(acc1_v2, acc5_v2) CMOVQEQ(acc2_v2, acc6_v2) CMOVQEQ(acc3_v2, acc7_v2) RET() } func p256MulInternal() { Function("p256MulInternal") Attributes(NOSPLIT) MOVQ(acc4_v2, mul0_v2) MULQ(t0_v2) MOVQ(mul0_v2, acc0_v2) MOVQ(mul1_v2, acc1_v2) MOVQ(acc4_v2, mul0_v2) MULQ(t1_v2) ADDQ(mul0_v2, acc1_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc2_v2) MOVQ(acc4_v2, mul0_v2) MULQ(t2_v2) ADDQ(mul0_v2, acc2_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc3_v2) MOVQ(acc4_v2, mul0_v2) MULQ(t3_v2) ADDQ(mul0_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc4_v2) MOVQ(acc5_v2, mul0_v2) MULQ(t0_v2) ADDQ(mul0_v2, acc1_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc5_v2, mul0_v2) MULQ(t1_v2) ADDQ(hlp_v2, acc2_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, acc2_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc5_v2, mul0_v2) MULQ(t2_v2) ADDQ(hlp_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc5_v2, mul0_v2) MULQ(t3_v2) ADDQ(hlp_v2, acc4_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, acc4_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc5_v2) MOVQ(acc6_v2, mul0_v2) MULQ(t0_v2) ADDQ(mul0_v2, acc2_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc6_v2, mul0_v2) MULQ(t1_v2) ADDQ(hlp_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc6_v2, mul0_v2) MULQ(t2_v2) ADDQ(hlp_v2, acc4_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, acc4_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc6_v2, mul0_v2) MULQ(t3_v2) ADDQ(hlp_v2, acc5_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, acc5_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc6_v2) MOVQ(acc7_v2, mul0_v2) MULQ(t0_v2) ADDQ(mul0_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc7_v2, mul0_v2) MULQ(t1_v2) ADDQ(hlp_v2, acc4_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, acc4_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc7_v2, mul0_v2) MULQ(t2_v2) ADDQ(hlp_v2, acc5_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, acc5_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc7_v2, mul0_v2) MULQ(t3_v2) ADDQ(hlp_v2, acc6_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, acc6_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc7_v2) Comment("First reduction step") MOVQ(acc0_v2, mul0_v2) MOVQ(acc0_v2, hlp_v2) SHLQ(Imm(32), acc0_v2) p256const1 := p256const1_DATA() MULQ(p256const1) SHRQ(Imm(32), hlp_v2) ADDQ(acc0_v2, acc1_v2) ADCQ(hlp_v2, acc2_v2) ADCQ(mul0_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc0_v2) Comment("Second reduction step") MOVQ(acc1_v2, mul0_v2) MOVQ(acc1_v2, hlp_v2) SHLQ(Imm(32), acc1_v2) MULQ(p256const1) SHRQ(Imm(32), hlp_v2) ADDQ(acc1_v2, acc2_v2) ADCQ(hlp_v2, acc3_v2) ADCQ(mul0_v2, acc0_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc1_v2) Comment("Third reduction step") MOVQ(acc2_v2, mul0_v2) MOVQ(acc2_v2, hlp_v2) SHLQ(Imm(32), acc2_v2) MULQ(p256const1) SHRQ(Imm(32), hlp_v2) ADDQ(acc2_v2, acc3_v2) ADCQ(hlp_v2, acc0_v2) ADCQ(mul0_v2, acc1_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc2_v2) Comment("Last reduction step") MOVQ(acc3_v2, mul0_v2) MOVQ(acc3_v2, hlp_v2) SHLQ(Imm(32), acc3_v2) MULQ(p256const1) SHRQ(Imm(32), hlp_v2) ADDQ(acc3_v2, acc0_v2) ADCQ(hlp_v2, acc1_v2) ADCQ(mul0_v2, acc2_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc3_v2) MOVQ(U32(0), RBP) Comment("Add bits [511:256] of the result") ADCQ(acc0_v2, acc4_v2) ADCQ(acc1_v2, acc5_v2) ADCQ(acc2_v2, acc6_v2) ADCQ(acc3_v2, acc7_v2) ADCQ(Imm(0), hlp_v2) Comment("Copy result") MOVQ(acc4_v2, acc0_v2) MOVQ(acc5_v2, acc1_v2) MOVQ(acc6_v2, acc2_v2) MOVQ(acc7_v2, acc3_v2) Comment("Subtract p256") SUBQ(I8(-1), acc4_v2) p256const0 := p256const0_DATA() SBBQ(p256const0, acc5_v2) SBBQ(Imm(0), acc6_v2) SBBQ(p256const1, acc7_v2) SBBQ(Imm(0), hlp_v2) Comment("If the result of the subtraction is negative, restore the previous result") CMOVQCS(acc0_v2, acc4_v2) CMOVQCS(acc1_v2, acc5_v2) CMOVQCS(acc2_v2, acc6_v2) CMOVQCS(acc3_v2, acc7_v2) RET() } func p256SqrInternal() { Function("p256SqrInternal") Attributes(NOSPLIT) MOVQ(acc4_v2, mul0_v2) MULQ(acc5_v2) MOVQ(mul0_v2, acc1_v2) MOVQ(mul1_v2, acc2_v2) MOVQ(acc4_v2, mul0_v2) MULQ(acc6_v2) ADDQ(mul0_v2, acc2_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc3_v2) MOVQ(acc4_v2, mul0_v2) MULQ(acc7_v2) ADDQ(mul0_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, t0_v2) MOVQ(acc5_v2, mul0_v2) MULQ(acc6_v2) ADDQ(mul0_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, hlp_v2) MOVQ(acc5_v2, mul0_v2) MULQ(acc7_v2) ADDQ(hlp_v2, t0_v2) ADCQ(Imm(0), mul1_v2) ADDQ(mul0_v2, t0_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, t1_v2) MOVQ(acc6_v2, mul0_v2) MULQ(acc7_v2) ADDQ(mul0_v2, t1_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, t2_v2) XORQ(t3_v2, t3_v2) Comment("*2") ADDQ(acc1_v2, acc1_v2) ADCQ(acc2_v2, acc2_v2) ADCQ(acc3_v2, acc3_v2) ADCQ(t0_v2, t0_v2) ADCQ(t1_v2, t1_v2) ADCQ(t2_v2, t2_v2) ADCQ(Imm(0), t3_v2) Comment("Missing products") MOVQ(acc4_v2, mul0_v2) MULQ(mul0_v2) MOVQ(mul0_v2, acc0_v2) MOVQ(RDX, acc4_v2) MOVQ(acc5_v2, mul0_v2) MULQ(mul0_v2) ADDQ(acc4_v2, acc1_v2) ADCQ(mul0_v2, acc2_v2) ADCQ(Imm(0), RDX) MOVQ(RDX, acc4_v2) MOVQ(acc6_v2, mul0_v2) MULQ(mul0_v2) ADDQ(acc4_v2, acc3_v2) ADCQ(mul0_v2, t0_v2) ADCQ(Imm(0), RDX) MOVQ(RDX, acc4_v2) MOVQ(acc7_v2, mul0_v2) MULQ(mul0_v2) ADDQ(acc4_v2, t1_v2) ADCQ(mul0_v2, t2_v2) ADCQ(RDX, t3_v2) Comment("First reduction step") MOVQ(acc0_v2, mul0_v2) MOVQ(acc0_v2, hlp_v2) SHLQ(Imm(32), acc0_v2) p256const1 := p256const1_DATA() MULQ(p256const1) SHRQ(Imm(32), hlp_v2) ADDQ(acc0_v2, acc1_v2) ADCQ(hlp_v2, acc2_v2) ADCQ(mul0_v2, acc3_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc0_v2) Comment("Second reduction step") MOVQ(acc1_v2, mul0_v2) MOVQ(acc1_v2, hlp_v2) SHLQ(Imm(32), acc1_v2) MULQ(p256const1) SHRQ(Imm(32), hlp_v2) ADDQ(acc1_v2, acc2_v2) ADCQ(hlp_v2, acc3_v2) ADCQ(mul0_v2, acc0_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc1_v2) Comment("Third reduction step") MOVQ(acc2_v2, mul0_v2) MOVQ(acc2_v2, hlp_v2) SHLQ(Imm(32), acc2_v2) MULQ(p256const1) SHRQ(Imm(32), hlp_v2) ADDQ(acc2_v2, acc3_v2) ADCQ(hlp_v2, acc0_v2) ADCQ(mul0_v2, acc1_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc2_v2) Comment("Last reduction step") MOVQ(acc3_v2, mul0_v2) MOVQ(acc3_v2, hlp_v2) SHLQ(Imm(32), acc3_v2) MULQ(p256const1) SHRQ(Imm(32), hlp_v2) ADDQ(acc3_v2, acc0_v2) ADCQ(hlp_v2, acc1_v2) ADCQ(mul0_v2, acc2_v2) ADCQ(Imm(0), mul1_v2) MOVQ(mul1_v2, acc3_v2) MOVQ(U32(0), RBP) Comment("Add bits [511:256] of the result") ADCQ(acc0_v2, t0_v2) ADCQ(acc1_v2, t1_v2) ADCQ(acc2_v2, t2_v2) ADCQ(acc3_v2, t3_v2) ADCQ(Imm(0), hlp_v2) Comment("Copy result") MOVQ(t0_v2, acc4_v2) MOVQ(t1_v2, acc5_v2) MOVQ(t2_v2, acc6_v2) MOVQ(t3_v2, acc7_v2) Comment("Subtract p256") SUBQ(I8(-1), acc4_v2) p256const0 := p256const0_DATA() SBBQ(p256const0, acc5_v2) SBBQ(Imm(0), acc6_v2) SBBQ(p256const1, acc7_v2) SBBQ(Imm(0), hlp_v2) Comment("If the result of the subtraction is negative, restore the previous result") CMOVQCS(t0_v2, acc4_v2) CMOVQCS(t1_v2, acc5_v2) CMOVQCS(t2_v2, acc6_v2) CMOVQCS(t3_v2, acc7_v2) RET() } func p256MulBy2Inline() { XORQ(mul0_v2, mul0_v2) ADDQ(acc4_v2, acc4_v2) ADCQ(acc5_v2, acc5_v2) ADCQ(acc6_v2, acc6_v2) ADCQ(acc7_v2, acc7_v2) ADCQ(I8(0), mul0_v2) MOVQ(acc4_v2, t0_v2) MOVQ(acc5_v2, t1_v2) MOVQ(acc6_v2, t2_v2) MOVQ(acc7_v2, t3_v2) SUBQ(I8(-1), t0_v2) p256const0 := p256const0_DATA() SBBQ(p256const0, t1_v2) SBBQ(I8(0), t2_v2) p256const1 := p256const1_DATA() SBBQ(p256const1, t3_v2) SBBQ(I8(0), mul0_v2) CMOVQCS(acc4_v2, t0_v2) CMOVQCS(acc5_v2, t1_v2) CMOVQCS(acc6_v2, t2_v2) CMOVQCS(acc7_v2, t3_v2) } func p256AddInline() { XORQ(mul0_v2, mul0_v2) ADDQ(t0_v2, acc4_v2) ADCQ(t1_v2, acc5_v2) ADCQ(t2_v2, acc6_v2) ADCQ(t3_v2, acc7_v2) ADCQ(I8(0), mul0_v2) MOVQ(acc4_v2, t0_v2) MOVQ(acc5_v2, t1_v2) MOVQ(acc6_v2, t2_v2) MOVQ(acc7_v2, t3_v2) SUBQ(I8(-1), t0_v2) p256const0 := p256const0_DATA() SBBQ(p256const0, t1_v2) SBBQ(I8(0), t2_v2) p256const1 := p256const1_DATA() SBBQ(p256const1, t3_v2) SBBQ(I8(0), mul0_v2) CMOVQCS(acc4_v2, t0_v2) CMOVQCS(acc5_v2, t1_v2) CMOVQCS(acc6_v2, t2_v2) CMOVQCS(acc7_v2, t3_v2) } /* ---------------------------------------*/ type MemFunc func(off int) Mem func LDacc(src MemFunc) { MOVQ(src(8*0), acc4_v2) MOVQ(src(8*1), acc5_v2) MOVQ(src(8*2), acc6_v2) MOVQ(src(8*3), acc7_v2) } func LDt(src MemFunc) { MOVQ(src(8*0), t0_v2) MOVQ(src(8*1), t1_v2) MOVQ(src(8*2), t2_v2) MOVQ(src(8*3), t3_v2) } func ST(dst MemFunc) { MOVQ(acc4_v2, dst(8*0)) MOVQ(acc5_v2, dst(8*1)) MOVQ(acc6_v2, dst(8*2)) MOVQ(acc7_v2, dst(8*3)) } func STt(dst MemFunc) { MOVQ(t0_v2, dst(8*0)) MOVQ(t1_v2, dst(8*1)) MOVQ(t2_v2, dst(8*2)) MOVQ(t3_v2, dst(8*3)) } func acc2t() { MOVQ(acc4_v2, t0_v2) MOVQ(acc5_v2, t1_v2) MOVQ(acc6_v2, t2_v2) MOVQ(acc7_v2, t3_v2) } func t2acc() { MOVQ(t0_v2, acc4_v2) MOVQ(t1_v2, acc5_v2) MOVQ(t2_v2, acc6_v2) MOVQ(t3_v2, acc7_v2) } /* ---------------------------------------*/ // These functions exist as #define macros in the reference implementation. // // In the reference assembly, these macros are later undefined and redefined. // They are implemented here as versioned functions. func x1in_v1(off int) Mem { return Mem{Base: SP}.Offset(32*0 + off) } func y1in_v1(off int) Mem { return Mem{Base: SP}.Offset(32*1 + off) } func z1in_v1(off int) Mem { return Mem{Base: SP}.Offset(32*2 + off) } func x2in_v1(off int) Mem { return Mem{Base: SP}.Offset(32*3 + off) } func y2in_v1(off int) Mem { return Mem{Base: SP}.Offset(32*4 + off) } func xout_v1(off int) Mem { return Mem{Base: SP}.Offset(32*5 + off) } func yout_v1(off int) Mem { return Mem{Base: SP}.Offset(32*6 + off) } func zout_v1(off int) Mem { return Mem{Base: SP}.Offset(32*7 + off) } func s2_v1(off int) Mem { return Mem{Base: SP}.Offset(32*8 + off) } func z1sqr_v1(off int) Mem { return Mem{Base: SP}.Offset(32*9 + off) } func h_v1(off int) Mem { return Mem{Base: SP}.Offset(32*10 + off) } func r_v1(off int) Mem { return Mem{Base: SP}.Offset(32*11 + off) } func hsqr_v1(off int) Mem { return Mem{Base: SP}.Offset(32*12 + off) } func rsqr_v1(off int) Mem { return Mem{Base: SP}.Offset(32*13 + off) } func hcub_v1(off int) Mem { return Mem{Base: SP}.Offset(32*14 + off) } var ( rptr_v1 Mem = Mem{Base: SP}.Offset(32*15 + 0) sel_save_v1 = Mem{Base: SP}.Offset(32*15 + 8) zero_save_v1 = Mem{Base: SP}.Offset(32*15 + 8 + 4) ) // Implements: // // func p256PointAddAffineAsm(res, in1 *P256Point, in2 *p256AffinePoint, sign, sel, zero int) func p256PointAddAffineAsm() { Implement("p256PointAddAffineAsm") AllocLocal(512) Load(Param("res"), RAX) Load(Param("in1"), RBX) Load(Param("in2"), RCX) Load(Param("sign"), RDX) Load(Param("sel"), t1_v2) Load(Param("zero"), t2_v2) MOVOU(Mem{Base: BX}.Offset(16*0), X0) MOVOU(Mem{Base: BX}.Offset(16*1), X1) MOVOU(Mem{Base: BX}.Offset(16*2), X2) MOVOU(Mem{Base: BX}.Offset(16*3), X3) MOVOU(Mem{Base: BX}.Offset(16*4), X4) MOVOU(Mem{Base: BX}.Offset(16*5), X5) MOVOU(X0, x1in_v1(16*0)) MOVOU(X1, x1in_v1(16*1)) MOVOU(X2, y1in_v1(16*0)) MOVOU(X3, y1in_v1(16*1)) MOVOU(X4, z1in_v1(16*0)) MOVOU(X5, z1in_v1(16*1)) MOVOU(Mem{Base: CX}.Offset(16*0), X0) MOVOU(Mem{Base: CX}.Offset(16*1), X1) MOVOU(X0, x2in_v1(16*0)) MOVOU(X1, x2in_v1(16*1)) Comment("Store pointer to result") MOVQ(mul0_v2, rptr_v1) // Hack to get Avo to emit: // MOVL t1, sel_save_v1 Instruction(&ir.Instruction{ Opcode: "MOVL", Operands: []Op{t1_v2, sel_save_v1}, }) // Hack to get Avo to emit: // MOVL t2_v2, zero_save_v1 Instruction(&ir.Instruction{ Opcode: "MOVL", Operands: []Op{t2_v2, zero_save_v1}, }) Comment("Negate y2in based on sign") MOVQ(Mem{Base: CX}.Offset(16*2+8*0), acc4_v2) MOVQ(Mem{Base: CX}.Offset(16*2+8*1), acc5_v2) MOVQ(Mem{Base: CX}.Offset(16*2+8*2), acc6_v2) MOVQ(Mem{Base: CX}.Offset(16*2+8*3), acc7_v2) MOVQ(I32(-1), acc0_v2) p256const0 := p256const0_DATA() MOVQ(p256const0, acc1_v2) MOVQ(U32(0), acc2_v2) p256const1 := p256const1_DATA() MOVQ(p256const1, acc3_v2) XORQ(mul0_v2, mul0_v2) Comment("Speculatively subtract") SUBQ(acc4_v2, acc0_v2) SBBQ(acc5_v2, acc1_v2) SBBQ(acc6_v2, acc2_v2) SBBQ(acc7_v2, acc3_v2) SBBQ(Imm(0), mul0_v2) MOVQ(acc0_v2, t0_v2) MOVQ(acc1_v2, t1_v2) MOVQ(acc2_v2, t2_v2) MOVQ(acc3_v2, t3_v2) Comment("Add in case the operand was > p256") ADDQ(I8(-1), acc0_v2) ADCQ(p256const0, acc1_v2) ADCQ(Imm(0), acc2_v2) ADCQ(p256const1, acc3_v2) ADCQ(Imm(0), mul0_v2) CMOVQNE(t0_v2, acc0_v2) CMOVQNE(t1_v2, acc1_v2) CMOVQNE(t2_v2, acc2_v2) CMOVQNE(t3_v2, acc3_v2) Comment("If condition is 0, keep original value") TESTQ(RDX, RDX) CMOVQEQ(acc4_v2, acc0_v2) CMOVQEQ(acc5_v2, acc1_v2) CMOVQEQ(acc6_v2, acc2_v2) CMOVQEQ(acc7_v2, acc3_v2) Comment("Store result") MOVQ(acc0_v2, y2in_v1(8*0)) MOVQ(acc1_v2, y2in_v1(8*1)) MOVQ(acc2_v2, y2in_v1(8*2)) MOVQ(acc3_v2, y2in_v1(8*3)) Comment("Begin point add") LDacc(z1in_v1) CALL(LabelRef("p256SqrInternal(SB)")) // z1ˆ2 ST(z1sqr_v1) LDt(x2in_v1) CALL(LabelRef("p256MulInternal(SB)")) // x2 * z1ˆ2 LDt(x1in_v1) CALL(LabelRef("p256SubInternal(SB)")) // h = u2 - u1) ST(h_v1) LDt(z1in_v1) CALL(LabelRef("p256MulInternal(SB)")) // z3 = h * z1 ST(zout_v1) LDacc(z1sqr_v1) CALL(LabelRef("p256MulInternal(SB)")) // z1ˆ3 LDt(y2in_v1) CALL(LabelRef("p256MulInternal(SB)")) // s2 = y2 * z1ˆ3 ST(s2_v1) LDt(y1in_v1) CALL(LabelRef("p256SubInternal(SB)")) // r = s2 - s1) ST(r_v1) CALL(LabelRef("p256SqrInternal(SB)")) // rsqr = rˆ2 ST(rsqr_v1) LDacc(h_v1) CALL(LabelRef("p256SqrInternal(SB)")) // hsqr = hˆ2 ST(hsqr_v1) LDt(h_v1) CALL(LabelRef("p256MulInternal(SB)")) // hcub = hˆ3 ST(hcub_v1) LDt(y1in_v1) CALL(LabelRef("p256MulInternal(SB)")) // y1 * hˆ3 ST(s2_v1) LDacc(x1in_v1) LDt(hsqr_v1) CALL(LabelRef("p256MulInternal(SB)")) // u1 * hˆ2 ST(h_v1) p256MulBy2Inline() // u1 * hˆ2 * 2, inline LDacc(rsqr_v1) CALL(LabelRef("p256SubInternal(SB)")) // rˆ2 - u1 * hˆ2 * 2) LDt(hcub_v1) CALL(LabelRef("p256SubInternal(SB)")) ST(xout_v1) MOVQ(acc4_v2, t0_v2) MOVQ(acc5_v2, t1_v2) MOVQ(acc6_v2, t2_v2) MOVQ(acc7_v2, t3_v2) LDacc(h_v1) CALL(LabelRef("p256SubInternal(SB)")) LDt(r_v1) CALL(LabelRef("p256MulInternal(SB)")) LDt(s2_v1) CALL(LabelRef("p256SubInternal(SB)")) ST(yout_v1) Comment("Load stored values from stack") MOVQ(rptr_v1, RAX) MOVL(sel_save_v1, EBX) MOVL(zero_save_v1, ECX) Comment("The result is not valid if (sel == 0), conditional choose") MOVOU(xout_v1(16*0), X0) MOVOU(xout_v1(16*1), X1) MOVOU(yout_v1(16*0), X2) MOVOU(yout_v1(16*1), X3) MOVOU(zout_v1(16*0), X4) MOVOU(zout_v1(16*1), X5) // Hack to get Avo to emit: // MOVL BX, X6 Instruction(&ir.Instruction{ Opcode: "MOVL", Operands: []Op{EBX, X6}, }) // Hack to get Avo to emit: // MOVL CX, X7 Instruction(&ir.Instruction{ Opcode: "MOVL", Operands: []Op{ECX, X7}, }) PXOR(X8, X8) PCMPEQL(X9, X9) PSHUFD(Imm(0), X6, X6) PSHUFD(Imm(0), X7, X7) PCMPEQL(X8, X6) PCMPEQL(X8, X7) MOVOU(X6, X15) PANDN(X9, X15) MOVOU(x1in_v1(16*0), X9) MOVOU(x1in_v1(16*1), X10) MOVOU(y1in_v1(16*0), X11) MOVOU(y1in_v1(16*1), X12) MOVOU(z1in_v1(16*0), X13) MOVOU(z1in_v1(16*1), X14) PAND(X15, X0) PAND(X15, X1) PAND(X15, X2) PAND(X15, X3) PAND(X15, X4) PAND(X15, X5) PAND(X6, X9) PAND(X6, X10) PAND(X6, X11) PAND(X6, X12) PAND(X6, X13) PAND(X6, X14) PXOR(X9, X0) PXOR(X10, X1) PXOR(X11, X2) PXOR(X12, X3) PXOR(X13, X4) PXOR(X14, X5) Comment("Similarly if zero == 0") PCMPEQL(X9, X9) MOVOU(X7, X15) PANDN(X9, X15) MOVOU(x2in_v1(16*0), X9) MOVOU(x2in_v1(16*1), X10) MOVOU(y2in_v1(16*0), X11) MOVOU(y2in_v1(16*1), X12) p256one := p256one_DATA() MOVOU(p256one.Offset(0x00), X13) MOVOU(p256one.Offset(0x10), X14) PAND(X15, X0) PAND(X15, X1) PAND(X15, X2) PAND(X15, X3) PAND(X15, X4) PAND(X15, X5) PAND(X7, X9) PAND(X7, X10) PAND(X7, X11) PAND(X7, X12) PAND(X7, X13) PAND(X7, X14) PXOR(X9, X0) PXOR(X10, X1) PXOR(X11, X2) PXOR(X12, X3) PXOR(X13, X4) PXOR(X14, X5) Comment("Finally output the result") MOVOU(X0, Mem{Base: AX}.Offset(16*0)) MOVOU(X1, Mem{Base: AX}.Offset(16*1)) MOVOU(X2, Mem{Base: AX}.Offset(16*2)) MOVOU(X3, Mem{Base: AX}.Offset(16*3)) MOVOU(X4, Mem{Base: AX}.Offset(16*4)) MOVOU(X5, Mem{Base: AX}.Offset(16*5)) MOVQ(U32(0), rptr_v1) RET() } // p256IsZero returns 1 in AX if [acc4..acc7] represents zero and zero // otherwise. It writes to [acc4..acc7], t0 and t1. func p256IsZero() { Function("p256IsZero") Attributes(NOSPLIT) Comment("AX contains a flag that is set if the input is zero.") XORQ(RAX, RAX) MOVQ(U32(1), t1_v2) Comment("Check whether [acc4..acc7] are all zero.") MOVQ(acc4_v2, t0_v2) ORQ(acc5_v2, t0_v2) ORQ(acc6_v2, t0_v2) ORQ(acc7_v2, t0_v2) Comment("Set the zero flag if so. (CMOV of a constant to a register doesn't") Comment("appear to be supported in Go. Thus t1 = 1.)") CMOVQEQ(t1_v2, RAX) Comment("XOR [acc4..acc7] with P and compare with zero again.") XORQ(I8(-1), acc4_v2) p256const0 := p256const0_DATA() XORQ(p256const0, acc5_v2) p256const1 := p256const1_DATA() XORQ(p256const1, acc7_v2) ORQ(acc5_v2, acc4_v2) ORQ(acc6_v2, acc4_v2) ORQ(acc7_v2, acc4_v2) Comment("Set the zero flag if so.") CMOVQEQ(t1_v2, RAX) RET() } func x1in_v2(off int) Mem { return Mem{Base: SP}.Offset(32*0 + off) } func y1in_v2(off int) Mem { return Mem{Base: SP}.Offset(32*1 + off) } func z1in_v2(off int) Mem { return Mem{Base: SP}.Offset(32*2 + off) } func x2in_v2(off int) Mem { return Mem{Base: SP}.Offset(32*3 + off) } func y2in_v2(off int) Mem { return Mem{Base: SP}.Offset(32*4 + off) } func z2in_v2(off int) Mem { return Mem{Base: SP}.Offset(32*5 + off) } func xout_v2(off int) Mem { return Mem{Base: SP}.Offset(32*6 + off) } func yout_v2(off int) Mem { return Mem{Base: SP}.Offset(32*7 + off) } func zout_v2(off int) Mem { return Mem{Base: SP}.Offset(32*8 + off) } func u1_v2(off int) Mem { return Mem{Base: SP}.Offset(32*9 + off) } func u2_v2(off int) Mem { return Mem{Base: SP}.Offset(32*10 + off) } func s1_v2(off int) Mem { return Mem{Base: SP}.Offset(32*11 + off) } func s2_v2(off int) Mem { return Mem{Base: SP}.Offset(32*12 + off) } func z1sqr_v2(off int) Mem { return Mem{Base: SP}.Offset(32*13 + off) } func z2sqr_v2(off int) Mem { return Mem{Base: SP}.Offset(32*14 + off) } func h_v2(off int) Mem { return Mem{Base: SP}.Offset(32*15 + off) } func r_v2(off int) Mem { return Mem{Base: SP}.Offset(32*16 + off) } func hsqr_v2(off int) Mem { return Mem{Base: SP}.Offset(32*17 + off) } func rsqr_v2(off int) Mem { return Mem{Base: SP}.Offset(32*18 + off) } func hcub_v2(off int) Mem { return Mem{Base: SP}.Offset(32*19 + off) } var ( rptr_v2 Mem = Mem{Base: SP}.Offset(32 * 20) points_eq_v2 = Mem{Base: SP}.Offset(32*20 + 8) ) // Implements: // // func p256PointAddAsm(res, in1, in2 *P256Point) int // // See https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-2007-bl func p256PointAddAsm() { Implement("p256PointAddAsm") AllocLocal(680) Comment("Move input to stack in order to free registers") Load(Param("res"), RAX) Load(Param("in1"), RBX) Load(Param("in2"), RCX) MOVOU(Mem{Base: BX}.Offset(16*0), X0) MOVOU(Mem{Base: BX}.Offset(16*1), X1) MOVOU(Mem{Base: BX}.Offset(16*2), X2) MOVOU(Mem{Base: BX}.Offset(16*3), X3) MOVOU(Mem{Base: BX}.Offset(16*4), X4) MOVOU(Mem{Base: BX}.Offset(16*5), X5) MOVOU(X0, x1in_v2(16*0)) MOVOU(X1, x1in_v2(16*1)) MOVOU(X2, y1in_v2(16*0)) MOVOU(X3, y1in_v2(16*1)) MOVOU(X4, z1in_v2(16*0)) MOVOU(X5, z1in_v2(16*1)) MOVOU(Mem{Base: CX}.Offset(16*0), X0) MOVOU(Mem{Base: CX}.Offset(16*1), X1) MOVOU(Mem{Base: CX}.Offset(16*2), X2) MOVOU(Mem{Base: CX}.Offset(16*3), X3) MOVOU(Mem{Base: CX}.Offset(16*4), X4) MOVOU(Mem{Base: CX}.Offset(16*5), X5) MOVOU(X0, x2in_v2(16*0)) MOVOU(X1, x2in_v2(16*1)) MOVOU(X2, y2in_v2(16*0)) MOVOU(X3, y2in_v2(16*1)) MOVOU(X4, z2in_v2(16*0)) MOVOU(X5, z2in_v2(16*1)) Comment("Store pointer to result") MOVQ(RAX, rptr_v2) Comment("Begin point add") LDacc(z2in_v2) CALL(LabelRef("p256SqrInternal(SB)")) // z2ˆ2 ST(z2sqr_v2) LDt(z2in_v2) CALL(LabelRef("p256MulInternal(SB)")) // z2ˆ3 LDt(y1in_v2) CALL(LabelRef("p256MulInternal(SB)")) // s1 = z2ˆ3*y1 ST(s1_v2) LDacc(z1in_v2) CALL(LabelRef("p256SqrInternal(SB)")) // z1ˆ2 ST(z1sqr_v2) LDt(z1in_v2) CALL(LabelRef("p256MulInternal(SB)")) // z1ˆ3 LDt(y2in_v2) CALL(LabelRef("p256MulInternal(SB)")) // s2 = z1ˆ3*y2 ST(s2_v2) LDt(s1_v2) CALL(LabelRef("p256SubInternal(SB)")) // r = s2 - s1 ST(r_v2) CALL(LabelRef("p256IsZero(SB)")) MOVQ(RAX, points_eq_v2) LDacc(z2sqr_v2) LDt(x1in_v2) CALL(LabelRef("p256MulInternal(SB)")) // u1 = x1 * z2ˆ2 ST(u1_v2) LDacc(z1sqr_v2) LDt(x2in_v2) CALL(LabelRef("p256MulInternal(SB)")) // u2 = x2 * z1ˆ2 ST(u2_v2) LDt(u1_v2) CALL(LabelRef("p256SubInternal(SB)")) // h = u2 - u1 ST(h_v2) CALL(LabelRef("p256IsZero(SB)")) ANDQ(points_eq_v2, RAX) MOVQ(RAX, points_eq_v2) LDacc(r_v2) CALL(LabelRef("p256SqrInternal(SB)")) // rsqr = rˆ2 ST(rsqr_v2) LDacc(h_v2) CALL(LabelRef("p256SqrInternal(SB)")) // hsqr = hˆ2 ST(hsqr_v2) LDt(h_v2) CALL(LabelRef("p256MulInternal(SB)")) // hcub = hˆ3 ST(hcub_v2) LDt(s1_v2) CALL(LabelRef("p256MulInternal(SB)")) ST(s2_v2) LDacc(z1in_v2) LDt(z2in_v2) CALL(LabelRef("p256MulInternal(SB)")) // z1 * z2 LDt(h_v2) CALL(LabelRef("p256MulInternal(SB)")) // z1 * z2 * h ST(zout_v2) LDacc(hsqr_v2) LDt(u1_v2) CALL(LabelRef("p256MulInternal(SB)")) // hˆ2 * u1 ST(u2_v2) p256MulBy2Inline() // u1 * hˆ2 * 2, inline LDacc(rsqr_v2) CALL(LabelRef("p256SubInternal(SB)")) // rˆ2 - u1 * hˆ2 * 2 LDt(hcub_v2) CALL(LabelRef("p256SubInternal(SB)")) ST(xout_v2) MOVQ(acc4_v2, t0_v2) MOVQ(acc5_v2, t1_v2) MOVQ(acc6_v2, t2_v2) MOVQ(acc7_v2, t3_v2) LDacc(u2_v2) CALL(LabelRef("p256SubInternal(SB)")) LDt(r_v2) CALL(LabelRef("p256MulInternal(SB)")) LDt(s2_v2) CALL(LabelRef("p256SubInternal(SB)")) ST(yout_v2) MOVOU(xout_v2(16*0), X0) MOVOU(xout_v2(16*1), X1) MOVOU(yout_v2(16*0), X2) MOVOU(yout_v2(16*1), X3) MOVOU(zout_v2(16*0), X4) MOVOU(zout_v2(16*1), X5) Comment("Finally output the result") MOVQ(rptr_v2, RAX) MOVQ(U32(0), rptr_v2) MOVOU(X0, Mem{Base: AX}.Offset(16*0)) MOVOU(X1, Mem{Base: AX}.Offset(16*1)) MOVOU(X2, Mem{Base: AX}.Offset(16*2)) MOVOU(X3, Mem{Base: AX}.Offset(16*3)) MOVOU(X4, Mem{Base: AX}.Offset(16*4)) MOVOU(X5, Mem{Base: AX}.Offset(16*5)) MOVQ(points_eq_v2, RAX) ret := NewParamAddr("ret", 24) MOVQ(RAX, ret) RET() } func x(off int) Mem { return Mem{Base: SP}.Offset(32*0 + off) } func y(off int) Mem { return Mem{Base: SP}.Offset(32*1 + off) } func z(off int) Mem { return Mem{Base: SP}.Offset(32*2 + off) } func s(off int) Mem { return Mem{Base: SP}.Offset(32*3 + off) } func m(off int) Mem { return Mem{Base: SP}.Offset(32*4 + off) } func zsqr(off int) Mem { return Mem{Base: SP}.Offset(32*5 + off) } func tmp(off int) Mem { return Mem{Base: SP}.Offset(32*6 + off) } var rptr_v3 = Mem{Base: SP}.Offset(32 * 7) // Implements: // // func p256PointDoubleAsm(res, in *P256Point) func p256PointDoubleAsm() { Implement("p256PointDoubleAsm") Attributes(NOSPLIT) AllocLocal(256) Load(Param("res"), RAX) Load(Param("in"), RBX) MOVOU(Mem{Base: BX}.Offset(16*0), X0) MOVOU(Mem{Base: BX}.Offset(16*1), X1) MOVOU(Mem{Base: BX}.Offset(16*2), X2) MOVOU(Mem{Base: BX}.Offset(16*3), X3) MOVOU(Mem{Base: BX}.Offset(16*4), X4) MOVOU(Mem{Base: BX}.Offset(16*5), X5) MOVOU(X0, x(16*0)) MOVOU(X1, x(16*1)) MOVOU(X2, y(16*0)) MOVOU(X3, y(16*1)) MOVOU(X4, z(16*0)) MOVOU(X5, z(16*1)) Comment("Store pointer to result") MOVQ(RAX, rptr_v3) Comment("Begin point double") LDacc(z) CALL(LabelRef("p256SqrInternal(SB)")) ST(zsqr) LDt(x) p256AddInline() STt(m) LDacc(z) LDt(y) CALL(LabelRef("p256MulInternal(SB)")) p256MulBy2Inline() MOVQ(rptr_v3, RAX) Comment("Store z") MOVQ(t0_v2, Mem{Base: AX}.Offset(16*4+8*0)) MOVQ(t1_v2, Mem{Base: AX}.Offset(16*4+8*1)) MOVQ(t2_v2, Mem{Base: AX}.Offset(16*4+8*2)) MOVQ(t3_v2, Mem{Base: AX}.Offset(16*4+8*3)) LDacc(x) LDt(zsqr) CALL(LabelRef("p256SubInternal(SB)")) LDt(m) CALL(LabelRef("p256MulInternal(SB)")) ST(m) Comment("Multiply by 3") p256MulBy2Inline() LDacc(m) p256AddInline() STt(m) Comment("////////////////////////") LDacc(y) p256MulBy2Inline() t2acc() CALL(LabelRef("p256SqrInternal(SB)")) ST(s) CALL(LabelRef("p256SqrInternal(SB)")) Comment("Divide by 2") XORQ(mul0_v2, mul0_v2) MOVQ(acc4_v2, t0_v2) MOVQ(acc5_v2, t1_v2) MOVQ(acc6_v2, t2_v2) MOVQ(acc7_v2, t3_v2) ADDQ(I8(-1), acc4_v2) p256const0 := p256const0_DATA() ADCQ(p256const0, acc5_v2) ADCQ(Imm(0), acc6_v2) p256const1 := p256const1_DATA() ADCQ(p256const1, acc7_v2) ADCQ(Imm(0), mul0_v2) TESTQ(U32(1), t0_v2) CMOVQEQ(t0_v2, acc4_v2) CMOVQEQ(t1_v2, acc5_v2) CMOVQEQ(t2_v2, acc6_v2) CMOVQEQ(t3_v2, acc7_v2) ANDQ(t0_v2, mul0_v2) SHRQ(Imm(1), acc5_v2, acc4_v2) SHRQ(Imm(1), acc6_v2, acc5_v2) SHRQ(Imm(1), acc7_v2, acc6_v2) SHRQ(Imm(1), mul0_v2, acc7_v2) ST(y) Comment("/////////////////////////") LDacc(x) LDt(s) CALL(LabelRef("p256MulInternal(SB)")) ST(s) p256MulBy2Inline() STt(tmp) LDacc(m) CALL(LabelRef("p256SqrInternal(SB)")) LDt(tmp) CALL(LabelRef("p256SubInternal(SB)")) MOVQ(rptr_v3, RAX) Comment("Store x") MOVQ(acc4_v2, Mem{Base: AX}.Offset(16*0+8*0)) MOVQ(acc5_v2, Mem{Base: AX}.Offset(16*0+8*1)) MOVQ(acc6_v2, Mem{Base: AX}.Offset(16*0+8*2)) MOVQ(acc7_v2, Mem{Base: AX}.Offset(16*0+8*3)) acc2t() LDacc(s) CALL(LabelRef("p256SubInternal(SB)")) LDt(m) CALL(LabelRef("p256MulInternal(SB)")) LDt(y) CALL(LabelRef("p256SubInternal(SB)")) MOVQ(rptr_v3, RAX) Comment("Store y") MOVQ(acc4_v2, Mem{Base: AX}.Offset(16*2+8*0)) MOVQ(acc5_v2, Mem{Base: AX}.Offset(16*2+8*1)) MOVQ(acc6_v2, Mem{Base: AX}.Offset(16*2+8*2)) MOVQ(acc7_v2, Mem{Base: AX}.Offset(16*2+8*3)) Comment("///////////////////////") MOVQ(U32(0), rptr_v3) RET() } // #----------------------------DATA SECTION-----------------------------------## // Pointers for memoizing Data section symbols var p256const0_ptr, p256const1_ptr, p256ordK0_ptr, p256ord_ptr, p256one_ptr *Mem func p256const0_DATA() Mem { if p256const0_ptr != nil { return *p256const0_ptr } p256const0 := GLOBL("p256const0", 8) p256const0_ptr = &p256const0 DATA(0, U64(0x00000000ffffffff)) return p256const0 } func p256const1_DATA() Mem { if p256const1_ptr != nil { return *p256const1_ptr } p256const1 := GLOBL("p256const1", 8) p256const1_ptr = &p256const1 DATA(0, U64(0xffffffff00000001)) return p256const1 } func p256ordK0_DATA() Mem { if p256ordK0_ptr != nil { return *p256ordK0_ptr } p256ordK0 := GLOBL("p256ordK0", 8) p256ordK0_ptr = &p256ordK0 DATA(0, U64(0xccd1c8aaee00bc4f)) return p256ordK0 } var p256ordConstants = [4]uint64{ 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000, } func p256ord_DATA() Mem { if p256ord_ptr != nil { return *p256ord_ptr } p256ord := GLOBL("p256ord", 8) p256ord_ptr = &p256ord for i, k := range p256ordConstants { DATA(i*8, U64(k)) } return p256ord } var p256oneConstants = [4]uint64{ 0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe, } func p256one_DATA() Mem { if p256one_ptr != nil { return *p256one_ptr } p256one := GLOBL("p256one", 8) p256one_ptr = &p256one for i, k := range p256oneConstants { DATA(i*8, U64(k)) } return p256one } const ThatPeskyUnicodeDot = "\u00b7" // removePeskyUnicodeDot strips the dot from the relevant TEXT directives such that they // can exist as internal assembly functions // // Avo v0.6.0 does not support the generation of internal assembly functions. Go's unicode // dot tells the compiler to link a TEXT symbol to a function in the current Go package // (or another package if specified). Avo unconditionally prepends the unicode dot to all // TEXT symbols, making it impossible to emit an internal function without this hack. // // There is a pending PR to add internal functions to Avo: // https://github.com/mmcloughlin/avo/pull/443 // // If merged it should allow the usage of InternalFunction("NAME") for the specified functions func removePeskyUnicodeDot(internalFunctions []string, target string) { bytes, err := os.ReadFile(target) if err != nil { panic(err) } content := string(bytes) for _, from := range internalFunctions { to := strings.ReplaceAll(from, ThatPeskyUnicodeDot, "") content = strings.ReplaceAll(content, from, to) } err = os.WriteFile(target, []byte(content), 0644) if err != nil { panic(err) } } golang-filippo-nistec-0.0.4/benchmark_test.go000066400000000000000000000031771512422514700212400ustar00rootroot00000000000000// Copyright 2024 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package nistec_test import ( "crypto/rand" "testing" "filippo.io/nistec" ) func BenchmarkScalarMult(b *testing.B) { b.Run("P224", func(b *testing.B) { benchmarkScalarMult(b, nistec.NewP224Point().SetGenerator(), 28) }) b.Run("P256", func(b *testing.B) { benchmarkScalarMult(b, nistec.NewP256Point().SetGenerator(), 32) }) b.Run("P384", func(b *testing.B) { benchmarkScalarMult(b, nistec.NewP384Point().SetGenerator(), 48) }) b.Run("P521", func(b *testing.B) { benchmarkScalarMult(b, nistec.NewP521Point().SetGenerator(), 66) }) } func benchmarkScalarMult[P nistPoint[P]](b *testing.B, p P, scalarSize int) { scalar := make([]byte, scalarSize) rand.Read(scalar) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { p.ScalarMult(p, scalar) } } func BenchmarkScalarBaseMult(b *testing.B) { b.Run("P224", func(b *testing.B) { benchmarkScalarBaseMult(b, nistec.NewP224Point().SetGenerator(), 28) }) b.Run("P256", func(b *testing.B) { benchmarkScalarBaseMult(b, nistec.NewP256Point().SetGenerator(), 32) }) b.Run("P384", func(b *testing.B) { benchmarkScalarBaseMult(b, nistec.NewP384Point().SetGenerator(), 48) }) b.Run("P521", func(b *testing.B) { benchmarkScalarBaseMult(b, nistec.NewP521Point().SetGenerator(), 66) }) } func benchmarkScalarBaseMult[P nistPoint[P]](b *testing.B, p P, scalarSize int) { scalar := make([]byte, scalarSize) rand.Read(scalar) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { p.ScalarBaseMult(scalar) } } golang-filippo-nistec-0.0.4/extra.go000066400000000000000000000046511512422514700173700ustar00rootroot00000000000000// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package nistec import "filippo.io/nistec/internal/fiat" // Negate sets p = -q and returns p. func (p *P224Point) Negate(q *P224Point) *P224Point { p.x.Set(q.x) p.y.Sub(new(fiat.P224Element), q.y) p.z.Set(q.z) return p } // Negate sets p = -q and returns p. func (p *P384Point) Negate(q *P384Point) *P384Point { p.x.Set(q.x) p.y.Sub(new(fiat.P384Element), q.y) p.z.Set(q.z) return p } // Negate sets p = -q and returns p. func (p *P521Point) Negate(q *P521Point) *P521Point { p.x.Set(q.x) p.y.Sub(new(fiat.P521Element), q.y) p.z.Set(q.z) return p } // IsInfinity returns 1 if p is the point-at-infinity, 0 otherwise. func (p *P224Point) IsInfinity() int { return p.z.IsZero() } // IsInfinity returns 1 if p is the point-at-infinity, 0 otherwise. func (p *P384Point) IsInfinity() int { return p.z.IsZero() } // IsInfinity returns 1 if p is the point-at-infinity, 0 otherwise. func (p *P521Point) IsInfinity() int { return p.z.IsZero() } // Equal returns 1 if p and q represent the same point, 0 otherwise. func (p *P224Point) Equal(q *P224Point) int { pinf := p.z.IsZero() qinf := q.z.IsZero() bothinf := pinf & qinf noneinf := (1 - pinf) & (1 - qinf) px := new(fiat.P224Element).Mul(p.x, q.z) qx := new(fiat.P224Element).Mul(q.x, p.z) py := new(fiat.P224Element).Mul(p.y, q.z) qy := new(fiat.P224Element).Mul(q.y, p.z) return bothinf | (noneinf & px.Equal(qx) & py.Equal(qy)) } // Equal returns 1 if p and q represent the same point, 0 otherwise. func (p *P384Point) Equal(q *P384Point) int { pinf := p.z.IsZero() qinf := q.z.IsZero() bothinf := pinf & qinf noneinf := (1 - pinf) & (1 - qinf) px := new(fiat.P384Element).Mul(p.x, q.z) qx := new(fiat.P384Element).Mul(q.x, p.z) py := new(fiat.P384Element).Mul(p.y, q.z) qy := new(fiat.P384Element).Mul(q.y, p.z) return bothinf | (noneinf & px.Equal(qx) & py.Equal(qy)) } // Equal returns 1 if p and q represent the same point, 0 otherwise. func (p *P521Point) Equal(q *P521Point) int { pinf := p.z.IsZero() qinf := q.z.IsZero() bothinf := pinf & qinf noneinf := (1 - pinf) & (1 - qinf) px := new(fiat.P521Element).Mul(p.x, q.z) qx := new(fiat.P521Element).Mul(q.x, p.z) py := new(fiat.P521Element).Mul(p.y, q.z) qy := new(fiat.P521Element).Mul(q.y, p.z) return bothinf | (noneinf & px.Equal(qx) & py.Equal(qy)) } golang-filippo-nistec-0.0.4/extra_asm.go000066400000000000000000000032071512422514700202240ustar00rootroot00000000000000// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build !purego && (amd64 || arm64 || ppc64le || s390x) package nistec import "filippo.io/nistec/internal/fiat" // Negate sets p = -q and returns p. func (p *P256Point) Negate(q *P256Point) *P256Point { // fiat.P256Element is a little-endian Montgomery domain fully-reduced // element, like p256Element, so they are actually interchangable. qy := new(fiat.P256Element) *qy.Bits() = q.y py := new(fiat.P256Element).Sub(new(fiat.P256Element), qy) p.x = q.x p.y = *py.Bits() p.z = q.z return p } // IsInfinity returns 1 if p is the point-at-infinity, 0 otherwise. func (p *P256Point) IsInfinity() int { return p.isInfinity() } // Equal returns 1 if p and q represent the same point, 0 otherwise. func (p *P256Point) Equal(q *P256Point) int { pinf := p256Equal(&p.z, &p256Zero) qinf := p256Equal(&q.z, &p256Zero) bothinf := pinf & qinf noneinf := (1 - pinf) & (1 - qinf) // xp = Xp / Zp² // yp = Yp / Zp³ // xq = Xq / Zq² // yq = Yq / Zq³ // If Zp != 0 and Zq != 0, then: // xp == yp <=> Xp*Zq² == Xq*Zp² // xq == yq <=> Yp*Zq³ == Yq*Zp³ px := new(p256Element) qx := new(p256Element) py := new(p256Element) qy := new(p256Element) pz := new(p256Element) qz := new(p256Element) p256Sqr(pz, &p.z, 1) p256Sqr(qz, &q.z, 1) p256Mul(px, &p.x, qz) p256Mul(qx, &q.x, pz) samex := p256Equal(px, qx) p256Mul(pz, pz, &p.z) p256Mul(qz, qz, &q.z) p256Mul(py, &p.y, qz) p256Mul(qy, &q.y, pz) samey := p256Equal(py, qy) return bothinf | (noneinf & samex & samey) } golang-filippo-nistec-0.0.4/extra_noasm.go000066400000000000000000000020231512422514700205540ustar00rootroot00000000000000// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build purego || (!amd64 && !arm64 && !ppc64le && !s390x) package nistec import "filippo.io/nistec/internal/fiat" // Negate sets p = -q and returns p. func (p *P256Point) Negate(q *P256Point) *P256Point { p.x.Set(&q.x) p.y.Sub(new(fiat.P256Element), &q.y) p.z.Set(&q.z) return p } // IsInfinity returns 1 if p is the point-at-infinity, 0 otherwise. func (p *P256Point) IsInfinity() int { return p.z.IsZero() } // Equal returns 1 if p and q represent the same point, 0 otherwise. func (p *P256Point) Equal(q *P256Point) int { pinf := p.z.IsZero() qinf := q.z.IsZero() bothinf := pinf & qinf noneinf := (1 - pinf) & (1 - qinf) px := new(fiat.P256Element).Mul(&p.x, &q.z) qx := new(fiat.P256Element).Mul(&q.x, &p.z) py := new(fiat.P256Element).Mul(&p.y, &q.z) qy := new(fiat.P256Element).Mul(&q.y, &p.z) return bothinf | (noneinf & px.Equal(qx) & py.Equal(qy)) } golang-filippo-nistec-0.0.4/extra_norace_test.go000066400000000000000000000001011512422514700217400ustar00rootroot00000000000000//go:build !race package nistec_test const raceEnabled = false golang-filippo-nistec-0.0.4/extra_race_test.go000066400000000000000000000000771512422514700214170ustar00rootroot00000000000000//go:build race package nistec_test const raceEnabled = true golang-filippo-nistec-0.0.4/extra_test.go000066400000000000000000000077411512422514700204320ustar00rootroot00000000000000// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package nistec_test import ( "bytes" "crypto/elliptic" "math/big" "testing" "filippo.io/nistec" ) type nistPointExtra[T any] interface { Bytes() []byte SetGenerator() T SetBytes([]byte) (T, error) Set(T) T Add(T, T) T Double(T) T Negate(T) T ScalarMult(T, []byte) (T, error) ScalarBaseMult([]byte) (T, error) IsInfinity() int Equal(T) int } func TestNegate(t *testing.T) { t.Run("P224", func(t *testing.T) { testNegate(t, nistec.NewP224Point, elliptic.P224()) }) t.Run("P256", func(t *testing.T) { testNegate(t, nistec.NewP256Point, elliptic.P256()) }) t.Run("P384", func(t *testing.T) { testNegate(t, nistec.NewP384Point, elliptic.P384()) }) t.Run("P521", func(t *testing.T) { testNegate(t, nistec.NewP521Point, elliptic.P521()) }) } func testNegate[P nistPointExtra[P]](t *testing.T, newPoint func() P, c elliptic.Curve) { p := newPoint().SetGenerator() p.Add(p, p) // make a test point with z != 1 p1 := newPoint().Negate(p) minusOne := new(big.Int).Sub(c.Params().N, big.NewInt(1)).Bytes() p2, err := newPoint().ScalarMult(p, minusOne) fatalIfErr(t, err) if !bytes.Equal(p1.Bytes(), p2.Bytes()) { t.Error("-P != [-1]P") } p.Negate(p) if !bytes.Equal(p.Bytes(), p1.Bytes()) { t.Error("-P (aliasing) != -P") } } func TestEqual(t *testing.T) { t.Run("P224", func(t *testing.T) { testEqual(t, nistec.NewP224Point, elliptic.P224()) }) t.Run("P256", func(t *testing.T) { testEqual(t, nistec.NewP256Point, elliptic.P256()) }) t.Run("P384", func(t *testing.T) { testEqual(t, nistec.NewP384Point, elliptic.P384()) }) t.Run("P521", func(t *testing.T) { testEqual(t, nistec.NewP521Point, elliptic.P521()) }) } func testEqual[P nistPointExtra[P]](t *testing.T, newPoint func() P, c elliptic.Curve) { inf := newPoint() g := newPoint().SetGenerator() g.Add(g, g) if inf.Equal(inf) != 1 { t.Error("inf != inf") } if g.Equal(g) != 1 { t.Error("G != G") } if inf.Equal(g) != 0 || g.Equal(inf) != 0 { t.Error("G == inf") } p1 := newPoint().Set(g) p2 := newPoint() p3 := newPoint() sc := make([]byte, (c.Params().N.BitLen()+7)>>3) for i := 1; i < 30; i++ { sc[len(sc)-1] = byte(i) _, err := p2.ScalarMult(g, sc) fatalIfErr(t, err) sc[len(sc)-1] = byte(i * 2) _, err = p3.ScalarBaseMult(sc) fatalIfErr(t, err) if p1.Equal(p2) != 1 || p2.Equal(p1) != 1 { t.Error("n*G != n*G (1)") } if p1.Equal(p3) != 1 || p3.Equal(p1) != 1 { t.Error("n*G != n*G (2)") } if p2.Equal(p3) != 1 || p3.Equal(p2) != 1 { t.Error("n*G != n*G (3)") } p1.Add(p1, g) if p1.Equal(g) != 0 || g.Equal(p1) != 0 { t.Error("n*G == G") } } } func TestInfinity(t *testing.T) { t.Run("P224", func(t *testing.T) { testInfinity(t, nistec.NewP224Point, elliptic.P224()) }) t.Run("P256", func(t *testing.T) { testInfinity(t, nistec.NewP256Point, elliptic.P256()) }) t.Run("P384", func(t *testing.T) { testInfinity(t, nistec.NewP384Point, elliptic.P384()) }) t.Run("P521", func(t *testing.T) { testInfinity(t, nistec.NewP521Point, elliptic.P521()) }) } func testInfinity[P nistPointExtra[P]](t *testing.T, newPoint func() P, c elliptic.Curve) { inf := newPoint() g := newPoint().SetGenerator() g.Add(g, g) if inf.IsInfinity() != 1 { t.Error("inf != inf") } if g.IsInfinity() != 0 { t.Error("G == inf") } p1 := newPoint().Set(g) p2 := newPoint() sc := make([]byte, (c.Params().N.BitLen()+7)>>3) for i := 1; i < 30; i++ { sc[len(sc)-1] = byte(i) _, err := p2.ScalarMult(g, sc) fatalIfErr(t, err) if p2.IsInfinity() != 0 { t.Error("n*G == inf (1)") } p2.Negate(p2) if p2.IsInfinity() != 0 { t.Error("n*G == inf (2)") } p2.Add(p2, p1) if p2.IsInfinity() != 1 { t.Error("n*G - n*G != inf") } p1.Add(p1, g) if p1.IsInfinity() != 0 { t.Error("n*G == inf (3)") } } } func fatalIfErr(t *testing.T, err error) { t.Helper() if err != nil { t.Fatal(err) } } golang-filippo-nistec-0.0.4/generate.go000066400000000000000000000466571512422514700200530ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build ignore package main // Running this generator requires addchain v0.4.0, which can be installed with // // go install github.com/mmcloughlin/addchain/cmd/addchain@v0.4.0 // import ( "bytes" "crypto/elliptic" "fmt" "go/format" "io" "log" "math/big" "os" "os/exec" "strings" "text/template" ) var curves = []struct { P string Element string Params *elliptic.CurveParams }{ { P: "P224", Element: "fiat.P224Element", Params: elliptic.P224().Params(), }, { P: "P384", Element: "fiat.P384Element", Params: elliptic.P384().Params(), }, { P: "P521", Element: "fiat.P521Element", Params: elliptic.P521().Params(), }, } func main() { t := template.Must(template.New("tmplNISTEC").Parse(tmplNISTEC)) tmplAddchainFile, err := os.CreateTemp("", "addchain-template") if err != nil { log.Fatal(err) } defer os.Remove(tmplAddchainFile.Name()) if _, err := io.WriteString(tmplAddchainFile, tmplAddchain); err != nil { log.Fatal(err) } if err := tmplAddchainFile.Close(); err != nil { log.Fatal(err) } for _, c := range curves { p := strings.ToLower(c.P) elementLen := (c.Params.BitSize + 7) / 8 B := fmt.Sprintf("%#v", c.Params.B.FillBytes(make([]byte, elementLen))) Gx := fmt.Sprintf("%#v", c.Params.Gx.FillBytes(make([]byte, elementLen))) Gy := fmt.Sprintf("%#v", c.Params.Gy.FillBytes(make([]byte, elementLen))) log.Printf("Generating %s.go...", p) f, err := os.Create(p + ".go") if err != nil { log.Fatal(err) } defer f.Close() buf := &bytes.Buffer{} if err := t.Execute(buf, map[string]interface{}{ "P": c.P, "p": p, "B": B, "Gx": Gx, "Gy": Gy, "Element": c.Element, "ElementLen": elementLen, }); err != nil { log.Fatal(err) } out, err := format.Source(buf.Bytes()) if err != nil { log.Fatal(err) } if _, err := f.Write(out); err != nil { log.Fatal(err) } // If p = 3 mod 4, implement modular square root by exponentiation. mod4 := new(big.Int).Mod(c.Params.P, big.NewInt(4)) if mod4.Cmp(big.NewInt(3)) != 0 { continue } exp := new(big.Int).Add(c.Params.P, big.NewInt(1)) exp.Div(exp, big.NewInt(4)) tmp, err := os.CreateTemp("", "addchain-"+p) if err != nil { log.Fatal(err) } defer os.Remove(tmp.Name()) cmd := exec.Command("addchain", "search", fmt.Sprintf("%d", exp)) cmd.Stderr = os.Stderr cmd.Stdout = tmp if err := cmd.Run(); err != nil { log.Fatal(err) } if err := tmp.Close(); err != nil { log.Fatal(err) } cmd = exec.Command("addchain", "gen", "-tmpl", tmplAddchainFile.Name(), tmp.Name()) cmd.Stderr = os.Stderr out, err = cmd.Output() if err != nil { log.Fatal(err) } out = bytes.Replace(out, []byte("Element"), []byte(c.Element), -1) out = bytes.Replace(out, []byte("sqrtCandidate"), []byte(p+"SqrtCandidate"), -1) out, err = format.Source(out) if err != nil { log.Fatal(err) } if _, err := f.Write(out); err != nil { log.Fatal(err) } } } const tmplNISTEC = `// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by generate.go. DO NOT EDIT. package nistec import ( "crypto/subtle" "errors" "sync" "filippo.io/nistec/internal/fiat" ) // {{.p}}ElementLength is the length of an element of the base or scalar field, // which have the same bytes length for all NIST P curves. const {{.p}}ElementLength = {{ .ElementLen }} // {{.P}}Point is a {{.P}} point. The zero value is NOT valid. type {{.P}}Point struct { // The point is represented in projective coordinates (X:Y:Z), // where x = X/Z and y = Y/Z. x, y, z *{{.Element}} } // New{{.P}}Point returns a new {{.P}}Point representing the point at infinity point. func New{{.P}}Point() *{{.P}}Point { return &{{.P}}Point{ x: new({{.Element}}), y: new({{.Element}}).One(), z: new({{.Element}}), } } // SetGenerator sets p to the canonical generator and returns p. func (p *{{.P}}Point) SetGenerator() *{{.P}}Point { p.x.SetBytes({{.Gx}}) p.y.SetBytes({{.Gy}}) p.z.One() return p } // Set sets p = q and returns p. func (p *{{.P}}Point) Set(q *{{.P}}Point) *{{.P}}Point { p.x.Set(q.x) p.y.Set(q.y) p.z.Set(q.z) return p } // SetBytes sets p to the compressed, uncompressed, or infinity value encoded in // b, as specified in SEC 1, Version 2.0, Section 2.3.4. If the point is not on // the curve, it returns nil and an error, and the receiver is unchanged. // Otherwise, it returns p. func (p *{{.P}}Point) SetBytes(b []byte) (*{{.P}}Point, error) { switch { // Point at infinity. case len(b) == 1 && b[0] == 0: return p.Set(New{{.P}}Point()), nil // Uncompressed form. case len(b) == 1+2*{{.p}}ElementLength && b[0] == 4: x, err := new({{.Element}}).SetBytes(b[1 : 1+{{.p}}ElementLength]) if err != nil { return nil, err } y, err := new({{.Element}}).SetBytes(b[1+{{.p}}ElementLength:]) if err != nil { return nil, err } if err := {{.p}}CheckOnCurve(x, y); err != nil { return nil, err } p.x.Set(x) p.y.Set(y) p.z.One() return p, nil // Compressed form. case len(b) == 1+{{.p}}ElementLength && (b[0] == 2 || b[0] == 3): x, err := new({{.Element}}).SetBytes(b[1:]) if err != nil { return nil, err } // y² = x³ - 3x + b y := {{.p}}Polynomial(new({{.Element}}), x) if !{{.p}}Sqrt(y, y) { return nil, errors.New("invalid {{.P}} compressed point encoding") } // Select the positive or negative root, as indicated by the least // significant bit, based on the encoding type byte. otherRoot := new({{.Element}}) otherRoot.Sub(otherRoot, y) cond := y.Bytes()[{{.p}}ElementLength-1]&1 ^ b[0]&1 y.Select(otherRoot, y, int(cond)) p.x.Set(x) p.y.Set(y) p.z.One() return p, nil default: return nil, errors.New("invalid {{.P}} point encoding") } } var _{{.p}}B *{{.Element}} var _{{.p}}BOnce sync.Once func {{.p}}B() *{{.Element}} { _{{.p}}BOnce.Do(func() { _{{.p}}B, _ = new({{.Element}}).SetBytes({{.B}}) }) return _{{.p}}B } // {{.p}}Polynomial sets y2 to x³ - 3x + b, and returns y2. func {{.p}}Polynomial(y2, x *{{.Element}}) *{{.Element}} { y2.Square(x) y2.Mul(y2, x) threeX := new({{.Element}}).Add(x, x) threeX.Add(threeX, x) y2.Sub(y2, threeX) return y2.Add(y2, {{.p}}B()) } func {{.p}}CheckOnCurve(x, y *{{.Element}}) error { // y² = x³ - 3x + b rhs := {{.p}}Polynomial(new({{.Element}}), x) lhs := new({{.Element}}).Square(y) if rhs.Equal(lhs) != 1 { return errors.New("{{.P}} point not on curve") } return nil } // Bytes returns the uncompressed or infinity encoding of p, as specified in // SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the point at // infinity is shorter than all other encodings. func (p *{{.P}}Point) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [1+2*{{.p}}ElementLength]byte return p.bytes(&out) } func (p *{{.P}}Point) bytes(out *[1+2*{{.p}}ElementLength]byte) []byte { if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new({{.Element}}).Invert(p.z) x := new({{.Element}}).Mul(p.x, zinv) y := new({{.Element}}).Mul(p.y, zinv) buf := append(out[:0], 4) buf = append(buf, x.Bytes()...) buf = append(buf, y.Bytes()...) return buf } // BytesX returns the encoding of the x-coordinate of p, as specified in SEC 1, // Version 2.0, Section 2.3.5, or an error if p is the point at infinity. func (p *{{.P}}Point) BytesX() ([]byte, error) { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [{{.p}}ElementLength]byte return p.bytesX(&out) } func (p *{{.P}}Point) bytesX(out *[{{.p}}ElementLength]byte) ([]byte, error) { if p.z.IsZero() == 1 { return nil, errors.New("{{.P}} point is the point at infinity") } zinv := new({{.Element}}).Invert(p.z) x := new({{.Element}}).Mul(p.x, zinv) return append(out[:0], x.Bytes()...), nil } // BytesCompressed returns the compressed or infinity encoding of p, as // specified in SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the // point at infinity is shorter than all other encodings. func (p *{{.P}}Point) BytesCompressed() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [1 + {{.p}}ElementLength]byte return p.bytesCompressed(&out) } func (p *{{.P}}Point) bytesCompressed(out *[1 + {{.p}}ElementLength]byte) []byte { if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new({{.Element}}).Invert(p.z) x := new({{.Element}}).Mul(p.x, zinv) y := new({{.Element}}).Mul(p.y, zinv) // Encode the sign of the y coordinate (indicated by the least significant // bit) as the encoding type (2 or 3). buf := append(out[:0], 2) buf[0] |= y.Bytes()[{{.p}}ElementLength-1] & 1 buf = append(buf, x.Bytes()...) return buf } // Add sets q = p1 + p2, and returns q. The points may overlap. func (q *{{.P}}Point) Add(p1, p2 *{{.P}}Point) *{{.P}}Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new({{.Element}}).Mul(p1.x, p2.x) // t0 := X1 * X2 t1 := new({{.Element}}).Mul(p1.y, p2.y) // t1 := Y1 * Y2 t2 := new({{.Element}}).Mul(p1.z, p2.z) // t2 := Z1 * Z2 t3 := new({{.Element}}).Add(p1.x, p1.y) // t3 := X1 + Y1 t4 := new({{.Element}}).Add(p2.x, p2.y) // t4 := X2 + Y2 t3.Mul(t3, t4) // t3 := t3 * t4 t4.Add(t0, t1) // t4 := t0 + t1 t3.Sub(t3, t4) // t3 := t3 - t4 t4.Add(p1.y, p1.z) // t4 := Y1 + Z1 x3 := new({{.Element}}).Add(p2.y, p2.z) // X3 := Y2 + Z2 t4.Mul(t4, x3) // t4 := t4 * X3 x3.Add(t1, t2) // X3 := t1 + t2 t4.Sub(t4, x3) // t4 := t4 - X3 x3.Add(p1.x, p1.z) // X3 := X1 + Z1 y3 := new({{.Element}}).Add(p2.x, p2.z) // Y3 := X2 + Z2 x3.Mul(x3, y3) // X3 := X3 * Y3 y3.Add(t0, t2) // Y3 := t0 + t2 y3.Sub(x3, y3) // Y3 := X3 - Y3 z3 := new({{.Element}}).Mul({{.p}}B(), t2) // Z3 := b * t2 x3.Sub(y3, z3) // X3 := Y3 - Z3 z3.Add(x3, x3) // Z3 := X3 + X3 x3.Add(x3, z3) // X3 := X3 + Z3 z3.Sub(t1, x3) // Z3 := t1 - X3 x3.Add(t1, x3) // X3 := t1 + X3 y3.Mul({{.p}}B(), y3) // Y3 := b * Y3 t1.Add(t2, t2) // t1 := t2 + t2 t2.Add(t1, t2) // t2 := t1 + t2 y3.Sub(y3, t2) // Y3 := Y3 - t2 y3.Sub(y3, t0) // Y3 := Y3 - t0 t1.Add(y3, y3) // t1 := Y3 + Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 t1.Add(t0, t0) // t1 := t0 + t0 t0.Add(t1, t0) // t0 := t1 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t1.Mul(t4, y3) // t1 := t4 * Y3 t2.Mul(t0, y3) // t2 := t0 * Y3 y3.Mul(x3, z3) // Y3 := X3 * Z3 y3.Add(y3, t2) // Y3 := Y3 + t2 x3.Mul(t3, x3) // X3 := t3 * X3 x3.Sub(x3, t1) // X3 := X3 - t1 z3.Mul(t4, z3) // Z3 := t4 * Z3 t1.Mul(t3, t0) // t1 := t3 * t0 z3.Add(z3, t1) // Z3 := Z3 + t1 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // Double sets q = p + p, and returns q. The points may overlap. func (q *{{.P}}Point) Double(p *{{.P}}Point) *{{.P}}Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new({{.Element}}).Square(p.x) // t0 := X ^ 2 t1 := new({{.Element}}).Square(p.y) // t1 := Y ^ 2 t2 := new({{.Element}}).Square(p.z) // t2 := Z ^ 2 t3 := new({{.Element}}).Mul(p.x, p.y) // t3 := X * Y t3.Add(t3, t3) // t3 := t3 + t3 z3 := new({{.Element}}).Mul(p.x, p.z) // Z3 := X * Z z3.Add(z3, z3) // Z3 := Z3 + Z3 y3 := new({{.Element}}).Mul({{.p}}B(), t2) // Y3 := b * t2 y3.Sub(y3, z3) // Y3 := Y3 - Z3 x3 := new({{.Element}}).Add(y3, y3) // X3 := Y3 + Y3 y3.Add(x3, y3) // Y3 := X3 + Y3 x3.Sub(t1, y3) // X3 := t1 - Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 y3.Mul(x3, y3) // Y3 := X3 * Y3 x3.Mul(x3, t3) // X3 := X3 * t3 t3.Add(t2, t2) // t3 := t2 + t2 t2.Add(t2, t3) // t2 := t2 + t3 z3.Mul({{.p}}B(), z3) // Z3 := b * Z3 z3.Sub(z3, t2) // Z3 := Z3 - t2 z3.Sub(z3, t0) // Z3 := Z3 - t0 t3.Add(z3, z3) // t3 := Z3 + Z3 z3.Add(z3, t3) // Z3 := Z3 + t3 t3.Add(t0, t0) // t3 := t0 + t0 t0.Add(t3, t0) // t0 := t3 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t0.Mul(t0, z3) // t0 := t0 * Z3 y3.Add(y3, t0) // Y3 := Y3 + t0 t0.Mul(p.y, p.z) // t0 := Y * Z t0.Add(t0, t0) // t0 := t0 + t0 z3.Mul(t0, z3) // Z3 := t0 * Z3 x3.Sub(x3, z3) // X3 := X3 - Z3 z3.Mul(t0, t1) // Z3 := t0 * t1 z3.Add(z3, z3) // Z3 := Z3 + Z3 z3.Add(z3, z3) // Z3 := Z3 + Z3 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // Select sets q to p1 if cond == 1, and to p2 if cond == 0. func (q *{{.P}}Point) Select(p1, p2 *{{.P}}Point, cond int) *{{.P}}Point { q.x.Select(p1.x, p2.x, cond) q.y.Select(p1.y, p2.y, cond) q.z.Select(p1.z, p2.z, cond) return q } // A {{.p}}Table holds the first 15 multiples of a point at offset -1, so [1]P // is at table[0], [15]P is at table[14], and [0]P is implicitly the identity // point. type {{.p}}Table [15]*{{.P}}Point // Select selects the n-th multiple of the table base point into p. It works in // constant time by iterating over every entry of the table. n must be in [0, 15]. func (table *{{.p}}Table) Select(p *{{.P}}Point, n uint8) { if n >= 16 { panic("nistec: internal error: {{.p}}Table called with out-of-bounds value") } p.Set(New{{.P}}Point()) for i := uint8(1); i < 16; i++ { cond := subtle.ConstantTimeByteEq(i, n) p.Select(table[i-1], p, cond) } } // ScalarMult sets p = scalar * q, and returns p. func (p *{{.P}}Point) ScalarMult(q *{{.P}}Point, scalar []byte) (*{{.P}}Point, error) { // Compute a {{.p}}Table for the base point q. The explicit New{{.P}}Point // calls get inlined, letting the allocations live on the stack. var table = {{.p}}Table{New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point(), New{{.P}}Point()} table[0].Set(q) for i := 1; i < 15; i += 2 { table[i].Double(table[i/2]) table[i+1].Add(table[i], q) } // Instead of doing the classic double-and-add chain, we do it with a // four-bit window: we double four times, and then add [0-15]P. t := New{{.P}}Point() p.Set(New{{.P}}Point()) for i, byte := range scalar { // No need to double on the first iteration, as p is the identity at // this point, and [N]∞ = ∞. if i != 0 { p.Double(p) p.Double(p) p.Double(p) p.Double(p) } windowValue := byte >> 4 table.Select(t, windowValue) p.Add(p, t) p.Double(p) p.Double(p) p.Double(p) p.Double(p) windowValue = byte & 0b1111 table.Select(t, windowValue) p.Add(p, t) } return p, nil } var {{.p}}GeneratorTable *[{{.p}}ElementLength * 2]{{.p}}Table var {{.p}}GeneratorTableOnce sync.Once // generatorTable returns a sequence of {{.p}}Tables. The first table contains // multiples of G. Each successive table is the previous table doubled four // times. func (p *{{.P}}Point) generatorTable() *[{{.p}}ElementLength * 2]{{.p}}Table { {{.p}}GeneratorTableOnce.Do(func() { {{.p}}GeneratorTable = new([{{.p}}ElementLength * 2]{{.p}}Table) base := New{{.P}}Point().SetGenerator() for i := 0; i < {{.p}}ElementLength*2; i++ { {{.p}}GeneratorTable[i][0] = New{{.P}}Point().Set(base) for j := 1; j < 15; j++ { {{.p}}GeneratorTable[i][j] = New{{.P}}Point().Add({{.p}}GeneratorTable[i][j-1], base) } base.Double(base) base.Double(base) base.Double(base) base.Double(base) } }) return {{.p}}GeneratorTable } // ScalarBaseMult sets p = scalar * B, where B is the canonical generator, and // returns p. func (p *{{.P}}Point) ScalarBaseMult(scalar []byte) (*{{.P}}Point, error) { if len(scalar) != {{.p}}ElementLength { return nil, errors.New("invalid scalar length") } tables := p.generatorTable() // This is also a scalar multiplication with a four-bit window like in // ScalarMult, but in this case the doublings are precomputed. The value // [windowValue]G added at iteration k would normally get doubled // (totIterations-k)×4 times, but with a larger precomputation we can // instead add [2^((totIterations-k)×4)][windowValue]G and avoid the // doublings between iterations. t := New{{.P}}Point() p.Set(New{{.P}}Point()) tableIndex := len(tables) - 1 for _, byte := range scalar { windowValue := byte >> 4 tables[tableIndex].Select(t, windowValue) p.Add(p, t) tableIndex-- windowValue = byte & 0b1111 tables[tableIndex].Select(t, windowValue) p.Add(p, t) tableIndex-- } return p, nil } // {{.p}}Sqrt sets e to a square root of x. If x is not a square, {{.p}}Sqrt returns // false and e is unchanged. e and x can overlap. func {{.p}}Sqrt(e, x *{{ .Element }}) (isSquare bool) { candidate := new({{ .Element }}) {{.p}}SqrtCandidate(candidate, x) square := new({{ .Element }}).Square(candidate) if square.Equal(x) != 1 { return false } e.Set(candidate) return true } ` const tmplAddchain = ` // sqrtCandidate sets z to a square root candidate for x. z and x must not overlap. func sqrtCandidate(z, x *Element) { // Since p = 3 mod 4, exponentiation by (p + 1) / 4 yields a square root candidate. // // The sequence of {{ .Ops.Adds }} multiplications and {{ .Ops.Doubles }} squarings is derived from the // following addition chain generated with {{ .Meta.Module }} {{ .Meta.ReleaseTag }}. // {{- range lines (format .Script) }} // {{ . }} {{- end }} // {{- range .Program.Temporaries }} var {{ . }} = new(Element) {{- end }} {{ range $i := .Program.Instructions -}} {{- with add $i.Op }} {{ $i.Output }}.Mul({{ .X }}, {{ .Y }}) {{- end -}} {{- with double $i.Op }} {{ $i.Output }}.Square({{ .X }}) {{- end -}} {{- with shift $i.Op -}} {{- $first := 0 -}} {{- if ne $i.Output.Identifier .X.Identifier }} {{ $i.Output }}.Square({{ .X }}) {{- $first = 1 -}} {{- end }} for s := {{ $first }}; s < {{ .S }}; s++ { {{ $i.Output }}.Square({{ $i.Output }}) } {{- end -}} {{- end }} } ` golang-filippo-nistec-0.0.4/go.mod000066400000000000000000000001061512422514700170130ustar00rootroot00000000000000module filippo.io/nistec go 1.24.0 require golang.org/x/sys v0.36.0 golang-filippo-nistec-0.0.4/go.sum000066400000000000000000000002311512422514700170370ustar00rootroot00000000000000golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang-filippo-nistec-0.0.4/internal/000077500000000000000000000000001512422514700175245ustar00rootroot00000000000000golang-filippo-nistec-0.0.4/internal/byteorder/000077500000000000000000000000001512422514700215235ustar00rootroot00000000000000golang-filippo-nistec-0.0.4/internal/byteorder/byteorder.go000066400000000000000000000067361512422514700240650ustar00rootroot00000000000000// Copyright 2024 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package byteorder provides functions for decoding and encoding // little and big endian integer types from/to byte slices. package byteorder func LEUint16(b []byte) uint16 { _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 return uint16(b[0]) | uint16(b[1])<<8 } func LEPutUint16(b []byte, v uint16) { _ = b[1] // early bounds check to guarantee safety of writes below b[0] = byte(v) b[1] = byte(v >> 8) } func LEAppendUint16(b []byte, v uint16) []byte { return append(b, byte(v), byte(v>>8), ) } func LEUint32(b []byte) uint32 { _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 } func LEPutUint32(b []byte, v uint32) { _ = b[3] // early bounds check to guarantee safety of writes below b[0] = byte(v) b[1] = byte(v >> 8) b[2] = byte(v >> 16) b[3] = byte(v >> 24) } func LEAppendUint32(b []byte, v uint32) []byte { return append(b, byte(v), byte(v>>8), byte(v>>16), byte(v>>24), ) } func LEUint64(b []byte) uint64 { _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 } func LEPutUint64(b []byte, v uint64) { _ = b[7] // early bounds check to guarantee safety of writes below b[0] = byte(v) b[1] = byte(v >> 8) b[2] = byte(v >> 16) b[3] = byte(v >> 24) b[4] = byte(v >> 32) b[5] = byte(v >> 40) b[6] = byte(v >> 48) b[7] = byte(v >> 56) } func LEAppendUint64(b []byte, v uint64) []byte { return append(b, byte(v), byte(v>>8), byte(v>>16), byte(v>>24), byte(v>>32), byte(v>>40), byte(v>>48), byte(v>>56), ) } func BEUint16(b []byte) uint16 { _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 return uint16(b[1]) | uint16(b[0])<<8 } func BEPutUint16(b []byte, v uint16) { _ = b[1] // early bounds check to guarantee safety of writes below b[0] = byte(v >> 8) b[1] = byte(v) } func BEAppendUint16(b []byte, v uint16) []byte { return append(b, byte(v>>8), byte(v), ) } func BEUint32(b []byte) uint32 { _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 } func BEPutUint32(b []byte, v uint32) { _ = b[3] // early bounds check to guarantee safety of writes below b[0] = byte(v >> 24) b[1] = byte(v >> 16) b[2] = byte(v >> 8) b[3] = byte(v) } func BEAppendUint32(b []byte, v uint32) []byte { return append(b, byte(v>>24), byte(v>>16), byte(v>>8), byte(v), ) } func BEUint64(b []byte) uint64 { _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 } func BEPutUint64(b []byte, v uint64) { _ = b[7] // early bounds check to guarantee safety of writes below b[0] = byte(v >> 56) b[1] = byte(v >> 48) b[2] = byte(v >> 40) b[3] = byte(v >> 32) b[4] = byte(v >> 24) b[5] = byte(v >> 16) b[6] = byte(v >> 8) b[7] = byte(v) } func BEAppendUint64(b []byte, v uint64) []byte { return append(b, byte(v>>56), byte(v>>48), byte(v>>40), byte(v>>32), byte(v>>24), byte(v>>16), byte(v>>8), byte(v), ) } golang-filippo-nistec-0.0.4/internal/fiat/000077500000000000000000000000001512422514700204475ustar00rootroot00000000000000golang-filippo-nistec-0.0.4/internal/fiat/Dockerfile000066400000000000000000000007721512422514700224470ustar00rootroot00000000000000# Copyright 2021 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. FROM coqorg/coq:8.13.2 RUN git clone https://github.com/mit-plv/fiat-crypto && cd fiat-crypto && \ git checkout 23d2dbc4ab897d14bde4404f70cd6991635f9c01 && \ git submodule update --init --recursive RUN cd fiat-crypto && eval $(opam env) && make -j4 standalone-ocaml SKIP_BEDROCK2=1 ENV PATH /home/coq/fiat-crypto/src/ExtractionOCaml:$PATH golang-filippo-nistec-0.0.4/internal/fiat/README000066400000000000000000000031431512422514700213300ustar00rootroot00000000000000The code in this package was autogenerated by the fiat-crypto project at version v0.0.9 from a formally verified model, and by the addchain project at a recent tip version. docker build -t fiat-crypto:v0.0.9 . go install github.com/mmcloughlin/addchain/cmd/addchain@v0.3.1-0.20211027081849-6a7d3decbe08 go run generate.go fiat-crypto code comes under the following license. Copyright (c) 2015-2020 The fiat-crypto Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY the fiat-crypto authors "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The authors are listed at https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS golang-filippo-nistec-0.0.4/internal/fiat/fiat_test.go000066400000000000000000000023641512422514700227650ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package fiat_test import ( "testing" "filippo.io/nistec/internal/fiat" ) func BenchmarkMul(b *testing.B) { b.Run("P224", func(b *testing.B) { v := new(fiat.P224Element).One() b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { v.Mul(v, v) } }) b.Run("P384", func(b *testing.B) { v := new(fiat.P384Element).One() b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { v.Mul(v, v) } }) b.Run("P521", func(b *testing.B) { v := new(fiat.P521Element).One() b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { v.Mul(v, v) } }) } func BenchmarkSquare(b *testing.B) { b.Run("P224", func(b *testing.B) { v := new(fiat.P224Element).One() b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { v.Square(v) } }) b.Run("P384", func(b *testing.B) { v := new(fiat.P384Element).One() b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { v.Square(v) } }) b.Run("P521", func(b *testing.B) { v := new(fiat.P521Element).One() b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { v.Square(v) } }) } golang-filippo-nistec-0.0.4/internal/fiat/generate.go000066400000000000000000000220761512422514700225770ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build ignore package main import ( "bytes" "go/format" "io" "log" "os" "os/exec" "text/template" ) var curves = []struct { Element string Prime string Prefix string FiatType string BytesLen int }{ { Element: "P224Element", Prime: "2^224 - 2^96 + 1", Prefix: "p224", FiatType: "[4]uint64", BytesLen: 28, }, // The P-256 fiat implementation is used only on 32-bit architectures, but // the uint32 fiat code is for some reason slower than the uint64 one. That // suggests there is a wide margin for improvement. { Element: "P256Element", Prime: "2^256 - 2^224 + 2^192 + 2^96 - 1", Prefix: "p256", FiatType: "[4]uint64", BytesLen: 32, }, { Element: "P384Element", Prime: "2^384 - 2^128 - 2^96 + 2^32 - 1", Prefix: "p384", FiatType: "[6]uint64", BytesLen: 48, }, // Note that unsaturated_solinas would be about 2x faster than // word_by_word_montgomery for P-521, but this curve is used rarely enough // that it's not worth carrying unsaturated_solinas support for it. { Element: "P521Element", Prime: "2^521 - 1", Prefix: "p521", FiatType: "[9]uint64", BytesLen: 66, }, } func main() { t := template.Must(template.New("montgomery").Parse(tmplWrapper)) tmplAddchainFile, err := os.CreateTemp("", "addchain-template") if err != nil { log.Fatal(err) } defer os.Remove(tmplAddchainFile.Name()) if _, err := io.WriteString(tmplAddchainFile, tmplAddchain); err != nil { log.Fatal(err) } if err := tmplAddchainFile.Close(); err != nil { log.Fatal(err) } for _, c := range curves { log.Printf("Generating %s.go...", c.Prefix) f, err := os.Create(c.Prefix + ".go") if err != nil { log.Fatal(err) } if err := t.Execute(f, c); err != nil { log.Fatal(err) } if err := f.Close(); err != nil { log.Fatal(err) } log.Printf("Generating %s_fiat64.go...", c.Prefix) cmd := exec.Command("docker", "run", "--rm", "--entrypoint", "word_by_word_montgomery", "fiat-crypto:v0.0.9", "--lang", "Go", "--no-wide-int", "--cmovznz-by-mul", "--relax-primitive-carry-to-bitwidth", "32,64", "--internal-static", "--public-function-case", "camelCase", "--public-type-case", "camelCase", "--private-function-case", "camelCase", "--private-type-case", "camelCase", "--doc-text-before-function-name", "", "--doc-newline-before-package-declaration", "--doc-prepend-header", "Code generated by Fiat Cryptography. DO NOT EDIT.", "--package-name", "fiat", "--no-prefix-fiat", c.Prefix, "64", c.Prime, "mul", "square", "add", "sub", "one", "from_montgomery", "to_montgomery", "selectznz", "to_bytes", "from_bytes") cmd.Stderr = os.Stderr out, err := cmd.Output() if err != nil { log.Fatal(err) } out, err = format.Source(out) if err != nil { log.Fatal(err) } if err := os.WriteFile(c.Prefix+"_fiat64.go", out, 0644); err != nil { log.Fatal(err) } log.Printf("Generating %s_invert.go...", c.Prefix) f, err = os.CreateTemp("", "addchain-"+c.Prefix) if err != nil { log.Fatal(err) } defer os.Remove(f.Name()) cmd = exec.Command("addchain", "search", c.Prime+" - 2") cmd.Stderr = os.Stderr cmd.Stdout = f if err := cmd.Run(); err != nil { log.Fatal(err) } if err := f.Close(); err != nil { log.Fatal(err) } cmd = exec.Command("addchain", "gen", "-tmpl", tmplAddchainFile.Name(), f.Name()) cmd.Stderr = os.Stderr out, err = cmd.Output() if err != nil { log.Fatal(err) } out = bytes.Replace(out, []byte("Element"), []byte(c.Element), -1) out, err = format.Source(out) if err != nil { log.Fatal(err) } if err := os.WriteFile(c.Prefix+"_invert.go", out, 0644); err != nil { log.Fatal(err) } } } const tmplWrapper = `// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by generate.go. DO NOT EDIT. package fiat import ( "crypto/subtle" "errors" ) // {{ .Element }} is an integer modulo {{ .Prime }}. // // The zero value is a valid zero element. type {{ .Element }} struct { // Values are represented internally always in the Montgomery domain, and // converted in Bytes and SetBytes. x {{ .Prefix }}MontgomeryDomainFieldElement } const {{ .Prefix }}ElementLen = {{ .BytesLen }} type {{ .Prefix }}UntypedFieldElement = {{ .FiatType }} // One sets e = 1, and returns e. func (e *{{ .Element }}) One() *{{ .Element }} { {{ .Prefix }}SetOne(&e.x) return e } // Equal returns 1 if e == t, and zero otherwise. func (e *{{ .Element }}) Equal(t *{{ .Element }}) int { eBytes := e.Bytes() tBytes := t.Bytes() return subtle.ConstantTimeCompare(eBytes, tBytes) } // IsZero returns 1 if e == 0, and zero otherwise. func (e *{{ .Element }}) IsZero() int { zero := make([]byte, {{ .Prefix }}ElementLen) eBytes := e.Bytes() return subtle.ConstantTimeCompare(eBytes, zero) } // Set sets e = t, and returns e. func (e *{{ .Element }}) Set(t *{{ .Element }}) *{{ .Element }} { e.x = t.x return e } // Bytes returns the {{ .BytesLen }}-byte big-endian encoding of e. func (e *{{ .Element }}) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [{{ .Prefix }}ElementLen]byte return e.bytes(&out) } func (e *{{ .Element }}) bytes(out *[{{ .Prefix }}ElementLen]byte) []byte { var tmp {{ .Prefix }}NonMontgomeryDomainFieldElement {{ .Prefix }}FromMontgomery(&tmp, &e.x) {{ .Prefix }}ToBytes(out, (*{{ .Prefix }}UntypedFieldElement)(&tmp)) {{ .Prefix }}InvertEndianness(out[:]) return out[:] } // SetBytes sets e = v, where v is a big-endian {{ .BytesLen }}-byte encoding, and returns e. // If v is not {{ .BytesLen }} bytes or it encodes a value higher than {{ .Prime }}, // SetBytes returns nil and an error, and e is unchanged. func (e *{{ .Element }}) SetBytes(v []byte) (*{{ .Element }}, error) { if len(v) != {{ .Prefix }}ElementLen { return nil, errors.New("invalid {{ .Element }} encoding") } // Check for non-canonical encodings (p + k, 2p + k, etc.) by comparing to // the encoding of -1 mod p, so p - 1, the highest canonical encoding. var minusOneEncoding = new({{ .Element }}).Sub( new({{ .Element }}), new({{ .Element }}).One()).Bytes() if subtle.ConstantTimeLessOrEqBytes(v, minusOneEncoding) == 0 { return nil, errors.New("invalid {{ .Element }} encoding") } var in [{{ .Prefix }}ElementLen]byte copy(in[:], v) {{ .Prefix }}InvertEndianness(in[:]) var tmp {{ .Prefix }}NonMontgomeryDomainFieldElement {{ .Prefix }}FromBytes((*{{ .Prefix }}UntypedFieldElement)(&tmp), &in) {{ .Prefix }}ToMontgomery(&e.x, &tmp) return e, nil } // Add sets e = t1 + t2, and returns e. func (e *{{ .Element }}) Add(t1, t2 *{{ .Element }}) *{{ .Element }} { {{ .Prefix }}Add(&e.x, &t1.x, &t2.x) return e } // Sub sets e = t1 - t2, and returns e. func (e *{{ .Element }}) Sub(t1, t2 *{{ .Element }}) *{{ .Element }} { {{ .Prefix }}Sub(&e.x, &t1.x, &t2.x) return e } // Mul sets e = t1 * t2, and returns e. func (e *{{ .Element }}) Mul(t1, t2 *{{ .Element }}) *{{ .Element }} { {{ .Prefix }}Mul(&e.x, &t1.x, &t2.x) return e } // Square sets e = t * t, and returns e. func (e *{{ .Element }}) Square(t *{{ .Element }}) *{{ .Element }} { {{ .Prefix }}Square(&e.x, &t.x) return e } // Select sets v to a if cond == 1, and to b if cond == 0. func (v *{{ .Element }}) Select(a, b *{{ .Element }}, cond int) *{{ .Element }} { {{ .Prefix }}Selectznz((*{{ .Prefix }}UntypedFieldElement)(&v.x), {{ .Prefix }}Uint1(cond), (*{{ .Prefix }}UntypedFieldElement)(&b.x), (*{{ .Prefix }}UntypedFieldElement)(&a.x)) return v } func {{ .Prefix }}InvertEndianness(v []byte) { for i := 0; i < len(v)/2; i++ { v[i], v[len(v)-1-i] = v[len(v)-1-i], v[i] } } ` const tmplAddchain = `// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by {{ .Meta.Name }}. DO NOT EDIT. package fiat // Invert sets e = 1/x, and returns e. // // If x == 0, Invert returns e = 0. func (e *Element) Invert(x *Element) *Element { // Inversion is implemented as exponentiation with exponent p − 2. // The sequence of {{ .Ops.Adds }} multiplications and {{ .Ops.Doubles }} squarings is derived from the // following addition chain generated with {{ .Meta.Module }} {{ .Meta.ReleaseTag }}. // {{- range lines (format .Script) }} // {{ . }} {{- end }} // var z = new(Element).Set(e) {{- range .Program.Temporaries }} var {{ . }} = new(Element) {{- end }} {{ range $i := .Program.Instructions -}} {{- with add $i.Op }} {{ $i.Output }}.Mul({{ .X }}, {{ .Y }}) {{- end -}} {{- with double $i.Op }} {{ $i.Output }}.Square({{ .X }}) {{- end -}} {{- with shift $i.Op -}} {{- $first := 0 -}} {{- if ne $i.Output.Identifier .X.Identifier }} {{ $i.Output }}.Square({{ .X }}) {{- $first = 1 -}} {{- end }} for s := {{ $first }}; s < {{ .S }}; s++ { {{ $i.Output }}.Square({{ $i.Output }}) } {{- end -}} {{- end }} return e.Set(z) } ` golang-filippo-nistec-0.0.4/internal/fiat/p224.go000066400000000000000000000071431512422514700214720ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by generate.go. DO NOT EDIT. package fiat import ( "errors" "filippo.io/nistec/internal/subtle" ) // P224Element is an integer modulo 2^224 - 2^96 + 1. // // The zero value is a valid zero element. type P224Element struct { // Values are represented internally always in the Montgomery domain, and // converted in Bytes and SetBytes. x p224MontgomeryDomainFieldElement } const p224ElementLen = 28 type p224UntypedFieldElement = [4]uint64 // One sets e = 1, and returns e. func (e *P224Element) One() *P224Element { p224SetOne(&e.x) return e } // Equal returns 1 if e == t, and zero otherwise. func (e *P224Element) Equal(t *P224Element) int { eBytes := e.Bytes() tBytes := t.Bytes() return subtle.ConstantTimeCompare(eBytes, tBytes) } // IsZero returns 1 if e == 0, and zero otherwise. func (e *P224Element) IsZero() int { zero := make([]byte, p224ElementLen) eBytes := e.Bytes() return subtle.ConstantTimeCompare(eBytes, zero) } // Set sets e = t, and returns e. func (e *P224Element) Set(t *P224Element) *P224Element { e.x = t.x return e } // Bytes returns the 28-byte big-endian encoding of e. func (e *P224Element) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p224ElementLen]byte return e.bytes(&out) } func (e *P224Element) bytes(out *[p224ElementLen]byte) []byte { var tmp p224NonMontgomeryDomainFieldElement p224FromMontgomery(&tmp, &e.x) p224ToBytes(out, (*p224UntypedFieldElement)(&tmp)) p224InvertEndianness(out[:]) return out[:] } // SetBytes sets e = v, where v is a big-endian 28-byte encoding, and returns e. // If v is not 28 bytes or it encodes a value higher than 2^224 - 2^96 + 1, // SetBytes returns nil and an error, and e is unchanged. func (e *P224Element) SetBytes(v []byte) (*P224Element, error) { if len(v) != p224ElementLen { return nil, errors.New("invalid P224Element encoding") } // Check for non-canonical encodings (p + k, 2p + k, etc.) by comparing to // the encoding of -1 mod p, so p - 1, the highest canonical encoding. var minusOneEncoding = new(P224Element).Sub( new(P224Element), new(P224Element).One()).Bytes() if subtle.ConstantTimeLessOrEqBytes(v, minusOneEncoding) == 0 { return nil, errors.New("invalid P224Element encoding") } var in [p224ElementLen]byte copy(in[:], v) p224InvertEndianness(in[:]) var tmp p224NonMontgomeryDomainFieldElement p224FromBytes((*p224UntypedFieldElement)(&tmp), &in) p224ToMontgomery(&e.x, &tmp) return e, nil } // Add sets e = t1 + t2, and returns e. func (e *P224Element) Add(t1, t2 *P224Element) *P224Element { p224Add(&e.x, &t1.x, &t2.x) return e } // Sub sets e = t1 - t2, and returns e. func (e *P224Element) Sub(t1, t2 *P224Element) *P224Element { p224Sub(&e.x, &t1.x, &t2.x) return e } // Mul sets e = t1 * t2, and returns e. func (e *P224Element) Mul(t1, t2 *P224Element) *P224Element { p224Mul(&e.x, &t1.x, &t2.x) return e } // Square sets e = t * t, and returns e. func (e *P224Element) Square(t *P224Element) *P224Element { p224Square(&e.x, &t.x) return e } // Select sets v to a if cond == 1, and to b if cond == 0. func (v *P224Element) Select(a, b *P224Element, cond int) *P224Element { p224Selectznz((*p224UntypedFieldElement)(&v.x), p224Uint1(cond), (*p224UntypedFieldElement)(&b.x), (*p224UntypedFieldElement)(&a.x)) return v } func p224InvertEndianness(v []byte) { for i := 0; i < len(v)/2; i++ { v[i], v[len(v)-1-i] = v[len(v)-1-i], v[i] } } golang-filippo-nistec-0.0.4/internal/fiat/p224_fiat64.go000066400000000000000000001262761512422514700226600ustar00rootroot00000000000000// Code generated by Fiat Cryptography. DO NOT EDIT. // // Autogenerated: word_by_word_montgomery --lang Go --no-wide-int --cmovznz-by-mul --relax-primitive-carry-to-bitwidth 32,64 --internal-static --public-function-case camelCase --public-type-case camelCase --private-function-case camelCase --private-type-case camelCase --doc-text-before-function-name '' --doc-newline-before-package-declaration --doc-prepend-header 'Code generated by Fiat Cryptography. DO NOT EDIT.' --package-name fiat --no-prefix-fiat p224 64 '2^224 - 2^96 + 1' mul square add sub one from_montgomery to_montgomery selectznz to_bytes from_bytes // // curve description: p224 // // machine_wordsize = 64 (from "64") // // requested operations: mul, square, add, sub, one, from_montgomery, to_montgomery, selectznz, to_bytes, from_bytes // // m = 0xffffffffffffffffffffffffffffffff000000000000000000000001 (from "2^224 - 2^96 + 1") // // // // NOTE: In addition to the bounds specified above each function, all // // functions synthesized for this Montgomery arithmetic require the // // input to be strictly less than the prime modulus (m), and also // // require the input to be in the unique saturated representation. // // All functions also ensure that these two properties are true of // // return values. // // // // Computed values: // // eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) // // bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) // // twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in // // if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 package fiat import "math/bits" type p224Uint1 uint64 // We use uint64 instead of a more narrow type for performance reasons; see https://github.com/mit-plv/fiat-crypto/pull/1006#issuecomment-892625927 type p224Int1 int64 // We use uint64 instead of a more narrow type for performance reasons; see https://github.com/mit-plv/fiat-crypto/pull/1006#issuecomment-892625927 // The type p224MontgomeryDomainFieldElement is a field element in the Montgomery domain. // // Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] type p224MontgomeryDomainFieldElement [4]uint64 // The type p224NonMontgomeryDomainFieldElement is a field element NOT in the Montgomery domain. // // Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] type p224NonMontgomeryDomainFieldElement [4]uint64 // p224CmovznzU64 is a single-word conditional move. // // Postconditions: // // out1 = (if arg1 = 0 then arg2 else arg3) // // Input Bounds: // // arg1: [0x0 ~> 0x1] // arg2: [0x0 ~> 0xffffffffffffffff] // arg3: [0x0 ~> 0xffffffffffffffff] // // Output Bounds: // // out1: [0x0 ~> 0xffffffffffffffff] func p224CmovznzU64(out1 *uint64, arg1 p224Uint1, arg2 uint64, arg3 uint64) { x1 := (uint64(arg1) * 0xffffffffffffffff) x2 := ((x1 & arg3) | ((^x1) & arg2)) *out1 = x2 } // p224Mul multiplies two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p224Mul(out1 *p224MontgomeryDomainFieldElement, arg1 *p224MontgomeryDomainFieldElement, arg2 *p224MontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[0] var x5 uint64 var x6 uint64 x6, x5 = bits.Mul64(x4, arg2[3]) var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x4, arg2[2]) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x4, arg2[1]) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x4, arg2[0]) var x13 uint64 var x14 uint64 x13, x14 = bits.Add64(x12, x9, uint64(0x0)) var x15 uint64 var x16 uint64 x15, x16 = bits.Add64(x10, x7, uint64(p224Uint1(x14))) var x17 uint64 var x18 uint64 x17, x18 = bits.Add64(x8, x5, uint64(p224Uint1(x16))) x19 := (uint64(p224Uint1(x18)) + x6) var x20 uint64 _, x20 = bits.Mul64(x11, 0xffffffffffffffff) var x22 uint64 var x23 uint64 x23, x22 = bits.Mul64(x20, 0xffffffff) var x24 uint64 var x25 uint64 x25, x24 = bits.Mul64(x20, 0xffffffffffffffff) var x26 uint64 var x27 uint64 x27, x26 = bits.Mul64(x20, 0xffffffff00000000) var x28 uint64 var x29 uint64 x28, x29 = bits.Add64(x27, x24, uint64(0x0)) var x30 uint64 var x31 uint64 x30, x31 = bits.Add64(x25, x22, uint64(p224Uint1(x29))) x32 := (uint64(p224Uint1(x31)) + x23) var x34 uint64 _, x34 = bits.Add64(x11, x20, uint64(0x0)) var x35 uint64 var x36 uint64 x35, x36 = bits.Add64(x13, x26, uint64(p224Uint1(x34))) var x37 uint64 var x38 uint64 x37, x38 = bits.Add64(x15, x28, uint64(p224Uint1(x36))) var x39 uint64 var x40 uint64 x39, x40 = bits.Add64(x17, x30, uint64(p224Uint1(x38))) var x41 uint64 var x42 uint64 x41, x42 = bits.Add64(x19, x32, uint64(p224Uint1(x40))) var x43 uint64 var x44 uint64 x44, x43 = bits.Mul64(x1, arg2[3]) var x45 uint64 var x46 uint64 x46, x45 = bits.Mul64(x1, arg2[2]) var x47 uint64 var x48 uint64 x48, x47 = bits.Mul64(x1, arg2[1]) var x49 uint64 var x50 uint64 x50, x49 = bits.Mul64(x1, arg2[0]) var x51 uint64 var x52 uint64 x51, x52 = bits.Add64(x50, x47, uint64(0x0)) var x53 uint64 var x54 uint64 x53, x54 = bits.Add64(x48, x45, uint64(p224Uint1(x52))) var x55 uint64 var x56 uint64 x55, x56 = bits.Add64(x46, x43, uint64(p224Uint1(x54))) x57 := (uint64(p224Uint1(x56)) + x44) var x58 uint64 var x59 uint64 x58, x59 = bits.Add64(x35, x49, uint64(0x0)) var x60 uint64 var x61 uint64 x60, x61 = bits.Add64(x37, x51, uint64(p224Uint1(x59))) var x62 uint64 var x63 uint64 x62, x63 = bits.Add64(x39, x53, uint64(p224Uint1(x61))) var x64 uint64 var x65 uint64 x64, x65 = bits.Add64(x41, x55, uint64(p224Uint1(x63))) var x66 uint64 var x67 uint64 x66, x67 = bits.Add64(uint64(p224Uint1(x42)), x57, uint64(p224Uint1(x65))) var x68 uint64 _, x68 = bits.Mul64(x58, 0xffffffffffffffff) var x70 uint64 var x71 uint64 x71, x70 = bits.Mul64(x68, 0xffffffff) var x72 uint64 var x73 uint64 x73, x72 = bits.Mul64(x68, 0xffffffffffffffff) var x74 uint64 var x75 uint64 x75, x74 = bits.Mul64(x68, 0xffffffff00000000) var x76 uint64 var x77 uint64 x76, x77 = bits.Add64(x75, x72, uint64(0x0)) var x78 uint64 var x79 uint64 x78, x79 = bits.Add64(x73, x70, uint64(p224Uint1(x77))) x80 := (uint64(p224Uint1(x79)) + x71) var x82 uint64 _, x82 = bits.Add64(x58, x68, uint64(0x0)) var x83 uint64 var x84 uint64 x83, x84 = bits.Add64(x60, x74, uint64(p224Uint1(x82))) var x85 uint64 var x86 uint64 x85, x86 = bits.Add64(x62, x76, uint64(p224Uint1(x84))) var x87 uint64 var x88 uint64 x87, x88 = bits.Add64(x64, x78, uint64(p224Uint1(x86))) var x89 uint64 var x90 uint64 x89, x90 = bits.Add64(x66, x80, uint64(p224Uint1(x88))) x91 := (uint64(p224Uint1(x90)) + uint64(p224Uint1(x67))) var x92 uint64 var x93 uint64 x93, x92 = bits.Mul64(x2, arg2[3]) var x94 uint64 var x95 uint64 x95, x94 = bits.Mul64(x2, arg2[2]) var x96 uint64 var x97 uint64 x97, x96 = bits.Mul64(x2, arg2[1]) var x98 uint64 var x99 uint64 x99, x98 = bits.Mul64(x2, arg2[0]) var x100 uint64 var x101 uint64 x100, x101 = bits.Add64(x99, x96, uint64(0x0)) var x102 uint64 var x103 uint64 x102, x103 = bits.Add64(x97, x94, uint64(p224Uint1(x101))) var x104 uint64 var x105 uint64 x104, x105 = bits.Add64(x95, x92, uint64(p224Uint1(x103))) x106 := (uint64(p224Uint1(x105)) + x93) var x107 uint64 var x108 uint64 x107, x108 = bits.Add64(x83, x98, uint64(0x0)) var x109 uint64 var x110 uint64 x109, x110 = bits.Add64(x85, x100, uint64(p224Uint1(x108))) var x111 uint64 var x112 uint64 x111, x112 = bits.Add64(x87, x102, uint64(p224Uint1(x110))) var x113 uint64 var x114 uint64 x113, x114 = bits.Add64(x89, x104, uint64(p224Uint1(x112))) var x115 uint64 var x116 uint64 x115, x116 = bits.Add64(x91, x106, uint64(p224Uint1(x114))) var x117 uint64 _, x117 = bits.Mul64(x107, 0xffffffffffffffff) var x119 uint64 var x120 uint64 x120, x119 = bits.Mul64(x117, 0xffffffff) var x121 uint64 var x122 uint64 x122, x121 = bits.Mul64(x117, 0xffffffffffffffff) var x123 uint64 var x124 uint64 x124, x123 = bits.Mul64(x117, 0xffffffff00000000) var x125 uint64 var x126 uint64 x125, x126 = bits.Add64(x124, x121, uint64(0x0)) var x127 uint64 var x128 uint64 x127, x128 = bits.Add64(x122, x119, uint64(p224Uint1(x126))) x129 := (uint64(p224Uint1(x128)) + x120) var x131 uint64 _, x131 = bits.Add64(x107, x117, uint64(0x0)) var x132 uint64 var x133 uint64 x132, x133 = bits.Add64(x109, x123, uint64(p224Uint1(x131))) var x134 uint64 var x135 uint64 x134, x135 = bits.Add64(x111, x125, uint64(p224Uint1(x133))) var x136 uint64 var x137 uint64 x136, x137 = bits.Add64(x113, x127, uint64(p224Uint1(x135))) var x138 uint64 var x139 uint64 x138, x139 = bits.Add64(x115, x129, uint64(p224Uint1(x137))) x140 := (uint64(p224Uint1(x139)) + uint64(p224Uint1(x116))) var x141 uint64 var x142 uint64 x142, x141 = bits.Mul64(x3, arg2[3]) var x143 uint64 var x144 uint64 x144, x143 = bits.Mul64(x3, arg2[2]) var x145 uint64 var x146 uint64 x146, x145 = bits.Mul64(x3, arg2[1]) var x147 uint64 var x148 uint64 x148, x147 = bits.Mul64(x3, arg2[0]) var x149 uint64 var x150 uint64 x149, x150 = bits.Add64(x148, x145, uint64(0x0)) var x151 uint64 var x152 uint64 x151, x152 = bits.Add64(x146, x143, uint64(p224Uint1(x150))) var x153 uint64 var x154 uint64 x153, x154 = bits.Add64(x144, x141, uint64(p224Uint1(x152))) x155 := (uint64(p224Uint1(x154)) + x142) var x156 uint64 var x157 uint64 x156, x157 = bits.Add64(x132, x147, uint64(0x0)) var x158 uint64 var x159 uint64 x158, x159 = bits.Add64(x134, x149, uint64(p224Uint1(x157))) var x160 uint64 var x161 uint64 x160, x161 = bits.Add64(x136, x151, uint64(p224Uint1(x159))) var x162 uint64 var x163 uint64 x162, x163 = bits.Add64(x138, x153, uint64(p224Uint1(x161))) var x164 uint64 var x165 uint64 x164, x165 = bits.Add64(x140, x155, uint64(p224Uint1(x163))) var x166 uint64 _, x166 = bits.Mul64(x156, 0xffffffffffffffff) var x168 uint64 var x169 uint64 x169, x168 = bits.Mul64(x166, 0xffffffff) var x170 uint64 var x171 uint64 x171, x170 = bits.Mul64(x166, 0xffffffffffffffff) var x172 uint64 var x173 uint64 x173, x172 = bits.Mul64(x166, 0xffffffff00000000) var x174 uint64 var x175 uint64 x174, x175 = bits.Add64(x173, x170, uint64(0x0)) var x176 uint64 var x177 uint64 x176, x177 = bits.Add64(x171, x168, uint64(p224Uint1(x175))) x178 := (uint64(p224Uint1(x177)) + x169) var x180 uint64 _, x180 = bits.Add64(x156, x166, uint64(0x0)) var x181 uint64 var x182 uint64 x181, x182 = bits.Add64(x158, x172, uint64(p224Uint1(x180))) var x183 uint64 var x184 uint64 x183, x184 = bits.Add64(x160, x174, uint64(p224Uint1(x182))) var x185 uint64 var x186 uint64 x185, x186 = bits.Add64(x162, x176, uint64(p224Uint1(x184))) var x187 uint64 var x188 uint64 x187, x188 = bits.Add64(x164, x178, uint64(p224Uint1(x186))) x189 := (uint64(p224Uint1(x188)) + uint64(p224Uint1(x165))) var x190 uint64 var x191 uint64 x190, x191 = bits.Sub64(x181, uint64(0x1), uint64(0x0)) var x192 uint64 var x193 uint64 x192, x193 = bits.Sub64(x183, 0xffffffff00000000, uint64(p224Uint1(x191))) var x194 uint64 var x195 uint64 x194, x195 = bits.Sub64(x185, 0xffffffffffffffff, uint64(p224Uint1(x193))) var x196 uint64 var x197 uint64 x196, x197 = bits.Sub64(x187, 0xffffffff, uint64(p224Uint1(x195))) var x199 uint64 _, x199 = bits.Sub64(x189, uint64(0x0), uint64(p224Uint1(x197))) var x200 uint64 p224CmovznzU64(&x200, p224Uint1(x199), x190, x181) var x201 uint64 p224CmovznzU64(&x201, p224Uint1(x199), x192, x183) var x202 uint64 p224CmovznzU64(&x202, p224Uint1(x199), x194, x185) var x203 uint64 p224CmovznzU64(&x203, p224Uint1(x199), x196, x187) out1[0] = x200 out1[1] = x201 out1[2] = x202 out1[3] = x203 } // p224Square squares a field element in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m // 0 ≤ eval out1 < m func p224Square(out1 *p224MontgomeryDomainFieldElement, arg1 *p224MontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[0] var x5 uint64 var x6 uint64 x6, x5 = bits.Mul64(x4, arg1[3]) var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x4, arg1[2]) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x4, arg1[1]) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x4, arg1[0]) var x13 uint64 var x14 uint64 x13, x14 = bits.Add64(x12, x9, uint64(0x0)) var x15 uint64 var x16 uint64 x15, x16 = bits.Add64(x10, x7, uint64(p224Uint1(x14))) var x17 uint64 var x18 uint64 x17, x18 = bits.Add64(x8, x5, uint64(p224Uint1(x16))) x19 := (uint64(p224Uint1(x18)) + x6) var x20 uint64 _, x20 = bits.Mul64(x11, 0xffffffffffffffff) var x22 uint64 var x23 uint64 x23, x22 = bits.Mul64(x20, 0xffffffff) var x24 uint64 var x25 uint64 x25, x24 = bits.Mul64(x20, 0xffffffffffffffff) var x26 uint64 var x27 uint64 x27, x26 = bits.Mul64(x20, 0xffffffff00000000) var x28 uint64 var x29 uint64 x28, x29 = bits.Add64(x27, x24, uint64(0x0)) var x30 uint64 var x31 uint64 x30, x31 = bits.Add64(x25, x22, uint64(p224Uint1(x29))) x32 := (uint64(p224Uint1(x31)) + x23) var x34 uint64 _, x34 = bits.Add64(x11, x20, uint64(0x0)) var x35 uint64 var x36 uint64 x35, x36 = bits.Add64(x13, x26, uint64(p224Uint1(x34))) var x37 uint64 var x38 uint64 x37, x38 = bits.Add64(x15, x28, uint64(p224Uint1(x36))) var x39 uint64 var x40 uint64 x39, x40 = bits.Add64(x17, x30, uint64(p224Uint1(x38))) var x41 uint64 var x42 uint64 x41, x42 = bits.Add64(x19, x32, uint64(p224Uint1(x40))) var x43 uint64 var x44 uint64 x44, x43 = bits.Mul64(x1, arg1[3]) var x45 uint64 var x46 uint64 x46, x45 = bits.Mul64(x1, arg1[2]) var x47 uint64 var x48 uint64 x48, x47 = bits.Mul64(x1, arg1[1]) var x49 uint64 var x50 uint64 x50, x49 = bits.Mul64(x1, arg1[0]) var x51 uint64 var x52 uint64 x51, x52 = bits.Add64(x50, x47, uint64(0x0)) var x53 uint64 var x54 uint64 x53, x54 = bits.Add64(x48, x45, uint64(p224Uint1(x52))) var x55 uint64 var x56 uint64 x55, x56 = bits.Add64(x46, x43, uint64(p224Uint1(x54))) x57 := (uint64(p224Uint1(x56)) + x44) var x58 uint64 var x59 uint64 x58, x59 = bits.Add64(x35, x49, uint64(0x0)) var x60 uint64 var x61 uint64 x60, x61 = bits.Add64(x37, x51, uint64(p224Uint1(x59))) var x62 uint64 var x63 uint64 x62, x63 = bits.Add64(x39, x53, uint64(p224Uint1(x61))) var x64 uint64 var x65 uint64 x64, x65 = bits.Add64(x41, x55, uint64(p224Uint1(x63))) var x66 uint64 var x67 uint64 x66, x67 = bits.Add64(uint64(p224Uint1(x42)), x57, uint64(p224Uint1(x65))) var x68 uint64 _, x68 = bits.Mul64(x58, 0xffffffffffffffff) var x70 uint64 var x71 uint64 x71, x70 = bits.Mul64(x68, 0xffffffff) var x72 uint64 var x73 uint64 x73, x72 = bits.Mul64(x68, 0xffffffffffffffff) var x74 uint64 var x75 uint64 x75, x74 = bits.Mul64(x68, 0xffffffff00000000) var x76 uint64 var x77 uint64 x76, x77 = bits.Add64(x75, x72, uint64(0x0)) var x78 uint64 var x79 uint64 x78, x79 = bits.Add64(x73, x70, uint64(p224Uint1(x77))) x80 := (uint64(p224Uint1(x79)) + x71) var x82 uint64 _, x82 = bits.Add64(x58, x68, uint64(0x0)) var x83 uint64 var x84 uint64 x83, x84 = bits.Add64(x60, x74, uint64(p224Uint1(x82))) var x85 uint64 var x86 uint64 x85, x86 = bits.Add64(x62, x76, uint64(p224Uint1(x84))) var x87 uint64 var x88 uint64 x87, x88 = bits.Add64(x64, x78, uint64(p224Uint1(x86))) var x89 uint64 var x90 uint64 x89, x90 = bits.Add64(x66, x80, uint64(p224Uint1(x88))) x91 := (uint64(p224Uint1(x90)) + uint64(p224Uint1(x67))) var x92 uint64 var x93 uint64 x93, x92 = bits.Mul64(x2, arg1[3]) var x94 uint64 var x95 uint64 x95, x94 = bits.Mul64(x2, arg1[2]) var x96 uint64 var x97 uint64 x97, x96 = bits.Mul64(x2, arg1[1]) var x98 uint64 var x99 uint64 x99, x98 = bits.Mul64(x2, arg1[0]) var x100 uint64 var x101 uint64 x100, x101 = bits.Add64(x99, x96, uint64(0x0)) var x102 uint64 var x103 uint64 x102, x103 = bits.Add64(x97, x94, uint64(p224Uint1(x101))) var x104 uint64 var x105 uint64 x104, x105 = bits.Add64(x95, x92, uint64(p224Uint1(x103))) x106 := (uint64(p224Uint1(x105)) + x93) var x107 uint64 var x108 uint64 x107, x108 = bits.Add64(x83, x98, uint64(0x0)) var x109 uint64 var x110 uint64 x109, x110 = bits.Add64(x85, x100, uint64(p224Uint1(x108))) var x111 uint64 var x112 uint64 x111, x112 = bits.Add64(x87, x102, uint64(p224Uint1(x110))) var x113 uint64 var x114 uint64 x113, x114 = bits.Add64(x89, x104, uint64(p224Uint1(x112))) var x115 uint64 var x116 uint64 x115, x116 = bits.Add64(x91, x106, uint64(p224Uint1(x114))) var x117 uint64 _, x117 = bits.Mul64(x107, 0xffffffffffffffff) var x119 uint64 var x120 uint64 x120, x119 = bits.Mul64(x117, 0xffffffff) var x121 uint64 var x122 uint64 x122, x121 = bits.Mul64(x117, 0xffffffffffffffff) var x123 uint64 var x124 uint64 x124, x123 = bits.Mul64(x117, 0xffffffff00000000) var x125 uint64 var x126 uint64 x125, x126 = bits.Add64(x124, x121, uint64(0x0)) var x127 uint64 var x128 uint64 x127, x128 = bits.Add64(x122, x119, uint64(p224Uint1(x126))) x129 := (uint64(p224Uint1(x128)) + x120) var x131 uint64 _, x131 = bits.Add64(x107, x117, uint64(0x0)) var x132 uint64 var x133 uint64 x132, x133 = bits.Add64(x109, x123, uint64(p224Uint1(x131))) var x134 uint64 var x135 uint64 x134, x135 = bits.Add64(x111, x125, uint64(p224Uint1(x133))) var x136 uint64 var x137 uint64 x136, x137 = bits.Add64(x113, x127, uint64(p224Uint1(x135))) var x138 uint64 var x139 uint64 x138, x139 = bits.Add64(x115, x129, uint64(p224Uint1(x137))) x140 := (uint64(p224Uint1(x139)) + uint64(p224Uint1(x116))) var x141 uint64 var x142 uint64 x142, x141 = bits.Mul64(x3, arg1[3]) var x143 uint64 var x144 uint64 x144, x143 = bits.Mul64(x3, arg1[2]) var x145 uint64 var x146 uint64 x146, x145 = bits.Mul64(x3, arg1[1]) var x147 uint64 var x148 uint64 x148, x147 = bits.Mul64(x3, arg1[0]) var x149 uint64 var x150 uint64 x149, x150 = bits.Add64(x148, x145, uint64(0x0)) var x151 uint64 var x152 uint64 x151, x152 = bits.Add64(x146, x143, uint64(p224Uint1(x150))) var x153 uint64 var x154 uint64 x153, x154 = bits.Add64(x144, x141, uint64(p224Uint1(x152))) x155 := (uint64(p224Uint1(x154)) + x142) var x156 uint64 var x157 uint64 x156, x157 = bits.Add64(x132, x147, uint64(0x0)) var x158 uint64 var x159 uint64 x158, x159 = bits.Add64(x134, x149, uint64(p224Uint1(x157))) var x160 uint64 var x161 uint64 x160, x161 = bits.Add64(x136, x151, uint64(p224Uint1(x159))) var x162 uint64 var x163 uint64 x162, x163 = bits.Add64(x138, x153, uint64(p224Uint1(x161))) var x164 uint64 var x165 uint64 x164, x165 = bits.Add64(x140, x155, uint64(p224Uint1(x163))) var x166 uint64 _, x166 = bits.Mul64(x156, 0xffffffffffffffff) var x168 uint64 var x169 uint64 x169, x168 = bits.Mul64(x166, 0xffffffff) var x170 uint64 var x171 uint64 x171, x170 = bits.Mul64(x166, 0xffffffffffffffff) var x172 uint64 var x173 uint64 x173, x172 = bits.Mul64(x166, 0xffffffff00000000) var x174 uint64 var x175 uint64 x174, x175 = bits.Add64(x173, x170, uint64(0x0)) var x176 uint64 var x177 uint64 x176, x177 = bits.Add64(x171, x168, uint64(p224Uint1(x175))) x178 := (uint64(p224Uint1(x177)) + x169) var x180 uint64 _, x180 = bits.Add64(x156, x166, uint64(0x0)) var x181 uint64 var x182 uint64 x181, x182 = bits.Add64(x158, x172, uint64(p224Uint1(x180))) var x183 uint64 var x184 uint64 x183, x184 = bits.Add64(x160, x174, uint64(p224Uint1(x182))) var x185 uint64 var x186 uint64 x185, x186 = bits.Add64(x162, x176, uint64(p224Uint1(x184))) var x187 uint64 var x188 uint64 x187, x188 = bits.Add64(x164, x178, uint64(p224Uint1(x186))) x189 := (uint64(p224Uint1(x188)) + uint64(p224Uint1(x165))) var x190 uint64 var x191 uint64 x190, x191 = bits.Sub64(x181, uint64(0x1), uint64(0x0)) var x192 uint64 var x193 uint64 x192, x193 = bits.Sub64(x183, 0xffffffff00000000, uint64(p224Uint1(x191))) var x194 uint64 var x195 uint64 x194, x195 = bits.Sub64(x185, 0xffffffffffffffff, uint64(p224Uint1(x193))) var x196 uint64 var x197 uint64 x196, x197 = bits.Sub64(x187, 0xffffffff, uint64(p224Uint1(x195))) var x199 uint64 _, x199 = bits.Sub64(x189, uint64(0x0), uint64(p224Uint1(x197))) var x200 uint64 p224CmovznzU64(&x200, p224Uint1(x199), x190, x181) var x201 uint64 p224CmovznzU64(&x201, p224Uint1(x199), x192, x183) var x202 uint64 p224CmovznzU64(&x202, p224Uint1(x199), x194, x185) var x203 uint64 p224CmovznzU64(&x203, p224Uint1(x199), x196, x187) out1[0] = x200 out1[1] = x201 out1[2] = x202 out1[3] = x203 } // p224Add adds two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p224Add(out1 *p224MontgomeryDomainFieldElement, arg1 *p224MontgomeryDomainFieldElement, arg2 *p224MontgomeryDomainFieldElement) { var x1 uint64 var x2 uint64 x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) var x3 uint64 var x4 uint64 x3, x4 = bits.Add64(arg1[1], arg2[1], uint64(p224Uint1(x2))) var x5 uint64 var x6 uint64 x5, x6 = bits.Add64(arg1[2], arg2[2], uint64(p224Uint1(x4))) var x7 uint64 var x8 uint64 x7, x8 = bits.Add64(arg1[3], arg2[3], uint64(p224Uint1(x6))) var x9 uint64 var x10 uint64 x9, x10 = bits.Sub64(x1, uint64(0x1), uint64(0x0)) var x11 uint64 var x12 uint64 x11, x12 = bits.Sub64(x3, 0xffffffff00000000, uint64(p224Uint1(x10))) var x13 uint64 var x14 uint64 x13, x14 = bits.Sub64(x5, 0xffffffffffffffff, uint64(p224Uint1(x12))) var x15 uint64 var x16 uint64 x15, x16 = bits.Sub64(x7, 0xffffffff, uint64(p224Uint1(x14))) var x18 uint64 _, x18 = bits.Sub64(uint64(p224Uint1(x8)), uint64(0x0), uint64(p224Uint1(x16))) var x19 uint64 p224CmovznzU64(&x19, p224Uint1(x18), x9, x1) var x20 uint64 p224CmovznzU64(&x20, p224Uint1(x18), x11, x3) var x21 uint64 p224CmovznzU64(&x21, p224Uint1(x18), x13, x5) var x22 uint64 p224CmovznzU64(&x22, p224Uint1(x18), x15, x7) out1[0] = x19 out1[1] = x20 out1[2] = x21 out1[3] = x22 } // p224Sub subtracts two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p224Sub(out1 *p224MontgomeryDomainFieldElement, arg1 *p224MontgomeryDomainFieldElement, arg2 *p224MontgomeryDomainFieldElement) { var x1 uint64 var x2 uint64 x1, x2 = bits.Sub64(arg1[0], arg2[0], uint64(0x0)) var x3 uint64 var x4 uint64 x3, x4 = bits.Sub64(arg1[1], arg2[1], uint64(p224Uint1(x2))) var x5 uint64 var x6 uint64 x5, x6 = bits.Sub64(arg1[2], arg2[2], uint64(p224Uint1(x4))) var x7 uint64 var x8 uint64 x7, x8 = bits.Sub64(arg1[3], arg2[3], uint64(p224Uint1(x6))) var x9 uint64 p224CmovznzU64(&x9, p224Uint1(x8), uint64(0x0), 0xffffffffffffffff) var x10 uint64 var x11 uint64 x10, x11 = bits.Add64(x1, uint64((p224Uint1(x9) & 0x1)), uint64(0x0)) var x12 uint64 var x13 uint64 x12, x13 = bits.Add64(x3, (x9 & 0xffffffff00000000), uint64(p224Uint1(x11))) var x14 uint64 var x15 uint64 x14, x15 = bits.Add64(x5, x9, uint64(p224Uint1(x13))) var x16 uint64 x16, _ = bits.Add64(x7, (x9 & 0xffffffff), uint64(p224Uint1(x15))) out1[0] = x10 out1[1] = x12 out1[2] = x14 out1[3] = x16 } // p224SetOne returns the field element one in the Montgomery domain. // // Postconditions: // // eval (from_montgomery out1) mod m = 1 mod m // 0 ≤ eval out1 < m func p224SetOne(out1 *p224MontgomeryDomainFieldElement) { out1[0] = 0xffffffff00000000 out1[1] = 0xffffffffffffffff out1[2] = uint64(0x0) out1[3] = uint64(0x0) } // p224FromMontgomery translates a field element out of the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^4) mod m // 0 ≤ eval out1 < m func p224FromMontgomery(out1 *p224NonMontgomeryDomainFieldElement, arg1 *p224MontgomeryDomainFieldElement) { x1 := arg1[0] var x2 uint64 _, x2 = bits.Mul64(x1, 0xffffffffffffffff) var x4 uint64 var x5 uint64 x5, x4 = bits.Mul64(x2, 0xffffffff) var x6 uint64 var x7 uint64 x7, x6 = bits.Mul64(x2, 0xffffffffffffffff) var x8 uint64 var x9 uint64 x9, x8 = bits.Mul64(x2, 0xffffffff00000000) var x10 uint64 var x11 uint64 x10, x11 = bits.Add64(x9, x6, uint64(0x0)) var x12 uint64 var x13 uint64 x12, x13 = bits.Add64(x7, x4, uint64(p224Uint1(x11))) var x15 uint64 _, x15 = bits.Add64(x1, x2, uint64(0x0)) var x16 uint64 var x17 uint64 x16, x17 = bits.Add64(uint64(0x0), x8, uint64(p224Uint1(x15))) var x18 uint64 var x19 uint64 x18, x19 = bits.Add64(uint64(0x0), x10, uint64(p224Uint1(x17))) var x20 uint64 var x21 uint64 x20, x21 = bits.Add64(uint64(0x0), x12, uint64(p224Uint1(x19))) var x22 uint64 var x23 uint64 x22, x23 = bits.Add64(x16, arg1[1], uint64(0x0)) var x24 uint64 var x25 uint64 x24, x25 = bits.Add64(x18, uint64(0x0), uint64(p224Uint1(x23))) var x26 uint64 var x27 uint64 x26, x27 = bits.Add64(x20, uint64(0x0), uint64(p224Uint1(x25))) var x28 uint64 _, x28 = bits.Mul64(x22, 0xffffffffffffffff) var x30 uint64 var x31 uint64 x31, x30 = bits.Mul64(x28, 0xffffffff) var x32 uint64 var x33 uint64 x33, x32 = bits.Mul64(x28, 0xffffffffffffffff) var x34 uint64 var x35 uint64 x35, x34 = bits.Mul64(x28, 0xffffffff00000000) var x36 uint64 var x37 uint64 x36, x37 = bits.Add64(x35, x32, uint64(0x0)) var x38 uint64 var x39 uint64 x38, x39 = bits.Add64(x33, x30, uint64(p224Uint1(x37))) var x41 uint64 _, x41 = bits.Add64(x22, x28, uint64(0x0)) var x42 uint64 var x43 uint64 x42, x43 = bits.Add64(x24, x34, uint64(p224Uint1(x41))) var x44 uint64 var x45 uint64 x44, x45 = bits.Add64(x26, x36, uint64(p224Uint1(x43))) var x46 uint64 var x47 uint64 x46, x47 = bits.Add64((uint64(p224Uint1(x27)) + (uint64(p224Uint1(x21)) + (uint64(p224Uint1(x13)) + x5))), x38, uint64(p224Uint1(x45))) var x48 uint64 var x49 uint64 x48, x49 = bits.Add64(x42, arg1[2], uint64(0x0)) var x50 uint64 var x51 uint64 x50, x51 = bits.Add64(x44, uint64(0x0), uint64(p224Uint1(x49))) var x52 uint64 var x53 uint64 x52, x53 = bits.Add64(x46, uint64(0x0), uint64(p224Uint1(x51))) var x54 uint64 _, x54 = bits.Mul64(x48, 0xffffffffffffffff) var x56 uint64 var x57 uint64 x57, x56 = bits.Mul64(x54, 0xffffffff) var x58 uint64 var x59 uint64 x59, x58 = bits.Mul64(x54, 0xffffffffffffffff) var x60 uint64 var x61 uint64 x61, x60 = bits.Mul64(x54, 0xffffffff00000000) var x62 uint64 var x63 uint64 x62, x63 = bits.Add64(x61, x58, uint64(0x0)) var x64 uint64 var x65 uint64 x64, x65 = bits.Add64(x59, x56, uint64(p224Uint1(x63))) var x67 uint64 _, x67 = bits.Add64(x48, x54, uint64(0x0)) var x68 uint64 var x69 uint64 x68, x69 = bits.Add64(x50, x60, uint64(p224Uint1(x67))) var x70 uint64 var x71 uint64 x70, x71 = bits.Add64(x52, x62, uint64(p224Uint1(x69))) var x72 uint64 var x73 uint64 x72, x73 = bits.Add64((uint64(p224Uint1(x53)) + (uint64(p224Uint1(x47)) + (uint64(p224Uint1(x39)) + x31))), x64, uint64(p224Uint1(x71))) var x74 uint64 var x75 uint64 x74, x75 = bits.Add64(x68, arg1[3], uint64(0x0)) var x76 uint64 var x77 uint64 x76, x77 = bits.Add64(x70, uint64(0x0), uint64(p224Uint1(x75))) var x78 uint64 var x79 uint64 x78, x79 = bits.Add64(x72, uint64(0x0), uint64(p224Uint1(x77))) var x80 uint64 _, x80 = bits.Mul64(x74, 0xffffffffffffffff) var x82 uint64 var x83 uint64 x83, x82 = bits.Mul64(x80, 0xffffffff) var x84 uint64 var x85 uint64 x85, x84 = bits.Mul64(x80, 0xffffffffffffffff) var x86 uint64 var x87 uint64 x87, x86 = bits.Mul64(x80, 0xffffffff00000000) var x88 uint64 var x89 uint64 x88, x89 = bits.Add64(x87, x84, uint64(0x0)) var x90 uint64 var x91 uint64 x90, x91 = bits.Add64(x85, x82, uint64(p224Uint1(x89))) var x93 uint64 _, x93 = bits.Add64(x74, x80, uint64(0x0)) var x94 uint64 var x95 uint64 x94, x95 = bits.Add64(x76, x86, uint64(p224Uint1(x93))) var x96 uint64 var x97 uint64 x96, x97 = bits.Add64(x78, x88, uint64(p224Uint1(x95))) var x98 uint64 var x99 uint64 x98, x99 = bits.Add64((uint64(p224Uint1(x79)) + (uint64(p224Uint1(x73)) + (uint64(p224Uint1(x65)) + x57))), x90, uint64(p224Uint1(x97))) x100 := (uint64(p224Uint1(x99)) + (uint64(p224Uint1(x91)) + x83)) var x101 uint64 var x102 uint64 x101, x102 = bits.Sub64(x94, uint64(0x1), uint64(0x0)) var x103 uint64 var x104 uint64 x103, x104 = bits.Sub64(x96, 0xffffffff00000000, uint64(p224Uint1(x102))) var x105 uint64 var x106 uint64 x105, x106 = bits.Sub64(x98, 0xffffffffffffffff, uint64(p224Uint1(x104))) var x107 uint64 var x108 uint64 x107, x108 = bits.Sub64(x100, 0xffffffff, uint64(p224Uint1(x106))) var x110 uint64 _, x110 = bits.Sub64(uint64(0x0), uint64(0x0), uint64(p224Uint1(x108))) var x111 uint64 p224CmovznzU64(&x111, p224Uint1(x110), x101, x94) var x112 uint64 p224CmovznzU64(&x112, p224Uint1(x110), x103, x96) var x113 uint64 p224CmovznzU64(&x113, p224Uint1(x110), x105, x98) var x114 uint64 p224CmovznzU64(&x114, p224Uint1(x110), x107, x100) out1[0] = x111 out1[1] = x112 out1[2] = x113 out1[3] = x114 } // p224ToMontgomery translates a field element into the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval (from_montgomery out1) mod m = eval arg1 mod m // 0 ≤ eval out1 < m func p224ToMontgomery(out1 *p224MontgomeryDomainFieldElement, arg1 *p224NonMontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[0] var x5 uint64 var x6 uint64 x6, x5 = bits.Mul64(x4, 0xffffffff) var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x4, 0xfffffffe00000000) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x4, 0xffffffff00000000) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x4, 0xffffffff00000001) var x13 uint64 var x14 uint64 x13, x14 = bits.Add64(x12, x9, uint64(0x0)) var x15 uint64 var x16 uint64 x15, x16 = bits.Add64(x10, x7, uint64(p224Uint1(x14))) var x17 uint64 var x18 uint64 x17, x18 = bits.Add64(x8, x5, uint64(p224Uint1(x16))) var x19 uint64 _, x19 = bits.Mul64(x11, 0xffffffffffffffff) var x21 uint64 var x22 uint64 x22, x21 = bits.Mul64(x19, 0xffffffff) var x23 uint64 var x24 uint64 x24, x23 = bits.Mul64(x19, 0xffffffffffffffff) var x25 uint64 var x26 uint64 x26, x25 = bits.Mul64(x19, 0xffffffff00000000) var x27 uint64 var x28 uint64 x27, x28 = bits.Add64(x26, x23, uint64(0x0)) var x29 uint64 var x30 uint64 x29, x30 = bits.Add64(x24, x21, uint64(p224Uint1(x28))) var x32 uint64 _, x32 = bits.Add64(x11, x19, uint64(0x0)) var x33 uint64 var x34 uint64 x33, x34 = bits.Add64(x13, x25, uint64(p224Uint1(x32))) var x35 uint64 var x36 uint64 x35, x36 = bits.Add64(x15, x27, uint64(p224Uint1(x34))) var x37 uint64 var x38 uint64 x37, x38 = bits.Add64(x17, x29, uint64(p224Uint1(x36))) var x39 uint64 var x40 uint64 x40, x39 = bits.Mul64(x1, 0xffffffff) var x41 uint64 var x42 uint64 x42, x41 = bits.Mul64(x1, 0xfffffffe00000000) var x43 uint64 var x44 uint64 x44, x43 = bits.Mul64(x1, 0xffffffff00000000) var x45 uint64 var x46 uint64 x46, x45 = bits.Mul64(x1, 0xffffffff00000001) var x47 uint64 var x48 uint64 x47, x48 = bits.Add64(x46, x43, uint64(0x0)) var x49 uint64 var x50 uint64 x49, x50 = bits.Add64(x44, x41, uint64(p224Uint1(x48))) var x51 uint64 var x52 uint64 x51, x52 = bits.Add64(x42, x39, uint64(p224Uint1(x50))) var x53 uint64 var x54 uint64 x53, x54 = bits.Add64(x33, x45, uint64(0x0)) var x55 uint64 var x56 uint64 x55, x56 = bits.Add64(x35, x47, uint64(p224Uint1(x54))) var x57 uint64 var x58 uint64 x57, x58 = bits.Add64(x37, x49, uint64(p224Uint1(x56))) var x59 uint64 var x60 uint64 x59, x60 = bits.Add64(((uint64(p224Uint1(x38)) + (uint64(p224Uint1(x18)) + x6)) + (uint64(p224Uint1(x30)) + x22)), x51, uint64(p224Uint1(x58))) var x61 uint64 _, x61 = bits.Mul64(x53, 0xffffffffffffffff) var x63 uint64 var x64 uint64 x64, x63 = bits.Mul64(x61, 0xffffffff) var x65 uint64 var x66 uint64 x66, x65 = bits.Mul64(x61, 0xffffffffffffffff) var x67 uint64 var x68 uint64 x68, x67 = bits.Mul64(x61, 0xffffffff00000000) var x69 uint64 var x70 uint64 x69, x70 = bits.Add64(x68, x65, uint64(0x0)) var x71 uint64 var x72 uint64 x71, x72 = bits.Add64(x66, x63, uint64(p224Uint1(x70))) var x74 uint64 _, x74 = bits.Add64(x53, x61, uint64(0x0)) var x75 uint64 var x76 uint64 x75, x76 = bits.Add64(x55, x67, uint64(p224Uint1(x74))) var x77 uint64 var x78 uint64 x77, x78 = bits.Add64(x57, x69, uint64(p224Uint1(x76))) var x79 uint64 var x80 uint64 x79, x80 = bits.Add64(x59, x71, uint64(p224Uint1(x78))) var x81 uint64 var x82 uint64 x82, x81 = bits.Mul64(x2, 0xffffffff) var x83 uint64 var x84 uint64 x84, x83 = bits.Mul64(x2, 0xfffffffe00000000) var x85 uint64 var x86 uint64 x86, x85 = bits.Mul64(x2, 0xffffffff00000000) var x87 uint64 var x88 uint64 x88, x87 = bits.Mul64(x2, 0xffffffff00000001) var x89 uint64 var x90 uint64 x89, x90 = bits.Add64(x88, x85, uint64(0x0)) var x91 uint64 var x92 uint64 x91, x92 = bits.Add64(x86, x83, uint64(p224Uint1(x90))) var x93 uint64 var x94 uint64 x93, x94 = bits.Add64(x84, x81, uint64(p224Uint1(x92))) var x95 uint64 var x96 uint64 x95, x96 = bits.Add64(x75, x87, uint64(0x0)) var x97 uint64 var x98 uint64 x97, x98 = bits.Add64(x77, x89, uint64(p224Uint1(x96))) var x99 uint64 var x100 uint64 x99, x100 = bits.Add64(x79, x91, uint64(p224Uint1(x98))) var x101 uint64 var x102 uint64 x101, x102 = bits.Add64(((uint64(p224Uint1(x80)) + (uint64(p224Uint1(x60)) + (uint64(p224Uint1(x52)) + x40))) + (uint64(p224Uint1(x72)) + x64)), x93, uint64(p224Uint1(x100))) var x103 uint64 _, x103 = bits.Mul64(x95, 0xffffffffffffffff) var x105 uint64 var x106 uint64 x106, x105 = bits.Mul64(x103, 0xffffffff) var x107 uint64 var x108 uint64 x108, x107 = bits.Mul64(x103, 0xffffffffffffffff) var x109 uint64 var x110 uint64 x110, x109 = bits.Mul64(x103, 0xffffffff00000000) var x111 uint64 var x112 uint64 x111, x112 = bits.Add64(x110, x107, uint64(0x0)) var x113 uint64 var x114 uint64 x113, x114 = bits.Add64(x108, x105, uint64(p224Uint1(x112))) var x116 uint64 _, x116 = bits.Add64(x95, x103, uint64(0x0)) var x117 uint64 var x118 uint64 x117, x118 = bits.Add64(x97, x109, uint64(p224Uint1(x116))) var x119 uint64 var x120 uint64 x119, x120 = bits.Add64(x99, x111, uint64(p224Uint1(x118))) var x121 uint64 var x122 uint64 x121, x122 = bits.Add64(x101, x113, uint64(p224Uint1(x120))) var x123 uint64 var x124 uint64 x124, x123 = bits.Mul64(x3, 0xffffffff) var x125 uint64 var x126 uint64 x126, x125 = bits.Mul64(x3, 0xfffffffe00000000) var x127 uint64 var x128 uint64 x128, x127 = bits.Mul64(x3, 0xffffffff00000000) var x129 uint64 var x130 uint64 x130, x129 = bits.Mul64(x3, 0xffffffff00000001) var x131 uint64 var x132 uint64 x131, x132 = bits.Add64(x130, x127, uint64(0x0)) var x133 uint64 var x134 uint64 x133, x134 = bits.Add64(x128, x125, uint64(p224Uint1(x132))) var x135 uint64 var x136 uint64 x135, x136 = bits.Add64(x126, x123, uint64(p224Uint1(x134))) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x117, x129, uint64(0x0)) var x139 uint64 var x140 uint64 x139, x140 = bits.Add64(x119, x131, uint64(p224Uint1(x138))) var x141 uint64 var x142 uint64 x141, x142 = bits.Add64(x121, x133, uint64(p224Uint1(x140))) var x143 uint64 var x144 uint64 x143, x144 = bits.Add64(((uint64(p224Uint1(x122)) + (uint64(p224Uint1(x102)) + (uint64(p224Uint1(x94)) + x82))) + (uint64(p224Uint1(x114)) + x106)), x135, uint64(p224Uint1(x142))) var x145 uint64 _, x145 = bits.Mul64(x137, 0xffffffffffffffff) var x147 uint64 var x148 uint64 x148, x147 = bits.Mul64(x145, 0xffffffff) var x149 uint64 var x150 uint64 x150, x149 = bits.Mul64(x145, 0xffffffffffffffff) var x151 uint64 var x152 uint64 x152, x151 = bits.Mul64(x145, 0xffffffff00000000) var x153 uint64 var x154 uint64 x153, x154 = bits.Add64(x152, x149, uint64(0x0)) var x155 uint64 var x156 uint64 x155, x156 = bits.Add64(x150, x147, uint64(p224Uint1(x154))) var x158 uint64 _, x158 = bits.Add64(x137, x145, uint64(0x0)) var x159 uint64 var x160 uint64 x159, x160 = bits.Add64(x139, x151, uint64(p224Uint1(x158))) var x161 uint64 var x162 uint64 x161, x162 = bits.Add64(x141, x153, uint64(p224Uint1(x160))) var x163 uint64 var x164 uint64 x163, x164 = bits.Add64(x143, x155, uint64(p224Uint1(x162))) x165 := ((uint64(p224Uint1(x164)) + (uint64(p224Uint1(x144)) + (uint64(p224Uint1(x136)) + x124))) + (uint64(p224Uint1(x156)) + x148)) var x166 uint64 var x167 uint64 x166, x167 = bits.Sub64(x159, uint64(0x1), uint64(0x0)) var x168 uint64 var x169 uint64 x168, x169 = bits.Sub64(x161, 0xffffffff00000000, uint64(p224Uint1(x167))) var x170 uint64 var x171 uint64 x170, x171 = bits.Sub64(x163, 0xffffffffffffffff, uint64(p224Uint1(x169))) var x172 uint64 var x173 uint64 x172, x173 = bits.Sub64(x165, 0xffffffff, uint64(p224Uint1(x171))) var x175 uint64 _, x175 = bits.Sub64(uint64(0x0), uint64(0x0), uint64(p224Uint1(x173))) var x176 uint64 p224CmovznzU64(&x176, p224Uint1(x175), x166, x159) var x177 uint64 p224CmovznzU64(&x177, p224Uint1(x175), x168, x161) var x178 uint64 p224CmovznzU64(&x178, p224Uint1(x175), x170, x163) var x179 uint64 p224CmovznzU64(&x179, p224Uint1(x175), x172, x165) out1[0] = x176 out1[1] = x177 out1[2] = x178 out1[3] = x179 } // p224Selectznz is a multi-limb conditional select. // // Postconditions: // // eval out1 = (if arg1 = 0 then eval arg2 else eval arg3) // // Input Bounds: // // arg1: [0x0 ~> 0x1] // arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // // Output Bounds: // // out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] func p224Selectznz(out1 *[4]uint64, arg1 p224Uint1, arg2 *[4]uint64, arg3 *[4]uint64) { var x1 uint64 p224CmovznzU64(&x1, arg1, arg2[0], arg3[0]) var x2 uint64 p224CmovznzU64(&x2, arg1, arg2[1], arg3[1]) var x3 uint64 p224CmovznzU64(&x3, arg1, arg2[2], arg3[2]) var x4 uint64 p224CmovznzU64(&x4, arg1, arg2[3], arg3[3]) out1[0] = x1 out1[1] = x2 out1[2] = x3 out1[3] = x4 } // p224ToBytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..27] // // Input Bounds: // // arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffff]] // // Output Bounds: // // out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]] func p224ToBytes(out1 *[28]uint8, arg1 *[4]uint64) { x1 := arg1[3] x2 := arg1[2] x3 := arg1[1] x4 := arg1[0] x5 := (uint8(x4) & 0xff) x6 := (x4 >> 8) x7 := (uint8(x6) & 0xff) x8 := (x6 >> 8) x9 := (uint8(x8) & 0xff) x10 := (x8 >> 8) x11 := (uint8(x10) & 0xff) x12 := (x10 >> 8) x13 := (uint8(x12) & 0xff) x14 := (x12 >> 8) x15 := (uint8(x14) & 0xff) x16 := (x14 >> 8) x17 := (uint8(x16) & 0xff) x18 := uint8((x16 >> 8)) x19 := (uint8(x3) & 0xff) x20 := (x3 >> 8) x21 := (uint8(x20) & 0xff) x22 := (x20 >> 8) x23 := (uint8(x22) & 0xff) x24 := (x22 >> 8) x25 := (uint8(x24) & 0xff) x26 := (x24 >> 8) x27 := (uint8(x26) & 0xff) x28 := (x26 >> 8) x29 := (uint8(x28) & 0xff) x30 := (x28 >> 8) x31 := (uint8(x30) & 0xff) x32 := uint8((x30 >> 8)) x33 := (uint8(x2) & 0xff) x34 := (x2 >> 8) x35 := (uint8(x34) & 0xff) x36 := (x34 >> 8) x37 := (uint8(x36) & 0xff) x38 := (x36 >> 8) x39 := (uint8(x38) & 0xff) x40 := (x38 >> 8) x41 := (uint8(x40) & 0xff) x42 := (x40 >> 8) x43 := (uint8(x42) & 0xff) x44 := (x42 >> 8) x45 := (uint8(x44) & 0xff) x46 := uint8((x44 >> 8)) x47 := (uint8(x1) & 0xff) x48 := (x1 >> 8) x49 := (uint8(x48) & 0xff) x50 := (x48 >> 8) x51 := (uint8(x50) & 0xff) x52 := uint8((x50 >> 8)) out1[0] = x5 out1[1] = x7 out1[2] = x9 out1[3] = x11 out1[4] = x13 out1[5] = x15 out1[6] = x17 out1[7] = x18 out1[8] = x19 out1[9] = x21 out1[10] = x23 out1[11] = x25 out1[12] = x27 out1[13] = x29 out1[14] = x31 out1[15] = x32 out1[16] = x33 out1[17] = x35 out1[18] = x37 out1[19] = x39 out1[20] = x41 out1[21] = x43 out1[22] = x45 out1[23] = x46 out1[24] = x47 out1[25] = x49 out1[26] = x51 out1[27] = x52 } // p224FromBytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. // // Preconditions: // // 0 ≤ bytes_eval arg1 < m // // Postconditions: // // eval out1 mod m = bytes_eval arg1 mod m // 0 ≤ eval out1 < m // // Input Bounds: // // arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]] // // Output Bounds: // // out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffff]] func p224FromBytes(out1 *[4]uint64, arg1 *[28]uint8) { x1 := (uint64(arg1[27]) << 24) x2 := (uint64(arg1[26]) << 16) x3 := (uint64(arg1[25]) << 8) x4 := arg1[24] x5 := (uint64(arg1[23]) << 56) x6 := (uint64(arg1[22]) << 48) x7 := (uint64(arg1[21]) << 40) x8 := (uint64(arg1[20]) << 32) x9 := (uint64(arg1[19]) << 24) x10 := (uint64(arg1[18]) << 16) x11 := (uint64(arg1[17]) << 8) x12 := arg1[16] x13 := (uint64(arg1[15]) << 56) x14 := (uint64(arg1[14]) << 48) x15 := (uint64(arg1[13]) << 40) x16 := (uint64(arg1[12]) << 32) x17 := (uint64(arg1[11]) << 24) x18 := (uint64(arg1[10]) << 16) x19 := (uint64(arg1[9]) << 8) x20 := arg1[8] x21 := (uint64(arg1[7]) << 56) x22 := (uint64(arg1[6]) << 48) x23 := (uint64(arg1[5]) << 40) x24 := (uint64(arg1[4]) << 32) x25 := (uint64(arg1[3]) << 24) x26 := (uint64(arg1[2]) << 16) x27 := (uint64(arg1[1]) << 8) x28 := arg1[0] x29 := (x27 + uint64(x28)) x30 := (x26 + x29) x31 := (x25 + x30) x32 := (x24 + x31) x33 := (x23 + x32) x34 := (x22 + x33) x35 := (x21 + x34) x36 := (x19 + uint64(x20)) x37 := (x18 + x36) x38 := (x17 + x37) x39 := (x16 + x38) x40 := (x15 + x39) x41 := (x14 + x40) x42 := (x13 + x41) x43 := (x11 + uint64(x12)) x44 := (x10 + x43) x45 := (x9 + x44) x46 := (x8 + x45) x47 := (x7 + x46) x48 := (x6 + x47) x49 := (x5 + x48) x50 := (x3 + uint64(x4)) x51 := (x2 + x50) x52 := (x1 + x51) out1[0] = x35 out1[1] = x42 out1[2] = x49 out1[3] = x52 } golang-filippo-nistec-0.0.4/internal/fiat/p224_invert.go000066400000000000000000000034271512422514700230620ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by addchain. DO NOT EDIT. package fiat // Invert sets e = 1/x, and returns e. // // If x == 0, Invert returns e = 0. func (e *P224Element) Invert(x *P224Element) *P224Element { // Inversion is implemented as exponentiation with exponent p − 2. // The sequence of 11 multiplications and 223 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain v0.4.0. // // _10 = 2*1 // _11 = 1 + _10 // _110 = 2*_11 // _111 = 1 + _110 // _111000 = _111 << 3 // _111111 = _111 + _111000 // x12 = _111111 << 6 + _111111 // x14 = x12 << 2 + _11 // x17 = x14 << 3 + _111 // x31 = x17 << 14 + x14 // x48 = x31 << 17 + x17 // x96 = x48 << 48 + x48 // x127 = x96 << 31 + x31 // return x127 << 97 + x96 // var z = new(P224Element).Set(e) var t0 = new(P224Element) var t1 = new(P224Element) var t2 = new(P224Element) z.Square(x) t0.Mul(x, z) z.Square(t0) z.Mul(x, z) t1.Square(z) for s := 1; s < 3; s++ { t1.Square(t1) } t1.Mul(z, t1) t2.Square(t1) for s := 1; s < 6; s++ { t2.Square(t2) } t1.Mul(t1, t2) for s := 0; s < 2; s++ { t1.Square(t1) } t0.Mul(t0, t1) t1.Square(t0) for s := 1; s < 3; s++ { t1.Square(t1) } z.Mul(z, t1) t1.Square(z) for s := 1; s < 14; s++ { t1.Square(t1) } t0.Mul(t0, t1) t1.Square(t0) for s := 1; s < 17; s++ { t1.Square(t1) } z.Mul(z, t1) t1.Square(z) for s := 1; s < 48; s++ { t1.Square(t1) } z.Mul(z, t1) t1.Square(z) for s := 1; s < 31; s++ { t1.Square(t1) } t0.Mul(t0, t1) for s := 0; s < 97; s++ { t0.Square(t0) } z.Mul(z, t0) return e.Set(z) } golang-filippo-nistec-0.0.4/internal/fiat/p256.go000066400000000000000000000072031512422514700214740ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by generate.go. DO NOT EDIT. package fiat import ( "errors" "filippo.io/nistec/internal/subtle" ) // P256Element is an integer modulo 2^256 - 2^224 + 2^192 + 2^96 - 1. // // The zero value is a valid zero element. type P256Element struct { // Values are represented internally always in the Montgomery domain, and // converted in Bytes and SetBytes. x p256MontgomeryDomainFieldElement } const p256ElementLen = 32 type p256UntypedFieldElement = [4]uint64 // One sets e = 1, and returns e. func (e *P256Element) One() *P256Element { p256SetOne(&e.x) return e } // Equal returns 1 if e == t, and zero otherwise. func (e *P256Element) Equal(t *P256Element) int { eBytes := e.Bytes() tBytes := t.Bytes() return subtle.ConstantTimeCompare(eBytes, tBytes) } // IsZero returns 1 if e == 0, and zero otherwise. func (e *P256Element) IsZero() int { zero := make([]byte, p256ElementLen) eBytes := e.Bytes() return subtle.ConstantTimeCompare(eBytes, zero) } // Set sets e = t, and returns e. func (e *P256Element) Set(t *P256Element) *P256Element { e.x = t.x return e } // Bytes returns the 32-byte big-endian encoding of e. func (e *P256Element) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p256ElementLen]byte return e.bytes(&out) } func (e *P256Element) bytes(out *[p256ElementLen]byte) []byte { var tmp p256NonMontgomeryDomainFieldElement p256FromMontgomery(&tmp, &e.x) p256ToBytes(out, (*p256UntypedFieldElement)(&tmp)) p256InvertEndianness(out[:]) return out[:] } // SetBytes sets e = v, where v is a big-endian 32-byte encoding, and returns e. // If v is not 32 bytes or it encodes a value higher than 2^256 - 2^224 + 2^192 + 2^96 - 1, // SetBytes returns nil and an error, and e is unchanged. func (e *P256Element) SetBytes(v []byte) (*P256Element, error) { if len(v) != p256ElementLen { return nil, errors.New("invalid P256Element encoding") } // Check for non-canonical encodings (p + k, 2p + k, etc.) by comparing to // the encoding of -1 mod p, so p - 1, the highest canonical encoding. var minusOneEncoding = new(P256Element).Sub( new(P256Element), new(P256Element).One()).Bytes() if subtle.ConstantTimeLessOrEqBytes(v, minusOneEncoding) == 0 { return nil, errors.New("invalid P256Element encoding") } var in [p256ElementLen]byte copy(in[:], v) p256InvertEndianness(in[:]) var tmp p256NonMontgomeryDomainFieldElement p256FromBytes((*p256UntypedFieldElement)(&tmp), &in) p256ToMontgomery(&e.x, &tmp) return e, nil } // Add sets e = t1 + t2, and returns e. func (e *P256Element) Add(t1, t2 *P256Element) *P256Element { p256Add(&e.x, &t1.x, &t2.x) return e } // Sub sets e = t1 - t2, and returns e. func (e *P256Element) Sub(t1, t2 *P256Element) *P256Element { p256Sub(&e.x, &t1.x, &t2.x) return e } // Mul sets e = t1 * t2, and returns e. func (e *P256Element) Mul(t1, t2 *P256Element) *P256Element { p256Mul(&e.x, &t1.x, &t2.x) return e } // Square sets e = t * t, and returns e. func (e *P256Element) Square(t *P256Element) *P256Element { p256Square(&e.x, &t.x) return e } // Select sets v to a if cond == 1, and to b if cond == 0. func (v *P256Element) Select(a, b *P256Element, cond int) *P256Element { p256Selectznz((*p256UntypedFieldElement)(&v.x), p256Uint1(cond), (*p256UntypedFieldElement)(&b.x), (*p256UntypedFieldElement)(&a.x)) return v } func p256InvertEndianness(v []byte) { for i := 0; i < len(v)/2; i++ { v[i], v[len(v)-1-i] = v[len(v)-1-i], v[i] } } golang-filippo-nistec-0.0.4/internal/fiat/p256_extra.go000066400000000000000000000006421512422514700226770ustar00rootroot00000000000000// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package fiat // Bits returns a reference to the underlying little-endian fully-reduced // Montgomery representation of e. Handle with care. func (e *P256Element) Bits() *[4]uint64 { var _ p256MontgomeryDomainFieldElement = e.x return (*[4]uint64)(&e.x) } golang-filippo-nistec-0.0.4/internal/fiat/p256_fiat64.go000066400000000000000000001223101512422514700226460ustar00rootroot00000000000000// Code generated by Fiat Cryptography. DO NOT EDIT. // // Autogenerated: word_by_word_montgomery --lang Go --no-wide-int --cmovznz-by-mul --relax-primitive-carry-to-bitwidth 32,64 --internal-static --public-function-case camelCase --public-type-case camelCase --private-function-case camelCase --private-type-case camelCase --doc-text-before-function-name '' --doc-newline-before-package-declaration --doc-prepend-header 'Code generated by Fiat Cryptography. DO NOT EDIT.' --package-name fiat --no-prefix-fiat p256 64 '2^256 - 2^224 + 2^192 + 2^96 - 1' mul square add sub one from_montgomery to_montgomery selectznz to_bytes from_bytes // // curve description: p256 // // machine_wordsize = 64 (from "64") // // requested operations: mul, square, add, sub, one, from_montgomery, to_montgomery, selectznz, to_bytes, from_bytes // // m = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff (from "2^256 - 2^224 + 2^192 + 2^96 - 1") // // // // NOTE: In addition to the bounds specified above each function, all // // functions synthesized for this Montgomery arithmetic require the // // input to be strictly less than the prime modulus (m), and also // // require the input to be in the unique saturated representation. // // All functions also ensure that these two properties are true of // // return values. // // // // Computed values: // // eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) // // bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) // // twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in // // if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 package fiat import "math/bits" type p256Uint1 uint64 // We use uint64 instead of a more narrow type for performance reasons; see https://github.com/mit-plv/fiat-crypto/pull/1006#issuecomment-892625927 type p256Int1 int64 // We use uint64 instead of a more narrow type for performance reasons; see https://github.com/mit-plv/fiat-crypto/pull/1006#issuecomment-892625927 // The type p256MontgomeryDomainFieldElement is a field element in the Montgomery domain. // // Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] type p256MontgomeryDomainFieldElement [4]uint64 // The type p256NonMontgomeryDomainFieldElement is a field element NOT in the Montgomery domain. // // Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] type p256NonMontgomeryDomainFieldElement [4]uint64 // p256CmovznzU64 is a single-word conditional move. // // Postconditions: // // out1 = (if arg1 = 0 then arg2 else arg3) // // Input Bounds: // // arg1: [0x0 ~> 0x1] // arg2: [0x0 ~> 0xffffffffffffffff] // arg3: [0x0 ~> 0xffffffffffffffff] // // Output Bounds: // // out1: [0x0 ~> 0xffffffffffffffff] func p256CmovznzU64(out1 *uint64, arg1 p256Uint1, arg2 uint64, arg3 uint64) { x1 := (uint64(arg1) * 0xffffffffffffffff) x2 := ((x1 & arg3) | ((^x1) & arg2)) *out1 = x2 } // p256Mul multiplies two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p256Mul(out1 *p256MontgomeryDomainFieldElement, arg1 *p256MontgomeryDomainFieldElement, arg2 *p256MontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[0] var x5 uint64 var x6 uint64 x6, x5 = bits.Mul64(x4, arg2[3]) var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x4, arg2[2]) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x4, arg2[1]) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x4, arg2[0]) var x13 uint64 var x14 uint64 x13, x14 = bits.Add64(x12, x9, uint64(0x0)) var x15 uint64 var x16 uint64 x15, x16 = bits.Add64(x10, x7, uint64(p256Uint1(x14))) var x17 uint64 var x18 uint64 x17, x18 = bits.Add64(x8, x5, uint64(p256Uint1(x16))) x19 := (uint64(p256Uint1(x18)) + x6) var x20 uint64 var x21 uint64 x21, x20 = bits.Mul64(x11, 0xffffffff00000001) var x22 uint64 var x23 uint64 x23, x22 = bits.Mul64(x11, 0xffffffff) var x24 uint64 var x25 uint64 x25, x24 = bits.Mul64(x11, 0xffffffffffffffff) var x26 uint64 var x27 uint64 x26, x27 = bits.Add64(x25, x22, uint64(0x0)) x28 := (uint64(p256Uint1(x27)) + x23) var x30 uint64 _, x30 = bits.Add64(x11, x24, uint64(0x0)) var x31 uint64 var x32 uint64 x31, x32 = bits.Add64(x13, x26, uint64(p256Uint1(x30))) var x33 uint64 var x34 uint64 x33, x34 = bits.Add64(x15, x28, uint64(p256Uint1(x32))) var x35 uint64 var x36 uint64 x35, x36 = bits.Add64(x17, x20, uint64(p256Uint1(x34))) var x37 uint64 var x38 uint64 x37, x38 = bits.Add64(x19, x21, uint64(p256Uint1(x36))) var x39 uint64 var x40 uint64 x40, x39 = bits.Mul64(x1, arg2[3]) var x41 uint64 var x42 uint64 x42, x41 = bits.Mul64(x1, arg2[2]) var x43 uint64 var x44 uint64 x44, x43 = bits.Mul64(x1, arg2[1]) var x45 uint64 var x46 uint64 x46, x45 = bits.Mul64(x1, arg2[0]) var x47 uint64 var x48 uint64 x47, x48 = bits.Add64(x46, x43, uint64(0x0)) var x49 uint64 var x50 uint64 x49, x50 = bits.Add64(x44, x41, uint64(p256Uint1(x48))) var x51 uint64 var x52 uint64 x51, x52 = bits.Add64(x42, x39, uint64(p256Uint1(x50))) x53 := (uint64(p256Uint1(x52)) + x40) var x54 uint64 var x55 uint64 x54, x55 = bits.Add64(x31, x45, uint64(0x0)) var x56 uint64 var x57 uint64 x56, x57 = bits.Add64(x33, x47, uint64(p256Uint1(x55))) var x58 uint64 var x59 uint64 x58, x59 = bits.Add64(x35, x49, uint64(p256Uint1(x57))) var x60 uint64 var x61 uint64 x60, x61 = bits.Add64(x37, x51, uint64(p256Uint1(x59))) var x62 uint64 var x63 uint64 x62, x63 = bits.Add64(uint64(p256Uint1(x38)), x53, uint64(p256Uint1(x61))) var x64 uint64 var x65 uint64 x65, x64 = bits.Mul64(x54, 0xffffffff00000001) var x66 uint64 var x67 uint64 x67, x66 = bits.Mul64(x54, 0xffffffff) var x68 uint64 var x69 uint64 x69, x68 = bits.Mul64(x54, 0xffffffffffffffff) var x70 uint64 var x71 uint64 x70, x71 = bits.Add64(x69, x66, uint64(0x0)) x72 := (uint64(p256Uint1(x71)) + x67) var x74 uint64 _, x74 = bits.Add64(x54, x68, uint64(0x0)) var x75 uint64 var x76 uint64 x75, x76 = bits.Add64(x56, x70, uint64(p256Uint1(x74))) var x77 uint64 var x78 uint64 x77, x78 = bits.Add64(x58, x72, uint64(p256Uint1(x76))) var x79 uint64 var x80 uint64 x79, x80 = bits.Add64(x60, x64, uint64(p256Uint1(x78))) var x81 uint64 var x82 uint64 x81, x82 = bits.Add64(x62, x65, uint64(p256Uint1(x80))) x83 := (uint64(p256Uint1(x82)) + uint64(p256Uint1(x63))) var x84 uint64 var x85 uint64 x85, x84 = bits.Mul64(x2, arg2[3]) var x86 uint64 var x87 uint64 x87, x86 = bits.Mul64(x2, arg2[2]) var x88 uint64 var x89 uint64 x89, x88 = bits.Mul64(x2, arg2[1]) var x90 uint64 var x91 uint64 x91, x90 = bits.Mul64(x2, arg2[0]) var x92 uint64 var x93 uint64 x92, x93 = bits.Add64(x91, x88, uint64(0x0)) var x94 uint64 var x95 uint64 x94, x95 = bits.Add64(x89, x86, uint64(p256Uint1(x93))) var x96 uint64 var x97 uint64 x96, x97 = bits.Add64(x87, x84, uint64(p256Uint1(x95))) x98 := (uint64(p256Uint1(x97)) + x85) var x99 uint64 var x100 uint64 x99, x100 = bits.Add64(x75, x90, uint64(0x0)) var x101 uint64 var x102 uint64 x101, x102 = bits.Add64(x77, x92, uint64(p256Uint1(x100))) var x103 uint64 var x104 uint64 x103, x104 = bits.Add64(x79, x94, uint64(p256Uint1(x102))) var x105 uint64 var x106 uint64 x105, x106 = bits.Add64(x81, x96, uint64(p256Uint1(x104))) var x107 uint64 var x108 uint64 x107, x108 = bits.Add64(x83, x98, uint64(p256Uint1(x106))) var x109 uint64 var x110 uint64 x110, x109 = bits.Mul64(x99, 0xffffffff00000001) var x111 uint64 var x112 uint64 x112, x111 = bits.Mul64(x99, 0xffffffff) var x113 uint64 var x114 uint64 x114, x113 = bits.Mul64(x99, 0xffffffffffffffff) var x115 uint64 var x116 uint64 x115, x116 = bits.Add64(x114, x111, uint64(0x0)) x117 := (uint64(p256Uint1(x116)) + x112) var x119 uint64 _, x119 = bits.Add64(x99, x113, uint64(0x0)) var x120 uint64 var x121 uint64 x120, x121 = bits.Add64(x101, x115, uint64(p256Uint1(x119))) var x122 uint64 var x123 uint64 x122, x123 = bits.Add64(x103, x117, uint64(p256Uint1(x121))) var x124 uint64 var x125 uint64 x124, x125 = bits.Add64(x105, x109, uint64(p256Uint1(x123))) var x126 uint64 var x127 uint64 x126, x127 = bits.Add64(x107, x110, uint64(p256Uint1(x125))) x128 := (uint64(p256Uint1(x127)) + uint64(p256Uint1(x108))) var x129 uint64 var x130 uint64 x130, x129 = bits.Mul64(x3, arg2[3]) var x131 uint64 var x132 uint64 x132, x131 = bits.Mul64(x3, arg2[2]) var x133 uint64 var x134 uint64 x134, x133 = bits.Mul64(x3, arg2[1]) var x135 uint64 var x136 uint64 x136, x135 = bits.Mul64(x3, arg2[0]) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x136, x133, uint64(0x0)) var x139 uint64 var x140 uint64 x139, x140 = bits.Add64(x134, x131, uint64(p256Uint1(x138))) var x141 uint64 var x142 uint64 x141, x142 = bits.Add64(x132, x129, uint64(p256Uint1(x140))) x143 := (uint64(p256Uint1(x142)) + x130) var x144 uint64 var x145 uint64 x144, x145 = bits.Add64(x120, x135, uint64(0x0)) var x146 uint64 var x147 uint64 x146, x147 = bits.Add64(x122, x137, uint64(p256Uint1(x145))) var x148 uint64 var x149 uint64 x148, x149 = bits.Add64(x124, x139, uint64(p256Uint1(x147))) var x150 uint64 var x151 uint64 x150, x151 = bits.Add64(x126, x141, uint64(p256Uint1(x149))) var x152 uint64 var x153 uint64 x152, x153 = bits.Add64(x128, x143, uint64(p256Uint1(x151))) var x154 uint64 var x155 uint64 x155, x154 = bits.Mul64(x144, 0xffffffff00000001) var x156 uint64 var x157 uint64 x157, x156 = bits.Mul64(x144, 0xffffffff) var x158 uint64 var x159 uint64 x159, x158 = bits.Mul64(x144, 0xffffffffffffffff) var x160 uint64 var x161 uint64 x160, x161 = bits.Add64(x159, x156, uint64(0x0)) x162 := (uint64(p256Uint1(x161)) + x157) var x164 uint64 _, x164 = bits.Add64(x144, x158, uint64(0x0)) var x165 uint64 var x166 uint64 x165, x166 = bits.Add64(x146, x160, uint64(p256Uint1(x164))) var x167 uint64 var x168 uint64 x167, x168 = bits.Add64(x148, x162, uint64(p256Uint1(x166))) var x169 uint64 var x170 uint64 x169, x170 = bits.Add64(x150, x154, uint64(p256Uint1(x168))) var x171 uint64 var x172 uint64 x171, x172 = bits.Add64(x152, x155, uint64(p256Uint1(x170))) x173 := (uint64(p256Uint1(x172)) + uint64(p256Uint1(x153))) var x174 uint64 var x175 uint64 x174, x175 = bits.Sub64(x165, 0xffffffffffffffff, uint64(0x0)) var x176 uint64 var x177 uint64 x176, x177 = bits.Sub64(x167, 0xffffffff, uint64(p256Uint1(x175))) var x178 uint64 var x179 uint64 x178, x179 = bits.Sub64(x169, uint64(0x0), uint64(p256Uint1(x177))) var x180 uint64 var x181 uint64 x180, x181 = bits.Sub64(x171, 0xffffffff00000001, uint64(p256Uint1(x179))) var x183 uint64 _, x183 = bits.Sub64(x173, uint64(0x0), uint64(p256Uint1(x181))) var x184 uint64 p256CmovznzU64(&x184, p256Uint1(x183), x174, x165) var x185 uint64 p256CmovznzU64(&x185, p256Uint1(x183), x176, x167) var x186 uint64 p256CmovznzU64(&x186, p256Uint1(x183), x178, x169) var x187 uint64 p256CmovznzU64(&x187, p256Uint1(x183), x180, x171) out1[0] = x184 out1[1] = x185 out1[2] = x186 out1[3] = x187 } // p256Square squares a field element in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m // 0 ≤ eval out1 < m func p256Square(out1 *p256MontgomeryDomainFieldElement, arg1 *p256MontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[0] var x5 uint64 var x6 uint64 x6, x5 = bits.Mul64(x4, arg1[3]) var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x4, arg1[2]) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x4, arg1[1]) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x4, arg1[0]) var x13 uint64 var x14 uint64 x13, x14 = bits.Add64(x12, x9, uint64(0x0)) var x15 uint64 var x16 uint64 x15, x16 = bits.Add64(x10, x7, uint64(p256Uint1(x14))) var x17 uint64 var x18 uint64 x17, x18 = bits.Add64(x8, x5, uint64(p256Uint1(x16))) x19 := (uint64(p256Uint1(x18)) + x6) var x20 uint64 var x21 uint64 x21, x20 = bits.Mul64(x11, 0xffffffff00000001) var x22 uint64 var x23 uint64 x23, x22 = bits.Mul64(x11, 0xffffffff) var x24 uint64 var x25 uint64 x25, x24 = bits.Mul64(x11, 0xffffffffffffffff) var x26 uint64 var x27 uint64 x26, x27 = bits.Add64(x25, x22, uint64(0x0)) x28 := (uint64(p256Uint1(x27)) + x23) var x30 uint64 _, x30 = bits.Add64(x11, x24, uint64(0x0)) var x31 uint64 var x32 uint64 x31, x32 = bits.Add64(x13, x26, uint64(p256Uint1(x30))) var x33 uint64 var x34 uint64 x33, x34 = bits.Add64(x15, x28, uint64(p256Uint1(x32))) var x35 uint64 var x36 uint64 x35, x36 = bits.Add64(x17, x20, uint64(p256Uint1(x34))) var x37 uint64 var x38 uint64 x37, x38 = bits.Add64(x19, x21, uint64(p256Uint1(x36))) var x39 uint64 var x40 uint64 x40, x39 = bits.Mul64(x1, arg1[3]) var x41 uint64 var x42 uint64 x42, x41 = bits.Mul64(x1, arg1[2]) var x43 uint64 var x44 uint64 x44, x43 = bits.Mul64(x1, arg1[1]) var x45 uint64 var x46 uint64 x46, x45 = bits.Mul64(x1, arg1[0]) var x47 uint64 var x48 uint64 x47, x48 = bits.Add64(x46, x43, uint64(0x0)) var x49 uint64 var x50 uint64 x49, x50 = bits.Add64(x44, x41, uint64(p256Uint1(x48))) var x51 uint64 var x52 uint64 x51, x52 = bits.Add64(x42, x39, uint64(p256Uint1(x50))) x53 := (uint64(p256Uint1(x52)) + x40) var x54 uint64 var x55 uint64 x54, x55 = bits.Add64(x31, x45, uint64(0x0)) var x56 uint64 var x57 uint64 x56, x57 = bits.Add64(x33, x47, uint64(p256Uint1(x55))) var x58 uint64 var x59 uint64 x58, x59 = bits.Add64(x35, x49, uint64(p256Uint1(x57))) var x60 uint64 var x61 uint64 x60, x61 = bits.Add64(x37, x51, uint64(p256Uint1(x59))) var x62 uint64 var x63 uint64 x62, x63 = bits.Add64(uint64(p256Uint1(x38)), x53, uint64(p256Uint1(x61))) var x64 uint64 var x65 uint64 x65, x64 = bits.Mul64(x54, 0xffffffff00000001) var x66 uint64 var x67 uint64 x67, x66 = bits.Mul64(x54, 0xffffffff) var x68 uint64 var x69 uint64 x69, x68 = bits.Mul64(x54, 0xffffffffffffffff) var x70 uint64 var x71 uint64 x70, x71 = bits.Add64(x69, x66, uint64(0x0)) x72 := (uint64(p256Uint1(x71)) + x67) var x74 uint64 _, x74 = bits.Add64(x54, x68, uint64(0x0)) var x75 uint64 var x76 uint64 x75, x76 = bits.Add64(x56, x70, uint64(p256Uint1(x74))) var x77 uint64 var x78 uint64 x77, x78 = bits.Add64(x58, x72, uint64(p256Uint1(x76))) var x79 uint64 var x80 uint64 x79, x80 = bits.Add64(x60, x64, uint64(p256Uint1(x78))) var x81 uint64 var x82 uint64 x81, x82 = bits.Add64(x62, x65, uint64(p256Uint1(x80))) x83 := (uint64(p256Uint1(x82)) + uint64(p256Uint1(x63))) var x84 uint64 var x85 uint64 x85, x84 = bits.Mul64(x2, arg1[3]) var x86 uint64 var x87 uint64 x87, x86 = bits.Mul64(x2, arg1[2]) var x88 uint64 var x89 uint64 x89, x88 = bits.Mul64(x2, arg1[1]) var x90 uint64 var x91 uint64 x91, x90 = bits.Mul64(x2, arg1[0]) var x92 uint64 var x93 uint64 x92, x93 = bits.Add64(x91, x88, uint64(0x0)) var x94 uint64 var x95 uint64 x94, x95 = bits.Add64(x89, x86, uint64(p256Uint1(x93))) var x96 uint64 var x97 uint64 x96, x97 = bits.Add64(x87, x84, uint64(p256Uint1(x95))) x98 := (uint64(p256Uint1(x97)) + x85) var x99 uint64 var x100 uint64 x99, x100 = bits.Add64(x75, x90, uint64(0x0)) var x101 uint64 var x102 uint64 x101, x102 = bits.Add64(x77, x92, uint64(p256Uint1(x100))) var x103 uint64 var x104 uint64 x103, x104 = bits.Add64(x79, x94, uint64(p256Uint1(x102))) var x105 uint64 var x106 uint64 x105, x106 = bits.Add64(x81, x96, uint64(p256Uint1(x104))) var x107 uint64 var x108 uint64 x107, x108 = bits.Add64(x83, x98, uint64(p256Uint1(x106))) var x109 uint64 var x110 uint64 x110, x109 = bits.Mul64(x99, 0xffffffff00000001) var x111 uint64 var x112 uint64 x112, x111 = bits.Mul64(x99, 0xffffffff) var x113 uint64 var x114 uint64 x114, x113 = bits.Mul64(x99, 0xffffffffffffffff) var x115 uint64 var x116 uint64 x115, x116 = bits.Add64(x114, x111, uint64(0x0)) x117 := (uint64(p256Uint1(x116)) + x112) var x119 uint64 _, x119 = bits.Add64(x99, x113, uint64(0x0)) var x120 uint64 var x121 uint64 x120, x121 = bits.Add64(x101, x115, uint64(p256Uint1(x119))) var x122 uint64 var x123 uint64 x122, x123 = bits.Add64(x103, x117, uint64(p256Uint1(x121))) var x124 uint64 var x125 uint64 x124, x125 = bits.Add64(x105, x109, uint64(p256Uint1(x123))) var x126 uint64 var x127 uint64 x126, x127 = bits.Add64(x107, x110, uint64(p256Uint1(x125))) x128 := (uint64(p256Uint1(x127)) + uint64(p256Uint1(x108))) var x129 uint64 var x130 uint64 x130, x129 = bits.Mul64(x3, arg1[3]) var x131 uint64 var x132 uint64 x132, x131 = bits.Mul64(x3, arg1[2]) var x133 uint64 var x134 uint64 x134, x133 = bits.Mul64(x3, arg1[1]) var x135 uint64 var x136 uint64 x136, x135 = bits.Mul64(x3, arg1[0]) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x136, x133, uint64(0x0)) var x139 uint64 var x140 uint64 x139, x140 = bits.Add64(x134, x131, uint64(p256Uint1(x138))) var x141 uint64 var x142 uint64 x141, x142 = bits.Add64(x132, x129, uint64(p256Uint1(x140))) x143 := (uint64(p256Uint1(x142)) + x130) var x144 uint64 var x145 uint64 x144, x145 = bits.Add64(x120, x135, uint64(0x0)) var x146 uint64 var x147 uint64 x146, x147 = bits.Add64(x122, x137, uint64(p256Uint1(x145))) var x148 uint64 var x149 uint64 x148, x149 = bits.Add64(x124, x139, uint64(p256Uint1(x147))) var x150 uint64 var x151 uint64 x150, x151 = bits.Add64(x126, x141, uint64(p256Uint1(x149))) var x152 uint64 var x153 uint64 x152, x153 = bits.Add64(x128, x143, uint64(p256Uint1(x151))) var x154 uint64 var x155 uint64 x155, x154 = bits.Mul64(x144, 0xffffffff00000001) var x156 uint64 var x157 uint64 x157, x156 = bits.Mul64(x144, 0xffffffff) var x158 uint64 var x159 uint64 x159, x158 = bits.Mul64(x144, 0xffffffffffffffff) var x160 uint64 var x161 uint64 x160, x161 = bits.Add64(x159, x156, uint64(0x0)) x162 := (uint64(p256Uint1(x161)) + x157) var x164 uint64 _, x164 = bits.Add64(x144, x158, uint64(0x0)) var x165 uint64 var x166 uint64 x165, x166 = bits.Add64(x146, x160, uint64(p256Uint1(x164))) var x167 uint64 var x168 uint64 x167, x168 = bits.Add64(x148, x162, uint64(p256Uint1(x166))) var x169 uint64 var x170 uint64 x169, x170 = bits.Add64(x150, x154, uint64(p256Uint1(x168))) var x171 uint64 var x172 uint64 x171, x172 = bits.Add64(x152, x155, uint64(p256Uint1(x170))) x173 := (uint64(p256Uint1(x172)) + uint64(p256Uint1(x153))) var x174 uint64 var x175 uint64 x174, x175 = bits.Sub64(x165, 0xffffffffffffffff, uint64(0x0)) var x176 uint64 var x177 uint64 x176, x177 = bits.Sub64(x167, 0xffffffff, uint64(p256Uint1(x175))) var x178 uint64 var x179 uint64 x178, x179 = bits.Sub64(x169, uint64(0x0), uint64(p256Uint1(x177))) var x180 uint64 var x181 uint64 x180, x181 = bits.Sub64(x171, 0xffffffff00000001, uint64(p256Uint1(x179))) var x183 uint64 _, x183 = bits.Sub64(x173, uint64(0x0), uint64(p256Uint1(x181))) var x184 uint64 p256CmovznzU64(&x184, p256Uint1(x183), x174, x165) var x185 uint64 p256CmovznzU64(&x185, p256Uint1(x183), x176, x167) var x186 uint64 p256CmovznzU64(&x186, p256Uint1(x183), x178, x169) var x187 uint64 p256CmovznzU64(&x187, p256Uint1(x183), x180, x171) out1[0] = x184 out1[1] = x185 out1[2] = x186 out1[3] = x187 } // p256Add adds two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p256Add(out1 *p256MontgomeryDomainFieldElement, arg1 *p256MontgomeryDomainFieldElement, arg2 *p256MontgomeryDomainFieldElement) { var x1 uint64 var x2 uint64 x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) var x3 uint64 var x4 uint64 x3, x4 = bits.Add64(arg1[1], arg2[1], uint64(p256Uint1(x2))) var x5 uint64 var x6 uint64 x5, x6 = bits.Add64(arg1[2], arg2[2], uint64(p256Uint1(x4))) var x7 uint64 var x8 uint64 x7, x8 = bits.Add64(arg1[3], arg2[3], uint64(p256Uint1(x6))) var x9 uint64 var x10 uint64 x9, x10 = bits.Sub64(x1, 0xffffffffffffffff, uint64(0x0)) var x11 uint64 var x12 uint64 x11, x12 = bits.Sub64(x3, 0xffffffff, uint64(p256Uint1(x10))) var x13 uint64 var x14 uint64 x13, x14 = bits.Sub64(x5, uint64(0x0), uint64(p256Uint1(x12))) var x15 uint64 var x16 uint64 x15, x16 = bits.Sub64(x7, 0xffffffff00000001, uint64(p256Uint1(x14))) var x18 uint64 _, x18 = bits.Sub64(uint64(p256Uint1(x8)), uint64(0x0), uint64(p256Uint1(x16))) var x19 uint64 p256CmovznzU64(&x19, p256Uint1(x18), x9, x1) var x20 uint64 p256CmovznzU64(&x20, p256Uint1(x18), x11, x3) var x21 uint64 p256CmovznzU64(&x21, p256Uint1(x18), x13, x5) var x22 uint64 p256CmovznzU64(&x22, p256Uint1(x18), x15, x7) out1[0] = x19 out1[1] = x20 out1[2] = x21 out1[3] = x22 } // p256Sub subtracts two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p256Sub(out1 *p256MontgomeryDomainFieldElement, arg1 *p256MontgomeryDomainFieldElement, arg2 *p256MontgomeryDomainFieldElement) { var x1 uint64 var x2 uint64 x1, x2 = bits.Sub64(arg1[0], arg2[0], uint64(0x0)) var x3 uint64 var x4 uint64 x3, x4 = bits.Sub64(arg1[1], arg2[1], uint64(p256Uint1(x2))) var x5 uint64 var x6 uint64 x5, x6 = bits.Sub64(arg1[2], arg2[2], uint64(p256Uint1(x4))) var x7 uint64 var x8 uint64 x7, x8 = bits.Sub64(arg1[3], arg2[3], uint64(p256Uint1(x6))) var x9 uint64 p256CmovznzU64(&x9, p256Uint1(x8), uint64(0x0), 0xffffffffffffffff) var x10 uint64 var x11 uint64 x10, x11 = bits.Add64(x1, x9, uint64(0x0)) var x12 uint64 var x13 uint64 x12, x13 = bits.Add64(x3, (x9 & 0xffffffff), uint64(p256Uint1(x11))) var x14 uint64 var x15 uint64 x14, x15 = bits.Add64(x5, uint64(0x0), uint64(p256Uint1(x13))) var x16 uint64 x16, _ = bits.Add64(x7, (x9 & 0xffffffff00000001), uint64(p256Uint1(x15))) out1[0] = x10 out1[1] = x12 out1[2] = x14 out1[3] = x16 } // p256SetOne returns the field element one in the Montgomery domain. // // Postconditions: // // eval (from_montgomery out1) mod m = 1 mod m // 0 ≤ eval out1 < m func p256SetOne(out1 *p256MontgomeryDomainFieldElement) { out1[0] = uint64(0x1) out1[1] = 0xffffffff00000000 out1[2] = 0xffffffffffffffff out1[3] = 0xfffffffe } // p256FromMontgomery translates a field element out of the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^4) mod m // 0 ≤ eval out1 < m func p256FromMontgomery(out1 *p256NonMontgomeryDomainFieldElement, arg1 *p256MontgomeryDomainFieldElement) { x1 := arg1[0] var x2 uint64 var x3 uint64 x3, x2 = bits.Mul64(x1, 0xffffffff00000001) var x4 uint64 var x5 uint64 x5, x4 = bits.Mul64(x1, 0xffffffff) var x6 uint64 var x7 uint64 x7, x6 = bits.Mul64(x1, 0xffffffffffffffff) var x8 uint64 var x9 uint64 x8, x9 = bits.Add64(x7, x4, uint64(0x0)) var x11 uint64 _, x11 = bits.Add64(x1, x6, uint64(0x0)) var x12 uint64 var x13 uint64 x12, x13 = bits.Add64(uint64(0x0), x8, uint64(p256Uint1(x11))) var x14 uint64 var x15 uint64 x14, x15 = bits.Add64(x12, arg1[1], uint64(0x0)) var x16 uint64 var x17 uint64 x17, x16 = bits.Mul64(x14, 0xffffffff00000001) var x18 uint64 var x19 uint64 x19, x18 = bits.Mul64(x14, 0xffffffff) var x20 uint64 var x21 uint64 x21, x20 = bits.Mul64(x14, 0xffffffffffffffff) var x22 uint64 var x23 uint64 x22, x23 = bits.Add64(x21, x18, uint64(0x0)) var x25 uint64 _, x25 = bits.Add64(x14, x20, uint64(0x0)) var x26 uint64 var x27 uint64 x26, x27 = bits.Add64((uint64(p256Uint1(x15)) + (uint64(p256Uint1(x13)) + (uint64(p256Uint1(x9)) + x5))), x22, uint64(p256Uint1(x25))) var x28 uint64 var x29 uint64 x28, x29 = bits.Add64(x2, (uint64(p256Uint1(x23)) + x19), uint64(p256Uint1(x27))) var x30 uint64 var x31 uint64 x30, x31 = bits.Add64(x3, x16, uint64(p256Uint1(x29))) var x32 uint64 var x33 uint64 x32, x33 = bits.Add64(x26, arg1[2], uint64(0x0)) var x34 uint64 var x35 uint64 x34, x35 = bits.Add64(x28, uint64(0x0), uint64(p256Uint1(x33))) var x36 uint64 var x37 uint64 x36, x37 = bits.Add64(x30, uint64(0x0), uint64(p256Uint1(x35))) var x38 uint64 var x39 uint64 x39, x38 = bits.Mul64(x32, 0xffffffff00000001) var x40 uint64 var x41 uint64 x41, x40 = bits.Mul64(x32, 0xffffffff) var x42 uint64 var x43 uint64 x43, x42 = bits.Mul64(x32, 0xffffffffffffffff) var x44 uint64 var x45 uint64 x44, x45 = bits.Add64(x43, x40, uint64(0x0)) var x47 uint64 _, x47 = bits.Add64(x32, x42, uint64(0x0)) var x48 uint64 var x49 uint64 x48, x49 = bits.Add64(x34, x44, uint64(p256Uint1(x47))) var x50 uint64 var x51 uint64 x50, x51 = bits.Add64(x36, (uint64(p256Uint1(x45)) + x41), uint64(p256Uint1(x49))) var x52 uint64 var x53 uint64 x52, x53 = bits.Add64((uint64(p256Uint1(x37)) + (uint64(p256Uint1(x31)) + x17)), x38, uint64(p256Uint1(x51))) var x54 uint64 var x55 uint64 x54, x55 = bits.Add64(x48, arg1[3], uint64(0x0)) var x56 uint64 var x57 uint64 x56, x57 = bits.Add64(x50, uint64(0x0), uint64(p256Uint1(x55))) var x58 uint64 var x59 uint64 x58, x59 = bits.Add64(x52, uint64(0x0), uint64(p256Uint1(x57))) var x60 uint64 var x61 uint64 x61, x60 = bits.Mul64(x54, 0xffffffff00000001) var x62 uint64 var x63 uint64 x63, x62 = bits.Mul64(x54, 0xffffffff) var x64 uint64 var x65 uint64 x65, x64 = bits.Mul64(x54, 0xffffffffffffffff) var x66 uint64 var x67 uint64 x66, x67 = bits.Add64(x65, x62, uint64(0x0)) var x69 uint64 _, x69 = bits.Add64(x54, x64, uint64(0x0)) var x70 uint64 var x71 uint64 x70, x71 = bits.Add64(x56, x66, uint64(p256Uint1(x69))) var x72 uint64 var x73 uint64 x72, x73 = bits.Add64(x58, (uint64(p256Uint1(x67)) + x63), uint64(p256Uint1(x71))) var x74 uint64 var x75 uint64 x74, x75 = bits.Add64((uint64(p256Uint1(x59)) + (uint64(p256Uint1(x53)) + x39)), x60, uint64(p256Uint1(x73))) x76 := (uint64(p256Uint1(x75)) + x61) var x77 uint64 var x78 uint64 x77, x78 = bits.Sub64(x70, 0xffffffffffffffff, uint64(0x0)) var x79 uint64 var x80 uint64 x79, x80 = bits.Sub64(x72, 0xffffffff, uint64(p256Uint1(x78))) var x81 uint64 var x82 uint64 x81, x82 = bits.Sub64(x74, uint64(0x0), uint64(p256Uint1(x80))) var x83 uint64 var x84 uint64 x83, x84 = bits.Sub64(x76, 0xffffffff00000001, uint64(p256Uint1(x82))) var x86 uint64 _, x86 = bits.Sub64(uint64(0x0), uint64(0x0), uint64(p256Uint1(x84))) var x87 uint64 p256CmovznzU64(&x87, p256Uint1(x86), x77, x70) var x88 uint64 p256CmovznzU64(&x88, p256Uint1(x86), x79, x72) var x89 uint64 p256CmovznzU64(&x89, p256Uint1(x86), x81, x74) var x90 uint64 p256CmovznzU64(&x90, p256Uint1(x86), x83, x76) out1[0] = x87 out1[1] = x88 out1[2] = x89 out1[3] = x90 } // p256ToMontgomery translates a field element into the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval (from_montgomery out1) mod m = eval arg1 mod m // 0 ≤ eval out1 < m func p256ToMontgomery(out1 *p256MontgomeryDomainFieldElement, arg1 *p256NonMontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[0] var x5 uint64 var x6 uint64 x6, x5 = bits.Mul64(x4, 0x4fffffffd) var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x4, 0xfffffffffffffffe) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x4, 0xfffffffbffffffff) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x4, 0x3) var x13 uint64 var x14 uint64 x13, x14 = bits.Add64(x12, x9, uint64(0x0)) var x15 uint64 var x16 uint64 x15, x16 = bits.Add64(x10, x7, uint64(p256Uint1(x14))) var x17 uint64 var x18 uint64 x17, x18 = bits.Add64(x8, x5, uint64(p256Uint1(x16))) var x19 uint64 var x20 uint64 x20, x19 = bits.Mul64(x11, 0xffffffff00000001) var x21 uint64 var x22 uint64 x22, x21 = bits.Mul64(x11, 0xffffffff) var x23 uint64 var x24 uint64 x24, x23 = bits.Mul64(x11, 0xffffffffffffffff) var x25 uint64 var x26 uint64 x25, x26 = bits.Add64(x24, x21, uint64(0x0)) var x28 uint64 _, x28 = bits.Add64(x11, x23, uint64(0x0)) var x29 uint64 var x30 uint64 x29, x30 = bits.Add64(x13, x25, uint64(p256Uint1(x28))) var x31 uint64 var x32 uint64 x31, x32 = bits.Add64(x15, (uint64(p256Uint1(x26)) + x22), uint64(p256Uint1(x30))) var x33 uint64 var x34 uint64 x33, x34 = bits.Add64(x17, x19, uint64(p256Uint1(x32))) var x35 uint64 var x36 uint64 x35, x36 = bits.Add64((uint64(p256Uint1(x18)) + x6), x20, uint64(p256Uint1(x34))) var x37 uint64 var x38 uint64 x38, x37 = bits.Mul64(x1, 0x4fffffffd) var x39 uint64 var x40 uint64 x40, x39 = bits.Mul64(x1, 0xfffffffffffffffe) var x41 uint64 var x42 uint64 x42, x41 = bits.Mul64(x1, 0xfffffffbffffffff) var x43 uint64 var x44 uint64 x44, x43 = bits.Mul64(x1, 0x3) var x45 uint64 var x46 uint64 x45, x46 = bits.Add64(x44, x41, uint64(0x0)) var x47 uint64 var x48 uint64 x47, x48 = bits.Add64(x42, x39, uint64(p256Uint1(x46))) var x49 uint64 var x50 uint64 x49, x50 = bits.Add64(x40, x37, uint64(p256Uint1(x48))) var x51 uint64 var x52 uint64 x51, x52 = bits.Add64(x29, x43, uint64(0x0)) var x53 uint64 var x54 uint64 x53, x54 = bits.Add64(x31, x45, uint64(p256Uint1(x52))) var x55 uint64 var x56 uint64 x55, x56 = bits.Add64(x33, x47, uint64(p256Uint1(x54))) var x57 uint64 var x58 uint64 x57, x58 = bits.Add64(x35, x49, uint64(p256Uint1(x56))) var x59 uint64 var x60 uint64 x60, x59 = bits.Mul64(x51, 0xffffffff00000001) var x61 uint64 var x62 uint64 x62, x61 = bits.Mul64(x51, 0xffffffff) var x63 uint64 var x64 uint64 x64, x63 = bits.Mul64(x51, 0xffffffffffffffff) var x65 uint64 var x66 uint64 x65, x66 = bits.Add64(x64, x61, uint64(0x0)) var x68 uint64 _, x68 = bits.Add64(x51, x63, uint64(0x0)) var x69 uint64 var x70 uint64 x69, x70 = bits.Add64(x53, x65, uint64(p256Uint1(x68))) var x71 uint64 var x72 uint64 x71, x72 = bits.Add64(x55, (uint64(p256Uint1(x66)) + x62), uint64(p256Uint1(x70))) var x73 uint64 var x74 uint64 x73, x74 = bits.Add64(x57, x59, uint64(p256Uint1(x72))) var x75 uint64 var x76 uint64 x75, x76 = bits.Add64(((uint64(p256Uint1(x58)) + uint64(p256Uint1(x36))) + (uint64(p256Uint1(x50)) + x38)), x60, uint64(p256Uint1(x74))) var x77 uint64 var x78 uint64 x78, x77 = bits.Mul64(x2, 0x4fffffffd) var x79 uint64 var x80 uint64 x80, x79 = bits.Mul64(x2, 0xfffffffffffffffe) var x81 uint64 var x82 uint64 x82, x81 = bits.Mul64(x2, 0xfffffffbffffffff) var x83 uint64 var x84 uint64 x84, x83 = bits.Mul64(x2, 0x3) var x85 uint64 var x86 uint64 x85, x86 = bits.Add64(x84, x81, uint64(0x0)) var x87 uint64 var x88 uint64 x87, x88 = bits.Add64(x82, x79, uint64(p256Uint1(x86))) var x89 uint64 var x90 uint64 x89, x90 = bits.Add64(x80, x77, uint64(p256Uint1(x88))) var x91 uint64 var x92 uint64 x91, x92 = bits.Add64(x69, x83, uint64(0x0)) var x93 uint64 var x94 uint64 x93, x94 = bits.Add64(x71, x85, uint64(p256Uint1(x92))) var x95 uint64 var x96 uint64 x95, x96 = bits.Add64(x73, x87, uint64(p256Uint1(x94))) var x97 uint64 var x98 uint64 x97, x98 = bits.Add64(x75, x89, uint64(p256Uint1(x96))) var x99 uint64 var x100 uint64 x100, x99 = bits.Mul64(x91, 0xffffffff00000001) var x101 uint64 var x102 uint64 x102, x101 = bits.Mul64(x91, 0xffffffff) var x103 uint64 var x104 uint64 x104, x103 = bits.Mul64(x91, 0xffffffffffffffff) var x105 uint64 var x106 uint64 x105, x106 = bits.Add64(x104, x101, uint64(0x0)) var x108 uint64 _, x108 = bits.Add64(x91, x103, uint64(0x0)) var x109 uint64 var x110 uint64 x109, x110 = bits.Add64(x93, x105, uint64(p256Uint1(x108))) var x111 uint64 var x112 uint64 x111, x112 = bits.Add64(x95, (uint64(p256Uint1(x106)) + x102), uint64(p256Uint1(x110))) var x113 uint64 var x114 uint64 x113, x114 = bits.Add64(x97, x99, uint64(p256Uint1(x112))) var x115 uint64 var x116 uint64 x115, x116 = bits.Add64(((uint64(p256Uint1(x98)) + uint64(p256Uint1(x76))) + (uint64(p256Uint1(x90)) + x78)), x100, uint64(p256Uint1(x114))) var x117 uint64 var x118 uint64 x118, x117 = bits.Mul64(x3, 0x4fffffffd) var x119 uint64 var x120 uint64 x120, x119 = bits.Mul64(x3, 0xfffffffffffffffe) var x121 uint64 var x122 uint64 x122, x121 = bits.Mul64(x3, 0xfffffffbffffffff) var x123 uint64 var x124 uint64 x124, x123 = bits.Mul64(x3, 0x3) var x125 uint64 var x126 uint64 x125, x126 = bits.Add64(x124, x121, uint64(0x0)) var x127 uint64 var x128 uint64 x127, x128 = bits.Add64(x122, x119, uint64(p256Uint1(x126))) var x129 uint64 var x130 uint64 x129, x130 = bits.Add64(x120, x117, uint64(p256Uint1(x128))) var x131 uint64 var x132 uint64 x131, x132 = bits.Add64(x109, x123, uint64(0x0)) var x133 uint64 var x134 uint64 x133, x134 = bits.Add64(x111, x125, uint64(p256Uint1(x132))) var x135 uint64 var x136 uint64 x135, x136 = bits.Add64(x113, x127, uint64(p256Uint1(x134))) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x115, x129, uint64(p256Uint1(x136))) var x139 uint64 var x140 uint64 x140, x139 = bits.Mul64(x131, 0xffffffff00000001) var x141 uint64 var x142 uint64 x142, x141 = bits.Mul64(x131, 0xffffffff) var x143 uint64 var x144 uint64 x144, x143 = bits.Mul64(x131, 0xffffffffffffffff) var x145 uint64 var x146 uint64 x145, x146 = bits.Add64(x144, x141, uint64(0x0)) var x148 uint64 _, x148 = bits.Add64(x131, x143, uint64(0x0)) var x149 uint64 var x150 uint64 x149, x150 = bits.Add64(x133, x145, uint64(p256Uint1(x148))) var x151 uint64 var x152 uint64 x151, x152 = bits.Add64(x135, (uint64(p256Uint1(x146)) + x142), uint64(p256Uint1(x150))) var x153 uint64 var x154 uint64 x153, x154 = bits.Add64(x137, x139, uint64(p256Uint1(x152))) var x155 uint64 var x156 uint64 x155, x156 = bits.Add64(((uint64(p256Uint1(x138)) + uint64(p256Uint1(x116))) + (uint64(p256Uint1(x130)) + x118)), x140, uint64(p256Uint1(x154))) var x157 uint64 var x158 uint64 x157, x158 = bits.Sub64(x149, 0xffffffffffffffff, uint64(0x0)) var x159 uint64 var x160 uint64 x159, x160 = bits.Sub64(x151, 0xffffffff, uint64(p256Uint1(x158))) var x161 uint64 var x162 uint64 x161, x162 = bits.Sub64(x153, uint64(0x0), uint64(p256Uint1(x160))) var x163 uint64 var x164 uint64 x163, x164 = bits.Sub64(x155, 0xffffffff00000001, uint64(p256Uint1(x162))) var x166 uint64 _, x166 = bits.Sub64(uint64(p256Uint1(x156)), uint64(0x0), uint64(p256Uint1(x164))) var x167 uint64 p256CmovznzU64(&x167, p256Uint1(x166), x157, x149) var x168 uint64 p256CmovznzU64(&x168, p256Uint1(x166), x159, x151) var x169 uint64 p256CmovznzU64(&x169, p256Uint1(x166), x161, x153) var x170 uint64 p256CmovznzU64(&x170, p256Uint1(x166), x163, x155) out1[0] = x167 out1[1] = x168 out1[2] = x169 out1[3] = x170 } // p256Selectznz is a multi-limb conditional select. // // Postconditions: // // eval out1 = (if arg1 = 0 then eval arg2 else eval arg3) // // Input Bounds: // // arg1: [0x0 ~> 0x1] // arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // // Output Bounds: // // out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] func p256Selectznz(out1 *[4]uint64, arg1 p256Uint1, arg2 *[4]uint64, arg3 *[4]uint64) { var x1 uint64 p256CmovznzU64(&x1, arg1, arg2[0], arg3[0]) var x2 uint64 p256CmovznzU64(&x2, arg1, arg2[1], arg3[1]) var x3 uint64 p256CmovznzU64(&x3, arg1, arg2[2], arg3[2]) var x4 uint64 p256CmovznzU64(&x4, arg1, arg2[3], arg3[3]) out1[0] = x1 out1[1] = x2 out1[2] = x3 out1[3] = x4 } // p256ToBytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31] // // Input Bounds: // // arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // // Output Bounds: // // out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]] func p256ToBytes(out1 *[32]uint8, arg1 *[4]uint64) { x1 := arg1[3] x2 := arg1[2] x3 := arg1[1] x4 := arg1[0] x5 := (uint8(x4) & 0xff) x6 := (x4 >> 8) x7 := (uint8(x6) & 0xff) x8 := (x6 >> 8) x9 := (uint8(x8) & 0xff) x10 := (x8 >> 8) x11 := (uint8(x10) & 0xff) x12 := (x10 >> 8) x13 := (uint8(x12) & 0xff) x14 := (x12 >> 8) x15 := (uint8(x14) & 0xff) x16 := (x14 >> 8) x17 := (uint8(x16) & 0xff) x18 := uint8((x16 >> 8)) x19 := (uint8(x3) & 0xff) x20 := (x3 >> 8) x21 := (uint8(x20) & 0xff) x22 := (x20 >> 8) x23 := (uint8(x22) & 0xff) x24 := (x22 >> 8) x25 := (uint8(x24) & 0xff) x26 := (x24 >> 8) x27 := (uint8(x26) & 0xff) x28 := (x26 >> 8) x29 := (uint8(x28) & 0xff) x30 := (x28 >> 8) x31 := (uint8(x30) & 0xff) x32 := uint8((x30 >> 8)) x33 := (uint8(x2) & 0xff) x34 := (x2 >> 8) x35 := (uint8(x34) & 0xff) x36 := (x34 >> 8) x37 := (uint8(x36) & 0xff) x38 := (x36 >> 8) x39 := (uint8(x38) & 0xff) x40 := (x38 >> 8) x41 := (uint8(x40) & 0xff) x42 := (x40 >> 8) x43 := (uint8(x42) & 0xff) x44 := (x42 >> 8) x45 := (uint8(x44) & 0xff) x46 := uint8((x44 >> 8)) x47 := (uint8(x1) & 0xff) x48 := (x1 >> 8) x49 := (uint8(x48) & 0xff) x50 := (x48 >> 8) x51 := (uint8(x50) & 0xff) x52 := (x50 >> 8) x53 := (uint8(x52) & 0xff) x54 := (x52 >> 8) x55 := (uint8(x54) & 0xff) x56 := (x54 >> 8) x57 := (uint8(x56) & 0xff) x58 := (x56 >> 8) x59 := (uint8(x58) & 0xff) x60 := uint8((x58 >> 8)) out1[0] = x5 out1[1] = x7 out1[2] = x9 out1[3] = x11 out1[4] = x13 out1[5] = x15 out1[6] = x17 out1[7] = x18 out1[8] = x19 out1[9] = x21 out1[10] = x23 out1[11] = x25 out1[12] = x27 out1[13] = x29 out1[14] = x31 out1[15] = x32 out1[16] = x33 out1[17] = x35 out1[18] = x37 out1[19] = x39 out1[20] = x41 out1[21] = x43 out1[22] = x45 out1[23] = x46 out1[24] = x47 out1[25] = x49 out1[26] = x51 out1[27] = x53 out1[28] = x55 out1[29] = x57 out1[30] = x59 out1[31] = x60 } // p256FromBytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. // // Preconditions: // // 0 ≤ bytes_eval arg1 < m // // Postconditions: // // eval out1 mod m = bytes_eval arg1 mod m // 0 ≤ eval out1 < m // // Input Bounds: // // arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]] // // Output Bounds: // // out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] func p256FromBytes(out1 *[4]uint64, arg1 *[32]uint8) { x1 := (uint64(arg1[31]) << 56) x2 := (uint64(arg1[30]) << 48) x3 := (uint64(arg1[29]) << 40) x4 := (uint64(arg1[28]) << 32) x5 := (uint64(arg1[27]) << 24) x6 := (uint64(arg1[26]) << 16) x7 := (uint64(arg1[25]) << 8) x8 := arg1[24] x9 := (uint64(arg1[23]) << 56) x10 := (uint64(arg1[22]) << 48) x11 := (uint64(arg1[21]) << 40) x12 := (uint64(arg1[20]) << 32) x13 := (uint64(arg1[19]) << 24) x14 := (uint64(arg1[18]) << 16) x15 := (uint64(arg1[17]) << 8) x16 := arg1[16] x17 := (uint64(arg1[15]) << 56) x18 := (uint64(arg1[14]) << 48) x19 := (uint64(arg1[13]) << 40) x20 := (uint64(arg1[12]) << 32) x21 := (uint64(arg1[11]) << 24) x22 := (uint64(arg1[10]) << 16) x23 := (uint64(arg1[9]) << 8) x24 := arg1[8] x25 := (uint64(arg1[7]) << 56) x26 := (uint64(arg1[6]) << 48) x27 := (uint64(arg1[5]) << 40) x28 := (uint64(arg1[4]) << 32) x29 := (uint64(arg1[3]) << 24) x30 := (uint64(arg1[2]) << 16) x31 := (uint64(arg1[1]) << 8) x32 := arg1[0] x33 := (x31 + uint64(x32)) x34 := (x30 + x33) x35 := (x29 + x34) x36 := (x28 + x35) x37 := (x27 + x36) x38 := (x26 + x37) x39 := (x25 + x38) x40 := (x23 + uint64(x24)) x41 := (x22 + x40) x42 := (x21 + x41) x43 := (x20 + x42) x44 := (x19 + x43) x45 := (x18 + x44) x46 := (x17 + x45) x47 := (x15 + uint64(x16)) x48 := (x14 + x47) x49 := (x13 + x48) x50 := (x12 + x49) x51 := (x11 + x50) x52 := (x10 + x51) x53 := (x9 + x52) x54 := (x7 + uint64(x8)) x55 := (x6 + x54) x56 := (x5 + x55) x57 := (x4 + x56) x58 := (x3 + x57) x59 := (x2 + x58) x60 := (x1 + x59) out1[0] = x39 out1[1] = x46 out1[2] = x53 out1[3] = x60 } golang-filippo-nistec-0.0.4/internal/fiat/p256_invert.go000066400000000000000000000033431512422514700230640ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by addchain. DO NOT EDIT. package fiat // Invert sets e = 1/x, and returns e. // // If x == 0, Invert returns e = 0. func (e *P256Element) Invert(x *P256Element) *P256Element { // Inversion is implemented as exponentiation with exponent p − 2. // The sequence of 12 multiplications and 255 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain v0.4.0. // // _10 = 2*1 // _11 = 1 + _10 // _110 = 2*_11 // _111 = 1 + _110 // _111000 = _111 << 3 // _111111 = _111 + _111000 // x12 = _111111 << 6 + _111111 // x15 = x12 << 3 + _111 // x16 = 2*x15 + 1 // x32 = x16 << 16 + x16 // i53 = x32 << 15 // x47 = x15 + i53 // i263 = ((i53 << 17 + 1) << 143 + x47) << 47 // return (x47 + i263) << 2 + 1 // var z = new(P256Element).Set(e) var t0 = new(P256Element) var t1 = new(P256Element) z.Square(x) z.Mul(x, z) z.Square(z) z.Mul(x, z) t0.Square(z) for s := 1; s < 3; s++ { t0.Square(t0) } t0.Mul(z, t0) t1.Square(t0) for s := 1; s < 6; s++ { t1.Square(t1) } t0.Mul(t0, t1) for s := 0; s < 3; s++ { t0.Square(t0) } z.Mul(z, t0) t0.Square(z) t0.Mul(x, t0) t1.Square(t0) for s := 1; s < 16; s++ { t1.Square(t1) } t0.Mul(t0, t1) for s := 0; s < 15; s++ { t0.Square(t0) } z.Mul(z, t0) for s := 0; s < 17; s++ { t0.Square(t0) } t0.Mul(x, t0) for s := 0; s < 143; s++ { t0.Square(t0) } t0.Mul(z, t0) for s := 0; s < 47; s++ { t0.Square(t0) } z.Mul(z, t0) for s := 0; s < 2; s++ { z.Square(z) } z.Mul(x, z) return e.Set(z) } golang-filippo-nistec-0.0.4/internal/fiat/p384.go000066400000000000000000000072011512422514700214740ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by generate.go. DO NOT EDIT. package fiat import ( "errors" "filippo.io/nistec/internal/subtle" ) // P384Element is an integer modulo 2^384 - 2^128 - 2^96 + 2^32 - 1. // // The zero value is a valid zero element. type P384Element struct { // Values are represented internally always in the Montgomery domain, and // converted in Bytes and SetBytes. x p384MontgomeryDomainFieldElement } const p384ElementLen = 48 type p384UntypedFieldElement = [6]uint64 // One sets e = 1, and returns e. func (e *P384Element) One() *P384Element { p384SetOne(&e.x) return e } // Equal returns 1 if e == t, and zero otherwise. func (e *P384Element) Equal(t *P384Element) int { eBytes := e.Bytes() tBytes := t.Bytes() return subtle.ConstantTimeCompare(eBytes, tBytes) } // IsZero returns 1 if e == 0, and zero otherwise. func (e *P384Element) IsZero() int { zero := make([]byte, p384ElementLen) eBytes := e.Bytes() return subtle.ConstantTimeCompare(eBytes, zero) } // Set sets e = t, and returns e. func (e *P384Element) Set(t *P384Element) *P384Element { e.x = t.x return e } // Bytes returns the 48-byte big-endian encoding of e. func (e *P384Element) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p384ElementLen]byte return e.bytes(&out) } func (e *P384Element) bytes(out *[p384ElementLen]byte) []byte { var tmp p384NonMontgomeryDomainFieldElement p384FromMontgomery(&tmp, &e.x) p384ToBytes(out, (*p384UntypedFieldElement)(&tmp)) p384InvertEndianness(out[:]) return out[:] } // SetBytes sets e = v, where v is a big-endian 48-byte encoding, and returns e. // If v is not 48 bytes or it encodes a value higher than 2^384 - 2^128 - 2^96 + 2^32 - 1, // SetBytes returns nil and an error, and e is unchanged. func (e *P384Element) SetBytes(v []byte) (*P384Element, error) { if len(v) != p384ElementLen { return nil, errors.New("invalid P384Element encoding") } // Check for non-canonical encodings (p + k, 2p + k, etc.) by comparing to // the encoding of -1 mod p, so p - 1, the highest canonical encoding. var minusOneEncoding = new(P384Element).Sub( new(P384Element), new(P384Element).One()).Bytes() if subtle.ConstantTimeLessOrEqBytes(v, minusOneEncoding) == 0 { return nil, errors.New("invalid P384Element encoding") } var in [p384ElementLen]byte copy(in[:], v) p384InvertEndianness(in[:]) var tmp p384NonMontgomeryDomainFieldElement p384FromBytes((*p384UntypedFieldElement)(&tmp), &in) p384ToMontgomery(&e.x, &tmp) return e, nil } // Add sets e = t1 + t2, and returns e. func (e *P384Element) Add(t1, t2 *P384Element) *P384Element { p384Add(&e.x, &t1.x, &t2.x) return e } // Sub sets e = t1 - t2, and returns e. func (e *P384Element) Sub(t1, t2 *P384Element) *P384Element { p384Sub(&e.x, &t1.x, &t2.x) return e } // Mul sets e = t1 * t2, and returns e. func (e *P384Element) Mul(t1, t2 *P384Element) *P384Element { p384Mul(&e.x, &t1.x, &t2.x) return e } // Square sets e = t * t, and returns e. func (e *P384Element) Square(t *P384Element) *P384Element { p384Square(&e.x, &t.x) return e } // Select sets v to a if cond == 1, and to b if cond == 0. func (v *P384Element) Select(a, b *P384Element, cond int) *P384Element { p384Selectznz((*p384UntypedFieldElement)(&v.x), p384Uint1(cond), (*p384UntypedFieldElement)(&b.x), (*p384UntypedFieldElement)(&a.x)) return v } func p384InvertEndianness(v []byte) { for i := 0; i < len(v)/2; i++ { v[i], v[len(v)-1-i] = v[len(v)-1-i], v[i] } } golang-filippo-nistec-0.0.4/internal/fiat/p384_fiat64.go000066400000000000000000002655051512422514700226660ustar00rootroot00000000000000// Code generated by Fiat Cryptography. DO NOT EDIT. // // Autogenerated: word_by_word_montgomery --lang Go --no-wide-int --cmovznz-by-mul --relax-primitive-carry-to-bitwidth 32,64 --internal-static --public-function-case camelCase --public-type-case camelCase --private-function-case camelCase --private-type-case camelCase --doc-text-before-function-name '' --doc-newline-before-package-declaration --doc-prepend-header 'Code generated by Fiat Cryptography. DO NOT EDIT.' --package-name fiat --no-prefix-fiat p384 64 '2^384 - 2^128 - 2^96 + 2^32 - 1' mul square add sub one from_montgomery to_montgomery selectznz to_bytes from_bytes // // curve description: p384 // // machine_wordsize = 64 (from "64") // // requested operations: mul, square, add, sub, one, from_montgomery, to_montgomery, selectznz, to_bytes, from_bytes // // m = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff (from "2^384 - 2^128 - 2^96 + 2^32 - 1") // // // // NOTE: In addition to the bounds specified above each function, all // // functions synthesized for this Montgomery arithmetic require the // // input to be strictly less than the prime modulus (m), and also // // require the input to be in the unique saturated representation. // // All functions also ensure that these two properties are true of // // return values. // // // // Computed values: // // eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) // // bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) + (z[32] << 256) + (z[33] << 0x108) + (z[34] << 0x110) + (z[35] << 0x118) + (z[36] << 0x120) + (z[37] << 0x128) + (z[38] << 0x130) + (z[39] << 0x138) + (z[40] << 0x140) + (z[41] << 0x148) + (z[42] << 0x150) + (z[43] << 0x158) + (z[44] << 0x160) + (z[45] << 0x168) + (z[46] << 0x170) + (z[47] << 0x178) // // twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) in // // if x1 & (2^384-1) < 2^383 then x1 & (2^384-1) else (x1 & (2^384-1)) - 2^384 package fiat import "math/bits" type p384Uint1 uint64 // We use uint64 instead of a more narrow type for performance reasons; see https://github.com/mit-plv/fiat-crypto/pull/1006#issuecomment-892625927 type p384Int1 int64 // We use uint64 instead of a more narrow type for performance reasons; see https://github.com/mit-plv/fiat-crypto/pull/1006#issuecomment-892625927 // The type p384MontgomeryDomainFieldElement is a field element in the Montgomery domain. // // Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] type p384MontgomeryDomainFieldElement [6]uint64 // The type p384NonMontgomeryDomainFieldElement is a field element NOT in the Montgomery domain. // // Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] type p384NonMontgomeryDomainFieldElement [6]uint64 // p384CmovznzU64 is a single-word conditional move. // // Postconditions: // // out1 = (if arg1 = 0 then arg2 else arg3) // // Input Bounds: // // arg1: [0x0 ~> 0x1] // arg2: [0x0 ~> 0xffffffffffffffff] // arg3: [0x0 ~> 0xffffffffffffffff] // // Output Bounds: // // out1: [0x0 ~> 0xffffffffffffffff] func p384CmovznzU64(out1 *uint64, arg1 p384Uint1, arg2 uint64, arg3 uint64) { x1 := (uint64(arg1) * 0xffffffffffffffff) x2 := ((x1 & arg3) | ((^x1) & arg2)) *out1 = x2 } // p384Mul multiplies two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p384Mul(out1 *p384MontgomeryDomainFieldElement, arg1 *p384MontgomeryDomainFieldElement, arg2 *p384MontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[4] x5 := arg1[5] x6 := arg1[0] var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x6, arg2[5]) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x6, arg2[4]) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x6, arg2[3]) var x13 uint64 var x14 uint64 x14, x13 = bits.Mul64(x6, arg2[2]) var x15 uint64 var x16 uint64 x16, x15 = bits.Mul64(x6, arg2[1]) var x17 uint64 var x18 uint64 x18, x17 = bits.Mul64(x6, arg2[0]) var x19 uint64 var x20 uint64 x19, x20 = bits.Add64(x18, x15, uint64(0x0)) var x21 uint64 var x22 uint64 x21, x22 = bits.Add64(x16, x13, uint64(p384Uint1(x20))) var x23 uint64 var x24 uint64 x23, x24 = bits.Add64(x14, x11, uint64(p384Uint1(x22))) var x25 uint64 var x26 uint64 x25, x26 = bits.Add64(x12, x9, uint64(p384Uint1(x24))) var x27 uint64 var x28 uint64 x27, x28 = bits.Add64(x10, x7, uint64(p384Uint1(x26))) x29 := (uint64(p384Uint1(x28)) + x8) var x30 uint64 _, x30 = bits.Mul64(x17, 0x100000001) var x32 uint64 var x33 uint64 x33, x32 = bits.Mul64(x30, 0xffffffffffffffff) var x34 uint64 var x35 uint64 x35, x34 = bits.Mul64(x30, 0xffffffffffffffff) var x36 uint64 var x37 uint64 x37, x36 = bits.Mul64(x30, 0xffffffffffffffff) var x38 uint64 var x39 uint64 x39, x38 = bits.Mul64(x30, 0xfffffffffffffffe) var x40 uint64 var x41 uint64 x41, x40 = bits.Mul64(x30, 0xffffffff00000000) var x42 uint64 var x43 uint64 x43, x42 = bits.Mul64(x30, 0xffffffff) var x44 uint64 var x45 uint64 x44, x45 = bits.Add64(x43, x40, uint64(0x0)) var x46 uint64 var x47 uint64 x46, x47 = bits.Add64(x41, x38, uint64(p384Uint1(x45))) var x48 uint64 var x49 uint64 x48, x49 = bits.Add64(x39, x36, uint64(p384Uint1(x47))) var x50 uint64 var x51 uint64 x50, x51 = bits.Add64(x37, x34, uint64(p384Uint1(x49))) var x52 uint64 var x53 uint64 x52, x53 = bits.Add64(x35, x32, uint64(p384Uint1(x51))) x54 := (uint64(p384Uint1(x53)) + x33) var x56 uint64 _, x56 = bits.Add64(x17, x42, uint64(0x0)) var x57 uint64 var x58 uint64 x57, x58 = bits.Add64(x19, x44, uint64(p384Uint1(x56))) var x59 uint64 var x60 uint64 x59, x60 = bits.Add64(x21, x46, uint64(p384Uint1(x58))) var x61 uint64 var x62 uint64 x61, x62 = bits.Add64(x23, x48, uint64(p384Uint1(x60))) var x63 uint64 var x64 uint64 x63, x64 = bits.Add64(x25, x50, uint64(p384Uint1(x62))) var x65 uint64 var x66 uint64 x65, x66 = bits.Add64(x27, x52, uint64(p384Uint1(x64))) var x67 uint64 var x68 uint64 x67, x68 = bits.Add64(x29, x54, uint64(p384Uint1(x66))) var x69 uint64 var x70 uint64 x70, x69 = bits.Mul64(x1, arg2[5]) var x71 uint64 var x72 uint64 x72, x71 = bits.Mul64(x1, arg2[4]) var x73 uint64 var x74 uint64 x74, x73 = bits.Mul64(x1, arg2[3]) var x75 uint64 var x76 uint64 x76, x75 = bits.Mul64(x1, arg2[2]) var x77 uint64 var x78 uint64 x78, x77 = bits.Mul64(x1, arg2[1]) var x79 uint64 var x80 uint64 x80, x79 = bits.Mul64(x1, arg2[0]) var x81 uint64 var x82 uint64 x81, x82 = bits.Add64(x80, x77, uint64(0x0)) var x83 uint64 var x84 uint64 x83, x84 = bits.Add64(x78, x75, uint64(p384Uint1(x82))) var x85 uint64 var x86 uint64 x85, x86 = bits.Add64(x76, x73, uint64(p384Uint1(x84))) var x87 uint64 var x88 uint64 x87, x88 = bits.Add64(x74, x71, uint64(p384Uint1(x86))) var x89 uint64 var x90 uint64 x89, x90 = bits.Add64(x72, x69, uint64(p384Uint1(x88))) x91 := (uint64(p384Uint1(x90)) + x70) var x92 uint64 var x93 uint64 x92, x93 = bits.Add64(x57, x79, uint64(0x0)) var x94 uint64 var x95 uint64 x94, x95 = bits.Add64(x59, x81, uint64(p384Uint1(x93))) var x96 uint64 var x97 uint64 x96, x97 = bits.Add64(x61, x83, uint64(p384Uint1(x95))) var x98 uint64 var x99 uint64 x98, x99 = bits.Add64(x63, x85, uint64(p384Uint1(x97))) var x100 uint64 var x101 uint64 x100, x101 = bits.Add64(x65, x87, uint64(p384Uint1(x99))) var x102 uint64 var x103 uint64 x102, x103 = bits.Add64(x67, x89, uint64(p384Uint1(x101))) var x104 uint64 var x105 uint64 x104, x105 = bits.Add64(uint64(p384Uint1(x68)), x91, uint64(p384Uint1(x103))) var x106 uint64 _, x106 = bits.Mul64(x92, 0x100000001) var x108 uint64 var x109 uint64 x109, x108 = bits.Mul64(x106, 0xffffffffffffffff) var x110 uint64 var x111 uint64 x111, x110 = bits.Mul64(x106, 0xffffffffffffffff) var x112 uint64 var x113 uint64 x113, x112 = bits.Mul64(x106, 0xffffffffffffffff) var x114 uint64 var x115 uint64 x115, x114 = bits.Mul64(x106, 0xfffffffffffffffe) var x116 uint64 var x117 uint64 x117, x116 = bits.Mul64(x106, 0xffffffff00000000) var x118 uint64 var x119 uint64 x119, x118 = bits.Mul64(x106, 0xffffffff) var x120 uint64 var x121 uint64 x120, x121 = bits.Add64(x119, x116, uint64(0x0)) var x122 uint64 var x123 uint64 x122, x123 = bits.Add64(x117, x114, uint64(p384Uint1(x121))) var x124 uint64 var x125 uint64 x124, x125 = bits.Add64(x115, x112, uint64(p384Uint1(x123))) var x126 uint64 var x127 uint64 x126, x127 = bits.Add64(x113, x110, uint64(p384Uint1(x125))) var x128 uint64 var x129 uint64 x128, x129 = bits.Add64(x111, x108, uint64(p384Uint1(x127))) x130 := (uint64(p384Uint1(x129)) + x109) var x132 uint64 _, x132 = bits.Add64(x92, x118, uint64(0x0)) var x133 uint64 var x134 uint64 x133, x134 = bits.Add64(x94, x120, uint64(p384Uint1(x132))) var x135 uint64 var x136 uint64 x135, x136 = bits.Add64(x96, x122, uint64(p384Uint1(x134))) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x98, x124, uint64(p384Uint1(x136))) var x139 uint64 var x140 uint64 x139, x140 = bits.Add64(x100, x126, uint64(p384Uint1(x138))) var x141 uint64 var x142 uint64 x141, x142 = bits.Add64(x102, x128, uint64(p384Uint1(x140))) var x143 uint64 var x144 uint64 x143, x144 = bits.Add64(x104, x130, uint64(p384Uint1(x142))) x145 := (uint64(p384Uint1(x144)) + uint64(p384Uint1(x105))) var x146 uint64 var x147 uint64 x147, x146 = bits.Mul64(x2, arg2[5]) var x148 uint64 var x149 uint64 x149, x148 = bits.Mul64(x2, arg2[4]) var x150 uint64 var x151 uint64 x151, x150 = bits.Mul64(x2, arg2[3]) var x152 uint64 var x153 uint64 x153, x152 = bits.Mul64(x2, arg2[2]) var x154 uint64 var x155 uint64 x155, x154 = bits.Mul64(x2, arg2[1]) var x156 uint64 var x157 uint64 x157, x156 = bits.Mul64(x2, arg2[0]) var x158 uint64 var x159 uint64 x158, x159 = bits.Add64(x157, x154, uint64(0x0)) var x160 uint64 var x161 uint64 x160, x161 = bits.Add64(x155, x152, uint64(p384Uint1(x159))) var x162 uint64 var x163 uint64 x162, x163 = bits.Add64(x153, x150, uint64(p384Uint1(x161))) var x164 uint64 var x165 uint64 x164, x165 = bits.Add64(x151, x148, uint64(p384Uint1(x163))) var x166 uint64 var x167 uint64 x166, x167 = bits.Add64(x149, x146, uint64(p384Uint1(x165))) x168 := (uint64(p384Uint1(x167)) + x147) var x169 uint64 var x170 uint64 x169, x170 = bits.Add64(x133, x156, uint64(0x0)) var x171 uint64 var x172 uint64 x171, x172 = bits.Add64(x135, x158, uint64(p384Uint1(x170))) var x173 uint64 var x174 uint64 x173, x174 = bits.Add64(x137, x160, uint64(p384Uint1(x172))) var x175 uint64 var x176 uint64 x175, x176 = bits.Add64(x139, x162, uint64(p384Uint1(x174))) var x177 uint64 var x178 uint64 x177, x178 = bits.Add64(x141, x164, uint64(p384Uint1(x176))) var x179 uint64 var x180 uint64 x179, x180 = bits.Add64(x143, x166, uint64(p384Uint1(x178))) var x181 uint64 var x182 uint64 x181, x182 = bits.Add64(x145, x168, uint64(p384Uint1(x180))) var x183 uint64 _, x183 = bits.Mul64(x169, 0x100000001) var x185 uint64 var x186 uint64 x186, x185 = bits.Mul64(x183, 0xffffffffffffffff) var x187 uint64 var x188 uint64 x188, x187 = bits.Mul64(x183, 0xffffffffffffffff) var x189 uint64 var x190 uint64 x190, x189 = bits.Mul64(x183, 0xffffffffffffffff) var x191 uint64 var x192 uint64 x192, x191 = bits.Mul64(x183, 0xfffffffffffffffe) var x193 uint64 var x194 uint64 x194, x193 = bits.Mul64(x183, 0xffffffff00000000) var x195 uint64 var x196 uint64 x196, x195 = bits.Mul64(x183, 0xffffffff) var x197 uint64 var x198 uint64 x197, x198 = bits.Add64(x196, x193, uint64(0x0)) var x199 uint64 var x200 uint64 x199, x200 = bits.Add64(x194, x191, uint64(p384Uint1(x198))) var x201 uint64 var x202 uint64 x201, x202 = bits.Add64(x192, x189, uint64(p384Uint1(x200))) var x203 uint64 var x204 uint64 x203, x204 = bits.Add64(x190, x187, uint64(p384Uint1(x202))) var x205 uint64 var x206 uint64 x205, x206 = bits.Add64(x188, x185, uint64(p384Uint1(x204))) x207 := (uint64(p384Uint1(x206)) + x186) var x209 uint64 _, x209 = bits.Add64(x169, x195, uint64(0x0)) var x210 uint64 var x211 uint64 x210, x211 = bits.Add64(x171, x197, uint64(p384Uint1(x209))) var x212 uint64 var x213 uint64 x212, x213 = bits.Add64(x173, x199, uint64(p384Uint1(x211))) var x214 uint64 var x215 uint64 x214, x215 = bits.Add64(x175, x201, uint64(p384Uint1(x213))) var x216 uint64 var x217 uint64 x216, x217 = bits.Add64(x177, x203, uint64(p384Uint1(x215))) var x218 uint64 var x219 uint64 x218, x219 = bits.Add64(x179, x205, uint64(p384Uint1(x217))) var x220 uint64 var x221 uint64 x220, x221 = bits.Add64(x181, x207, uint64(p384Uint1(x219))) x222 := (uint64(p384Uint1(x221)) + uint64(p384Uint1(x182))) var x223 uint64 var x224 uint64 x224, x223 = bits.Mul64(x3, arg2[5]) var x225 uint64 var x226 uint64 x226, x225 = bits.Mul64(x3, arg2[4]) var x227 uint64 var x228 uint64 x228, x227 = bits.Mul64(x3, arg2[3]) var x229 uint64 var x230 uint64 x230, x229 = bits.Mul64(x3, arg2[2]) var x231 uint64 var x232 uint64 x232, x231 = bits.Mul64(x3, arg2[1]) var x233 uint64 var x234 uint64 x234, x233 = bits.Mul64(x3, arg2[0]) var x235 uint64 var x236 uint64 x235, x236 = bits.Add64(x234, x231, uint64(0x0)) var x237 uint64 var x238 uint64 x237, x238 = bits.Add64(x232, x229, uint64(p384Uint1(x236))) var x239 uint64 var x240 uint64 x239, x240 = bits.Add64(x230, x227, uint64(p384Uint1(x238))) var x241 uint64 var x242 uint64 x241, x242 = bits.Add64(x228, x225, uint64(p384Uint1(x240))) var x243 uint64 var x244 uint64 x243, x244 = bits.Add64(x226, x223, uint64(p384Uint1(x242))) x245 := (uint64(p384Uint1(x244)) + x224) var x246 uint64 var x247 uint64 x246, x247 = bits.Add64(x210, x233, uint64(0x0)) var x248 uint64 var x249 uint64 x248, x249 = bits.Add64(x212, x235, uint64(p384Uint1(x247))) var x250 uint64 var x251 uint64 x250, x251 = bits.Add64(x214, x237, uint64(p384Uint1(x249))) var x252 uint64 var x253 uint64 x252, x253 = bits.Add64(x216, x239, uint64(p384Uint1(x251))) var x254 uint64 var x255 uint64 x254, x255 = bits.Add64(x218, x241, uint64(p384Uint1(x253))) var x256 uint64 var x257 uint64 x256, x257 = bits.Add64(x220, x243, uint64(p384Uint1(x255))) var x258 uint64 var x259 uint64 x258, x259 = bits.Add64(x222, x245, uint64(p384Uint1(x257))) var x260 uint64 _, x260 = bits.Mul64(x246, 0x100000001) var x262 uint64 var x263 uint64 x263, x262 = bits.Mul64(x260, 0xffffffffffffffff) var x264 uint64 var x265 uint64 x265, x264 = bits.Mul64(x260, 0xffffffffffffffff) var x266 uint64 var x267 uint64 x267, x266 = bits.Mul64(x260, 0xffffffffffffffff) var x268 uint64 var x269 uint64 x269, x268 = bits.Mul64(x260, 0xfffffffffffffffe) var x270 uint64 var x271 uint64 x271, x270 = bits.Mul64(x260, 0xffffffff00000000) var x272 uint64 var x273 uint64 x273, x272 = bits.Mul64(x260, 0xffffffff) var x274 uint64 var x275 uint64 x274, x275 = bits.Add64(x273, x270, uint64(0x0)) var x276 uint64 var x277 uint64 x276, x277 = bits.Add64(x271, x268, uint64(p384Uint1(x275))) var x278 uint64 var x279 uint64 x278, x279 = bits.Add64(x269, x266, uint64(p384Uint1(x277))) var x280 uint64 var x281 uint64 x280, x281 = bits.Add64(x267, x264, uint64(p384Uint1(x279))) var x282 uint64 var x283 uint64 x282, x283 = bits.Add64(x265, x262, uint64(p384Uint1(x281))) x284 := (uint64(p384Uint1(x283)) + x263) var x286 uint64 _, x286 = bits.Add64(x246, x272, uint64(0x0)) var x287 uint64 var x288 uint64 x287, x288 = bits.Add64(x248, x274, uint64(p384Uint1(x286))) var x289 uint64 var x290 uint64 x289, x290 = bits.Add64(x250, x276, uint64(p384Uint1(x288))) var x291 uint64 var x292 uint64 x291, x292 = bits.Add64(x252, x278, uint64(p384Uint1(x290))) var x293 uint64 var x294 uint64 x293, x294 = bits.Add64(x254, x280, uint64(p384Uint1(x292))) var x295 uint64 var x296 uint64 x295, x296 = bits.Add64(x256, x282, uint64(p384Uint1(x294))) var x297 uint64 var x298 uint64 x297, x298 = bits.Add64(x258, x284, uint64(p384Uint1(x296))) x299 := (uint64(p384Uint1(x298)) + uint64(p384Uint1(x259))) var x300 uint64 var x301 uint64 x301, x300 = bits.Mul64(x4, arg2[5]) var x302 uint64 var x303 uint64 x303, x302 = bits.Mul64(x4, arg2[4]) var x304 uint64 var x305 uint64 x305, x304 = bits.Mul64(x4, arg2[3]) var x306 uint64 var x307 uint64 x307, x306 = bits.Mul64(x4, arg2[2]) var x308 uint64 var x309 uint64 x309, x308 = bits.Mul64(x4, arg2[1]) var x310 uint64 var x311 uint64 x311, x310 = bits.Mul64(x4, arg2[0]) var x312 uint64 var x313 uint64 x312, x313 = bits.Add64(x311, x308, uint64(0x0)) var x314 uint64 var x315 uint64 x314, x315 = bits.Add64(x309, x306, uint64(p384Uint1(x313))) var x316 uint64 var x317 uint64 x316, x317 = bits.Add64(x307, x304, uint64(p384Uint1(x315))) var x318 uint64 var x319 uint64 x318, x319 = bits.Add64(x305, x302, uint64(p384Uint1(x317))) var x320 uint64 var x321 uint64 x320, x321 = bits.Add64(x303, x300, uint64(p384Uint1(x319))) x322 := (uint64(p384Uint1(x321)) + x301) var x323 uint64 var x324 uint64 x323, x324 = bits.Add64(x287, x310, uint64(0x0)) var x325 uint64 var x326 uint64 x325, x326 = bits.Add64(x289, x312, uint64(p384Uint1(x324))) var x327 uint64 var x328 uint64 x327, x328 = bits.Add64(x291, x314, uint64(p384Uint1(x326))) var x329 uint64 var x330 uint64 x329, x330 = bits.Add64(x293, x316, uint64(p384Uint1(x328))) var x331 uint64 var x332 uint64 x331, x332 = bits.Add64(x295, x318, uint64(p384Uint1(x330))) var x333 uint64 var x334 uint64 x333, x334 = bits.Add64(x297, x320, uint64(p384Uint1(x332))) var x335 uint64 var x336 uint64 x335, x336 = bits.Add64(x299, x322, uint64(p384Uint1(x334))) var x337 uint64 _, x337 = bits.Mul64(x323, 0x100000001) var x339 uint64 var x340 uint64 x340, x339 = bits.Mul64(x337, 0xffffffffffffffff) var x341 uint64 var x342 uint64 x342, x341 = bits.Mul64(x337, 0xffffffffffffffff) var x343 uint64 var x344 uint64 x344, x343 = bits.Mul64(x337, 0xffffffffffffffff) var x345 uint64 var x346 uint64 x346, x345 = bits.Mul64(x337, 0xfffffffffffffffe) var x347 uint64 var x348 uint64 x348, x347 = bits.Mul64(x337, 0xffffffff00000000) var x349 uint64 var x350 uint64 x350, x349 = bits.Mul64(x337, 0xffffffff) var x351 uint64 var x352 uint64 x351, x352 = bits.Add64(x350, x347, uint64(0x0)) var x353 uint64 var x354 uint64 x353, x354 = bits.Add64(x348, x345, uint64(p384Uint1(x352))) var x355 uint64 var x356 uint64 x355, x356 = bits.Add64(x346, x343, uint64(p384Uint1(x354))) var x357 uint64 var x358 uint64 x357, x358 = bits.Add64(x344, x341, uint64(p384Uint1(x356))) var x359 uint64 var x360 uint64 x359, x360 = bits.Add64(x342, x339, uint64(p384Uint1(x358))) x361 := (uint64(p384Uint1(x360)) + x340) var x363 uint64 _, x363 = bits.Add64(x323, x349, uint64(0x0)) var x364 uint64 var x365 uint64 x364, x365 = bits.Add64(x325, x351, uint64(p384Uint1(x363))) var x366 uint64 var x367 uint64 x366, x367 = bits.Add64(x327, x353, uint64(p384Uint1(x365))) var x368 uint64 var x369 uint64 x368, x369 = bits.Add64(x329, x355, uint64(p384Uint1(x367))) var x370 uint64 var x371 uint64 x370, x371 = bits.Add64(x331, x357, uint64(p384Uint1(x369))) var x372 uint64 var x373 uint64 x372, x373 = bits.Add64(x333, x359, uint64(p384Uint1(x371))) var x374 uint64 var x375 uint64 x374, x375 = bits.Add64(x335, x361, uint64(p384Uint1(x373))) x376 := (uint64(p384Uint1(x375)) + uint64(p384Uint1(x336))) var x377 uint64 var x378 uint64 x378, x377 = bits.Mul64(x5, arg2[5]) var x379 uint64 var x380 uint64 x380, x379 = bits.Mul64(x5, arg2[4]) var x381 uint64 var x382 uint64 x382, x381 = bits.Mul64(x5, arg2[3]) var x383 uint64 var x384 uint64 x384, x383 = bits.Mul64(x5, arg2[2]) var x385 uint64 var x386 uint64 x386, x385 = bits.Mul64(x5, arg2[1]) var x387 uint64 var x388 uint64 x388, x387 = bits.Mul64(x5, arg2[0]) var x389 uint64 var x390 uint64 x389, x390 = bits.Add64(x388, x385, uint64(0x0)) var x391 uint64 var x392 uint64 x391, x392 = bits.Add64(x386, x383, uint64(p384Uint1(x390))) var x393 uint64 var x394 uint64 x393, x394 = bits.Add64(x384, x381, uint64(p384Uint1(x392))) var x395 uint64 var x396 uint64 x395, x396 = bits.Add64(x382, x379, uint64(p384Uint1(x394))) var x397 uint64 var x398 uint64 x397, x398 = bits.Add64(x380, x377, uint64(p384Uint1(x396))) x399 := (uint64(p384Uint1(x398)) + x378) var x400 uint64 var x401 uint64 x400, x401 = bits.Add64(x364, x387, uint64(0x0)) var x402 uint64 var x403 uint64 x402, x403 = bits.Add64(x366, x389, uint64(p384Uint1(x401))) var x404 uint64 var x405 uint64 x404, x405 = bits.Add64(x368, x391, uint64(p384Uint1(x403))) var x406 uint64 var x407 uint64 x406, x407 = bits.Add64(x370, x393, uint64(p384Uint1(x405))) var x408 uint64 var x409 uint64 x408, x409 = bits.Add64(x372, x395, uint64(p384Uint1(x407))) var x410 uint64 var x411 uint64 x410, x411 = bits.Add64(x374, x397, uint64(p384Uint1(x409))) var x412 uint64 var x413 uint64 x412, x413 = bits.Add64(x376, x399, uint64(p384Uint1(x411))) var x414 uint64 _, x414 = bits.Mul64(x400, 0x100000001) var x416 uint64 var x417 uint64 x417, x416 = bits.Mul64(x414, 0xffffffffffffffff) var x418 uint64 var x419 uint64 x419, x418 = bits.Mul64(x414, 0xffffffffffffffff) var x420 uint64 var x421 uint64 x421, x420 = bits.Mul64(x414, 0xffffffffffffffff) var x422 uint64 var x423 uint64 x423, x422 = bits.Mul64(x414, 0xfffffffffffffffe) var x424 uint64 var x425 uint64 x425, x424 = bits.Mul64(x414, 0xffffffff00000000) var x426 uint64 var x427 uint64 x427, x426 = bits.Mul64(x414, 0xffffffff) var x428 uint64 var x429 uint64 x428, x429 = bits.Add64(x427, x424, uint64(0x0)) var x430 uint64 var x431 uint64 x430, x431 = bits.Add64(x425, x422, uint64(p384Uint1(x429))) var x432 uint64 var x433 uint64 x432, x433 = bits.Add64(x423, x420, uint64(p384Uint1(x431))) var x434 uint64 var x435 uint64 x434, x435 = bits.Add64(x421, x418, uint64(p384Uint1(x433))) var x436 uint64 var x437 uint64 x436, x437 = bits.Add64(x419, x416, uint64(p384Uint1(x435))) x438 := (uint64(p384Uint1(x437)) + x417) var x440 uint64 _, x440 = bits.Add64(x400, x426, uint64(0x0)) var x441 uint64 var x442 uint64 x441, x442 = bits.Add64(x402, x428, uint64(p384Uint1(x440))) var x443 uint64 var x444 uint64 x443, x444 = bits.Add64(x404, x430, uint64(p384Uint1(x442))) var x445 uint64 var x446 uint64 x445, x446 = bits.Add64(x406, x432, uint64(p384Uint1(x444))) var x447 uint64 var x448 uint64 x447, x448 = bits.Add64(x408, x434, uint64(p384Uint1(x446))) var x449 uint64 var x450 uint64 x449, x450 = bits.Add64(x410, x436, uint64(p384Uint1(x448))) var x451 uint64 var x452 uint64 x451, x452 = bits.Add64(x412, x438, uint64(p384Uint1(x450))) x453 := (uint64(p384Uint1(x452)) + uint64(p384Uint1(x413))) var x454 uint64 var x455 uint64 x454, x455 = bits.Sub64(x441, 0xffffffff, uint64(0x0)) var x456 uint64 var x457 uint64 x456, x457 = bits.Sub64(x443, 0xffffffff00000000, uint64(p384Uint1(x455))) var x458 uint64 var x459 uint64 x458, x459 = bits.Sub64(x445, 0xfffffffffffffffe, uint64(p384Uint1(x457))) var x460 uint64 var x461 uint64 x460, x461 = bits.Sub64(x447, 0xffffffffffffffff, uint64(p384Uint1(x459))) var x462 uint64 var x463 uint64 x462, x463 = bits.Sub64(x449, 0xffffffffffffffff, uint64(p384Uint1(x461))) var x464 uint64 var x465 uint64 x464, x465 = bits.Sub64(x451, 0xffffffffffffffff, uint64(p384Uint1(x463))) var x467 uint64 _, x467 = bits.Sub64(x453, uint64(0x0), uint64(p384Uint1(x465))) var x468 uint64 p384CmovznzU64(&x468, p384Uint1(x467), x454, x441) var x469 uint64 p384CmovznzU64(&x469, p384Uint1(x467), x456, x443) var x470 uint64 p384CmovznzU64(&x470, p384Uint1(x467), x458, x445) var x471 uint64 p384CmovznzU64(&x471, p384Uint1(x467), x460, x447) var x472 uint64 p384CmovznzU64(&x472, p384Uint1(x467), x462, x449) var x473 uint64 p384CmovznzU64(&x473, p384Uint1(x467), x464, x451) out1[0] = x468 out1[1] = x469 out1[2] = x470 out1[3] = x471 out1[4] = x472 out1[5] = x473 } // p384Square squares a field element in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m // 0 ≤ eval out1 < m func p384Square(out1 *p384MontgomeryDomainFieldElement, arg1 *p384MontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[4] x5 := arg1[5] x6 := arg1[0] var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x6, arg1[5]) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x6, arg1[4]) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x6, arg1[3]) var x13 uint64 var x14 uint64 x14, x13 = bits.Mul64(x6, arg1[2]) var x15 uint64 var x16 uint64 x16, x15 = bits.Mul64(x6, arg1[1]) var x17 uint64 var x18 uint64 x18, x17 = bits.Mul64(x6, arg1[0]) var x19 uint64 var x20 uint64 x19, x20 = bits.Add64(x18, x15, uint64(0x0)) var x21 uint64 var x22 uint64 x21, x22 = bits.Add64(x16, x13, uint64(p384Uint1(x20))) var x23 uint64 var x24 uint64 x23, x24 = bits.Add64(x14, x11, uint64(p384Uint1(x22))) var x25 uint64 var x26 uint64 x25, x26 = bits.Add64(x12, x9, uint64(p384Uint1(x24))) var x27 uint64 var x28 uint64 x27, x28 = bits.Add64(x10, x7, uint64(p384Uint1(x26))) x29 := (uint64(p384Uint1(x28)) + x8) var x30 uint64 _, x30 = bits.Mul64(x17, 0x100000001) var x32 uint64 var x33 uint64 x33, x32 = bits.Mul64(x30, 0xffffffffffffffff) var x34 uint64 var x35 uint64 x35, x34 = bits.Mul64(x30, 0xffffffffffffffff) var x36 uint64 var x37 uint64 x37, x36 = bits.Mul64(x30, 0xffffffffffffffff) var x38 uint64 var x39 uint64 x39, x38 = bits.Mul64(x30, 0xfffffffffffffffe) var x40 uint64 var x41 uint64 x41, x40 = bits.Mul64(x30, 0xffffffff00000000) var x42 uint64 var x43 uint64 x43, x42 = bits.Mul64(x30, 0xffffffff) var x44 uint64 var x45 uint64 x44, x45 = bits.Add64(x43, x40, uint64(0x0)) var x46 uint64 var x47 uint64 x46, x47 = bits.Add64(x41, x38, uint64(p384Uint1(x45))) var x48 uint64 var x49 uint64 x48, x49 = bits.Add64(x39, x36, uint64(p384Uint1(x47))) var x50 uint64 var x51 uint64 x50, x51 = bits.Add64(x37, x34, uint64(p384Uint1(x49))) var x52 uint64 var x53 uint64 x52, x53 = bits.Add64(x35, x32, uint64(p384Uint1(x51))) x54 := (uint64(p384Uint1(x53)) + x33) var x56 uint64 _, x56 = bits.Add64(x17, x42, uint64(0x0)) var x57 uint64 var x58 uint64 x57, x58 = bits.Add64(x19, x44, uint64(p384Uint1(x56))) var x59 uint64 var x60 uint64 x59, x60 = bits.Add64(x21, x46, uint64(p384Uint1(x58))) var x61 uint64 var x62 uint64 x61, x62 = bits.Add64(x23, x48, uint64(p384Uint1(x60))) var x63 uint64 var x64 uint64 x63, x64 = bits.Add64(x25, x50, uint64(p384Uint1(x62))) var x65 uint64 var x66 uint64 x65, x66 = bits.Add64(x27, x52, uint64(p384Uint1(x64))) var x67 uint64 var x68 uint64 x67, x68 = bits.Add64(x29, x54, uint64(p384Uint1(x66))) var x69 uint64 var x70 uint64 x70, x69 = bits.Mul64(x1, arg1[5]) var x71 uint64 var x72 uint64 x72, x71 = bits.Mul64(x1, arg1[4]) var x73 uint64 var x74 uint64 x74, x73 = bits.Mul64(x1, arg1[3]) var x75 uint64 var x76 uint64 x76, x75 = bits.Mul64(x1, arg1[2]) var x77 uint64 var x78 uint64 x78, x77 = bits.Mul64(x1, arg1[1]) var x79 uint64 var x80 uint64 x80, x79 = bits.Mul64(x1, arg1[0]) var x81 uint64 var x82 uint64 x81, x82 = bits.Add64(x80, x77, uint64(0x0)) var x83 uint64 var x84 uint64 x83, x84 = bits.Add64(x78, x75, uint64(p384Uint1(x82))) var x85 uint64 var x86 uint64 x85, x86 = bits.Add64(x76, x73, uint64(p384Uint1(x84))) var x87 uint64 var x88 uint64 x87, x88 = bits.Add64(x74, x71, uint64(p384Uint1(x86))) var x89 uint64 var x90 uint64 x89, x90 = bits.Add64(x72, x69, uint64(p384Uint1(x88))) x91 := (uint64(p384Uint1(x90)) + x70) var x92 uint64 var x93 uint64 x92, x93 = bits.Add64(x57, x79, uint64(0x0)) var x94 uint64 var x95 uint64 x94, x95 = bits.Add64(x59, x81, uint64(p384Uint1(x93))) var x96 uint64 var x97 uint64 x96, x97 = bits.Add64(x61, x83, uint64(p384Uint1(x95))) var x98 uint64 var x99 uint64 x98, x99 = bits.Add64(x63, x85, uint64(p384Uint1(x97))) var x100 uint64 var x101 uint64 x100, x101 = bits.Add64(x65, x87, uint64(p384Uint1(x99))) var x102 uint64 var x103 uint64 x102, x103 = bits.Add64(x67, x89, uint64(p384Uint1(x101))) var x104 uint64 var x105 uint64 x104, x105 = bits.Add64(uint64(p384Uint1(x68)), x91, uint64(p384Uint1(x103))) var x106 uint64 _, x106 = bits.Mul64(x92, 0x100000001) var x108 uint64 var x109 uint64 x109, x108 = bits.Mul64(x106, 0xffffffffffffffff) var x110 uint64 var x111 uint64 x111, x110 = bits.Mul64(x106, 0xffffffffffffffff) var x112 uint64 var x113 uint64 x113, x112 = bits.Mul64(x106, 0xffffffffffffffff) var x114 uint64 var x115 uint64 x115, x114 = bits.Mul64(x106, 0xfffffffffffffffe) var x116 uint64 var x117 uint64 x117, x116 = bits.Mul64(x106, 0xffffffff00000000) var x118 uint64 var x119 uint64 x119, x118 = bits.Mul64(x106, 0xffffffff) var x120 uint64 var x121 uint64 x120, x121 = bits.Add64(x119, x116, uint64(0x0)) var x122 uint64 var x123 uint64 x122, x123 = bits.Add64(x117, x114, uint64(p384Uint1(x121))) var x124 uint64 var x125 uint64 x124, x125 = bits.Add64(x115, x112, uint64(p384Uint1(x123))) var x126 uint64 var x127 uint64 x126, x127 = bits.Add64(x113, x110, uint64(p384Uint1(x125))) var x128 uint64 var x129 uint64 x128, x129 = bits.Add64(x111, x108, uint64(p384Uint1(x127))) x130 := (uint64(p384Uint1(x129)) + x109) var x132 uint64 _, x132 = bits.Add64(x92, x118, uint64(0x0)) var x133 uint64 var x134 uint64 x133, x134 = bits.Add64(x94, x120, uint64(p384Uint1(x132))) var x135 uint64 var x136 uint64 x135, x136 = bits.Add64(x96, x122, uint64(p384Uint1(x134))) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x98, x124, uint64(p384Uint1(x136))) var x139 uint64 var x140 uint64 x139, x140 = bits.Add64(x100, x126, uint64(p384Uint1(x138))) var x141 uint64 var x142 uint64 x141, x142 = bits.Add64(x102, x128, uint64(p384Uint1(x140))) var x143 uint64 var x144 uint64 x143, x144 = bits.Add64(x104, x130, uint64(p384Uint1(x142))) x145 := (uint64(p384Uint1(x144)) + uint64(p384Uint1(x105))) var x146 uint64 var x147 uint64 x147, x146 = bits.Mul64(x2, arg1[5]) var x148 uint64 var x149 uint64 x149, x148 = bits.Mul64(x2, arg1[4]) var x150 uint64 var x151 uint64 x151, x150 = bits.Mul64(x2, arg1[3]) var x152 uint64 var x153 uint64 x153, x152 = bits.Mul64(x2, arg1[2]) var x154 uint64 var x155 uint64 x155, x154 = bits.Mul64(x2, arg1[1]) var x156 uint64 var x157 uint64 x157, x156 = bits.Mul64(x2, arg1[0]) var x158 uint64 var x159 uint64 x158, x159 = bits.Add64(x157, x154, uint64(0x0)) var x160 uint64 var x161 uint64 x160, x161 = bits.Add64(x155, x152, uint64(p384Uint1(x159))) var x162 uint64 var x163 uint64 x162, x163 = bits.Add64(x153, x150, uint64(p384Uint1(x161))) var x164 uint64 var x165 uint64 x164, x165 = bits.Add64(x151, x148, uint64(p384Uint1(x163))) var x166 uint64 var x167 uint64 x166, x167 = bits.Add64(x149, x146, uint64(p384Uint1(x165))) x168 := (uint64(p384Uint1(x167)) + x147) var x169 uint64 var x170 uint64 x169, x170 = bits.Add64(x133, x156, uint64(0x0)) var x171 uint64 var x172 uint64 x171, x172 = bits.Add64(x135, x158, uint64(p384Uint1(x170))) var x173 uint64 var x174 uint64 x173, x174 = bits.Add64(x137, x160, uint64(p384Uint1(x172))) var x175 uint64 var x176 uint64 x175, x176 = bits.Add64(x139, x162, uint64(p384Uint1(x174))) var x177 uint64 var x178 uint64 x177, x178 = bits.Add64(x141, x164, uint64(p384Uint1(x176))) var x179 uint64 var x180 uint64 x179, x180 = bits.Add64(x143, x166, uint64(p384Uint1(x178))) var x181 uint64 var x182 uint64 x181, x182 = bits.Add64(x145, x168, uint64(p384Uint1(x180))) var x183 uint64 _, x183 = bits.Mul64(x169, 0x100000001) var x185 uint64 var x186 uint64 x186, x185 = bits.Mul64(x183, 0xffffffffffffffff) var x187 uint64 var x188 uint64 x188, x187 = bits.Mul64(x183, 0xffffffffffffffff) var x189 uint64 var x190 uint64 x190, x189 = bits.Mul64(x183, 0xffffffffffffffff) var x191 uint64 var x192 uint64 x192, x191 = bits.Mul64(x183, 0xfffffffffffffffe) var x193 uint64 var x194 uint64 x194, x193 = bits.Mul64(x183, 0xffffffff00000000) var x195 uint64 var x196 uint64 x196, x195 = bits.Mul64(x183, 0xffffffff) var x197 uint64 var x198 uint64 x197, x198 = bits.Add64(x196, x193, uint64(0x0)) var x199 uint64 var x200 uint64 x199, x200 = bits.Add64(x194, x191, uint64(p384Uint1(x198))) var x201 uint64 var x202 uint64 x201, x202 = bits.Add64(x192, x189, uint64(p384Uint1(x200))) var x203 uint64 var x204 uint64 x203, x204 = bits.Add64(x190, x187, uint64(p384Uint1(x202))) var x205 uint64 var x206 uint64 x205, x206 = bits.Add64(x188, x185, uint64(p384Uint1(x204))) x207 := (uint64(p384Uint1(x206)) + x186) var x209 uint64 _, x209 = bits.Add64(x169, x195, uint64(0x0)) var x210 uint64 var x211 uint64 x210, x211 = bits.Add64(x171, x197, uint64(p384Uint1(x209))) var x212 uint64 var x213 uint64 x212, x213 = bits.Add64(x173, x199, uint64(p384Uint1(x211))) var x214 uint64 var x215 uint64 x214, x215 = bits.Add64(x175, x201, uint64(p384Uint1(x213))) var x216 uint64 var x217 uint64 x216, x217 = bits.Add64(x177, x203, uint64(p384Uint1(x215))) var x218 uint64 var x219 uint64 x218, x219 = bits.Add64(x179, x205, uint64(p384Uint1(x217))) var x220 uint64 var x221 uint64 x220, x221 = bits.Add64(x181, x207, uint64(p384Uint1(x219))) x222 := (uint64(p384Uint1(x221)) + uint64(p384Uint1(x182))) var x223 uint64 var x224 uint64 x224, x223 = bits.Mul64(x3, arg1[5]) var x225 uint64 var x226 uint64 x226, x225 = bits.Mul64(x3, arg1[4]) var x227 uint64 var x228 uint64 x228, x227 = bits.Mul64(x3, arg1[3]) var x229 uint64 var x230 uint64 x230, x229 = bits.Mul64(x3, arg1[2]) var x231 uint64 var x232 uint64 x232, x231 = bits.Mul64(x3, arg1[1]) var x233 uint64 var x234 uint64 x234, x233 = bits.Mul64(x3, arg1[0]) var x235 uint64 var x236 uint64 x235, x236 = bits.Add64(x234, x231, uint64(0x0)) var x237 uint64 var x238 uint64 x237, x238 = bits.Add64(x232, x229, uint64(p384Uint1(x236))) var x239 uint64 var x240 uint64 x239, x240 = bits.Add64(x230, x227, uint64(p384Uint1(x238))) var x241 uint64 var x242 uint64 x241, x242 = bits.Add64(x228, x225, uint64(p384Uint1(x240))) var x243 uint64 var x244 uint64 x243, x244 = bits.Add64(x226, x223, uint64(p384Uint1(x242))) x245 := (uint64(p384Uint1(x244)) + x224) var x246 uint64 var x247 uint64 x246, x247 = bits.Add64(x210, x233, uint64(0x0)) var x248 uint64 var x249 uint64 x248, x249 = bits.Add64(x212, x235, uint64(p384Uint1(x247))) var x250 uint64 var x251 uint64 x250, x251 = bits.Add64(x214, x237, uint64(p384Uint1(x249))) var x252 uint64 var x253 uint64 x252, x253 = bits.Add64(x216, x239, uint64(p384Uint1(x251))) var x254 uint64 var x255 uint64 x254, x255 = bits.Add64(x218, x241, uint64(p384Uint1(x253))) var x256 uint64 var x257 uint64 x256, x257 = bits.Add64(x220, x243, uint64(p384Uint1(x255))) var x258 uint64 var x259 uint64 x258, x259 = bits.Add64(x222, x245, uint64(p384Uint1(x257))) var x260 uint64 _, x260 = bits.Mul64(x246, 0x100000001) var x262 uint64 var x263 uint64 x263, x262 = bits.Mul64(x260, 0xffffffffffffffff) var x264 uint64 var x265 uint64 x265, x264 = bits.Mul64(x260, 0xffffffffffffffff) var x266 uint64 var x267 uint64 x267, x266 = bits.Mul64(x260, 0xffffffffffffffff) var x268 uint64 var x269 uint64 x269, x268 = bits.Mul64(x260, 0xfffffffffffffffe) var x270 uint64 var x271 uint64 x271, x270 = bits.Mul64(x260, 0xffffffff00000000) var x272 uint64 var x273 uint64 x273, x272 = bits.Mul64(x260, 0xffffffff) var x274 uint64 var x275 uint64 x274, x275 = bits.Add64(x273, x270, uint64(0x0)) var x276 uint64 var x277 uint64 x276, x277 = bits.Add64(x271, x268, uint64(p384Uint1(x275))) var x278 uint64 var x279 uint64 x278, x279 = bits.Add64(x269, x266, uint64(p384Uint1(x277))) var x280 uint64 var x281 uint64 x280, x281 = bits.Add64(x267, x264, uint64(p384Uint1(x279))) var x282 uint64 var x283 uint64 x282, x283 = bits.Add64(x265, x262, uint64(p384Uint1(x281))) x284 := (uint64(p384Uint1(x283)) + x263) var x286 uint64 _, x286 = bits.Add64(x246, x272, uint64(0x0)) var x287 uint64 var x288 uint64 x287, x288 = bits.Add64(x248, x274, uint64(p384Uint1(x286))) var x289 uint64 var x290 uint64 x289, x290 = bits.Add64(x250, x276, uint64(p384Uint1(x288))) var x291 uint64 var x292 uint64 x291, x292 = bits.Add64(x252, x278, uint64(p384Uint1(x290))) var x293 uint64 var x294 uint64 x293, x294 = bits.Add64(x254, x280, uint64(p384Uint1(x292))) var x295 uint64 var x296 uint64 x295, x296 = bits.Add64(x256, x282, uint64(p384Uint1(x294))) var x297 uint64 var x298 uint64 x297, x298 = bits.Add64(x258, x284, uint64(p384Uint1(x296))) x299 := (uint64(p384Uint1(x298)) + uint64(p384Uint1(x259))) var x300 uint64 var x301 uint64 x301, x300 = bits.Mul64(x4, arg1[5]) var x302 uint64 var x303 uint64 x303, x302 = bits.Mul64(x4, arg1[4]) var x304 uint64 var x305 uint64 x305, x304 = bits.Mul64(x4, arg1[3]) var x306 uint64 var x307 uint64 x307, x306 = bits.Mul64(x4, arg1[2]) var x308 uint64 var x309 uint64 x309, x308 = bits.Mul64(x4, arg1[1]) var x310 uint64 var x311 uint64 x311, x310 = bits.Mul64(x4, arg1[0]) var x312 uint64 var x313 uint64 x312, x313 = bits.Add64(x311, x308, uint64(0x0)) var x314 uint64 var x315 uint64 x314, x315 = bits.Add64(x309, x306, uint64(p384Uint1(x313))) var x316 uint64 var x317 uint64 x316, x317 = bits.Add64(x307, x304, uint64(p384Uint1(x315))) var x318 uint64 var x319 uint64 x318, x319 = bits.Add64(x305, x302, uint64(p384Uint1(x317))) var x320 uint64 var x321 uint64 x320, x321 = bits.Add64(x303, x300, uint64(p384Uint1(x319))) x322 := (uint64(p384Uint1(x321)) + x301) var x323 uint64 var x324 uint64 x323, x324 = bits.Add64(x287, x310, uint64(0x0)) var x325 uint64 var x326 uint64 x325, x326 = bits.Add64(x289, x312, uint64(p384Uint1(x324))) var x327 uint64 var x328 uint64 x327, x328 = bits.Add64(x291, x314, uint64(p384Uint1(x326))) var x329 uint64 var x330 uint64 x329, x330 = bits.Add64(x293, x316, uint64(p384Uint1(x328))) var x331 uint64 var x332 uint64 x331, x332 = bits.Add64(x295, x318, uint64(p384Uint1(x330))) var x333 uint64 var x334 uint64 x333, x334 = bits.Add64(x297, x320, uint64(p384Uint1(x332))) var x335 uint64 var x336 uint64 x335, x336 = bits.Add64(x299, x322, uint64(p384Uint1(x334))) var x337 uint64 _, x337 = bits.Mul64(x323, 0x100000001) var x339 uint64 var x340 uint64 x340, x339 = bits.Mul64(x337, 0xffffffffffffffff) var x341 uint64 var x342 uint64 x342, x341 = bits.Mul64(x337, 0xffffffffffffffff) var x343 uint64 var x344 uint64 x344, x343 = bits.Mul64(x337, 0xffffffffffffffff) var x345 uint64 var x346 uint64 x346, x345 = bits.Mul64(x337, 0xfffffffffffffffe) var x347 uint64 var x348 uint64 x348, x347 = bits.Mul64(x337, 0xffffffff00000000) var x349 uint64 var x350 uint64 x350, x349 = bits.Mul64(x337, 0xffffffff) var x351 uint64 var x352 uint64 x351, x352 = bits.Add64(x350, x347, uint64(0x0)) var x353 uint64 var x354 uint64 x353, x354 = bits.Add64(x348, x345, uint64(p384Uint1(x352))) var x355 uint64 var x356 uint64 x355, x356 = bits.Add64(x346, x343, uint64(p384Uint1(x354))) var x357 uint64 var x358 uint64 x357, x358 = bits.Add64(x344, x341, uint64(p384Uint1(x356))) var x359 uint64 var x360 uint64 x359, x360 = bits.Add64(x342, x339, uint64(p384Uint1(x358))) x361 := (uint64(p384Uint1(x360)) + x340) var x363 uint64 _, x363 = bits.Add64(x323, x349, uint64(0x0)) var x364 uint64 var x365 uint64 x364, x365 = bits.Add64(x325, x351, uint64(p384Uint1(x363))) var x366 uint64 var x367 uint64 x366, x367 = bits.Add64(x327, x353, uint64(p384Uint1(x365))) var x368 uint64 var x369 uint64 x368, x369 = bits.Add64(x329, x355, uint64(p384Uint1(x367))) var x370 uint64 var x371 uint64 x370, x371 = bits.Add64(x331, x357, uint64(p384Uint1(x369))) var x372 uint64 var x373 uint64 x372, x373 = bits.Add64(x333, x359, uint64(p384Uint1(x371))) var x374 uint64 var x375 uint64 x374, x375 = bits.Add64(x335, x361, uint64(p384Uint1(x373))) x376 := (uint64(p384Uint1(x375)) + uint64(p384Uint1(x336))) var x377 uint64 var x378 uint64 x378, x377 = bits.Mul64(x5, arg1[5]) var x379 uint64 var x380 uint64 x380, x379 = bits.Mul64(x5, arg1[4]) var x381 uint64 var x382 uint64 x382, x381 = bits.Mul64(x5, arg1[3]) var x383 uint64 var x384 uint64 x384, x383 = bits.Mul64(x5, arg1[2]) var x385 uint64 var x386 uint64 x386, x385 = bits.Mul64(x5, arg1[1]) var x387 uint64 var x388 uint64 x388, x387 = bits.Mul64(x5, arg1[0]) var x389 uint64 var x390 uint64 x389, x390 = bits.Add64(x388, x385, uint64(0x0)) var x391 uint64 var x392 uint64 x391, x392 = bits.Add64(x386, x383, uint64(p384Uint1(x390))) var x393 uint64 var x394 uint64 x393, x394 = bits.Add64(x384, x381, uint64(p384Uint1(x392))) var x395 uint64 var x396 uint64 x395, x396 = bits.Add64(x382, x379, uint64(p384Uint1(x394))) var x397 uint64 var x398 uint64 x397, x398 = bits.Add64(x380, x377, uint64(p384Uint1(x396))) x399 := (uint64(p384Uint1(x398)) + x378) var x400 uint64 var x401 uint64 x400, x401 = bits.Add64(x364, x387, uint64(0x0)) var x402 uint64 var x403 uint64 x402, x403 = bits.Add64(x366, x389, uint64(p384Uint1(x401))) var x404 uint64 var x405 uint64 x404, x405 = bits.Add64(x368, x391, uint64(p384Uint1(x403))) var x406 uint64 var x407 uint64 x406, x407 = bits.Add64(x370, x393, uint64(p384Uint1(x405))) var x408 uint64 var x409 uint64 x408, x409 = bits.Add64(x372, x395, uint64(p384Uint1(x407))) var x410 uint64 var x411 uint64 x410, x411 = bits.Add64(x374, x397, uint64(p384Uint1(x409))) var x412 uint64 var x413 uint64 x412, x413 = bits.Add64(x376, x399, uint64(p384Uint1(x411))) var x414 uint64 _, x414 = bits.Mul64(x400, 0x100000001) var x416 uint64 var x417 uint64 x417, x416 = bits.Mul64(x414, 0xffffffffffffffff) var x418 uint64 var x419 uint64 x419, x418 = bits.Mul64(x414, 0xffffffffffffffff) var x420 uint64 var x421 uint64 x421, x420 = bits.Mul64(x414, 0xffffffffffffffff) var x422 uint64 var x423 uint64 x423, x422 = bits.Mul64(x414, 0xfffffffffffffffe) var x424 uint64 var x425 uint64 x425, x424 = bits.Mul64(x414, 0xffffffff00000000) var x426 uint64 var x427 uint64 x427, x426 = bits.Mul64(x414, 0xffffffff) var x428 uint64 var x429 uint64 x428, x429 = bits.Add64(x427, x424, uint64(0x0)) var x430 uint64 var x431 uint64 x430, x431 = bits.Add64(x425, x422, uint64(p384Uint1(x429))) var x432 uint64 var x433 uint64 x432, x433 = bits.Add64(x423, x420, uint64(p384Uint1(x431))) var x434 uint64 var x435 uint64 x434, x435 = bits.Add64(x421, x418, uint64(p384Uint1(x433))) var x436 uint64 var x437 uint64 x436, x437 = bits.Add64(x419, x416, uint64(p384Uint1(x435))) x438 := (uint64(p384Uint1(x437)) + x417) var x440 uint64 _, x440 = bits.Add64(x400, x426, uint64(0x0)) var x441 uint64 var x442 uint64 x441, x442 = bits.Add64(x402, x428, uint64(p384Uint1(x440))) var x443 uint64 var x444 uint64 x443, x444 = bits.Add64(x404, x430, uint64(p384Uint1(x442))) var x445 uint64 var x446 uint64 x445, x446 = bits.Add64(x406, x432, uint64(p384Uint1(x444))) var x447 uint64 var x448 uint64 x447, x448 = bits.Add64(x408, x434, uint64(p384Uint1(x446))) var x449 uint64 var x450 uint64 x449, x450 = bits.Add64(x410, x436, uint64(p384Uint1(x448))) var x451 uint64 var x452 uint64 x451, x452 = bits.Add64(x412, x438, uint64(p384Uint1(x450))) x453 := (uint64(p384Uint1(x452)) + uint64(p384Uint1(x413))) var x454 uint64 var x455 uint64 x454, x455 = bits.Sub64(x441, 0xffffffff, uint64(0x0)) var x456 uint64 var x457 uint64 x456, x457 = bits.Sub64(x443, 0xffffffff00000000, uint64(p384Uint1(x455))) var x458 uint64 var x459 uint64 x458, x459 = bits.Sub64(x445, 0xfffffffffffffffe, uint64(p384Uint1(x457))) var x460 uint64 var x461 uint64 x460, x461 = bits.Sub64(x447, 0xffffffffffffffff, uint64(p384Uint1(x459))) var x462 uint64 var x463 uint64 x462, x463 = bits.Sub64(x449, 0xffffffffffffffff, uint64(p384Uint1(x461))) var x464 uint64 var x465 uint64 x464, x465 = bits.Sub64(x451, 0xffffffffffffffff, uint64(p384Uint1(x463))) var x467 uint64 _, x467 = bits.Sub64(x453, uint64(0x0), uint64(p384Uint1(x465))) var x468 uint64 p384CmovznzU64(&x468, p384Uint1(x467), x454, x441) var x469 uint64 p384CmovznzU64(&x469, p384Uint1(x467), x456, x443) var x470 uint64 p384CmovznzU64(&x470, p384Uint1(x467), x458, x445) var x471 uint64 p384CmovznzU64(&x471, p384Uint1(x467), x460, x447) var x472 uint64 p384CmovznzU64(&x472, p384Uint1(x467), x462, x449) var x473 uint64 p384CmovznzU64(&x473, p384Uint1(x467), x464, x451) out1[0] = x468 out1[1] = x469 out1[2] = x470 out1[3] = x471 out1[4] = x472 out1[5] = x473 } // p384Add adds two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p384Add(out1 *p384MontgomeryDomainFieldElement, arg1 *p384MontgomeryDomainFieldElement, arg2 *p384MontgomeryDomainFieldElement) { var x1 uint64 var x2 uint64 x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) var x3 uint64 var x4 uint64 x3, x4 = bits.Add64(arg1[1], arg2[1], uint64(p384Uint1(x2))) var x5 uint64 var x6 uint64 x5, x6 = bits.Add64(arg1[2], arg2[2], uint64(p384Uint1(x4))) var x7 uint64 var x8 uint64 x7, x8 = bits.Add64(arg1[3], arg2[3], uint64(p384Uint1(x6))) var x9 uint64 var x10 uint64 x9, x10 = bits.Add64(arg1[4], arg2[4], uint64(p384Uint1(x8))) var x11 uint64 var x12 uint64 x11, x12 = bits.Add64(arg1[5], arg2[5], uint64(p384Uint1(x10))) var x13 uint64 var x14 uint64 x13, x14 = bits.Sub64(x1, 0xffffffff, uint64(0x0)) var x15 uint64 var x16 uint64 x15, x16 = bits.Sub64(x3, 0xffffffff00000000, uint64(p384Uint1(x14))) var x17 uint64 var x18 uint64 x17, x18 = bits.Sub64(x5, 0xfffffffffffffffe, uint64(p384Uint1(x16))) var x19 uint64 var x20 uint64 x19, x20 = bits.Sub64(x7, 0xffffffffffffffff, uint64(p384Uint1(x18))) var x21 uint64 var x22 uint64 x21, x22 = bits.Sub64(x9, 0xffffffffffffffff, uint64(p384Uint1(x20))) var x23 uint64 var x24 uint64 x23, x24 = bits.Sub64(x11, 0xffffffffffffffff, uint64(p384Uint1(x22))) var x26 uint64 _, x26 = bits.Sub64(uint64(p384Uint1(x12)), uint64(0x0), uint64(p384Uint1(x24))) var x27 uint64 p384CmovznzU64(&x27, p384Uint1(x26), x13, x1) var x28 uint64 p384CmovznzU64(&x28, p384Uint1(x26), x15, x3) var x29 uint64 p384CmovznzU64(&x29, p384Uint1(x26), x17, x5) var x30 uint64 p384CmovznzU64(&x30, p384Uint1(x26), x19, x7) var x31 uint64 p384CmovznzU64(&x31, p384Uint1(x26), x21, x9) var x32 uint64 p384CmovznzU64(&x32, p384Uint1(x26), x23, x11) out1[0] = x27 out1[1] = x28 out1[2] = x29 out1[3] = x30 out1[4] = x31 out1[5] = x32 } // p384Sub subtracts two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p384Sub(out1 *p384MontgomeryDomainFieldElement, arg1 *p384MontgomeryDomainFieldElement, arg2 *p384MontgomeryDomainFieldElement) { var x1 uint64 var x2 uint64 x1, x2 = bits.Sub64(arg1[0], arg2[0], uint64(0x0)) var x3 uint64 var x4 uint64 x3, x4 = bits.Sub64(arg1[1], arg2[1], uint64(p384Uint1(x2))) var x5 uint64 var x6 uint64 x5, x6 = bits.Sub64(arg1[2], arg2[2], uint64(p384Uint1(x4))) var x7 uint64 var x8 uint64 x7, x8 = bits.Sub64(arg1[3], arg2[3], uint64(p384Uint1(x6))) var x9 uint64 var x10 uint64 x9, x10 = bits.Sub64(arg1[4], arg2[4], uint64(p384Uint1(x8))) var x11 uint64 var x12 uint64 x11, x12 = bits.Sub64(arg1[5], arg2[5], uint64(p384Uint1(x10))) var x13 uint64 p384CmovznzU64(&x13, p384Uint1(x12), uint64(0x0), 0xffffffffffffffff) var x14 uint64 var x15 uint64 x14, x15 = bits.Add64(x1, (x13 & 0xffffffff), uint64(0x0)) var x16 uint64 var x17 uint64 x16, x17 = bits.Add64(x3, (x13 & 0xffffffff00000000), uint64(p384Uint1(x15))) var x18 uint64 var x19 uint64 x18, x19 = bits.Add64(x5, (x13 & 0xfffffffffffffffe), uint64(p384Uint1(x17))) var x20 uint64 var x21 uint64 x20, x21 = bits.Add64(x7, x13, uint64(p384Uint1(x19))) var x22 uint64 var x23 uint64 x22, x23 = bits.Add64(x9, x13, uint64(p384Uint1(x21))) var x24 uint64 x24, _ = bits.Add64(x11, x13, uint64(p384Uint1(x23))) out1[0] = x14 out1[1] = x16 out1[2] = x18 out1[3] = x20 out1[4] = x22 out1[5] = x24 } // p384SetOne returns the field element one in the Montgomery domain. // // Postconditions: // // eval (from_montgomery out1) mod m = 1 mod m // 0 ≤ eval out1 < m func p384SetOne(out1 *p384MontgomeryDomainFieldElement) { out1[0] = 0xffffffff00000001 out1[1] = 0xffffffff out1[2] = uint64(0x1) out1[3] = uint64(0x0) out1[4] = uint64(0x0) out1[5] = uint64(0x0) } // p384FromMontgomery translates a field element out of the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^6) mod m // 0 ≤ eval out1 < m func p384FromMontgomery(out1 *p384NonMontgomeryDomainFieldElement, arg1 *p384MontgomeryDomainFieldElement) { x1 := arg1[0] var x2 uint64 _, x2 = bits.Mul64(x1, 0x100000001) var x4 uint64 var x5 uint64 x5, x4 = bits.Mul64(x2, 0xffffffffffffffff) var x6 uint64 var x7 uint64 x7, x6 = bits.Mul64(x2, 0xffffffffffffffff) var x8 uint64 var x9 uint64 x9, x8 = bits.Mul64(x2, 0xffffffffffffffff) var x10 uint64 var x11 uint64 x11, x10 = bits.Mul64(x2, 0xfffffffffffffffe) var x12 uint64 var x13 uint64 x13, x12 = bits.Mul64(x2, 0xffffffff00000000) var x14 uint64 var x15 uint64 x15, x14 = bits.Mul64(x2, 0xffffffff) var x16 uint64 var x17 uint64 x16, x17 = bits.Add64(x15, x12, uint64(0x0)) var x18 uint64 var x19 uint64 x18, x19 = bits.Add64(x13, x10, uint64(p384Uint1(x17))) var x20 uint64 var x21 uint64 x20, x21 = bits.Add64(x11, x8, uint64(p384Uint1(x19))) var x22 uint64 var x23 uint64 x22, x23 = bits.Add64(x9, x6, uint64(p384Uint1(x21))) var x24 uint64 var x25 uint64 x24, x25 = bits.Add64(x7, x4, uint64(p384Uint1(x23))) var x27 uint64 _, x27 = bits.Add64(x1, x14, uint64(0x0)) var x28 uint64 var x29 uint64 x28, x29 = bits.Add64(uint64(0x0), x16, uint64(p384Uint1(x27))) var x30 uint64 var x31 uint64 x30, x31 = bits.Add64(uint64(0x0), x18, uint64(p384Uint1(x29))) var x32 uint64 var x33 uint64 x32, x33 = bits.Add64(uint64(0x0), x20, uint64(p384Uint1(x31))) var x34 uint64 var x35 uint64 x34, x35 = bits.Add64(uint64(0x0), x22, uint64(p384Uint1(x33))) var x36 uint64 var x37 uint64 x36, x37 = bits.Add64(uint64(0x0), x24, uint64(p384Uint1(x35))) var x38 uint64 var x39 uint64 x38, x39 = bits.Add64(uint64(0x0), (uint64(p384Uint1(x25)) + x5), uint64(p384Uint1(x37))) var x40 uint64 var x41 uint64 x40, x41 = bits.Add64(x28, arg1[1], uint64(0x0)) var x42 uint64 var x43 uint64 x42, x43 = bits.Add64(x30, uint64(0x0), uint64(p384Uint1(x41))) var x44 uint64 var x45 uint64 x44, x45 = bits.Add64(x32, uint64(0x0), uint64(p384Uint1(x43))) var x46 uint64 var x47 uint64 x46, x47 = bits.Add64(x34, uint64(0x0), uint64(p384Uint1(x45))) var x48 uint64 var x49 uint64 x48, x49 = bits.Add64(x36, uint64(0x0), uint64(p384Uint1(x47))) var x50 uint64 var x51 uint64 x50, x51 = bits.Add64(x38, uint64(0x0), uint64(p384Uint1(x49))) var x52 uint64 _, x52 = bits.Mul64(x40, 0x100000001) var x54 uint64 var x55 uint64 x55, x54 = bits.Mul64(x52, 0xffffffffffffffff) var x56 uint64 var x57 uint64 x57, x56 = bits.Mul64(x52, 0xffffffffffffffff) var x58 uint64 var x59 uint64 x59, x58 = bits.Mul64(x52, 0xffffffffffffffff) var x60 uint64 var x61 uint64 x61, x60 = bits.Mul64(x52, 0xfffffffffffffffe) var x62 uint64 var x63 uint64 x63, x62 = bits.Mul64(x52, 0xffffffff00000000) var x64 uint64 var x65 uint64 x65, x64 = bits.Mul64(x52, 0xffffffff) var x66 uint64 var x67 uint64 x66, x67 = bits.Add64(x65, x62, uint64(0x0)) var x68 uint64 var x69 uint64 x68, x69 = bits.Add64(x63, x60, uint64(p384Uint1(x67))) var x70 uint64 var x71 uint64 x70, x71 = bits.Add64(x61, x58, uint64(p384Uint1(x69))) var x72 uint64 var x73 uint64 x72, x73 = bits.Add64(x59, x56, uint64(p384Uint1(x71))) var x74 uint64 var x75 uint64 x74, x75 = bits.Add64(x57, x54, uint64(p384Uint1(x73))) var x77 uint64 _, x77 = bits.Add64(x40, x64, uint64(0x0)) var x78 uint64 var x79 uint64 x78, x79 = bits.Add64(x42, x66, uint64(p384Uint1(x77))) var x80 uint64 var x81 uint64 x80, x81 = bits.Add64(x44, x68, uint64(p384Uint1(x79))) var x82 uint64 var x83 uint64 x82, x83 = bits.Add64(x46, x70, uint64(p384Uint1(x81))) var x84 uint64 var x85 uint64 x84, x85 = bits.Add64(x48, x72, uint64(p384Uint1(x83))) var x86 uint64 var x87 uint64 x86, x87 = bits.Add64(x50, x74, uint64(p384Uint1(x85))) var x88 uint64 var x89 uint64 x88, x89 = bits.Add64((uint64(p384Uint1(x51)) + uint64(p384Uint1(x39))), (uint64(p384Uint1(x75)) + x55), uint64(p384Uint1(x87))) var x90 uint64 var x91 uint64 x90, x91 = bits.Add64(x78, arg1[2], uint64(0x0)) var x92 uint64 var x93 uint64 x92, x93 = bits.Add64(x80, uint64(0x0), uint64(p384Uint1(x91))) var x94 uint64 var x95 uint64 x94, x95 = bits.Add64(x82, uint64(0x0), uint64(p384Uint1(x93))) var x96 uint64 var x97 uint64 x96, x97 = bits.Add64(x84, uint64(0x0), uint64(p384Uint1(x95))) var x98 uint64 var x99 uint64 x98, x99 = bits.Add64(x86, uint64(0x0), uint64(p384Uint1(x97))) var x100 uint64 var x101 uint64 x100, x101 = bits.Add64(x88, uint64(0x0), uint64(p384Uint1(x99))) var x102 uint64 _, x102 = bits.Mul64(x90, 0x100000001) var x104 uint64 var x105 uint64 x105, x104 = bits.Mul64(x102, 0xffffffffffffffff) var x106 uint64 var x107 uint64 x107, x106 = bits.Mul64(x102, 0xffffffffffffffff) var x108 uint64 var x109 uint64 x109, x108 = bits.Mul64(x102, 0xffffffffffffffff) var x110 uint64 var x111 uint64 x111, x110 = bits.Mul64(x102, 0xfffffffffffffffe) var x112 uint64 var x113 uint64 x113, x112 = bits.Mul64(x102, 0xffffffff00000000) var x114 uint64 var x115 uint64 x115, x114 = bits.Mul64(x102, 0xffffffff) var x116 uint64 var x117 uint64 x116, x117 = bits.Add64(x115, x112, uint64(0x0)) var x118 uint64 var x119 uint64 x118, x119 = bits.Add64(x113, x110, uint64(p384Uint1(x117))) var x120 uint64 var x121 uint64 x120, x121 = bits.Add64(x111, x108, uint64(p384Uint1(x119))) var x122 uint64 var x123 uint64 x122, x123 = bits.Add64(x109, x106, uint64(p384Uint1(x121))) var x124 uint64 var x125 uint64 x124, x125 = bits.Add64(x107, x104, uint64(p384Uint1(x123))) var x127 uint64 _, x127 = bits.Add64(x90, x114, uint64(0x0)) var x128 uint64 var x129 uint64 x128, x129 = bits.Add64(x92, x116, uint64(p384Uint1(x127))) var x130 uint64 var x131 uint64 x130, x131 = bits.Add64(x94, x118, uint64(p384Uint1(x129))) var x132 uint64 var x133 uint64 x132, x133 = bits.Add64(x96, x120, uint64(p384Uint1(x131))) var x134 uint64 var x135 uint64 x134, x135 = bits.Add64(x98, x122, uint64(p384Uint1(x133))) var x136 uint64 var x137 uint64 x136, x137 = bits.Add64(x100, x124, uint64(p384Uint1(x135))) var x138 uint64 var x139 uint64 x138, x139 = bits.Add64((uint64(p384Uint1(x101)) + uint64(p384Uint1(x89))), (uint64(p384Uint1(x125)) + x105), uint64(p384Uint1(x137))) var x140 uint64 var x141 uint64 x140, x141 = bits.Add64(x128, arg1[3], uint64(0x0)) var x142 uint64 var x143 uint64 x142, x143 = bits.Add64(x130, uint64(0x0), uint64(p384Uint1(x141))) var x144 uint64 var x145 uint64 x144, x145 = bits.Add64(x132, uint64(0x0), uint64(p384Uint1(x143))) var x146 uint64 var x147 uint64 x146, x147 = bits.Add64(x134, uint64(0x0), uint64(p384Uint1(x145))) var x148 uint64 var x149 uint64 x148, x149 = bits.Add64(x136, uint64(0x0), uint64(p384Uint1(x147))) var x150 uint64 var x151 uint64 x150, x151 = bits.Add64(x138, uint64(0x0), uint64(p384Uint1(x149))) var x152 uint64 _, x152 = bits.Mul64(x140, 0x100000001) var x154 uint64 var x155 uint64 x155, x154 = bits.Mul64(x152, 0xffffffffffffffff) var x156 uint64 var x157 uint64 x157, x156 = bits.Mul64(x152, 0xffffffffffffffff) var x158 uint64 var x159 uint64 x159, x158 = bits.Mul64(x152, 0xffffffffffffffff) var x160 uint64 var x161 uint64 x161, x160 = bits.Mul64(x152, 0xfffffffffffffffe) var x162 uint64 var x163 uint64 x163, x162 = bits.Mul64(x152, 0xffffffff00000000) var x164 uint64 var x165 uint64 x165, x164 = bits.Mul64(x152, 0xffffffff) var x166 uint64 var x167 uint64 x166, x167 = bits.Add64(x165, x162, uint64(0x0)) var x168 uint64 var x169 uint64 x168, x169 = bits.Add64(x163, x160, uint64(p384Uint1(x167))) var x170 uint64 var x171 uint64 x170, x171 = bits.Add64(x161, x158, uint64(p384Uint1(x169))) var x172 uint64 var x173 uint64 x172, x173 = bits.Add64(x159, x156, uint64(p384Uint1(x171))) var x174 uint64 var x175 uint64 x174, x175 = bits.Add64(x157, x154, uint64(p384Uint1(x173))) var x177 uint64 _, x177 = bits.Add64(x140, x164, uint64(0x0)) var x178 uint64 var x179 uint64 x178, x179 = bits.Add64(x142, x166, uint64(p384Uint1(x177))) var x180 uint64 var x181 uint64 x180, x181 = bits.Add64(x144, x168, uint64(p384Uint1(x179))) var x182 uint64 var x183 uint64 x182, x183 = bits.Add64(x146, x170, uint64(p384Uint1(x181))) var x184 uint64 var x185 uint64 x184, x185 = bits.Add64(x148, x172, uint64(p384Uint1(x183))) var x186 uint64 var x187 uint64 x186, x187 = bits.Add64(x150, x174, uint64(p384Uint1(x185))) var x188 uint64 var x189 uint64 x188, x189 = bits.Add64((uint64(p384Uint1(x151)) + uint64(p384Uint1(x139))), (uint64(p384Uint1(x175)) + x155), uint64(p384Uint1(x187))) var x190 uint64 var x191 uint64 x190, x191 = bits.Add64(x178, arg1[4], uint64(0x0)) var x192 uint64 var x193 uint64 x192, x193 = bits.Add64(x180, uint64(0x0), uint64(p384Uint1(x191))) var x194 uint64 var x195 uint64 x194, x195 = bits.Add64(x182, uint64(0x0), uint64(p384Uint1(x193))) var x196 uint64 var x197 uint64 x196, x197 = bits.Add64(x184, uint64(0x0), uint64(p384Uint1(x195))) var x198 uint64 var x199 uint64 x198, x199 = bits.Add64(x186, uint64(0x0), uint64(p384Uint1(x197))) var x200 uint64 var x201 uint64 x200, x201 = bits.Add64(x188, uint64(0x0), uint64(p384Uint1(x199))) var x202 uint64 _, x202 = bits.Mul64(x190, 0x100000001) var x204 uint64 var x205 uint64 x205, x204 = bits.Mul64(x202, 0xffffffffffffffff) var x206 uint64 var x207 uint64 x207, x206 = bits.Mul64(x202, 0xffffffffffffffff) var x208 uint64 var x209 uint64 x209, x208 = bits.Mul64(x202, 0xffffffffffffffff) var x210 uint64 var x211 uint64 x211, x210 = bits.Mul64(x202, 0xfffffffffffffffe) var x212 uint64 var x213 uint64 x213, x212 = bits.Mul64(x202, 0xffffffff00000000) var x214 uint64 var x215 uint64 x215, x214 = bits.Mul64(x202, 0xffffffff) var x216 uint64 var x217 uint64 x216, x217 = bits.Add64(x215, x212, uint64(0x0)) var x218 uint64 var x219 uint64 x218, x219 = bits.Add64(x213, x210, uint64(p384Uint1(x217))) var x220 uint64 var x221 uint64 x220, x221 = bits.Add64(x211, x208, uint64(p384Uint1(x219))) var x222 uint64 var x223 uint64 x222, x223 = bits.Add64(x209, x206, uint64(p384Uint1(x221))) var x224 uint64 var x225 uint64 x224, x225 = bits.Add64(x207, x204, uint64(p384Uint1(x223))) var x227 uint64 _, x227 = bits.Add64(x190, x214, uint64(0x0)) var x228 uint64 var x229 uint64 x228, x229 = bits.Add64(x192, x216, uint64(p384Uint1(x227))) var x230 uint64 var x231 uint64 x230, x231 = bits.Add64(x194, x218, uint64(p384Uint1(x229))) var x232 uint64 var x233 uint64 x232, x233 = bits.Add64(x196, x220, uint64(p384Uint1(x231))) var x234 uint64 var x235 uint64 x234, x235 = bits.Add64(x198, x222, uint64(p384Uint1(x233))) var x236 uint64 var x237 uint64 x236, x237 = bits.Add64(x200, x224, uint64(p384Uint1(x235))) var x238 uint64 var x239 uint64 x238, x239 = bits.Add64((uint64(p384Uint1(x201)) + uint64(p384Uint1(x189))), (uint64(p384Uint1(x225)) + x205), uint64(p384Uint1(x237))) var x240 uint64 var x241 uint64 x240, x241 = bits.Add64(x228, arg1[5], uint64(0x0)) var x242 uint64 var x243 uint64 x242, x243 = bits.Add64(x230, uint64(0x0), uint64(p384Uint1(x241))) var x244 uint64 var x245 uint64 x244, x245 = bits.Add64(x232, uint64(0x0), uint64(p384Uint1(x243))) var x246 uint64 var x247 uint64 x246, x247 = bits.Add64(x234, uint64(0x0), uint64(p384Uint1(x245))) var x248 uint64 var x249 uint64 x248, x249 = bits.Add64(x236, uint64(0x0), uint64(p384Uint1(x247))) var x250 uint64 var x251 uint64 x250, x251 = bits.Add64(x238, uint64(0x0), uint64(p384Uint1(x249))) var x252 uint64 _, x252 = bits.Mul64(x240, 0x100000001) var x254 uint64 var x255 uint64 x255, x254 = bits.Mul64(x252, 0xffffffffffffffff) var x256 uint64 var x257 uint64 x257, x256 = bits.Mul64(x252, 0xffffffffffffffff) var x258 uint64 var x259 uint64 x259, x258 = bits.Mul64(x252, 0xffffffffffffffff) var x260 uint64 var x261 uint64 x261, x260 = bits.Mul64(x252, 0xfffffffffffffffe) var x262 uint64 var x263 uint64 x263, x262 = bits.Mul64(x252, 0xffffffff00000000) var x264 uint64 var x265 uint64 x265, x264 = bits.Mul64(x252, 0xffffffff) var x266 uint64 var x267 uint64 x266, x267 = bits.Add64(x265, x262, uint64(0x0)) var x268 uint64 var x269 uint64 x268, x269 = bits.Add64(x263, x260, uint64(p384Uint1(x267))) var x270 uint64 var x271 uint64 x270, x271 = bits.Add64(x261, x258, uint64(p384Uint1(x269))) var x272 uint64 var x273 uint64 x272, x273 = bits.Add64(x259, x256, uint64(p384Uint1(x271))) var x274 uint64 var x275 uint64 x274, x275 = bits.Add64(x257, x254, uint64(p384Uint1(x273))) var x277 uint64 _, x277 = bits.Add64(x240, x264, uint64(0x0)) var x278 uint64 var x279 uint64 x278, x279 = bits.Add64(x242, x266, uint64(p384Uint1(x277))) var x280 uint64 var x281 uint64 x280, x281 = bits.Add64(x244, x268, uint64(p384Uint1(x279))) var x282 uint64 var x283 uint64 x282, x283 = bits.Add64(x246, x270, uint64(p384Uint1(x281))) var x284 uint64 var x285 uint64 x284, x285 = bits.Add64(x248, x272, uint64(p384Uint1(x283))) var x286 uint64 var x287 uint64 x286, x287 = bits.Add64(x250, x274, uint64(p384Uint1(x285))) var x288 uint64 var x289 uint64 x288, x289 = bits.Add64((uint64(p384Uint1(x251)) + uint64(p384Uint1(x239))), (uint64(p384Uint1(x275)) + x255), uint64(p384Uint1(x287))) var x290 uint64 var x291 uint64 x290, x291 = bits.Sub64(x278, 0xffffffff, uint64(0x0)) var x292 uint64 var x293 uint64 x292, x293 = bits.Sub64(x280, 0xffffffff00000000, uint64(p384Uint1(x291))) var x294 uint64 var x295 uint64 x294, x295 = bits.Sub64(x282, 0xfffffffffffffffe, uint64(p384Uint1(x293))) var x296 uint64 var x297 uint64 x296, x297 = bits.Sub64(x284, 0xffffffffffffffff, uint64(p384Uint1(x295))) var x298 uint64 var x299 uint64 x298, x299 = bits.Sub64(x286, 0xffffffffffffffff, uint64(p384Uint1(x297))) var x300 uint64 var x301 uint64 x300, x301 = bits.Sub64(x288, 0xffffffffffffffff, uint64(p384Uint1(x299))) var x303 uint64 _, x303 = bits.Sub64(uint64(p384Uint1(x289)), uint64(0x0), uint64(p384Uint1(x301))) var x304 uint64 p384CmovznzU64(&x304, p384Uint1(x303), x290, x278) var x305 uint64 p384CmovznzU64(&x305, p384Uint1(x303), x292, x280) var x306 uint64 p384CmovznzU64(&x306, p384Uint1(x303), x294, x282) var x307 uint64 p384CmovznzU64(&x307, p384Uint1(x303), x296, x284) var x308 uint64 p384CmovznzU64(&x308, p384Uint1(x303), x298, x286) var x309 uint64 p384CmovznzU64(&x309, p384Uint1(x303), x300, x288) out1[0] = x304 out1[1] = x305 out1[2] = x306 out1[3] = x307 out1[4] = x308 out1[5] = x309 } // p384ToMontgomery translates a field element into the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval (from_montgomery out1) mod m = eval arg1 mod m // 0 ≤ eval out1 < m func p384ToMontgomery(out1 *p384MontgomeryDomainFieldElement, arg1 *p384NonMontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[4] x5 := arg1[5] x6 := arg1[0] var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x6, 0x200000000) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x6, 0xfffffffe00000000) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x6, 0x200000000) var x13 uint64 var x14 uint64 x14, x13 = bits.Mul64(x6, 0xfffffffe00000001) var x15 uint64 var x16 uint64 x15, x16 = bits.Add64(x14, x11, uint64(0x0)) var x17 uint64 var x18 uint64 x17, x18 = bits.Add64(x12, x9, uint64(p384Uint1(x16))) var x19 uint64 var x20 uint64 x19, x20 = bits.Add64(x10, x7, uint64(p384Uint1(x18))) var x21 uint64 var x22 uint64 x21, x22 = bits.Add64(x8, x6, uint64(p384Uint1(x20))) var x23 uint64 _, x23 = bits.Mul64(x13, 0x100000001) var x25 uint64 var x26 uint64 x26, x25 = bits.Mul64(x23, 0xffffffffffffffff) var x27 uint64 var x28 uint64 x28, x27 = bits.Mul64(x23, 0xffffffffffffffff) var x29 uint64 var x30 uint64 x30, x29 = bits.Mul64(x23, 0xffffffffffffffff) var x31 uint64 var x32 uint64 x32, x31 = bits.Mul64(x23, 0xfffffffffffffffe) var x33 uint64 var x34 uint64 x34, x33 = bits.Mul64(x23, 0xffffffff00000000) var x35 uint64 var x36 uint64 x36, x35 = bits.Mul64(x23, 0xffffffff) var x37 uint64 var x38 uint64 x37, x38 = bits.Add64(x36, x33, uint64(0x0)) var x39 uint64 var x40 uint64 x39, x40 = bits.Add64(x34, x31, uint64(p384Uint1(x38))) var x41 uint64 var x42 uint64 x41, x42 = bits.Add64(x32, x29, uint64(p384Uint1(x40))) var x43 uint64 var x44 uint64 x43, x44 = bits.Add64(x30, x27, uint64(p384Uint1(x42))) var x45 uint64 var x46 uint64 x45, x46 = bits.Add64(x28, x25, uint64(p384Uint1(x44))) var x48 uint64 _, x48 = bits.Add64(x13, x35, uint64(0x0)) var x49 uint64 var x50 uint64 x49, x50 = bits.Add64(x15, x37, uint64(p384Uint1(x48))) var x51 uint64 var x52 uint64 x51, x52 = bits.Add64(x17, x39, uint64(p384Uint1(x50))) var x53 uint64 var x54 uint64 x53, x54 = bits.Add64(x19, x41, uint64(p384Uint1(x52))) var x55 uint64 var x56 uint64 x55, x56 = bits.Add64(x21, x43, uint64(p384Uint1(x54))) var x57 uint64 var x58 uint64 x57, x58 = bits.Add64(uint64(p384Uint1(x22)), x45, uint64(p384Uint1(x56))) var x59 uint64 var x60 uint64 x59, x60 = bits.Add64(uint64(0x0), (uint64(p384Uint1(x46)) + x26), uint64(p384Uint1(x58))) var x61 uint64 var x62 uint64 x62, x61 = bits.Mul64(x1, 0x200000000) var x63 uint64 var x64 uint64 x64, x63 = bits.Mul64(x1, 0xfffffffe00000000) var x65 uint64 var x66 uint64 x66, x65 = bits.Mul64(x1, 0x200000000) var x67 uint64 var x68 uint64 x68, x67 = bits.Mul64(x1, 0xfffffffe00000001) var x69 uint64 var x70 uint64 x69, x70 = bits.Add64(x68, x65, uint64(0x0)) var x71 uint64 var x72 uint64 x71, x72 = bits.Add64(x66, x63, uint64(p384Uint1(x70))) var x73 uint64 var x74 uint64 x73, x74 = bits.Add64(x64, x61, uint64(p384Uint1(x72))) var x75 uint64 var x76 uint64 x75, x76 = bits.Add64(x62, x1, uint64(p384Uint1(x74))) var x77 uint64 var x78 uint64 x77, x78 = bits.Add64(x49, x67, uint64(0x0)) var x79 uint64 var x80 uint64 x79, x80 = bits.Add64(x51, x69, uint64(p384Uint1(x78))) var x81 uint64 var x82 uint64 x81, x82 = bits.Add64(x53, x71, uint64(p384Uint1(x80))) var x83 uint64 var x84 uint64 x83, x84 = bits.Add64(x55, x73, uint64(p384Uint1(x82))) var x85 uint64 var x86 uint64 x85, x86 = bits.Add64(x57, x75, uint64(p384Uint1(x84))) var x87 uint64 var x88 uint64 x87, x88 = bits.Add64(x59, uint64(p384Uint1(x76)), uint64(p384Uint1(x86))) var x89 uint64 _, x89 = bits.Mul64(x77, 0x100000001) var x91 uint64 var x92 uint64 x92, x91 = bits.Mul64(x89, 0xffffffffffffffff) var x93 uint64 var x94 uint64 x94, x93 = bits.Mul64(x89, 0xffffffffffffffff) var x95 uint64 var x96 uint64 x96, x95 = bits.Mul64(x89, 0xffffffffffffffff) var x97 uint64 var x98 uint64 x98, x97 = bits.Mul64(x89, 0xfffffffffffffffe) var x99 uint64 var x100 uint64 x100, x99 = bits.Mul64(x89, 0xffffffff00000000) var x101 uint64 var x102 uint64 x102, x101 = bits.Mul64(x89, 0xffffffff) var x103 uint64 var x104 uint64 x103, x104 = bits.Add64(x102, x99, uint64(0x0)) var x105 uint64 var x106 uint64 x105, x106 = bits.Add64(x100, x97, uint64(p384Uint1(x104))) var x107 uint64 var x108 uint64 x107, x108 = bits.Add64(x98, x95, uint64(p384Uint1(x106))) var x109 uint64 var x110 uint64 x109, x110 = bits.Add64(x96, x93, uint64(p384Uint1(x108))) var x111 uint64 var x112 uint64 x111, x112 = bits.Add64(x94, x91, uint64(p384Uint1(x110))) var x114 uint64 _, x114 = bits.Add64(x77, x101, uint64(0x0)) var x115 uint64 var x116 uint64 x115, x116 = bits.Add64(x79, x103, uint64(p384Uint1(x114))) var x117 uint64 var x118 uint64 x117, x118 = bits.Add64(x81, x105, uint64(p384Uint1(x116))) var x119 uint64 var x120 uint64 x119, x120 = bits.Add64(x83, x107, uint64(p384Uint1(x118))) var x121 uint64 var x122 uint64 x121, x122 = bits.Add64(x85, x109, uint64(p384Uint1(x120))) var x123 uint64 var x124 uint64 x123, x124 = bits.Add64(x87, x111, uint64(p384Uint1(x122))) var x125 uint64 var x126 uint64 x125, x126 = bits.Add64((uint64(p384Uint1(x88)) + uint64(p384Uint1(x60))), (uint64(p384Uint1(x112)) + x92), uint64(p384Uint1(x124))) var x127 uint64 var x128 uint64 x128, x127 = bits.Mul64(x2, 0x200000000) var x129 uint64 var x130 uint64 x130, x129 = bits.Mul64(x2, 0xfffffffe00000000) var x131 uint64 var x132 uint64 x132, x131 = bits.Mul64(x2, 0x200000000) var x133 uint64 var x134 uint64 x134, x133 = bits.Mul64(x2, 0xfffffffe00000001) var x135 uint64 var x136 uint64 x135, x136 = bits.Add64(x134, x131, uint64(0x0)) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x132, x129, uint64(p384Uint1(x136))) var x139 uint64 var x140 uint64 x139, x140 = bits.Add64(x130, x127, uint64(p384Uint1(x138))) var x141 uint64 var x142 uint64 x141, x142 = bits.Add64(x128, x2, uint64(p384Uint1(x140))) var x143 uint64 var x144 uint64 x143, x144 = bits.Add64(x115, x133, uint64(0x0)) var x145 uint64 var x146 uint64 x145, x146 = bits.Add64(x117, x135, uint64(p384Uint1(x144))) var x147 uint64 var x148 uint64 x147, x148 = bits.Add64(x119, x137, uint64(p384Uint1(x146))) var x149 uint64 var x150 uint64 x149, x150 = bits.Add64(x121, x139, uint64(p384Uint1(x148))) var x151 uint64 var x152 uint64 x151, x152 = bits.Add64(x123, x141, uint64(p384Uint1(x150))) var x153 uint64 var x154 uint64 x153, x154 = bits.Add64(x125, uint64(p384Uint1(x142)), uint64(p384Uint1(x152))) var x155 uint64 _, x155 = bits.Mul64(x143, 0x100000001) var x157 uint64 var x158 uint64 x158, x157 = bits.Mul64(x155, 0xffffffffffffffff) var x159 uint64 var x160 uint64 x160, x159 = bits.Mul64(x155, 0xffffffffffffffff) var x161 uint64 var x162 uint64 x162, x161 = bits.Mul64(x155, 0xffffffffffffffff) var x163 uint64 var x164 uint64 x164, x163 = bits.Mul64(x155, 0xfffffffffffffffe) var x165 uint64 var x166 uint64 x166, x165 = bits.Mul64(x155, 0xffffffff00000000) var x167 uint64 var x168 uint64 x168, x167 = bits.Mul64(x155, 0xffffffff) var x169 uint64 var x170 uint64 x169, x170 = bits.Add64(x168, x165, uint64(0x0)) var x171 uint64 var x172 uint64 x171, x172 = bits.Add64(x166, x163, uint64(p384Uint1(x170))) var x173 uint64 var x174 uint64 x173, x174 = bits.Add64(x164, x161, uint64(p384Uint1(x172))) var x175 uint64 var x176 uint64 x175, x176 = bits.Add64(x162, x159, uint64(p384Uint1(x174))) var x177 uint64 var x178 uint64 x177, x178 = bits.Add64(x160, x157, uint64(p384Uint1(x176))) var x180 uint64 _, x180 = bits.Add64(x143, x167, uint64(0x0)) var x181 uint64 var x182 uint64 x181, x182 = bits.Add64(x145, x169, uint64(p384Uint1(x180))) var x183 uint64 var x184 uint64 x183, x184 = bits.Add64(x147, x171, uint64(p384Uint1(x182))) var x185 uint64 var x186 uint64 x185, x186 = bits.Add64(x149, x173, uint64(p384Uint1(x184))) var x187 uint64 var x188 uint64 x187, x188 = bits.Add64(x151, x175, uint64(p384Uint1(x186))) var x189 uint64 var x190 uint64 x189, x190 = bits.Add64(x153, x177, uint64(p384Uint1(x188))) var x191 uint64 var x192 uint64 x191, x192 = bits.Add64((uint64(p384Uint1(x154)) + uint64(p384Uint1(x126))), (uint64(p384Uint1(x178)) + x158), uint64(p384Uint1(x190))) var x193 uint64 var x194 uint64 x194, x193 = bits.Mul64(x3, 0x200000000) var x195 uint64 var x196 uint64 x196, x195 = bits.Mul64(x3, 0xfffffffe00000000) var x197 uint64 var x198 uint64 x198, x197 = bits.Mul64(x3, 0x200000000) var x199 uint64 var x200 uint64 x200, x199 = bits.Mul64(x3, 0xfffffffe00000001) var x201 uint64 var x202 uint64 x201, x202 = bits.Add64(x200, x197, uint64(0x0)) var x203 uint64 var x204 uint64 x203, x204 = bits.Add64(x198, x195, uint64(p384Uint1(x202))) var x205 uint64 var x206 uint64 x205, x206 = bits.Add64(x196, x193, uint64(p384Uint1(x204))) var x207 uint64 var x208 uint64 x207, x208 = bits.Add64(x194, x3, uint64(p384Uint1(x206))) var x209 uint64 var x210 uint64 x209, x210 = bits.Add64(x181, x199, uint64(0x0)) var x211 uint64 var x212 uint64 x211, x212 = bits.Add64(x183, x201, uint64(p384Uint1(x210))) var x213 uint64 var x214 uint64 x213, x214 = bits.Add64(x185, x203, uint64(p384Uint1(x212))) var x215 uint64 var x216 uint64 x215, x216 = bits.Add64(x187, x205, uint64(p384Uint1(x214))) var x217 uint64 var x218 uint64 x217, x218 = bits.Add64(x189, x207, uint64(p384Uint1(x216))) var x219 uint64 var x220 uint64 x219, x220 = bits.Add64(x191, uint64(p384Uint1(x208)), uint64(p384Uint1(x218))) var x221 uint64 _, x221 = bits.Mul64(x209, 0x100000001) var x223 uint64 var x224 uint64 x224, x223 = bits.Mul64(x221, 0xffffffffffffffff) var x225 uint64 var x226 uint64 x226, x225 = bits.Mul64(x221, 0xffffffffffffffff) var x227 uint64 var x228 uint64 x228, x227 = bits.Mul64(x221, 0xffffffffffffffff) var x229 uint64 var x230 uint64 x230, x229 = bits.Mul64(x221, 0xfffffffffffffffe) var x231 uint64 var x232 uint64 x232, x231 = bits.Mul64(x221, 0xffffffff00000000) var x233 uint64 var x234 uint64 x234, x233 = bits.Mul64(x221, 0xffffffff) var x235 uint64 var x236 uint64 x235, x236 = bits.Add64(x234, x231, uint64(0x0)) var x237 uint64 var x238 uint64 x237, x238 = bits.Add64(x232, x229, uint64(p384Uint1(x236))) var x239 uint64 var x240 uint64 x239, x240 = bits.Add64(x230, x227, uint64(p384Uint1(x238))) var x241 uint64 var x242 uint64 x241, x242 = bits.Add64(x228, x225, uint64(p384Uint1(x240))) var x243 uint64 var x244 uint64 x243, x244 = bits.Add64(x226, x223, uint64(p384Uint1(x242))) var x246 uint64 _, x246 = bits.Add64(x209, x233, uint64(0x0)) var x247 uint64 var x248 uint64 x247, x248 = bits.Add64(x211, x235, uint64(p384Uint1(x246))) var x249 uint64 var x250 uint64 x249, x250 = bits.Add64(x213, x237, uint64(p384Uint1(x248))) var x251 uint64 var x252 uint64 x251, x252 = bits.Add64(x215, x239, uint64(p384Uint1(x250))) var x253 uint64 var x254 uint64 x253, x254 = bits.Add64(x217, x241, uint64(p384Uint1(x252))) var x255 uint64 var x256 uint64 x255, x256 = bits.Add64(x219, x243, uint64(p384Uint1(x254))) var x257 uint64 var x258 uint64 x257, x258 = bits.Add64((uint64(p384Uint1(x220)) + uint64(p384Uint1(x192))), (uint64(p384Uint1(x244)) + x224), uint64(p384Uint1(x256))) var x259 uint64 var x260 uint64 x260, x259 = bits.Mul64(x4, 0x200000000) var x261 uint64 var x262 uint64 x262, x261 = bits.Mul64(x4, 0xfffffffe00000000) var x263 uint64 var x264 uint64 x264, x263 = bits.Mul64(x4, 0x200000000) var x265 uint64 var x266 uint64 x266, x265 = bits.Mul64(x4, 0xfffffffe00000001) var x267 uint64 var x268 uint64 x267, x268 = bits.Add64(x266, x263, uint64(0x0)) var x269 uint64 var x270 uint64 x269, x270 = bits.Add64(x264, x261, uint64(p384Uint1(x268))) var x271 uint64 var x272 uint64 x271, x272 = bits.Add64(x262, x259, uint64(p384Uint1(x270))) var x273 uint64 var x274 uint64 x273, x274 = bits.Add64(x260, x4, uint64(p384Uint1(x272))) var x275 uint64 var x276 uint64 x275, x276 = bits.Add64(x247, x265, uint64(0x0)) var x277 uint64 var x278 uint64 x277, x278 = bits.Add64(x249, x267, uint64(p384Uint1(x276))) var x279 uint64 var x280 uint64 x279, x280 = bits.Add64(x251, x269, uint64(p384Uint1(x278))) var x281 uint64 var x282 uint64 x281, x282 = bits.Add64(x253, x271, uint64(p384Uint1(x280))) var x283 uint64 var x284 uint64 x283, x284 = bits.Add64(x255, x273, uint64(p384Uint1(x282))) var x285 uint64 var x286 uint64 x285, x286 = bits.Add64(x257, uint64(p384Uint1(x274)), uint64(p384Uint1(x284))) var x287 uint64 _, x287 = bits.Mul64(x275, 0x100000001) var x289 uint64 var x290 uint64 x290, x289 = bits.Mul64(x287, 0xffffffffffffffff) var x291 uint64 var x292 uint64 x292, x291 = bits.Mul64(x287, 0xffffffffffffffff) var x293 uint64 var x294 uint64 x294, x293 = bits.Mul64(x287, 0xffffffffffffffff) var x295 uint64 var x296 uint64 x296, x295 = bits.Mul64(x287, 0xfffffffffffffffe) var x297 uint64 var x298 uint64 x298, x297 = bits.Mul64(x287, 0xffffffff00000000) var x299 uint64 var x300 uint64 x300, x299 = bits.Mul64(x287, 0xffffffff) var x301 uint64 var x302 uint64 x301, x302 = bits.Add64(x300, x297, uint64(0x0)) var x303 uint64 var x304 uint64 x303, x304 = bits.Add64(x298, x295, uint64(p384Uint1(x302))) var x305 uint64 var x306 uint64 x305, x306 = bits.Add64(x296, x293, uint64(p384Uint1(x304))) var x307 uint64 var x308 uint64 x307, x308 = bits.Add64(x294, x291, uint64(p384Uint1(x306))) var x309 uint64 var x310 uint64 x309, x310 = bits.Add64(x292, x289, uint64(p384Uint1(x308))) var x312 uint64 _, x312 = bits.Add64(x275, x299, uint64(0x0)) var x313 uint64 var x314 uint64 x313, x314 = bits.Add64(x277, x301, uint64(p384Uint1(x312))) var x315 uint64 var x316 uint64 x315, x316 = bits.Add64(x279, x303, uint64(p384Uint1(x314))) var x317 uint64 var x318 uint64 x317, x318 = bits.Add64(x281, x305, uint64(p384Uint1(x316))) var x319 uint64 var x320 uint64 x319, x320 = bits.Add64(x283, x307, uint64(p384Uint1(x318))) var x321 uint64 var x322 uint64 x321, x322 = bits.Add64(x285, x309, uint64(p384Uint1(x320))) var x323 uint64 var x324 uint64 x323, x324 = bits.Add64((uint64(p384Uint1(x286)) + uint64(p384Uint1(x258))), (uint64(p384Uint1(x310)) + x290), uint64(p384Uint1(x322))) var x325 uint64 var x326 uint64 x326, x325 = bits.Mul64(x5, 0x200000000) var x327 uint64 var x328 uint64 x328, x327 = bits.Mul64(x5, 0xfffffffe00000000) var x329 uint64 var x330 uint64 x330, x329 = bits.Mul64(x5, 0x200000000) var x331 uint64 var x332 uint64 x332, x331 = bits.Mul64(x5, 0xfffffffe00000001) var x333 uint64 var x334 uint64 x333, x334 = bits.Add64(x332, x329, uint64(0x0)) var x335 uint64 var x336 uint64 x335, x336 = bits.Add64(x330, x327, uint64(p384Uint1(x334))) var x337 uint64 var x338 uint64 x337, x338 = bits.Add64(x328, x325, uint64(p384Uint1(x336))) var x339 uint64 var x340 uint64 x339, x340 = bits.Add64(x326, x5, uint64(p384Uint1(x338))) var x341 uint64 var x342 uint64 x341, x342 = bits.Add64(x313, x331, uint64(0x0)) var x343 uint64 var x344 uint64 x343, x344 = bits.Add64(x315, x333, uint64(p384Uint1(x342))) var x345 uint64 var x346 uint64 x345, x346 = bits.Add64(x317, x335, uint64(p384Uint1(x344))) var x347 uint64 var x348 uint64 x347, x348 = bits.Add64(x319, x337, uint64(p384Uint1(x346))) var x349 uint64 var x350 uint64 x349, x350 = bits.Add64(x321, x339, uint64(p384Uint1(x348))) var x351 uint64 var x352 uint64 x351, x352 = bits.Add64(x323, uint64(p384Uint1(x340)), uint64(p384Uint1(x350))) var x353 uint64 _, x353 = bits.Mul64(x341, 0x100000001) var x355 uint64 var x356 uint64 x356, x355 = bits.Mul64(x353, 0xffffffffffffffff) var x357 uint64 var x358 uint64 x358, x357 = bits.Mul64(x353, 0xffffffffffffffff) var x359 uint64 var x360 uint64 x360, x359 = bits.Mul64(x353, 0xffffffffffffffff) var x361 uint64 var x362 uint64 x362, x361 = bits.Mul64(x353, 0xfffffffffffffffe) var x363 uint64 var x364 uint64 x364, x363 = bits.Mul64(x353, 0xffffffff00000000) var x365 uint64 var x366 uint64 x366, x365 = bits.Mul64(x353, 0xffffffff) var x367 uint64 var x368 uint64 x367, x368 = bits.Add64(x366, x363, uint64(0x0)) var x369 uint64 var x370 uint64 x369, x370 = bits.Add64(x364, x361, uint64(p384Uint1(x368))) var x371 uint64 var x372 uint64 x371, x372 = bits.Add64(x362, x359, uint64(p384Uint1(x370))) var x373 uint64 var x374 uint64 x373, x374 = bits.Add64(x360, x357, uint64(p384Uint1(x372))) var x375 uint64 var x376 uint64 x375, x376 = bits.Add64(x358, x355, uint64(p384Uint1(x374))) var x378 uint64 _, x378 = bits.Add64(x341, x365, uint64(0x0)) var x379 uint64 var x380 uint64 x379, x380 = bits.Add64(x343, x367, uint64(p384Uint1(x378))) var x381 uint64 var x382 uint64 x381, x382 = bits.Add64(x345, x369, uint64(p384Uint1(x380))) var x383 uint64 var x384 uint64 x383, x384 = bits.Add64(x347, x371, uint64(p384Uint1(x382))) var x385 uint64 var x386 uint64 x385, x386 = bits.Add64(x349, x373, uint64(p384Uint1(x384))) var x387 uint64 var x388 uint64 x387, x388 = bits.Add64(x351, x375, uint64(p384Uint1(x386))) var x389 uint64 var x390 uint64 x389, x390 = bits.Add64((uint64(p384Uint1(x352)) + uint64(p384Uint1(x324))), (uint64(p384Uint1(x376)) + x356), uint64(p384Uint1(x388))) var x391 uint64 var x392 uint64 x391, x392 = bits.Sub64(x379, 0xffffffff, uint64(0x0)) var x393 uint64 var x394 uint64 x393, x394 = bits.Sub64(x381, 0xffffffff00000000, uint64(p384Uint1(x392))) var x395 uint64 var x396 uint64 x395, x396 = bits.Sub64(x383, 0xfffffffffffffffe, uint64(p384Uint1(x394))) var x397 uint64 var x398 uint64 x397, x398 = bits.Sub64(x385, 0xffffffffffffffff, uint64(p384Uint1(x396))) var x399 uint64 var x400 uint64 x399, x400 = bits.Sub64(x387, 0xffffffffffffffff, uint64(p384Uint1(x398))) var x401 uint64 var x402 uint64 x401, x402 = bits.Sub64(x389, 0xffffffffffffffff, uint64(p384Uint1(x400))) var x404 uint64 _, x404 = bits.Sub64(uint64(p384Uint1(x390)), uint64(0x0), uint64(p384Uint1(x402))) var x405 uint64 p384CmovznzU64(&x405, p384Uint1(x404), x391, x379) var x406 uint64 p384CmovznzU64(&x406, p384Uint1(x404), x393, x381) var x407 uint64 p384CmovznzU64(&x407, p384Uint1(x404), x395, x383) var x408 uint64 p384CmovznzU64(&x408, p384Uint1(x404), x397, x385) var x409 uint64 p384CmovznzU64(&x409, p384Uint1(x404), x399, x387) var x410 uint64 p384CmovznzU64(&x410, p384Uint1(x404), x401, x389) out1[0] = x405 out1[1] = x406 out1[2] = x407 out1[3] = x408 out1[4] = x409 out1[5] = x410 } // p384Selectznz is a multi-limb conditional select. // // Postconditions: // // eval out1 = (if arg1 = 0 then eval arg2 else eval arg3) // // Input Bounds: // // arg1: [0x0 ~> 0x1] // arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // // Output Bounds: // // out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] func p384Selectznz(out1 *[6]uint64, arg1 p384Uint1, arg2 *[6]uint64, arg3 *[6]uint64) { var x1 uint64 p384CmovznzU64(&x1, arg1, arg2[0], arg3[0]) var x2 uint64 p384CmovznzU64(&x2, arg1, arg2[1], arg3[1]) var x3 uint64 p384CmovznzU64(&x3, arg1, arg2[2], arg3[2]) var x4 uint64 p384CmovznzU64(&x4, arg1, arg2[3], arg3[3]) var x5 uint64 p384CmovznzU64(&x5, arg1, arg2[4], arg3[4]) var x6 uint64 p384CmovznzU64(&x6, arg1, arg2[5], arg3[5]) out1[0] = x1 out1[1] = x2 out1[2] = x3 out1[3] = x4 out1[4] = x5 out1[5] = x6 } // p384ToBytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..47] // // Input Bounds: // // arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // // Output Bounds: // // out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]] func p384ToBytes(out1 *[48]uint8, arg1 *[6]uint64) { x1 := arg1[5] x2 := arg1[4] x3 := arg1[3] x4 := arg1[2] x5 := arg1[1] x6 := arg1[0] x7 := (uint8(x6) & 0xff) x8 := (x6 >> 8) x9 := (uint8(x8) & 0xff) x10 := (x8 >> 8) x11 := (uint8(x10) & 0xff) x12 := (x10 >> 8) x13 := (uint8(x12) & 0xff) x14 := (x12 >> 8) x15 := (uint8(x14) & 0xff) x16 := (x14 >> 8) x17 := (uint8(x16) & 0xff) x18 := (x16 >> 8) x19 := (uint8(x18) & 0xff) x20 := uint8((x18 >> 8)) x21 := (uint8(x5) & 0xff) x22 := (x5 >> 8) x23 := (uint8(x22) & 0xff) x24 := (x22 >> 8) x25 := (uint8(x24) & 0xff) x26 := (x24 >> 8) x27 := (uint8(x26) & 0xff) x28 := (x26 >> 8) x29 := (uint8(x28) & 0xff) x30 := (x28 >> 8) x31 := (uint8(x30) & 0xff) x32 := (x30 >> 8) x33 := (uint8(x32) & 0xff) x34 := uint8((x32 >> 8)) x35 := (uint8(x4) & 0xff) x36 := (x4 >> 8) x37 := (uint8(x36) & 0xff) x38 := (x36 >> 8) x39 := (uint8(x38) & 0xff) x40 := (x38 >> 8) x41 := (uint8(x40) & 0xff) x42 := (x40 >> 8) x43 := (uint8(x42) & 0xff) x44 := (x42 >> 8) x45 := (uint8(x44) & 0xff) x46 := (x44 >> 8) x47 := (uint8(x46) & 0xff) x48 := uint8((x46 >> 8)) x49 := (uint8(x3) & 0xff) x50 := (x3 >> 8) x51 := (uint8(x50) & 0xff) x52 := (x50 >> 8) x53 := (uint8(x52) & 0xff) x54 := (x52 >> 8) x55 := (uint8(x54) & 0xff) x56 := (x54 >> 8) x57 := (uint8(x56) & 0xff) x58 := (x56 >> 8) x59 := (uint8(x58) & 0xff) x60 := (x58 >> 8) x61 := (uint8(x60) & 0xff) x62 := uint8((x60 >> 8)) x63 := (uint8(x2) & 0xff) x64 := (x2 >> 8) x65 := (uint8(x64) & 0xff) x66 := (x64 >> 8) x67 := (uint8(x66) & 0xff) x68 := (x66 >> 8) x69 := (uint8(x68) & 0xff) x70 := (x68 >> 8) x71 := (uint8(x70) & 0xff) x72 := (x70 >> 8) x73 := (uint8(x72) & 0xff) x74 := (x72 >> 8) x75 := (uint8(x74) & 0xff) x76 := uint8((x74 >> 8)) x77 := (uint8(x1) & 0xff) x78 := (x1 >> 8) x79 := (uint8(x78) & 0xff) x80 := (x78 >> 8) x81 := (uint8(x80) & 0xff) x82 := (x80 >> 8) x83 := (uint8(x82) & 0xff) x84 := (x82 >> 8) x85 := (uint8(x84) & 0xff) x86 := (x84 >> 8) x87 := (uint8(x86) & 0xff) x88 := (x86 >> 8) x89 := (uint8(x88) & 0xff) x90 := uint8((x88 >> 8)) out1[0] = x7 out1[1] = x9 out1[2] = x11 out1[3] = x13 out1[4] = x15 out1[5] = x17 out1[6] = x19 out1[7] = x20 out1[8] = x21 out1[9] = x23 out1[10] = x25 out1[11] = x27 out1[12] = x29 out1[13] = x31 out1[14] = x33 out1[15] = x34 out1[16] = x35 out1[17] = x37 out1[18] = x39 out1[19] = x41 out1[20] = x43 out1[21] = x45 out1[22] = x47 out1[23] = x48 out1[24] = x49 out1[25] = x51 out1[26] = x53 out1[27] = x55 out1[28] = x57 out1[29] = x59 out1[30] = x61 out1[31] = x62 out1[32] = x63 out1[33] = x65 out1[34] = x67 out1[35] = x69 out1[36] = x71 out1[37] = x73 out1[38] = x75 out1[39] = x76 out1[40] = x77 out1[41] = x79 out1[42] = x81 out1[43] = x83 out1[44] = x85 out1[45] = x87 out1[46] = x89 out1[47] = x90 } // p384FromBytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. // // Preconditions: // // 0 ≤ bytes_eval arg1 < m // // Postconditions: // // eval out1 mod m = bytes_eval arg1 mod m // 0 ≤ eval out1 < m // // Input Bounds: // // arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]] // // Output Bounds: // // out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] func p384FromBytes(out1 *[6]uint64, arg1 *[48]uint8) { x1 := (uint64(arg1[47]) << 56) x2 := (uint64(arg1[46]) << 48) x3 := (uint64(arg1[45]) << 40) x4 := (uint64(arg1[44]) << 32) x5 := (uint64(arg1[43]) << 24) x6 := (uint64(arg1[42]) << 16) x7 := (uint64(arg1[41]) << 8) x8 := arg1[40] x9 := (uint64(arg1[39]) << 56) x10 := (uint64(arg1[38]) << 48) x11 := (uint64(arg1[37]) << 40) x12 := (uint64(arg1[36]) << 32) x13 := (uint64(arg1[35]) << 24) x14 := (uint64(arg1[34]) << 16) x15 := (uint64(arg1[33]) << 8) x16 := arg1[32] x17 := (uint64(arg1[31]) << 56) x18 := (uint64(arg1[30]) << 48) x19 := (uint64(arg1[29]) << 40) x20 := (uint64(arg1[28]) << 32) x21 := (uint64(arg1[27]) << 24) x22 := (uint64(arg1[26]) << 16) x23 := (uint64(arg1[25]) << 8) x24 := arg1[24] x25 := (uint64(arg1[23]) << 56) x26 := (uint64(arg1[22]) << 48) x27 := (uint64(arg1[21]) << 40) x28 := (uint64(arg1[20]) << 32) x29 := (uint64(arg1[19]) << 24) x30 := (uint64(arg1[18]) << 16) x31 := (uint64(arg1[17]) << 8) x32 := arg1[16] x33 := (uint64(arg1[15]) << 56) x34 := (uint64(arg1[14]) << 48) x35 := (uint64(arg1[13]) << 40) x36 := (uint64(arg1[12]) << 32) x37 := (uint64(arg1[11]) << 24) x38 := (uint64(arg1[10]) << 16) x39 := (uint64(arg1[9]) << 8) x40 := arg1[8] x41 := (uint64(arg1[7]) << 56) x42 := (uint64(arg1[6]) << 48) x43 := (uint64(arg1[5]) << 40) x44 := (uint64(arg1[4]) << 32) x45 := (uint64(arg1[3]) << 24) x46 := (uint64(arg1[2]) << 16) x47 := (uint64(arg1[1]) << 8) x48 := arg1[0] x49 := (x47 + uint64(x48)) x50 := (x46 + x49) x51 := (x45 + x50) x52 := (x44 + x51) x53 := (x43 + x52) x54 := (x42 + x53) x55 := (x41 + x54) x56 := (x39 + uint64(x40)) x57 := (x38 + x56) x58 := (x37 + x57) x59 := (x36 + x58) x60 := (x35 + x59) x61 := (x34 + x60) x62 := (x33 + x61) x63 := (x31 + uint64(x32)) x64 := (x30 + x63) x65 := (x29 + x64) x66 := (x28 + x65) x67 := (x27 + x66) x68 := (x26 + x67) x69 := (x25 + x68) x70 := (x23 + uint64(x24)) x71 := (x22 + x70) x72 := (x21 + x71) x73 := (x20 + x72) x74 := (x19 + x73) x75 := (x18 + x74) x76 := (x17 + x75) x77 := (x15 + uint64(x16)) x78 := (x14 + x77) x79 := (x13 + x78) x80 := (x12 + x79) x81 := (x11 + x80) x82 := (x10 + x81) x83 := (x9 + x82) x84 := (x7 + uint64(x8)) x85 := (x6 + x84) x86 := (x5 + x85) x87 := (x4 + x86) x88 := (x3 + x87) x89 := (x2 + x88) x90 := (x1 + x89) out1[0] = x55 out1[1] = x62 out1[2] = x69 out1[3] = x76 out1[4] = x83 out1[5] = x90 } golang-filippo-nistec-0.0.4/internal/fiat/p384_invert.go000066400000000000000000000040721512422514700230660ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by addchain. DO NOT EDIT. package fiat // Invert sets e = 1/x, and returns e. // // If x == 0, Invert returns e = 0. func (e *P384Element) Invert(x *P384Element) *P384Element { // Inversion is implemented as exponentiation with exponent p − 2. // The sequence of 15 multiplications and 383 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain v0.4.0. // // _10 = 2*1 // _11 = 1 + _10 // _110 = 2*_11 // _111 = 1 + _110 // _111000 = _111 << 3 // _111111 = _111 + _111000 // x12 = _111111 << 6 + _111111 // x24 = x12 << 12 + x12 // x30 = x24 << 6 + _111111 // x31 = 2*x30 + 1 // x32 = 2*x31 + 1 // x63 = x32 << 31 + x31 // x126 = x63 << 63 + x63 // x252 = x126 << 126 + x126 // x255 = x252 << 3 + _111 // i397 = ((x255 << 33 + x32) << 94 + x30) << 2 // return 1 + i397 // var z = new(P384Element).Set(e) var t0 = new(P384Element) var t1 = new(P384Element) var t2 = new(P384Element) var t3 = new(P384Element) z.Square(x) z.Mul(x, z) z.Square(z) t1.Mul(x, z) z.Square(t1) for s := 1; s < 3; s++ { z.Square(z) } z.Mul(t1, z) t0.Square(z) for s := 1; s < 6; s++ { t0.Square(t0) } t0.Mul(z, t0) t2.Square(t0) for s := 1; s < 12; s++ { t2.Square(t2) } t0.Mul(t0, t2) for s := 0; s < 6; s++ { t0.Square(t0) } z.Mul(z, t0) t0.Square(z) t2.Mul(x, t0) t0.Square(t2) t0.Mul(x, t0) t3.Square(t0) for s := 1; s < 31; s++ { t3.Square(t3) } t2.Mul(t2, t3) t3.Square(t2) for s := 1; s < 63; s++ { t3.Square(t3) } t2.Mul(t2, t3) t3.Square(t2) for s := 1; s < 126; s++ { t3.Square(t3) } t2.Mul(t2, t3) for s := 0; s < 3; s++ { t2.Square(t2) } t1.Mul(t1, t2) for s := 0; s < 33; s++ { t1.Square(t1) } t0.Mul(t0, t1) for s := 0; s < 94; s++ { t0.Square(t0) } z.Mul(z, t0) for s := 0; s < 2; s++ { z.Square(z) } z.Mul(x, z) return e.Set(z) } golang-filippo-nistec-0.0.4/internal/fiat/p521.go000066400000000000000000000071251512422514700214720ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by generate.go. DO NOT EDIT. package fiat import ( "errors" "filippo.io/nistec/internal/subtle" ) // P521Element is an integer modulo 2^521 - 1. // // The zero value is a valid zero element. type P521Element struct { // Values are represented internally always in the Montgomery domain, and // converted in Bytes and SetBytes. x p521MontgomeryDomainFieldElement } const p521ElementLen = 66 type p521UntypedFieldElement = [9]uint64 // One sets e = 1, and returns e. func (e *P521Element) One() *P521Element { p521SetOne(&e.x) return e } // Equal returns 1 if e == t, and zero otherwise. func (e *P521Element) Equal(t *P521Element) int { eBytes := e.Bytes() tBytes := t.Bytes() return subtle.ConstantTimeCompare(eBytes, tBytes) } // IsZero returns 1 if e == 0, and zero otherwise. func (e *P521Element) IsZero() int { zero := make([]byte, p521ElementLen) eBytes := e.Bytes() return subtle.ConstantTimeCompare(eBytes, zero) } // Set sets e = t, and returns e. func (e *P521Element) Set(t *P521Element) *P521Element { e.x = t.x return e } // Bytes returns the 66-byte big-endian encoding of e. func (e *P521Element) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p521ElementLen]byte return e.bytes(&out) } func (e *P521Element) bytes(out *[p521ElementLen]byte) []byte { var tmp p521NonMontgomeryDomainFieldElement p521FromMontgomery(&tmp, &e.x) p521ToBytes(out, (*p521UntypedFieldElement)(&tmp)) p521InvertEndianness(out[:]) return out[:] } // SetBytes sets e = v, where v is a big-endian 66-byte encoding, and returns e. // If v is not 66 bytes or it encodes a value higher than 2^521 - 1, // SetBytes returns nil and an error, and e is unchanged. func (e *P521Element) SetBytes(v []byte) (*P521Element, error) { if len(v) != p521ElementLen { return nil, errors.New("invalid P521Element encoding") } // Check for non-canonical encodings (p + k, 2p + k, etc.) by comparing to // the encoding of -1 mod p, so p - 1, the highest canonical encoding. var minusOneEncoding = new(P521Element).Sub( new(P521Element), new(P521Element).One()).Bytes() if subtle.ConstantTimeLessOrEqBytes(v, minusOneEncoding) == 0 { return nil, errors.New("invalid P521Element encoding") } var in [p521ElementLen]byte copy(in[:], v) p521InvertEndianness(in[:]) var tmp p521NonMontgomeryDomainFieldElement p521FromBytes((*p521UntypedFieldElement)(&tmp), &in) p521ToMontgomery(&e.x, &tmp) return e, nil } // Add sets e = t1 + t2, and returns e. func (e *P521Element) Add(t1, t2 *P521Element) *P521Element { p521Add(&e.x, &t1.x, &t2.x) return e } // Sub sets e = t1 - t2, and returns e. func (e *P521Element) Sub(t1, t2 *P521Element) *P521Element { p521Sub(&e.x, &t1.x, &t2.x) return e } // Mul sets e = t1 * t2, and returns e. func (e *P521Element) Mul(t1, t2 *P521Element) *P521Element { p521Mul(&e.x, &t1.x, &t2.x) return e } // Square sets e = t * t, and returns e. func (e *P521Element) Square(t *P521Element) *P521Element { p521Square(&e.x, &t.x) return e } // Select sets v to a if cond == 1, and to b if cond == 0. func (v *P521Element) Select(a, b *P521Element, cond int) *P521Element { p521Selectznz((*p521UntypedFieldElement)(&v.x), p521Uint1(cond), (*p521UntypedFieldElement)(&b.x), (*p521UntypedFieldElement)(&a.x)) return v } func p521InvertEndianness(v []byte) { for i := 0; i < len(v)/2; i++ { v[i], v[len(v)-1-i] = v[len(v)-1-i], v[i] } } golang-filippo-nistec-0.0.4/internal/fiat/p521_fiat64.go000066400000000000000000005157161512422514700226610ustar00rootroot00000000000000// Code generated by Fiat Cryptography. DO NOT EDIT. // // Autogenerated: word_by_word_montgomery --lang Go --no-wide-int --cmovznz-by-mul --relax-primitive-carry-to-bitwidth 32,64 --internal-static --public-function-case camelCase --public-type-case camelCase --private-function-case camelCase --private-type-case camelCase --doc-text-before-function-name '' --doc-newline-before-package-declaration --doc-prepend-header 'Code generated by Fiat Cryptography. DO NOT EDIT.' --package-name fiat --no-prefix-fiat p521 64 '2^521 - 1' mul square add sub one from_montgomery to_montgomery selectznz to_bytes from_bytes // // curve description: p521 // // machine_wordsize = 64 (from "64") // // requested operations: mul, square, add, sub, one, from_montgomery, to_montgomery, selectznz, to_bytes, from_bytes // // m = 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff (from "2^521 - 1") // // // // NOTE: In addition to the bounds specified above each function, all // // functions synthesized for this Montgomery arithmetic require the // // input to be strictly less than the prime modulus (m), and also // // require the input to be in the unique saturated representation. // // All functions also ensure that these two properties are true of // // return values. // // // // Computed values: // // eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) + (z[6] << 0x180) + (z[7] << 0x1c0) + (z[8] << 2^9) // // bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) + (z[32] << 256) + (z[33] << 0x108) + (z[34] << 0x110) + (z[35] << 0x118) + (z[36] << 0x120) + (z[37] << 0x128) + (z[38] << 0x130) + (z[39] << 0x138) + (z[40] << 0x140) + (z[41] << 0x148) + (z[42] << 0x150) + (z[43] << 0x158) + (z[44] << 0x160) + (z[45] << 0x168) + (z[46] << 0x170) + (z[47] << 0x178) + (z[48] << 0x180) + (z[49] << 0x188) + (z[50] << 0x190) + (z[51] << 0x198) + (z[52] << 0x1a0) + (z[53] << 0x1a8) + (z[54] << 0x1b0) + (z[55] << 0x1b8) + (z[56] << 0x1c0) + (z[57] << 0x1c8) + (z[58] << 0x1d0) + (z[59] << 0x1d8) + (z[60] << 0x1e0) + (z[61] << 0x1e8) + (z[62] << 0x1f0) + (z[63] << 0x1f8) + (z[64] << 2^9) + (z[65] << 0x208) // // twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) + (z[6] << 0x180) + (z[7] << 0x1c0) + (z[8] << 2^9) in // // if x1 & (2^576-1) < 2^575 then x1 & (2^576-1) else (x1 & (2^576-1)) - 2^576 package fiat import "math/bits" type p521Uint1 uint64 // We use uint64 instead of a more narrow type for performance reasons; see https://github.com/mit-plv/fiat-crypto/pull/1006#issuecomment-892625927 type p521Int1 int64 // We use uint64 instead of a more narrow type for performance reasons; see https://github.com/mit-plv/fiat-crypto/pull/1006#issuecomment-892625927 // The type p521MontgomeryDomainFieldElement is a field element in the Montgomery domain. // // Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] type p521MontgomeryDomainFieldElement [9]uint64 // The type p521NonMontgomeryDomainFieldElement is a field element NOT in the Montgomery domain. // // Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] type p521NonMontgomeryDomainFieldElement [9]uint64 // p521CmovznzU64 is a single-word conditional move. // // Postconditions: // // out1 = (if arg1 = 0 then arg2 else arg3) // // Input Bounds: // // arg1: [0x0 ~> 0x1] // arg2: [0x0 ~> 0xffffffffffffffff] // arg3: [0x0 ~> 0xffffffffffffffff] // // Output Bounds: // // out1: [0x0 ~> 0xffffffffffffffff] func p521CmovznzU64(out1 *uint64, arg1 p521Uint1, arg2 uint64, arg3 uint64) { x1 := (uint64(arg1) * 0xffffffffffffffff) x2 := ((x1 & arg3) | ((^x1) & arg2)) *out1 = x2 } // p521Mul multiplies two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p521Mul(out1 *p521MontgomeryDomainFieldElement, arg1 *p521MontgomeryDomainFieldElement, arg2 *p521MontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[4] x5 := arg1[5] x6 := arg1[6] x7 := arg1[7] x8 := arg1[8] x9 := arg1[0] var x10 uint64 var x11 uint64 x11, x10 = bits.Mul64(x9, arg2[8]) var x12 uint64 var x13 uint64 x13, x12 = bits.Mul64(x9, arg2[7]) var x14 uint64 var x15 uint64 x15, x14 = bits.Mul64(x9, arg2[6]) var x16 uint64 var x17 uint64 x17, x16 = bits.Mul64(x9, arg2[5]) var x18 uint64 var x19 uint64 x19, x18 = bits.Mul64(x9, arg2[4]) var x20 uint64 var x21 uint64 x21, x20 = bits.Mul64(x9, arg2[3]) var x22 uint64 var x23 uint64 x23, x22 = bits.Mul64(x9, arg2[2]) var x24 uint64 var x25 uint64 x25, x24 = bits.Mul64(x9, arg2[1]) var x26 uint64 var x27 uint64 x27, x26 = bits.Mul64(x9, arg2[0]) var x28 uint64 var x29 uint64 x28, x29 = bits.Add64(x27, x24, uint64(0x0)) var x30 uint64 var x31 uint64 x30, x31 = bits.Add64(x25, x22, uint64(p521Uint1(x29))) var x32 uint64 var x33 uint64 x32, x33 = bits.Add64(x23, x20, uint64(p521Uint1(x31))) var x34 uint64 var x35 uint64 x34, x35 = bits.Add64(x21, x18, uint64(p521Uint1(x33))) var x36 uint64 var x37 uint64 x36, x37 = bits.Add64(x19, x16, uint64(p521Uint1(x35))) var x38 uint64 var x39 uint64 x38, x39 = bits.Add64(x17, x14, uint64(p521Uint1(x37))) var x40 uint64 var x41 uint64 x40, x41 = bits.Add64(x15, x12, uint64(p521Uint1(x39))) var x42 uint64 var x43 uint64 x42, x43 = bits.Add64(x13, x10, uint64(p521Uint1(x41))) x44 := (uint64(p521Uint1(x43)) + x11) var x45 uint64 var x46 uint64 x46, x45 = bits.Mul64(x26, 0x1ff) var x47 uint64 var x48 uint64 x48, x47 = bits.Mul64(x26, 0xffffffffffffffff) var x49 uint64 var x50 uint64 x50, x49 = bits.Mul64(x26, 0xffffffffffffffff) var x51 uint64 var x52 uint64 x52, x51 = bits.Mul64(x26, 0xffffffffffffffff) var x53 uint64 var x54 uint64 x54, x53 = bits.Mul64(x26, 0xffffffffffffffff) var x55 uint64 var x56 uint64 x56, x55 = bits.Mul64(x26, 0xffffffffffffffff) var x57 uint64 var x58 uint64 x58, x57 = bits.Mul64(x26, 0xffffffffffffffff) var x59 uint64 var x60 uint64 x60, x59 = bits.Mul64(x26, 0xffffffffffffffff) var x61 uint64 var x62 uint64 x62, x61 = bits.Mul64(x26, 0xffffffffffffffff) var x63 uint64 var x64 uint64 x63, x64 = bits.Add64(x62, x59, uint64(0x0)) var x65 uint64 var x66 uint64 x65, x66 = bits.Add64(x60, x57, uint64(p521Uint1(x64))) var x67 uint64 var x68 uint64 x67, x68 = bits.Add64(x58, x55, uint64(p521Uint1(x66))) var x69 uint64 var x70 uint64 x69, x70 = bits.Add64(x56, x53, uint64(p521Uint1(x68))) var x71 uint64 var x72 uint64 x71, x72 = bits.Add64(x54, x51, uint64(p521Uint1(x70))) var x73 uint64 var x74 uint64 x73, x74 = bits.Add64(x52, x49, uint64(p521Uint1(x72))) var x75 uint64 var x76 uint64 x75, x76 = bits.Add64(x50, x47, uint64(p521Uint1(x74))) var x77 uint64 var x78 uint64 x77, x78 = bits.Add64(x48, x45, uint64(p521Uint1(x76))) x79 := (uint64(p521Uint1(x78)) + x46) var x81 uint64 _, x81 = bits.Add64(x26, x61, uint64(0x0)) var x82 uint64 var x83 uint64 x82, x83 = bits.Add64(x28, x63, uint64(p521Uint1(x81))) var x84 uint64 var x85 uint64 x84, x85 = bits.Add64(x30, x65, uint64(p521Uint1(x83))) var x86 uint64 var x87 uint64 x86, x87 = bits.Add64(x32, x67, uint64(p521Uint1(x85))) var x88 uint64 var x89 uint64 x88, x89 = bits.Add64(x34, x69, uint64(p521Uint1(x87))) var x90 uint64 var x91 uint64 x90, x91 = bits.Add64(x36, x71, uint64(p521Uint1(x89))) var x92 uint64 var x93 uint64 x92, x93 = bits.Add64(x38, x73, uint64(p521Uint1(x91))) var x94 uint64 var x95 uint64 x94, x95 = bits.Add64(x40, x75, uint64(p521Uint1(x93))) var x96 uint64 var x97 uint64 x96, x97 = bits.Add64(x42, x77, uint64(p521Uint1(x95))) var x98 uint64 var x99 uint64 x98, x99 = bits.Add64(x44, x79, uint64(p521Uint1(x97))) var x100 uint64 var x101 uint64 x101, x100 = bits.Mul64(x1, arg2[8]) var x102 uint64 var x103 uint64 x103, x102 = bits.Mul64(x1, arg2[7]) var x104 uint64 var x105 uint64 x105, x104 = bits.Mul64(x1, arg2[6]) var x106 uint64 var x107 uint64 x107, x106 = bits.Mul64(x1, arg2[5]) var x108 uint64 var x109 uint64 x109, x108 = bits.Mul64(x1, arg2[4]) var x110 uint64 var x111 uint64 x111, x110 = bits.Mul64(x1, arg2[3]) var x112 uint64 var x113 uint64 x113, x112 = bits.Mul64(x1, arg2[2]) var x114 uint64 var x115 uint64 x115, x114 = bits.Mul64(x1, arg2[1]) var x116 uint64 var x117 uint64 x117, x116 = bits.Mul64(x1, arg2[0]) var x118 uint64 var x119 uint64 x118, x119 = bits.Add64(x117, x114, uint64(0x0)) var x120 uint64 var x121 uint64 x120, x121 = bits.Add64(x115, x112, uint64(p521Uint1(x119))) var x122 uint64 var x123 uint64 x122, x123 = bits.Add64(x113, x110, uint64(p521Uint1(x121))) var x124 uint64 var x125 uint64 x124, x125 = bits.Add64(x111, x108, uint64(p521Uint1(x123))) var x126 uint64 var x127 uint64 x126, x127 = bits.Add64(x109, x106, uint64(p521Uint1(x125))) var x128 uint64 var x129 uint64 x128, x129 = bits.Add64(x107, x104, uint64(p521Uint1(x127))) var x130 uint64 var x131 uint64 x130, x131 = bits.Add64(x105, x102, uint64(p521Uint1(x129))) var x132 uint64 var x133 uint64 x132, x133 = bits.Add64(x103, x100, uint64(p521Uint1(x131))) x134 := (uint64(p521Uint1(x133)) + x101) var x135 uint64 var x136 uint64 x135, x136 = bits.Add64(x82, x116, uint64(0x0)) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x84, x118, uint64(p521Uint1(x136))) var x139 uint64 var x140 uint64 x139, x140 = bits.Add64(x86, x120, uint64(p521Uint1(x138))) var x141 uint64 var x142 uint64 x141, x142 = bits.Add64(x88, x122, uint64(p521Uint1(x140))) var x143 uint64 var x144 uint64 x143, x144 = bits.Add64(x90, x124, uint64(p521Uint1(x142))) var x145 uint64 var x146 uint64 x145, x146 = bits.Add64(x92, x126, uint64(p521Uint1(x144))) var x147 uint64 var x148 uint64 x147, x148 = bits.Add64(x94, x128, uint64(p521Uint1(x146))) var x149 uint64 var x150 uint64 x149, x150 = bits.Add64(x96, x130, uint64(p521Uint1(x148))) var x151 uint64 var x152 uint64 x151, x152 = bits.Add64(x98, x132, uint64(p521Uint1(x150))) var x153 uint64 var x154 uint64 x153, x154 = bits.Add64(uint64(p521Uint1(x99)), x134, uint64(p521Uint1(x152))) var x155 uint64 var x156 uint64 x156, x155 = bits.Mul64(x135, 0x1ff) var x157 uint64 var x158 uint64 x158, x157 = bits.Mul64(x135, 0xffffffffffffffff) var x159 uint64 var x160 uint64 x160, x159 = bits.Mul64(x135, 0xffffffffffffffff) var x161 uint64 var x162 uint64 x162, x161 = bits.Mul64(x135, 0xffffffffffffffff) var x163 uint64 var x164 uint64 x164, x163 = bits.Mul64(x135, 0xffffffffffffffff) var x165 uint64 var x166 uint64 x166, x165 = bits.Mul64(x135, 0xffffffffffffffff) var x167 uint64 var x168 uint64 x168, x167 = bits.Mul64(x135, 0xffffffffffffffff) var x169 uint64 var x170 uint64 x170, x169 = bits.Mul64(x135, 0xffffffffffffffff) var x171 uint64 var x172 uint64 x172, x171 = bits.Mul64(x135, 0xffffffffffffffff) var x173 uint64 var x174 uint64 x173, x174 = bits.Add64(x172, x169, uint64(0x0)) var x175 uint64 var x176 uint64 x175, x176 = bits.Add64(x170, x167, uint64(p521Uint1(x174))) var x177 uint64 var x178 uint64 x177, x178 = bits.Add64(x168, x165, uint64(p521Uint1(x176))) var x179 uint64 var x180 uint64 x179, x180 = bits.Add64(x166, x163, uint64(p521Uint1(x178))) var x181 uint64 var x182 uint64 x181, x182 = bits.Add64(x164, x161, uint64(p521Uint1(x180))) var x183 uint64 var x184 uint64 x183, x184 = bits.Add64(x162, x159, uint64(p521Uint1(x182))) var x185 uint64 var x186 uint64 x185, x186 = bits.Add64(x160, x157, uint64(p521Uint1(x184))) var x187 uint64 var x188 uint64 x187, x188 = bits.Add64(x158, x155, uint64(p521Uint1(x186))) x189 := (uint64(p521Uint1(x188)) + x156) var x191 uint64 _, x191 = bits.Add64(x135, x171, uint64(0x0)) var x192 uint64 var x193 uint64 x192, x193 = bits.Add64(x137, x173, uint64(p521Uint1(x191))) var x194 uint64 var x195 uint64 x194, x195 = bits.Add64(x139, x175, uint64(p521Uint1(x193))) var x196 uint64 var x197 uint64 x196, x197 = bits.Add64(x141, x177, uint64(p521Uint1(x195))) var x198 uint64 var x199 uint64 x198, x199 = bits.Add64(x143, x179, uint64(p521Uint1(x197))) var x200 uint64 var x201 uint64 x200, x201 = bits.Add64(x145, x181, uint64(p521Uint1(x199))) var x202 uint64 var x203 uint64 x202, x203 = bits.Add64(x147, x183, uint64(p521Uint1(x201))) var x204 uint64 var x205 uint64 x204, x205 = bits.Add64(x149, x185, uint64(p521Uint1(x203))) var x206 uint64 var x207 uint64 x206, x207 = bits.Add64(x151, x187, uint64(p521Uint1(x205))) var x208 uint64 var x209 uint64 x208, x209 = bits.Add64(x153, x189, uint64(p521Uint1(x207))) x210 := (uint64(p521Uint1(x209)) + uint64(p521Uint1(x154))) var x211 uint64 var x212 uint64 x212, x211 = bits.Mul64(x2, arg2[8]) var x213 uint64 var x214 uint64 x214, x213 = bits.Mul64(x2, arg2[7]) var x215 uint64 var x216 uint64 x216, x215 = bits.Mul64(x2, arg2[6]) var x217 uint64 var x218 uint64 x218, x217 = bits.Mul64(x2, arg2[5]) var x219 uint64 var x220 uint64 x220, x219 = bits.Mul64(x2, arg2[4]) var x221 uint64 var x222 uint64 x222, x221 = bits.Mul64(x2, arg2[3]) var x223 uint64 var x224 uint64 x224, x223 = bits.Mul64(x2, arg2[2]) var x225 uint64 var x226 uint64 x226, x225 = bits.Mul64(x2, arg2[1]) var x227 uint64 var x228 uint64 x228, x227 = bits.Mul64(x2, arg2[0]) var x229 uint64 var x230 uint64 x229, x230 = bits.Add64(x228, x225, uint64(0x0)) var x231 uint64 var x232 uint64 x231, x232 = bits.Add64(x226, x223, uint64(p521Uint1(x230))) var x233 uint64 var x234 uint64 x233, x234 = bits.Add64(x224, x221, uint64(p521Uint1(x232))) var x235 uint64 var x236 uint64 x235, x236 = bits.Add64(x222, x219, uint64(p521Uint1(x234))) var x237 uint64 var x238 uint64 x237, x238 = bits.Add64(x220, x217, uint64(p521Uint1(x236))) var x239 uint64 var x240 uint64 x239, x240 = bits.Add64(x218, x215, uint64(p521Uint1(x238))) var x241 uint64 var x242 uint64 x241, x242 = bits.Add64(x216, x213, uint64(p521Uint1(x240))) var x243 uint64 var x244 uint64 x243, x244 = bits.Add64(x214, x211, uint64(p521Uint1(x242))) x245 := (uint64(p521Uint1(x244)) + x212) var x246 uint64 var x247 uint64 x246, x247 = bits.Add64(x192, x227, uint64(0x0)) var x248 uint64 var x249 uint64 x248, x249 = bits.Add64(x194, x229, uint64(p521Uint1(x247))) var x250 uint64 var x251 uint64 x250, x251 = bits.Add64(x196, x231, uint64(p521Uint1(x249))) var x252 uint64 var x253 uint64 x252, x253 = bits.Add64(x198, x233, uint64(p521Uint1(x251))) var x254 uint64 var x255 uint64 x254, x255 = bits.Add64(x200, x235, uint64(p521Uint1(x253))) var x256 uint64 var x257 uint64 x256, x257 = bits.Add64(x202, x237, uint64(p521Uint1(x255))) var x258 uint64 var x259 uint64 x258, x259 = bits.Add64(x204, x239, uint64(p521Uint1(x257))) var x260 uint64 var x261 uint64 x260, x261 = bits.Add64(x206, x241, uint64(p521Uint1(x259))) var x262 uint64 var x263 uint64 x262, x263 = bits.Add64(x208, x243, uint64(p521Uint1(x261))) var x264 uint64 var x265 uint64 x264, x265 = bits.Add64(x210, x245, uint64(p521Uint1(x263))) var x266 uint64 var x267 uint64 x267, x266 = bits.Mul64(x246, 0x1ff) var x268 uint64 var x269 uint64 x269, x268 = bits.Mul64(x246, 0xffffffffffffffff) var x270 uint64 var x271 uint64 x271, x270 = bits.Mul64(x246, 0xffffffffffffffff) var x272 uint64 var x273 uint64 x273, x272 = bits.Mul64(x246, 0xffffffffffffffff) var x274 uint64 var x275 uint64 x275, x274 = bits.Mul64(x246, 0xffffffffffffffff) var x276 uint64 var x277 uint64 x277, x276 = bits.Mul64(x246, 0xffffffffffffffff) var x278 uint64 var x279 uint64 x279, x278 = bits.Mul64(x246, 0xffffffffffffffff) var x280 uint64 var x281 uint64 x281, x280 = bits.Mul64(x246, 0xffffffffffffffff) var x282 uint64 var x283 uint64 x283, x282 = bits.Mul64(x246, 0xffffffffffffffff) var x284 uint64 var x285 uint64 x284, x285 = bits.Add64(x283, x280, uint64(0x0)) var x286 uint64 var x287 uint64 x286, x287 = bits.Add64(x281, x278, uint64(p521Uint1(x285))) var x288 uint64 var x289 uint64 x288, x289 = bits.Add64(x279, x276, uint64(p521Uint1(x287))) var x290 uint64 var x291 uint64 x290, x291 = bits.Add64(x277, x274, uint64(p521Uint1(x289))) var x292 uint64 var x293 uint64 x292, x293 = bits.Add64(x275, x272, uint64(p521Uint1(x291))) var x294 uint64 var x295 uint64 x294, x295 = bits.Add64(x273, x270, uint64(p521Uint1(x293))) var x296 uint64 var x297 uint64 x296, x297 = bits.Add64(x271, x268, uint64(p521Uint1(x295))) var x298 uint64 var x299 uint64 x298, x299 = bits.Add64(x269, x266, uint64(p521Uint1(x297))) x300 := (uint64(p521Uint1(x299)) + x267) var x302 uint64 _, x302 = bits.Add64(x246, x282, uint64(0x0)) var x303 uint64 var x304 uint64 x303, x304 = bits.Add64(x248, x284, uint64(p521Uint1(x302))) var x305 uint64 var x306 uint64 x305, x306 = bits.Add64(x250, x286, uint64(p521Uint1(x304))) var x307 uint64 var x308 uint64 x307, x308 = bits.Add64(x252, x288, uint64(p521Uint1(x306))) var x309 uint64 var x310 uint64 x309, x310 = bits.Add64(x254, x290, uint64(p521Uint1(x308))) var x311 uint64 var x312 uint64 x311, x312 = bits.Add64(x256, x292, uint64(p521Uint1(x310))) var x313 uint64 var x314 uint64 x313, x314 = bits.Add64(x258, x294, uint64(p521Uint1(x312))) var x315 uint64 var x316 uint64 x315, x316 = bits.Add64(x260, x296, uint64(p521Uint1(x314))) var x317 uint64 var x318 uint64 x317, x318 = bits.Add64(x262, x298, uint64(p521Uint1(x316))) var x319 uint64 var x320 uint64 x319, x320 = bits.Add64(x264, x300, uint64(p521Uint1(x318))) x321 := (uint64(p521Uint1(x320)) + uint64(p521Uint1(x265))) var x322 uint64 var x323 uint64 x323, x322 = bits.Mul64(x3, arg2[8]) var x324 uint64 var x325 uint64 x325, x324 = bits.Mul64(x3, arg2[7]) var x326 uint64 var x327 uint64 x327, x326 = bits.Mul64(x3, arg2[6]) var x328 uint64 var x329 uint64 x329, x328 = bits.Mul64(x3, arg2[5]) var x330 uint64 var x331 uint64 x331, x330 = bits.Mul64(x3, arg2[4]) var x332 uint64 var x333 uint64 x333, x332 = bits.Mul64(x3, arg2[3]) var x334 uint64 var x335 uint64 x335, x334 = bits.Mul64(x3, arg2[2]) var x336 uint64 var x337 uint64 x337, x336 = bits.Mul64(x3, arg2[1]) var x338 uint64 var x339 uint64 x339, x338 = bits.Mul64(x3, arg2[0]) var x340 uint64 var x341 uint64 x340, x341 = bits.Add64(x339, x336, uint64(0x0)) var x342 uint64 var x343 uint64 x342, x343 = bits.Add64(x337, x334, uint64(p521Uint1(x341))) var x344 uint64 var x345 uint64 x344, x345 = bits.Add64(x335, x332, uint64(p521Uint1(x343))) var x346 uint64 var x347 uint64 x346, x347 = bits.Add64(x333, x330, uint64(p521Uint1(x345))) var x348 uint64 var x349 uint64 x348, x349 = bits.Add64(x331, x328, uint64(p521Uint1(x347))) var x350 uint64 var x351 uint64 x350, x351 = bits.Add64(x329, x326, uint64(p521Uint1(x349))) var x352 uint64 var x353 uint64 x352, x353 = bits.Add64(x327, x324, uint64(p521Uint1(x351))) var x354 uint64 var x355 uint64 x354, x355 = bits.Add64(x325, x322, uint64(p521Uint1(x353))) x356 := (uint64(p521Uint1(x355)) + x323) var x357 uint64 var x358 uint64 x357, x358 = bits.Add64(x303, x338, uint64(0x0)) var x359 uint64 var x360 uint64 x359, x360 = bits.Add64(x305, x340, uint64(p521Uint1(x358))) var x361 uint64 var x362 uint64 x361, x362 = bits.Add64(x307, x342, uint64(p521Uint1(x360))) var x363 uint64 var x364 uint64 x363, x364 = bits.Add64(x309, x344, uint64(p521Uint1(x362))) var x365 uint64 var x366 uint64 x365, x366 = bits.Add64(x311, x346, uint64(p521Uint1(x364))) var x367 uint64 var x368 uint64 x367, x368 = bits.Add64(x313, x348, uint64(p521Uint1(x366))) var x369 uint64 var x370 uint64 x369, x370 = bits.Add64(x315, x350, uint64(p521Uint1(x368))) var x371 uint64 var x372 uint64 x371, x372 = bits.Add64(x317, x352, uint64(p521Uint1(x370))) var x373 uint64 var x374 uint64 x373, x374 = bits.Add64(x319, x354, uint64(p521Uint1(x372))) var x375 uint64 var x376 uint64 x375, x376 = bits.Add64(x321, x356, uint64(p521Uint1(x374))) var x377 uint64 var x378 uint64 x378, x377 = bits.Mul64(x357, 0x1ff) var x379 uint64 var x380 uint64 x380, x379 = bits.Mul64(x357, 0xffffffffffffffff) var x381 uint64 var x382 uint64 x382, x381 = bits.Mul64(x357, 0xffffffffffffffff) var x383 uint64 var x384 uint64 x384, x383 = bits.Mul64(x357, 0xffffffffffffffff) var x385 uint64 var x386 uint64 x386, x385 = bits.Mul64(x357, 0xffffffffffffffff) var x387 uint64 var x388 uint64 x388, x387 = bits.Mul64(x357, 0xffffffffffffffff) var x389 uint64 var x390 uint64 x390, x389 = bits.Mul64(x357, 0xffffffffffffffff) var x391 uint64 var x392 uint64 x392, x391 = bits.Mul64(x357, 0xffffffffffffffff) var x393 uint64 var x394 uint64 x394, x393 = bits.Mul64(x357, 0xffffffffffffffff) var x395 uint64 var x396 uint64 x395, x396 = bits.Add64(x394, x391, uint64(0x0)) var x397 uint64 var x398 uint64 x397, x398 = bits.Add64(x392, x389, uint64(p521Uint1(x396))) var x399 uint64 var x400 uint64 x399, x400 = bits.Add64(x390, x387, uint64(p521Uint1(x398))) var x401 uint64 var x402 uint64 x401, x402 = bits.Add64(x388, x385, uint64(p521Uint1(x400))) var x403 uint64 var x404 uint64 x403, x404 = bits.Add64(x386, x383, uint64(p521Uint1(x402))) var x405 uint64 var x406 uint64 x405, x406 = bits.Add64(x384, x381, uint64(p521Uint1(x404))) var x407 uint64 var x408 uint64 x407, x408 = bits.Add64(x382, x379, uint64(p521Uint1(x406))) var x409 uint64 var x410 uint64 x409, x410 = bits.Add64(x380, x377, uint64(p521Uint1(x408))) x411 := (uint64(p521Uint1(x410)) + x378) var x413 uint64 _, x413 = bits.Add64(x357, x393, uint64(0x0)) var x414 uint64 var x415 uint64 x414, x415 = bits.Add64(x359, x395, uint64(p521Uint1(x413))) var x416 uint64 var x417 uint64 x416, x417 = bits.Add64(x361, x397, uint64(p521Uint1(x415))) var x418 uint64 var x419 uint64 x418, x419 = bits.Add64(x363, x399, uint64(p521Uint1(x417))) var x420 uint64 var x421 uint64 x420, x421 = bits.Add64(x365, x401, uint64(p521Uint1(x419))) var x422 uint64 var x423 uint64 x422, x423 = bits.Add64(x367, x403, uint64(p521Uint1(x421))) var x424 uint64 var x425 uint64 x424, x425 = bits.Add64(x369, x405, uint64(p521Uint1(x423))) var x426 uint64 var x427 uint64 x426, x427 = bits.Add64(x371, x407, uint64(p521Uint1(x425))) var x428 uint64 var x429 uint64 x428, x429 = bits.Add64(x373, x409, uint64(p521Uint1(x427))) var x430 uint64 var x431 uint64 x430, x431 = bits.Add64(x375, x411, uint64(p521Uint1(x429))) x432 := (uint64(p521Uint1(x431)) + uint64(p521Uint1(x376))) var x433 uint64 var x434 uint64 x434, x433 = bits.Mul64(x4, arg2[8]) var x435 uint64 var x436 uint64 x436, x435 = bits.Mul64(x4, arg2[7]) var x437 uint64 var x438 uint64 x438, x437 = bits.Mul64(x4, arg2[6]) var x439 uint64 var x440 uint64 x440, x439 = bits.Mul64(x4, arg2[5]) var x441 uint64 var x442 uint64 x442, x441 = bits.Mul64(x4, arg2[4]) var x443 uint64 var x444 uint64 x444, x443 = bits.Mul64(x4, arg2[3]) var x445 uint64 var x446 uint64 x446, x445 = bits.Mul64(x4, arg2[2]) var x447 uint64 var x448 uint64 x448, x447 = bits.Mul64(x4, arg2[1]) var x449 uint64 var x450 uint64 x450, x449 = bits.Mul64(x4, arg2[0]) var x451 uint64 var x452 uint64 x451, x452 = bits.Add64(x450, x447, uint64(0x0)) var x453 uint64 var x454 uint64 x453, x454 = bits.Add64(x448, x445, uint64(p521Uint1(x452))) var x455 uint64 var x456 uint64 x455, x456 = bits.Add64(x446, x443, uint64(p521Uint1(x454))) var x457 uint64 var x458 uint64 x457, x458 = bits.Add64(x444, x441, uint64(p521Uint1(x456))) var x459 uint64 var x460 uint64 x459, x460 = bits.Add64(x442, x439, uint64(p521Uint1(x458))) var x461 uint64 var x462 uint64 x461, x462 = bits.Add64(x440, x437, uint64(p521Uint1(x460))) var x463 uint64 var x464 uint64 x463, x464 = bits.Add64(x438, x435, uint64(p521Uint1(x462))) var x465 uint64 var x466 uint64 x465, x466 = bits.Add64(x436, x433, uint64(p521Uint1(x464))) x467 := (uint64(p521Uint1(x466)) + x434) var x468 uint64 var x469 uint64 x468, x469 = bits.Add64(x414, x449, uint64(0x0)) var x470 uint64 var x471 uint64 x470, x471 = bits.Add64(x416, x451, uint64(p521Uint1(x469))) var x472 uint64 var x473 uint64 x472, x473 = bits.Add64(x418, x453, uint64(p521Uint1(x471))) var x474 uint64 var x475 uint64 x474, x475 = bits.Add64(x420, x455, uint64(p521Uint1(x473))) var x476 uint64 var x477 uint64 x476, x477 = bits.Add64(x422, x457, uint64(p521Uint1(x475))) var x478 uint64 var x479 uint64 x478, x479 = bits.Add64(x424, x459, uint64(p521Uint1(x477))) var x480 uint64 var x481 uint64 x480, x481 = bits.Add64(x426, x461, uint64(p521Uint1(x479))) var x482 uint64 var x483 uint64 x482, x483 = bits.Add64(x428, x463, uint64(p521Uint1(x481))) var x484 uint64 var x485 uint64 x484, x485 = bits.Add64(x430, x465, uint64(p521Uint1(x483))) var x486 uint64 var x487 uint64 x486, x487 = bits.Add64(x432, x467, uint64(p521Uint1(x485))) var x488 uint64 var x489 uint64 x489, x488 = bits.Mul64(x468, 0x1ff) var x490 uint64 var x491 uint64 x491, x490 = bits.Mul64(x468, 0xffffffffffffffff) var x492 uint64 var x493 uint64 x493, x492 = bits.Mul64(x468, 0xffffffffffffffff) var x494 uint64 var x495 uint64 x495, x494 = bits.Mul64(x468, 0xffffffffffffffff) var x496 uint64 var x497 uint64 x497, x496 = bits.Mul64(x468, 0xffffffffffffffff) var x498 uint64 var x499 uint64 x499, x498 = bits.Mul64(x468, 0xffffffffffffffff) var x500 uint64 var x501 uint64 x501, x500 = bits.Mul64(x468, 0xffffffffffffffff) var x502 uint64 var x503 uint64 x503, x502 = bits.Mul64(x468, 0xffffffffffffffff) var x504 uint64 var x505 uint64 x505, x504 = bits.Mul64(x468, 0xffffffffffffffff) var x506 uint64 var x507 uint64 x506, x507 = bits.Add64(x505, x502, uint64(0x0)) var x508 uint64 var x509 uint64 x508, x509 = bits.Add64(x503, x500, uint64(p521Uint1(x507))) var x510 uint64 var x511 uint64 x510, x511 = bits.Add64(x501, x498, uint64(p521Uint1(x509))) var x512 uint64 var x513 uint64 x512, x513 = bits.Add64(x499, x496, uint64(p521Uint1(x511))) var x514 uint64 var x515 uint64 x514, x515 = bits.Add64(x497, x494, uint64(p521Uint1(x513))) var x516 uint64 var x517 uint64 x516, x517 = bits.Add64(x495, x492, uint64(p521Uint1(x515))) var x518 uint64 var x519 uint64 x518, x519 = bits.Add64(x493, x490, uint64(p521Uint1(x517))) var x520 uint64 var x521 uint64 x520, x521 = bits.Add64(x491, x488, uint64(p521Uint1(x519))) x522 := (uint64(p521Uint1(x521)) + x489) var x524 uint64 _, x524 = bits.Add64(x468, x504, uint64(0x0)) var x525 uint64 var x526 uint64 x525, x526 = bits.Add64(x470, x506, uint64(p521Uint1(x524))) var x527 uint64 var x528 uint64 x527, x528 = bits.Add64(x472, x508, uint64(p521Uint1(x526))) var x529 uint64 var x530 uint64 x529, x530 = bits.Add64(x474, x510, uint64(p521Uint1(x528))) var x531 uint64 var x532 uint64 x531, x532 = bits.Add64(x476, x512, uint64(p521Uint1(x530))) var x533 uint64 var x534 uint64 x533, x534 = bits.Add64(x478, x514, uint64(p521Uint1(x532))) var x535 uint64 var x536 uint64 x535, x536 = bits.Add64(x480, x516, uint64(p521Uint1(x534))) var x537 uint64 var x538 uint64 x537, x538 = bits.Add64(x482, x518, uint64(p521Uint1(x536))) var x539 uint64 var x540 uint64 x539, x540 = bits.Add64(x484, x520, uint64(p521Uint1(x538))) var x541 uint64 var x542 uint64 x541, x542 = bits.Add64(x486, x522, uint64(p521Uint1(x540))) x543 := (uint64(p521Uint1(x542)) + uint64(p521Uint1(x487))) var x544 uint64 var x545 uint64 x545, x544 = bits.Mul64(x5, arg2[8]) var x546 uint64 var x547 uint64 x547, x546 = bits.Mul64(x5, arg2[7]) var x548 uint64 var x549 uint64 x549, x548 = bits.Mul64(x5, arg2[6]) var x550 uint64 var x551 uint64 x551, x550 = bits.Mul64(x5, arg2[5]) var x552 uint64 var x553 uint64 x553, x552 = bits.Mul64(x5, arg2[4]) var x554 uint64 var x555 uint64 x555, x554 = bits.Mul64(x5, arg2[3]) var x556 uint64 var x557 uint64 x557, x556 = bits.Mul64(x5, arg2[2]) var x558 uint64 var x559 uint64 x559, x558 = bits.Mul64(x5, arg2[1]) var x560 uint64 var x561 uint64 x561, x560 = bits.Mul64(x5, arg2[0]) var x562 uint64 var x563 uint64 x562, x563 = bits.Add64(x561, x558, uint64(0x0)) var x564 uint64 var x565 uint64 x564, x565 = bits.Add64(x559, x556, uint64(p521Uint1(x563))) var x566 uint64 var x567 uint64 x566, x567 = bits.Add64(x557, x554, uint64(p521Uint1(x565))) var x568 uint64 var x569 uint64 x568, x569 = bits.Add64(x555, x552, uint64(p521Uint1(x567))) var x570 uint64 var x571 uint64 x570, x571 = bits.Add64(x553, x550, uint64(p521Uint1(x569))) var x572 uint64 var x573 uint64 x572, x573 = bits.Add64(x551, x548, uint64(p521Uint1(x571))) var x574 uint64 var x575 uint64 x574, x575 = bits.Add64(x549, x546, uint64(p521Uint1(x573))) var x576 uint64 var x577 uint64 x576, x577 = bits.Add64(x547, x544, uint64(p521Uint1(x575))) x578 := (uint64(p521Uint1(x577)) + x545) var x579 uint64 var x580 uint64 x579, x580 = bits.Add64(x525, x560, uint64(0x0)) var x581 uint64 var x582 uint64 x581, x582 = bits.Add64(x527, x562, uint64(p521Uint1(x580))) var x583 uint64 var x584 uint64 x583, x584 = bits.Add64(x529, x564, uint64(p521Uint1(x582))) var x585 uint64 var x586 uint64 x585, x586 = bits.Add64(x531, x566, uint64(p521Uint1(x584))) var x587 uint64 var x588 uint64 x587, x588 = bits.Add64(x533, x568, uint64(p521Uint1(x586))) var x589 uint64 var x590 uint64 x589, x590 = bits.Add64(x535, x570, uint64(p521Uint1(x588))) var x591 uint64 var x592 uint64 x591, x592 = bits.Add64(x537, x572, uint64(p521Uint1(x590))) var x593 uint64 var x594 uint64 x593, x594 = bits.Add64(x539, x574, uint64(p521Uint1(x592))) var x595 uint64 var x596 uint64 x595, x596 = bits.Add64(x541, x576, uint64(p521Uint1(x594))) var x597 uint64 var x598 uint64 x597, x598 = bits.Add64(x543, x578, uint64(p521Uint1(x596))) var x599 uint64 var x600 uint64 x600, x599 = bits.Mul64(x579, 0x1ff) var x601 uint64 var x602 uint64 x602, x601 = bits.Mul64(x579, 0xffffffffffffffff) var x603 uint64 var x604 uint64 x604, x603 = bits.Mul64(x579, 0xffffffffffffffff) var x605 uint64 var x606 uint64 x606, x605 = bits.Mul64(x579, 0xffffffffffffffff) var x607 uint64 var x608 uint64 x608, x607 = bits.Mul64(x579, 0xffffffffffffffff) var x609 uint64 var x610 uint64 x610, x609 = bits.Mul64(x579, 0xffffffffffffffff) var x611 uint64 var x612 uint64 x612, x611 = bits.Mul64(x579, 0xffffffffffffffff) var x613 uint64 var x614 uint64 x614, x613 = bits.Mul64(x579, 0xffffffffffffffff) var x615 uint64 var x616 uint64 x616, x615 = bits.Mul64(x579, 0xffffffffffffffff) var x617 uint64 var x618 uint64 x617, x618 = bits.Add64(x616, x613, uint64(0x0)) var x619 uint64 var x620 uint64 x619, x620 = bits.Add64(x614, x611, uint64(p521Uint1(x618))) var x621 uint64 var x622 uint64 x621, x622 = bits.Add64(x612, x609, uint64(p521Uint1(x620))) var x623 uint64 var x624 uint64 x623, x624 = bits.Add64(x610, x607, uint64(p521Uint1(x622))) var x625 uint64 var x626 uint64 x625, x626 = bits.Add64(x608, x605, uint64(p521Uint1(x624))) var x627 uint64 var x628 uint64 x627, x628 = bits.Add64(x606, x603, uint64(p521Uint1(x626))) var x629 uint64 var x630 uint64 x629, x630 = bits.Add64(x604, x601, uint64(p521Uint1(x628))) var x631 uint64 var x632 uint64 x631, x632 = bits.Add64(x602, x599, uint64(p521Uint1(x630))) x633 := (uint64(p521Uint1(x632)) + x600) var x635 uint64 _, x635 = bits.Add64(x579, x615, uint64(0x0)) var x636 uint64 var x637 uint64 x636, x637 = bits.Add64(x581, x617, uint64(p521Uint1(x635))) var x638 uint64 var x639 uint64 x638, x639 = bits.Add64(x583, x619, uint64(p521Uint1(x637))) var x640 uint64 var x641 uint64 x640, x641 = bits.Add64(x585, x621, uint64(p521Uint1(x639))) var x642 uint64 var x643 uint64 x642, x643 = bits.Add64(x587, x623, uint64(p521Uint1(x641))) var x644 uint64 var x645 uint64 x644, x645 = bits.Add64(x589, x625, uint64(p521Uint1(x643))) var x646 uint64 var x647 uint64 x646, x647 = bits.Add64(x591, x627, uint64(p521Uint1(x645))) var x648 uint64 var x649 uint64 x648, x649 = bits.Add64(x593, x629, uint64(p521Uint1(x647))) var x650 uint64 var x651 uint64 x650, x651 = bits.Add64(x595, x631, uint64(p521Uint1(x649))) var x652 uint64 var x653 uint64 x652, x653 = bits.Add64(x597, x633, uint64(p521Uint1(x651))) x654 := (uint64(p521Uint1(x653)) + uint64(p521Uint1(x598))) var x655 uint64 var x656 uint64 x656, x655 = bits.Mul64(x6, arg2[8]) var x657 uint64 var x658 uint64 x658, x657 = bits.Mul64(x6, arg2[7]) var x659 uint64 var x660 uint64 x660, x659 = bits.Mul64(x6, arg2[6]) var x661 uint64 var x662 uint64 x662, x661 = bits.Mul64(x6, arg2[5]) var x663 uint64 var x664 uint64 x664, x663 = bits.Mul64(x6, arg2[4]) var x665 uint64 var x666 uint64 x666, x665 = bits.Mul64(x6, arg2[3]) var x667 uint64 var x668 uint64 x668, x667 = bits.Mul64(x6, arg2[2]) var x669 uint64 var x670 uint64 x670, x669 = bits.Mul64(x6, arg2[1]) var x671 uint64 var x672 uint64 x672, x671 = bits.Mul64(x6, arg2[0]) var x673 uint64 var x674 uint64 x673, x674 = bits.Add64(x672, x669, uint64(0x0)) var x675 uint64 var x676 uint64 x675, x676 = bits.Add64(x670, x667, uint64(p521Uint1(x674))) var x677 uint64 var x678 uint64 x677, x678 = bits.Add64(x668, x665, uint64(p521Uint1(x676))) var x679 uint64 var x680 uint64 x679, x680 = bits.Add64(x666, x663, uint64(p521Uint1(x678))) var x681 uint64 var x682 uint64 x681, x682 = bits.Add64(x664, x661, uint64(p521Uint1(x680))) var x683 uint64 var x684 uint64 x683, x684 = bits.Add64(x662, x659, uint64(p521Uint1(x682))) var x685 uint64 var x686 uint64 x685, x686 = bits.Add64(x660, x657, uint64(p521Uint1(x684))) var x687 uint64 var x688 uint64 x687, x688 = bits.Add64(x658, x655, uint64(p521Uint1(x686))) x689 := (uint64(p521Uint1(x688)) + x656) var x690 uint64 var x691 uint64 x690, x691 = bits.Add64(x636, x671, uint64(0x0)) var x692 uint64 var x693 uint64 x692, x693 = bits.Add64(x638, x673, uint64(p521Uint1(x691))) var x694 uint64 var x695 uint64 x694, x695 = bits.Add64(x640, x675, uint64(p521Uint1(x693))) var x696 uint64 var x697 uint64 x696, x697 = bits.Add64(x642, x677, uint64(p521Uint1(x695))) var x698 uint64 var x699 uint64 x698, x699 = bits.Add64(x644, x679, uint64(p521Uint1(x697))) var x700 uint64 var x701 uint64 x700, x701 = bits.Add64(x646, x681, uint64(p521Uint1(x699))) var x702 uint64 var x703 uint64 x702, x703 = bits.Add64(x648, x683, uint64(p521Uint1(x701))) var x704 uint64 var x705 uint64 x704, x705 = bits.Add64(x650, x685, uint64(p521Uint1(x703))) var x706 uint64 var x707 uint64 x706, x707 = bits.Add64(x652, x687, uint64(p521Uint1(x705))) var x708 uint64 var x709 uint64 x708, x709 = bits.Add64(x654, x689, uint64(p521Uint1(x707))) var x710 uint64 var x711 uint64 x711, x710 = bits.Mul64(x690, 0x1ff) var x712 uint64 var x713 uint64 x713, x712 = bits.Mul64(x690, 0xffffffffffffffff) var x714 uint64 var x715 uint64 x715, x714 = bits.Mul64(x690, 0xffffffffffffffff) var x716 uint64 var x717 uint64 x717, x716 = bits.Mul64(x690, 0xffffffffffffffff) var x718 uint64 var x719 uint64 x719, x718 = bits.Mul64(x690, 0xffffffffffffffff) var x720 uint64 var x721 uint64 x721, x720 = bits.Mul64(x690, 0xffffffffffffffff) var x722 uint64 var x723 uint64 x723, x722 = bits.Mul64(x690, 0xffffffffffffffff) var x724 uint64 var x725 uint64 x725, x724 = bits.Mul64(x690, 0xffffffffffffffff) var x726 uint64 var x727 uint64 x727, x726 = bits.Mul64(x690, 0xffffffffffffffff) var x728 uint64 var x729 uint64 x728, x729 = bits.Add64(x727, x724, uint64(0x0)) var x730 uint64 var x731 uint64 x730, x731 = bits.Add64(x725, x722, uint64(p521Uint1(x729))) var x732 uint64 var x733 uint64 x732, x733 = bits.Add64(x723, x720, uint64(p521Uint1(x731))) var x734 uint64 var x735 uint64 x734, x735 = bits.Add64(x721, x718, uint64(p521Uint1(x733))) var x736 uint64 var x737 uint64 x736, x737 = bits.Add64(x719, x716, uint64(p521Uint1(x735))) var x738 uint64 var x739 uint64 x738, x739 = bits.Add64(x717, x714, uint64(p521Uint1(x737))) var x740 uint64 var x741 uint64 x740, x741 = bits.Add64(x715, x712, uint64(p521Uint1(x739))) var x742 uint64 var x743 uint64 x742, x743 = bits.Add64(x713, x710, uint64(p521Uint1(x741))) x744 := (uint64(p521Uint1(x743)) + x711) var x746 uint64 _, x746 = bits.Add64(x690, x726, uint64(0x0)) var x747 uint64 var x748 uint64 x747, x748 = bits.Add64(x692, x728, uint64(p521Uint1(x746))) var x749 uint64 var x750 uint64 x749, x750 = bits.Add64(x694, x730, uint64(p521Uint1(x748))) var x751 uint64 var x752 uint64 x751, x752 = bits.Add64(x696, x732, uint64(p521Uint1(x750))) var x753 uint64 var x754 uint64 x753, x754 = bits.Add64(x698, x734, uint64(p521Uint1(x752))) var x755 uint64 var x756 uint64 x755, x756 = bits.Add64(x700, x736, uint64(p521Uint1(x754))) var x757 uint64 var x758 uint64 x757, x758 = bits.Add64(x702, x738, uint64(p521Uint1(x756))) var x759 uint64 var x760 uint64 x759, x760 = bits.Add64(x704, x740, uint64(p521Uint1(x758))) var x761 uint64 var x762 uint64 x761, x762 = bits.Add64(x706, x742, uint64(p521Uint1(x760))) var x763 uint64 var x764 uint64 x763, x764 = bits.Add64(x708, x744, uint64(p521Uint1(x762))) x765 := (uint64(p521Uint1(x764)) + uint64(p521Uint1(x709))) var x766 uint64 var x767 uint64 x767, x766 = bits.Mul64(x7, arg2[8]) var x768 uint64 var x769 uint64 x769, x768 = bits.Mul64(x7, arg2[7]) var x770 uint64 var x771 uint64 x771, x770 = bits.Mul64(x7, arg2[6]) var x772 uint64 var x773 uint64 x773, x772 = bits.Mul64(x7, arg2[5]) var x774 uint64 var x775 uint64 x775, x774 = bits.Mul64(x7, arg2[4]) var x776 uint64 var x777 uint64 x777, x776 = bits.Mul64(x7, arg2[3]) var x778 uint64 var x779 uint64 x779, x778 = bits.Mul64(x7, arg2[2]) var x780 uint64 var x781 uint64 x781, x780 = bits.Mul64(x7, arg2[1]) var x782 uint64 var x783 uint64 x783, x782 = bits.Mul64(x7, arg2[0]) var x784 uint64 var x785 uint64 x784, x785 = bits.Add64(x783, x780, uint64(0x0)) var x786 uint64 var x787 uint64 x786, x787 = bits.Add64(x781, x778, uint64(p521Uint1(x785))) var x788 uint64 var x789 uint64 x788, x789 = bits.Add64(x779, x776, uint64(p521Uint1(x787))) var x790 uint64 var x791 uint64 x790, x791 = bits.Add64(x777, x774, uint64(p521Uint1(x789))) var x792 uint64 var x793 uint64 x792, x793 = bits.Add64(x775, x772, uint64(p521Uint1(x791))) var x794 uint64 var x795 uint64 x794, x795 = bits.Add64(x773, x770, uint64(p521Uint1(x793))) var x796 uint64 var x797 uint64 x796, x797 = bits.Add64(x771, x768, uint64(p521Uint1(x795))) var x798 uint64 var x799 uint64 x798, x799 = bits.Add64(x769, x766, uint64(p521Uint1(x797))) x800 := (uint64(p521Uint1(x799)) + x767) var x801 uint64 var x802 uint64 x801, x802 = bits.Add64(x747, x782, uint64(0x0)) var x803 uint64 var x804 uint64 x803, x804 = bits.Add64(x749, x784, uint64(p521Uint1(x802))) var x805 uint64 var x806 uint64 x805, x806 = bits.Add64(x751, x786, uint64(p521Uint1(x804))) var x807 uint64 var x808 uint64 x807, x808 = bits.Add64(x753, x788, uint64(p521Uint1(x806))) var x809 uint64 var x810 uint64 x809, x810 = bits.Add64(x755, x790, uint64(p521Uint1(x808))) var x811 uint64 var x812 uint64 x811, x812 = bits.Add64(x757, x792, uint64(p521Uint1(x810))) var x813 uint64 var x814 uint64 x813, x814 = bits.Add64(x759, x794, uint64(p521Uint1(x812))) var x815 uint64 var x816 uint64 x815, x816 = bits.Add64(x761, x796, uint64(p521Uint1(x814))) var x817 uint64 var x818 uint64 x817, x818 = bits.Add64(x763, x798, uint64(p521Uint1(x816))) var x819 uint64 var x820 uint64 x819, x820 = bits.Add64(x765, x800, uint64(p521Uint1(x818))) var x821 uint64 var x822 uint64 x822, x821 = bits.Mul64(x801, 0x1ff) var x823 uint64 var x824 uint64 x824, x823 = bits.Mul64(x801, 0xffffffffffffffff) var x825 uint64 var x826 uint64 x826, x825 = bits.Mul64(x801, 0xffffffffffffffff) var x827 uint64 var x828 uint64 x828, x827 = bits.Mul64(x801, 0xffffffffffffffff) var x829 uint64 var x830 uint64 x830, x829 = bits.Mul64(x801, 0xffffffffffffffff) var x831 uint64 var x832 uint64 x832, x831 = bits.Mul64(x801, 0xffffffffffffffff) var x833 uint64 var x834 uint64 x834, x833 = bits.Mul64(x801, 0xffffffffffffffff) var x835 uint64 var x836 uint64 x836, x835 = bits.Mul64(x801, 0xffffffffffffffff) var x837 uint64 var x838 uint64 x838, x837 = bits.Mul64(x801, 0xffffffffffffffff) var x839 uint64 var x840 uint64 x839, x840 = bits.Add64(x838, x835, uint64(0x0)) var x841 uint64 var x842 uint64 x841, x842 = bits.Add64(x836, x833, uint64(p521Uint1(x840))) var x843 uint64 var x844 uint64 x843, x844 = bits.Add64(x834, x831, uint64(p521Uint1(x842))) var x845 uint64 var x846 uint64 x845, x846 = bits.Add64(x832, x829, uint64(p521Uint1(x844))) var x847 uint64 var x848 uint64 x847, x848 = bits.Add64(x830, x827, uint64(p521Uint1(x846))) var x849 uint64 var x850 uint64 x849, x850 = bits.Add64(x828, x825, uint64(p521Uint1(x848))) var x851 uint64 var x852 uint64 x851, x852 = bits.Add64(x826, x823, uint64(p521Uint1(x850))) var x853 uint64 var x854 uint64 x853, x854 = bits.Add64(x824, x821, uint64(p521Uint1(x852))) x855 := (uint64(p521Uint1(x854)) + x822) var x857 uint64 _, x857 = bits.Add64(x801, x837, uint64(0x0)) var x858 uint64 var x859 uint64 x858, x859 = bits.Add64(x803, x839, uint64(p521Uint1(x857))) var x860 uint64 var x861 uint64 x860, x861 = bits.Add64(x805, x841, uint64(p521Uint1(x859))) var x862 uint64 var x863 uint64 x862, x863 = bits.Add64(x807, x843, uint64(p521Uint1(x861))) var x864 uint64 var x865 uint64 x864, x865 = bits.Add64(x809, x845, uint64(p521Uint1(x863))) var x866 uint64 var x867 uint64 x866, x867 = bits.Add64(x811, x847, uint64(p521Uint1(x865))) var x868 uint64 var x869 uint64 x868, x869 = bits.Add64(x813, x849, uint64(p521Uint1(x867))) var x870 uint64 var x871 uint64 x870, x871 = bits.Add64(x815, x851, uint64(p521Uint1(x869))) var x872 uint64 var x873 uint64 x872, x873 = bits.Add64(x817, x853, uint64(p521Uint1(x871))) var x874 uint64 var x875 uint64 x874, x875 = bits.Add64(x819, x855, uint64(p521Uint1(x873))) x876 := (uint64(p521Uint1(x875)) + uint64(p521Uint1(x820))) var x877 uint64 var x878 uint64 x878, x877 = bits.Mul64(x8, arg2[8]) var x879 uint64 var x880 uint64 x880, x879 = bits.Mul64(x8, arg2[7]) var x881 uint64 var x882 uint64 x882, x881 = bits.Mul64(x8, arg2[6]) var x883 uint64 var x884 uint64 x884, x883 = bits.Mul64(x8, arg2[5]) var x885 uint64 var x886 uint64 x886, x885 = bits.Mul64(x8, arg2[4]) var x887 uint64 var x888 uint64 x888, x887 = bits.Mul64(x8, arg2[3]) var x889 uint64 var x890 uint64 x890, x889 = bits.Mul64(x8, arg2[2]) var x891 uint64 var x892 uint64 x892, x891 = bits.Mul64(x8, arg2[1]) var x893 uint64 var x894 uint64 x894, x893 = bits.Mul64(x8, arg2[0]) var x895 uint64 var x896 uint64 x895, x896 = bits.Add64(x894, x891, uint64(0x0)) var x897 uint64 var x898 uint64 x897, x898 = bits.Add64(x892, x889, uint64(p521Uint1(x896))) var x899 uint64 var x900 uint64 x899, x900 = bits.Add64(x890, x887, uint64(p521Uint1(x898))) var x901 uint64 var x902 uint64 x901, x902 = bits.Add64(x888, x885, uint64(p521Uint1(x900))) var x903 uint64 var x904 uint64 x903, x904 = bits.Add64(x886, x883, uint64(p521Uint1(x902))) var x905 uint64 var x906 uint64 x905, x906 = bits.Add64(x884, x881, uint64(p521Uint1(x904))) var x907 uint64 var x908 uint64 x907, x908 = bits.Add64(x882, x879, uint64(p521Uint1(x906))) var x909 uint64 var x910 uint64 x909, x910 = bits.Add64(x880, x877, uint64(p521Uint1(x908))) x911 := (uint64(p521Uint1(x910)) + x878) var x912 uint64 var x913 uint64 x912, x913 = bits.Add64(x858, x893, uint64(0x0)) var x914 uint64 var x915 uint64 x914, x915 = bits.Add64(x860, x895, uint64(p521Uint1(x913))) var x916 uint64 var x917 uint64 x916, x917 = bits.Add64(x862, x897, uint64(p521Uint1(x915))) var x918 uint64 var x919 uint64 x918, x919 = bits.Add64(x864, x899, uint64(p521Uint1(x917))) var x920 uint64 var x921 uint64 x920, x921 = bits.Add64(x866, x901, uint64(p521Uint1(x919))) var x922 uint64 var x923 uint64 x922, x923 = bits.Add64(x868, x903, uint64(p521Uint1(x921))) var x924 uint64 var x925 uint64 x924, x925 = bits.Add64(x870, x905, uint64(p521Uint1(x923))) var x926 uint64 var x927 uint64 x926, x927 = bits.Add64(x872, x907, uint64(p521Uint1(x925))) var x928 uint64 var x929 uint64 x928, x929 = bits.Add64(x874, x909, uint64(p521Uint1(x927))) var x930 uint64 var x931 uint64 x930, x931 = bits.Add64(x876, x911, uint64(p521Uint1(x929))) var x932 uint64 var x933 uint64 x933, x932 = bits.Mul64(x912, 0x1ff) var x934 uint64 var x935 uint64 x935, x934 = bits.Mul64(x912, 0xffffffffffffffff) var x936 uint64 var x937 uint64 x937, x936 = bits.Mul64(x912, 0xffffffffffffffff) var x938 uint64 var x939 uint64 x939, x938 = bits.Mul64(x912, 0xffffffffffffffff) var x940 uint64 var x941 uint64 x941, x940 = bits.Mul64(x912, 0xffffffffffffffff) var x942 uint64 var x943 uint64 x943, x942 = bits.Mul64(x912, 0xffffffffffffffff) var x944 uint64 var x945 uint64 x945, x944 = bits.Mul64(x912, 0xffffffffffffffff) var x946 uint64 var x947 uint64 x947, x946 = bits.Mul64(x912, 0xffffffffffffffff) var x948 uint64 var x949 uint64 x949, x948 = bits.Mul64(x912, 0xffffffffffffffff) var x950 uint64 var x951 uint64 x950, x951 = bits.Add64(x949, x946, uint64(0x0)) var x952 uint64 var x953 uint64 x952, x953 = bits.Add64(x947, x944, uint64(p521Uint1(x951))) var x954 uint64 var x955 uint64 x954, x955 = bits.Add64(x945, x942, uint64(p521Uint1(x953))) var x956 uint64 var x957 uint64 x956, x957 = bits.Add64(x943, x940, uint64(p521Uint1(x955))) var x958 uint64 var x959 uint64 x958, x959 = bits.Add64(x941, x938, uint64(p521Uint1(x957))) var x960 uint64 var x961 uint64 x960, x961 = bits.Add64(x939, x936, uint64(p521Uint1(x959))) var x962 uint64 var x963 uint64 x962, x963 = bits.Add64(x937, x934, uint64(p521Uint1(x961))) var x964 uint64 var x965 uint64 x964, x965 = bits.Add64(x935, x932, uint64(p521Uint1(x963))) x966 := (uint64(p521Uint1(x965)) + x933) var x968 uint64 _, x968 = bits.Add64(x912, x948, uint64(0x0)) var x969 uint64 var x970 uint64 x969, x970 = bits.Add64(x914, x950, uint64(p521Uint1(x968))) var x971 uint64 var x972 uint64 x971, x972 = bits.Add64(x916, x952, uint64(p521Uint1(x970))) var x973 uint64 var x974 uint64 x973, x974 = bits.Add64(x918, x954, uint64(p521Uint1(x972))) var x975 uint64 var x976 uint64 x975, x976 = bits.Add64(x920, x956, uint64(p521Uint1(x974))) var x977 uint64 var x978 uint64 x977, x978 = bits.Add64(x922, x958, uint64(p521Uint1(x976))) var x979 uint64 var x980 uint64 x979, x980 = bits.Add64(x924, x960, uint64(p521Uint1(x978))) var x981 uint64 var x982 uint64 x981, x982 = bits.Add64(x926, x962, uint64(p521Uint1(x980))) var x983 uint64 var x984 uint64 x983, x984 = bits.Add64(x928, x964, uint64(p521Uint1(x982))) var x985 uint64 var x986 uint64 x985, x986 = bits.Add64(x930, x966, uint64(p521Uint1(x984))) x987 := (uint64(p521Uint1(x986)) + uint64(p521Uint1(x931))) var x988 uint64 var x989 uint64 x988, x989 = bits.Sub64(x969, 0xffffffffffffffff, uint64(0x0)) var x990 uint64 var x991 uint64 x990, x991 = bits.Sub64(x971, 0xffffffffffffffff, uint64(p521Uint1(x989))) var x992 uint64 var x993 uint64 x992, x993 = bits.Sub64(x973, 0xffffffffffffffff, uint64(p521Uint1(x991))) var x994 uint64 var x995 uint64 x994, x995 = bits.Sub64(x975, 0xffffffffffffffff, uint64(p521Uint1(x993))) var x996 uint64 var x997 uint64 x996, x997 = bits.Sub64(x977, 0xffffffffffffffff, uint64(p521Uint1(x995))) var x998 uint64 var x999 uint64 x998, x999 = bits.Sub64(x979, 0xffffffffffffffff, uint64(p521Uint1(x997))) var x1000 uint64 var x1001 uint64 x1000, x1001 = bits.Sub64(x981, 0xffffffffffffffff, uint64(p521Uint1(x999))) var x1002 uint64 var x1003 uint64 x1002, x1003 = bits.Sub64(x983, 0xffffffffffffffff, uint64(p521Uint1(x1001))) var x1004 uint64 var x1005 uint64 x1004, x1005 = bits.Sub64(x985, 0x1ff, uint64(p521Uint1(x1003))) var x1007 uint64 _, x1007 = bits.Sub64(x987, uint64(0x0), uint64(p521Uint1(x1005))) var x1008 uint64 p521CmovznzU64(&x1008, p521Uint1(x1007), x988, x969) var x1009 uint64 p521CmovznzU64(&x1009, p521Uint1(x1007), x990, x971) var x1010 uint64 p521CmovznzU64(&x1010, p521Uint1(x1007), x992, x973) var x1011 uint64 p521CmovznzU64(&x1011, p521Uint1(x1007), x994, x975) var x1012 uint64 p521CmovznzU64(&x1012, p521Uint1(x1007), x996, x977) var x1013 uint64 p521CmovznzU64(&x1013, p521Uint1(x1007), x998, x979) var x1014 uint64 p521CmovznzU64(&x1014, p521Uint1(x1007), x1000, x981) var x1015 uint64 p521CmovznzU64(&x1015, p521Uint1(x1007), x1002, x983) var x1016 uint64 p521CmovznzU64(&x1016, p521Uint1(x1007), x1004, x985) out1[0] = x1008 out1[1] = x1009 out1[2] = x1010 out1[3] = x1011 out1[4] = x1012 out1[5] = x1013 out1[6] = x1014 out1[7] = x1015 out1[8] = x1016 } // p521Square squares a field element in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m // 0 ≤ eval out1 < m func p521Square(out1 *p521MontgomeryDomainFieldElement, arg1 *p521MontgomeryDomainFieldElement) { x1 := arg1[1] x2 := arg1[2] x3 := arg1[3] x4 := arg1[4] x5 := arg1[5] x6 := arg1[6] x7 := arg1[7] x8 := arg1[8] x9 := arg1[0] var x10 uint64 var x11 uint64 x11, x10 = bits.Mul64(x9, arg1[8]) var x12 uint64 var x13 uint64 x13, x12 = bits.Mul64(x9, arg1[7]) var x14 uint64 var x15 uint64 x15, x14 = bits.Mul64(x9, arg1[6]) var x16 uint64 var x17 uint64 x17, x16 = bits.Mul64(x9, arg1[5]) var x18 uint64 var x19 uint64 x19, x18 = bits.Mul64(x9, arg1[4]) var x20 uint64 var x21 uint64 x21, x20 = bits.Mul64(x9, arg1[3]) var x22 uint64 var x23 uint64 x23, x22 = bits.Mul64(x9, arg1[2]) var x24 uint64 var x25 uint64 x25, x24 = bits.Mul64(x9, arg1[1]) var x26 uint64 var x27 uint64 x27, x26 = bits.Mul64(x9, arg1[0]) var x28 uint64 var x29 uint64 x28, x29 = bits.Add64(x27, x24, uint64(0x0)) var x30 uint64 var x31 uint64 x30, x31 = bits.Add64(x25, x22, uint64(p521Uint1(x29))) var x32 uint64 var x33 uint64 x32, x33 = bits.Add64(x23, x20, uint64(p521Uint1(x31))) var x34 uint64 var x35 uint64 x34, x35 = bits.Add64(x21, x18, uint64(p521Uint1(x33))) var x36 uint64 var x37 uint64 x36, x37 = bits.Add64(x19, x16, uint64(p521Uint1(x35))) var x38 uint64 var x39 uint64 x38, x39 = bits.Add64(x17, x14, uint64(p521Uint1(x37))) var x40 uint64 var x41 uint64 x40, x41 = bits.Add64(x15, x12, uint64(p521Uint1(x39))) var x42 uint64 var x43 uint64 x42, x43 = bits.Add64(x13, x10, uint64(p521Uint1(x41))) x44 := (uint64(p521Uint1(x43)) + x11) var x45 uint64 var x46 uint64 x46, x45 = bits.Mul64(x26, 0x1ff) var x47 uint64 var x48 uint64 x48, x47 = bits.Mul64(x26, 0xffffffffffffffff) var x49 uint64 var x50 uint64 x50, x49 = bits.Mul64(x26, 0xffffffffffffffff) var x51 uint64 var x52 uint64 x52, x51 = bits.Mul64(x26, 0xffffffffffffffff) var x53 uint64 var x54 uint64 x54, x53 = bits.Mul64(x26, 0xffffffffffffffff) var x55 uint64 var x56 uint64 x56, x55 = bits.Mul64(x26, 0xffffffffffffffff) var x57 uint64 var x58 uint64 x58, x57 = bits.Mul64(x26, 0xffffffffffffffff) var x59 uint64 var x60 uint64 x60, x59 = bits.Mul64(x26, 0xffffffffffffffff) var x61 uint64 var x62 uint64 x62, x61 = bits.Mul64(x26, 0xffffffffffffffff) var x63 uint64 var x64 uint64 x63, x64 = bits.Add64(x62, x59, uint64(0x0)) var x65 uint64 var x66 uint64 x65, x66 = bits.Add64(x60, x57, uint64(p521Uint1(x64))) var x67 uint64 var x68 uint64 x67, x68 = bits.Add64(x58, x55, uint64(p521Uint1(x66))) var x69 uint64 var x70 uint64 x69, x70 = bits.Add64(x56, x53, uint64(p521Uint1(x68))) var x71 uint64 var x72 uint64 x71, x72 = bits.Add64(x54, x51, uint64(p521Uint1(x70))) var x73 uint64 var x74 uint64 x73, x74 = bits.Add64(x52, x49, uint64(p521Uint1(x72))) var x75 uint64 var x76 uint64 x75, x76 = bits.Add64(x50, x47, uint64(p521Uint1(x74))) var x77 uint64 var x78 uint64 x77, x78 = bits.Add64(x48, x45, uint64(p521Uint1(x76))) x79 := (uint64(p521Uint1(x78)) + x46) var x81 uint64 _, x81 = bits.Add64(x26, x61, uint64(0x0)) var x82 uint64 var x83 uint64 x82, x83 = bits.Add64(x28, x63, uint64(p521Uint1(x81))) var x84 uint64 var x85 uint64 x84, x85 = bits.Add64(x30, x65, uint64(p521Uint1(x83))) var x86 uint64 var x87 uint64 x86, x87 = bits.Add64(x32, x67, uint64(p521Uint1(x85))) var x88 uint64 var x89 uint64 x88, x89 = bits.Add64(x34, x69, uint64(p521Uint1(x87))) var x90 uint64 var x91 uint64 x90, x91 = bits.Add64(x36, x71, uint64(p521Uint1(x89))) var x92 uint64 var x93 uint64 x92, x93 = bits.Add64(x38, x73, uint64(p521Uint1(x91))) var x94 uint64 var x95 uint64 x94, x95 = bits.Add64(x40, x75, uint64(p521Uint1(x93))) var x96 uint64 var x97 uint64 x96, x97 = bits.Add64(x42, x77, uint64(p521Uint1(x95))) var x98 uint64 var x99 uint64 x98, x99 = bits.Add64(x44, x79, uint64(p521Uint1(x97))) var x100 uint64 var x101 uint64 x101, x100 = bits.Mul64(x1, arg1[8]) var x102 uint64 var x103 uint64 x103, x102 = bits.Mul64(x1, arg1[7]) var x104 uint64 var x105 uint64 x105, x104 = bits.Mul64(x1, arg1[6]) var x106 uint64 var x107 uint64 x107, x106 = bits.Mul64(x1, arg1[5]) var x108 uint64 var x109 uint64 x109, x108 = bits.Mul64(x1, arg1[4]) var x110 uint64 var x111 uint64 x111, x110 = bits.Mul64(x1, arg1[3]) var x112 uint64 var x113 uint64 x113, x112 = bits.Mul64(x1, arg1[2]) var x114 uint64 var x115 uint64 x115, x114 = bits.Mul64(x1, arg1[1]) var x116 uint64 var x117 uint64 x117, x116 = bits.Mul64(x1, arg1[0]) var x118 uint64 var x119 uint64 x118, x119 = bits.Add64(x117, x114, uint64(0x0)) var x120 uint64 var x121 uint64 x120, x121 = bits.Add64(x115, x112, uint64(p521Uint1(x119))) var x122 uint64 var x123 uint64 x122, x123 = bits.Add64(x113, x110, uint64(p521Uint1(x121))) var x124 uint64 var x125 uint64 x124, x125 = bits.Add64(x111, x108, uint64(p521Uint1(x123))) var x126 uint64 var x127 uint64 x126, x127 = bits.Add64(x109, x106, uint64(p521Uint1(x125))) var x128 uint64 var x129 uint64 x128, x129 = bits.Add64(x107, x104, uint64(p521Uint1(x127))) var x130 uint64 var x131 uint64 x130, x131 = bits.Add64(x105, x102, uint64(p521Uint1(x129))) var x132 uint64 var x133 uint64 x132, x133 = bits.Add64(x103, x100, uint64(p521Uint1(x131))) x134 := (uint64(p521Uint1(x133)) + x101) var x135 uint64 var x136 uint64 x135, x136 = bits.Add64(x82, x116, uint64(0x0)) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x84, x118, uint64(p521Uint1(x136))) var x139 uint64 var x140 uint64 x139, x140 = bits.Add64(x86, x120, uint64(p521Uint1(x138))) var x141 uint64 var x142 uint64 x141, x142 = bits.Add64(x88, x122, uint64(p521Uint1(x140))) var x143 uint64 var x144 uint64 x143, x144 = bits.Add64(x90, x124, uint64(p521Uint1(x142))) var x145 uint64 var x146 uint64 x145, x146 = bits.Add64(x92, x126, uint64(p521Uint1(x144))) var x147 uint64 var x148 uint64 x147, x148 = bits.Add64(x94, x128, uint64(p521Uint1(x146))) var x149 uint64 var x150 uint64 x149, x150 = bits.Add64(x96, x130, uint64(p521Uint1(x148))) var x151 uint64 var x152 uint64 x151, x152 = bits.Add64(x98, x132, uint64(p521Uint1(x150))) var x153 uint64 var x154 uint64 x153, x154 = bits.Add64(uint64(p521Uint1(x99)), x134, uint64(p521Uint1(x152))) var x155 uint64 var x156 uint64 x156, x155 = bits.Mul64(x135, 0x1ff) var x157 uint64 var x158 uint64 x158, x157 = bits.Mul64(x135, 0xffffffffffffffff) var x159 uint64 var x160 uint64 x160, x159 = bits.Mul64(x135, 0xffffffffffffffff) var x161 uint64 var x162 uint64 x162, x161 = bits.Mul64(x135, 0xffffffffffffffff) var x163 uint64 var x164 uint64 x164, x163 = bits.Mul64(x135, 0xffffffffffffffff) var x165 uint64 var x166 uint64 x166, x165 = bits.Mul64(x135, 0xffffffffffffffff) var x167 uint64 var x168 uint64 x168, x167 = bits.Mul64(x135, 0xffffffffffffffff) var x169 uint64 var x170 uint64 x170, x169 = bits.Mul64(x135, 0xffffffffffffffff) var x171 uint64 var x172 uint64 x172, x171 = bits.Mul64(x135, 0xffffffffffffffff) var x173 uint64 var x174 uint64 x173, x174 = bits.Add64(x172, x169, uint64(0x0)) var x175 uint64 var x176 uint64 x175, x176 = bits.Add64(x170, x167, uint64(p521Uint1(x174))) var x177 uint64 var x178 uint64 x177, x178 = bits.Add64(x168, x165, uint64(p521Uint1(x176))) var x179 uint64 var x180 uint64 x179, x180 = bits.Add64(x166, x163, uint64(p521Uint1(x178))) var x181 uint64 var x182 uint64 x181, x182 = bits.Add64(x164, x161, uint64(p521Uint1(x180))) var x183 uint64 var x184 uint64 x183, x184 = bits.Add64(x162, x159, uint64(p521Uint1(x182))) var x185 uint64 var x186 uint64 x185, x186 = bits.Add64(x160, x157, uint64(p521Uint1(x184))) var x187 uint64 var x188 uint64 x187, x188 = bits.Add64(x158, x155, uint64(p521Uint1(x186))) x189 := (uint64(p521Uint1(x188)) + x156) var x191 uint64 _, x191 = bits.Add64(x135, x171, uint64(0x0)) var x192 uint64 var x193 uint64 x192, x193 = bits.Add64(x137, x173, uint64(p521Uint1(x191))) var x194 uint64 var x195 uint64 x194, x195 = bits.Add64(x139, x175, uint64(p521Uint1(x193))) var x196 uint64 var x197 uint64 x196, x197 = bits.Add64(x141, x177, uint64(p521Uint1(x195))) var x198 uint64 var x199 uint64 x198, x199 = bits.Add64(x143, x179, uint64(p521Uint1(x197))) var x200 uint64 var x201 uint64 x200, x201 = bits.Add64(x145, x181, uint64(p521Uint1(x199))) var x202 uint64 var x203 uint64 x202, x203 = bits.Add64(x147, x183, uint64(p521Uint1(x201))) var x204 uint64 var x205 uint64 x204, x205 = bits.Add64(x149, x185, uint64(p521Uint1(x203))) var x206 uint64 var x207 uint64 x206, x207 = bits.Add64(x151, x187, uint64(p521Uint1(x205))) var x208 uint64 var x209 uint64 x208, x209 = bits.Add64(x153, x189, uint64(p521Uint1(x207))) x210 := (uint64(p521Uint1(x209)) + uint64(p521Uint1(x154))) var x211 uint64 var x212 uint64 x212, x211 = bits.Mul64(x2, arg1[8]) var x213 uint64 var x214 uint64 x214, x213 = bits.Mul64(x2, arg1[7]) var x215 uint64 var x216 uint64 x216, x215 = bits.Mul64(x2, arg1[6]) var x217 uint64 var x218 uint64 x218, x217 = bits.Mul64(x2, arg1[5]) var x219 uint64 var x220 uint64 x220, x219 = bits.Mul64(x2, arg1[4]) var x221 uint64 var x222 uint64 x222, x221 = bits.Mul64(x2, arg1[3]) var x223 uint64 var x224 uint64 x224, x223 = bits.Mul64(x2, arg1[2]) var x225 uint64 var x226 uint64 x226, x225 = bits.Mul64(x2, arg1[1]) var x227 uint64 var x228 uint64 x228, x227 = bits.Mul64(x2, arg1[0]) var x229 uint64 var x230 uint64 x229, x230 = bits.Add64(x228, x225, uint64(0x0)) var x231 uint64 var x232 uint64 x231, x232 = bits.Add64(x226, x223, uint64(p521Uint1(x230))) var x233 uint64 var x234 uint64 x233, x234 = bits.Add64(x224, x221, uint64(p521Uint1(x232))) var x235 uint64 var x236 uint64 x235, x236 = bits.Add64(x222, x219, uint64(p521Uint1(x234))) var x237 uint64 var x238 uint64 x237, x238 = bits.Add64(x220, x217, uint64(p521Uint1(x236))) var x239 uint64 var x240 uint64 x239, x240 = bits.Add64(x218, x215, uint64(p521Uint1(x238))) var x241 uint64 var x242 uint64 x241, x242 = bits.Add64(x216, x213, uint64(p521Uint1(x240))) var x243 uint64 var x244 uint64 x243, x244 = bits.Add64(x214, x211, uint64(p521Uint1(x242))) x245 := (uint64(p521Uint1(x244)) + x212) var x246 uint64 var x247 uint64 x246, x247 = bits.Add64(x192, x227, uint64(0x0)) var x248 uint64 var x249 uint64 x248, x249 = bits.Add64(x194, x229, uint64(p521Uint1(x247))) var x250 uint64 var x251 uint64 x250, x251 = bits.Add64(x196, x231, uint64(p521Uint1(x249))) var x252 uint64 var x253 uint64 x252, x253 = bits.Add64(x198, x233, uint64(p521Uint1(x251))) var x254 uint64 var x255 uint64 x254, x255 = bits.Add64(x200, x235, uint64(p521Uint1(x253))) var x256 uint64 var x257 uint64 x256, x257 = bits.Add64(x202, x237, uint64(p521Uint1(x255))) var x258 uint64 var x259 uint64 x258, x259 = bits.Add64(x204, x239, uint64(p521Uint1(x257))) var x260 uint64 var x261 uint64 x260, x261 = bits.Add64(x206, x241, uint64(p521Uint1(x259))) var x262 uint64 var x263 uint64 x262, x263 = bits.Add64(x208, x243, uint64(p521Uint1(x261))) var x264 uint64 var x265 uint64 x264, x265 = bits.Add64(x210, x245, uint64(p521Uint1(x263))) var x266 uint64 var x267 uint64 x267, x266 = bits.Mul64(x246, 0x1ff) var x268 uint64 var x269 uint64 x269, x268 = bits.Mul64(x246, 0xffffffffffffffff) var x270 uint64 var x271 uint64 x271, x270 = bits.Mul64(x246, 0xffffffffffffffff) var x272 uint64 var x273 uint64 x273, x272 = bits.Mul64(x246, 0xffffffffffffffff) var x274 uint64 var x275 uint64 x275, x274 = bits.Mul64(x246, 0xffffffffffffffff) var x276 uint64 var x277 uint64 x277, x276 = bits.Mul64(x246, 0xffffffffffffffff) var x278 uint64 var x279 uint64 x279, x278 = bits.Mul64(x246, 0xffffffffffffffff) var x280 uint64 var x281 uint64 x281, x280 = bits.Mul64(x246, 0xffffffffffffffff) var x282 uint64 var x283 uint64 x283, x282 = bits.Mul64(x246, 0xffffffffffffffff) var x284 uint64 var x285 uint64 x284, x285 = bits.Add64(x283, x280, uint64(0x0)) var x286 uint64 var x287 uint64 x286, x287 = bits.Add64(x281, x278, uint64(p521Uint1(x285))) var x288 uint64 var x289 uint64 x288, x289 = bits.Add64(x279, x276, uint64(p521Uint1(x287))) var x290 uint64 var x291 uint64 x290, x291 = bits.Add64(x277, x274, uint64(p521Uint1(x289))) var x292 uint64 var x293 uint64 x292, x293 = bits.Add64(x275, x272, uint64(p521Uint1(x291))) var x294 uint64 var x295 uint64 x294, x295 = bits.Add64(x273, x270, uint64(p521Uint1(x293))) var x296 uint64 var x297 uint64 x296, x297 = bits.Add64(x271, x268, uint64(p521Uint1(x295))) var x298 uint64 var x299 uint64 x298, x299 = bits.Add64(x269, x266, uint64(p521Uint1(x297))) x300 := (uint64(p521Uint1(x299)) + x267) var x302 uint64 _, x302 = bits.Add64(x246, x282, uint64(0x0)) var x303 uint64 var x304 uint64 x303, x304 = bits.Add64(x248, x284, uint64(p521Uint1(x302))) var x305 uint64 var x306 uint64 x305, x306 = bits.Add64(x250, x286, uint64(p521Uint1(x304))) var x307 uint64 var x308 uint64 x307, x308 = bits.Add64(x252, x288, uint64(p521Uint1(x306))) var x309 uint64 var x310 uint64 x309, x310 = bits.Add64(x254, x290, uint64(p521Uint1(x308))) var x311 uint64 var x312 uint64 x311, x312 = bits.Add64(x256, x292, uint64(p521Uint1(x310))) var x313 uint64 var x314 uint64 x313, x314 = bits.Add64(x258, x294, uint64(p521Uint1(x312))) var x315 uint64 var x316 uint64 x315, x316 = bits.Add64(x260, x296, uint64(p521Uint1(x314))) var x317 uint64 var x318 uint64 x317, x318 = bits.Add64(x262, x298, uint64(p521Uint1(x316))) var x319 uint64 var x320 uint64 x319, x320 = bits.Add64(x264, x300, uint64(p521Uint1(x318))) x321 := (uint64(p521Uint1(x320)) + uint64(p521Uint1(x265))) var x322 uint64 var x323 uint64 x323, x322 = bits.Mul64(x3, arg1[8]) var x324 uint64 var x325 uint64 x325, x324 = bits.Mul64(x3, arg1[7]) var x326 uint64 var x327 uint64 x327, x326 = bits.Mul64(x3, arg1[6]) var x328 uint64 var x329 uint64 x329, x328 = bits.Mul64(x3, arg1[5]) var x330 uint64 var x331 uint64 x331, x330 = bits.Mul64(x3, arg1[4]) var x332 uint64 var x333 uint64 x333, x332 = bits.Mul64(x3, arg1[3]) var x334 uint64 var x335 uint64 x335, x334 = bits.Mul64(x3, arg1[2]) var x336 uint64 var x337 uint64 x337, x336 = bits.Mul64(x3, arg1[1]) var x338 uint64 var x339 uint64 x339, x338 = bits.Mul64(x3, arg1[0]) var x340 uint64 var x341 uint64 x340, x341 = bits.Add64(x339, x336, uint64(0x0)) var x342 uint64 var x343 uint64 x342, x343 = bits.Add64(x337, x334, uint64(p521Uint1(x341))) var x344 uint64 var x345 uint64 x344, x345 = bits.Add64(x335, x332, uint64(p521Uint1(x343))) var x346 uint64 var x347 uint64 x346, x347 = bits.Add64(x333, x330, uint64(p521Uint1(x345))) var x348 uint64 var x349 uint64 x348, x349 = bits.Add64(x331, x328, uint64(p521Uint1(x347))) var x350 uint64 var x351 uint64 x350, x351 = bits.Add64(x329, x326, uint64(p521Uint1(x349))) var x352 uint64 var x353 uint64 x352, x353 = bits.Add64(x327, x324, uint64(p521Uint1(x351))) var x354 uint64 var x355 uint64 x354, x355 = bits.Add64(x325, x322, uint64(p521Uint1(x353))) x356 := (uint64(p521Uint1(x355)) + x323) var x357 uint64 var x358 uint64 x357, x358 = bits.Add64(x303, x338, uint64(0x0)) var x359 uint64 var x360 uint64 x359, x360 = bits.Add64(x305, x340, uint64(p521Uint1(x358))) var x361 uint64 var x362 uint64 x361, x362 = bits.Add64(x307, x342, uint64(p521Uint1(x360))) var x363 uint64 var x364 uint64 x363, x364 = bits.Add64(x309, x344, uint64(p521Uint1(x362))) var x365 uint64 var x366 uint64 x365, x366 = bits.Add64(x311, x346, uint64(p521Uint1(x364))) var x367 uint64 var x368 uint64 x367, x368 = bits.Add64(x313, x348, uint64(p521Uint1(x366))) var x369 uint64 var x370 uint64 x369, x370 = bits.Add64(x315, x350, uint64(p521Uint1(x368))) var x371 uint64 var x372 uint64 x371, x372 = bits.Add64(x317, x352, uint64(p521Uint1(x370))) var x373 uint64 var x374 uint64 x373, x374 = bits.Add64(x319, x354, uint64(p521Uint1(x372))) var x375 uint64 var x376 uint64 x375, x376 = bits.Add64(x321, x356, uint64(p521Uint1(x374))) var x377 uint64 var x378 uint64 x378, x377 = bits.Mul64(x357, 0x1ff) var x379 uint64 var x380 uint64 x380, x379 = bits.Mul64(x357, 0xffffffffffffffff) var x381 uint64 var x382 uint64 x382, x381 = bits.Mul64(x357, 0xffffffffffffffff) var x383 uint64 var x384 uint64 x384, x383 = bits.Mul64(x357, 0xffffffffffffffff) var x385 uint64 var x386 uint64 x386, x385 = bits.Mul64(x357, 0xffffffffffffffff) var x387 uint64 var x388 uint64 x388, x387 = bits.Mul64(x357, 0xffffffffffffffff) var x389 uint64 var x390 uint64 x390, x389 = bits.Mul64(x357, 0xffffffffffffffff) var x391 uint64 var x392 uint64 x392, x391 = bits.Mul64(x357, 0xffffffffffffffff) var x393 uint64 var x394 uint64 x394, x393 = bits.Mul64(x357, 0xffffffffffffffff) var x395 uint64 var x396 uint64 x395, x396 = bits.Add64(x394, x391, uint64(0x0)) var x397 uint64 var x398 uint64 x397, x398 = bits.Add64(x392, x389, uint64(p521Uint1(x396))) var x399 uint64 var x400 uint64 x399, x400 = bits.Add64(x390, x387, uint64(p521Uint1(x398))) var x401 uint64 var x402 uint64 x401, x402 = bits.Add64(x388, x385, uint64(p521Uint1(x400))) var x403 uint64 var x404 uint64 x403, x404 = bits.Add64(x386, x383, uint64(p521Uint1(x402))) var x405 uint64 var x406 uint64 x405, x406 = bits.Add64(x384, x381, uint64(p521Uint1(x404))) var x407 uint64 var x408 uint64 x407, x408 = bits.Add64(x382, x379, uint64(p521Uint1(x406))) var x409 uint64 var x410 uint64 x409, x410 = bits.Add64(x380, x377, uint64(p521Uint1(x408))) x411 := (uint64(p521Uint1(x410)) + x378) var x413 uint64 _, x413 = bits.Add64(x357, x393, uint64(0x0)) var x414 uint64 var x415 uint64 x414, x415 = bits.Add64(x359, x395, uint64(p521Uint1(x413))) var x416 uint64 var x417 uint64 x416, x417 = bits.Add64(x361, x397, uint64(p521Uint1(x415))) var x418 uint64 var x419 uint64 x418, x419 = bits.Add64(x363, x399, uint64(p521Uint1(x417))) var x420 uint64 var x421 uint64 x420, x421 = bits.Add64(x365, x401, uint64(p521Uint1(x419))) var x422 uint64 var x423 uint64 x422, x423 = bits.Add64(x367, x403, uint64(p521Uint1(x421))) var x424 uint64 var x425 uint64 x424, x425 = bits.Add64(x369, x405, uint64(p521Uint1(x423))) var x426 uint64 var x427 uint64 x426, x427 = bits.Add64(x371, x407, uint64(p521Uint1(x425))) var x428 uint64 var x429 uint64 x428, x429 = bits.Add64(x373, x409, uint64(p521Uint1(x427))) var x430 uint64 var x431 uint64 x430, x431 = bits.Add64(x375, x411, uint64(p521Uint1(x429))) x432 := (uint64(p521Uint1(x431)) + uint64(p521Uint1(x376))) var x433 uint64 var x434 uint64 x434, x433 = bits.Mul64(x4, arg1[8]) var x435 uint64 var x436 uint64 x436, x435 = bits.Mul64(x4, arg1[7]) var x437 uint64 var x438 uint64 x438, x437 = bits.Mul64(x4, arg1[6]) var x439 uint64 var x440 uint64 x440, x439 = bits.Mul64(x4, arg1[5]) var x441 uint64 var x442 uint64 x442, x441 = bits.Mul64(x4, arg1[4]) var x443 uint64 var x444 uint64 x444, x443 = bits.Mul64(x4, arg1[3]) var x445 uint64 var x446 uint64 x446, x445 = bits.Mul64(x4, arg1[2]) var x447 uint64 var x448 uint64 x448, x447 = bits.Mul64(x4, arg1[1]) var x449 uint64 var x450 uint64 x450, x449 = bits.Mul64(x4, arg1[0]) var x451 uint64 var x452 uint64 x451, x452 = bits.Add64(x450, x447, uint64(0x0)) var x453 uint64 var x454 uint64 x453, x454 = bits.Add64(x448, x445, uint64(p521Uint1(x452))) var x455 uint64 var x456 uint64 x455, x456 = bits.Add64(x446, x443, uint64(p521Uint1(x454))) var x457 uint64 var x458 uint64 x457, x458 = bits.Add64(x444, x441, uint64(p521Uint1(x456))) var x459 uint64 var x460 uint64 x459, x460 = bits.Add64(x442, x439, uint64(p521Uint1(x458))) var x461 uint64 var x462 uint64 x461, x462 = bits.Add64(x440, x437, uint64(p521Uint1(x460))) var x463 uint64 var x464 uint64 x463, x464 = bits.Add64(x438, x435, uint64(p521Uint1(x462))) var x465 uint64 var x466 uint64 x465, x466 = bits.Add64(x436, x433, uint64(p521Uint1(x464))) x467 := (uint64(p521Uint1(x466)) + x434) var x468 uint64 var x469 uint64 x468, x469 = bits.Add64(x414, x449, uint64(0x0)) var x470 uint64 var x471 uint64 x470, x471 = bits.Add64(x416, x451, uint64(p521Uint1(x469))) var x472 uint64 var x473 uint64 x472, x473 = bits.Add64(x418, x453, uint64(p521Uint1(x471))) var x474 uint64 var x475 uint64 x474, x475 = bits.Add64(x420, x455, uint64(p521Uint1(x473))) var x476 uint64 var x477 uint64 x476, x477 = bits.Add64(x422, x457, uint64(p521Uint1(x475))) var x478 uint64 var x479 uint64 x478, x479 = bits.Add64(x424, x459, uint64(p521Uint1(x477))) var x480 uint64 var x481 uint64 x480, x481 = bits.Add64(x426, x461, uint64(p521Uint1(x479))) var x482 uint64 var x483 uint64 x482, x483 = bits.Add64(x428, x463, uint64(p521Uint1(x481))) var x484 uint64 var x485 uint64 x484, x485 = bits.Add64(x430, x465, uint64(p521Uint1(x483))) var x486 uint64 var x487 uint64 x486, x487 = bits.Add64(x432, x467, uint64(p521Uint1(x485))) var x488 uint64 var x489 uint64 x489, x488 = bits.Mul64(x468, 0x1ff) var x490 uint64 var x491 uint64 x491, x490 = bits.Mul64(x468, 0xffffffffffffffff) var x492 uint64 var x493 uint64 x493, x492 = bits.Mul64(x468, 0xffffffffffffffff) var x494 uint64 var x495 uint64 x495, x494 = bits.Mul64(x468, 0xffffffffffffffff) var x496 uint64 var x497 uint64 x497, x496 = bits.Mul64(x468, 0xffffffffffffffff) var x498 uint64 var x499 uint64 x499, x498 = bits.Mul64(x468, 0xffffffffffffffff) var x500 uint64 var x501 uint64 x501, x500 = bits.Mul64(x468, 0xffffffffffffffff) var x502 uint64 var x503 uint64 x503, x502 = bits.Mul64(x468, 0xffffffffffffffff) var x504 uint64 var x505 uint64 x505, x504 = bits.Mul64(x468, 0xffffffffffffffff) var x506 uint64 var x507 uint64 x506, x507 = bits.Add64(x505, x502, uint64(0x0)) var x508 uint64 var x509 uint64 x508, x509 = bits.Add64(x503, x500, uint64(p521Uint1(x507))) var x510 uint64 var x511 uint64 x510, x511 = bits.Add64(x501, x498, uint64(p521Uint1(x509))) var x512 uint64 var x513 uint64 x512, x513 = bits.Add64(x499, x496, uint64(p521Uint1(x511))) var x514 uint64 var x515 uint64 x514, x515 = bits.Add64(x497, x494, uint64(p521Uint1(x513))) var x516 uint64 var x517 uint64 x516, x517 = bits.Add64(x495, x492, uint64(p521Uint1(x515))) var x518 uint64 var x519 uint64 x518, x519 = bits.Add64(x493, x490, uint64(p521Uint1(x517))) var x520 uint64 var x521 uint64 x520, x521 = bits.Add64(x491, x488, uint64(p521Uint1(x519))) x522 := (uint64(p521Uint1(x521)) + x489) var x524 uint64 _, x524 = bits.Add64(x468, x504, uint64(0x0)) var x525 uint64 var x526 uint64 x525, x526 = bits.Add64(x470, x506, uint64(p521Uint1(x524))) var x527 uint64 var x528 uint64 x527, x528 = bits.Add64(x472, x508, uint64(p521Uint1(x526))) var x529 uint64 var x530 uint64 x529, x530 = bits.Add64(x474, x510, uint64(p521Uint1(x528))) var x531 uint64 var x532 uint64 x531, x532 = bits.Add64(x476, x512, uint64(p521Uint1(x530))) var x533 uint64 var x534 uint64 x533, x534 = bits.Add64(x478, x514, uint64(p521Uint1(x532))) var x535 uint64 var x536 uint64 x535, x536 = bits.Add64(x480, x516, uint64(p521Uint1(x534))) var x537 uint64 var x538 uint64 x537, x538 = bits.Add64(x482, x518, uint64(p521Uint1(x536))) var x539 uint64 var x540 uint64 x539, x540 = bits.Add64(x484, x520, uint64(p521Uint1(x538))) var x541 uint64 var x542 uint64 x541, x542 = bits.Add64(x486, x522, uint64(p521Uint1(x540))) x543 := (uint64(p521Uint1(x542)) + uint64(p521Uint1(x487))) var x544 uint64 var x545 uint64 x545, x544 = bits.Mul64(x5, arg1[8]) var x546 uint64 var x547 uint64 x547, x546 = bits.Mul64(x5, arg1[7]) var x548 uint64 var x549 uint64 x549, x548 = bits.Mul64(x5, arg1[6]) var x550 uint64 var x551 uint64 x551, x550 = bits.Mul64(x5, arg1[5]) var x552 uint64 var x553 uint64 x553, x552 = bits.Mul64(x5, arg1[4]) var x554 uint64 var x555 uint64 x555, x554 = bits.Mul64(x5, arg1[3]) var x556 uint64 var x557 uint64 x557, x556 = bits.Mul64(x5, arg1[2]) var x558 uint64 var x559 uint64 x559, x558 = bits.Mul64(x5, arg1[1]) var x560 uint64 var x561 uint64 x561, x560 = bits.Mul64(x5, arg1[0]) var x562 uint64 var x563 uint64 x562, x563 = bits.Add64(x561, x558, uint64(0x0)) var x564 uint64 var x565 uint64 x564, x565 = bits.Add64(x559, x556, uint64(p521Uint1(x563))) var x566 uint64 var x567 uint64 x566, x567 = bits.Add64(x557, x554, uint64(p521Uint1(x565))) var x568 uint64 var x569 uint64 x568, x569 = bits.Add64(x555, x552, uint64(p521Uint1(x567))) var x570 uint64 var x571 uint64 x570, x571 = bits.Add64(x553, x550, uint64(p521Uint1(x569))) var x572 uint64 var x573 uint64 x572, x573 = bits.Add64(x551, x548, uint64(p521Uint1(x571))) var x574 uint64 var x575 uint64 x574, x575 = bits.Add64(x549, x546, uint64(p521Uint1(x573))) var x576 uint64 var x577 uint64 x576, x577 = bits.Add64(x547, x544, uint64(p521Uint1(x575))) x578 := (uint64(p521Uint1(x577)) + x545) var x579 uint64 var x580 uint64 x579, x580 = bits.Add64(x525, x560, uint64(0x0)) var x581 uint64 var x582 uint64 x581, x582 = bits.Add64(x527, x562, uint64(p521Uint1(x580))) var x583 uint64 var x584 uint64 x583, x584 = bits.Add64(x529, x564, uint64(p521Uint1(x582))) var x585 uint64 var x586 uint64 x585, x586 = bits.Add64(x531, x566, uint64(p521Uint1(x584))) var x587 uint64 var x588 uint64 x587, x588 = bits.Add64(x533, x568, uint64(p521Uint1(x586))) var x589 uint64 var x590 uint64 x589, x590 = bits.Add64(x535, x570, uint64(p521Uint1(x588))) var x591 uint64 var x592 uint64 x591, x592 = bits.Add64(x537, x572, uint64(p521Uint1(x590))) var x593 uint64 var x594 uint64 x593, x594 = bits.Add64(x539, x574, uint64(p521Uint1(x592))) var x595 uint64 var x596 uint64 x595, x596 = bits.Add64(x541, x576, uint64(p521Uint1(x594))) var x597 uint64 var x598 uint64 x597, x598 = bits.Add64(x543, x578, uint64(p521Uint1(x596))) var x599 uint64 var x600 uint64 x600, x599 = bits.Mul64(x579, 0x1ff) var x601 uint64 var x602 uint64 x602, x601 = bits.Mul64(x579, 0xffffffffffffffff) var x603 uint64 var x604 uint64 x604, x603 = bits.Mul64(x579, 0xffffffffffffffff) var x605 uint64 var x606 uint64 x606, x605 = bits.Mul64(x579, 0xffffffffffffffff) var x607 uint64 var x608 uint64 x608, x607 = bits.Mul64(x579, 0xffffffffffffffff) var x609 uint64 var x610 uint64 x610, x609 = bits.Mul64(x579, 0xffffffffffffffff) var x611 uint64 var x612 uint64 x612, x611 = bits.Mul64(x579, 0xffffffffffffffff) var x613 uint64 var x614 uint64 x614, x613 = bits.Mul64(x579, 0xffffffffffffffff) var x615 uint64 var x616 uint64 x616, x615 = bits.Mul64(x579, 0xffffffffffffffff) var x617 uint64 var x618 uint64 x617, x618 = bits.Add64(x616, x613, uint64(0x0)) var x619 uint64 var x620 uint64 x619, x620 = bits.Add64(x614, x611, uint64(p521Uint1(x618))) var x621 uint64 var x622 uint64 x621, x622 = bits.Add64(x612, x609, uint64(p521Uint1(x620))) var x623 uint64 var x624 uint64 x623, x624 = bits.Add64(x610, x607, uint64(p521Uint1(x622))) var x625 uint64 var x626 uint64 x625, x626 = bits.Add64(x608, x605, uint64(p521Uint1(x624))) var x627 uint64 var x628 uint64 x627, x628 = bits.Add64(x606, x603, uint64(p521Uint1(x626))) var x629 uint64 var x630 uint64 x629, x630 = bits.Add64(x604, x601, uint64(p521Uint1(x628))) var x631 uint64 var x632 uint64 x631, x632 = bits.Add64(x602, x599, uint64(p521Uint1(x630))) x633 := (uint64(p521Uint1(x632)) + x600) var x635 uint64 _, x635 = bits.Add64(x579, x615, uint64(0x0)) var x636 uint64 var x637 uint64 x636, x637 = bits.Add64(x581, x617, uint64(p521Uint1(x635))) var x638 uint64 var x639 uint64 x638, x639 = bits.Add64(x583, x619, uint64(p521Uint1(x637))) var x640 uint64 var x641 uint64 x640, x641 = bits.Add64(x585, x621, uint64(p521Uint1(x639))) var x642 uint64 var x643 uint64 x642, x643 = bits.Add64(x587, x623, uint64(p521Uint1(x641))) var x644 uint64 var x645 uint64 x644, x645 = bits.Add64(x589, x625, uint64(p521Uint1(x643))) var x646 uint64 var x647 uint64 x646, x647 = bits.Add64(x591, x627, uint64(p521Uint1(x645))) var x648 uint64 var x649 uint64 x648, x649 = bits.Add64(x593, x629, uint64(p521Uint1(x647))) var x650 uint64 var x651 uint64 x650, x651 = bits.Add64(x595, x631, uint64(p521Uint1(x649))) var x652 uint64 var x653 uint64 x652, x653 = bits.Add64(x597, x633, uint64(p521Uint1(x651))) x654 := (uint64(p521Uint1(x653)) + uint64(p521Uint1(x598))) var x655 uint64 var x656 uint64 x656, x655 = bits.Mul64(x6, arg1[8]) var x657 uint64 var x658 uint64 x658, x657 = bits.Mul64(x6, arg1[7]) var x659 uint64 var x660 uint64 x660, x659 = bits.Mul64(x6, arg1[6]) var x661 uint64 var x662 uint64 x662, x661 = bits.Mul64(x6, arg1[5]) var x663 uint64 var x664 uint64 x664, x663 = bits.Mul64(x6, arg1[4]) var x665 uint64 var x666 uint64 x666, x665 = bits.Mul64(x6, arg1[3]) var x667 uint64 var x668 uint64 x668, x667 = bits.Mul64(x6, arg1[2]) var x669 uint64 var x670 uint64 x670, x669 = bits.Mul64(x6, arg1[1]) var x671 uint64 var x672 uint64 x672, x671 = bits.Mul64(x6, arg1[0]) var x673 uint64 var x674 uint64 x673, x674 = bits.Add64(x672, x669, uint64(0x0)) var x675 uint64 var x676 uint64 x675, x676 = bits.Add64(x670, x667, uint64(p521Uint1(x674))) var x677 uint64 var x678 uint64 x677, x678 = bits.Add64(x668, x665, uint64(p521Uint1(x676))) var x679 uint64 var x680 uint64 x679, x680 = bits.Add64(x666, x663, uint64(p521Uint1(x678))) var x681 uint64 var x682 uint64 x681, x682 = bits.Add64(x664, x661, uint64(p521Uint1(x680))) var x683 uint64 var x684 uint64 x683, x684 = bits.Add64(x662, x659, uint64(p521Uint1(x682))) var x685 uint64 var x686 uint64 x685, x686 = bits.Add64(x660, x657, uint64(p521Uint1(x684))) var x687 uint64 var x688 uint64 x687, x688 = bits.Add64(x658, x655, uint64(p521Uint1(x686))) x689 := (uint64(p521Uint1(x688)) + x656) var x690 uint64 var x691 uint64 x690, x691 = bits.Add64(x636, x671, uint64(0x0)) var x692 uint64 var x693 uint64 x692, x693 = bits.Add64(x638, x673, uint64(p521Uint1(x691))) var x694 uint64 var x695 uint64 x694, x695 = bits.Add64(x640, x675, uint64(p521Uint1(x693))) var x696 uint64 var x697 uint64 x696, x697 = bits.Add64(x642, x677, uint64(p521Uint1(x695))) var x698 uint64 var x699 uint64 x698, x699 = bits.Add64(x644, x679, uint64(p521Uint1(x697))) var x700 uint64 var x701 uint64 x700, x701 = bits.Add64(x646, x681, uint64(p521Uint1(x699))) var x702 uint64 var x703 uint64 x702, x703 = bits.Add64(x648, x683, uint64(p521Uint1(x701))) var x704 uint64 var x705 uint64 x704, x705 = bits.Add64(x650, x685, uint64(p521Uint1(x703))) var x706 uint64 var x707 uint64 x706, x707 = bits.Add64(x652, x687, uint64(p521Uint1(x705))) var x708 uint64 var x709 uint64 x708, x709 = bits.Add64(x654, x689, uint64(p521Uint1(x707))) var x710 uint64 var x711 uint64 x711, x710 = bits.Mul64(x690, 0x1ff) var x712 uint64 var x713 uint64 x713, x712 = bits.Mul64(x690, 0xffffffffffffffff) var x714 uint64 var x715 uint64 x715, x714 = bits.Mul64(x690, 0xffffffffffffffff) var x716 uint64 var x717 uint64 x717, x716 = bits.Mul64(x690, 0xffffffffffffffff) var x718 uint64 var x719 uint64 x719, x718 = bits.Mul64(x690, 0xffffffffffffffff) var x720 uint64 var x721 uint64 x721, x720 = bits.Mul64(x690, 0xffffffffffffffff) var x722 uint64 var x723 uint64 x723, x722 = bits.Mul64(x690, 0xffffffffffffffff) var x724 uint64 var x725 uint64 x725, x724 = bits.Mul64(x690, 0xffffffffffffffff) var x726 uint64 var x727 uint64 x727, x726 = bits.Mul64(x690, 0xffffffffffffffff) var x728 uint64 var x729 uint64 x728, x729 = bits.Add64(x727, x724, uint64(0x0)) var x730 uint64 var x731 uint64 x730, x731 = bits.Add64(x725, x722, uint64(p521Uint1(x729))) var x732 uint64 var x733 uint64 x732, x733 = bits.Add64(x723, x720, uint64(p521Uint1(x731))) var x734 uint64 var x735 uint64 x734, x735 = bits.Add64(x721, x718, uint64(p521Uint1(x733))) var x736 uint64 var x737 uint64 x736, x737 = bits.Add64(x719, x716, uint64(p521Uint1(x735))) var x738 uint64 var x739 uint64 x738, x739 = bits.Add64(x717, x714, uint64(p521Uint1(x737))) var x740 uint64 var x741 uint64 x740, x741 = bits.Add64(x715, x712, uint64(p521Uint1(x739))) var x742 uint64 var x743 uint64 x742, x743 = bits.Add64(x713, x710, uint64(p521Uint1(x741))) x744 := (uint64(p521Uint1(x743)) + x711) var x746 uint64 _, x746 = bits.Add64(x690, x726, uint64(0x0)) var x747 uint64 var x748 uint64 x747, x748 = bits.Add64(x692, x728, uint64(p521Uint1(x746))) var x749 uint64 var x750 uint64 x749, x750 = bits.Add64(x694, x730, uint64(p521Uint1(x748))) var x751 uint64 var x752 uint64 x751, x752 = bits.Add64(x696, x732, uint64(p521Uint1(x750))) var x753 uint64 var x754 uint64 x753, x754 = bits.Add64(x698, x734, uint64(p521Uint1(x752))) var x755 uint64 var x756 uint64 x755, x756 = bits.Add64(x700, x736, uint64(p521Uint1(x754))) var x757 uint64 var x758 uint64 x757, x758 = bits.Add64(x702, x738, uint64(p521Uint1(x756))) var x759 uint64 var x760 uint64 x759, x760 = bits.Add64(x704, x740, uint64(p521Uint1(x758))) var x761 uint64 var x762 uint64 x761, x762 = bits.Add64(x706, x742, uint64(p521Uint1(x760))) var x763 uint64 var x764 uint64 x763, x764 = bits.Add64(x708, x744, uint64(p521Uint1(x762))) x765 := (uint64(p521Uint1(x764)) + uint64(p521Uint1(x709))) var x766 uint64 var x767 uint64 x767, x766 = bits.Mul64(x7, arg1[8]) var x768 uint64 var x769 uint64 x769, x768 = bits.Mul64(x7, arg1[7]) var x770 uint64 var x771 uint64 x771, x770 = bits.Mul64(x7, arg1[6]) var x772 uint64 var x773 uint64 x773, x772 = bits.Mul64(x7, arg1[5]) var x774 uint64 var x775 uint64 x775, x774 = bits.Mul64(x7, arg1[4]) var x776 uint64 var x777 uint64 x777, x776 = bits.Mul64(x7, arg1[3]) var x778 uint64 var x779 uint64 x779, x778 = bits.Mul64(x7, arg1[2]) var x780 uint64 var x781 uint64 x781, x780 = bits.Mul64(x7, arg1[1]) var x782 uint64 var x783 uint64 x783, x782 = bits.Mul64(x7, arg1[0]) var x784 uint64 var x785 uint64 x784, x785 = bits.Add64(x783, x780, uint64(0x0)) var x786 uint64 var x787 uint64 x786, x787 = bits.Add64(x781, x778, uint64(p521Uint1(x785))) var x788 uint64 var x789 uint64 x788, x789 = bits.Add64(x779, x776, uint64(p521Uint1(x787))) var x790 uint64 var x791 uint64 x790, x791 = bits.Add64(x777, x774, uint64(p521Uint1(x789))) var x792 uint64 var x793 uint64 x792, x793 = bits.Add64(x775, x772, uint64(p521Uint1(x791))) var x794 uint64 var x795 uint64 x794, x795 = bits.Add64(x773, x770, uint64(p521Uint1(x793))) var x796 uint64 var x797 uint64 x796, x797 = bits.Add64(x771, x768, uint64(p521Uint1(x795))) var x798 uint64 var x799 uint64 x798, x799 = bits.Add64(x769, x766, uint64(p521Uint1(x797))) x800 := (uint64(p521Uint1(x799)) + x767) var x801 uint64 var x802 uint64 x801, x802 = bits.Add64(x747, x782, uint64(0x0)) var x803 uint64 var x804 uint64 x803, x804 = bits.Add64(x749, x784, uint64(p521Uint1(x802))) var x805 uint64 var x806 uint64 x805, x806 = bits.Add64(x751, x786, uint64(p521Uint1(x804))) var x807 uint64 var x808 uint64 x807, x808 = bits.Add64(x753, x788, uint64(p521Uint1(x806))) var x809 uint64 var x810 uint64 x809, x810 = bits.Add64(x755, x790, uint64(p521Uint1(x808))) var x811 uint64 var x812 uint64 x811, x812 = bits.Add64(x757, x792, uint64(p521Uint1(x810))) var x813 uint64 var x814 uint64 x813, x814 = bits.Add64(x759, x794, uint64(p521Uint1(x812))) var x815 uint64 var x816 uint64 x815, x816 = bits.Add64(x761, x796, uint64(p521Uint1(x814))) var x817 uint64 var x818 uint64 x817, x818 = bits.Add64(x763, x798, uint64(p521Uint1(x816))) var x819 uint64 var x820 uint64 x819, x820 = bits.Add64(x765, x800, uint64(p521Uint1(x818))) var x821 uint64 var x822 uint64 x822, x821 = bits.Mul64(x801, 0x1ff) var x823 uint64 var x824 uint64 x824, x823 = bits.Mul64(x801, 0xffffffffffffffff) var x825 uint64 var x826 uint64 x826, x825 = bits.Mul64(x801, 0xffffffffffffffff) var x827 uint64 var x828 uint64 x828, x827 = bits.Mul64(x801, 0xffffffffffffffff) var x829 uint64 var x830 uint64 x830, x829 = bits.Mul64(x801, 0xffffffffffffffff) var x831 uint64 var x832 uint64 x832, x831 = bits.Mul64(x801, 0xffffffffffffffff) var x833 uint64 var x834 uint64 x834, x833 = bits.Mul64(x801, 0xffffffffffffffff) var x835 uint64 var x836 uint64 x836, x835 = bits.Mul64(x801, 0xffffffffffffffff) var x837 uint64 var x838 uint64 x838, x837 = bits.Mul64(x801, 0xffffffffffffffff) var x839 uint64 var x840 uint64 x839, x840 = bits.Add64(x838, x835, uint64(0x0)) var x841 uint64 var x842 uint64 x841, x842 = bits.Add64(x836, x833, uint64(p521Uint1(x840))) var x843 uint64 var x844 uint64 x843, x844 = bits.Add64(x834, x831, uint64(p521Uint1(x842))) var x845 uint64 var x846 uint64 x845, x846 = bits.Add64(x832, x829, uint64(p521Uint1(x844))) var x847 uint64 var x848 uint64 x847, x848 = bits.Add64(x830, x827, uint64(p521Uint1(x846))) var x849 uint64 var x850 uint64 x849, x850 = bits.Add64(x828, x825, uint64(p521Uint1(x848))) var x851 uint64 var x852 uint64 x851, x852 = bits.Add64(x826, x823, uint64(p521Uint1(x850))) var x853 uint64 var x854 uint64 x853, x854 = bits.Add64(x824, x821, uint64(p521Uint1(x852))) x855 := (uint64(p521Uint1(x854)) + x822) var x857 uint64 _, x857 = bits.Add64(x801, x837, uint64(0x0)) var x858 uint64 var x859 uint64 x858, x859 = bits.Add64(x803, x839, uint64(p521Uint1(x857))) var x860 uint64 var x861 uint64 x860, x861 = bits.Add64(x805, x841, uint64(p521Uint1(x859))) var x862 uint64 var x863 uint64 x862, x863 = bits.Add64(x807, x843, uint64(p521Uint1(x861))) var x864 uint64 var x865 uint64 x864, x865 = bits.Add64(x809, x845, uint64(p521Uint1(x863))) var x866 uint64 var x867 uint64 x866, x867 = bits.Add64(x811, x847, uint64(p521Uint1(x865))) var x868 uint64 var x869 uint64 x868, x869 = bits.Add64(x813, x849, uint64(p521Uint1(x867))) var x870 uint64 var x871 uint64 x870, x871 = bits.Add64(x815, x851, uint64(p521Uint1(x869))) var x872 uint64 var x873 uint64 x872, x873 = bits.Add64(x817, x853, uint64(p521Uint1(x871))) var x874 uint64 var x875 uint64 x874, x875 = bits.Add64(x819, x855, uint64(p521Uint1(x873))) x876 := (uint64(p521Uint1(x875)) + uint64(p521Uint1(x820))) var x877 uint64 var x878 uint64 x878, x877 = bits.Mul64(x8, arg1[8]) var x879 uint64 var x880 uint64 x880, x879 = bits.Mul64(x8, arg1[7]) var x881 uint64 var x882 uint64 x882, x881 = bits.Mul64(x8, arg1[6]) var x883 uint64 var x884 uint64 x884, x883 = bits.Mul64(x8, arg1[5]) var x885 uint64 var x886 uint64 x886, x885 = bits.Mul64(x8, arg1[4]) var x887 uint64 var x888 uint64 x888, x887 = bits.Mul64(x8, arg1[3]) var x889 uint64 var x890 uint64 x890, x889 = bits.Mul64(x8, arg1[2]) var x891 uint64 var x892 uint64 x892, x891 = bits.Mul64(x8, arg1[1]) var x893 uint64 var x894 uint64 x894, x893 = bits.Mul64(x8, arg1[0]) var x895 uint64 var x896 uint64 x895, x896 = bits.Add64(x894, x891, uint64(0x0)) var x897 uint64 var x898 uint64 x897, x898 = bits.Add64(x892, x889, uint64(p521Uint1(x896))) var x899 uint64 var x900 uint64 x899, x900 = bits.Add64(x890, x887, uint64(p521Uint1(x898))) var x901 uint64 var x902 uint64 x901, x902 = bits.Add64(x888, x885, uint64(p521Uint1(x900))) var x903 uint64 var x904 uint64 x903, x904 = bits.Add64(x886, x883, uint64(p521Uint1(x902))) var x905 uint64 var x906 uint64 x905, x906 = bits.Add64(x884, x881, uint64(p521Uint1(x904))) var x907 uint64 var x908 uint64 x907, x908 = bits.Add64(x882, x879, uint64(p521Uint1(x906))) var x909 uint64 var x910 uint64 x909, x910 = bits.Add64(x880, x877, uint64(p521Uint1(x908))) x911 := (uint64(p521Uint1(x910)) + x878) var x912 uint64 var x913 uint64 x912, x913 = bits.Add64(x858, x893, uint64(0x0)) var x914 uint64 var x915 uint64 x914, x915 = bits.Add64(x860, x895, uint64(p521Uint1(x913))) var x916 uint64 var x917 uint64 x916, x917 = bits.Add64(x862, x897, uint64(p521Uint1(x915))) var x918 uint64 var x919 uint64 x918, x919 = bits.Add64(x864, x899, uint64(p521Uint1(x917))) var x920 uint64 var x921 uint64 x920, x921 = bits.Add64(x866, x901, uint64(p521Uint1(x919))) var x922 uint64 var x923 uint64 x922, x923 = bits.Add64(x868, x903, uint64(p521Uint1(x921))) var x924 uint64 var x925 uint64 x924, x925 = bits.Add64(x870, x905, uint64(p521Uint1(x923))) var x926 uint64 var x927 uint64 x926, x927 = bits.Add64(x872, x907, uint64(p521Uint1(x925))) var x928 uint64 var x929 uint64 x928, x929 = bits.Add64(x874, x909, uint64(p521Uint1(x927))) var x930 uint64 var x931 uint64 x930, x931 = bits.Add64(x876, x911, uint64(p521Uint1(x929))) var x932 uint64 var x933 uint64 x933, x932 = bits.Mul64(x912, 0x1ff) var x934 uint64 var x935 uint64 x935, x934 = bits.Mul64(x912, 0xffffffffffffffff) var x936 uint64 var x937 uint64 x937, x936 = bits.Mul64(x912, 0xffffffffffffffff) var x938 uint64 var x939 uint64 x939, x938 = bits.Mul64(x912, 0xffffffffffffffff) var x940 uint64 var x941 uint64 x941, x940 = bits.Mul64(x912, 0xffffffffffffffff) var x942 uint64 var x943 uint64 x943, x942 = bits.Mul64(x912, 0xffffffffffffffff) var x944 uint64 var x945 uint64 x945, x944 = bits.Mul64(x912, 0xffffffffffffffff) var x946 uint64 var x947 uint64 x947, x946 = bits.Mul64(x912, 0xffffffffffffffff) var x948 uint64 var x949 uint64 x949, x948 = bits.Mul64(x912, 0xffffffffffffffff) var x950 uint64 var x951 uint64 x950, x951 = bits.Add64(x949, x946, uint64(0x0)) var x952 uint64 var x953 uint64 x952, x953 = bits.Add64(x947, x944, uint64(p521Uint1(x951))) var x954 uint64 var x955 uint64 x954, x955 = bits.Add64(x945, x942, uint64(p521Uint1(x953))) var x956 uint64 var x957 uint64 x956, x957 = bits.Add64(x943, x940, uint64(p521Uint1(x955))) var x958 uint64 var x959 uint64 x958, x959 = bits.Add64(x941, x938, uint64(p521Uint1(x957))) var x960 uint64 var x961 uint64 x960, x961 = bits.Add64(x939, x936, uint64(p521Uint1(x959))) var x962 uint64 var x963 uint64 x962, x963 = bits.Add64(x937, x934, uint64(p521Uint1(x961))) var x964 uint64 var x965 uint64 x964, x965 = bits.Add64(x935, x932, uint64(p521Uint1(x963))) x966 := (uint64(p521Uint1(x965)) + x933) var x968 uint64 _, x968 = bits.Add64(x912, x948, uint64(0x0)) var x969 uint64 var x970 uint64 x969, x970 = bits.Add64(x914, x950, uint64(p521Uint1(x968))) var x971 uint64 var x972 uint64 x971, x972 = bits.Add64(x916, x952, uint64(p521Uint1(x970))) var x973 uint64 var x974 uint64 x973, x974 = bits.Add64(x918, x954, uint64(p521Uint1(x972))) var x975 uint64 var x976 uint64 x975, x976 = bits.Add64(x920, x956, uint64(p521Uint1(x974))) var x977 uint64 var x978 uint64 x977, x978 = bits.Add64(x922, x958, uint64(p521Uint1(x976))) var x979 uint64 var x980 uint64 x979, x980 = bits.Add64(x924, x960, uint64(p521Uint1(x978))) var x981 uint64 var x982 uint64 x981, x982 = bits.Add64(x926, x962, uint64(p521Uint1(x980))) var x983 uint64 var x984 uint64 x983, x984 = bits.Add64(x928, x964, uint64(p521Uint1(x982))) var x985 uint64 var x986 uint64 x985, x986 = bits.Add64(x930, x966, uint64(p521Uint1(x984))) x987 := (uint64(p521Uint1(x986)) + uint64(p521Uint1(x931))) var x988 uint64 var x989 uint64 x988, x989 = bits.Sub64(x969, 0xffffffffffffffff, uint64(0x0)) var x990 uint64 var x991 uint64 x990, x991 = bits.Sub64(x971, 0xffffffffffffffff, uint64(p521Uint1(x989))) var x992 uint64 var x993 uint64 x992, x993 = bits.Sub64(x973, 0xffffffffffffffff, uint64(p521Uint1(x991))) var x994 uint64 var x995 uint64 x994, x995 = bits.Sub64(x975, 0xffffffffffffffff, uint64(p521Uint1(x993))) var x996 uint64 var x997 uint64 x996, x997 = bits.Sub64(x977, 0xffffffffffffffff, uint64(p521Uint1(x995))) var x998 uint64 var x999 uint64 x998, x999 = bits.Sub64(x979, 0xffffffffffffffff, uint64(p521Uint1(x997))) var x1000 uint64 var x1001 uint64 x1000, x1001 = bits.Sub64(x981, 0xffffffffffffffff, uint64(p521Uint1(x999))) var x1002 uint64 var x1003 uint64 x1002, x1003 = bits.Sub64(x983, 0xffffffffffffffff, uint64(p521Uint1(x1001))) var x1004 uint64 var x1005 uint64 x1004, x1005 = bits.Sub64(x985, 0x1ff, uint64(p521Uint1(x1003))) var x1007 uint64 _, x1007 = bits.Sub64(x987, uint64(0x0), uint64(p521Uint1(x1005))) var x1008 uint64 p521CmovznzU64(&x1008, p521Uint1(x1007), x988, x969) var x1009 uint64 p521CmovznzU64(&x1009, p521Uint1(x1007), x990, x971) var x1010 uint64 p521CmovznzU64(&x1010, p521Uint1(x1007), x992, x973) var x1011 uint64 p521CmovznzU64(&x1011, p521Uint1(x1007), x994, x975) var x1012 uint64 p521CmovznzU64(&x1012, p521Uint1(x1007), x996, x977) var x1013 uint64 p521CmovznzU64(&x1013, p521Uint1(x1007), x998, x979) var x1014 uint64 p521CmovznzU64(&x1014, p521Uint1(x1007), x1000, x981) var x1015 uint64 p521CmovznzU64(&x1015, p521Uint1(x1007), x1002, x983) var x1016 uint64 p521CmovznzU64(&x1016, p521Uint1(x1007), x1004, x985) out1[0] = x1008 out1[1] = x1009 out1[2] = x1010 out1[3] = x1011 out1[4] = x1012 out1[5] = x1013 out1[6] = x1014 out1[7] = x1015 out1[8] = x1016 } // p521Add adds two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p521Add(out1 *p521MontgomeryDomainFieldElement, arg1 *p521MontgomeryDomainFieldElement, arg2 *p521MontgomeryDomainFieldElement) { var x1 uint64 var x2 uint64 x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) var x3 uint64 var x4 uint64 x3, x4 = bits.Add64(arg1[1], arg2[1], uint64(p521Uint1(x2))) var x5 uint64 var x6 uint64 x5, x6 = bits.Add64(arg1[2], arg2[2], uint64(p521Uint1(x4))) var x7 uint64 var x8 uint64 x7, x8 = bits.Add64(arg1[3], arg2[3], uint64(p521Uint1(x6))) var x9 uint64 var x10 uint64 x9, x10 = bits.Add64(arg1[4], arg2[4], uint64(p521Uint1(x8))) var x11 uint64 var x12 uint64 x11, x12 = bits.Add64(arg1[5], arg2[5], uint64(p521Uint1(x10))) var x13 uint64 var x14 uint64 x13, x14 = bits.Add64(arg1[6], arg2[6], uint64(p521Uint1(x12))) var x15 uint64 var x16 uint64 x15, x16 = bits.Add64(arg1[7], arg2[7], uint64(p521Uint1(x14))) var x17 uint64 var x18 uint64 x17, x18 = bits.Add64(arg1[8], arg2[8], uint64(p521Uint1(x16))) var x19 uint64 var x20 uint64 x19, x20 = bits.Sub64(x1, 0xffffffffffffffff, uint64(0x0)) var x21 uint64 var x22 uint64 x21, x22 = bits.Sub64(x3, 0xffffffffffffffff, uint64(p521Uint1(x20))) var x23 uint64 var x24 uint64 x23, x24 = bits.Sub64(x5, 0xffffffffffffffff, uint64(p521Uint1(x22))) var x25 uint64 var x26 uint64 x25, x26 = bits.Sub64(x7, 0xffffffffffffffff, uint64(p521Uint1(x24))) var x27 uint64 var x28 uint64 x27, x28 = bits.Sub64(x9, 0xffffffffffffffff, uint64(p521Uint1(x26))) var x29 uint64 var x30 uint64 x29, x30 = bits.Sub64(x11, 0xffffffffffffffff, uint64(p521Uint1(x28))) var x31 uint64 var x32 uint64 x31, x32 = bits.Sub64(x13, 0xffffffffffffffff, uint64(p521Uint1(x30))) var x33 uint64 var x34 uint64 x33, x34 = bits.Sub64(x15, 0xffffffffffffffff, uint64(p521Uint1(x32))) var x35 uint64 var x36 uint64 x35, x36 = bits.Sub64(x17, 0x1ff, uint64(p521Uint1(x34))) var x38 uint64 _, x38 = bits.Sub64(uint64(p521Uint1(x18)), uint64(0x0), uint64(p521Uint1(x36))) var x39 uint64 p521CmovznzU64(&x39, p521Uint1(x38), x19, x1) var x40 uint64 p521CmovznzU64(&x40, p521Uint1(x38), x21, x3) var x41 uint64 p521CmovznzU64(&x41, p521Uint1(x38), x23, x5) var x42 uint64 p521CmovznzU64(&x42, p521Uint1(x38), x25, x7) var x43 uint64 p521CmovznzU64(&x43, p521Uint1(x38), x27, x9) var x44 uint64 p521CmovznzU64(&x44, p521Uint1(x38), x29, x11) var x45 uint64 p521CmovznzU64(&x45, p521Uint1(x38), x31, x13) var x46 uint64 p521CmovznzU64(&x46, p521Uint1(x38), x33, x15) var x47 uint64 p521CmovznzU64(&x47, p521Uint1(x38), x35, x17) out1[0] = x39 out1[1] = x40 out1[2] = x41 out1[3] = x42 out1[4] = x43 out1[5] = x44 out1[6] = x45 out1[7] = x46 out1[8] = x47 } // p521Sub subtracts two field elements in the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // 0 ≤ eval arg2 < m // // Postconditions: // // eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m // 0 ≤ eval out1 < m func p521Sub(out1 *p521MontgomeryDomainFieldElement, arg1 *p521MontgomeryDomainFieldElement, arg2 *p521MontgomeryDomainFieldElement) { var x1 uint64 var x2 uint64 x1, x2 = bits.Sub64(arg1[0], arg2[0], uint64(0x0)) var x3 uint64 var x4 uint64 x3, x4 = bits.Sub64(arg1[1], arg2[1], uint64(p521Uint1(x2))) var x5 uint64 var x6 uint64 x5, x6 = bits.Sub64(arg1[2], arg2[2], uint64(p521Uint1(x4))) var x7 uint64 var x8 uint64 x7, x8 = bits.Sub64(arg1[3], arg2[3], uint64(p521Uint1(x6))) var x9 uint64 var x10 uint64 x9, x10 = bits.Sub64(arg1[4], arg2[4], uint64(p521Uint1(x8))) var x11 uint64 var x12 uint64 x11, x12 = bits.Sub64(arg1[5], arg2[5], uint64(p521Uint1(x10))) var x13 uint64 var x14 uint64 x13, x14 = bits.Sub64(arg1[6], arg2[6], uint64(p521Uint1(x12))) var x15 uint64 var x16 uint64 x15, x16 = bits.Sub64(arg1[7], arg2[7], uint64(p521Uint1(x14))) var x17 uint64 var x18 uint64 x17, x18 = bits.Sub64(arg1[8], arg2[8], uint64(p521Uint1(x16))) var x19 uint64 p521CmovznzU64(&x19, p521Uint1(x18), uint64(0x0), 0xffffffffffffffff) var x20 uint64 var x21 uint64 x20, x21 = bits.Add64(x1, x19, uint64(0x0)) var x22 uint64 var x23 uint64 x22, x23 = bits.Add64(x3, x19, uint64(p521Uint1(x21))) var x24 uint64 var x25 uint64 x24, x25 = bits.Add64(x5, x19, uint64(p521Uint1(x23))) var x26 uint64 var x27 uint64 x26, x27 = bits.Add64(x7, x19, uint64(p521Uint1(x25))) var x28 uint64 var x29 uint64 x28, x29 = bits.Add64(x9, x19, uint64(p521Uint1(x27))) var x30 uint64 var x31 uint64 x30, x31 = bits.Add64(x11, x19, uint64(p521Uint1(x29))) var x32 uint64 var x33 uint64 x32, x33 = bits.Add64(x13, x19, uint64(p521Uint1(x31))) var x34 uint64 var x35 uint64 x34, x35 = bits.Add64(x15, x19, uint64(p521Uint1(x33))) var x36 uint64 x36, _ = bits.Add64(x17, (x19 & 0x1ff), uint64(p521Uint1(x35))) out1[0] = x20 out1[1] = x22 out1[2] = x24 out1[3] = x26 out1[4] = x28 out1[5] = x30 out1[6] = x32 out1[7] = x34 out1[8] = x36 } // p521SetOne returns the field element one in the Montgomery domain. // // Postconditions: // // eval (from_montgomery out1) mod m = 1 mod m // 0 ≤ eval out1 < m func p521SetOne(out1 *p521MontgomeryDomainFieldElement) { out1[0] = 0x80000000000000 out1[1] = uint64(0x0) out1[2] = uint64(0x0) out1[3] = uint64(0x0) out1[4] = uint64(0x0) out1[5] = uint64(0x0) out1[6] = uint64(0x0) out1[7] = uint64(0x0) out1[8] = uint64(0x0) } // p521FromMontgomery translates a field element out of the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^9) mod m // 0 ≤ eval out1 < m func p521FromMontgomery(out1 *p521NonMontgomeryDomainFieldElement, arg1 *p521MontgomeryDomainFieldElement) { x1 := arg1[0] var x2 uint64 var x3 uint64 x3, x2 = bits.Mul64(x1, 0x1ff) var x4 uint64 var x5 uint64 x5, x4 = bits.Mul64(x1, 0xffffffffffffffff) var x6 uint64 var x7 uint64 x7, x6 = bits.Mul64(x1, 0xffffffffffffffff) var x8 uint64 var x9 uint64 x9, x8 = bits.Mul64(x1, 0xffffffffffffffff) var x10 uint64 var x11 uint64 x11, x10 = bits.Mul64(x1, 0xffffffffffffffff) var x12 uint64 var x13 uint64 x13, x12 = bits.Mul64(x1, 0xffffffffffffffff) var x14 uint64 var x15 uint64 x15, x14 = bits.Mul64(x1, 0xffffffffffffffff) var x16 uint64 var x17 uint64 x17, x16 = bits.Mul64(x1, 0xffffffffffffffff) var x18 uint64 var x19 uint64 x19, x18 = bits.Mul64(x1, 0xffffffffffffffff) var x20 uint64 var x21 uint64 x20, x21 = bits.Add64(x19, x16, uint64(0x0)) var x22 uint64 var x23 uint64 x22, x23 = bits.Add64(x17, x14, uint64(p521Uint1(x21))) var x24 uint64 var x25 uint64 x24, x25 = bits.Add64(x15, x12, uint64(p521Uint1(x23))) var x26 uint64 var x27 uint64 x26, x27 = bits.Add64(x13, x10, uint64(p521Uint1(x25))) var x28 uint64 var x29 uint64 x28, x29 = bits.Add64(x11, x8, uint64(p521Uint1(x27))) var x30 uint64 var x31 uint64 x30, x31 = bits.Add64(x9, x6, uint64(p521Uint1(x29))) var x32 uint64 var x33 uint64 x32, x33 = bits.Add64(x7, x4, uint64(p521Uint1(x31))) var x34 uint64 var x35 uint64 x34, x35 = bits.Add64(x5, x2, uint64(p521Uint1(x33))) var x37 uint64 _, x37 = bits.Add64(x1, x18, uint64(0x0)) var x38 uint64 var x39 uint64 x38, x39 = bits.Add64(uint64(0x0), x20, uint64(p521Uint1(x37))) var x40 uint64 var x41 uint64 x40, x41 = bits.Add64(uint64(0x0), x22, uint64(p521Uint1(x39))) var x42 uint64 var x43 uint64 x42, x43 = bits.Add64(uint64(0x0), x24, uint64(p521Uint1(x41))) var x44 uint64 var x45 uint64 x44, x45 = bits.Add64(uint64(0x0), x26, uint64(p521Uint1(x43))) var x46 uint64 var x47 uint64 x46, x47 = bits.Add64(uint64(0x0), x28, uint64(p521Uint1(x45))) var x48 uint64 var x49 uint64 x48, x49 = bits.Add64(uint64(0x0), x30, uint64(p521Uint1(x47))) var x50 uint64 var x51 uint64 x50, x51 = bits.Add64(uint64(0x0), x32, uint64(p521Uint1(x49))) var x52 uint64 var x53 uint64 x52, x53 = bits.Add64(uint64(0x0), x34, uint64(p521Uint1(x51))) var x54 uint64 var x55 uint64 x54, x55 = bits.Add64(x38, arg1[1], uint64(0x0)) var x56 uint64 var x57 uint64 x56, x57 = bits.Add64(x40, uint64(0x0), uint64(p521Uint1(x55))) var x58 uint64 var x59 uint64 x58, x59 = bits.Add64(x42, uint64(0x0), uint64(p521Uint1(x57))) var x60 uint64 var x61 uint64 x60, x61 = bits.Add64(x44, uint64(0x0), uint64(p521Uint1(x59))) var x62 uint64 var x63 uint64 x62, x63 = bits.Add64(x46, uint64(0x0), uint64(p521Uint1(x61))) var x64 uint64 var x65 uint64 x64, x65 = bits.Add64(x48, uint64(0x0), uint64(p521Uint1(x63))) var x66 uint64 var x67 uint64 x66, x67 = bits.Add64(x50, uint64(0x0), uint64(p521Uint1(x65))) var x68 uint64 var x69 uint64 x68, x69 = bits.Add64(x52, uint64(0x0), uint64(p521Uint1(x67))) var x70 uint64 var x71 uint64 x71, x70 = bits.Mul64(x54, 0x1ff) var x72 uint64 var x73 uint64 x73, x72 = bits.Mul64(x54, 0xffffffffffffffff) var x74 uint64 var x75 uint64 x75, x74 = bits.Mul64(x54, 0xffffffffffffffff) var x76 uint64 var x77 uint64 x77, x76 = bits.Mul64(x54, 0xffffffffffffffff) var x78 uint64 var x79 uint64 x79, x78 = bits.Mul64(x54, 0xffffffffffffffff) var x80 uint64 var x81 uint64 x81, x80 = bits.Mul64(x54, 0xffffffffffffffff) var x82 uint64 var x83 uint64 x83, x82 = bits.Mul64(x54, 0xffffffffffffffff) var x84 uint64 var x85 uint64 x85, x84 = bits.Mul64(x54, 0xffffffffffffffff) var x86 uint64 var x87 uint64 x87, x86 = bits.Mul64(x54, 0xffffffffffffffff) var x88 uint64 var x89 uint64 x88, x89 = bits.Add64(x87, x84, uint64(0x0)) var x90 uint64 var x91 uint64 x90, x91 = bits.Add64(x85, x82, uint64(p521Uint1(x89))) var x92 uint64 var x93 uint64 x92, x93 = bits.Add64(x83, x80, uint64(p521Uint1(x91))) var x94 uint64 var x95 uint64 x94, x95 = bits.Add64(x81, x78, uint64(p521Uint1(x93))) var x96 uint64 var x97 uint64 x96, x97 = bits.Add64(x79, x76, uint64(p521Uint1(x95))) var x98 uint64 var x99 uint64 x98, x99 = bits.Add64(x77, x74, uint64(p521Uint1(x97))) var x100 uint64 var x101 uint64 x100, x101 = bits.Add64(x75, x72, uint64(p521Uint1(x99))) var x102 uint64 var x103 uint64 x102, x103 = bits.Add64(x73, x70, uint64(p521Uint1(x101))) var x105 uint64 _, x105 = bits.Add64(x54, x86, uint64(0x0)) var x106 uint64 var x107 uint64 x106, x107 = bits.Add64(x56, x88, uint64(p521Uint1(x105))) var x108 uint64 var x109 uint64 x108, x109 = bits.Add64(x58, x90, uint64(p521Uint1(x107))) var x110 uint64 var x111 uint64 x110, x111 = bits.Add64(x60, x92, uint64(p521Uint1(x109))) var x112 uint64 var x113 uint64 x112, x113 = bits.Add64(x62, x94, uint64(p521Uint1(x111))) var x114 uint64 var x115 uint64 x114, x115 = bits.Add64(x64, x96, uint64(p521Uint1(x113))) var x116 uint64 var x117 uint64 x116, x117 = bits.Add64(x66, x98, uint64(p521Uint1(x115))) var x118 uint64 var x119 uint64 x118, x119 = bits.Add64(x68, x100, uint64(p521Uint1(x117))) var x120 uint64 var x121 uint64 x120, x121 = bits.Add64((uint64(p521Uint1(x69)) + (uint64(p521Uint1(x53)) + (uint64(p521Uint1(x35)) + x3))), x102, uint64(p521Uint1(x119))) var x122 uint64 var x123 uint64 x122, x123 = bits.Add64(x106, arg1[2], uint64(0x0)) var x124 uint64 var x125 uint64 x124, x125 = bits.Add64(x108, uint64(0x0), uint64(p521Uint1(x123))) var x126 uint64 var x127 uint64 x126, x127 = bits.Add64(x110, uint64(0x0), uint64(p521Uint1(x125))) var x128 uint64 var x129 uint64 x128, x129 = bits.Add64(x112, uint64(0x0), uint64(p521Uint1(x127))) var x130 uint64 var x131 uint64 x130, x131 = bits.Add64(x114, uint64(0x0), uint64(p521Uint1(x129))) var x132 uint64 var x133 uint64 x132, x133 = bits.Add64(x116, uint64(0x0), uint64(p521Uint1(x131))) var x134 uint64 var x135 uint64 x134, x135 = bits.Add64(x118, uint64(0x0), uint64(p521Uint1(x133))) var x136 uint64 var x137 uint64 x136, x137 = bits.Add64(x120, uint64(0x0), uint64(p521Uint1(x135))) var x138 uint64 var x139 uint64 x139, x138 = bits.Mul64(x122, 0x1ff) var x140 uint64 var x141 uint64 x141, x140 = bits.Mul64(x122, 0xffffffffffffffff) var x142 uint64 var x143 uint64 x143, x142 = bits.Mul64(x122, 0xffffffffffffffff) var x144 uint64 var x145 uint64 x145, x144 = bits.Mul64(x122, 0xffffffffffffffff) var x146 uint64 var x147 uint64 x147, x146 = bits.Mul64(x122, 0xffffffffffffffff) var x148 uint64 var x149 uint64 x149, x148 = bits.Mul64(x122, 0xffffffffffffffff) var x150 uint64 var x151 uint64 x151, x150 = bits.Mul64(x122, 0xffffffffffffffff) var x152 uint64 var x153 uint64 x153, x152 = bits.Mul64(x122, 0xffffffffffffffff) var x154 uint64 var x155 uint64 x155, x154 = bits.Mul64(x122, 0xffffffffffffffff) var x156 uint64 var x157 uint64 x156, x157 = bits.Add64(x155, x152, uint64(0x0)) var x158 uint64 var x159 uint64 x158, x159 = bits.Add64(x153, x150, uint64(p521Uint1(x157))) var x160 uint64 var x161 uint64 x160, x161 = bits.Add64(x151, x148, uint64(p521Uint1(x159))) var x162 uint64 var x163 uint64 x162, x163 = bits.Add64(x149, x146, uint64(p521Uint1(x161))) var x164 uint64 var x165 uint64 x164, x165 = bits.Add64(x147, x144, uint64(p521Uint1(x163))) var x166 uint64 var x167 uint64 x166, x167 = bits.Add64(x145, x142, uint64(p521Uint1(x165))) var x168 uint64 var x169 uint64 x168, x169 = bits.Add64(x143, x140, uint64(p521Uint1(x167))) var x170 uint64 var x171 uint64 x170, x171 = bits.Add64(x141, x138, uint64(p521Uint1(x169))) var x173 uint64 _, x173 = bits.Add64(x122, x154, uint64(0x0)) var x174 uint64 var x175 uint64 x174, x175 = bits.Add64(x124, x156, uint64(p521Uint1(x173))) var x176 uint64 var x177 uint64 x176, x177 = bits.Add64(x126, x158, uint64(p521Uint1(x175))) var x178 uint64 var x179 uint64 x178, x179 = bits.Add64(x128, x160, uint64(p521Uint1(x177))) var x180 uint64 var x181 uint64 x180, x181 = bits.Add64(x130, x162, uint64(p521Uint1(x179))) var x182 uint64 var x183 uint64 x182, x183 = bits.Add64(x132, x164, uint64(p521Uint1(x181))) var x184 uint64 var x185 uint64 x184, x185 = bits.Add64(x134, x166, uint64(p521Uint1(x183))) var x186 uint64 var x187 uint64 x186, x187 = bits.Add64(x136, x168, uint64(p521Uint1(x185))) var x188 uint64 var x189 uint64 x188, x189 = bits.Add64((uint64(p521Uint1(x137)) + (uint64(p521Uint1(x121)) + (uint64(p521Uint1(x103)) + x71))), x170, uint64(p521Uint1(x187))) var x190 uint64 var x191 uint64 x190, x191 = bits.Add64(x174, arg1[3], uint64(0x0)) var x192 uint64 var x193 uint64 x192, x193 = bits.Add64(x176, uint64(0x0), uint64(p521Uint1(x191))) var x194 uint64 var x195 uint64 x194, x195 = bits.Add64(x178, uint64(0x0), uint64(p521Uint1(x193))) var x196 uint64 var x197 uint64 x196, x197 = bits.Add64(x180, uint64(0x0), uint64(p521Uint1(x195))) var x198 uint64 var x199 uint64 x198, x199 = bits.Add64(x182, uint64(0x0), uint64(p521Uint1(x197))) var x200 uint64 var x201 uint64 x200, x201 = bits.Add64(x184, uint64(0x0), uint64(p521Uint1(x199))) var x202 uint64 var x203 uint64 x202, x203 = bits.Add64(x186, uint64(0x0), uint64(p521Uint1(x201))) var x204 uint64 var x205 uint64 x204, x205 = bits.Add64(x188, uint64(0x0), uint64(p521Uint1(x203))) var x206 uint64 var x207 uint64 x207, x206 = bits.Mul64(x190, 0x1ff) var x208 uint64 var x209 uint64 x209, x208 = bits.Mul64(x190, 0xffffffffffffffff) var x210 uint64 var x211 uint64 x211, x210 = bits.Mul64(x190, 0xffffffffffffffff) var x212 uint64 var x213 uint64 x213, x212 = bits.Mul64(x190, 0xffffffffffffffff) var x214 uint64 var x215 uint64 x215, x214 = bits.Mul64(x190, 0xffffffffffffffff) var x216 uint64 var x217 uint64 x217, x216 = bits.Mul64(x190, 0xffffffffffffffff) var x218 uint64 var x219 uint64 x219, x218 = bits.Mul64(x190, 0xffffffffffffffff) var x220 uint64 var x221 uint64 x221, x220 = bits.Mul64(x190, 0xffffffffffffffff) var x222 uint64 var x223 uint64 x223, x222 = bits.Mul64(x190, 0xffffffffffffffff) var x224 uint64 var x225 uint64 x224, x225 = bits.Add64(x223, x220, uint64(0x0)) var x226 uint64 var x227 uint64 x226, x227 = bits.Add64(x221, x218, uint64(p521Uint1(x225))) var x228 uint64 var x229 uint64 x228, x229 = bits.Add64(x219, x216, uint64(p521Uint1(x227))) var x230 uint64 var x231 uint64 x230, x231 = bits.Add64(x217, x214, uint64(p521Uint1(x229))) var x232 uint64 var x233 uint64 x232, x233 = bits.Add64(x215, x212, uint64(p521Uint1(x231))) var x234 uint64 var x235 uint64 x234, x235 = bits.Add64(x213, x210, uint64(p521Uint1(x233))) var x236 uint64 var x237 uint64 x236, x237 = bits.Add64(x211, x208, uint64(p521Uint1(x235))) var x238 uint64 var x239 uint64 x238, x239 = bits.Add64(x209, x206, uint64(p521Uint1(x237))) var x241 uint64 _, x241 = bits.Add64(x190, x222, uint64(0x0)) var x242 uint64 var x243 uint64 x242, x243 = bits.Add64(x192, x224, uint64(p521Uint1(x241))) var x244 uint64 var x245 uint64 x244, x245 = bits.Add64(x194, x226, uint64(p521Uint1(x243))) var x246 uint64 var x247 uint64 x246, x247 = bits.Add64(x196, x228, uint64(p521Uint1(x245))) var x248 uint64 var x249 uint64 x248, x249 = bits.Add64(x198, x230, uint64(p521Uint1(x247))) var x250 uint64 var x251 uint64 x250, x251 = bits.Add64(x200, x232, uint64(p521Uint1(x249))) var x252 uint64 var x253 uint64 x252, x253 = bits.Add64(x202, x234, uint64(p521Uint1(x251))) var x254 uint64 var x255 uint64 x254, x255 = bits.Add64(x204, x236, uint64(p521Uint1(x253))) var x256 uint64 var x257 uint64 x256, x257 = bits.Add64((uint64(p521Uint1(x205)) + (uint64(p521Uint1(x189)) + (uint64(p521Uint1(x171)) + x139))), x238, uint64(p521Uint1(x255))) var x258 uint64 var x259 uint64 x258, x259 = bits.Add64(x242, arg1[4], uint64(0x0)) var x260 uint64 var x261 uint64 x260, x261 = bits.Add64(x244, uint64(0x0), uint64(p521Uint1(x259))) var x262 uint64 var x263 uint64 x262, x263 = bits.Add64(x246, uint64(0x0), uint64(p521Uint1(x261))) var x264 uint64 var x265 uint64 x264, x265 = bits.Add64(x248, uint64(0x0), uint64(p521Uint1(x263))) var x266 uint64 var x267 uint64 x266, x267 = bits.Add64(x250, uint64(0x0), uint64(p521Uint1(x265))) var x268 uint64 var x269 uint64 x268, x269 = bits.Add64(x252, uint64(0x0), uint64(p521Uint1(x267))) var x270 uint64 var x271 uint64 x270, x271 = bits.Add64(x254, uint64(0x0), uint64(p521Uint1(x269))) var x272 uint64 var x273 uint64 x272, x273 = bits.Add64(x256, uint64(0x0), uint64(p521Uint1(x271))) var x274 uint64 var x275 uint64 x275, x274 = bits.Mul64(x258, 0x1ff) var x276 uint64 var x277 uint64 x277, x276 = bits.Mul64(x258, 0xffffffffffffffff) var x278 uint64 var x279 uint64 x279, x278 = bits.Mul64(x258, 0xffffffffffffffff) var x280 uint64 var x281 uint64 x281, x280 = bits.Mul64(x258, 0xffffffffffffffff) var x282 uint64 var x283 uint64 x283, x282 = bits.Mul64(x258, 0xffffffffffffffff) var x284 uint64 var x285 uint64 x285, x284 = bits.Mul64(x258, 0xffffffffffffffff) var x286 uint64 var x287 uint64 x287, x286 = bits.Mul64(x258, 0xffffffffffffffff) var x288 uint64 var x289 uint64 x289, x288 = bits.Mul64(x258, 0xffffffffffffffff) var x290 uint64 var x291 uint64 x291, x290 = bits.Mul64(x258, 0xffffffffffffffff) var x292 uint64 var x293 uint64 x292, x293 = bits.Add64(x291, x288, uint64(0x0)) var x294 uint64 var x295 uint64 x294, x295 = bits.Add64(x289, x286, uint64(p521Uint1(x293))) var x296 uint64 var x297 uint64 x296, x297 = bits.Add64(x287, x284, uint64(p521Uint1(x295))) var x298 uint64 var x299 uint64 x298, x299 = bits.Add64(x285, x282, uint64(p521Uint1(x297))) var x300 uint64 var x301 uint64 x300, x301 = bits.Add64(x283, x280, uint64(p521Uint1(x299))) var x302 uint64 var x303 uint64 x302, x303 = bits.Add64(x281, x278, uint64(p521Uint1(x301))) var x304 uint64 var x305 uint64 x304, x305 = bits.Add64(x279, x276, uint64(p521Uint1(x303))) var x306 uint64 var x307 uint64 x306, x307 = bits.Add64(x277, x274, uint64(p521Uint1(x305))) var x309 uint64 _, x309 = bits.Add64(x258, x290, uint64(0x0)) var x310 uint64 var x311 uint64 x310, x311 = bits.Add64(x260, x292, uint64(p521Uint1(x309))) var x312 uint64 var x313 uint64 x312, x313 = bits.Add64(x262, x294, uint64(p521Uint1(x311))) var x314 uint64 var x315 uint64 x314, x315 = bits.Add64(x264, x296, uint64(p521Uint1(x313))) var x316 uint64 var x317 uint64 x316, x317 = bits.Add64(x266, x298, uint64(p521Uint1(x315))) var x318 uint64 var x319 uint64 x318, x319 = bits.Add64(x268, x300, uint64(p521Uint1(x317))) var x320 uint64 var x321 uint64 x320, x321 = bits.Add64(x270, x302, uint64(p521Uint1(x319))) var x322 uint64 var x323 uint64 x322, x323 = bits.Add64(x272, x304, uint64(p521Uint1(x321))) var x324 uint64 var x325 uint64 x324, x325 = bits.Add64((uint64(p521Uint1(x273)) + (uint64(p521Uint1(x257)) + (uint64(p521Uint1(x239)) + x207))), x306, uint64(p521Uint1(x323))) var x326 uint64 var x327 uint64 x326, x327 = bits.Add64(x310, arg1[5], uint64(0x0)) var x328 uint64 var x329 uint64 x328, x329 = bits.Add64(x312, uint64(0x0), uint64(p521Uint1(x327))) var x330 uint64 var x331 uint64 x330, x331 = bits.Add64(x314, uint64(0x0), uint64(p521Uint1(x329))) var x332 uint64 var x333 uint64 x332, x333 = bits.Add64(x316, uint64(0x0), uint64(p521Uint1(x331))) var x334 uint64 var x335 uint64 x334, x335 = bits.Add64(x318, uint64(0x0), uint64(p521Uint1(x333))) var x336 uint64 var x337 uint64 x336, x337 = bits.Add64(x320, uint64(0x0), uint64(p521Uint1(x335))) var x338 uint64 var x339 uint64 x338, x339 = bits.Add64(x322, uint64(0x0), uint64(p521Uint1(x337))) var x340 uint64 var x341 uint64 x340, x341 = bits.Add64(x324, uint64(0x0), uint64(p521Uint1(x339))) var x342 uint64 var x343 uint64 x343, x342 = bits.Mul64(x326, 0x1ff) var x344 uint64 var x345 uint64 x345, x344 = bits.Mul64(x326, 0xffffffffffffffff) var x346 uint64 var x347 uint64 x347, x346 = bits.Mul64(x326, 0xffffffffffffffff) var x348 uint64 var x349 uint64 x349, x348 = bits.Mul64(x326, 0xffffffffffffffff) var x350 uint64 var x351 uint64 x351, x350 = bits.Mul64(x326, 0xffffffffffffffff) var x352 uint64 var x353 uint64 x353, x352 = bits.Mul64(x326, 0xffffffffffffffff) var x354 uint64 var x355 uint64 x355, x354 = bits.Mul64(x326, 0xffffffffffffffff) var x356 uint64 var x357 uint64 x357, x356 = bits.Mul64(x326, 0xffffffffffffffff) var x358 uint64 var x359 uint64 x359, x358 = bits.Mul64(x326, 0xffffffffffffffff) var x360 uint64 var x361 uint64 x360, x361 = bits.Add64(x359, x356, uint64(0x0)) var x362 uint64 var x363 uint64 x362, x363 = bits.Add64(x357, x354, uint64(p521Uint1(x361))) var x364 uint64 var x365 uint64 x364, x365 = bits.Add64(x355, x352, uint64(p521Uint1(x363))) var x366 uint64 var x367 uint64 x366, x367 = bits.Add64(x353, x350, uint64(p521Uint1(x365))) var x368 uint64 var x369 uint64 x368, x369 = bits.Add64(x351, x348, uint64(p521Uint1(x367))) var x370 uint64 var x371 uint64 x370, x371 = bits.Add64(x349, x346, uint64(p521Uint1(x369))) var x372 uint64 var x373 uint64 x372, x373 = bits.Add64(x347, x344, uint64(p521Uint1(x371))) var x374 uint64 var x375 uint64 x374, x375 = bits.Add64(x345, x342, uint64(p521Uint1(x373))) var x377 uint64 _, x377 = bits.Add64(x326, x358, uint64(0x0)) var x378 uint64 var x379 uint64 x378, x379 = bits.Add64(x328, x360, uint64(p521Uint1(x377))) var x380 uint64 var x381 uint64 x380, x381 = bits.Add64(x330, x362, uint64(p521Uint1(x379))) var x382 uint64 var x383 uint64 x382, x383 = bits.Add64(x332, x364, uint64(p521Uint1(x381))) var x384 uint64 var x385 uint64 x384, x385 = bits.Add64(x334, x366, uint64(p521Uint1(x383))) var x386 uint64 var x387 uint64 x386, x387 = bits.Add64(x336, x368, uint64(p521Uint1(x385))) var x388 uint64 var x389 uint64 x388, x389 = bits.Add64(x338, x370, uint64(p521Uint1(x387))) var x390 uint64 var x391 uint64 x390, x391 = bits.Add64(x340, x372, uint64(p521Uint1(x389))) var x392 uint64 var x393 uint64 x392, x393 = bits.Add64((uint64(p521Uint1(x341)) + (uint64(p521Uint1(x325)) + (uint64(p521Uint1(x307)) + x275))), x374, uint64(p521Uint1(x391))) var x394 uint64 var x395 uint64 x394, x395 = bits.Add64(x378, arg1[6], uint64(0x0)) var x396 uint64 var x397 uint64 x396, x397 = bits.Add64(x380, uint64(0x0), uint64(p521Uint1(x395))) var x398 uint64 var x399 uint64 x398, x399 = bits.Add64(x382, uint64(0x0), uint64(p521Uint1(x397))) var x400 uint64 var x401 uint64 x400, x401 = bits.Add64(x384, uint64(0x0), uint64(p521Uint1(x399))) var x402 uint64 var x403 uint64 x402, x403 = bits.Add64(x386, uint64(0x0), uint64(p521Uint1(x401))) var x404 uint64 var x405 uint64 x404, x405 = bits.Add64(x388, uint64(0x0), uint64(p521Uint1(x403))) var x406 uint64 var x407 uint64 x406, x407 = bits.Add64(x390, uint64(0x0), uint64(p521Uint1(x405))) var x408 uint64 var x409 uint64 x408, x409 = bits.Add64(x392, uint64(0x0), uint64(p521Uint1(x407))) var x410 uint64 var x411 uint64 x411, x410 = bits.Mul64(x394, 0x1ff) var x412 uint64 var x413 uint64 x413, x412 = bits.Mul64(x394, 0xffffffffffffffff) var x414 uint64 var x415 uint64 x415, x414 = bits.Mul64(x394, 0xffffffffffffffff) var x416 uint64 var x417 uint64 x417, x416 = bits.Mul64(x394, 0xffffffffffffffff) var x418 uint64 var x419 uint64 x419, x418 = bits.Mul64(x394, 0xffffffffffffffff) var x420 uint64 var x421 uint64 x421, x420 = bits.Mul64(x394, 0xffffffffffffffff) var x422 uint64 var x423 uint64 x423, x422 = bits.Mul64(x394, 0xffffffffffffffff) var x424 uint64 var x425 uint64 x425, x424 = bits.Mul64(x394, 0xffffffffffffffff) var x426 uint64 var x427 uint64 x427, x426 = bits.Mul64(x394, 0xffffffffffffffff) var x428 uint64 var x429 uint64 x428, x429 = bits.Add64(x427, x424, uint64(0x0)) var x430 uint64 var x431 uint64 x430, x431 = bits.Add64(x425, x422, uint64(p521Uint1(x429))) var x432 uint64 var x433 uint64 x432, x433 = bits.Add64(x423, x420, uint64(p521Uint1(x431))) var x434 uint64 var x435 uint64 x434, x435 = bits.Add64(x421, x418, uint64(p521Uint1(x433))) var x436 uint64 var x437 uint64 x436, x437 = bits.Add64(x419, x416, uint64(p521Uint1(x435))) var x438 uint64 var x439 uint64 x438, x439 = bits.Add64(x417, x414, uint64(p521Uint1(x437))) var x440 uint64 var x441 uint64 x440, x441 = bits.Add64(x415, x412, uint64(p521Uint1(x439))) var x442 uint64 var x443 uint64 x442, x443 = bits.Add64(x413, x410, uint64(p521Uint1(x441))) var x445 uint64 _, x445 = bits.Add64(x394, x426, uint64(0x0)) var x446 uint64 var x447 uint64 x446, x447 = bits.Add64(x396, x428, uint64(p521Uint1(x445))) var x448 uint64 var x449 uint64 x448, x449 = bits.Add64(x398, x430, uint64(p521Uint1(x447))) var x450 uint64 var x451 uint64 x450, x451 = bits.Add64(x400, x432, uint64(p521Uint1(x449))) var x452 uint64 var x453 uint64 x452, x453 = bits.Add64(x402, x434, uint64(p521Uint1(x451))) var x454 uint64 var x455 uint64 x454, x455 = bits.Add64(x404, x436, uint64(p521Uint1(x453))) var x456 uint64 var x457 uint64 x456, x457 = bits.Add64(x406, x438, uint64(p521Uint1(x455))) var x458 uint64 var x459 uint64 x458, x459 = bits.Add64(x408, x440, uint64(p521Uint1(x457))) var x460 uint64 var x461 uint64 x460, x461 = bits.Add64((uint64(p521Uint1(x409)) + (uint64(p521Uint1(x393)) + (uint64(p521Uint1(x375)) + x343))), x442, uint64(p521Uint1(x459))) var x462 uint64 var x463 uint64 x462, x463 = bits.Add64(x446, arg1[7], uint64(0x0)) var x464 uint64 var x465 uint64 x464, x465 = bits.Add64(x448, uint64(0x0), uint64(p521Uint1(x463))) var x466 uint64 var x467 uint64 x466, x467 = bits.Add64(x450, uint64(0x0), uint64(p521Uint1(x465))) var x468 uint64 var x469 uint64 x468, x469 = bits.Add64(x452, uint64(0x0), uint64(p521Uint1(x467))) var x470 uint64 var x471 uint64 x470, x471 = bits.Add64(x454, uint64(0x0), uint64(p521Uint1(x469))) var x472 uint64 var x473 uint64 x472, x473 = bits.Add64(x456, uint64(0x0), uint64(p521Uint1(x471))) var x474 uint64 var x475 uint64 x474, x475 = bits.Add64(x458, uint64(0x0), uint64(p521Uint1(x473))) var x476 uint64 var x477 uint64 x476, x477 = bits.Add64(x460, uint64(0x0), uint64(p521Uint1(x475))) var x478 uint64 var x479 uint64 x479, x478 = bits.Mul64(x462, 0x1ff) var x480 uint64 var x481 uint64 x481, x480 = bits.Mul64(x462, 0xffffffffffffffff) var x482 uint64 var x483 uint64 x483, x482 = bits.Mul64(x462, 0xffffffffffffffff) var x484 uint64 var x485 uint64 x485, x484 = bits.Mul64(x462, 0xffffffffffffffff) var x486 uint64 var x487 uint64 x487, x486 = bits.Mul64(x462, 0xffffffffffffffff) var x488 uint64 var x489 uint64 x489, x488 = bits.Mul64(x462, 0xffffffffffffffff) var x490 uint64 var x491 uint64 x491, x490 = bits.Mul64(x462, 0xffffffffffffffff) var x492 uint64 var x493 uint64 x493, x492 = bits.Mul64(x462, 0xffffffffffffffff) var x494 uint64 var x495 uint64 x495, x494 = bits.Mul64(x462, 0xffffffffffffffff) var x496 uint64 var x497 uint64 x496, x497 = bits.Add64(x495, x492, uint64(0x0)) var x498 uint64 var x499 uint64 x498, x499 = bits.Add64(x493, x490, uint64(p521Uint1(x497))) var x500 uint64 var x501 uint64 x500, x501 = bits.Add64(x491, x488, uint64(p521Uint1(x499))) var x502 uint64 var x503 uint64 x502, x503 = bits.Add64(x489, x486, uint64(p521Uint1(x501))) var x504 uint64 var x505 uint64 x504, x505 = bits.Add64(x487, x484, uint64(p521Uint1(x503))) var x506 uint64 var x507 uint64 x506, x507 = bits.Add64(x485, x482, uint64(p521Uint1(x505))) var x508 uint64 var x509 uint64 x508, x509 = bits.Add64(x483, x480, uint64(p521Uint1(x507))) var x510 uint64 var x511 uint64 x510, x511 = bits.Add64(x481, x478, uint64(p521Uint1(x509))) var x513 uint64 _, x513 = bits.Add64(x462, x494, uint64(0x0)) var x514 uint64 var x515 uint64 x514, x515 = bits.Add64(x464, x496, uint64(p521Uint1(x513))) var x516 uint64 var x517 uint64 x516, x517 = bits.Add64(x466, x498, uint64(p521Uint1(x515))) var x518 uint64 var x519 uint64 x518, x519 = bits.Add64(x468, x500, uint64(p521Uint1(x517))) var x520 uint64 var x521 uint64 x520, x521 = bits.Add64(x470, x502, uint64(p521Uint1(x519))) var x522 uint64 var x523 uint64 x522, x523 = bits.Add64(x472, x504, uint64(p521Uint1(x521))) var x524 uint64 var x525 uint64 x524, x525 = bits.Add64(x474, x506, uint64(p521Uint1(x523))) var x526 uint64 var x527 uint64 x526, x527 = bits.Add64(x476, x508, uint64(p521Uint1(x525))) var x528 uint64 var x529 uint64 x528, x529 = bits.Add64((uint64(p521Uint1(x477)) + (uint64(p521Uint1(x461)) + (uint64(p521Uint1(x443)) + x411))), x510, uint64(p521Uint1(x527))) var x530 uint64 var x531 uint64 x530, x531 = bits.Add64(x514, arg1[8], uint64(0x0)) var x532 uint64 var x533 uint64 x532, x533 = bits.Add64(x516, uint64(0x0), uint64(p521Uint1(x531))) var x534 uint64 var x535 uint64 x534, x535 = bits.Add64(x518, uint64(0x0), uint64(p521Uint1(x533))) var x536 uint64 var x537 uint64 x536, x537 = bits.Add64(x520, uint64(0x0), uint64(p521Uint1(x535))) var x538 uint64 var x539 uint64 x538, x539 = bits.Add64(x522, uint64(0x0), uint64(p521Uint1(x537))) var x540 uint64 var x541 uint64 x540, x541 = bits.Add64(x524, uint64(0x0), uint64(p521Uint1(x539))) var x542 uint64 var x543 uint64 x542, x543 = bits.Add64(x526, uint64(0x0), uint64(p521Uint1(x541))) var x544 uint64 var x545 uint64 x544, x545 = bits.Add64(x528, uint64(0x0), uint64(p521Uint1(x543))) var x546 uint64 var x547 uint64 x547, x546 = bits.Mul64(x530, 0x1ff) var x548 uint64 var x549 uint64 x549, x548 = bits.Mul64(x530, 0xffffffffffffffff) var x550 uint64 var x551 uint64 x551, x550 = bits.Mul64(x530, 0xffffffffffffffff) var x552 uint64 var x553 uint64 x553, x552 = bits.Mul64(x530, 0xffffffffffffffff) var x554 uint64 var x555 uint64 x555, x554 = bits.Mul64(x530, 0xffffffffffffffff) var x556 uint64 var x557 uint64 x557, x556 = bits.Mul64(x530, 0xffffffffffffffff) var x558 uint64 var x559 uint64 x559, x558 = bits.Mul64(x530, 0xffffffffffffffff) var x560 uint64 var x561 uint64 x561, x560 = bits.Mul64(x530, 0xffffffffffffffff) var x562 uint64 var x563 uint64 x563, x562 = bits.Mul64(x530, 0xffffffffffffffff) var x564 uint64 var x565 uint64 x564, x565 = bits.Add64(x563, x560, uint64(0x0)) var x566 uint64 var x567 uint64 x566, x567 = bits.Add64(x561, x558, uint64(p521Uint1(x565))) var x568 uint64 var x569 uint64 x568, x569 = bits.Add64(x559, x556, uint64(p521Uint1(x567))) var x570 uint64 var x571 uint64 x570, x571 = bits.Add64(x557, x554, uint64(p521Uint1(x569))) var x572 uint64 var x573 uint64 x572, x573 = bits.Add64(x555, x552, uint64(p521Uint1(x571))) var x574 uint64 var x575 uint64 x574, x575 = bits.Add64(x553, x550, uint64(p521Uint1(x573))) var x576 uint64 var x577 uint64 x576, x577 = bits.Add64(x551, x548, uint64(p521Uint1(x575))) var x578 uint64 var x579 uint64 x578, x579 = bits.Add64(x549, x546, uint64(p521Uint1(x577))) var x581 uint64 _, x581 = bits.Add64(x530, x562, uint64(0x0)) var x582 uint64 var x583 uint64 x582, x583 = bits.Add64(x532, x564, uint64(p521Uint1(x581))) var x584 uint64 var x585 uint64 x584, x585 = bits.Add64(x534, x566, uint64(p521Uint1(x583))) var x586 uint64 var x587 uint64 x586, x587 = bits.Add64(x536, x568, uint64(p521Uint1(x585))) var x588 uint64 var x589 uint64 x588, x589 = bits.Add64(x538, x570, uint64(p521Uint1(x587))) var x590 uint64 var x591 uint64 x590, x591 = bits.Add64(x540, x572, uint64(p521Uint1(x589))) var x592 uint64 var x593 uint64 x592, x593 = bits.Add64(x542, x574, uint64(p521Uint1(x591))) var x594 uint64 var x595 uint64 x594, x595 = bits.Add64(x544, x576, uint64(p521Uint1(x593))) var x596 uint64 var x597 uint64 x596, x597 = bits.Add64((uint64(p521Uint1(x545)) + (uint64(p521Uint1(x529)) + (uint64(p521Uint1(x511)) + x479))), x578, uint64(p521Uint1(x595))) x598 := (uint64(p521Uint1(x597)) + (uint64(p521Uint1(x579)) + x547)) var x599 uint64 var x600 uint64 x599, x600 = bits.Sub64(x582, 0xffffffffffffffff, uint64(0x0)) var x601 uint64 var x602 uint64 x601, x602 = bits.Sub64(x584, 0xffffffffffffffff, uint64(p521Uint1(x600))) var x603 uint64 var x604 uint64 x603, x604 = bits.Sub64(x586, 0xffffffffffffffff, uint64(p521Uint1(x602))) var x605 uint64 var x606 uint64 x605, x606 = bits.Sub64(x588, 0xffffffffffffffff, uint64(p521Uint1(x604))) var x607 uint64 var x608 uint64 x607, x608 = bits.Sub64(x590, 0xffffffffffffffff, uint64(p521Uint1(x606))) var x609 uint64 var x610 uint64 x609, x610 = bits.Sub64(x592, 0xffffffffffffffff, uint64(p521Uint1(x608))) var x611 uint64 var x612 uint64 x611, x612 = bits.Sub64(x594, 0xffffffffffffffff, uint64(p521Uint1(x610))) var x613 uint64 var x614 uint64 x613, x614 = bits.Sub64(x596, 0xffffffffffffffff, uint64(p521Uint1(x612))) var x615 uint64 var x616 uint64 x615, x616 = bits.Sub64(x598, 0x1ff, uint64(p521Uint1(x614))) var x618 uint64 _, x618 = bits.Sub64(uint64(0x0), uint64(0x0), uint64(p521Uint1(x616))) var x619 uint64 p521CmovznzU64(&x619, p521Uint1(x618), x599, x582) var x620 uint64 p521CmovznzU64(&x620, p521Uint1(x618), x601, x584) var x621 uint64 p521CmovznzU64(&x621, p521Uint1(x618), x603, x586) var x622 uint64 p521CmovznzU64(&x622, p521Uint1(x618), x605, x588) var x623 uint64 p521CmovznzU64(&x623, p521Uint1(x618), x607, x590) var x624 uint64 p521CmovznzU64(&x624, p521Uint1(x618), x609, x592) var x625 uint64 p521CmovznzU64(&x625, p521Uint1(x618), x611, x594) var x626 uint64 p521CmovznzU64(&x626, p521Uint1(x618), x613, x596) var x627 uint64 p521CmovznzU64(&x627, p521Uint1(x618), x615, x598) out1[0] = x619 out1[1] = x620 out1[2] = x621 out1[3] = x622 out1[4] = x623 out1[5] = x624 out1[6] = x625 out1[7] = x626 out1[8] = x627 } // p521ToMontgomery translates a field element into the Montgomery domain. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // eval (from_montgomery out1) mod m = eval arg1 mod m // 0 ≤ eval out1 < m func p521ToMontgomery(out1 *p521MontgomeryDomainFieldElement, arg1 *p521NonMontgomeryDomainFieldElement) { var x1 uint64 var x2 uint64 x2, x1 = bits.Mul64(arg1[0], 0x400000000000) var x3 uint64 var x4 uint64 x4, x3 = bits.Mul64(arg1[1], 0x400000000000) var x5 uint64 var x6 uint64 x5, x6 = bits.Add64(x2, x3, uint64(0x0)) var x7 uint64 var x8 uint64 x8, x7 = bits.Mul64(x1, 0x1ff) var x9 uint64 var x10 uint64 x10, x9 = bits.Mul64(x1, 0xffffffffffffffff) var x11 uint64 var x12 uint64 x12, x11 = bits.Mul64(x1, 0xffffffffffffffff) var x13 uint64 var x14 uint64 x14, x13 = bits.Mul64(x1, 0xffffffffffffffff) var x15 uint64 var x16 uint64 x16, x15 = bits.Mul64(x1, 0xffffffffffffffff) var x17 uint64 var x18 uint64 x18, x17 = bits.Mul64(x1, 0xffffffffffffffff) var x19 uint64 var x20 uint64 x20, x19 = bits.Mul64(x1, 0xffffffffffffffff) var x21 uint64 var x22 uint64 x22, x21 = bits.Mul64(x1, 0xffffffffffffffff) var x23 uint64 var x24 uint64 x24, x23 = bits.Mul64(x1, 0xffffffffffffffff) var x25 uint64 var x26 uint64 x25, x26 = bits.Add64(x24, x21, uint64(0x0)) var x27 uint64 var x28 uint64 x27, x28 = bits.Add64(x22, x19, uint64(p521Uint1(x26))) var x29 uint64 var x30 uint64 x29, x30 = bits.Add64(x20, x17, uint64(p521Uint1(x28))) var x31 uint64 var x32 uint64 x31, x32 = bits.Add64(x18, x15, uint64(p521Uint1(x30))) var x33 uint64 var x34 uint64 x33, x34 = bits.Add64(x16, x13, uint64(p521Uint1(x32))) var x35 uint64 var x36 uint64 x35, x36 = bits.Add64(x14, x11, uint64(p521Uint1(x34))) var x37 uint64 var x38 uint64 x37, x38 = bits.Add64(x12, x9, uint64(p521Uint1(x36))) var x39 uint64 var x40 uint64 x39, x40 = bits.Add64(x10, x7, uint64(p521Uint1(x38))) var x42 uint64 _, x42 = bits.Add64(x1, x23, uint64(0x0)) var x43 uint64 var x44 uint64 x43, x44 = bits.Add64(x5, x25, uint64(p521Uint1(x42))) var x45 uint64 var x46 uint64 x45, x46 = bits.Add64((uint64(p521Uint1(x6)) + x4), x27, uint64(p521Uint1(x44))) var x47 uint64 var x48 uint64 x47, x48 = bits.Add64(uint64(0x0), x29, uint64(p521Uint1(x46))) var x49 uint64 var x50 uint64 x49, x50 = bits.Add64(uint64(0x0), x31, uint64(p521Uint1(x48))) var x51 uint64 var x52 uint64 x51, x52 = bits.Add64(uint64(0x0), x33, uint64(p521Uint1(x50))) var x53 uint64 var x54 uint64 x53, x54 = bits.Add64(uint64(0x0), x35, uint64(p521Uint1(x52))) var x55 uint64 var x56 uint64 x55, x56 = bits.Add64(uint64(0x0), x37, uint64(p521Uint1(x54))) var x57 uint64 var x58 uint64 x57, x58 = bits.Add64(uint64(0x0), x39, uint64(p521Uint1(x56))) var x59 uint64 var x60 uint64 x60, x59 = bits.Mul64(arg1[2], 0x400000000000) var x61 uint64 var x62 uint64 x61, x62 = bits.Add64(x45, x59, uint64(0x0)) var x63 uint64 var x64 uint64 x63, x64 = bits.Add64(x47, x60, uint64(p521Uint1(x62))) var x65 uint64 var x66 uint64 x65, x66 = bits.Add64(x49, uint64(0x0), uint64(p521Uint1(x64))) var x67 uint64 var x68 uint64 x67, x68 = bits.Add64(x51, uint64(0x0), uint64(p521Uint1(x66))) var x69 uint64 var x70 uint64 x69, x70 = bits.Add64(x53, uint64(0x0), uint64(p521Uint1(x68))) var x71 uint64 var x72 uint64 x71, x72 = bits.Add64(x55, uint64(0x0), uint64(p521Uint1(x70))) var x73 uint64 var x74 uint64 x73, x74 = bits.Add64(x57, uint64(0x0), uint64(p521Uint1(x72))) var x75 uint64 var x76 uint64 x76, x75 = bits.Mul64(x43, 0x1ff) var x77 uint64 var x78 uint64 x78, x77 = bits.Mul64(x43, 0xffffffffffffffff) var x79 uint64 var x80 uint64 x80, x79 = bits.Mul64(x43, 0xffffffffffffffff) var x81 uint64 var x82 uint64 x82, x81 = bits.Mul64(x43, 0xffffffffffffffff) var x83 uint64 var x84 uint64 x84, x83 = bits.Mul64(x43, 0xffffffffffffffff) var x85 uint64 var x86 uint64 x86, x85 = bits.Mul64(x43, 0xffffffffffffffff) var x87 uint64 var x88 uint64 x88, x87 = bits.Mul64(x43, 0xffffffffffffffff) var x89 uint64 var x90 uint64 x90, x89 = bits.Mul64(x43, 0xffffffffffffffff) var x91 uint64 var x92 uint64 x92, x91 = bits.Mul64(x43, 0xffffffffffffffff) var x93 uint64 var x94 uint64 x93, x94 = bits.Add64(x92, x89, uint64(0x0)) var x95 uint64 var x96 uint64 x95, x96 = bits.Add64(x90, x87, uint64(p521Uint1(x94))) var x97 uint64 var x98 uint64 x97, x98 = bits.Add64(x88, x85, uint64(p521Uint1(x96))) var x99 uint64 var x100 uint64 x99, x100 = bits.Add64(x86, x83, uint64(p521Uint1(x98))) var x101 uint64 var x102 uint64 x101, x102 = bits.Add64(x84, x81, uint64(p521Uint1(x100))) var x103 uint64 var x104 uint64 x103, x104 = bits.Add64(x82, x79, uint64(p521Uint1(x102))) var x105 uint64 var x106 uint64 x105, x106 = bits.Add64(x80, x77, uint64(p521Uint1(x104))) var x107 uint64 var x108 uint64 x107, x108 = bits.Add64(x78, x75, uint64(p521Uint1(x106))) var x110 uint64 _, x110 = bits.Add64(x43, x91, uint64(0x0)) var x111 uint64 var x112 uint64 x111, x112 = bits.Add64(x61, x93, uint64(p521Uint1(x110))) var x113 uint64 var x114 uint64 x113, x114 = bits.Add64(x63, x95, uint64(p521Uint1(x112))) var x115 uint64 var x116 uint64 x115, x116 = bits.Add64(x65, x97, uint64(p521Uint1(x114))) var x117 uint64 var x118 uint64 x117, x118 = bits.Add64(x67, x99, uint64(p521Uint1(x116))) var x119 uint64 var x120 uint64 x119, x120 = bits.Add64(x69, x101, uint64(p521Uint1(x118))) var x121 uint64 var x122 uint64 x121, x122 = bits.Add64(x71, x103, uint64(p521Uint1(x120))) var x123 uint64 var x124 uint64 x123, x124 = bits.Add64(x73, x105, uint64(p521Uint1(x122))) var x125 uint64 var x126 uint64 x125, x126 = bits.Add64((uint64(p521Uint1(x74)) + (uint64(p521Uint1(x58)) + (uint64(p521Uint1(x40)) + x8))), x107, uint64(p521Uint1(x124))) var x127 uint64 var x128 uint64 x128, x127 = bits.Mul64(arg1[3], 0x400000000000) var x129 uint64 var x130 uint64 x129, x130 = bits.Add64(x113, x127, uint64(0x0)) var x131 uint64 var x132 uint64 x131, x132 = bits.Add64(x115, x128, uint64(p521Uint1(x130))) var x133 uint64 var x134 uint64 x133, x134 = bits.Add64(x117, uint64(0x0), uint64(p521Uint1(x132))) var x135 uint64 var x136 uint64 x135, x136 = bits.Add64(x119, uint64(0x0), uint64(p521Uint1(x134))) var x137 uint64 var x138 uint64 x137, x138 = bits.Add64(x121, uint64(0x0), uint64(p521Uint1(x136))) var x139 uint64 var x140 uint64 x139, x140 = bits.Add64(x123, uint64(0x0), uint64(p521Uint1(x138))) var x141 uint64 var x142 uint64 x141, x142 = bits.Add64(x125, uint64(0x0), uint64(p521Uint1(x140))) var x143 uint64 var x144 uint64 x144, x143 = bits.Mul64(x111, 0x1ff) var x145 uint64 var x146 uint64 x146, x145 = bits.Mul64(x111, 0xffffffffffffffff) var x147 uint64 var x148 uint64 x148, x147 = bits.Mul64(x111, 0xffffffffffffffff) var x149 uint64 var x150 uint64 x150, x149 = bits.Mul64(x111, 0xffffffffffffffff) var x151 uint64 var x152 uint64 x152, x151 = bits.Mul64(x111, 0xffffffffffffffff) var x153 uint64 var x154 uint64 x154, x153 = bits.Mul64(x111, 0xffffffffffffffff) var x155 uint64 var x156 uint64 x156, x155 = bits.Mul64(x111, 0xffffffffffffffff) var x157 uint64 var x158 uint64 x158, x157 = bits.Mul64(x111, 0xffffffffffffffff) var x159 uint64 var x160 uint64 x160, x159 = bits.Mul64(x111, 0xffffffffffffffff) var x161 uint64 var x162 uint64 x161, x162 = bits.Add64(x160, x157, uint64(0x0)) var x163 uint64 var x164 uint64 x163, x164 = bits.Add64(x158, x155, uint64(p521Uint1(x162))) var x165 uint64 var x166 uint64 x165, x166 = bits.Add64(x156, x153, uint64(p521Uint1(x164))) var x167 uint64 var x168 uint64 x167, x168 = bits.Add64(x154, x151, uint64(p521Uint1(x166))) var x169 uint64 var x170 uint64 x169, x170 = bits.Add64(x152, x149, uint64(p521Uint1(x168))) var x171 uint64 var x172 uint64 x171, x172 = bits.Add64(x150, x147, uint64(p521Uint1(x170))) var x173 uint64 var x174 uint64 x173, x174 = bits.Add64(x148, x145, uint64(p521Uint1(x172))) var x175 uint64 var x176 uint64 x175, x176 = bits.Add64(x146, x143, uint64(p521Uint1(x174))) var x178 uint64 _, x178 = bits.Add64(x111, x159, uint64(0x0)) var x179 uint64 var x180 uint64 x179, x180 = bits.Add64(x129, x161, uint64(p521Uint1(x178))) var x181 uint64 var x182 uint64 x181, x182 = bits.Add64(x131, x163, uint64(p521Uint1(x180))) var x183 uint64 var x184 uint64 x183, x184 = bits.Add64(x133, x165, uint64(p521Uint1(x182))) var x185 uint64 var x186 uint64 x185, x186 = bits.Add64(x135, x167, uint64(p521Uint1(x184))) var x187 uint64 var x188 uint64 x187, x188 = bits.Add64(x137, x169, uint64(p521Uint1(x186))) var x189 uint64 var x190 uint64 x189, x190 = bits.Add64(x139, x171, uint64(p521Uint1(x188))) var x191 uint64 var x192 uint64 x191, x192 = bits.Add64(x141, x173, uint64(p521Uint1(x190))) var x193 uint64 var x194 uint64 x193, x194 = bits.Add64((uint64(p521Uint1(x142)) + (uint64(p521Uint1(x126)) + (uint64(p521Uint1(x108)) + x76))), x175, uint64(p521Uint1(x192))) var x195 uint64 var x196 uint64 x196, x195 = bits.Mul64(arg1[4], 0x400000000000) var x197 uint64 var x198 uint64 x197, x198 = bits.Add64(x181, x195, uint64(0x0)) var x199 uint64 var x200 uint64 x199, x200 = bits.Add64(x183, x196, uint64(p521Uint1(x198))) var x201 uint64 var x202 uint64 x201, x202 = bits.Add64(x185, uint64(0x0), uint64(p521Uint1(x200))) var x203 uint64 var x204 uint64 x203, x204 = bits.Add64(x187, uint64(0x0), uint64(p521Uint1(x202))) var x205 uint64 var x206 uint64 x205, x206 = bits.Add64(x189, uint64(0x0), uint64(p521Uint1(x204))) var x207 uint64 var x208 uint64 x207, x208 = bits.Add64(x191, uint64(0x0), uint64(p521Uint1(x206))) var x209 uint64 var x210 uint64 x209, x210 = bits.Add64(x193, uint64(0x0), uint64(p521Uint1(x208))) var x211 uint64 var x212 uint64 x212, x211 = bits.Mul64(x179, 0x1ff) var x213 uint64 var x214 uint64 x214, x213 = bits.Mul64(x179, 0xffffffffffffffff) var x215 uint64 var x216 uint64 x216, x215 = bits.Mul64(x179, 0xffffffffffffffff) var x217 uint64 var x218 uint64 x218, x217 = bits.Mul64(x179, 0xffffffffffffffff) var x219 uint64 var x220 uint64 x220, x219 = bits.Mul64(x179, 0xffffffffffffffff) var x221 uint64 var x222 uint64 x222, x221 = bits.Mul64(x179, 0xffffffffffffffff) var x223 uint64 var x224 uint64 x224, x223 = bits.Mul64(x179, 0xffffffffffffffff) var x225 uint64 var x226 uint64 x226, x225 = bits.Mul64(x179, 0xffffffffffffffff) var x227 uint64 var x228 uint64 x228, x227 = bits.Mul64(x179, 0xffffffffffffffff) var x229 uint64 var x230 uint64 x229, x230 = bits.Add64(x228, x225, uint64(0x0)) var x231 uint64 var x232 uint64 x231, x232 = bits.Add64(x226, x223, uint64(p521Uint1(x230))) var x233 uint64 var x234 uint64 x233, x234 = bits.Add64(x224, x221, uint64(p521Uint1(x232))) var x235 uint64 var x236 uint64 x235, x236 = bits.Add64(x222, x219, uint64(p521Uint1(x234))) var x237 uint64 var x238 uint64 x237, x238 = bits.Add64(x220, x217, uint64(p521Uint1(x236))) var x239 uint64 var x240 uint64 x239, x240 = bits.Add64(x218, x215, uint64(p521Uint1(x238))) var x241 uint64 var x242 uint64 x241, x242 = bits.Add64(x216, x213, uint64(p521Uint1(x240))) var x243 uint64 var x244 uint64 x243, x244 = bits.Add64(x214, x211, uint64(p521Uint1(x242))) var x246 uint64 _, x246 = bits.Add64(x179, x227, uint64(0x0)) var x247 uint64 var x248 uint64 x247, x248 = bits.Add64(x197, x229, uint64(p521Uint1(x246))) var x249 uint64 var x250 uint64 x249, x250 = bits.Add64(x199, x231, uint64(p521Uint1(x248))) var x251 uint64 var x252 uint64 x251, x252 = bits.Add64(x201, x233, uint64(p521Uint1(x250))) var x253 uint64 var x254 uint64 x253, x254 = bits.Add64(x203, x235, uint64(p521Uint1(x252))) var x255 uint64 var x256 uint64 x255, x256 = bits.Add64(x205, x237, uint64(p521Uint1(x254))) var x257 uint64 var x258 uint64 x257, x258 = bits.Add64(x207, x239, uint64(p521Uint1(x256))) var x259 uint64 var x260 uint64 x259, x260 = bits.Add64(x209, x241, uint64(p521Uint1(x258))) var x261 uint64 var x262 uint64 x261, x262 = bits.Add64((uint64(p521Uint1(x210)) + (uint64(p521Uint1(x194)) + (uint64(p521Uint1(x176)) + x144))), x243, uint64(p521Uint1(x260))) var x263 uint64 var x264 uint64 x264, x263 = bits.Mul64(arg1[5], 0x400000000000) var x265 uint64 var x266 uint64 x265, x266 = bits.Add64(x249, x263, uint64(0x0)) var x267 uint64 var x268 uint64 x267, x268 = bits.Add64(x251, x264, uint64(p521Uint1(x266))) var x269 uint64 var x270 uint64 x269, x270 = bits.Add64(x253, uint64(0x0), uint64(p521Uint1(x268))) var x271 uint64 var x272 uint64 x271, x272 = bits.Add64(x255, uint64(0x0), uint64(p521Uint1(x270))) var x273 uint64 var x274 uint64 x273, x274 = bits.Add64(x257, uint64(0x0), uint64(p521Uint1(x272))) var x275 uint64 var x276 uint64 x275, x276 = bits.Add64(x259, uint64(0x0), uint64(p521Uint1(x274))) var x277 uint64 var x278 uint64 x277, x278 = bits.Add64(x261, uint64(0x0), uint64(p521Uint1(x276))) var x279 uint64 var x280 uint64 x280, x279 = bits.Mul64(x247, 0x1ff) var x281 uint64 var x282 uint64 x282, x281 = bits.Mul64(x247, 0xffffffffffffffff) var x283 uint64 var x284 uint64 x284, x283 = bits.Mul64(x247, 0xffffffffffffffff) var x285 uint64 var x286 uint64 x286, x285 = bits.Mul64(x247, 0xffffffffffffffff) var x287 uint64 var x288 uint64 x288, x287 = bits.Mul64(x247, 0xffffffffffffffff) var x289 uint64 var x290 uint64 x290, x289 = bits.Mul64(x247, 0xffffffffffffffff) var x291 uint64 var x292 uint64 x292, x291 = bits.Mul64(x247, 0xffffffffffffffff) var x293 uint64 var x294 uint64 x294, x293 = bits.Mul64(x247, 0xffffffffffffffff) var x295 uint64 var x296 uint64 x296, x295 = bits.Mul64(x247, 0xffffffffffffffff) var x297 uint64 var x298 uint64 x297, x298 = bits.Add64(x296, x293, uint64(0x0)) var x299 uint64 var x300 uint64 x299, x300 = bits.Add64(x294, x291, uint64(p521Uint1(x298))) var x301 uint64 var x302 uint64 x301, x302 = bits.Add64(x292, x289, uint64(p521Uint1(x300))) var x303 uint64 var x304 uint64 x303, x304 = bits.Add64(x290, x287, uint64(p521Uint1(x302))) var x305 uint64 var x306 uint64 x305, x306 = bits.Add64(x288, x285, uint64(p521Uint1(x304))) var x307 uint64 var x308 uint64 x307, x308 = bits.Add64(x286, x283, uint64(p521Uint1(x306))) var x309 uint64 var x310 uint64 x309, x310 = bits.Add64(x284, x281, uint64(p521Uint1(x308))) var x311 uint64 var x312 uint64 x311, x312 = bits.Add64(x282, x279, uint64(p521Uint1(x310))) var x314 uint64 _, x314 = bits.Add64(x247, x295, uint64(0x0)) var x315 uint64 var x316 uint64 x315, x316 = bits.Add64(x265, x297, uint64(p521Uint1(x314))) var x317 uint64 var x318 uint64 x317, x318 = bits.Add64(x267, x299, uint64(p521Uint1(x316))) var x319 uint64 var x320 uint64 x319, x320 = bits.Add64(x269, x301, uint64(p521Uint1(x318))) var x321 uint64 var x322 uint64 x321, x322 = bits.Add64(x271, x303, uint64(p521Uint1(x320))) var x323 uint64 var x324 uint64 x323, x324 = bits.Add64(x273, x305, uint64(p521Uint1(x322))) var x325 uint64 var x326 uint64 x325, x326 = bits.Add64(x275, x307, uint64(p521Uint1(x324))) var x327 uint64 var x328 uint64 x327, x328 = bits.Add64(x277, x309, uint64(p521Uint1(x326))) var x329 uint64 var x330 uint64 x329, x330 = bits.Add64((uint64(p521Uint1(x278)) + (uint64(p521Uint1(x262)) + (uint64(p521Uint1(x244)) + x212))), x311, uint64(p521Uint1(x328))) var x331 uint64 var x332 uint64 x332, x331 = bits.Mul64(arg1[6], 0x400000000000) var x333 uint64 var x334 uint64 x333, x334 = bits.Add64(x317, x331, uint64(0x0)) var x335 uint64 var x336 uint64 x335, x336 = bits.Add64(x319, x332, uint64(p521Uint1(x334))) var x337 uint64 var x338 uint64 x337, x338 = bits.Add64(x321, uint64(0x0), uint64(p521Uint1(x336))) var x339 uint64 var x340 uint64 x339, x340 = bits.Add64(x323, uint64(0x0), uint64(p521Uint1(x338))) var x341 uint64 var x342 uint64 x341, x342 = bits.Add64(x325, uint64(0x0), uint64(p521Uint1(x340))) var x343 uint64 var x344 uint64 x343, x344 = bits.Add64(x327, uint64(0x0), uint64(p521Uint1(x342))) var x345 uint64 var x346 uint64 x345, x346 = bits.Add64(x329, uint64(0x0), uint64(p521Uint1(x344))) var x347 uint64 var x348 uint64 x348, x347 = bits.Mul64(x315, 0x1ff) var x349 uint64 var x350 uint64 x350, x349 = bits.Mul64(x315, 0xffffffffffffffff) var x351 uint64 var x352 uint64 x352, x351 = bits.Mul64(x315, 0xffffffffffffffff) var x353 uint64 var x354 uint64 x354, x353 = bits.Mul64(x315, 0xffffffffffffffff) var x355 uint64 var x356 uint64 x356, x355 = bits.Mul64(x315, 0xffffffffffffffff) var x357 uint64 var x358 uint64 x358, x357 = bits.Mul64(x315, 0xffffffffffffffff) var x359 uint64 var x360 uint64 x360, x359 = bits.Mul64(x315, 0xffffffffffffffff) var x361 uint64 var x362 uint64 x362, x361 = bits.Mul64(x315, 0xffffffffffffffff) var x363 uint64 var x364 uint64 x364, x363 = bits.Mul64(x315, 0xffffffffffffffff) var x365 uint64 var x366 uint64 x365, x366 = bits.Add64(x364, x361, uint64(0x0)) var x367 uint64 var x368 uint64 x367, x368 = bits.Add64(x362, x359, uint64(p521Uint1(x366))) var x369 uint64 var x370 uint64 x369, x370 = bits.Add64(x360, x357, uint64(p521Uint1(x368))) var x371 uint64 var x372 uint64 x371, x372 = bits.Add64(x358, x355, uint64(p521Uint1(x370))) var x373 uint64 var x374 uint64 x373, x374 = bits.Add64(x356, x353, uint64(p521Uint1(x372))) var x375 uint64 var x376 uint64 x375, x376 = bits.Add64(x354, x351, uint64(p521Uint1(x374))) var x377 uint64 var x378 uint64 x377, x378 = bits.Add64(x352, x349, uint64(p521Uint1(x376))) var x379 uint64 var x380 uint64 x379, x380 = bits.Add64(x350, x347, uint64(p521Uint1(x378))) var x382 uint64 _, x382 = bits.Add64(x315, x363, uint64(0x0)) var x383 uint64 var x384 uint64 x383, x384 = bits.Add64(x333, x365, uint64(p521Uint1(x382))) var x385 uint64 var x386 uint64 x385, x386 = bits.Add64(x335, x367, uint64(p521Uint1(x384))) var x387 uint64 var x388 uint64 x387, x388 = bits.Add64(x337, x369, uint64(p521Uint1(x386))) var x389 uint64 var x390 uint64 x389, x390 = bits.Add64(x339, x371, uint64(p521Uint1(x388))) var x391 uint64 var x392 uint64 x391, x392 = bits.Add64(x341, x373, uint64(p521Uint1(x390))) var x393 uint64 var x394 uint64 x393, x394 = bits.Add64(x343, x375, uint64(p521Uint1(x392))) var x395 uint64 var x396 uint64 x395, x396 = bits.Add64(x345, x377, uint64(p521Uint1(x394))) var x397 uint64 var x398 uint64 x397, x398 = bits.Add64((uint64(p521Uint1(x346)) + (uint64(p521Uint1(x330)) + (uint64(p521Uint1(x312)) + x280))), x379, uint64(p521Uint1(x396))) var x399 uint64 var x400 uint64 x400, x399 = bits.Mul64(arg1[7], 0x400000000000) var x401 uint64 var x402 uint64 x401, x402 = bits.Add64(x385, x399, uint64(0x0)) var x403 uint64 var x404 uint64 x403, x404 = bits.Add64(x387, x400, uint64(p521Uint1(x402))) var x405 uint64 var x406 uint64 x405, x406 = bits.Add64(x389, uint64(0x0), uint64(p521Uint1(x404))) var x407 uint64 var x408 uint64 x407, x408 = bits.Add64(x391, uint64(0x0), uint64(p521Uint1(x406))) var x409 uint64 var x410 uint64 x409, x410 = bits.Add64(x393, uint64(0x0), uint64(p521Uint1(x408))) var x411 uint64 var x412 uint64 x411, x412 = bits.Add64(x395, uint64(0x0), uint64(p521Uint1(x410))) var x413 uint64 var x414 uint64 x413, x414 = bits.Add64(x397, uint64(0x0), uint64(p521Uint1(x412))) var x415 uint64 var x416 uint64 x416, x415 = bits.Mul64(x383, 0x1ff) var x417 uint64 var x418 uint64 x418, x417 = bits.Mul64(x383, 0xffffffffffffffff) var x419 uint64 var x420 uint64 x420, x419 = bits.Mul64(x383, 0xffffffffffffffff) var x421 uint64 var x422 uint64 x422, x421 = bits.Mul64(x383, 0xffffffffffffffff) var x423 uint64 var x424 uint64 x424, x423 = bits.Mul64(x383, 0xffffffffffffffff) var x425 uint64 var x426 uint64 x426, x425 = bits.Mul64(x383, 0xffffffffffffffff) var x427 uint64 var x428 uint64 x428, x427 = bits.Mul64(x383, 0xffffffffffffffff) var x429 uint64 var x430 uint64 x430, x429 = bits.Mul64(x383, 0xffffffffffffffff) var x431 uint64 var x432 uint64 x432, x431 = bits.Mul64(x383, 0xffffffffffffffff) var x433 uint64 var x434 uint64 x433, x434 = bits.Add64(x432, x429, uint64(0x0)) var x435 uint64 var x436 uint64 x435, x436 = bits.Add64(x430, x427, uint64(p521Uint1(x434))) var x437 uint64 var x438 uint64 x437, x438 = bits.Add64(x428, x425, uint64(p521Uint1(x436))) var x439 uint64 var x440 uint64 x439, x440 = bits.Add64(x426, x423, uint64(p521Uint1(x438))) var x441 uint64 var x442 uint64 x441, x442 = bits.Add64(x424, x421, uint64(p521Uint1(x440))) var x443 uint64 var x444 uint64 x443, x444 = bits.Add64(x422, x419, uint64(p521Uint1(x442))) var x445 uint64 var x446 uint64 x445, x446 = bits.Add64(x420, x417, uint64(p521Uint1(x444))) var x447 uint64 var x448 uint64 x447, x448 = bits.Add64(x418, x415, uint64(p521Uint1(x446))) var x450 uint64 _, x450 = bits.Add64(x383, x431, uint64(0x0)) var x451 uint64 var x452 uint64 x451, x452 = bits.Add64(x401, x433, uint64(p521Uint1(x450))) var x453 uint64 var x454 uint64 x453, x454 = bits.Add64(x403, x435, uint64(p521Uint1(x452))) var x455 uint64 var x456 uint64 x455, x456 = bits.Add64(x405, x437, uint64(p521Uint1(x454))) var x457 uint64 var x458 uint64 x457, x458 = bits.Add64(x407, x439, uint64(p521Uint1(x456))) var x459 uint64 var x460 uint64 x459, x460 = bits.Add64(x409, x441, uint64(p521Uint1(x458))) var x461 uint64 var x462 uint64 x461, x462 = bits.Add64(x411, x443, uint64(p521Uint1(x460))) var x463 uint64 var x464 uint64 x463, x464 = bits.Add64(x413, x445, uint64(p521Uint1(x462))) var x465 uint64 var x466 uint64 x465, x466 = bits.Add64((uint64(p521Uint1(x414)) + (uint64(p521Uint1(x398)) + (uint64(p521Uint1(x380)) + x348))), x447, uint64(p521Uint1(x464))) var x467 uint64 var x468 uint64 x468, x467 = bits.Mul64(arg1[8], 0x400000000000) var x469 uint64 var x470 uint64 x469, x470 = bits.Add64(x453, x467, uint64(0x0)) var x471 uint64 var x472 uint64 x471, x472 = bits.Add64(x455, x468, uint64(p521Uint1(x470))) var x473 uint64 var x474 uint64 x473, x474 = bits.Add64(x457, uint64(0x0), uint64(p521Uint1(x472))) var x475 uint64 var x476 uint64 x475, x476 = bits.Add64(x459, uint64(0x0), uint64(p521Uint1(x474))) var x477 uint64 var x478 uint64 x477, x478 = bits.Add64(x461, uint64(0x0), uint64(p521Uint1(x476))) var x479 uint64 var x480 uint64 x479, x480 = bits.Add64(x463, uint64(0x0), uint64(p521Uint1(x478))) var x481 uint64 var x482 uint64 x481, x482 = bits.Add64(x465, uint64(0x0), uint64(p521Uint1(x480))) var x483 uint64 var x484 uint64 x484, x483 = bits.Mul64(x451, 0x1ff) var x485 uint64 var x486 uint64 x486, x485 = bits.Mul64(x451, 0xffffffffffffffff) var x487 uint64 var x488 uint64 x488, x487 = bits.Mul64(x451, 0xffffffffffffffff) var x489 uint64 var x490 uint64 x490, x489 = bits.Mul64(x451, 0xffffffffffffffff) var x491 uint64 var x492 uint64 x492, x491 = bits.Mul64(x451, 0xffffffffffffffff) var x493 uint64 var x494 uint64 x494, x493 = bits.Mul64(x451, 0xffffffffffffffff) var x495 uint64 var x496 uint64 x496, x495 = bits.Mul64(x451, 0xffffffffffffffff) var x497 uint64 var x498 uint64 x498, x497 = bits.Mul64(x451, 0xffffffffffffffff) var x499 uint64 var x500 uint64 x500, x499 = bits.Mul64(x451, 0xffffffffffffffff) var x501 uint64 var x502 uint64 x501, x502 = bits.Add64(x500, x497, uint64(0x0)) var x503 uint64 var x504 uint64 x503, x504 = bits.Add64(x498, x495, uint64(p521Uint1(x502))) var x505 uint64 var x506 uint64 x505, x506 = bits.Add64(x496, x493, uint64(p521Uint1(x504))) var x507 uint64 var x508 uint64 x507, x508 = bits.Add64(x494, x491, uint64(p521Uint1(x506))) var x509 uint64 var x510 uint64 x509, x510 = bits.Add64(x492, x489, uint64(p521Uint1(x508))) var x511 uint64 var x512 uint64 x511, x512 = bits.Add64(x490, x487, uint64(p521Uint1(x510))) var x513 uint64 var x514 uint64 x513, x514 = bits.Add64(x488, x485, uint64(p521Uint1(x512))) var x515 uint64 var x516 uint64 x515, x516 = bits.Add64(x486, x483, uint64(p521Uint1(x514))) var x518 uint64 _, x518 = bits.Add64(x451, x499, uint64(0x0)) var x519 uint64 var x520 uint64 x519, x520 = bits.Add64(x469, x501, uint64(p521Uint1(x518))) var x521 uint64 var x522 uint64 x521, x522 = bits.Add64(x471, x503, uint64(p521Uint1(x520))) var x523 uint64 var x524 uint64 x523, x524 = bits.Add64(x473, x505, uint64(p521Uint1(x522))) var x525 uint64 var x526 uint64 x525, x526 = bits.Add64(x475, x507, uint64(p521Uint1(x524))) var x527 uint64 var x528 uint64 x527, x528 = bits.Add64(x477, x509, uint64(p521Uint1(x526))) var x529 uint64 var x530 uint64 x529, x530 = bits.Add64(x479, x511, uint64(p521Uint1(x528))) var x531 uint64 var x532 uint64 x531, x532 = bits.Add64(x481, x513, uint64(p521Uint1(x530))) var x533 uint64 var x534 uint64 x533, x534 = bits.Add64((uint64(p521Uint1(x482)) + (uint64(p521Uint1(x466)) + (uint64(p521Uint1(x448)) + x416))), x515, uint64(p521Uint1(x532))) x535 := (uint64(p521Uint1(x534)) + (uint64(p521Uint1(x516)) + x484)) var x536 uint64 var x537 uint64 x536, x537 = bits.Sub64(x519, 0xffffffffffffffff, uint64(0x0)) var x538 uint64 var x539 uint64 x538, x539 = bits.Sub64(x521, 0xffffffffffffffff, uint64(p521Uint1(x537))) var x540 uint64 var x541 uint64 x540, x541 = bits.Sub64(x523, 0xffffffffffffffff, uint64(p521Uint1(x539))) var x542 uint64 var x543 uint64 x542, x543 = bits.Sub64(x525, 0xffffffffffffffff, uint64(p521Uint1(x541))) var x544 uint64 var x545 uint64 x544, x545 = bits.Sub64(x527, 0xffffffffffffffff, uint64(p521Uint1(x543))) var x546 uint64 var x547 uint64 x546, x547 = bits.Sub64(x529, 0xffffffffffffffff, uint64(p521Uint1(x545))) var x548 uint64 var x549 uint64 x548, x549 = bits.Sub64(x531, 0xffffffffffffffff, uint64(p521Uint1(x547))) var x550 uint64 var x551 uint64 x550, x551 = bits.Sub64(x533, 0xffffffffffffffff, uint64(p521Uint1(x549))) var x552 uint64 var x553 uint64 x552, x553 = bits.Sub64(x535, 0x1ff, uint64(p521Uint1(x551))) var x555 uint64 _, x555 = bits.Sub64(uint64(0x0), uint64(0x0), uint64(p521Uint1(x553))) var x556 uint64 p521CmovznzU64(&x556, p521Uint1(x555), x536, x519) var x557 uint64 p521CmovznzU64(&x557, p521Uint1(x555), x538, x521) var x558 uint64 p521CmovznzU64(&x558, p521Uint1(x555), x540, x523) var x559 uint64 p521CmovznzU64(&x559, p521Uint1(x555), x542, x525) var x560 uint64 p521CmovznzU64(&x560, p521Uint1(x555), x544, x527) var x561 uint64 p521CmovznzU64(&x561, p521Uint1(x555), x546, x529) var x562 uint64 p521CmovznzU64(&x562, p521Uint1(x555), x548, x531) var x563 uint64 p521CmovznzU64(&x563, p521Uint1(x555), x550, x533) var x564 uint64 p521CmovznzU64(&x564, p521Uint1(x555), x552, x535) out1[0] = x556 out1[1] = x557 out1[2] = x558 out1[3] = x559 out1[4] = x560 out1[5] = x561 out1[6] = x562 out1[7] = x563 out1[8] = x564 } // p521Selectznz is a multi-limb conditional select. // // Postconditions: // // eval out1 = (if arg1 = 0 then eval arg2 else eval arg3) // // Input Bounds: // // arg1: [0x0 ~> 0x1] // arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] // // Output Bounds: // // out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] func p521Selectznz(out1 *[9]uint64, arg1 p521Uint1, arg2 *[9]uint64, arg3 *[9]uint64) { var x1 uint64 p521CmovznzU64(&x1, arg1, arg2[0], arg3[0]) var x2 uint64 p521CmovznzU64(&x2, arg1, arg2[1], arg3[1]) var x3 uint64 p521CmovznzU64(&x3, arg1, arg2[2], arg3[2]) var x4 uint64 p521CmovznzU64(&x4, arg1, arg2[3], arg3[3]) var x5 uint64 p521CmovznzU64(&x5, arg1, arg2[4], arg3[4]) var x6 uint64 p521CmovznzU64(&x6, arg1, arg2[5], arg3[5]) var x7 uint64 p521CmovznzU64(&x7, arg1, arg2[6], arg3[6]) var x8 uint64 p521CmovznzU64(&x8, arg1, arg2[7], arg3[7]) var x9 uint64 p521CmovznzU64(&x9, arg1, arg2[8], arg3[8]) out1[0] = x1 out1[1] = x2 out1[2] = x3 out1[3] = x4 out1[4] = x5 out1[5] = x6 out1[6] = x7 out1[7] = x8 out1[8] = x9 } // p521ToBytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. // // Preconditions: // // 0 ≤ eval arg1 < m // // Postconditions: // // out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..65] // // Input Bounds: // // arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x1ff]] // // Output Bounds: // // out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x1]] func p521ToBytes(out1 *[66]uint8, arg1 *[9]uint64) { x1 := arg1[8] x2 := arg1[7] x3 := arg1[6] x4 := arg1[5] x5 := arg1[4] x6 := arg1[3] x7 := arg1[2] x8 := arg1[1] x9 := arg1[0] x10 := (uint8(x9) & 0xff) x11 := (x9 >> 8) x12 := (uint8(x11) & 0xff) x13 := (x11 >> 8) x14 := (uint8(x13) & 0xff) x15 := (x13 >> 8) x16 := (uint8(x15) & 0xff) x17 := (x15 >> 8) x18 := (uint8(x17) & 0xff) x19 := (x17 >> 8) x20 := (uint8(x19) & 0xff) x21 := (x19 >> 8) x22 := (uint8(x21) & 0xff) x23 := uint8((x21 >> 8)) x24 := (uint8(x8) & 0xff) x25 := (x8 >> 8) x26 := (uint8(x25) & 0xff) x27 := (x25 >> 8) x28 := (uint8(x27) & 0xff) x29 := (x27 >> 8) x30 := (uint8(x29) & 0xff) x31 := (x29 >> 8) x32 := (uint8(x31) & 0xff) x33 := (x31 >> 8) x34 := (uint8(x33) & 0xff) x35 := (x33 >> 8) x36 := (uint8(x35) & 0xff) x37 := uint8((x35 >> 8)) x38 := (uint8(x7) & 0xff) x39 := (x7 >> 8) x40 := (uint8(x39) & 0xff) x41 := (x39 >> 8) x42 := (uint8(x41) & 0xff) x43 := (x41 >> 8) x44 := (uint8(x43) & 0xff) x45 := (x43 >> 8) x46 := (uint8(x45) & 0xff) x47 := (x45 >> 8) x48 := (uint8(x47) & 0xff) x49 := (x47 >> 8) x50 := (uint8(x49) & 0xff) x51 := uint8((x49 >> 8)) x52 := (uint8(x6) & 0xff) x53 := (x6 >> 8) x54 := (uint8(x53) & 0xff) x55 := (x53 >> 8) x56 := (uint8(x55) & 0xff) x57 := (x55 >> 8) x58 := (uint8(x57) & 0xff) x59 := (x57 >> 8) x60 := (uint8(x59) & 0xff) x61 := (x59 >> 8) x62 := (uint8(x61) & 0xff) x63 := (x61 >> 8) x64 := (uint8(x63) & 0xff) x65 := uint8((x63 >> 8)) x66 := (uint8(x5) & 0xff) x67 := (x5 >> 8) x68 := (uint8(x67) & 0xff) x69 := (x67 >> 8) x70 := (uint8(x69) & 0xff) x71 := (x69 >> 8) x72 := (uint8(x71) & 0xff) x73 := (x71 >> 8) x74 := (uint8(x73) & 0xff) x75 := (x73 >> 8) x76 := (uint8(x75) & 0xff) x77 := (x75 >> 8) x78 := (uint8(x77) & 0xff) x79 := uint8((x77 >> 8)) x80 := (uint8(x4) & 0xff) x81 := (x4 >> 8) x82 := (uint8(x81) & 0xff) x83 := (x81 >> 8) x84 := (uint8(x83) & 0xff) x85 := (x83 >> 8) x86 := (uint8(x85) & 0xff) x87 := (x85 >> 8) x88 := (uint8(x87) & 0xff) x89 := (x87 >> 8) x90 := (uint8(x89) & 0xff) x91 := (x89 >> 8) x92 := (uint8(x91) & 0xff) x93 := uint8((x91 >> 8)) x94 := (uint8(x3) & 0xff) x95 := (x3 >> 8) x96 := (uint8(x95) & 0xff) x97 := (x95 >> 8) x98 := (uint8(x97) & 0xff) x99 := (x97 >> 8) x100 := (uint8(x99) & 0xff) x101 := (x99 >> 8) x102 := (uint8(x101) & 0xff) x103 := (x101 >> 8) x104 := (uint8(x103) & 0xff) x105 := (x103 >> 8) x106 := (uint8(x105) & 0xff) x107 := uint8((x105 >> 8)) x108 := (uint8(x2) & 0xff) x109 := (x2 >> 8) x110 := (uint8(x109) & 0xff) x111 := (x109 >> 8) x112 := (uint8(x111) & 0xff) x113 := (x111 >> 8) x114 := (uint8(x113) & 0xff) x115 := (x113 >> 8) x116 := (uint8(x115) & 0xff) x117 := (x115 >> 8) x118 := (uint8(x117) & 0xff) x119 := (x117 >> 8) x120 := (uint8(x119) & 0xff) x121 := uint8((x119 >> 8)) x122 := (uint8(x1) & 0xff) x123 := p521Uint1((x1 >> 8)) out1[0] = x10 out1[1] = x12 out1[2] = x14 out1[3] = x16 out1[4] = x18 out1[5] = x20 out1[6] = x22 out1[7] = x23 out1[8] = x24 out1[9] = x26 out1[10] = x28 out1[11] = x30 out1[12] = x32 out1[13] = x34 out1[14] = x36 out1[15] = x37 out1[16] = x38 out1[17] = x40 out1[18] = x42 out1[19] = x44 out1[20] = x46 out1[21] = x48 out1[22] = x50 out1[23] = x51 out1[24] = x52 out1[25] = x54 out1[26] = x56 out1[27] = x58 out1[28] = x60 out1[29] = x62 out1[30] = x64 out1[31] = x65 out1[32] = x66 out1[33] = x68 out1[34] = x70 out1[35] = x72 out1[36] = x74 out1[37] = x76 out1[38] = x78 out1[39] = x79 out1[40] = x80 out1[41] = x82 out1[42] = x84 out1[43] = x86 out1[44] = x88 out1[45] = x90 out1[46] = x92 out1[47] = x93 out1[48] = x94 out1[49] = x96 out1[50] = x98 out1[51] = x100 out1[52] = x102 out1[53] = x104 out1[54] = x106 out1[55] = x107 out1[56] = x108 out1[57] = x110 out1[58] = x112 out1[59] = x114 out1[60] = x116 out1[61] = x118 out1[62] = x120 out1[63] = x121 out1[64] = x122 out1[65] = uint8(x123) } // p521FromBytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. // // Preconditions: // // 0 ≤ bytes_eval arg1 < m // // Postconditions: // // eval out1 mod m = bytes_eval arg1 mod m // 0 ≤ eval out1 < m // // Input Bounds: // // arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x1]] // // Output Bounds: // // out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x1ff]] func p521FromBytes(out1 *[9]uint64, arg1 *[66]uint8) { x1 := (uint64(p521Uint1(arg1[65])) << 8) x2 := arg1[64] x3 := (uint64(arg1[63]) << 56) x4 := (uint64(arg1[62]) << 48) x5 := (uint64(arg1[61]) << 40) x6 := (uint64(arg1[60]) << 32) x7 := (uint64(arg1[59]) << 24) x8 := (uint64(arg1[58]) << 16) x9 := (uint64(arg1[57]) << 8) x10 := arg1[56] x11 := (uint64(arg1[55]) << 56) x12 := (uint64(arg1[54]) << 48) x13 := (uint64(arg1[53]) << 40) x14 := (uint64(arg1[52]) << 32) x15 := (uint64(arg1[51]) << 24) x16 := (uint64(arg1[50]) << 16) x17 := (uint64(arg1[49]) << 8) x18 := arg1[48] x19 := (uint64(arg1[47]) << 56) x20 := (uint64(arg1[46]) << 48) x21 := (uint64(arg1[45]) << 40) x22 := (uint64(arg1[44]) << 32) x23 := (uint64(arg1[43]) << 24) x24 := (uint64(arg1[42]) << 16) x25 := (uint64(arg1[41]) << 8) x26 := arg1[40] x27 := (uint64(arg1[39]) << 56) x28 := (uint64(arg1[38]) << 48) x29 := (uint64(arg1[37]) << 40) x30 := (uint64(arg1[36]) << 32) x31 := (uint64(arg1[35]) << 24) x32 := (uint64(arg1[34]) << 16) x33 := (uint64(arg1[33]) << 8) x34 := arg1[32] x35 := (uint64(arg1[31]) << 56) x36 := (uint64(arg1[30]) << 48) x37 := (uint64(arg1[29]) << 40) x38 := (uint64(arg1[28]) << 32) x39 := (uint64(arg1[27]) << 24) x40 := (uint64(arg1[26]) << 16) x41 := (uint64(arg1[25]) << 8) x42 := arg1[24] x43 := (uint64(arg1[23]) << 56) x44 := (uint64(arg1[22]) << 48) x45 := (uint64(arg1[21]) << 40) x46 := (uint64(arg1[20]) << 32) x47 := (uint64(arg1[19]) << 24) x48 := (uint64(arg1[18]) << 16) x49 := (uint64(arg1[17]) << 8) x50 := arg1[16] x51 := (uint64(arg1[15]) << 56) x52 := (uint64(arg1[14]) << 48) x53 := (uint64(arg1[13]) << 40) x54 := (uint64(arg1[12]) << 32) x55 := (uint64(arg1[11]) << 24) x56 := (uint64(arg1[10]) << 16) x57 := (uint64(arg1[9]) << 8) x58 := arg1[8] x59 := (uint64(arg1[7]) << 56) x60 := (uint64(arg1[6]) << 48) x61 := (uint64(arg1[5]) << 40) x62 := (uint64(arg1[4]) << 32) x63 := (uint64(arg1[3]) << 24) x64 := (uint64(arg1[2]) << 16) x65 := (uint64(arg1[1]) << 8) x66 := arg1[0] x67 := (x65 + uint64(x66)) x68 := (x64 + x67) x69 := (x63 + x68) x70 := (x62 + x69) x71 := (x61 + x70) x72 := (x60 + x71) x73 := (x59 + x72) x74 := (x57 + uint64(x58)) x75 := (x56 + x74) x76 := (x55 + x75) x77 := (x54 + x76) x78 := (x53 + x77) x79 := (x52 + x78) x80 := (x51 + x79) x81 := (x49 + uint64(x50)) x82 := (x48 + x81) x83 := (x47 + x82) x84 := (x46 + x83) x85 := (x45 + x84) x86 := (x44 + x85) x87 := (x43 + x86) x88 := (x41 + uint64(x42)) x89 := (x40 + x88) x90 := (x39 + x89) x91 := (x38 + x90) x92 := (x37 + x91) x93 := (x36 + x92) x94 := (x35 + x93) x95 := (x33 + uint64(x34)) x96 := (x32 + x95) x97 := (x31 + x96) x98 := (x30 + x97) x99 := (x29 + x98) x100 := (x28 + x99) x101 := (x27 + x100) x102 := (x25 + uint64(x26)) x103 := (x24 + x102) x104 := (x23 + x103) x105 := (x22 + x104) x106 := (x21 + x105) x107 := (x20 + x106) x108 := (x19 + x107) x109 := (x17 + uint64(x18)) x110 := (x16 + x109) x111 := (x15 + x110) x112 := (x14 + x111) x113 := (x13 + x112) x114 := (x12 + x113) x115 := (x11 + x114) x116 := (x9 + uint64(x10)) x117 := (x8 + x116) x118 := (x7 + x117) x119 := (x6 + x118) x120 := (x5 + x119) x121 := (x4 + x120) x122 := (x3 + x121) x123 := (x1 + uint64(x2)) out1[0] = x73 out1[1] = x80 out1[2] = x87 out1[3] = x94 out1[4] = x101 out1[5] = x108 out1[6] = x115 out1[7] = x122 out1[8] = x123 } golang-filippo-nistec-0.0.4/internal/fiat/p521_invert.go000066400000000000000000000035211512422514700230550ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by addchain. DO NOT EDIT. package fiat // Invert sets e = 1/x, and returns e. // // If x == 0, Invert returns e = 0. func (e *P521Element) Invert(x *P521Element) *P521Element { // Inversion is implemented as exponentiation with exponent p − 2. // The sequence of 13 multiplications and 520 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain v0.4.0. // // _10 = 2*1 // _11 = 1 + _10 // _1100 = _11 << 2 // _1111 = _11 + _1100 // _11110000 = _1111 << 4 // _11111111 = _1111 + _11110000 // x16 = _11111111 << 8 + _11111111 // x32 = x16 << 16 + x16 // x64 = x32 << 32 + x32 // x65 = 2*x64 + 1 // x129 = x65 << 64 + x64 // x130 = 2*x129 + 1 // x259 = x130 << 129 + x129 // x260 = 2*x259 + 1 // x519 = x260 << 259 + x259 // return x519 << 2 + 1 // var z = new(P521Element).Set(e) var t0 = new(P521Element) z.Square(x) z.Mul(x, z) t0.Square(z) for s := 1; s < 2; s++ { t0.Square(t0) } z.Mul(z, t0) t0.Square(z) for s := 1; s < 4; s++ { t0.Square(t0) } z.Mul(z, t0) t0.Square(z) for s := 1; s < 8; s++ { t0.Square(t0) } z.Mul(z, t0) t0.Square(z) for s := 1; s < 16; s++ { t0.Square(t0) } z.Mul(z, t0) t0.Square(z) for s := 1; s < 32; s++ { t0.Square(t0) } z.Mul(z, t0) t0.Square(z) t0.Mul(x, t0) for s := 0; s < 64; s++ { t0.Square(t0) } z.Mul(z, t0) t0.Square(z) t0.Mul(x, t0) for s := 0; s < 129; s++ { t0.Square(t0) } z.Mul(z, t0) t0.Square(z) t0.Mul(x, t0) for s := 0; s < 259; s++ { t0.Square(t0) } z.Mul(z, t0) for s := 0; s < 2; s++ { z.Square(z) } z.Mul(x, z) return e.Set(z) } golang-filippo-nistec-0.0.4/internal/subtle/000077500000000000000000000000001512422514700210225ustar00rootroot00000000000000golang-filippo-nistec-0.0.4/internal/subtle/subtle.go000066400000000000000000000023211512422514700226450ustar00rootroot00000000000000// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package subtle import ( "crypto/subtle" "math/bits" "filippo.io/nistec/internal/byteorder" ) func ConstantTimeCompare(x, y []byte) int { return subtle.ConstantTimeCompare(x, y) } // ConstantTimeLessOrEqBytes returns 1 if x <= y and 0 otherwise. The comparison // is lexigraphical, or big-endian. The time taken is a function of the length of // the slices and is independent of the contents. If the lengths of x and y do not // match it returns 0 immediately. func ConstantTimeLessOrEqBytes(x, y []byte) int { if len(x) != len(y) { return 0 } // Do a constant time subtraction chain y - x. // If there is no borrow at the end, then x <= y. var b uint64 for len(x) > 8 { x0 := byteorder.BEUint64(x[len(x)-8:]) y0 := byteorder.BEUint64(y[len(y)-8:]) _, b = bits.Sub64(y0, x0, b) x = x[:len(x)-8] y = y[:len(y)-8] } if len(x) > 0 { xb := make([]byte, 8) yb := make([]byte, 8) copy(xb[8-len(x):], x) copy(yb[8-len(y):], y) x0 := byteorder.BEUint64(xb) y0 := byteorder.BEUint64(yb) _, b = bits.Sub64(y0, x0, b) } return int(b ^ 1) } golang-filippo-nistec-0.0.4/nistec.go000066400000000000000000000012711512422514700175250ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package nistec implements the elliptic curves from NIST SP 800-186. // // This package uses fiat-crypto or specialized assembly and Go code for its // backend field arithmetic (not math/big) and exposes constant-time, heap // allocation-free, byte slice-based safe APIs. Group operations use modern and // safe complete addition formulas where possible. The point at infinity is // handled and encoded according to SEC 1, Version 2.0, and invalid curve points // can't be represented. package nistec //go:generate go run generate.go golang-filippo-nistec-0.0.4/nistec_test.go000066400000000000000000000157461512422514700206000ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package nistec_test import ( "bytes" "crypto/elliptic" "crypto/rand" "fmt" "math/big" "testing" "filippo.io/nistec" ) func TestNISTECAllocations(t *testing.T) { if raceEnabled { t.Skip("skipping allocation test in -race mode") } t.Run("P224", func(t *testing.T) { if allocs := testing.AllocsPerRun(10, func() { p := nistec.NewP224Point().SetGenerator() scalar := make([]byte, 28) rand.Read(scalar) p.ScalarBaseMult(scalar) p.ScalarMult(p, scalar) out := p.Bytes() if _, err := nistec.NewP224Point().SetBytes(out); err != nil { t.Fatal(err) } out = p.BytesCompressed() if _, err := p.SetBytes(out); err != nil { t.Fatal(err) } }); allocs > 0 { t.Errorf("expected zero allocations, got %0.1f", allocs) } }) t.Run("P256", func(t *testing.T) { if allocs := testing.AllocsPerRun(10, func() { p := nistec.NewP256Point().SetGenerator() scalar := make([]byte, 32) rand.Read(scalar) p.ScalarBaseMult(scalar) p.ScalarMult(p, scalar) out := p.Bytes() if _, err := nistec.NewP256Point().SetBytes(out); err != nil { t.Fatal(err) } out = p.BytesCompressed() if _, err := p.SetBytes(out); err != nil { t.Fatal(err) } }); allocs > 0 { t.Errorf("expected zero allocations, got %0.1f", allocs) } }) t.Run("P384", func(t *testing.T) { if allocs := testing.AllocsPerRun(10, func() { p := nistec.NewP384Point().SetGenerator() scalar := make([]byte, 48) rand.Read(scalar) p.ScalarBaseMult(scalar) p.ScalarMult(p, scalar) out := p.Bytes() if _, err := nistec.NewP384Point().SetBytes(out); err != nil { t.Fatal(err) } out = p.BytesCompressed() if _, err := p.SetBytes(out); err != nil { t.Fatal(err) } }); allocs > 0 { t.Errorf("expected zero allocations, got %0.1f", allocs) } }) t.Run("P521", func(t *testing.T) { if allocs := testing.AllocsPerRun(10, func() { p := nistec.NewP521Point().SetGenerator() scalar := make([]byte, 66) rand.Read(scalar) p.ScalarBaseMult(scalar) p.ScalarMult(p, scalar) out := p.Bytes() if _, err := nistec.NewP521Point().SetBytes(out); err != nil { t.Fatal(err) } out = p.BytesCompressed() if _, err := p.SetBytes(out); err != nil { t.Fatal(err) } }); allocs > 0 { t.Errorf("expected zero allocations, got %0.1f", allocs) } }) } type nistPoint[T any] interface { Bytes() []byte SetGenerator() T SetBytes([]byte) (T, error) Add(T, T) T Double(T) T ScalarMult(T, []byte) (T, error) ScalarBaseMult([]byte) (T, error) } func TestEquivalents(t *testing.T) { t.Run("P224", func(t *testing.T) { testEquivalents(t, nistec.NewP224Point, elliptic.P224()) }) t.Run("P256", func(t *testing.T) { testEquivalents(t, nistec.NewP256Point, elliptic.P256()) }) t.Run("P384", func(t *testing.T) { testEquivalents(t, nistec.NewP384Point, elliptic.P384()) }) t.Run("P521", func(t *testing.T) { testEquivalents(t, nistec.NewP521Point, elliptic.P521()) }) } func testEquivalents[P nistPoint[P]](t *testing.T, newPoint func() P, c elliptic.Curve) { p := newPoint().SetGenerator() elementSize := (c.Params().BitSize + 7) / 8 two := make([]byte, elementSize) two[len(two)-1] = 2 nPlusTwo := make([]byte, elementSize) new(big.Int).Add(c.Params().N, big.NewInt(2)).FillBytes(nPlusTwo) p1 := newPoint().Double(p) p2 := newPoint().Add(p, p) p3, err := newPoint().ScalarMult(p, two) fatalIfErr(t, err) p4, err := newPoint().ScalarBaseMult(two) fatalIfErr(t, err) p5, err := newPoint().ScalarMult(p, nPlusTwo) fatalIfErr(t, err) p6, err := newPoint().ScalarBaseMult(nPlusTwo) fatalIfErr(t, err) if !bytes.Equal(p1.Bytes(), p2.Bytes()) { t.Error("P+P != 2*P") } if !bytes.Equal(p1.Bytes(), p3.Bytes()) { t.Error("P+P != [2]P") } if !bytes.Equal(p1.Bytes(), p4.Bytes()) { t.Error("G+G != [2]G") } if !bytes.Equal(p1.Bytes(), p5.Bytes()) { t.Error("P+P != [N+2]P") } if !bytes.Equal(p1.Bytes(), p6.Bytes()) { t.Error("G+G != [N+2]G") } } func TestScalarMult(t *testing.T) { t.Run("P224", func(t *testing.T) { testScalarMult(t, nistec.NewP224Point, elliptic.P224()) }) t.Run("P256", func(t *testing.T) { testScalarMult(t, nistec.NewP256Point, elliptic.P256()) }) t.Run("P384", func(t *testing.T) { testScalarMult(t, nistec.NewP384Point, elliptic.P384()) }) t.Run("P521", func(t *testing.T) { testScalarMult(t, nistec.NewP521Point, elliptic.P521()) }) } func testScalarMult[P nistPoint[P]](t *testing.T, newPoint func() P, c elliptic.Curve) { G := newPoint().SetGenerator() checkScalar := func(t *testing.T, scalar []byte) { p1, err := newPoint().ScalarBaseMult(scalar) fatalIfErr(t, err) p2, err := newPoint().ScalarMult(G, scalar) fatalIfErr(t, err) if !bytes.Equal(p1.Bytes(), p2.Bytes()) { t.Error("[k]G != ScalarBaseMult(k)") } expectInfinity := new(big.Int).Mod(new(big.Int).SetBytes(scalar), c.Params().N).Sign() == 0 if expectInfinity { if !bytes.Equal(p1.Bytes(), newPoint().Bytes()) { t.Error("ScalarBaseMult(k) != ∞") } if !bytes.Equal(p2.Bytes(), newPoint().Bytes()) { t.Error("[k]G != ∞") } } else { if bytes.Equal(p1.Bytes(), newPoint().Bytes()) { t.Error("ScalarBaseMult(k) == ∞") } if bytes.Equal(p2.Bytes(), newPoint().Bytes()) { t.Error("[k]G == ∞") } } d := new(big.Int).SetBytes(scalar) d.Sub(c.Params().N, d) d.Mod(d, c.Params().N) g1, err := newPoint().ScalarBaseMult(d.FillBytes(make([]byte, len(scalar)))) fatalIfErr(t, err) g1.Add(g1, p1) if !bytes.Equal(g1.Bytes(), newPoint().Bytes()) { t.Error("[N - k]G + [k]G != ∞") } } byteLen := len(c.Params().N.Bytes()) bitLen := c.Params().N.BitLen() t.Run("0", func(t *testing.T) { checkScalar(t, make([]byte, byteLen)) }) t.Run("1", func(t *testing.T) { checkScalar(t, big.NewInt(1).FillBytes(make([]byte, byteLen))) }) t.Run("N-1", func(t *testing.T) { checkScalar(t, new(big.Int).Sub(c.Params().N, big.NewInt(1)).Bytes()) }) t.Run("N", func(t *testing.T) { checkScalar(t, c.Params().N.Bytes()) }) t.Run("N+1", func(t *testing.T) { checkScalar(t, new(big.Int).Add(c.Params().N, big.NewInt(1)).Bytes()) }) t.Run("all1s", func(t *testing.T) { s := new(big.Int).Lsh(big.NewInt(1), uint(bitLen)) s.Sub(s, big.NewInt(1)) checkScalar(t, s.Bytes()) }) if testing.Short() { return } for i := 0; i < bitLen; i++ { t.Run(fmt.Sprintf("1<<%d", i), func(t *testing.T) { s := new(big.Int).Lsh(big.NewInt(1), uint(i)) checkScalar(t, s.FillBytes(make([]byte, byteLen))) }) } for i := 0; i <= 64; i++ { t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { checkScalar(t, big.NewInt(int64(i)).FillBytes(make([]byte, byteLen))) }) } // Test N-64...N+64 since they risk overlapping with precomputed table values // in the final additions. for i := int64(-64); i <= 64; i++ { t.Run(fmt.Sprintf("N%+d", i), func(t *testing.T) { checkScalar(t, new(big.Int).Add(c.Params().N, big.NewInt(i)).Bytes()) }) } } golang-filippo-nistec-0.0.4/p224.go000066400000000000000000000376361512422514700167450ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by generate.go. DO NOT EDIT. package nistec import ( "crypto/subtle" "errors" "sync" "filippo.io/nistec/internal/fiat" ) // p224ElementLength is the length of an element of the base or scalar field, // which have the same bytes length for all NIST P curves. const p224ElementLength = 28 // P224Point is a P224 point. The zero value is NOT valid. type P224Point struct { // The point is represented in projective coordinates (X:Y:Z), // where x = X/Z and y = Y/Z. x, y, z *fiat.P224Element } // NewP224Point returns a new P224Point representing the point at infinity point. func NewP224Point() *P224Point { return &P224Point{ x: new(fiat.P224Element), y: new(fiat.P224Element).One(), z: new(fiat.P224Element), } } // SetGenerator sets p to the canonical generator and returns p. func (p *P224Point) SetGenerator() *P224Point { p.x.SetBytes([]byte{0xb7, 0xe, 0xc, 0xbd, 0x6b, 0xb4, 0xbf, 0x7f, 0x32, 0x13, 0x90, 0xb9, 0x4a, 0x3, 0xc1, 0xd3, 0x56, 0xc2, 0x11, 0x22, 0x34, 0x32, 0x80, 0xd6, 0x11, 0x5c, 0x1d, 0x21}) p.y.SetBytes([]byte{0xbd, 0x37, 0x63, 0x88, 0xb5, 0xf7, 0x23, 0xfb, 0x4c, 0x22, 0xdf, 0xe6, 0xcd, 0x43, 0x75, 0xa0, 0x5a, 0x7, 0x47, 0x64, 0x44, 0xd5, 0x81, 0x99, 0x85, 0x0, 0x7e, 0x34}) p.z.One() return p } // Set sets p = q and returns p. func (p *P224Point) Set(q *P224Point) *P224Point { p.x.Set(q.x) p.y.Set(q.y) p.z.Set(q.z) return p } // SetBytes sets p to the compressed, uncompressed, or infinity value encoded in // b, as specified in SEC 1, Version 2.0, Section 2.3.4. If the point is not on // the curve, it returns nil and an error, and the receiver is unchanged. // Otherwise, it returns p. func (p *P224Point) SetBytes(b []byte) (*P224Point, error) { switch { // Point at infinity. case len(b) == 1 && b[0] == 0: return p.Set(NewP224Point()), nil // Uncompressed form. case len(b) == 1+2*p224ElementLength && b[0] == 4: x, err := new(fiat.P224Element).SetBytes(b[1 : 1+p224ElementLength]) if err != nil { return nil, err } y, err := new(fiat.P224Element).SetBytes(b[1+p224ElementLength:]) if err != nil { return nil, err } if err := p224CheckOnCurve(x, y); err != nil { return nil, err } p.x.Set(x) p.y.Set(y) p.z.One() return p, nil // Compressed form. case len(b) == 1+p224ElementLength && (b[0] == 2 || b[0] == 3): x, err := new(fiat.P224Element).SetBytes(b[1:]) if err != nil { return nil, err } // y² = x³ - 3x + b y := p224Polynomial(new(fiat.P224Element), x) if !p224Sqrt(y, y) { return nil, errors.New("invalid P224 compressed point encoding") } // Select the positive or negative root, as indicated by the least // significant bit, based on the encoding type byte. otherRoot := new(fiat.P224Element) otherRoot.Sub(otherRoot, y) cond := y.Bytes()[p224ElementLength-1]&1 ^ b[0]&1 y.Select(otherRoot, y, int(cond)) p.x.Set(x) p.y.Set(y) p.z.One() return p, nil default: return nil, errors.New("invalid P224 point encoding") } } var _p224B *fiat.P224Element var _p224BOnce sync.Once func p224B() *fiat.P224Element { _p224BOnce.Do(func() { _p224B, _ = new(fiat.P224Element).SetBytes([]byte{0xb4, 0x5, 0xa, 0x85, 0xc, 0x4, 0xb3, 0xab, 0xf5, 0x41, 0x32, 0x56, 0x50, 0x44, 0xb0, 0xb7, 0xd7, 0xbf, 0xd8, 0xba, 0x27, 0xb, 0x39, 0x43, 0x23, 0x55, 0xff, 0xb4}) }) return _p224B } // p224Polynomial sets y2 to x³ - 3x + b, and returns y2. func p224Polynomial(y2, x *fiat.P224Element) *fiat.P224Element { y2.Square(x) y2.Mul(y2, x) threeX := new(fiat.P224Element).Add(x, x) threeX.Add(threeX, x) y2.Sub(y2, threeX) return y2.Add(y2, p224B()) } func p224CheckOnCurve(x, y *fiat.P224Element) error { // y² = x³ - 3x + b rhs := p224Polynomial(new(fiat.P224Element), x) lhs := new(fiat.P224Element).Square(y) if rhs.Equal(lhs) != 1 { return errors.New("P224 point not on curve") } return nil } // Bytes returns the uncompressed or infinity encoding of p, as specified in // SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the point at // infinity is shorter than all other encodings. func (p *P224Point) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [1 + 2*p224ElementLength]byte return p.bytes(&out) } func (p *P224Point) bytes(out *[1 + 2*p224ElementLength]byte) []byte { if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new(fiat.P224Element).Invert(p.z) x := new(fiat.P224Element).Mul(p.x, zinv) y := new(fiat.P224Element).Mul(p.y, zinv) buf := append(out[:0], 4) buf = append(buf, x.Bytes()...) buf = append(buf, y.Bytes()...) return buf } // BytesX returns the encoding of the x-coordinate of p, as specified in SEC 1, // Version 2.0, Section 2.3.5, or an error if p is the point at infinity. func (p *P224Point) BytesX() ([]byte, error) { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p224ElementLength]byte return p.bytesX(&out) } func (p *P224Point) bytesX(out *[p224ElementLength]byte) ([]byte, error) { if p.z.IsZero() == 1 { return nil, errors.New("P224 point is the point at infinity") } zinv := new(fiat.P224Element).Invert(p.z) x := new(fiat.P224Element).Mul(p.x, zinv) return append(out[:0], x.Bytes()...), nil } // BytesCompressed returns the compressed or infinity encoding of p, as // specified in SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the // point at infinity is shorter than all other encodings. func (p *P224Point) BytesCompressed() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [1 + p224ElementLength]byte return p.bytesCompressed(&out) } func (p *P224Point) bytesCompressed(out *[1 + p224ElementLength]byte) []byte { if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new(fiat.P224Element).Invert(p.z) x := new(fiat.P224Element).Mul(p.x, zinv) y := new(fiat.P224Element).Mul(p.y, zinv) // Encode the sign of the y coordinate (indicated by the least significant // bit) as the encoding type (2 or 3). buf := append(out[:0], 2) buf[0] |= y.Bytes()[p224ElementLength-1] & 1 buf = append(buf, x.Bytes()...) return buf } // Add sets q = p1 + p2, and returns q. The points may overlap. func (q *P224Point) Add(p1, p2 *P224Point) *P224Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new(fiat.P224Element).Mul(p1.x, p2.x) // t0 := X1 * X2 t1 := new(fiat.P224Element).Mul(p1.y, p2.y) // t1 := Y1 * Y2 t2 := new(fiat.P224Element).Mul(p1.z, p2.z) // t2 := Z1 * Z2 t3 := new(fiat.P224Element).Add(p1.x, p1.y) // t3 := X1 + Y1 t4 := new(fiat.P224Element).Add(p2.x, p2.y) // t4 := X2 + Y2 t3.Mul(t3, t4) // t3 := t3 * t4 t4.Add(t0, t1) // t4 := t0 + t1 t3.Sub(t3, t4) // t3 := t3 - t4 t4.Add(p1.y, p1.z) // t4 := Y1 + Z1 x3 := new(fiat.P224Element).Add(p2.y, p2.z) // X3 := Y2 + Z2 t4.Mul(t4, x3) // t4 := t4 * X3 x3.Add(t1, t2) // X3 := t1 + t2 t4.Sub(t4, x3) // t4 := t4 - X3 x3.Add(p1.x, p1.z) // X3 := X1 + Z1 y3 := new(fiat.P224Element).Add(p2.x, p2.z) // Y3 := X2 + Z2 x3.Mul(x3, y3) // X3 := X3 * Y3 y3.Add(t0, t2) // Y3 := t0 + t2 y3.Sub(x3, y3) // Y3 := X3 - Y3 z3 := new(fiat.P224Element).Mul(p224B(), t2) // Z3 := b * t2 x3.Sub(y3, z3) // X3 := Y3 - Z3 z3.Add(x3, x3) // Z3 := X3 + X3 x3.Add(x3, z3) // X3 := X3 + Z3 z3.Sub(t1, x3) // Z3 := t1 - X3 x3.Add(t1, x3) // X3 := t1 + X3 y3.Mul(p224B(), y3) // Y3 := b * Y3 t1.Add(t2, t2) // t1 := t2 + t2 t2.Add(t1, t2) // t2 := t1 + t2 y3.Sub(y3, t2) // Y3 := Y3 - t2 y3.Sub(y3, t0) // Y3 := Y3 - t0 t1.Add(y3, y3) // t1 := Y3 + Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 t1.Add(t0, t0) // t1 := t0 + t0 t0.Add(t1, t0) // t0 := t1 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t1.Mul(t4, y3) // t1 := t4 * Y3 t2.Mul(t0, y3) // t2 := t0 * Y3 y3.Mul(x3, z3) // Y3 := X3 * Z3 y3.Add(y3, t2) // Y3 := Y3 + t2 x3.Mul(t3, x3) // X3 := t3 * X3 x3.Sub(x3, t1) // X3 := X3 - t1 z3.Mul(t4, z3) // Z3 := t4 * Z3 t1.Mul(t3, t0) // t1 := t3 * t0 z3.Add(z3, t1) // Z3 := Z3 + t1 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // Double sets q = p + p, and returns q. The points may overlap. func (q *P224Point) Double(p *P224Point) *P224Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new(fiat.P224Element).Square(p.x) // t0 := X ^ 2 t1 := new(fiat.P224Element).Square(p.y) // t1 := Y ^ 2 t2 := new(fiat.P224Element).Square(p.z) // t2 := Z ^ 2 t3 := new(fiat.P224Element).Mul(p.x, p.y) // t3 := X * Y t3.Add(t3, t3) // t3 := t3 + t3 z3 := new(fiat.P224Element).Mul(p.x, p.z) // Z3 := X * Z z3.Add(z3, z3) // Z3 := Z3 + Z3 y3 := new(fiat.P224Element).Mul(p224B(), t2) // Y3 := b * t2 y3.Sub(y3, z3) // Y3 := Y3 - Z3 x3 := new(fiat.P224Element).Add(y3, y3) // X3 := Y3 + Y3 y3.Add(x3, y3) // Y3 := X3 + Y3 x3.Sub(t1, y3) // X3 := t1 - Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 y3.Mul(x3, y3) // Y3 := X3 * Y3 x3.Mul(x3, t3) // X3 := X3 * t3 t3.Add(t2, t2) // t3 := t2 + t2 t2.Add(t2, t3) // t2 := t2 + t3 z3.Mul(p224B(), z3) // Z3 := b * Z3 z3.Sub(z3, t2) // Z3 := Z3 - t2 z3.Sub(z3, t0) // Z3 := Z3 - t0 t3.Add(z3, z3) // t3 := Z3 + Z3 z3.Add(z3, t3) // Z3 := Z3 + t3 t3.Add(t0, t0) // t3 := t0 + t0 t0.Add(t3, t0) // t0 := t3 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t0.Mul(t0, z3) // t0 := t0 * Z3 y3.Add(y3, t0) // Y3 := Y3 + t0 t0.Mul(p.y, p.z) // t0 := Y * Z t0.Add(t0, t0) // t0 := t0 + t0 z3.Mul(t0, z3) // Z3 := t0 * Z3 x3.Sub(x3, z3) // X3 := X3 - Z3 z3.Mul(t0, t1) // Z3 := t0 * t1 z3.Add(z3, z3) // Z3 := Z3 + Z3 z3.Add(z3, z3) // Z3 := Z3 + Z3 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // Select sets q to p1 if cond == 1, and to p2 if cond == 0. func (q *P224Point) Select(p1, p2 *P224Point, cond int) *P224Point { q.x.Select(p1.x, p2.x, cond) q.y.Select(p1.y, p2.y, cond) q.z.Select(p1.z, p2.z, cond) return q } // A p224Table holds the first 15 multiples of a point at offset -1, so [1]P // is at table[0], [15]P is at table[14], and [0]P is implicitly the identity // point. type p224Table [15]*P224Point // Select selects the n-th multiple of the table base point into p. It works in // constant time by iterating over every entry of the table. n must be in [0, 15]. func (table *p224Table) Select(p *P224Point, n uint8) { if n >= 16 { panic("nistec: internal error: p224Table called with out-of-bounds value") } p.Set(NewP224Point()) for i := uint8(1); i < 16; i++ { cond := subtle.ConstantTimeByteEq(i, n) p.Select(table[i-1], p, cond) } } // ScalarMult sets p = scalar * q, and returns p. func (p *P224Point) ScalarMult(q *P224Point, scalar []byte) (*P224Point, error) { // Compute a p224Table for the base point q. The explicit NewP224Point // calls get inlined, letting the allocations live on the stack. var table = p224Table{NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point(), NewP224Point()} table[0].Set(q) for i := 1; i < 15; i += 2 { table[i].Double(table[i/2]) table[i+1].Add(table[i], q) } // Instead of doing the classic double-and-add chain, we do it with a // four-bit window: we double four times, and then add [0-15]P. t := NewP224Point() p.Set(NewP224Point()) for i, byte := range scalar { // No need to double on the first iteration, as p is the identity at // this point, and [N]∞ = ∞. if i != 0 { p.Double(p) p.Double(p) p.Double(p) p.Double(p) } windowValue := byte >> 4 table.Select(t, windowValue) p.Add(p, t) p.Double(p) p.Double(p) p.Double(p) p.Double(p) windowValue = byte & 0b1111 table.Select(t, windowValue) p.Add(p, t) } return p, nil } var p224GeneratorTable *[p224ElementLength * 2]p224Table var p224GeneratorTableOnce sync.Once // generatorTable returns a sequence of p224Tables. The first table contains // multiples of G. Each successive table is the previous table doubled four // times. func (p *P224Point) generatorTable() *[p224ElementLength * 2]p224Table { p224GeneratorTableOnce.Do(func() { p224GeneratorTable = new([p224ElementLength * 2]p224Table) base := NewP224Point().SetGenerator() for i := 0; i < p224ElementLength*2; i++ { p224GeneratorTable[i][0] = NewP224Point().Set(base) for j := 1; j < 15; j++ { p224GeneratorTable[i][j] = NewP224Point().Add(p224GeneratorTable[i][j-1], base) } base.Double(base) base.Double(base) base.Double(base) base.Double(base) } }) return p224GeneratorTable } // ScalarBaseMult sets p = scalar * B, where B is the canonical generator, and // returns p. func (p *P224Point) ScalarBaseMult(scalar []byte) (*P224Point, error) { if len(scalar) != p224ElementLength { return nil, errors.New("invalid scalar length") } tables := p.generatorTable() // This is also a scalar multiplication with a four-bit window like in // ScalarMult, but in this case the doublings are precomputed. The value // [windowValue]G added at iteration k would normally get doubled // (totIterations-k)×4 times, but with a larger precomputation we can // instead add [2^((totIterations-k)×4)][windowValue]G and avoid the // doublings between iterations. t := NewP224Point() p.Set(NewP224Point()) tableIndex := len(tables) - 1 for _, byte := range scalar { windowValue := byte >> 4 tables[tableIndex].Select(t, windowValue) p.Add(p, t) tableIndex-- windowValue = byte & 0b1111 tables[tableIndex].Select(t, windowValue) p.Add(p, t) tableIndex-- } return p, nil } // p224Sqrt sets e to a square root of x. If x is not a square, p224Sqrt returns // false and e is unchanged. e and x can overlap. func p224Sqrt(e, x *fiat.P224Element) (isSquare bool) { candidate := new(fiat.P224Element) p224SqrtCandidate(candidate, x) square := new(fiat.P224Element).Square(candidate) if square.Equal(x) != 1 { return false } e.Set(candidate) return true } golang-filippo-nistec-0.0.4/p224_sqrt.go000066400000000000000000000061661512422514700200100ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package nistec import ( "sync" "filippo.io/nistec/internal/fiat" ) var p224GG *[96]fiat.P224Element var p224GGOnce sync.Once // p224SqrtCandidate sets r to a square root candidate for x. r and x must not overlap. func p224SqrtCandidate(r, x *fiat.P224Element) { // Since p = 1 mod 4, we can't use the exponentiation by (p + 1) / 4 like // for the other primes. Instead, implement a variation of Tonelli–Shanks. // The constant-time implementation is adapted from Thomas Pornin's ecGFp5. // // https://github.com/pornin/ecgfp5/blob/82325b965/rust/src/field.rs#L337-L385 // p = q*2^n + 1 with q odd -> q = 2^128 - 1 and n = 96 // g^(2^n) = 1 -> g = 11 ^ q (where 11 is the smallest non-square) // GG[j] = g^(2^j) for j = 0 to n-1 p224GGOnce.Do(func() { p224GG = new([96]fiat.P224Element) for i := range p224GG { if i == 0 { p224GG[i].SetBytes([]byte{0x6a, 0x0f, 0xec, 0x67, 0x85, 0x98, 0xa7, 0x92, 0x0c, 0x55, 0xb2, 0xd4, 0x0b, 0x2d, 0x6f, 0xfb, 0xbe, 0xa3, 0xd8, 0xce, 0xf3, 0xfb, 0x36, 0x32, 0xdc, 0x69, 0x1b, 0x74}) } else { p224GG[i].Square(&p224GG[i-1]) } } }) // r <- x^((q+1)/2) = x^(2^127) // v <- x^q = x^(2^128-1) // Compute x^(2^127-1) first. // // The sequence of 10 multiplications and 126 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain v0.4.0. // // _10 = 2*1 // _11 = 1 + _10 // _110 = 2*_11 // _111 = 1 + _110 // _111000 = _111 << 3 // _111111 = _111 + _111000 // _1111110 = 2*_111111 // _1111111 = 1 + _1111110 // x12 = _1111110 << 5 + _111111 // x24 = x12 << 12 + x12 // i36 = x24 << 7 // x31 = _1111111 + i36 // x48 = i36 << 17 + x24 // x96 = x48 << 48 + x48 // return x96 << 31 + x31 // var t0 = new(fiat.P224Element) var t1 = new(fiat.P224Element) r.Square(x) r.Mul(x, r) r.Square(r) r.Mul(x, r) t0.Square(r) for s := 1; s < 3; s++ { t0.Square(t0) } t0.Mul(r, t0) t1.Square(t0) r.Mul(x, t1) for s := 0; s < 5; s++ { t1.Square(t1) } t0.Mul(t0, t1) t1.Square(t0) for s := 1; s < 12; s++ { t1.Square(t1) } t0.Mul(t0, t1) t1.Square(t0) for s := 1; s < 7; s++ { t1.Square(t1) } r.Mul(r, t1) for s := 0; s < 17; s++ { t1.Square(t1) } t0.Mul(t0, t1) t1.Square(t0) for s := 1; s < 48; s++ { t1.Square(t1) } t0.Mul(t0, t1) for s := 0; s < 31; s++ { t0.Square(t0) } r.Mul(r, t0) // v = x^(2^127-1)^2 * x v := new(fiat.P224Element).Square(r) v.Mul(v, x) // r = x^(2^127-1) * x r.Mul(r, x) // for i = n-1 down to 1: // w = v^(2^(i-1)) // if w == -1 then: // v <- v*GG[n-i] // r <- r*GG[n-i-1] var p224MinusOne = new(fiat.P224Element).Sub( new(fiat.P224Element), new(fiat.P224Element).One()) for i := 96 - 1; i >= 1; i-- { w := new(fiat.P224Element).Set(v) for j := 0; j < i-1; j++ { w.Square(w) } cond := w.Equal(p224MinusOne) v.Select(t0.Mul(v, &p224GG[96-i]), v, cond) r.Select(t0.Mul(r, &p224GG[96-i-1]), r, cond) } } golang-filippo-nistec-0.0.4/p256.go000066400000000000000000000621141512422514700167370ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build (!amd64 && !arm64 && !ppc64le && !s390x) || purego package nistec import ( "crypto/subtle" "errors" "math/bits" "sync" "unsafe" "filippo.io/nistec/internal/byteorder" "filippo.io/nistec/internal/fiat" "golang.org/x/sys/cpu" ) // P256Point is a P-256 point. The zero value is NOT valid. type P256Point struct { // The point is represented in projective coordinates (X:Y:Z), where x = X/Z // and y = Y/Z. Infinity is (0:1:0). // // fiat.P256Element is a base field element in [0, P-1] in the Montgomery // domain (with R 2²⁵⁶ and P 2²⁵⁶ - 2²²⁴ + 2¹⁹² + 2⁹⁶ - 1) as four limbs in // little-endian order value. x, y, z fiat.P256Element } // NewP256Point returns a new P256Point representing the point at infinity point. func NewP256Point() *P256Point { p := &P256Point{} p.y.One() return p } // SetGenerator sets p to the canonical generator and returns p. func (p *P256Point) SetGenerator() *P256Point { p.x.SetBytes([]byte{0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2, 0x77, 0x3, 0x7d, 0x81, 0x2d, 0xeb, 0x33, 0xa0, 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96}) p.y.SetBytes([]byte{0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7, 0xeb, 0x4a, 0x7c, 0xf, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce, 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5}) p.z.One() return p } // Set sets p = q and returns p. func (p *P256Point) Set(q *P256Point) *P256Point { p.x.Set(&q.x) p.y.Set(&q.y) p.z.Set(&q.z) return p } const p256ElementLength = 32 const p256UncompressedLength = 1 + 2*p256ElementLength const p256CompressedLength = 1 + p256ElementLength // SetBytes sets p to the compressed, uncompressed, or infinity value encoded in // b, as specified in SEC 1, Version 2.0, Section 2.3.4. If the point is not on // the curve, it returns nil and an error, and the receiver is unchanged. // Otherwise, it returns p. func (p *P256Point) SetBytes(b []byte) (*P256Point, error) { switch { // Point at infinity. case len(b) == 1 && b[0] == 0: return p.Set(NewP256Point()), nil // Uncompressed form. case len(b) == p256UncompressedLength && b[0] == 4: x, err := new(fiat.P256Element).SetBytes(b[1 : 1+p256ElementLength]) if err != nil { return nil, err } y, err := new(fiat.P256Element).SetBytes(b[1+p256ElementLength:]) if err != nil { return nil, err } if err := p256CheckOnCurve(x, y); err != nil { return nil, err } p.x.Set(x) p.y.Set(y) p.z.One() return p, nil // Compressed form. case len(b) == p256CompressedLength && (b[0] == 2 || b[0] == 3): x, err := new(fiat.P256Element).SetBytes(b[1:]) if err != nil { return nil, err } // y² = x³ - 3x + b y := p256Polynomial(new(fiat.P256Element), x) if !p256Sqrt(y, y) { return nil, errors.New("invalid P256 compressed point encoding") } // Select the positive or negative root, as indicated by the least // significant bit, based on the encoding type byte. otherRoot := new(fiat.P256Element) otherRoot.Sub(otherRoot, y) cond := y.Bytes()[p256ElementLength-1]&1 ^ b[0]&1 y.Select(otherRoot, y, int(cond)) p.x.Set(x) p.y.Set(y) p.z.One() return p, nil default: return nil, errors.New("invalid P256 point encoding") } } var _p256B *fiat.P256Element var _p256BOnce sync.Once func p256B() *fiat.P256Element { _p256BOnce.Do(func() { _p256B, _ = new(fiat.P256Element).SetBytes([]byte{0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7, 0xb3, 0xeb, 0xbd, 0x55, 0x76, 0x98, 0x86, 0xbc, 0x65, 0x1d, 0x6, 0xb0, 0xcc, 0x53, 0xb0, 0xf6, 0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b}) }) return _p256B } // p256Polynomial sets y2 to x³ - 3x + b, and returns y2. func p256Polynomial(y2, x *fiat.P256Element) *fiat.P256Element { y2.Square(x) y2.Mul(y2, x) threeX := new(fiat.P256Element).Add(x, x) threeX.Add(threeX, x) y2.Sub(y2, threeX) return y2.Add(y2, p256B()) } func p256CheckOnCurve(x, y *fiat.P256Element) error { // y² = x³ - 3x + b rhs := p256Polynomial(new(fiat.P256Element), x) lhs := new(fiat.P256Element).Square(y) if rhs.Equal(lhs) != 1 { return errors.New("P256 point not on curve") } return nil } // Bytes returns the uncompressed or infinity encoding of p, as specified in // SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the point at // infinity is shorter than all other encodings. func (p *P256Point) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p256UncompressedLength]byte return p.bytes(&out) } func (p *P256Point) bytes(out *[p256UncompressedLength]byte) []byte { // The SEC 1 representation of the point at infinity is a single zero byte, // and only infinity has z = 0. if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new(fiat.P256Element).Invert(&p.z) x := new(fiat.P256Element).Mul(&p.x, zinv) y := new(fiat.P256Element).Mul(&p.y, zinv) buf := append(out[:0], 4) buf = append(buf, x.Bytes()...) buf = append(buf, y.Bytes()...) return buf } // BytesX returns the encoding of the x-coordinate of p, as specified in SEC 1, // Version 2.0, Section 2.3.5, or an error if p is the point at infinity. func (p *P256Point) BytesX() ([]byte, error) { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p256ElementLength]byte return p.bytesX(&out) } func (p *P256Point) bytesX(out *[p256ElementLength]byte) ([]byte, error) { if p.z.IsZero() == 1 { return nil, errors.New("P256 point is the point at infinity") } zinv := new(fiat.P256Element).Invert(&p.z) x := new(fiat.P256Element).Mul(&p.x, zinv) return append(out[:0], x.Bytes()...), nil } // BytesCompressed returns the compressed or infinity encoding of p, as // specified in SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the // point at infinity is shorter than all other encodings. func (p *P256Point) BytesCompressed() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p256CompressedLength]byte return p.bytesCompressed(&out) } func (p *P256Point) bytesCompressed(out *[p256CompressedLength]byte) []byte { if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new(fiat.P256Element).Invert(&p.z) x := new(fiat.P256Element).Mul(&p.x, zinv) y := new(fiat.P256Element).Mul(&p.y, zinv) // Encode the sign of the y coordinate (indicated by the least significant // bit) as the encoding type (2 or 3). buf := append(out[:0], 2) buf[0] |= y.Bytes()[p256ElementLength-1] & 1 buf = append(buf, x.Bytes()...) return buf } // Add sets q = p1 + p2, and returns q. The points may overlap. func (q *P256Point) Add(p1, p2 *P256Point) *P256Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new(fiat.P256Element).Mul(&p1.x, &p2.x) // t0 := X1 * X2 t1 := new(fiat.P256Element).Mul(&p1.y, &p2.y) // t1 := Y1 * Y2 t2 := new(fiat.P256Element).Mul(&p1.z, &p2.z) // t2 := Z1 * Z2 t3 := new(fiat.P256Element).Add(&p1.x, &p1.y) // t3 := X1 + Y1 t4 := new(fiat.P256Element).Add(&p2.x, &p2.y) // t4 := X2 + Y2 t3.Mul(t3, t4) // t3 := t3 * t4 t4.Add(t0, t1) // t4 := t0 + t1 t3.Sub(t3, t4) // t3 := t3 - t4 t4.Add(&p1.y, &p1.z) // t4 := Y1 + Z1 x3 := new(fiat.P256Element).Add(&p2.y, &p2.z) // X3 := Y2 + Z2 t4.Mul(t4, x3) // t4 := t4 * X3 x3.Add(t1, t2) // X3 := t1 + t2 t4.Sub(t4, x3) // t4 := t4 - X3 x3.Add(&p1.x, &p1.z) // X3 := X1 + Z1 y3 := new(fiat.P256Element).Add(&p2.x, &p2.z) // Y3 := X2 + Z2 x3.Mul(x3, y3) // X3 := X3 * Y3 y3.Add(t0, t2) // Y3 := t0 + t2 y3.Sub(x3, y3) // Y3 := X3 - Y3 z3 := new(fiat.P256Element).Mul(p256B(), t2) // Z3 := b * t2 x3.Sub(y3, z3) // X3 := Y3 - Z3 z3.Add(x3, x3) // Z3 := X3 + X3 x3.Add(x3, z3) // X3 := X3 + Z3 z3.Sub(t1, x3) // Z3 := t1 - X3 x3.Add(t1, x3) // X3 := t1 + X3 y3.Mul(p256B(), y3) // Y3 := b * Y3 t1.Add(t2, t2) // t1 := t2 + t2 t2.Add(t1, t2) // t2 := t1 + t2 y3.Sub(y3, t2) // Y3 := Y3 - t2 y3.Sub(y3, t0) // Y3 := Y3 - t0 t1.Add(y3, y3) // t1 := Y3 + Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 t1.Add(t0, t0) // t1 := t0 + t0 t0.Add(t1, t0) // t0 := t1 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t1.Mul(t4, y3) // t1 := t4 * Y3 t2.Mul(t0, y3) // t2 := t0 * Y3 y3.Mul(x3, z3) // Y3 := X3 * Z3 y3.Add(y3, t2) // Y3 := Y3 + t2 x3.Mul(t3, x3) // X3 := t3 * X3 x3.Sub(x3, t1) // X3 := X3 - t1 z3.Mul(t4, z3) // Z3 := t4 * Z3 t1.Mul(t3, t0) // t1 := t3 * t0 z3.Add(z3, t1) // Z3 := Z3 + t1 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // Double sets q = p + p, and returns q. The points may overlap. func (q *P256Point) Double(p *P256Point) *P256Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new(fiat.P256Element).Square(&p.x) // t0 := X ^ 2 t1 := new(fiat.P256Element).Square(&p.y) // t1 := Y ^ 2 t2 := new(fiat.P256Element).Square(&p.z) // t2 := Z ^ 2 t3 := new(fiat.P256Element).Mul(&p.x, &p.y) // t3 := X * Y t3.Add(t3, t3) // t3 := t3 + t3 z3 := new(fiat.P256Element).Mul(&p.x, &p.z) // Z3 := X * Z z3.Add(z3, z3) // Z3 := Z3 + Z3 y3 := new(fiat.P256Element).Mul(p256B(), t2) // Y3 := b * t2 y3.Sub(y3, z3) // Y3 := Y3 - Z3 x3 := new(fiat.P256Element).Add(y3, y3) // X3 := Y3 + Y3 y3.Add(x3, y3) // Y3 := X3 + Y3 x3.Sub(t1, y3) // X3 := t1 - Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 y3.Mul(x3, y3) // Y3 := X3 * Y3 x3.Mul(x3, t3) // X3 := X3 * t3 t3.Add(t2, t2) // t3 := t2 + t2 t2.Add(t2, t3) // t2 := t2 + t3 z3.Mul(p256B(), z3) // Z3 := b * Z3 z3.Sub(z3, t2) // Z3 := Z3 - t2 z3.Sub(z3, t0) // Z3 := Z3 - t0 t3.Add(z3, z3) // t3 := Z3 + Z3 z3.Add(z3, t3) // Z3 := Z3 + t3 t3.Add(t0, t0) // t3 := t0 + t0 t0.Add(t3, t0) // t0 := t3 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t0.Mul(t0, z3) // t0 := t0 * Z3 y3.Add(y3, t0) // Y3 := Y3 + t0 t0.Mul(&p.y, &p.z) // t0 := Y * Z t0.Add(t0, t0) // t0 := t0 + t0 z3.Mul(t0, z3) // Z3 := t0 * Z3 x3.Sub(x3, z3) // X3 := X3 - Z3 z3.Mul(t0, t1) // Z3 := t0 * t1 z3.Add(z3, z3) // Z3 := Z3 + Z3 z3.Add(z3, z3) // Z3 := Z3 + Z3 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // p256AffinePoint is a point in affine coordinates (x, y). x and y are still // Montgomery domain elements. The point can't be the point at infinity. type p256AffinePoint struct { x, y fiat.P256Element } func (p *p256AffinePoint) Projective() *P256Point { pp := &P256Point{x: p.x, y: p.y} pp.z.One() return pp } // AddAffine sets q = p1 + p2, if infinity == 0, and to p1 if infinity == 1. // p2 can't be the point at infinity as it can't be represented in affine // coordinates, instead callers can set p2 to an arbitrary point and set // infinity to 1. func (q *P256Point) AddAffine(p1 *P256Point, p2 *p256AffinePoint, infinity int) *P256Point { // Complete mixed addition formula for a = -3 from "Complete addition // formulas for prime order elliptic curves" // (https://eprint.iacr.org/2015/1060), Algorithm 5. t0 := new(fiat.P256Element).Mul(&p1.x, &p2.x) // t0 ← X1 · X2 t1 := new(fiat.P256Element).Mul(&p1.y, &p2.y) // t1 ← Y1 · Y2 t3 := new(fiat.P256Element).Add(&p2.x, &p2.y) // t3 ← X2 + Y2 t4 := new(fiat.P256Element).Add(&p1.x, &p1.y) // t4 ← X1 + Y1 t3.Mul(t3, t4) // t3 ← t3 · t4 t4.Add(t0, t1) // t4 ← t0 + t1 t3.Sub(t3, t4) // t3 ← t3 − t4 t4.Mul(&p2.y, &p1.z) // t4 ← Y2 · Z1 t4.Add(t4, &p1.y) // t4 ← t4 + Y1 y3 := new(fiat.P256Element).Mul(&p2.x, &p1.z) // Y3 ← X2 · Z1 y3.Add(y3, &p1.x) // Y3 ← Y3 + X1 z3 := new(fiat.P256Element).Mul(p256B(), &p1.z) // Z3 ← b · Z1 x3 := new(fiat.P256Element).Sub(y3, z3) // X3 ← Y3 − Z3 z3.Add(x3, x3) // Z3 ← X3 + X3 x3.Add(x3, z3) // X3 ← X3 + Z3 z3.Sub(t1, x3) // Z3 ← t1 − X3 x3.Add(t1, x3) // X3 ← t1 + X3 y3.Mul(p256B(), y3) // Y3 ← b · Y3 t1.Add(&p1.z, &p1.z) // t1 ← Z1 + Z1 t2 := new(fiat.P256Element).Add(t1, &p1.z) // t2 ← t1 + Z1 y3.Sub(y3, t2) // Y3 ← Y3 − t2 y3.Sub(y3, t0) // Y3 ← Y3 − t0 t1.Add(y3, y3) // t1 ← Y3 + Y3 y3.Add(t1, y3) // Y3 ← t1 + Y3 t1.Add(t0, t0) // t1 ← t0 + t0 t0.Add(t1, t0) // t0 ← t1 + t0 t0.Sub(t0, t2) // t0 ← t0 − t2 t1.Mul(t4, y3) // t1 ← t4 · Y3 t2.Mul(t0, y3) // t2 ← t0 · Y3 y3.Mul(x3, z3) // Y3 ← X3 · Z3 y3.Add(y3, t2) // Y3 ← Y3 + t2 x3.Mul(t3, x3) // X3 ← t3 · X3 x3.Sub(x3, t1) // X3 ← X3 − t1 z3.Mul(t4, z3) // Z3 ← t4 · Z3 t1.Mul(t3, t0) // t1 ← t3 · t0 z3.Add(z3, t1) // Z3 ← Z3 + t1 q.x.Select(&p1.x, x3, infinity) q.y.Select(&p1.y, y3, infinity) q.z.Select(&p1.z, z3, infinity) return q } // Select sets q to p1 if cond == 1, and to p2 if cond == 0. func (q *P256Point) Select(p1, p2 *P256Point, cond int) *P256Point { q.x.Select(&p1.x, &p2.x, cond) q.y.Select(&p1.y, &p2.y, cond) q.z.Select(&p1.z, &p2.z, cond) return q } // p256OrdElement is a P-256 scalar field element in [0, ord(G)-1] in the // Montgomery domain (with R 2²⁵⁶) as four uint64 limbs in little-endian order. type p256OrdElement [4]uint64 // SetBytes sets s to the big-endian value of x, reducing it as necessary. func (s *p256OrdElement) SetBytes(x []byte) (*p256OrdElement, error) { if len(x) != 32 { return nil, errors.New("invalid scalar length") } s[0] = byteorder.BEUint64(x[24:]) s[1] = byteorder.BEUint64(x[16:]) s[2] = byteorder.BEUint64(x[8:]) s[3] = byteorder.BEUint64(x[:]) // Ensure s is in the range [0, ord(G)-1]. Since 2 * ord(G) > 2²⁵⁶, we can // just conditionally subtract ord(G), keeping the result if it doesn't // underflow. t0, b := bits.Sub64(s[0], 0xf3b9cac2fc632551, 0) t1, b := bits.Sub64(s[1], 0xbce6faada7179e84, b) t2, b := bits.Sub64(s[2], 0xffffffffffffffff, b) t3, b := bits.Sub64(s[3], 0xffffffff00000000, b) tMask := b - 1 // zero if subtraction underflowed s[0] ^= (t0 ^ s[0]) & tMask s[1] ^= (t1 ^ s[1]) & tMask s[2] ^= (t2 ^ s[2]) & tMask s[3] ^= (t3 ^ s[3]) & tMask return s, nil } func (s *p256OrdElement) Bytes() []byte { var out [32]byte byteorder.BEPutUint64(out[24:], s[0]) byteorder.BEPutUint64(out[16:], s[1]) byteorder.BEPutUint64(out[8:], s[2]) byteorder.BEPutUint64(out[:], s[3]) return out[:] } // Rsh returns the 64 least significant bits of x >> n. n must be lower // than 256. The value of n leaks through timing side-channels. func (s *p256OrdElement) Rsh(n int) uint64 { i := n / 64 n = n % 64 res := s[i] >> n // Shift in the more significant limb, if present. if i := i + 1; i < len(s) { res |= s[i] << (64 - n) } return res } // p256Table is a table of the first 16 multiples of a point. Points are stored // at an index offset of -1 so [8]P is at index 7, P is at 0, and [16]P is at 15. // [0]P is the point at infinity and it's not stored. type p256Table [16]P256Point // Select selects the n-th multiple of the table base point into p. It works in // constant time. n must be in [0, 16]. If n is 0, p is set to the identity point. func (table *p256Table) Select(p *P256Point, n uint8) { if n > 16 { panic("nistec: internal error: p256Table called with out-of-bounds value") } p.Set(NewP256Point()) for i := uint8(1); i <= 16; i++ { cond := subtle.ConstantTimeByteEq(i, n) p.Select(&table[i-1], p, cond) } } // Compute populates the table to the first 16 multiples of q. func (table *p256Table) Compute(q *P256Point) *p256Table { table[0].Set(q) for i := 1; i < 16; i += 2 { table[i].Double(&table[i/2]) if i+1 < 16 { table[i+1].Add(&table[i], q) } } return table } func boothW5(in uint64) (uint8, int) { s := ^((in >> 5) - 1) d := (1 << 6) - in - 1 d = (d & s) | (in & (^s)) d = (d >> 1) + (d & 1) return uint8(d), int(s & 1) } // ScalarMult sets r = scalar * q, where scalar is a 32-byte big endian value, // and returns r. If scalar is not 32 bytes long, ScalarMult returns an error // and the receiver is unchanged. func (p *P256Point) ScalarMult(q *P256Point, scalar []byte) (*P256Point, error) { s, err := new(p256OrdElement).SetBytes(scalar) if err != nil { return nil, err } // Start scanning the window from the most significant bits. We move by // 5 bits at a time and need to finish at -1, so -1 + 5 * 51 = 254. index := 254 sel, sign := boothW5(s.Rsh(index)) // sign is always zero because the boothW5 input here is at // most two bits long, so the top bit is never set. _ = sign // Neither Select nor Add have exceptions for the point at infinity / // selector zero, so we don't need to check for it here or in the loop. table := new(p256Table).Compute(q) table.Select(p, sel) t := NewP256Point() for index >= 4 { index -= 5 p.Double(p) p.Double(p) p.Double(p) p.Double(p) p.Double(p) if index >= 0 { sel, sign = boothW5(s.Rsh(index) & 0b111111) } else { // Booth encoding considers a virtual zero bit at index -1, // so we shift left the least significant limb. wvalue := (s[0] << 1) & 0b111111 sel, sign = boothW5(wvalue) } table.Select(t, sel) p256Negate(t, sign) p.Add(p, t) } return p, nil } // Negate sets p to -p, if cond == 1, and to p if cond == 0. func p256Negate(p *P256Point, cond int) *P256Point { negY := new(fiat.P256Element) negY.Sub(negY, &p.y) p.y.Select(negY, &p.y, cond) return p } // p256AffineTable is a table of the first 32 multiples of a point. Points are // stored at an index offset of -1 like in p256Table, and [0]P is not stored. type p256AffineTable [32]p256AffinePoint // Select selects the n-th multiple of the table base point into p. It works in // constant time. n can be in [0, 32], but (unlike p256Table.Select) if n is 0, // p is set to an undefined value. func (table *p256AffineTable) Select(p *p256AffinePoint, n uint8) { if n > 32 { panic("nistec: internal error: p256AffineTable.Select called with out-of-bounds value") } for i := uint8(1); i <= 32; i++ { cond := subtle.ConstantTimeByteEq(i, n) p.x.Select(&table[i-1].x, &p.x, cond) p.y.Select(&table[i-1].y, &p.y, cond) } } // p256GeneratorTables is a series of precomputed multiples of G, the canonical // generator. The first p256AffineTable contains multiples of G. The second one // multiples of [2⁶]G, the third one of [2¹²]G, and so on, where each successive // table is the previous table doubled six times. Six is the width of the // sliding window used in ScalarBaseMult, and having each table already // pre-doubled lets us avoid the doublings between windows entirely. This table // aliases into p256PrecomputedEmbed. var p256GeneratorTables *[43]p256AffineTable func init() { p256GeneratorTablesPtr := unsafe.Pointer(&p256PrecomputedEmbed) if cpu.IsBigEndian { var newTable [43 * 32 * 2 * 4]uint64 for i, x := range (*[43 * 32 * 2 * 4][8]byte)(p256GeneratorTablesPtr) { newTable[i] = byteorder.LEUint64(x[:]) } p256GeneratorTablesPtr = unsafe.Pointer(&newTable) } p256GeneratorTables = (*[43]p256AffineTable)(p256GeneratorTablesPtr) } func boothW6(in uint64) (uint8, int) { s := ^((in >> 6) - 1) d := (1 << 7) - in - 1 d = (d & s) | (in & (^s)) d = (d >> 1) + (d & 1) return uint8(d), int(s & 1) } // ScalarBaseMult sets p = scalar * generator, where scalar is a 32-byte big // endian value, and returns r. If scalar is not 32 bytes long, ScalarBaseMult // returns an error and the receiver is unchanged. func (p *P256Point) ScalarBaseMult(scalar []byte) (*P256Point, error) { // This function works like ScalarMult above, but the table is fixed and // "pre-doubled" for each iteration, so instead of doubling we move to the // next table at each iteration. s, err := new(p256OrdElement).SetBytes(scalar) if err != nil { return nil, err } // Start scanning the window from the most significant bits. We move by // 6 bits at a time and need to finish at -1, so -1 + 6 * 42 = 251. index := 251 sel, sign := boothW6(s.Rsh(index)) // sign is always zero because the boothW6 input here is at // most five bits long, so the top bit is never set. _ = sign t := &p256AffinePoint{} table := &p256GeneratorTables[(index+1)/6] table.Select(t, sel) // Select's output is undefined if the selector is zero, when it should be // the point at infinity (because infinity can't be represented in affine // coordinates). Here we conditionally set p to the infinity if sel is zero. // In the loop, that's handled by AddAffine. selIsZero := subtle.ConstantTimeByteEq(sel, 0) p.Select(NewP256Point(), t.Projective(), selIsZero) for index >= 5 { index -= 6 if index >= 0 { sel, sign = boothW6(s.Rsh(index) & 0b1111111) } else { // Booth encoding considers a virtual zero bit at index -1, // so we shift left the least significant limb. wvalue := (s[0] << 1) & 0b1111111 sel, sign = boothW6(wvalue) } table := &p256GeneratorTables[(index+1)/6] table.Select(t, sel) t.Negate(sign) selIsZero := subtle.ConstantTimeByteEq(sel, 0) p.AddAffine(p, t, selIsZero) } return p, nil } // Negate sets p to -p, if cond == 1, and to p if cond == 0. func (p *p256AffinePoint) Negate(cond int) *p256AffinePoint { negY := new(fiat.P256Element) negY.Sub(negY, &p.y) p.y.Select(negY, &p.y, cond) return p } // p256Sqrt sets e to a square root of x. If x is not a square, p256Sqrt returns // false and e is unchanged. e and x can overlap. func p256Sqrt(e, x *fiat.P256Element) (isSquare bool) { t0, t1 := new(fiat.P256Element), new(fiat.P256Element) // Since p = 3 mod 4, exponentiation by (p + 1) / 4 yields a square root candidate. // // The sequence of 7 multiplications and 253 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain v0.4.0. // // _10 = 2*1 // _11 = 1 + _10 // _1100 = _11 << 2 // _1111 = _11 + _1100 // _11110000 = _1111 << 4 // _11111111 = _1111 + _11110000 // x16 = _11111111 << 8 + _11111111 // x32 = x16 << 16 + x16 // return ((x32 << 32 + 1) << 96 + 1) << 94 // p256Square(t0, x, 1) t0.Mul(x, t0) p256Square(t1, t0, 2) t0.Mul(t0, t1) p256Square(t1, t0, 4) t0.Mul(t0, t1) p256Square(t1, t0, 8) t0.Mul(t0, t1) p256Square(t1, t0, 16) t0.Mul(t0, t1) p256Square(t0, t0, 32) t0.Mul(x, t0) p256Square(t0, t0, 96) t0.Mul(x, t0) p256Square(t0, t0, 94) // Check if the candidate t0 is indeed a square root of x. t1.Square(t0) if t1.Equal(x) != 1 { return false } e.Set(t0) return true } // p256Square sets e to the square of x, repeated n times > 1. func p256Square(e, x *fiat.P256Element, n int) { e.Square(x) for i := 1; i < n; i++ { e.Square(e) } } golang-filippo-nistec-0.0.4/p256_asm.go000066400000000000000000000533321512422514700176010ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This file contains the Go wrapper for the constant-time, 64-bit assembly // implementation of P256. The optimizations performed here are described in // detail in: // S.Gueron and V.Krasnov, "Fast prime field elliptic-curve cryptography with // 256-bit primes" // https://link.springer.com/article/10.1007%2Fs13389-014-0090-x // https://eprint.iacr.org/2013/816.pdf //go:build (amd64 || arm64 || ppc64le || s390x) && !purego package nistec import ( "errors" "math/bits" "runtime" "unsafe" "filippo.io/nistec/internal/byteorder" ) // p256Element is a P-256 base field element in [0, P-1] in the Montgomery // domain (with R 2²⁵⁶) as four limbs in little-endian order value. type p256Element [4]uint64 // p256One is one in the Montgomery domain. var p256One = p256Element{0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe} var p256Zero = p256Element{} // p256P is 2²⁵⁶ - 2²²⁴ + 2¹⁹² + 2⁹⁶ - 1 in the Montgomery domain. var p256P = p256Element{0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001} // P256Point is a P-256 point. The zero value should not be assumed to be valid // (although it is in this implementation). type P256Point struct { // (X:Y:Z) are Jacobian coordinates where x = X/Z² and y = Y/Z³. The point // at infinity can be represented by any set of coordinates with Z = 0. x, y, z p256Element } // NewP256Point returns a new P256Point representing the point at infinity. func NewP256Point() *P256Point { return &P256Point{ x: p256One, y: p256One, z: p256Zero, } } // SetGenerator sets p to the canonical generator and returns p. func (p *P256Point) SetGenerator() *P256Point { p.x = p256Element{0x79e730d418a9143c, 0x75ba95fc5fedb601, 0x79fb732b77622510, 0x18905f76a53755c6} p.y = p256Element{0xddf25357ce95560a, 0x8b4ab8e4ba19e45c, 0xd2e88688dd21f325, 0x8571ff1825885d85} p.z = p256One return p } // Set sets p = q and returns p. func (p *P256Point) Set(q *P256Point) *P256Point { p.x, p.y, p.z = q.x, q.y, q.z return p } const p256ElementLength = 32 const p256UncompressedLength = 1 + 2*p256ElementLength const p256CompressedLength = 1 + p256ElementLength // SetBytes sets p to the compressed, uncompressed, or infinity value encoded in // b, as specified in SEC 1, Version 2.0, Section 2.3.4. If the point is not on // the curve, it returns nil and an error, and the receiver is unchanged. // Otherwise, it returns p. func (p *P256Point) SetBytes(b []byte) (*P256Point, error) { // p256Mul operates in the Montgomery domain with R = 2²⁵⁶ mod p. Thus rr // here is R in the Montgomery domain, or R×R mod p. See comment in // P256OrdInverse about how this is used. rr := p256Element{0x0000000000000003, 0xfffffffbffffffff, 0xfffffffffffffffe, 0x00000004fffffffd} switch { // Point at infinity. case len(b) == 1 && b[0] == 0: return p.Set(NewP256Point()), nil // Uncompressed form. case len(b) == p256UncompressedLength && b[0] == 4: var r P256Point p256BigToLittle(&r.x, (*[32]byte)(b[1:33])) p256BigToLittle(&r.y, (*[32]byte)(b[33:65])) if p256LessThanP(&r.x) == 0 || p256LessThanP(&r.y) == 0 { return nil, errors.New("invalid P256 element encoding") } p256Mul(&r.x, &r.x, &rr) p256Mul(&r.y, &r.y, &rr) if err := p256CheckOnCurve(&r.x, &r.y); err != nil { return nil, err } r.z = p256One return p.Set(&r), nil // Compressed form. case len(b) == p256CompressedLength && (b[0] == 2 || b[0] == 3): var r P256Point p256BigToLittle(&r.x, (*[32]byte)(b[1:33])) if p256LessThanP(&r.x) == 0 { return nil, errors.New("invalid P256 element encoding") } p256Mul(&r.x, &r.x, &rr) // y² = x³ - 3x + b p256Polynomial(&r.y, &r.x) if !p256Sqrt(&r.y, &r.y) { return nil, errors.New("invalid P256 compressed point encoding") } // Select the positive or negative root, as indicated by the least // significant bit, based on the encoding type byte. yy := new(p256Element) p256FromMont(yy, &r.y) cond := int(yy[0]&1) ^ int(b[0]&1) p256NegCond(&r.y, cond) r.z = p256One return p.Set(&r), nil default: return nil, errors.New("invalid P256 point encoding") } } // p256Polynomial sets y2 to x³ - 3x + b, and returns y2. func p256Polynomial(y2, x *p256Element) *p256Element { x3 := new(p256Element) p256Sqr(x3, x, 1) p256Mul(x3, x3, x) threeX := new(p256Element) p256Add(threeX, x, x) p256Add(threeX, threeX, x) p256NegCond(threeX, 1) p256B := &p256Element{0xd89cdf6229c4bddf, 0xacf005cd78843090, 0xe5a220abf7212ed6, 0xdc30061d04874834} p256Add(x3, x3, threeX) p256Add(x3, x3, p256B) *y2 = *x3 return y2 } func p256CheckOnCurve(x, y *p256Element) error { // y² = x³ - 3x + b rhs := p256Polynomial(new(p256Element), x) lhs := new(p256Element) p256Sqr(lhs, y, 1) if p256Equal(lhs, rhs) != 1 { return errors.New("P256 point not on curve") } return nil } // p256LessThanP returns 1 if x < p, and 0 otherwise. Note that a p256Element is // not allowed to be equal to or greater than p, so if this function returns 0 // then x is invalid. func p256LessThanP(x *p256Element) int { var b uint64 _, b = bits.Sub64(x[0], p256P[0], b) _, b = bits.Sub64(x[1], p256P[1], b) _, b = bits.Sub64(x[2], p256P[2], b) _, b = bits.Sub64(x[3], p256P[3], b) return int(b) } func p256BigToLittle(l *p256Element, b *[32]byte) { bytesToLimbs((*[4]uint64)(l), b) } func bytesToLimbs(l *[4]uint64, b *[32]byte) { l[0] = byteorder.BEUint64(b[24:]) l[1] = byteorder.BEUint64(b[16:]) l[2] = byteorder.BEUint64(b[8:]) l[3] = byteorder.BEUint64(b[:]) } func p256LittleToBig(b *[32]byte, l *p256Element) { limbsToBytes(b, (*[4]uint64)(l)) } func limbsToBytes(b *[32]byte, l *[4]uint64) { byteorder.BEPutUint64(b[24:], l[0]) byteorder.BEPutUint64(b[16:], l[1]) byteorder.BEPutUint64(b[8:], l[2]) byteorder.BEPutUint64(b[:], l[3]) } // p256Add sets res = x + y. func p256Add(res, x, y *p256Element) { var c, b uint64 t1 := make([]uint64, 4) t1[0], c = bits.Add64(x[0], y[0], 0) t1[1], c = bits.Add64(x[1], y[1], c) t1[2], c = bits.Add64(x[2], y[2], c) t1[3], c = bits.Add64(x[3], y[3], c) t2 := make([]uint64, 4) t2[0], b = bits.Sub64(t1[0], p256P[0], 0) t2[1], b = bits.Sub64(t1[1], p256P[1], b) t2[2], b = bits.Sub64(t1[2], p256P[2], b) t2[3], b = bits.Sub64(t1[3], p256P[3], b) // Three options: // - a+b < p // then c is 0, b is 1, and t1 is correct // - p <= a+b < 2^256 // then c is 0, b is 0, and t2 is correct // - 2^256 <= a+b // then c is 1, b is 1, and t2 is correct t2Mask := (c ^ b) - 1 res[0] = (t1[0] & ^t2Mask) | (t2[0] & t2Mask) res[1] = (t1[1] & ^t2Mask) | (t2[1] & t2Mask) res[2] = (t1[2] & ^t2Mask) | (t2[2] & t2Mask) res[3] = (t1[3] & ^t2Mask) | (t2[3] & t2Mask) } // p256Sqrt sets e to a square root of x. If x is not a square, p256Sqrt returns // false and e is unchanged. e and x can overlap. func p256Sqrt(e, x *p256Element) (isSquare bool) { t0, t1 := new(p256Element), new(p256Element) // Since p = 3 mod 4, exponentiation by (p + 1) / 4 yields a square root candidate. // // The sequence of 7 multiplications and 253 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain v0.4.0. // // _10 = 2*1 // _11 = 1 + _10 // _1100 = _11 << 2 // _1111 = _11 + _1100 // _11110000 = _1111 << 4 // _11111111 = _1111 + _11110000 // x16 = _11111111 << 8 + _11111111 // x32 = x16 << 16 + x16 // return ((x32 << 32 + 1) << 96 + 1) << 94 // p256Sqr(t0, x, 1) p256Mul(t0, x, t0) p256Sqr(t1, t0, 2) p256Mul(t0, t0, t1) p256Sqr(t1, t0, 4) p256Mul(t0, t0, t1) p256Sqr(t1, t0, 8) p256Mul(t0, t0, t1) p256Sqr(t1, t0, 16) p256Mul(t0, t0, t1) p256Sqr(t0, t0, 32) p256Mul(t0, x, t0) p256Sqr(t0, t0, 96) p256Mul(t0, x, t0) p256Sqr(t0, t0, 94) p256Sqr(t1, t0, 1) if p256Equal(t1, x) != 1 { return false } *e = *t0 return true } // The following assembly functions are implemented in p256_asm_*.s // Montgomery multiplication. Sets res = in1 * in2 * R⁻¹ mod p. // //go:noescape func p256Mul(res, in1, in2 *p256Element) // Montgomery square, repeated n times (n >= 1). // //go:noescape func p256Sqr(res, in *p256Element, n int) // Montgomery multiplication by R⁻¹, or 1 outside the domain. // Sets res = in * R⁻¹, bringing res out of the Montgomery domain. // //go:noescape func p256FromMont(res, in *p256Element) // If cond is not 0, sets val = -val mod p. // //go:noescape func p256NegCond(val *p256Element, cond int) // If cond is 0, sets res = b, otherwise sets res = a. // //go:noescape func p256MovCond(res, a, b *P256Point, cond int) // p256Table is a table of the first 16 multiples of a point. Points are stored // at an index offset of -1 so [8]P is at index 7, P is at 0, and [16]P is at 15. // [0]P is the point at infinity and it's not stored. type p256Table [16]P256Point // p256Select sets res to the point at index idx in the table. // idx must be in [0, 15]. It executes in constant time. // //go:noescape func p256Select(res *P256Point, table *p256Table, idx int) // p256AffinePoint is a point in affine coordinates (x, y). x and y are still // Montgomery domain elements. The point can't be the point at infinity. type p256AffinePoint struct { x, y p256Element } // p256AffineTable is a table of the first 32 multiples of a point. Points are // stored at an index offset of -1 like in p256Table, and [0]P is not stored. type p256AffineTable [32]p256AffinePoint // p256Precomputed is a series of precomputed multiples of G, the canonical // generator. The first p256AffineTable contains multiples of G. The second one // multiples of [2⁶]G, the third one of [2¹²]G, and so on, where each successive // table is the previous table doubled six times. Six is the width of the // sliding window used in p256ScalarBaseMult, and having each table already // pre-doubled lets us avoid the doublings between windows entirely. This table // aliases into p256PrecomputedEmbed. var p256Precomputed *[43]p256AffineTable func init() { p256PrecomputedPtr := unsafe.Pointer(&p256PrecomputedEmbed) if runtime.GOARCH == "s390x" { var newTable [43 * 32 * 2 * 4]uint64 for i, x := range (*[43 * 32 * 2 * 4][8]byte)(p256PrecomputedPtr) { newTable[i] = byteorder.LEUint64(x[:]) } p256PrecomputedPtr = unsafe.Pointer(&newTable) } p256Precomputed = (*[43]p256AffineTable)(p256PrecomputedPtr) } // p256SelectAffine sets res to the point at index idx in the table. // idx must be in [0, 31]. It executes in constant time. // //go:noescape func p256SelectAffine(res *p256AffinePoint, table *p256AffineTable, idx int) // Point addition with an affine point and constant time conditions. // If zero is 0, sets res = in2. If sel is 0, sets res = in1. // If sign is not 0, sets res = in1 + -in2. Otherwise, sets res = in1 + in2 // //go:noescape func p256PointAddAffineAsm(res, in1 *P256Point, in2 *p256AffinePoint, sign, sel, zero int) // Point addition. Sets res = in1 + in2. Returns one if the two input points // were equal and zero otherwise. If in1 or in2 are the point at infinity, res // and the return value are undefined. // //go:noescape func p256PointAddAsm(res, in1, in2 *P256Point) int // Point doubling. Sets res = in + in. in can be the point at infinity. // //go:noescape func p256PointDoubleAsm(res, in *P256Point) // p256OrdElement is a P-256 scalar field element in [0, ord(G)-1] in the // Montgomery domain (with R 2²⁵⁶) as four uint64 limbs in little-endian order. type p256OrdElement [4]uint64 // p256OrdReduce ensures s is in the range [0, ord(G)-1]. func p256OrdReduce(s *p256OrdElement) { // Since 2 * ord(G) > 2²⁵⁶, we can just conditionally subtract ord(G), // keeping the result if it doesn't underflow. t0, b := bits.Sub64(s[0], 0xf3b9cac2fc632551, 0) t1, b := bits.Sub64(s[1], 0xbce6faada7179e84, b) t2, b := bits.Sub64(s[2], 0xffffffffffffffff, b) t3, b := bits.Sub64(s[3], 0xffffffff00000000, b) tMask := b - 1 // zero if subtraction underflowed s[0] ^= (t0 ^ s[0]) & tMask s[1] ^= (t1 ^ s[1]) & tMask s[2] ^= (t2 ^ s[2]) & tMask s[3] ^= (t3 ^ s[3]) & tMask } func p256OrdLittleToBig(b *[32]byte, l *p256OrdElement) { limbsToBytes(b, (*[4]uint64)(l)) } func p256OrdBigToLittle(l *p256OrdElement, b *[32]byte) { bytesToLimbs((*[4]uint64)(l), b) } // Add sets q = p1 + p2, and returns q. The points may overlap. func (q *P256Point) Add(r1, r2 *P256Point) *P256Point { var sum, double P256Point r1IsInfinity := r1.isInfinity() r2IsInfinity := r2.isInfinity() pointsEqual := p256PointAddAsm(&sum, r1, r2) p256PointDoubleAsm(&double, r1) p256MovCond(&sum, &double, &sum, pointsEqual) p256MovCond(&sum, r1, &sum, r2IsInfinity) p256MovCond(&sum, r2, &sum, r1IsInfinity) return q.Set(&sum) } // Double sets q = p + p, and returns q. The points may overlap. func (q *P256Point) Double(p *P256Point) *P256Point { var double P256Point p256PointDoubleAsm(&double, p) return q.Set(&double) } // ScalarBaseMult sets r = scalar * generator, where scalar is a 32-byte big // endian value, and returns r. If scalar is not 32 bytes long, ScalarBaseMult // returns an error and the receiver is unchanged. func (r *P256Point) ScalarBaseMult(scalar []byte) (*P256Point, error) { if len(scalar) != 32 { return nil, errors.New("invalid scalar length") } scalarReversed := new(p256OrdElement) p256OrdBigToLittle(scalarReversed, (*[32]byte)(scalar)) p256OrdReduce(scalarReversed) r.p256BaseMult(scalarReversed) return r, nil } // ScalarMult sets r = scalar * q, where scalar is a 32-byte big endian value, // and returns r. If scalar is not 32 bytes long, ScalarBaseMult returns an // error and the receiver is unchanged. func (r *P256Point) ScalarMult(q *P256Point, scalar []byte) (*P256Point, error) { if len(scalar) != 32 { return nil, errors.New("invalid scalar length") } scalarReversed := new(p256OrdElement) p256OrdBigToLittle(scalarReversed, (*[32]byte)(scalar)) p256OrdReduce(scalarReversed) r.Set(q).p256ScalarMult(scalarReversed) return r, nil } // uint64IsZero returns 1 if x is zero and zero otherwise. func uint64IsZero(x uint64) int { x = ^x x &= x >> 32 x &= x >> 16 x &= x >> 8 x &= x >> 4 x &= x >> 2 x &= x >> 1 return int(x & 1) } // p256Equal returns 1 if a and b are equal and 0 otherwise. func p256Equal(a, b *p256Element) int { var acc uint64 for i := range a { acc |= a[i] ^ b[i] } return uint64IsZero(acc) } // isInfinity returns 1 if p is the point at infinity and 0 otherwise. func (p *P256Point) isInfinity() int { return p256Equal(&p.z, &p256Zero) } // Bytes returns the uncompressed or infinity encoding of p, as specified in // SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the point at // infinity is shorter than all other encodings. func (p *P256Point) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p256UncompressedLength]byte return p.bytes(&out) } func (p *P256Point) bytes(out *[p256UncompressedLength]byte) []byte { // The proper representation of the point at infinity is a single zero byte. if p.isInfinity() == 1 { return append(out[:0], 0) } x, y := new(p256Element), new(p256Element) p.affineFromMont(x, y) out[0] = 4 // Uncompressed form. p256LittleToBig((*[32]byte)(out[1:33]), x) p256LittleToBig((*[32]byte)(out[33:65]), y) return out[:] } // affineFromMont sets (x, y) to the affine coordinates of p, converted out of the // Montgomery domain. func (p *P256Point) affineFromMont(x, y *p256Element) { p256Inverse(y, &p.z) p256Sqr(x, y, 1) p256Mul(y, y, x) p256Mul(x, &p.x, x) p256Mul(y, &p.y, y) p256FromMont(x, x) p256FromMont(y, y) } // BytesX returns the encoding of the x-coordinate of p, as specified in SEC 1, // Version 2.0, Section 2.3.5, or an error if p is the point at infinity. func (p *P256Point) BytesX() ([]byte, error) { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p256ElementLength]byte return p.bytesX(&out) } func (p *P256Point) bytesX(out *[p256ElementLength]byte) ([]byte, error) { if p.isInfinity() == 1 { return nil, errors.New("P256 point is the point at infinity") } x := new(p256Element) p256Inverse(x, &p.z) p256Sqr(x, x, 1) p256Mul(x, &p.x, x) p256FromMont(x, x) p256LittleToBig((*[32]byte)(out[:]), x) return out[:], nil } // BytesCompressed returns the compressed or infinity encoding of p, as // specified in SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the // point at infinity is shorter than all other encodings. func (p *P256Point) BytesCompressed() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p256CompressedLength]byte return p.bytesCompressed(&out) } func (p *P256Point) bytesCompressed(out *[p256CompressedLength]byte) []byte { if p.isInfinity() == 1 { return append(out[:0], 0) } x, y := new(p256Element), new(p256Element) p.affineFromMont(x, y) out[0] = 2 | byte(y[0]&1) p256LittleToBig((*[32]byte)(out[1:33]), x) return out[:] } // Select sets q to p1 if cond == 1, and to p2 if cond == 0. func (q *P256Point) Select(p1, p2 *P256Point, cond int) *P256Point { p256MovCond(q, p1, p2, cond) return q } // p256Inverse sets out to in⁻¹ mod p. If in is zero, out will be zero. func p256Inverse(out, in *p256Element) { // Inversion is calculated through exponentiation by p - 2, per Fermat's // little theorem. // // The sequence of 12 multiplications and 255 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain // v0.4.0. // // _10 = 2*1 // _11 = 1 + _10 // _110 = 2*_11 // _111 = 1 + _110 // _111000 = _111 << 3 // _111111 = _111 + _111000 // x12 = _111111 << 6 + _111111 // x15 = x12 << 3 + _111 // x16 = 2*x15 + 1 // x32 = x16 << 16 + x16 // i53 = x32 << 15 // x47 = x15 + i53 // i263 = ((i53 << 17 + 1) << 143 + x47) << 47 // return (x47 + i263) << 2 + 1 // var z = new(p256Element) var t0 = new(p256Element) var t1 = new(p256Element) p256Sqr(z, in, 1) p256Mul(z, in, z) p256Sqr(z, z, 1) p256Mul(z, in, z) p256Sqr(t0, z, 3) p256Mul(t0, z, t0) p256Sqr(t1, t0, 6) p256Mul(t0, t0, t1) p256Sqr(t0, t0, 3) p256Mul(z, z, t0) p256Sqr(t0, z, 1) p256Mul(t0, in, t0) p256Sqr(t1, t0, 16) p256Mul(t0, t0, t1) p256Sqr(t0, t0, 15) p256Mul(z, z, t0) p256Sqr(t0, t0, 17) p256Mul(t0, in, t0) p256Sqr(t0, t0, 143) p256Mul(t0, z, t0) p256Sqr(t0, t0, 47) p256Mul(z, z, t0) p256Sqr(z, z, 2) p256Mul(out, in, z) } func boothW5(in uint) (int, int) { var s uint = ^((in >> 5) - 1) var d uint = (1 << 6) - in - 1 d = (d & s) | (in & (^s)) d = (d >> 1) + (d & 1) return int(d), int(s & 1) } func boothW6(in uint) (int, int) { var s uint = ^((in >> 6) - 1) var d uint = (1 << 7) - in - 1 d = (d & s) | (in & (^s)) d = (d >> 1) + (d & 1) return int(d), int(s & 1) } func (p *P256Point) p256BaseMult(scalar *p256OrdElement) { var t0 p256AffinePoint wvalue := (scalar[0] << 1) & 0x7f sel, sign := boothW6(uint(wvalue)) p256SelectAffine(&t0, &p256Precomputed[0], sel) p.x, p.y, p.z = t0.x, t0.y, p256One p256NegCond(&p.y, sign) index := uint(5) zero := sel for i := 1; i < 43; i++ { if index < 192 { wvalue = ((scalar[index/64] >> (index % 64)) + (scalar[index/64+1] << (64 - (index % 64)))) & 0x7f } else { wvalue = (scalar[index/64] >> (index % 64)) & 0x7f } index += 6 sel, sign = boothW6(uint(wvalue)) p256SelectAffine(&t0, &p256Precomputed[i], sel) p256PointAddAffineAsm(p, p, &t0, sign, sel, zero) zero |= sel } // If the whole scalar was zero, set to the point at infinity. p256MovCond(p, p, NewP256Point(), zero) } func (p *P256Point) p256ScalarMult(scalar *p256OrdElement) { // precomp is a table of precomputed points that stores powers of p // from p^1 to p^16. var precomp p256Table var t0, t1, t2, t3 P256Point // Prepare the table precomp[0] = *p // 1 p256PointDoubleAsm(&t0, p) p256PointDoubleAsm(&t1, &t0) p256PointDoubleAsm(&t2, &t1) p256PointDoubleAsm(&t3, &t2) precomp[1] = t0 // 2 precomp[3] = t1 // 4 precomp[7] = t2 // 8 precomp[15] = t3 // 16 p256PointAddAsm(&t0, &t0, p) p256PointAddAsm(&t1, &t1, p) p256PointAddAsm(&t2, &t2, p) precomp[2] = t0 // 3 precomp[4] = t1 // 5 precomp[8] = t2 // 9 p256PointDoubleAsm(&t0, &t0) p256PointDoubleAsm(&t1, &t1) precomp[5] = t0 // 6 precomp[9] = t1 // 10 p256PointAddAsm(&t2, &t0, p) p256PointAddAsm(&t1, &t1, p) precomp[6] = t2 // 7 precomp[10] = t1 // 11 p256PointDoubleAsm(&t0, &t0) p256PointDoubleAsm(&t2, &t2) precomp[11] = t0 // 12 precomp[13] = t2 // 14 p256PointAddAsm(&t0, &t0, p) p256PointAddAsm(&t2, &t2, p) precomp[12] = t0 // 13 precomp[14] = t2 // 15 // Start scanning the window from top bit index := uint(254) var sel, sign int wvalue := (scalar[index/64] >> (index % 64)) & 0x3f sel, _ = boothW5(uint(wvalue)) p256Select(p, &precomp, sel) zero := sel for index > 4 { index -= 5 p256PointDoubleAsm(p, p) p256PointDoubleAsm(p, p) p256PointDoubleAsm(p, p) p256PointDoubleAsm(p, p) p256PointDoubleAsm(p, p) if index < 192 { wvalue = ((scalar[index/64] >> (index % 64)) + (scalar[index/64+1] << (64 - (index % 64)))) & 0x3f } else { wvalue = (scalar[index/64] >> (index % 64)) & 0x3f } sel, sign = boothW5(uint(wvalue)) p256Select(&t0, &precomp, sel) p256NegCond(&t0.y, sign) p256PointAddAsm(&t1, p, &t0) p256MovCond(&t1, &t1, p, sel) p256MovCond(p, &t1, &t0, zero) zero |= sel } p256PointDoubleAsm(p, p) p256PointDoubleAsm(p, p) p256PointDoubleAsm(p, p) p256PointDoubleAsm(p, p) p256PointDoubleAsm(p, p) wvalue = (scalar[0] << 1) & 0x3f sel, sign = boothW5(uint(wvalue)) p256Select(&t0, &precomp, sel) p256NegCond(&t0.y, sign) p256PointAddAsm(&t1, p, &t0) p256MovCond(&t1, &t1, p, sel) p256MovCond(p, &t1, &t0, zero) } golang-filippo-nistec-0.0.4/p256_asm_amd64.s000066400000000000000000001241501512422514700204260ustar00rootroot00000000000000// Code generated by command: go run p256_asm.go -out ../p256_asm_amd64.s. DO NOT EDIT. //go:build !purego #include "textflag.h" // func p256MovCond(res *P256Point, a *P256Point, b *P256Point, cond int) // Requires: SSE2 TEXT ·p256MovCond(SB), NOSPLIT, $0-32 MOVQ res+0(FP), DI MOVQ a+8(FP), SI MOVQ b+16(FP), CX MOVQ cond+24(FP), X12 PXOR X13, X13 PSHUFD $0x00, X12, X12 PCMPEQL X13, X12 MOVOU X12, X0 MOVOU (SI), X6 PANDN X6, X0 MOVOU X12, X1 MOVOU 16(SI), X7 PANDN X7, X1 MOVOU X12, X2 MOVOU 32(SI), X8 PANDN X8, X2 MOVOU X12, X3 MOVOU 48(SI), X9 PANDN X9, X3 MOVOU X12, X4 MOVOU 64(SI), X10 PANDN X10, X4 MOVOU X12, X5 MOVOU 80(SI), X11 PANDN X11, X5 MOVOU (CX), X6 MOVOU 16(CX), X7 MOVOU 32(CX), X8 MOVOU 48(CX), X9 MOVOU 64(CX), X10 MOVOU 80(CX), X11 PAND X12, X6 PAND X12, X7 PAND X12, X8 PAND X12, X9 PAND X12, X10 PAND X12, X11 PXOR X6, X0 PXOR X7, X1 PXOR X8, X2 PXOR X9, X3 PXOR X10, X4 PXOR X11, X5 MOVOU X0, (DI) MOVOU X1, 16(DI) MOVOU X2, 32(DI) MOVOU X3, 48(DI) MOVOU X4, 64(DI) MOVOU X5, 80(DI) RET // func p256NegCond(val *p256Element, cond int) // Requires: CMOV TEXT ·p256NegCond(SB), NOSPLIT, $0-16 MOVQ val+0(FP), DI MOVQ cond+8(FP), R14 // acc = poly MOVQ $-1, R8 MOVQ p256const0<>+0(SB), R9 MOVQ $+0, R10 MOVQ p256const1<>+0(SB), R11 // Load the original value MOVQ (DI), R13 MOVQ 8(DI), SI MOVQ 16(DI), CX MOVQ 24(DI), R15 // Speculatively subtract SUBQ R13, R8 SBBQ SI, R9 SBBQ CX, R10 SBBQ R15, R11 // If condition is 0, keep original value TESTQ R14, R14 CMOVQEQ R13, R8 CMOVQEQ SI, R9 CMOVQEQ CX, R10 CMOVQEQ R15, R11 // Store result MOVQ R8, (DI) MOVQ R9, 8(DI) MOVQ R10, 16(DI) MOVQ R11, 24(DI) RET DATA p256const0<>+0(SB)/8, $0x00000000ffffffff GLOBL p256const0<>(SB), RODATA, $8 DATA p256const1<>+0(SB)/8, $0xffffffff00000001 GLOBL p256const1<>(SB), RODATA, $8 // func p256Sqr(res *p256Element, in *p256Element, n int) // Requires: CMOV TEXT ·p256Sqr(SB), NOSPLIT, $0-24 MOVQ res+0(FP), DI MOVQ in+8(FP), SI MOVQ n+16(FP), BX sqrLoop: // y[1:] * y[0] MOVQ (SI), R14 MOVQ 8(SI), AX MULQ R14 MOVQ AX, R9 MOVQ DX, R10 MOVQ 16(SI), AX MULQ R14 ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R11 MOVQ 24(SI), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R12 // y[2:] * y[1] MOVQ 8(SI), R14 MOVQ 16(SI), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 24(SI), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ $0x00, DX MOVQ DX, R13 // y[3] * y[2] MOVQ 16(SI), R14 MOVQ 24(SI), AX MULQ R14 ADDQ AX, R13 ADCQ $0x00, DX MOVQ DX, CX XORQ R15, R15 // *2 ADDQ R9, R9 ADCQ R10, R10 ADCQ R11, R11 ADCQ R12, R12 ADCQ R13, R13 ADCQ CX, CX ADCQ $0x00, R15 // Missing products MOVQ (SI), AX MULQ AX MOVQ AX, R8 MOVQ DX, R14 MOVQ 8(SI), AX MULQ AX ADDQ R14, R9 ADCQ AX, R10 ADCQ $0x00, DX MOVQ DX, R14 MOVQ 16(SI), AX MULQ AX ADDQ R14, R11 ADCQ AX, R12 ADCQ $0x00, DX MOVQ DX, R14 MOVQ 24(SI), AX MULQ AX ADDQ R14, R13 ADCQ AX, CX ADCQ DX, R15 MOVQ R15, SI // First reduction step MOVQ R8, AX MOVQ R8, R15 SHLQ $0x20, R8 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R8, R9 ADCQ R15, R10 ADCQ AX, R11 ADCQ $0x00, DX MOVQ DX, R8 // Second reduction step MOVQ R9, AX MOVQ R9, R15 SHLQ $0x20, R9 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R9, R10 ADCQ R15, R11 ADCQ AX, R8 ADCQ $0x00, DX MOVQ DX, R9 // Third reduction step MOVQ R10, AX MOVQ R10, R15 SHLQ $0x20, R10 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R10, R11 ADCQ R15, R8 ADCQ AX, R9 ADCQ $0x00, DX MOVQ DX, R10 // Last reduction step XORQ R14, R14 MOVQ R11, AX MOVQ R11, R15 SHLQ $0x20, R11 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R11, R8 ADCQ R15, R9 ADCQ AX, R10 ADCQ $0x00, DX MOVQ DX, R11 // Add bits [511:256] of the sqr result ADCQ R12, R8 ADCQ R13, R9 ADCQ CX, R10 ADCQ SI, R11 ADCQ $0x00, R14 MOVQ R8, R12 MOVQ R9, R13 MOVQ R10, CX MOVQ R11, R15 // Subtract p256 SUBQ $-1, R8 SBBQ p256const0<>+0(SB), R9 SBBQ $0x00, R10 SBBQ p256const1<>+0(SB), R11 SBBQ $0x00, R14 CMOVQCS R12, R8 CMOVQCS R13, R9 CMOVQCS CX, R10 CMOVQCS R15, R11 MOVQ R8, (DI) MOVQ R9, 8(DI) MOVQ R10, 16(DI) MOVQ R11, 24(DI) MOVQ DI, SI DECQ BX JNE sqrLoop RET // func p256Mul(res *p256Element, in1 *p256Element, in2 *p256Element) // Requires: CMOV TEXT ·p256Mul(SB), NOSPLIT, $0-24 MOVQ res+0(FP), DI MOVQ in1+8(FP), SI MOVQ in2+16(FP), CX // x * y[0] MOVQ (CX), R14 MOVQ (SI), AX MULQ R14 MOVQ AX, R8 MOVQ DX, R9 MOVQ 8(SI), AX MULQ R14 ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, R10 MOVQ 16(SI), AX MULQ R14 ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R11 MOVQ 24(SI), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R12 XORQ R13, R13 // First reduction step MOVQ R8, AX MOVQ R8, R15 SHLQ $0x20, R8 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R8, R9 ADCQ R15, R10 ADCQ AX, R11 ADCQ DX, R12 ADCQ $0x00, R13 XORQ R8, R8 // x * y[1] MOVQ 8(CX), R14 MOVQ (SI), AX MULQ R14 ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 8(SI), AX MULQ R14 ADDQ R15, R10 ADCQ $0x00, DX ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 16(SI), AX MULQ R14 ADDQ R15, R11 ADCQ $0x00, DX ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 24(SI), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ DX, R13 ADCQ $0x00, R8 // Second reduction step MOVQ R9, AX MOVQ R9, R15 SHLQ $0x20, R9 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R9, R10 ADCQ R15, R11 ADCQ AX, R12 ADCQ DX, R13 ADCQ $0x00, R8 XORQ R9, R9 // x * y[2] MOVQ 16(CX), R14 MOVQ (SI), AX MULQ R14 ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 8(SI), AX MULQ R14 ADDQ R15, R11 ADCQ $0x00, DX ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 16(SI), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 24(SI), AX MULQ R14 ADDQ R15, R13 ADCQ $0x00, DX ADDQ AX, R13 ADCQ DX, R8 ADCQ $0x00, R9 // Third reduction step MOVQ R10, AX MOVQ R10, R15 SHLQ $0x20, R10 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R10, R11 ADCQ R15, R12 ADCQ AX, R13 ADCQ DX, R8 ADCQ $0x00, R9 XORQ R10, R10 // x * y[3] MOVQ 24(CX), R14 MOVQ (SI), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 8(SI), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 16(SI), AX MULQ R14 ADDQ R15, R13 ADCQ $0x00, DX ADDQ AX, R13 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 24(SI), AX MULQ R14 ADDQ R15, R8 ADCQ $0x00, DX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0x00, R10 // Last reduction step MOVQ R11, AX MOVQ R11, R15 SHLQ $0x20, R11 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R11, R12 ADCQ R15, R13 ADCQ AX, R8 ADCQ DX, R9 ADCQ $0x00, R10 // Copy result [255:0] MOVQ R12, SI MOVQ R13, R11 MOVQ R8, R14 MOVQ R9, R15 // Subtract p256 SUBQ $-1, R12 SBBQ p256const0<>+0(SB), R13 SBBQ $0x00, R8 SBBQ p256const1<>+0(SB), R9 SBBQ $0x00, R10 CMOVQCS SI, R12 CMOVQCS R11, R13 CMOVQCS R14, R8 CMOVQCS R15, R9 MOVQ R12, (DI) MOVQ R13, 8(DI) MOVQ R8, 16(DI) MOVQ R9, 24(DI) RET // func p256FromMont(res *p256Element, in *p256Element) // Requires: CMOV TEXT ·p256FromMont(SB), NOSPLIT, $0-16 MOVQ res+0(FP), DI MOVQ in+8(FP), SI MOVQ (SI), R8 MOVQ 8(SI), R9 MOVQ 16(SI), R10 MOVQ 24(SI), R11 XORQ R12, R12 // Only reduce, no multiplications are needed // First stage MOVQ R8, AX MOVQ R8, R15 SHLQ $0x20, R8 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R8, R9 ADCQ R15, R10 ADCQ AX, R11 ADCQ DX, R12 XORQ R13, R13 // Second stage MOVQ R9, AX MOVQ R9, R15 SHLQ $0x20, R9 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R9, R10 ADCQ R15, R11 ADCQ AX, R12 ADCQ DX, R13 XORQ R8, R8 // Third stage MOVQ R10, AX MOVQ R10, R15 SHLQ $0x20, R10 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R10, R11 ADCQ R15, R12 ADCQ AX, R13 ADCQ DX, R8 XORQ R9, R9 // Last stage MOVQ R11, AX MOVQ R11, R15 SHLQ $0x20, R11 MULQ p256const1<>+0(SB) SHRQ $0x20, R15 ADDQ R11, R12 ADCQ R15, R13 ADCQ AX, R8 ADCQ DX, R9 MOVQ R12, SI MOVQ R13, R11 MOVQ R8, R14 MOVQ R9, R15 SUBQ $-1, R12 SBBQ p256const0<>+0(SB), R13 SBBQ $0x00, R8 SBBQ p256const1<>+0(SB), R9 CMOVQCS SI, R12 CMOVQCS R11, R13 CMOVQCS R14, R8 CMOVQCS R15, R9 MOVQ R12, (DI) MOVQ R13, 8(DI) MOVQ R8, 16(DI) MOVQ R9, 24(DI) RET // func p256Select(res *P256Point, table *p256Table, idx int) // Requires: SSE2 TEXT ·p256Select(SB), NOSPLIT, $0-24 MOVQ idx+16(FP), AX MOVQ table+8(FP), DI MOVQ res+0(FP), DX PXOR X15, X15 PCMPEQL X14, X14 PSUBL X14, X15 MOVL AX, X14 PSHUFD $0x00, X14, X14 PXOR X0, X0 PXOR X1, X1 PXOR X2, X2 PXOR X3, X3 PXOR X4, X4 PXOR X5, X5 MOVQ $0x00000010, AX MOVOU X15, X13 loop_select: MOVOU X13, X12 PADDL X15, X13 PCMPEQL X14, X12 MOVOU (DI), X6 MOVOU 16(DI), X7 MOVOU 32(DI), X8 MOVOU 48(DI), X9 MOVOU 64(DI), X10 MOVOU 80(DI), X11 ADDQ $0x60, DI PAND X12, X6 PAND X12, X7 PAND X12, X8 PAND X12, X9 PAND X12, X10 PAND X12, X11 PXOR X6, X0 PXOR X7, X1 PXOR X8, X2 PXOR X9, X3 PXOR X10, X4 PXOR X11, X5 DECQ AX JNE loop_select MOVOU X0, (DX) MOVOU X1, 16(DX) MOVOU X2, 32(DX) MOVOU X3, 48(DX) MOVOU X4, 64(DX) MOVOU X5, 80(DX) RET // func p256SelectAffine(res *p256AffinePoint, table *p256AffineTable, idx int) // Requires: SSE2 TEXT ·p256SelectAffine(SB), NOSPLIT, $0-24 MOVQ idx+16(FP), AX MOVQ table+8(FP), DI MOVQ res+0(FP), DX PXOR X15, X15 PCMPEQL X14, X14 PSUBL X14, X15 MOVL AX, X14 PSHUFD $0x00, X14, X14 PXOR X0, X0 PXOR X1, X1 PXOR X2, X2 PXOR X3, X3 MOVQ $0x00000010, AX MOVOU X15, X13 loop_select_base: MOVOU X13, X12 PADDL X15, X13 PCMPEQL X14, X12 MOVOU (DI), X4 MOVOU 16(DI), X5 MOVOU 32(DI), X6 MOVOU 48(DI), X7 MOVOU 64(DI), X8 MOVOU 80(DI), X9 MOVOU 96(DI), X10 MOVOU 112(DI), X11 ADDQ $0x80, DI PAND X12, X4 PAND X12, X5 PAND X12, X6 PAND X12, X7 MOVOU X13, X12 PADDL X15, X13 PCMPEQL X14, X12 PAND X12, X8 PAND X12, X9 PAND X12, X10 PAND X12, X11 PXOR X4, X0 PXOR X5, X1 PXOR X6, X2 PXOR X7, X3 PXOR X8, X0 PXOR X9, X1 PXOR X10, X2 PXOR X11, X3 DECQ AX JNE loop_select_base MOVOU X0, (DX) MOVOU X1, 16(DX) MOVOU X2, 32(DX) MOVOU X3, 48(DX) RET // func p256OrdMul(res *p256OrdElement, in1 *p256OrdElement, in2 *p256OrdElement) // Requires: CMOV TEXT ·p256OrdMul(SB), NOSPLIT, $0-24 MOVQ res+0(FP), DI MOVQ in1+8(FP), SI MOVQ in2+16(FP), CX // x * y[0] MOVQ (CX), R14 MOVQ (SI), AX MULQ R14 MOVQ AX, R8 MOVQ DX, R9 MOVQ 8(SI), AX MULQ R14 ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, R10 MOVQ 16(SI), AX MULQ R14 ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R11 MOVQ 24(SI), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R12 XORQ R13, R13 // First reduction step MOVQ R8, AX MULQ p256ordK0<>+0(SB) MOVQ AX, R14 MOVQ p256ord<>+0(SB), AX MULQ R14 ADDQ AX, R8 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+8(SB), AX MULQ R14 ADDQ R15, R9 ADCQ $0x00, DX ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+16(SB), AX MULQ R14 ADDQ R15, R10 ADCQ $0x00, DX ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+24(SB), AX MULQ R14 ADDQ R15, R11 ADCQ $0x00, DX ADDQ AX, R11 ADCQ DX, R12 ADCQ $0x00, R13 // x * y[1] MOVQ 8(CX), R14 MOVQ (SI), AX MULQ R14 ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 8(SI), AX MULQ R14 ADDQ R15, R10 ADCQ $0x00, DX ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 16(SI), AX MULQ R14 ADDQ R15, R11 ADCQ $0x00, DX ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 24(SI), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ DX, R13 ADCQ $0x00, R8 // Second reduction step MOVQ R9, AX MULQ p256ordK0<>+0(SB) MOVQ AX, R14 MOVQ p256ord<>+0(SB), AX MULQ R14 ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+8(SB), AX MULQ R14 ADDQ R15, R10 ADCQ $0x00, DX ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+16(SB), AX MULQ R14 ADDQ R15, R11 ADCQ $0x00, DX ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+24(SB), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ DX, R13 ADCQ $0x00, R8 // x * y[2] MOVQ 16(CX), R14 MOVQ (SI), AX MULQ R14 ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 8(SI), AX MULQ R14 ADDQ R15, R11 ADCQ $0x00, DX ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 16(SI), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 24(SI), AX MULQ R14 ADDQ R15, R13 ADCQ $0x00, DX ADDQ AX, R13 ADCQ DX, R8 ADCQ $0x00, R9 // Third reduction step MOVQ R10, AX MULQ p256ordK0<>+0(SB) MOVQ AX, R14 MOVQ p256ord<>+0(SB), AX MULQ R14 ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+8(SB), AX MULQ R14 ADDQ R15, R11 ADCQ $0x00, DX ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+16(SB), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+24(SB), AX MULQ R14 ADDQ R15, R13 ADCQ $0x00, DX ADDQ AX, R13 ADCQ DX, R8 ADCQ $0x00, R9 // x * y[3] MOVQ 24(CX), R14 MOVQ (SI), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 8(SI), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 16(SI), AX MULQ R14 ADDQ R15, R13 ADCQ $0x00, DX ADDQ AX, R13 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 24(SI), AX MULQ R14 ADDQ R15, R8 ADCQ $0x00, DX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0x00, R10 // Last reduction step MOVQ R11, AX MULQ p256ordK0<>+0(SB) MOVQ AX, R14 MOVQ p256ord<>+0(SB), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+8(SB), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+16(SB), AX MULQ R14 ADDQ R15, R13 ADCQ $0x00, DX ADDQ AX, R13 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+24(SB), AX MULQ R14 ADDQ R15, R8 ADCQ $0x00, DX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0x00, R10 // Copy result [255:0] MOVQ R12, SI MOVQ R13, R11 MOVQ R8, R14 MOVQ R9, R15 // Subtract p256 SUBQ p256ord<>+0(SB), R12 SBBQ p256ord<>+8(SB), R13 SBBQ p256ord<>+16(SB), R8 SBBQ p256ord<>+24(SB), R9 SBBQ $0x00, R10 CMOVQCS SI, R12 CMOVQCS R11, R13 CMOVQCS R14, R8 CMOVQCS R15, R9 MOVQ R12, (DI) MOVQ R13, 8(DI) MOVQ R8, 16(DI) MOVQ R9, 24(DI) RET DATA p256ordK0<>+0(SB)/8, $0xccd1c8aaee00bc4f GLOBL p256ordK0<>(SB), RODATA, $8 DATA p256ord<>+0(SB)/8, $0xf3b9cac2fc632551 DATA p256ord<>+8(SB)/8, $0xbce6faada7179e84 DATA p256ord<>+16(SB)/8, $0xffffffffffffffff DATA p256ord<>+24(SB)/8, $0xffffffff00000000 GLOBL p256ord<>(SB), RODATA, $32 // func p256OrdSqr(res *p256OrdElement, in *p256OrdElement, n int) // Requires: CMOV TEXT ·p256OrdSqr(SB), NOSPLIT, $0-24 MOVQ res+0(FP), DI MOVQ in+8(FP), SI MOVQ n+16(FP), BX ordSqrLoop: // y[1:] * y[0] MOVQ (SI), R14 MOVQ 8(SI), AX MULQ R14 MOVQ AX, R9 MOVQ DX, R10 MOVQ 16(SI), AX MULQ R14 ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R11 MOVQ 24(SI), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R12 // y[2:] * y[1] MOVQ 8(SI), R14 MOVQ 16(SI), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ 24(SI), AX MULQ R14 ADDQ R15, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ $0x00, DX MOVQ DX, R13 // y[3] * y[2] MOVQ 16(SI), R14 MOVQ 24(SI), AX MULQ R14 ADDQ AX, R13 ADCQ $0x00, DX MOVQ DX, CX XORQ R15, R15 // *2 ADDQ R9, R9 ADCQ R10, R10 ADCQ R11, R11 ADCQ R12, R12 ADCQ R13, R13 ADCQ CX, CX ADCQ $0x00, R15 // Missing products MOVQ (SI), AX MULQ AX MOVQ AX, R8 MOVQ DX, R14 MOVQ 8(SI), AX MULQ AX ADDQ R14, R9 ADCQ AX, R10 ADCQ $0x00, DX MOVQ DX, R14 MOVQ 16(SI), AX MULQ AX ADDQ R14, R11 ADCQ AX, R12 ADCQ $0x00, DX MOVQ DX, R14 MOVQ 24(SI), AX MULQ AX ADDQ R14, R13 ADCQ AX, CX ADCQ DX, R15 MOVQ R15, SI // First reduction step MOVQ R8, AX MULQ p256ordK0<>+0(SB) MOVQ AX, R14 MOVQ p256ord<>+0(SB), AX MULQ R14 ADDQ AX, R8 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+8(SB), AX MULQ R14 ADDQ R15, R9 ADCQ $0x00, DX ADDQ AX, R9 MOVQ R14, R15 ADCQ DX, R10 ADCQ $0x00, R15 SUBQ R14, R10 SBBQ $0x00, R15 MOVQ R14, AX MOVQ R14, DX MOVQ R14, R8 SHLQ $0x20, AX SHRQ $0x20, DX ADDQ R15, R11 ADCQ $0x00, R8 SUBQ AX, R11 SBBQ DX, R8 // Second reduction step MOVQ R9, AX MULQ p256ordK0<>+0(SB) MOVQ AX, R14 MOVQ p256ord<>+0(SB), AX MULQ R14 ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+8(SB), AX MULQ R14 ADDQ R15, R10 ADCQ $0x00, DX ADDQ AX, R10 MOVQ R14, R15 ADCQ DX, R11 ADCQ $0x00, R15 SUBQ R14, R11 SBBQ $0x00, R15 MOVQ R14, AX MOVQ R14, DX MOVQ R14, R9 SHLQ $0x20, AX SHRQ $0x20, DX ADDQ R15, R8 ADCQ $0x00, R9 SUBQ AX, R8 SBBQ DX, R9 // Third reduction step MOVQ R10, AX MULQ p256ordK0<>+0(SB) MOVQ AX, R14 MOVQ p256ord<>+0(SB), AX MULQ R14 ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+8(SB), AX MULQ R14 ADDQ R15, R11 ADCQ $0x00, DX ADDQ AX, R11 MOVQ R14, R15 ADCQ DX, R8 ADCQ $0x00, R15 SUBQ R14, R8 SBBQ $0x00, R15 MOVQ R14, AX MOVQ R14, DX MOVQ R14, R10 SHLQ $0x20, AX SHRQ $0x20, DX ADDQ R15, R9 ADCQ $0x00, R10 SUBQ AX, R9 SBBQ DX, R10 // Last reduction step MOVQ R11, AX MULQ p256ordK0<>+0(SB) MOVQ AX, R14 MOVQ p256ord<>+0(SB), AX MULQ R14 ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R15 MOVQ p256ord<>+8(SB), AX MULQ R14 ADDQ R15, R8 ADCQ $0x00, DX ADDQ AX, R8 ADCQ $0x00, DX MOVQ DX, R15 MOVQ R14, R15 ADCQ DX, R9 ADCQ $0x00, R15 SUBQ R14, R9 SBBQ $0x00, R15 MOVQ R14, AX MOVQ R14, DX MOVQ R14, R11 SHLQ $0x20, AX SHRQ $0x20, DX ADDQ R15, R10 ADCQ $0x00, R11 SUBQ AX, R10 SBBQ DX, R11 XORQ R14, R14 // Add bits [511:256] of the sqr result ADCQ R12, R8 ADCQ R13, R9 ADCQ CX, R10 ADCQ SI, R11 ADCQ $0x00, R14 MOVQ R8, R12 MOVQ R9, R13 MOVQ R10, CX MOVQ R11, R15 // Subtract p256 SUBQ p256ord<>+0(SB), R8 SBBQ p256ord<>+8(SB), R9 SBBQ p256ord<>+16(SB), R10 SBBQ p256ord<>+24(SB), R11 SBBQ $0x00, R14 CMOVQCS R12, R8 CMOVQCS R13, R9 CMOVQCS CX, R10 CMOVQCS R15, R11 MOVQ R8, (DI) MOVQ R9, 8(DI) MOVQ R10, 16(DI) MOVQ R11, 24(DI) MOVQ DI, SI DECQ BX JNE ordSqrLoop RET // func p256SubInternal() // Requires: CMOV TEXT p256SubInternal<>(SB), NOSPLIT, $0 XORQ AX, AX SUBQ R14, R10 SBBQ R15, R11 SBBQ DI, R12 SBBQ SI, R13 SBBQ $0x00, AX MOVQ R10, BX MOVQ R11, CX MOVQ R12, R8 MOVQ R13, R9 ADDQ $-1, R10 ADCQ p256const0<>+0(SB), R11 ADCQ $0x00, R12 ADCQ p256const1<>+0(SB), R13 ANDQ $0x01, AX CMOVQEQ BX, R10 CMOVQEQ CX, R11 CMOVQEQ R8, R12 CMOVQEQ R9, R13 RET // func p256MulInternal() // Requires: CMOV TEXT p256MulInternal<>(SB), NOSPLIT, $8 MOVQ R10, AX MULQ R14 MOVQ AX, BX MOVQ DX, CX MOVQ R10, AX MULQ R15 ADDQ AX, CX ADCQ $0x00, DX MOVQ DX, R8 MOVQ R10, AX MULQ DI ADDQ AX, R8 ADCQ $0x00, DX MOVQ DX, R9 MOVQ R10, AX MULQ SI ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, R10 MOVQ R11, AX MULQ R14 ADDQ AX, CX ADCQ $0x00, DX MOVQ DX, BP MOVQ R11, AX MULQ R15 ADDQ BP, R8 ADCQ $0x00, DX ADDQ AX, R8 ADCQ $0x00, DX MOVQ DX, BP MOVQ R11, AX MULQ DI ADDQ BP, R9 ADCQ $0x00, DX ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, BP MOVQ R11, AX MULQ SI ADDQ BP, R10 ADCQ $0x00, DX ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, R11 MOVQ R12, AX MULQ R14 ADDQ AX, R8 ADCQ $0x00, DX MOVQ DX, BP MOVQ R12, AX MULQ R15 ADDQ BP, R9 ADCQ $0x00, DX ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, BP MOVQ R12, AX MULQ DI ADDQ BP, R10 ADCQ $0x00, DX ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, BP MOVQ R12, AX MULQ SI ADDQ BP, R11 ADCQ $0x00, DX ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, R12 MOVQ R13, AX MULQ R14 ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, BP MOVQ R13, AX MULQ R15 ADDQ BP, R10 ADCQ $0x00, DX ADDQ AX, R10 ADCQ $0x00, DX MOVQ DX, BP MOVQ R13, AX MULQ DI ADDQ BP, R11 ADCQ $0x00, DX ADDQ AX, R11 ADCQ $0x00, DX MOVQ DX, BP MOVQ R13, AX MULQ SI ADDQ BP, R12 ADCQ $0x00, DX ADDQ AX, R12 ADCQ $0x00, DX MOVQ DX, R13 // First reduction step MOVQ BX, AX MOVQ BX, BP SHLQ $0x20, BX MULQ p256const1<>+0(SB) SHRQ $0x20, BP ADDQ BX, CX ADCQ BP, R8 ADCQ AX, R9 ADCQ $0x00, DX MOVQ DX, BX // Second reduction step MOVQ CX, AX MOVQ CX, BP SHLQ $0x20, CX MULQ p256const1<>+0(SB) SHRQ $0x20, BP ADDQ CX, R8 ADCQ BP, R9 ADCQ AX, BX ADCQ $0x00, DX MOVQ DX, CX // Third reduction step MOVQ R8, AX MOVQ R8, BP SHLQ $0x20, R8 MULQ p256const1<>+0(SB) SHRQ $0x20, BP ADDQ R8, R9 ADCQ BP, BX ADCQ AX, CX ADCQ $0x00, DX MOVQ DX, R8 // Last reduction step MOVQ R9, AX MOVQ R9, BP SHLQ $0x20, R9 MULQ p256const1<>+0(SB) SHRQ $0x20, BP ADDQ R9, BX ADCQ BP, CX ADCQ AX, R8 ADCQ $0x00, DX MOVQ DX, R9 MOVQ $0x00000000, BP // Add bits [511:256] of the result ADCQ BX, R10 ADCQ CX, R11 ADCQ R8, R12 ADCQ R9, R13 ADCQ $0x00, BP // Copy result MOVQ R10, BX MOVQ R11, CX MOVQ R12, R8 MOVQ R13, R9 // Subtract p256 SUBQ $-1, R10 SBBQ p256const0<>+0(SB), R11 SBBQ $0x00, R12 SBBQ p256const1<>+0(SB), R13 SBBQ $0x00, BP // If the result of the subtraction is negative, restore the previous result CMOVQCS BX, R10 CMOVQCS CX, R11 CMOVQCS R8, R12 CMOVQCS R9, R13 RET // func p256SqrInternal() // Requires: CMOV TEXT p256SqrInternal<>(SB), NOSPLIT, $8 MOVQ R10, AX MULQ R11 MOVQ AX, CX MOVQ DX, R8 MOVQ R10, AX MULQ R12 ADDQ AX, R8 ADCQ $0x00, DX MOVQ DX, R9 MOVQ R10, AX MULQ R13 ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, R14 MOVQ R11, AX MULQ R12 ADDQ AX, R9 ADCQ $0x00, DX MOVQ DX, BP MOVQ R11, AX MULQ R13 ADDQ BP, R14 ADCQ $0x00, DX ADDQ AX, R14 ADCQ $0x00, DX MOVQ DX, R15 MOVQ R12, AX MULQ R13 ADDQ AX, R15 ADCQ $0x00, DX MOVQ DX, DI XORQ SI, SI // *2 ADDQ CX, CX ADCQ R8, R8 ADCQ R9, R9 ADCQ R14, R14 ADCQ R15, R15 ADCQ DI, DI ADCQ $0x00, SI // Missing products MOVQ R10, AX MULQ AX MOVQ AX, BX MOVQ DX, R10 MOVQ R11, AX MULQ AX ADDQ R10, CX ADCQ AX, R8 ADCQ $0x00, DX MOVQ DX, R10 MOVQ R12, AX MULQ AX ADDQ R10, R9 ADCQ AX, R14 ADCQ $0x00, DX MOVQ DX, R10 MOVQ R13, AX MULQ AX ADDQ R10, R15 ADCQ AX, DI ADCQ DX, SI // First reduction step MOVQ BX, AX MOVQ BX, BP SHLQ $0x20, BX MULQ p256const1<>+0(SB) SHRQ $0x20, BP ADDQ BX, CX ADCQ BP, R8 ADCQ AX, R9 ADCQ $0x00, DX MOVQ DX, BX // Second reduction step MOVQ CX, AX MOVQ CX, BP SHLQ $0x20, CX MULQ p256const1<>+0(SB) SHRQ $0x20, BP ADDQ CX, R8 ADCQ BP, R9 ADCQ AX, BX ADCQ $0x00, DX MOVQ DX, CX // Third reduction step MOVQ R8, AX MOVQ R8, BP SHLQ $0x20, R8 MULQ p256const1<>+0(SB) SHRQ $0x20, BP ADDQ R8, R9 ADCQ BP, BX ADCQ AX, CX ADCQ $0x00, DX MOVQ DX, R8 // Last reduction step MOVQ R9, AX MOVQ R9, BP SHLQ $0x20, R9 MULQ p256const1<>+0(SB) SHRQ $0x20, BP ADDQ R9, BX ADCQ BP, CX ADCQ AX, R8 ADCQ $0x00, DX MOVQ DX, R9 MOVQ $0x00000000, BP // Add bits [511:256] of the result ADCQ BX, R14 ADCQ CX, R15 ADCQ R8, DI ADCQ R9, SI ADCQ $0x00, BP // Copy result MOVQ R14, R10 MOVQ R15, R11 MOVQ DI, R12 MOVQ SI, R13 // Subtract p256 SUBQ $-1, R10 SBBQ p256const0<>+0(SB), R11 SBBQ $0x00, R12 SBBQ p256const1<>+0(SB), R13 SBBQ $0x00, BP // If the result of the subtraction is negative, restore the previous result CMOVQCS R14, R10 CMOVQCS R15, R11 CMOVQCS DI, R12 CMOVQCS SI, R13 RET // func p256PointAddAffineAsm(res *P256Point, in1 *P256Point, in2 *p256AffinePoint, sign int, sel int, zero int) // Requires: CMOV, SSE2 TEXT ·p256PointAddAffineAsm(SB), $512-48 MOVQ res+0(FP), AX MOVQ in1+8(FP), BX MOVQ in2+16(FP), CX MOVQ sign+24(FP), DX MOVQ sel+32(FP), R15 MOVQ zero+40(FP), DI MOVOU (BX), X0 MOVOU 16(BX), X1 MOVOU 32(BX), X2 MOVOU 48(BX), X3 MOVOU 64(BX), X4 MOVOU 80(BX), X5 MOVOU X0, (SP) MOVOU X1, 16(SP) MOVOU X2, 32(SP) MOVOU X3, 48(SP) MOVOU X4, 64(SP) MOVOU X5, 80(SP) MOVOU (CX), X0 MOVOU 16(CX), X1 MOVOU X0, 96(SP) MOVOU X1, 112(SP) // Store pointer to result MOVQ AX, 480(SP) MOVL R15, 488(SP) MOVL DI, 492(SP) // Negate y2in based on sign MOVQ 32(CX), R10 MOVQ 40(CX), R11 MOVQ 48(CX), R12 MOVQ 56(CX), R13 MOVQ $-1, BX MOVQ p256const0<>+0(SB), CX MOVQ $0x00000000, R8 MOVQ p256const1<>+0(SB), R9 XORQ AX, AX // Speculatively subtract SUBQ R10, BX SBBQ R11, CX SBBQ R12, R8 SBBQ R13, R9 SBBQ $0x00, AX MOVQ BX, R14 MOVQ CX, R15 MOVQ R8, DI MOVQ R9, SI // Add in case the operand was > p256 ADDQ $-1, BX ADCQ p256const0<>+0(SB), CX ADCQ $0x00, R8 ADCQ p256const1<>+0(SB), R9 ADCQ $0x00, AX CMOVQNE R14, BX CMOVQNE R15, CX CMOVQNE DI, R8 CMOVQNE SI, R9 // If condition is 0, keep original value TESTQ DX, DX CMOVQEQ R10, BX CMOVQEQ R11, CX CMOVQEQ R12, R8 CMOVQEQ R13, R9 // Store result MOVQ BX, 128(SP) MOVQ CX, 136(SP) MOVQ R8, 144(SP) MOVQ R9, 152(SP) // Begin point add MOVQ 64(SP), R10 MOVQ 72(SP), R11 MOVQ 80(SP), R12 MOVQ 88(SP), R13 CALL p256SqrInternal<>(SB) MOVQ R10, 288(SP) MOVQ R11, 296(SP) MOVQ R12, 304(SP) MOVQ R13, 312(SP) MOVQ 96(SP), R14 MOVQ 104(SP), R15 MOVQ 112(SP), DI MOVQ 120(SP), SI CALL p256MulInternal<>(SB) MOVQ (SP), R14 MOVQ 8(SP), R15 MOVQ 16(SP), DI MOVQ 24(SP), SI CALL p256SubInternal<>(SB) MOVQ R10, 320(SP) MOVQ R11, 328(SP) MOVQ R12, 336(SP) MOVQ R13, 344(SP) MOVQ 64(SP), R14 MOVQ 72(SP), R15 MOVQ 80(SP), DI MOVQ 88(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 224(SP) MOVQ R11, 232(SP) MOVQ R12, 240(SP) MOVQ R13, 248(SP) MOVQ 288(SP), R10 MOVQ 296(SP), R11 MOVQ 304(SP), R12 MOVQ 312(SP), R13 CALL p256MulInternal<>(SB) MOVQ 128(SP), R14 MOVQ 136(SP), R15 MOVQ 144(SP), DI MOVQ 152(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 256(SP) MOVQ R11, 264(SP) MOVQ R12, 272(SP) MOVQ R13, 280(SP) MOVQ 32(SP), R14 MOVQ 40(SP), R15 MOVQ 48(SP), DI MOVQ 56(SP), SI CALL p256SubInternal<>(SB) MOVQ R10, 352(SP) MOVQ R11, 360(SP) MOVQ R12, 368(SP) MOVQ R13, 376(SP) CALL p256SqrInternal<>(SB) MOVQ R10, 416(SP) MOVQ R11, 424(SP) MOVQ R12, 432(SP) MOVQ R13, 440(SP) MOVQ 320(SP), R10 MOVQ 328(SP), R11 MOVQ 336(SP), R12 MOVQ 344(SP), R13 CALL p256SqrInternal<>(SB) MOVQ R10, 384(SP) MOVQ R11, 392(SP) MOVQ R12, 400(SP) MOVQ R13, 408(SP) MOVQ 320(SP), R14 MOVQ 328(SP), R15 MOVQ 336(SP), DI MOVQ 344(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 448(SP) MOVQ R11, 456(SP) MOVQ R12, 464(SP) MOVQ R13, 472(SP) MOVQ 32(SP), R14 MOVQ 40(SP), R15 MOVQ 48(SP), DI MOVQ 56(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 256(SP) MOVQ R11, 264(SP) MOVQ R12, 272(SP) MOVQ R13, 280(SP) MOVQ (SP), R10 MOVQ 8(SP), R11 MOVQ 16(SP), R12 MOVQ 24(SP), R13 MOVQ 384(SP), R14 MOVQ 392(SP), R15 MOVQ 400(SP), DI MOVQ 408(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 320(SP) MOVQ R11, 328(SP) MOVQ R12, 336(SP) MOVQ R13, 344(SP) XORQ AX, AX ADDQ R10, R10 ADCQ R11, R11 ADCQ R12, R12 ADCQ R13, R13 ADCQ $+0, AX MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI SUBQ $-1, R14 SBBQ p256const0<>+0(SB), R15 SBBQ $+0, DI SBBQ p256const1<>+0(SB), SI SBBQ $+0, AX CMOVQCS R10, R14 CMOVQCS R11, R15 CMOVQCS R12, DI CMOVQCS R13, SI MOVQ 416(SP), R10 MOVQ 424(SP), R11 MOVQ 432(SP), R12 MOVQ 440(SP), R13 CALL p256SubInternal<>(SB) MOVQ 448(SP), R14 MOVQ 456(SP), R15 MOVQ 464(SP), DI MOVQ 472(SP), SI CALL p256SubInternal<>(SB) MOVQ R10, 160(SP) MOVQ R11, 168(SP) MOVQ R12, 176(SP) MOVQ R13, 184(SP) MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI MOVQ 320(SP), R10 MOVQ 328(SP), R11 MOVQ 336(SP), R12 MOVQ 344(SP), R13 CALL p256SubInternal<>(SB) MOVQ 352(SP), R14 MOVQ 360(SP), R15 MOVQ 368(SP), DI MOVQ 376(SP), SI CALL p256MulInternal<>(SB) MOVQ 256(SP), R14 MOVQ 264(SP), R15 MOVQ 272(SP), DI MOVQ 280(SP), SI CALL p256SubInternal<>(SB) MOVQ R10, 192(SP) MOVQ R11, 200(SP) MOVQ R12, 208(SP) MOVQ R13, 216(SP) // Load stored values from stack MOVQ 480(SP), AX MOVL 488(SP), BX MOVL 492(SP), CX // The result is not valid if (sel == 0), conditional choose MOVOU 160(SP), X0 MOVOU 176(SP), X1 MOVOU 192(SP), X2 MOVOU 208(SP), X3 MOVOU 224(SP), X4 MOVOU 240(SP), X5 MOVL BX, X6 MOVL CX, X7 PXOR X8, X8 PCMPEQL X9, X9 PSHUFD $0x00, X6, X6 PSHUFD $0x00, X7, X7 PCMPEQL X8, X6 PCMPEQL X8, X7 MOVOU X6, X15 PANDN X9, X15 MOVOU (SP), X9 MOVOU 16(SP), X10 MOVOU 32(SP), X11 MOVOU 48(SP), X12 MOVOU 64(SP), X13 MOVOU 80(SP), X14 PAND X15, X0 PAND X15, X1 PAND X15, X2 PAND X15, X3 PAND X15, X4 PAND X15, X5 PAND X6, X9 PAND X6, X10 PAND X6, X11 PAND X6, X12 PAND X6, X13 PAND X6, X14 PXOR X9, X0 PXOR X10, X1 PXOR X11, X2 PXOR X12, X3 PXOR X13, X4 PXOR X14, X5 // Similarly if zero == 0 PCMPEQL X9, X9 MOVOU X7, X15 PANDN X9, X15 MOVOU 96(SP), X9 MOVOU 112(SP), X10 MOVOU 128(SP), X11 MOVOU 144(SP), X12 MOVOU p256one<>+0(SB), X13 MOVOU p256one<>+16(SB), X14 PAND X15, X0 PAND X15, X1 PAND X15, X2 PAND X15, X3 PAND X15, X4 PAND X15, X5 PAND X7, X9 PAND X7, X10 PAND X7, X11 PAND X7, X12 PAND X7, X13 PAND X7, X14 PXOR X9, X0 PXOR X10, X1 PXOR X11, X2 PXOR X12, X3 PXOR X13, X4 PXOR X14, X5 // Finally output the result MOVOU X0, (AX) MOVOU X1, 16(AX) MOVOU X2, 32(AX) MOVOU X3, 48(AX) MOVOU X4, 64(AX) MOVOU X5, 80(AX) MOVQ $0x00000000, 480(SP) RET DATA p256one<>+0(SB)/8, $0x0000000000000001 DATA p256one<>+8(SB)/8, $0xffffffff00000000 DATA p256one<>+16(SB)/8, $0xffffffffffffffff DATA p256one<>+24(SB)/8, $0x00000000fffffffe GLOBL p256one<>(SB), RODATA, $32 // func p256IsZero() // Requires: CMOV TEXT p256IsZero<>(SB), NOSPLIT, $0 // AX contains a flag that is set if the input is zero. XORQ AX, AX MOVQ $0x00000001, R15 // Check whether [acc4..acc7] are all zero. MOVQ R10, R14 ORQ R11, R14 ORQ R12, R14 ORQ R13, R14 // Set the zero flag if so. (CMOV of a constant to a register doesn't // appear to be supported in Go. Thus t1 = 1.) CMOVQEQ R15, AX // XOR [acc4..acc7] with P and compare with zero again. XORQ $-1, R10 XORQ p256const0<>+0(SB), R11 XORQ p256const1<>+0(SB), R13 ORQ R11, R10 ORQ R12, R10 ORQ R13, R10 // Set the zero flag if so. CMOVQEQ R15, AX RET // func p256PointAddAsm(res *P256Point, in1 *P256Point, in2 *P256Point) int // Requires: CMOV, SSE2 TEXT ·p256PointAddAsm(SB), $680-32 // Move input to stack in order to free registers MOVQ res+0(FP), AX MOVQ in1+8(FP), BX MOVQ in2+16(FP), CX MOVOU (BX), X0 MOVOU 16(BX), X1 MOVOU 32(BX), X2 MOVOU 48(BX), X3 MOVOU 64(BX), X4 MOVOU 80(BX), X5 MOVOU X0, (SP) MOVOU X1, 16(SP) MOVOU X2, 32(SP) MOVOU X3, 48(SP) MOVOU X4, 64(SP) MOVOU X5, 80(SP) MOVOU (CX), X0 MOVOU 16(CX), X1 MOVOU 32(CX), X2 MOVOU 48(CX), X3 MOVOU 64(CX), X4 MOVOU 80(CX), X5 MOVOU X0, 96(SP) MOVOU X1, 112(SP) MOVOU X2, 128(SP) MOVOU X3, 144(SP) MOVOU X4, 160(SP) MOVOU X5, 176(SP) // Store pointer to result MOVQ AX, 640(SP) // Begin point add MOVQ 160(SP), R10 MOVQ 168(SP), R11 MOVQ 176(SP), R12 MOVQ 184(SP), R13 CALL p256SqrInternal<>(SB) MOVQ R10, 448(SP) MOVQ R11, 456(SP) MOVQ R12, 464(SP) MOVQ R13, 472(SP) MOVQ 160(SP), R14 MOVQ 168(SP), R15 MOVQ 176(SP), DI MOVQ 184(SP), SI CALL p256MulInternal<>(SB) MOVQ 32(SP), R14 MOVQ 40(SP), R15 MOVQ 48(SP), DI MOVQ 56(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 352(SP) MOVQ R11, 360(SP) MOVQ R12, 368(SP) MOVQ R13, 376(SP) MOVQ 64(SP), R10 MOVQ 72(SP), R11 MOVQ 80(SP), R12 MOVQ 88(SP), R13 CALL p256SqrInternal<>(SB) MOVQ R10, 416(SP) MOVQ R11, 424(SP) MOVQ R12, 432(SP) MOVQ R13, 440(SP) MOVQ 64(SP), R14 MOVQ 72(SP), R15 MOVQ 80(SP), DI MOVQ 88(SP), SI CALL p256MulInternal<>(SB) MOVQ 128(SP), R14 MOVQ 136(SP), R15 MOVQ 144(SP), DI MOVQ 152(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 384(SP) MOVQ R11, 392(SP) MOVQ R12, 400(SP) MOVQ R13, 408(SP) MOVQ 352(SP), R14 MOVQ 360(SP), R15 MOVQ 368(SP), DI MOVQ 376(SP), SI CALL p256SubInternal<>(SB) MOVQ R10, 512(SP) MOVQ R11, 520(SP) MOVQ R12, 528(SP) MOVQ R13, 536(SP) CALL p256IsZero<>(SB) MOVQ AX, 648(SP) MOVQ 448(SP), R10 MOVQ 456(SP), R11 MOVQ 464(SP), R12 MOVQ 472(SP), R13 MOVQ (SP), R14 MOVQ 8(SP), R15 MOVQ 16(SP), DI MOVQ 24(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 288(SP) MOVQ R11, 296(SP) MOVQ R12, 304(SP) MOVQ R13, 312(SP) MOVQ 416(SP), R10 MOVQ 424(SP), R11 MOVQ 432(SP), R12 MOVQ 440(SP), R13 MOVQ 96(SP), R14 MOVQ 104(SP), R15 MOVQ 112(SP), DI MOVQ 120(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 320(SP) MOVQ R11, 328(SP) MOVQ R12, 336(SP) MOVQ R13, 344(SP) MOVQ 288(SP), R14 MOVQ 296(SP), R15 MOVQ 304(SP), DI MOVQ 312(SP), SI CALL p256SubInternal<>(SB) MOVQ R10, 480(SP) MOVQ R11, 488(SP) MOVQ R12, 496(SP) MOVQ R13, 504(SP) CALL p256IsZero<>(SB) ANDQ 648(SP), AX MOVQ AX, 648(SP) MOVQ 512(SP), R10 MOVQ 520(SP), R11 MOVQ 528(SP), R12 MOVQ 536(SP), R13 CALL p256SqrInternal<>(SB) MOVQ R10, 576(SP) MOVQ R11, 584(SP) MOVQ R12, 592(SP) MOVQ R13, 600(SP) MOVQ 480(SP), R10 MOVQ 488(SP), R11 MOVQ 496(SP), R12 MOVQ 504(SP), R13 CALL p256SqrInternal<>(SB) MOVQ R10, 544(SP) MOVQ R11, 552(SP) MOVQ R12, 560(SP) MOVQ R13, 568(SP) MOVQ 480(SP), R14 MOVQ 488(SP), R15 MOVQ 496(SP), DI MOVQ 504(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 608(SP) MOVQ R11, 616(SP) MOVQ R12, 624(SP) MOVQ R13, 632(SP) MOVQ 352(SP), R14 MOVQ 360(SP), R15 MOVQ 368(SP), DI MOVQ 376(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 384(SP) MOVQ R11, 392(SP) MOVQ R12, 400(SP) MOVQ R13, 408(SP) MOVQ 64(SP), R10 MOVQ 72(SP), R11 MOVQ 80(SP), R12 MOVQ 88(SP), R13 MOVQ 160(SP), R14 MOVQ 168(SP), R15 MOVQ 176(SP), DI MOVQ 184(SP), SI CALL p256MulInternal<>(SB) MOVQ 480(SP), R14 MOVQ 488(SP), R15 MOVQ 496(SP), DI MOVQ 504(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 256(SP) MOVQ R11, 264(SP) MOVQ R12, 272(SP) MOVQ R13, 280(SP) MOVQ 544(SP), R10 MOVQ 552(SP), R11 MOVQ 560(SP), R12 MOVQ 568(SP), R13 MOVQ 288(SP), R14 MOVQ 296(SP), R15 MOVQ 304(SP), DI MOVQ 312(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 320(SP) MOVQ R11, 328(SP) MOVQ R12, 336(SP) MOVQ R13, 344(SP) XORQ AX, AX ADDQ R10, R10 ADCQ R11, R11 ADCQ R12, R12 ADCQ R13, R13 ADCQ $+0, AX MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI SUBQ $-1, R14 SBBQ p256const0<>+0(SB), R15 SBBQ $+0, DI SBBQ p256const1<>+0(SB), SI SBBQ $+0, AX CMOVQCS R10, R14 CMOVQCS R11, R15 CMOVQCS R12, DI CMOVQCS R13, SI MOVQ 576(SP), R10 MOVQ 584(SP), R11 MOVQ 592(SP), R12 MOVQ 600(SP), R13 CALL p256SubInternal<>(SB) MOVQ 608(SP), R14 MOVQ 616(SP), R15 MOVQ 624(SP), DI MOVQ 632(SP), SI CALL p256SubInternal<>(SB) MOVQ R10, 192(SP) MOVQ R11, 200(SP) MOVQ R12, 208(SP) MOVQ R13, 216(SP) MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI MOVQ 320(SP), R10 MOVQ 328(SP), R11 MOVQ 336(SP), R12 MOVQ 344(SP), R13 CALL p256SubInternal<>(SB) MOVQ 512(SP), R14 MOVQ 520(SP), R15 MOVQ 528(SP), DI MOVQ 536(SP), SI CALL p256MulInternal<>(SB) MOVQ 384(SP), R14 MOVQ 392(SP), R15 MOVQ 400(SP), DI MOVQ 408(SP), SI CALL p256SubInternal<>(SB) MOVQ R10, 224(SP) MOVQ R11, 232(SP) MOVQ R12, 240(SP) MOVQ R13, 248(SP) MOVOU 192(SP), X0 MOVOU 208(SP), X1 MOVOU 224(SP), X2 MOVOU 240(SP), X3 MOVOU 256(SP), X4 MOVOU 272(SP), X5 // Finally output the result MOVQ 640(SP), AX MOVQ $0x00000000, 640(SP) MOVOU X0, (AX) MOVOU X1, 16(AX) MOVOU X2, 32(AX) MOVOU X3, 48(AX) MOVOU X4, 64(AX) MOVOU X5, 80(AX) MOVQ 648(SP), AX MOVQ AX, ret+24(FP) RET // func p256PointDoubleAsm(res *P256Point, in *P256Point) // Requires: CMOV, SSE2 TEXT ·p256PointDoubleAsm(SB), NOSPLIT, $256-16 MOVQ res+0(FP), AX MOVQ in+8(FP), BX MOVOU (BX), X0 MOVOU 16(BX), X1 MOVOU 32(BX), X2 MOVOU 48(BX), X3 MOVOU 64(BX), X4 MOVOU 80(BX), X5 MOVOU X0, (SP) MOVOU X1, 16(SP) MOVOU X2, 32(SP) MOVOU X3, 48(SP) MOVOU X4, 64(SP) MOVOU X5, 80(SP) // Store pointer to result MOVQ AX, 224(SP) // Begin point double MOVQ 64(SP), R10 MOVQ 72(SP), R11 MOVQ 80(SP), R12 MOVQ 88(SP), R13 CALL p256SqrInternal<>(SB) MOVQ R10, 160(SP) MOVQ R11, 168(SP) MOVQ R12, 176(SP) MOVQ R13, 184(SP) MOVQ (SP), R14 MOVQ 8(SP), R15 MOVQ 16(SP), DI MOVQ 24(SP), SI XORQ AX, AX ADDQ R14, R10 ADCQ R15, R11 ADCQ DI, R12 ADCQ SI, R13 ADCQ $+0, AX MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI SUBQ $-1, R14 SBBQ p256const0<>+0(SB), R15 SBBQ $+0, DI SBBQ p256const1<>+0(SB), SI SBBQ $+0, AX CMOVQCS R10, R14 CMOVQCS R11, R15 CMOVQCS R12, DI CMOVQCS R13, SI MOVQ R14, 128(SP) MOVQ R15, 136(SP) MOVQ DI, 144(SP) MOVQ SI, 152(SP) MOVQ 64(SP), R10 MOVQ 72(SP), R11 MOVQ 80(SP), R12 MOVQ 88(SP), R13 MOVQ 32(SP), R14 MOVQ 40(SP), R15 MOVQ 48(SP), DI MOVQ 56(SP), SI CALL p256MulInternal<>(SB) XORQ AX, AX ADDQ R10, R10 ADCQ R11, R11 ADCQ R12, R12 ADCQ R13, R13 ADCQ $+0, AX MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI SUBQ $-1, R14 SBBQ p256const0<>+0(SB), R15 SBBQ $+0, DI SBBQ p256const1<>+0(SB), SI SBBQ $+0, AX CMOVQCS R10, R14 CMOVQCS R11, R15 CMOVQCS R12, DI CMOVQCS R13, SI MOVQ 224(SP), AX // Store z MOVQ R14, 64(AX) MOVQ R15, 72(AX) MOVQ DI, 80(AX) MOVQ SI, 88(AX) MOVQ (SP), R10 MOVQ 8(SP), R11 MOVQ 16(SP), R12 MOVQ 24(SP), R13 MOVQ 160(SP), R14 MOVQ 168(SP), R15 MOVQ 176(SP), DI MOVQ 184(SP), SI CALL p256SubInternal<>(SB) MOVQ 128(SP), R14 MOVQ 136(SP), R15 MOVQ 144(SP), DI MOVQ 152(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 128(SP) MOVQ R11, 136(SP) MOVQ R12, 144(SP) MOVQ R13, 152(SP) // Multiply by 3 XORQ AX, AX ADDQ R10, R10 ADCQ R11, R11 ADCQ R12, R12 ADCQ R13, R13 ADCQ $+0, AX MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI SUBQ $-1, R14 SBBQ p256const0<>+0(SB), R15 SBBQ $+0, DI SBBQ p256const1<>+0(SB), SI SBBQ $+0, AX CMOVQCS R10, R14 CMOVQCS R11, R15 CMOVQCS R12, DI CMOVQCS R13, SI MOVQ 128(SP), R10 MOVQ 136(SP), R11 MOVQ 144(SP), R12 MOVQ 152(SP), R13 XORQ AX, AX ADDQ R14, R10 ADCQ R15, R11 ADCQ DI, R12 ADCQ SI, R13 ADCQ $+0, AX MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI SUBQ $-1, R14 SBBQ p256const0<>+0(SB), R15 SBBQ $+0, DI SBBQ p256const1<>+0(SB), SI SBBQ $+0, AX CMOVQCS R10, R14 CMOVQCS R11, R15 CMOVQCS R12, DI CMOVQCS R13, SI MOVQ R14, 128(SP) MOVQ R15, 136(SP) MOVQ DI, 144(SP) MOVQ SI, 152(SP) // //////////////////////// MOVQ 32(SP), R10 MOVQ 40(SP), R11 MOVQ 48(SP), R12 MOVQ 56(SP), R13 XORQ AX, AX ADDQ R10, R10 ADCQ R11, R11 ADCQ R12, R12 ADCQ R13, R13 ADCQ $+0, AX MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI SUBQ $-1, R14 SBBQ p256const0<>+0(SB), R15 SBBQ $+0, DI SBBQ p256const1<>+0(SB), SI SBBQ $+0, AX CMOVQCS R10, R14 CMOVQCS R11, R15 CMOVQCS R12, DI CMOVQCS R13, SI MOVQ R14, R10 MOVQ R15, R11 MOVQ DI, R12 MOVQ SI, R13 CALL p256SqrInternal<>(SB) MOVQ R10, 96(SP) MOVQ R11, 104(SP) MOVQ R12, 112(SP) MOVQ R13, 120(SP) CALL p256SqrInternal<>(SB) // Divide by 2 XORQ AX, AX MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI ADDQ $-1, R10 ADCQ p256const0<>+0(SB), R11 ADCQ $0x00, R12 ADCQ p256const1<>+0(SB), R13 ADCQ $0x00, AX TESTQ $0x00000001, R14 CMOVQEQ R14, R10 CMOVQEQ R15, R11 CMOVQEQ DI, R12 CMOVQEQ SI, R13 ANDQ R14, AX SHRQ $0x01, R11, R10 SHRQ $0x01, R12, R11 SHRQ $0x01, R13, R12 SHRQ $0x01, AX, R13 MOVQ R10, 32(SP) MOVQ R11, 40(SP) MOVQ R12, 48(SP) MOVQ R13, 56(SP) // ///////////////////////// MOVQ (SP), R10 MOVQ 8(SP), R11 MOVQ 16(SP), R12 MOVQ 24(SP), R13 MOVQ 96(SP), R14 MOVQ 104(SP), R15 MOVQ 112(SP), DI MOVQ 120(SP), SI CALL p256MulInternal<>(SB) MOVQ R10, 96(SP) MOVQ R11, 104(SP) MOVQ R12, 112(SP) MOVQ R13, 120(SP) XORQ AX, AX ADDQ R10, R10 ADCQ R11, R11 ADCQ R12, R12 ADCQ R13, R13 ADCQ $+0, AX MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI SUBQ $-1, R14 SBBQ p256const0<>+0(SB), R15 SBBQ $+0, DI SBBQ p256const1<>+0(SB), SI SBBQ $+0, AX CMOVQCS R10, R14 CMOVQCS R11, R15 CMOVQCS R12, DI CMOVQCS R13, SI MOVQ R14, 192(SP) MOVQ R15, 200(SP) MOVQ DI, 208(SP) MOVQ SI, 216(SP) MOVQ 128(SP), R10 MOVQ 136(SP), R11 MOVQ 144(SP), R12 MOVQ 152(SP), R13 CALL p256SqrInternal<>(SB) MOVQ 192(SP), R14 MOVQ 200(SP), R15 MOVQ 208(SP), DI MOVQ 216(SP), SI CALL p256SubInternal<>(SB) MOVQ 224(SP), AX // Store x MOVQ R10, (AX) MOVQ R11, 8(AX) MOVQ R12, 16(AX) MOVQ R13, 24(AX) MOVQ R10, R14 MOVQ R11, R15 MOVQ R12, DI MOVQ R13, SI MOVQ 96(SP), R10 MOVQ 104(SP), R11 MOVQ 112(SP), R12 MOVQ 120(SP), R13 CALL p256SubInternal<>(SB) MOVQ 128(SP), R14 MOVQ 136(SP), R15 MOVQ 144(SP), DI MOVQ 152(SP), SI CALL p256MulInternal<>(SB) MOVQ 32(SP), R14 MOVQ 40(SP), R15 MOVQ 48(SP), DI MOVQ 56(SP), SI CALL p256SubInternal<>(SB) MOVQ 224(SP), AX // Store y MOVQ R10, 32(AX) MOVQ R11, 40(AX) MOVQ R12, 48(AX) MOVQ R13, 56(AX) // /////////////////////// MOVQ $0x00000000, 224(SP) RET golang-filippo-nistec-0.0.4/p256_asm_arm64.s000066400000000000000000000715151512422514700204520ustar00rootroot00000000000000// Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build !purego // This file contains constant-time, 64-bit assembly implementation of // P256. The optimizations performed here are described in detail in: // S.Gueron and V.Krasnov, "Fast prime field elliptic-curve cryptography with // 256-bit primes" // http://link.springer.com/article/10.1007%2Fs13389-014-0090-x // https://eprint.iacr.org/2013/816.pdf #include "textflag.h" #define res_ptr R0 #define a_ptr R1 #define b_ptr R2 #define acc0 R3 #define acc1 R4 #define acc2 R5 #define acc3 R6 #define acc4 R7 #define acc5 R8 #define acc6 R9 #define acc7 R10 #define t0 R11 #define t1 R12 #define t2 R13 #define t3 R14 #define const0 R15 #define const1 R16 #define hlp0 R17 #define hlp1 res_ptr #define x0 R19 #define x1 R20 #define x2 R21 #define x3 R22 #define y0 R23 #define y1 R24 #define y2 R25 #define y3 R26 #define const2 t2 #define const3 t3 DATA p256const0<>+0x00(SB)/8, $0x00000000ffffffff DATA p256const1<>+0x00(SB)/8, $0xffffffff00000001 DATA p256ordK0<>+0x00(SB)/8, $0xccd1c8aaee00bc4f DATA p256ord<>+0x00(SB)/8, $0xf3b9cac2fc632551 DATA p256ord<>+0x08(SB)/8, $0xbce6faada7179e84 DATA p256ord<>+0x10(SB)/8, $0xffffffffffffffff DATA p256ord<>+0x18(SB)/8, $0xffffffff00000000 DATA p256one<>+0x00(SB)/8, $0x0000000000000001 DATA p256one<>+0x08(SB)/8, $0xffffffff00000000 DATA p256one<>+0x10(SB)/8, $0xffffffffffffffff DATA p256one<>+0x18(SB)/8, $0x00000000fffffffe GLOBL p256const0<>(SB), 8, $8 GLOBL p256const1<>(SB), 8, $8 GLOBL p256ordK0<>(SB), 8, $8 GLOBL p256ord<>(SB), 8, $32 GLOBL p256one<>(SB), 8, $32 /* ---------------------------------------*/ // func p256MovCond(res, a, b *P256Point, cond int) // If cond == 0 res=b, else res=a TEXT ·p256MovCond(SB),NOSPLIT,$0 MOVD res+0(FP), res_ptr MOVD a+8(FP), a_ptr MOVD b+16(FP), b_ptr MOVD cond+24(FP), R3 CMP $0, R3 // Two remarks: // 1) Will want to revisit NEON, when support is better // 2) CSEL might not be constant time on all ARM processors LDP 0*16(a_ptr), (R4, R5) LDP 1*16(a_ptr), (R6, R7) LDP 2*16(a_ptr), (R8, R9) LDP 0*16(b_ptr), (R16, R17) LDP 1*16(b_ptr), (R19, R20) LDP 2*16(b_ptr), (R21, R22) CSEL EQ, R16, R4, R4 CSEL EQ, R17, R5, R5 CSEL EQ, R19, R6, R6 CSEL EQ, R20, R7, R7 CSEL EQ, R21, R8, R8 CSEL EQ, R22, R9, R9 STP (R4, R5), 0*16(res_ptr) STP (R6, R7), 1*16(res_ptr) STP (R8, R9), 2*16(res_ptr) LDP 3*16(a_ptr), (R4, R5) LDP 4*16(a_ptr), (R6, R7) LDP 5*16(a_ptr), (R8, R9) LDP 3*16(b_ptr), (R16, R17) LDP 4*16(b_ptr), (R19, R20) LDP 5*16(b_ptr), (R21, R22) CSEL EQ, R16, R4, R4 CSEL EQ, R17, R5, R5 CSEL EQ, R19, R6, R6 CSEL EQ, R20, R7, R7 CSEL EQ, R21, R8, R8 CSEL EQ, R22, R9, R9 STP (R4, R5), 3*16(res_ptr) STP (R6, R7), 4*16(res_ptr) STP (R8, R9), 5*16(res_ptr) RET /* ---------------------------------------*/ // func p256NegCond(val *p256Element, cond int) TEXT ·p256NegCond(SB),NOSPLIT,$0 MOVD val+0(FP), a_ptr MOVD cond+8(FP), hlp0 MOVD a_ptr, res_ptr // acc = poly MOVD $-1, acc0 MOVD p256const0<>(SB), acc1 MOVD $0, acc2 MOVD p256const1<>(SB), acc3 // Load the original value LDP 0*16(a_ptr), (t0, t1) LDP 1*16(a_ptr), (t2, t3) // Speculatively subtract SUBS t0, acc0 SBCS t1, acc1 SBCS t2, acc2 SBC t3, acc3 // If condition is 0, keep original value CMP $0, hlp0 CSEL EQ, t0, acc0, acc0 CSEL EQ, t1, acc1, acc1 CSEL EQ, t2, acc2, acc2 CSEL EQ, t3, acc3, acc3 // Store result STP (acc0, acc1), 0*16(res_ptr) STP (acc2, acc3), 1*16(res_ptr) RET /* ---------------------------------------*/ // func p256Sqr(res, in *p256Element, n int) TEXT ·p256Sqr(SB),NOSPLIT,$0 MOVD res+0(FP), res_ptr MOVD in+8(FP), a_ptr MOVD n+16(FP), b_ptr MOVD p256const0<>(SB), const0 MOVD p256const1<>(SB), const1 LDP 0*16(a_ptr), (x0, x1) LDP 1*16(a_ptr), (x2, x3) sqrLoop: SUB $1, b_ptr CALL p256SqrInternal<>(SB) MOVD y0, x0 MOVD y1, x1 MOVD y2, x2 MOVD y3, x3 CBNZ b_ptr, sqrLoop STP (y0, y1), 0*16(res_ptr) STP (y2, y3), 1*16(res_ptr) RET /* ---------------------------------------*/ // func p256Mul(res, in1, in2 *p256Element) TEXT ·p256Mul(SB),NOSPLIT,$0 MOVD res+0(FP), res_ptr MOVD in1+8(FP), a_ptr MOVD in2+16(FP), b_ptr MOVD p256const0<>(SB), const0 MOVD p256const1<>(SB), const1 LDP 0*16(a_ptr), (x0, x1) LDP 1*16(a_ptr), (x2, x3) LDP 0*16(b_ptr), (y0, y1) LDP 1*16(b_ptr), (y2, y3) CALL p256MulInternal<>(SB) STP (y0, y1), 0*16(res_ptr) STP (y2, y3), 1*16(res_ptr) RET /* ---------------------------------------*/ // func p256FromMont(res, in *p256Element) TEXT ·p256FromMont(SB),NOSPLIT,$0 MOVD res+0(FP), res_ptr MOVD in+8(FP), a_ptr MOVD p256const0<>(SB), const0 MOVD p256const1<>(SB), const1 LDP 0*16(a_ptr), (acc0, acc1) LDP 1*16(a_ptr), (acc2, acc3) // Only reduce, no multiplications are needed // First reduction step ADDS acc0<<32, acc1, acc1 LSR $32, acc0, t0 MUL acc0, const1, t1 UMULH acc0, const1, acc0 ADCS t0, acc2 ADCS t1, acc3 ADC $0, acc0 // Second reduction step ADDS acc1<<32, acc2, acc2 LSR $32, acc1, t0 MUL acc1, const1, t1 UMULH acc1, const1, acc1 ADCS t0, acc3 ADCS t1, acc0 ADC $0, acc1 // Third reduction step ADDS acc2<<32, acc3, acc3 LSR $32, acc2, t0 MUL acc2, const1, t1 UMULH acc2, const1, acc2 ADCS t0, acc0 ADCS t1, acc1 ADC $0, acc2 // Last reduction step ADDS acc3<<32, acc0, acc0 LSR $32, acc3, t0 MUL acc3, const1, t1 UMULH acc3, const1, acc3 ADCS t0, acc1 ADCS t1, acc2 ADC $0, acc3 SUBS $-1, acc0, t0 SBCS const0, acc1, t1 SBCS $0, acc2, t2 SBCS const1, acc3, t3 CSEL CS, t0, acc0, acc0 CSEL CS, t1, acc1, acc1 CSEL CS, t2, acc2, acc2 CSEL CS, t3, acc3, acc3 STP (acc0, acc1), 0*16(res_ptr) STP (acc2, acc3), 1*16(res_ptr) RET /* ---------------------------------------*/ // func p256Select(res *P256Point, table *p256Table, idx int) TEXT ·p256Select(SB),NOSPLIT,$0 MOVD idx+16(FP), const0 MOVD table+8(FP), b_ptr MOVD res+0(FP), res_ptr EOR x0, x0, x0 EOR x1, x1, x1 EOR x2, x2, x2 EOR x3, x3, x3 EOR y0, y0, y0 EOR y1, y1, y1 EOR y2, y2, y2 EOR y3, y3, y3 EOR t0, t0, t0 EOR t1, t1, t1 EOR t2, t2, t2 EOR t3, t3, t3 MOVD $0, const1 loop_select: ADD $1, const1 CMP const0, const1 LDP.P 16(b_ptr), (acc0, acc1) CSEL EQ, acc0, x0, x0 CSEL EQ, acc1, x1, x1 LDP.P 16(b_ptr), (acc2, acc3) CSEL EQ, acc2, x2, x2 CSEL EQ, acc3, x3, x3 LDP.P 16(b_ptr), (acc4, acc5) CSEL EQ, acc4, y0, y0 CSEL EQ, acc5, y1, y1 LDP.P 16(b_ptr), (acc6, acc7) CSEL EQ, acc6, y2, y2 CSEL EQ, acc7, y3, y3 LDP.P 16(b_ptr), (acc0, acc1) CSEL EQ, acc0, t0, t0 CSEL EQ, acc1, t1, t1 LDP.P 16(b_ptr), (acc2, acc3) CSEL EQ, acc2, t2, t2 CSEL EQ, acc3, t3, t3 CMP $16, const1 BNE loop_select STP (x0, x1), 0*16(res_ptr) STP (x2, x3), 1*16(res_ptr) STP (y0, y1), 2*16(res_ptr) STP (y2, y3), 3*16(res_ptr) STP (t0, t1), 4*16(res_ptr) STP (t2, t3), 5*16(res_ptr) RET /* ---------------------------------------*/ // func p256SelectAffine(res *p256AffinePoint, table *p256AffineTable, idx int) TEXT ·p256SelectAffine(SB),NOSPLIT,$0 MOVD idx+16(FP), t0 MOVD table+8(FP), t1 MOVD res+0(FP), res_ptr EOR x0, x0, x0 EOR x1, x1, x1 EOR x2, x2, x2 EOR x3, x3, x3 EOR y0, y0, y0 EOR y1, y1, y1 EOR y2, y2, y2 EOR y3, y3, y3 MOVD $0, t2 loop_select: ADD $1, t2 CMP t0, t2 LDP.P 16(t1), (acc0, acc1) CSEL EQ, acc0, x0, x0 CSEL EQ, acc1, x1, x1 LDP.P 16(t1), (acc2, acc3) CSEL EQ, acc2, x2, x2 CSEL EQ, acc3, x3, x3 LDP.P 16(t1), (acc4, acc5) CSEL EQ, acc4, y0, y0 CSEL EQ, acc5, y1, y1 LDP.P 16(t1), (acc6, acc7) CSEL EQ, acc6, y2, y2 CSEL EQ, acc7, y3, y3 CMP $32, t2 BNE loop_select STP (x0, x1), 0*16(res_ptr) STP (x2, x3), 1*16(res_ptr) STP (y0, y1), 2*16(res_ptr) STP (y2, y3), 3*16(res_ptr) RET /* ---------------------------------------*/ // func p256OrdSqr(res, in *p256OrdElement, n int) TEXT ·p256OrdSqr(SB),NOSPLIT,$0 MOVD in+8(FP), a_ptr MOVD n+16(FP), b_ptr MOVD p256ordK0<>(SB), hlp1 LDP p256ord<>+0x00(SB), (const0, const1) LDP p256ord<>+0x10(SB), (const2, const3) LDP 0*16(a_ptr), (x0, x1) LDP 1*16(a_ptr), (x2, x3) ordSqrLoop: SUB $1, b_ptr // x[1:] * x[0] MUL x0, x1, acc1 UMULH x0, x1, acc2 MUL x0, x2, t0 ADDS t0, acc2, acc2 UMULH x0, x2, acc3 MUL x0, x3, t0 ADCS t0, acc3, acc3 UMULH x0, x3, acc4 ADC $0, acc4, acc4 // x[2:] * x[1] MUL x1, x2, t0 ADDS t0, acc3 UMULH x1, x2, t1 ADCS t1, acc4 ADC $0, ZR, acc5 MUL x1, x3, t0 ADDS t0, acc4 UMULH x1, x3, t1 ADC t1, acc5 // x[3] * x[2] MUL x2, x3, t0 ADDS t0, acc5 UMULH x2, x3, acc6 ADC $0, acc6 MOVD $0, acc7 // *2 ADDS acc1, acc1 ADCS acc2, acc2 ADCS acc3, acc3 ADCS acc4, acc4 ADCS acc5, acc5 ADCS acc6, acc6 ADC $0, acc7 // Missing products MUL x0, x0, acc0 UMULH x0, x0, t0 ADDS t0, acc1, acc1 MUL x1, x1, t0 ADCS t0, acc2, acc2 UMULH x1, x1, t1 ADCS t1, acc3, acc3 MUL x2, x2, t0 ADCS t0, acc4, acc4 UMULH x2, x2, t1 ADCS t1, acc5, acc5 MUL x3, x3, t0 ADCS t0, acc6, acc6 UMULH x3, x3, t1 ADC t1, acc7, acc7 // First reduction step MUL acc0, hlp1, hlp0 MUL const0, hlp1, t0 ADDS t0, acc0, acc0 UMULH const0, hlp0, t1 MUL const1, hlp0, t0 ADCS t0, acc1, acc1 UMULH const1, hlp0, y0 MUL const2, hlp0, t0 ADCS t0, acc2, acc2 UMULH const2, hlp0, acc0 MUL const3, hlp0, t0 ADCS t0, acc3, acc3 UMULH const3, hlp0, hlp0 ADC $0, hlp0 ADDS t1, acc1, acc1 ADCS y0, acc2, acc2 ADCS acc0, acc3, acc3 ADC $0, hlp0, acc0 // Second reduction step MUL acc1, hlp1, hlp0 MUL const0, hlp1, t0 ADDS t0, acc1, acc1 UMULH const0, hlp0, t1 MUL const1, hlp0, t0 ADCS t0, acc2, acc2 UMULH const1, hlp0, y0 MUL const2, hlp0, t0 ADCS t0, acc3, acc3 UMULH const2, hlp0, acc1 MUL const3, hlp0, t0 ADCS t0, acc0, acc0 UMULH const3, hlp0, hlp0 ADC $0, hlp0 ADDS t1, acc2, acc2 ADCS y0, acc3, acc3 ADCS acc1, acc0, acc0 ADC $0, hlp0, acc1 // Third reduction step MUL acc2, hlp1, hlp0 MUL const0, hlp1, t0 ADDS t0, acc2, acc2 UMULH const0, hlp0, t1 MUL const1, hlp0, t0 ADCS t0, acc3, acc3 UMULH const1, hlp0, y0 MUL const2, hlp0, t0 ADCS t0, acc0, acc0 UMULH const2, hlp0, acc2 MUL const3, hlp0, t0 ADCS t0, acc1, acc1 UMULH const3, hlp0, hlp0 ADC $0, hlp0 ADDS t1, acc3, acc3 ADCS y0, acc0, acc0 ADCS acc2, acc1, acc1 ADC $0, hlp0, acc2 // Last reduction step MUL acc3, hlp1, hlp0 MUL const0, hlp1, t0 ADDS t0, acc3, acc3 UMULH const0, hlp0, t1 MUL const1, hlp0, t0 ADCS t0, acc0, acc0 UMULH const1, hlp0, y0 MUL const2, hlp0, t0 ADCS t0, acc1, acc1 UMULH const2, hlp0, acc3 MUL const3, hlp0, t0 ADCS t0, acc2, acc2 UMULH const3, hlp0, hlp0 ADC $0, acc7 ADDS t1, acc0, acc0 ADCS y0, acc1, acc1 ADCS acc3, acc2, acc2 ADC $0, hlp0, acc3 ADDS acc4, acc0, acc0 ADCS acc5, acc1, acc1 ADCS acc6, acc2, acc2 ADCS acc7, acc3, acc3 ADC $0, ZR, acc4 SUBS const0, acc0, y0 SBCS const1, acc1, y1 SBCS const2, acc2, y2 SBCS const3, acc3, y3 SBCS $0, acc4, acc4 CSEL CS, y0, acc0, x0 CSEL CS, y1, acc1, x1 CSEL CS, y2, acc2, x2 CSEL CS, y3, acc3, x3 CBNZ b_ptr, ordSqrLoop MOVD res+0(FP), res_ptr STP (x0, x1), 0*16(res_ptr) STP (x2, x3), 1*16(res_ptr) RET /* ---------------------------------------*/ // func p256OrdMul(res, in1, in2 *p256OrdElement) TEXT ·p256OrdMul(SB),NOSPLIT,$0 MOVD in1+8(FP), a_ptr MOVD in2+16(FP), b_ptr MOVD p256ordK0<>(SB), hlp1 LDP p256ord<>+0x00(SB), (const0, const1) LDP p256ord<>+0x10(SB), (const2, const3) LDP 0*16(a_ptr), (x0, x1) LDP 1*16(a_ptr), (x2, x3) LDP 0*16(b_ptr), (y0, y1) LDP 1*16(b_ptr), (y2, y3) // y[0] * x MUL y0, x0, acc0 UMULH y0, x0, acc1 MUL y0, x1, t0 ADDS t0, acc1 UMULH y0, x1, acc2 MUL y0, x2, t0 ADCS t0, acc2 UMULH y0, x2, acc3 MUL y0, x3, t0 ADCS t0, acc3 UMULH y0, x3, acc4 ADC $0, acc4 // First reduction step MUL acc0, hlp1, hlp0 MUL const0, hlp1, t0 ADDS t0, acc0, acc0 UMULH const0, hlp0, t1 MUL const1, hlp0, t0 ADCS t0, acc1, acc1 UMULH const1, hlp0, y0 MUL const2, hlp0, t0 ADCS t0, acc2, acc2 UMULH const2, hlp0, acc0 MUL const3, hlp0, t0 ADCS t0, acc3, acc3 UMULH const3, hlp0, hlp0 ADC $0, acc4 ADDS t1, acc1, acc1 ADCS y0, acc2, acc2 ADCS acc0, acc3, acc3 ADC $0, hlp0, acc0 // y[1] * x MUL y1, x0, t0 ADDS t0, acc1 UMULH y1, x0, t1 MUL y1, x1, t0 ADCS t0, acc2 UMULH y1, x1, hlp0 MUL y1, x2, t0 ADCS t0, acc3 UMULH y1, x2, y0 MUL y1, x3, t0 ADCS t0, acc4 UMULH y1, x3, y1 ADC $0, ZR, acc5 ADDS t1, acc2 ADCS hlp0, acc3 ADCS y0, acc4 ADC y1, acc5 // Second reduction step MUL acc1, hlp1, hlp0 MUL const0, hlp1, t0 ADDS t0, acc1, acc1 UMULH const0, hlp0, t1 MUL const1, hlp0, t0 ADCS t0, acc2, acc2 UMULH const1, hlp0, y0 MUL const2, hlp0, t0 ADCS t0, acc3, acc3 UMULH const2, hlp0, acc1 MUL const3, hlp0, t0 ADCS t0, acc0, acc0 UMULH const3, hlp0, hlp0 ADC $0, acc5 ADDS t1, acc2, acc2 ADCS y0, acc3, acc3 ADCS acc1, acc0, acc0 ADC $0, hlp0, acc1 // y[2] * x MUL y2, x0, t0 ADDS t0, acc2 UMULH y2, x0, t1 MUL y2, x1, t0 ADCS t0, acc3 UMULH y2, x1, hlp0 MUL y2, x2, t0 ADCS t0, acc4 UMULH y2, x2, y0 MUL y2, x3, t0 ADCS t0, acc5 UMULH y2, x3, y1 ADC $0, ZR, acc6 ADDS t1, acc3 ADCS hlp0, acc4 ADCS y0, acc5 ADC y1, acc6 // Third reduction step MUL acc2, hlp1, hlp0 MUL const0, hlp1, t0 ADDS t0, acc2, acc2 UMULH const0, hlp0, t1 MUL const1, hlp0, t0 ADCS t0, acc3, acc3 UMULH const1, hlp0, y0 MUL const2, hlp0, t0 ADCS t0, acc0, acc0 UMULH const2, hlp0, acc2 MUL const3, hlp0, t0 ADCS t0, acc1, acc1 UMULH const3, hlp0, hlp0 ADC $0, acc6 ADDS t1, acc3, acc3 ADCS y0, acc0, acc0 ADCS acc2, acc1, acc1 ADC $0, hlp0, acc2 // y[3] * x MUL y3, x0, t0 ADDS t0, acc3 UMULH y3, x0, t1 MUL y3, x1, t0 ADCS t0, acc4 UMULH y3, x1, hlp0 MUL y3, x2, t0 ADCS t0, acc5 UMULH y3, x2, y0 MUL y3, x3, t0 ADCS t0, acc6 UMULH y3, x3, y1 ADC $0, ZR, acc7 ADDS t1, acc4 ADCS hlp0, acc5 ADCS y0, acc6 ADC y1, acc7 // Last reduction step MUL acc3, hlp1, hlp0 MUL const0, hlp1, t0 ADDS t0, acc3, acc3 UMULH const0, hlp0, t1 MUL const1, hlp0, t0 ADCS t0, acc0, acc0 UMULH const1, hlp0, y0 MUL const2, hlp0, t0 ADCS t0, acc1, acc1 UMULH const2, hlp0, acc3 MUL const3, hlp0, t0 ADCS t0, acc2, acc2 UMULH const3, hlp0, hlp0 ADC $0, acc7 ADDS t1, acc0, acc0 ADCS y0, acc1, acc1 ADCS acc3, acc2, acc2 ADC $0, hlp0, acc3 ADDS acc4, acc0, acc0 ADCS acc5, acc1, acc1 ADCS acc6, acc2, acc2 ADCS acc7, acc3, acc3 ADC $0, ZR, acc4 SUBS const0, acc0, t0 SBCS const1, acc1, t1 SBCS const2, acc2, t2 SBCS const3, acc3, t3 SBCS $0, acc4, acc4 CSEL CS, t0, acc0, acc0 CSEL CS, t1, acc1, acc1 CSEL CS, t2, acc2, acc2 CSEL CS, t3, acc3, acc3 MOVD res+0(FP), res_ptr STP (acc0, acc1), 0*16(res_ptr) STP (acc2, acc3), 1*16(res_ptr) RET /* ---------------------------------------*/ TEXT p256SubInternal<>(SB),NOSPLIT,$0 SUBS x0, y0, acc0 SBCS x1, y1, acc1 SBCS x2, y2, acc2 SBCS x3, y3, acc3 SBC $0, ZR, t0 ADDS $-1, acc0, acc4 ADCS const0, acc1, acc5 ADCS $0, acc2, acc6 ADC const1, acc3, acc7 ANDS $1, t0 CSEL EQ, acc0, acc4, x0 CSEL EQ, acc1, acc5, x1 CSEL EQ, acc2, acc6, x2 CSEL EQ, acc3, acc7, x3 RET /* ---------------------------------------*/ TEXT p256SqrInternal<>(SB),NOSPLIT,$0 // x[1:] * x[0] MUL x0, x1, acc1 UMULH x0, x1, acc2 MUL x0, x2, t0 ADDS t0, acc2, acc2 UMULH x0, x2, acc3 MUL x0, x3, t0 ADCS t0, acc3, acc3 UMULH x0, x3, acc4 ADC $0, acc4, acc4 // x[2:] * x[1] MUL x1, x2, t0 ADDS t0, acc3 UMULH x1, x2, t1 ADCS t1, acc4 ADC $0, ZR, acc5 MUL x1, x3, t0 ADDS t0, acc4 UMULH x1, x3, t1 ADC t1, acc5 // x[3] * x[2] MUL x2, x3, t0 ADDS t0, acc5 UMULH x2, x3, acc6 ADC $0, acc6 MOVD $0, acc7 // *2 ADDS acc1, acc1 ADCS acc2, acc2 ADCS acc3, acc3 ADCS acc4, acc4 ADCS acc5, acc5 ADCS acc6, acc6 ADC $0, acc7 // Missing products MUL x0, x0, acc0 UMULH x0, x0, t0 ADDS t0, acc1, acc1 MUL x1, x1, t0 ADCS t0, acc2, acc2 UMULH x1, x1, t1 ADCS t1, acc3, acc3 MUL x2, x2, t0 ADCS t0, acc4, acc4 UMULH x2, x2, t1 ADCS t1, acc5, acc5 MUL x3, x3, t0 ADCS t0, acc6, acc6 UMULH x3, x3, t1 ADCS t1, acc7, acc7 // First reduction step ADDS acc0<<32, acc1, acc1 LSR $32, acc0, t0 MUL acc0, const1, t1 UMULH acc0, const1, acc0 ADCS t0, acc2, acc2 ADCS t1, acc3, acc3 ADC $0, acc0, acc0 // Second reduction step ADDS acc1<<32, acc2, acc2 LSR $32, acc1, t0 MUL acc1, const1, t1 UMULH acc1, const1, acc1 ADCS t0, acc3, acc3 ADCS t1, acc0, acc0 ADC $0, acc1, acc1 // Third reduction step ADDS acc2<<32, acc3, acc3 LSR $32, acc2, t0 MUL acc2, const1, t1 UMULH acc2, const1, acc2 ADCS t0, acc0, acc0 ADCS t1, acc1, acc1 ADC $0, acc2, acc2 // Last reduction step ADDS acc3<<32, acc0, acc0 LSR $32, acc3, t0 MUL acc3, const1, t1 UMULH acc3, const1, acc3 ADCS t0, acc1, acc1 ADCS t1, acc2, acc2 ADC $0, acc3, acc3 // Add bits [511:256] of the sqr result ADDS acc4, acc0, acc0 ADCS acc5, acc1, acc1 ADCS acc6, acc2, acc2 ADCS acc7, acc3, acc3 ADC $0, ZR, acc4 SUBS $-1, acc0, t0 SBCS const0, acc1, t1 SBCS $0, acc2, t2 SBCS const1, acc3, t3 SBCS $0, acc4, acc4 CSEL CS, t0, acc0, y0 CSEL CS, t1, acc1, y1 CSEL CS, t2, acc2, y2 CSEL CS, t3, acc3, y3 RET /* ---------------------------------------*/ TEXT p256MulInternal<>(SB),NOSPLIT,$0 // y[0] * x MUL y0, x0, acc0 UMULH y0, x0, acc1 MUL y0, x1, t0 ADDS t0, acc1 UMULH y0, x1, acc2 MUL y0, x2, t0 ADCS t0, acc2 UMULH y0, x2, acc3 MUL y0, x3, t0 ADCS t0, acc3 UMULH y0, x3, acc4 ADC $0, acc4 // First reduction step ADDS acc0<<32, acc1, acc1 LSR $32, acc0, t0 MUL acc0, const1, t1 UMULH acc0, const1, acc0 ADCS t0, acc2 ADCS t1, acc3 ADC $0, acc0 // y[1] * x MUL y1, x0, t0 ADDS t0, acc1 UMULH y1, x0, t1 MUL y1, x1, t0 ADCS t0, acc2 UMULH y1, x1, t2 MUL y1, x2, t0 ADCS t0, acc3 UMULH y1, x2, t3 MUL y1, x3, t0 ADCS t0, acc4 UMULH y1, x3, hlp0 ADC $0, ZR, acc5 ADDS t1, acc2 ADCS t2, acc3 ADCS t3, acc4 ADC hlp0, acc5 // Second reduction step ADDS acc1<<32, acc2, acc2 LSR $32, acc1, t0 MUL acc1, const1, t1 UMULH acc1, const1, acc1 ADCS t0, acc3 ADCS t1, acc0 ADC $0, acc1 // y[2] * x MUL y2, x0, t0 ADDS t0, acc2 UMULH y2, x0, t1 MUL y2, x1, t0 ADCS t0, acc3 UMULH y2, x1, t2 MUL y2, x2, t0 ADCS t0, acc4 UMULH y2, x2, t3 MUL y2, x3, t0 ADCS t0, acc5 UMULH y2, x3, hlp0 ADC $0, ZR, acc6 ADDS t1, acc3 ADCS t2, acc4 ADCS t3, acc5 ADC hlp0, acc6 // Third reduction step ADDS acc2<<32, acc3, acc3 LSR $32, acc2, t0 MUL acc2, const1, t1 UMULH acc2, const1, acc2 ADCS t0, acc0 ADCS t1, acc1 ADC $0, acc2 // y[3] * x MUL y3, x0, t0 ADDS t0, acc3 UMULH y3, x0, t1 MUL y3, x1, t0 ADCS t0, acc4 UMULH y3, x1, t2 MUL y3, x2, t0 ADCS t0, acc5 UMULH y3, x2, t3 MUL y3, x3, t0 ADCS t0, acc6 UMULH y3, x3, hlp0 ADC $0, ZR, acc7 ADDS t1, acc4 ADCS t2, acc5 ADCS t3, acc6 ADC hlp0, acc7 // Last reduction step ADDS acc3<<32, acc0, acc0 LSR $32, acc3, t0 MUL acc3, const1, t1 UMULH acc3, const1, acc3 ADCS t0, acc1 ADCS t1, acc2 ADC $0, acc3 // Add bits [511:256] of the mul result ADDS acc4, acc0, acc0 ADCS acc5, acc1, acc1 ADCS acc6, acc2, acc2 ADCS acc7, acc3, acc3 ADC $0, ZR, acc4 SUBS $-1, acc0, t0 SBCS const0, acc1, t1 SBCS $0, acc2, t2 SBCS const1, acc3, t3 SBCS $0, acc4, acc4 CSEL CS, t0, acc0, y0 CSEL CS, t1, acc1, y1 CSEL CS, t2, acc2, y2 CSEL CS, t3, acc3, y3 RET /* ---------------------------------------*/ #define p256MulBy2Inline \ ADDS y0, y0, x0; \ ADCS y1, y1, x1; \ ADCS y2, y2, x2; \ ADCS y3, y3, x3; \ ADC $0, ZR, hlp0; \ SUBS $-1, x0, t0; \ SBCS const0, x1, t1;\ SBCS $0, x2, t2; \ SBCS const1, x3, t3;\ SBCS $0, hlp0, hlp0;\ CSEL CC, x0, t0, x0;\ CSEL CC, x1, t1, x1;\ CSEL CC, x2, t2, x2;\ CSEL CC, x3, t3, x3; /* ---------------------------------------*/ #define x1in(off) (off)(a_ptr) #define y1in(off) (off + 32)(a_ptr) #define z1in(off) (off + 64)(a_ptr) #define x2in(off) (off)(b_ptr) #define z2in(off) (off + 64)(b_ptr) #define x3out(off) (off)(res_ptr) #define y3out(off) (off + 32)(res_ptr) #define z3out(off) (off + 64)(res_ptr) #define LDx(src) LDP src(0), (x0, x1); LDP src(16), (x2, x3) #define LDy(src) LDP src(0), (y0, y1); LDP src(16), (y2, y3) #define STx(src) STP (x0, x1), src(0); STP (x2, x3), src(16) #define STy(src) STP (y0, y1), src(0); STP (y2, y3), src(16) /* ---------------------------------------*/ #define y2in(off) (32*0 + 8 + off)(RSP) #define s2(off) (32*1 + 8 + off)(RSP) #define z1sqr(off) (32*2 + 8 + off)(RSP) #define h(off) (32*3 + 8 + off)(RSP) #define r(off) (32*4 + 8 + off)(RSP) #define hsqr(off) (32*5 + 8 + off)(RSP) #define rsqr(off) (32*6 + 8 + off)(RSP) #define hcub(off) (32*7 + 8 + off)(RSP) #define z2sqr(off) (32*8 + 8 + off)(RSP) #define s1(off) (32*9 + 8 + off)(RSP) #define u1(off) (32*10 + 8 + off)(RSP) #define u2(off) (32*11 + 8 + off)(RSP) // func p256PointAddAffineAsm(res, in1 *P256Point, in2 *p256AffinePoint, sign, sel, zero int) TEXT ·p256PointAddAffineAsm(SB),0,$264-48 MOVD in1+8(FP), a_ptr MOVD in2+16(FP), b_ptr MOVD sign+24(FP), hlp0 MOVD sel+32(FP), hlp1 MOVD zero+40(FP), t2 MOVD $1, t0 CMP $0, t2 CSEL EQ, ZR, t0, t2 CMP $0, hlp1 CSEL EQ, ZR, t0, hlp1 MOVD p256const0<>(SB), const0 MOVD p256const1<>(SB), const1 EOR t2<<1, hlp1 // Negate y2in based on sign LDP 2*16(b_ptr), (y0, y1) LDP 3*16(b_ptr), (y2, y3) MOVD $-1, acc0 SUBS y0, acc0, acc0 SBCS y1, const0, acc1 SBCS y2, ZR, acc2 SBCS y3, const1, acc3 SBC $0, ZR, t0 ADDS $-1, acc0, acc4 ADCS const0, acc1, acc5 ADCS $0, acc2, acc6 ADCS const1, acc3, acc7 ADC $0, t0, t0 CMP $0, t0 CSEL EQ, acc4, acc0, acc0 CSEL EQ, acc5, acc1, acc1 CSEL EQ, acc6, acc2, acc2 CSEL EQ, acc7, acc3, acc3 // If condition is 0, keep original value CMP $0, hlp0 CSEL EQ, y0, acc0, y0 CSEL EQ, y1, acc1, y1 CSEL EQ, y2, acc2, y2 CSEL EQ, y3, acc3, y3 // Store result STy(y2in) // Begin point add LDx(z1in) CALL p256SqrInternal<>(SB) // z1ˆ2 STy(z1sqr) LDx(x2in) CALL p256MulInternal<>(SB) // x2 * z1ˆ2 LDx(x1in) CALL p256SubInternal<>(SB) // h = u2 - u1 STx(h) LDy(z1in) CALL p256MulInternal<>(SB) // z3 = h * z1 LDP 4*16(a_ptr), (acc0, acc1)// iff select[0] == 0, z3 = z1 LDP 5*16(a_ptr), (acc2, acc3) ANDS $1, hlp1, ZR CSEL EQ, acc0, y0, y0 CSEL EQ, acc1, y1, y1 CSEL EQ, acc2, y2, y2 CSEL EQ, acc3, y3, y3 LDP p256one<>+0x00(SB), (acc0, acc1) LDP p256one<>+0x10(SB), (acc2, acc3) ANDS $2, hlp1, ZR // iff select[1] == 0, z3 = 1 CSEL EQ, acc0, y0, y0 CSEL EQ, acc1, y1, y1 CSEL EQ, acc2, y2, y2 CSEL EQ, acc3, y3, y3 LDx(z1in) MOVD res+0(FP), t0 STP (y0, y1), 4*16(t0) STP (y2, y3), 5*16(t0) LDy(z1sqr) CALL p256MulInternal<>(SB) // z1 ^ 3 LDx(y2in) CALL p256MulInternal<>(SB) // s2 = y2 * z1ˆ3 STy(s2) LDx(y1in) CALL p256SubInternal<>(SB) // r = s2 - s1 STx(r) CALL p256SqrInternal<>(SB) // rsqr = rˆ2 STy (rsqr) LDx(h) CALL p256SqrInternal<>(SB) // hsqr = hˆ2 STy(hsqr) CALL p256MulInternal<>(SB) // hcub = hˆ3 STy(hcub) LDx(y1in) CALL p256MulInternal<>(SB) // y1 * hˆ3 STy(s2) LDP hsqr(0*8), (x0, x1) LDP hsqr(2*8), (x2, x3) LDP 0*16(a_ptr), (y0, y1) LDP 1*16(a_ptr), (y2, y3) CALL p256MulInternal<>(SB) // u1 * hˆ2 STP (y0, y1), h(0*8) STP (y2, y3), h(2*8) p256MulBy2Inline // u1 * hˆ2 * 2, inline LDy(rsqr) CALL p256SubInternal<>(SB) // rˆ2 - u1 * hˆ2 * 2 MOVD x0, y0 MOVD x1, y1 MOVD x2, y2 MOVD x3, y3 LDx(hcub) CALL p256SubInternal<>(SB) LDP 0*16(a_ptr), (acc0, acc1) LDP 1*16(a_ptr), (acc2, acc3) ANDS $1, hlp1, ZR // iff select[0] == 0, x3 = x1 CSEL EQ, acc0, x0, x0 CSEL EQ, acc1, x1, x1 CSEL EQ, acc2, x2, x2 CSEL EQ, acc3, x3, x3 LDP 0*16(b_ptr), (acc0, acc1) LDP 1*16(b_ptr), (acc2, acc3) ANDS $2, hlp1, ZR // iff select[1] == 0, x3 = x2 CSEL EQ, acc0, x0, x0 CSEL EQ, acc1, x1, x1 CSEL EQ, acc2, x2, x2 CSEL EQ, acc3, x3, x3 MOVD res+0(FP), t0 STP (x0, x1), 0*16(t0) STP (x2, x3), 1*16(t0) LDP h(0*8), (y0, y1) LDP h(2*8), (y2, y3) CALL p256SubInternal<>(SB) LDP r(0*8), (y0, y1) LDP r(2*8), (y2, y3) CALL p256MulInternal<>(SB) LDP s2(0*8), (x0, x1) LDP s2(2*8), (x2, x3) CALL p256SubInternal<>(SB) LDP 2*16(a_ptr), (acc0, acc1) LDP 3*16(a_ptr), (acc2, acc3) ANDS $1, hlp1, ZR // iff select[0] == 0, y3 = y1 CSEL EQ, acc0, x0, x0 CSEL EQ, acc1, x1, x1 CSEL EQ, acc2, x2, x2 CSEL EQ, acc3, x3, x3 LDP y2in(0*8), (acc0, acc1) LDP y2in(2*8), (acc2, acc3) ANDS $2, hlp1, ZR // iff select[1] == 0, y3 = y2 CSEL EQ, acc0, x0, x0 CSEL EQ, acc1, x1, x1 CSEL EQ, acc2, x2, x2 CSEL EQ, acc3, x3, x3 MOVD res+0(FP), t0 STP (x0, x1), 2*16(t0) STP (x2, x3), 3*16(t0) RET #define p256AddInline \ ADDS y0, x0, x0; \ ADCS y1, x1, x1; \ ADCS y2, x2, x2; \ ADCS y3, x3, x3; \ ADC $0, ZR, hlp0; \ SUBS $-1, x0, t0; \ SBCS const0, x1, t1;\ SBCS $0, x2, t2; \ SBCS const1, x3, t3;\ SBCS $0, hlp0, hlp0;\ CSEL CC, x0, t0, x0;\ CSEL CC, x1, t1, x1;\ CSEL CC, x2, t2, x2;\ CSEL CC, x3, t3, x3; #define s(off) (32*0 + 8 + off)(RSP) #define m(off) (32*1 + 8 + off)(RSP) #define zsqr(off) (32*2 + 8 + off)(RSP) #define tmp(off) (32*3 + 8 + off)(RSP) //func p256PointDoubleAsm(res, in *P256Point) TEXT ·p256PointDoubleAsm(SB),NOSPLIT,$136-16 MOVD res+0(FP), res_ptr MOVD in+8(FP), a_ptr MOVD p256const0<>(SB), const0 MOVD p256const1<>(SB), const1 // Begin point double LDP 4*16(a_ptr), (x0, x1) LDP 5*16(a_ptr), (x2, x3) CALL p256SqrInternal<>(SB) STP (y0, y1), zsqr(0*8) STP (y2, y3), zsqr(2*8) LDP 0*16(a_ptr), (x0, x1) LDP 1*16(a_ptr), (x2, x3) p256AddInline STx(m) LDx(z1in) LDy(y1in) CALL p256MulInternal<>(SB) p256MulBy2Inline STx(z3out) LDy(x1in) LDx(zsqr) CALL p256SubInternal<>(SB) LDy(m) CALL p256MulInternal<>(SB) // Multiply by 3 p256MulBy2Inline p256AddInline STx(m) LDy(y1in) p256MulBy2Inline CALL p256SqrInternal<>(SB) STy(s) MOVD y0, x0 MOVD y1, x1 MOVD y2, x2 MOVD y3, x3 CALL p256SqrInternal<>(SB) // Divide by 2 ADDS $-1, y0, t0 ADCS const0, y1, t1 ADCS $0, y2, t2 ADCS const1, y3, t3 ADC $0, ZR, hlp0 ANDS $1, y0, ZR CSEL EQ, y0, t0, t0 CSEL EQ, y1, t1, t1 CSEL EQ, y2, t2, t2 CSEL EQ, y3, t3, t3 AND y0, hlp0, hlp0 EXTR $1, t0, t1, y0 EXTR $1, t1, t2, y1 EXTR $1, t2, t3, y2 EXTR $1, t3, hlp0, y3 STy(y3out) LDx(x1in) LDy(s) CALL p256MulInternal<>(SB) STy(s) p256MulBy2Inline STx(tmp) LDx(m) CALL p256SqrInternal<>(SB) LDx(tmp) CALL p256SubInternal<>(SB) STx(x3out) LDy(s) CALL p256SubInternal<>(SB) LDy(m) CALL p256MulInternal<>(SB) LDx(y3out) CALL p256SubInternal<>(SB) STx(y3out) RET /* ---------------------------------------*/ #undef y2in #undef x3out #undef y3out #undef z3out #define y2in(off) (off + 32)(b_ptr) #define x3out(off) (off)(b_ptr) #define y3out(off) (off + 32)(b_ptr) #define z3out(off) (off + 64)(b_ptr) // func p256PointAddAsm(res, in1, in2 *P256Point) int TEXT ·p256PointAddAsm(SB),0,$392-32 // See https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-2007-bl // Move input to stack in order to free registers MOVD in1+8(FP), a_ptr MOVD in2+16(FP), b_ptr MOVD p256const0<>(SB), const0 MOVD p256const1<>(SB), const1 // Begin point add LDx(z2in) CALL p256SqrInternal<>(SB) // z2^2 STy(z2sqr) CALL p256MulInternal<>(SB) // z2^3 LDx(y1in) CALL p256MulInternal<>(SB) // s1 = z2ˆ3*y1 STy(s1) LDx(z1in) CALL p256SqrInternal<>(SB) // z1^2 STy(z1sqr) CALL p256MulInternal<>(SB) // z1^3 LDx(y2in) CALL p256MulInternal<>(SB) // s2 = z1ˆ3*y2 LDx(s1) CALL p256SubInternal<>(SB) // r = s2 - s1 STx(r) MOVD $1, t2 ORR x0, x1, t0 // Check if zero mod p256 ORR x2, x3, t1 ORR t1, t0, t0 CMP $0, t0 CSEL EQ, t2, ZR, hlp1 EOR $-1, x0, t0 EOR const0, x1, t1 EOR const1, x3, t3 ORR t0, t1, t0 ORR x2, t3, t1 ORR t1, t0, t0 CMP $0, t0 CSEL EQ, t2, hlp1, hlp1 LDx(z2sqr) LDy(x1in) CALL p256MulInternal<>(SB) // u1 = x1 * z2ˆ2 STy(u1) LDx(z1sqr) LDy(x2in) CALL p256MulInternal<>(SB) // u2 = x2 * z1ˆ2 STy(u2) LDx(u1) CALL p256SubInternal<>(SB) // h = u2 - u1 STx(h) MOVD $1, t2 ORR x0, x1, t0 // Check if zero mod p256 ORR x2, x3, t1 ORR t1, t0, t0 CMP $0, t0 CSEL EQ, t2, ZR, hlp0 EOR $-1, x0, t0 EOR const0, x1, t1 EOR const1, x3, t3 ORR t0, t1, t0 ORR x2, t3, t1 ORR t1, t0, t0 CMP $0, t0 CSEL EQ, t2, hlp0, hlp0 AND hlp0, hlp1, hlp1 LDx(r) CALL p256SqrInternal<>(SB) // rsqr = rˆ2 STy(rsqr) LDx(h) CALL p256SqrInternal<>(SB) // hsqr = hˆ2 STy(hsqr) LDx(h) CALL p256MulInternal<>(SB) // hcub = hˆ3 STy(hcub) LDx(s1) CALL p256MulInternal<>(SB) STy(s2) LDx(z1in) LDy(z2in) CALL p256MulInternal<>(SB) // z1 * z2 LDx(h) CALL p256MulInternal<>(SB) // z1 * z2 * h MOVD res+0(FP), b_ptr STy(z3out) LDx(hsqr) LDy(u1) CALL p256MulInternal<>(SB) // hˆ2 * u1 STy(u2) p256MulBy2Inline // u1 * hˆ2 * 2, inline LDy(rsqr) CALL p256SubInternal<>(SB) // rˆ2 - u1 * hˆ2 * 2 MOVD x0, y0 MOVD x1, y1 MOVD x2, y2 MOVD x3, y3 LDx(hcub) CALL p256SubInternal<>(SB) STx(x3out) LDy(u2) CALL p256SubInternal<>(SB) LDy(r) CALL p256MulInternal<>(SB) LDx(s2) CALL p256SubInternal<>(SB) STx(y3out) MOVD hlp1, R0 MOVD R0, ret+24(FP) RET golang-filippo-nistec-0.0.4/p256_asm_ppc64le.s000066400000000000000000001575071512422514700210040ustar00rootroot00000000000000// Copyright 2019 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build !purego #include "textflag.h" // This is a port of the s390x asm implementation. // to ppc64le. // Some changes were needed due to differences in // the Go opcodes and/or available instructions // between s390x and ppc64le. // 1. There were operand order differences in the // VSUBUQM, VSUBCUQ, and VSEL instructions. // 2. ppc64 does not have a multiply high and low // like s390x, so those were implemented using // macros to compute the equivalent values. // 3. The LVX, STVX instructions on ppc64 require // 16 byte alignment of the data. To avoid that // requirement, data is loaded using LXVD2X and // STXVD2X with VPERM to reorder bytes correctly. // I have identified some areas where I believe // changes would be needed to make this work for big // endian; however additional changes beyond what I // have noted are most likely needed to make it work. // - The string used with VPERM to swap the byte order // for loads and stores. // - The constants that are loaded from CPOOL. // // The following constants are defined in an order // that is correct for use with LXVD2X/STXVD2X // on little endian. DATA p256<>+0x00(SB)/8, $0xffffffff00000001 // P256 DATA p256<>+0x08(SB)/8, $0x0000000000000000 // P256 DATA p256<>+0x10(SB)/8, $0x00000000ffffffff // P256 DATA p256<>+0x18(SB)/8, $0xffffffffffffffff // P256 DATA p256<>+0x20(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL d1 d0 d1 d0 DATA p256<>+0x28(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL d1 d0 d1 d0 DATA p256<>+0x30(SB)/8, $0x0000000010111213 // SEL 0 d1 d0 0 DATA p256<>+0x38(SB)/8, $0x1415161700000000 // SEL 0 d1 d0 0 DATA p256<>+0x40(SB)/8, $0x18191a1b1c1d1e1f // SEL d1 d0 d1 d0 DATA p256<>+0x48(SB)/8, $0x18191a1b1c1d1e1f // SEL d1 d0 d1 d0 DATA p256mul<>+0x00(SB)/8, $0x00000000ffffffff // P256 original DATA p256mul<>+0x08(SB)/8, $0xffffffffffffffff // P256 DATA p256mul<>+0x10(SB)/8, $0xffffffff00000001 // P256 original DATA p256mul<>+0x18(SB)/8, $0x0000000000000000 // P256 DATA p256mul<>+0x20(SB)/8, $0x1c1d1e1f00000000 // SEL d0 0 0 d0 DATA p256mul<>+0x28(SB)/8, $0x000000001c1d1e1f // SEL d0 0 0 d0 DATA p256mul<>+0x30(SB)/8, $0x0001020304050607 // SEL d0 0 d1 d0 DATA p256mul<>+0x38(SB)/8, $0x1c1d1e1f0c0d0e0f // SEL d0 0 d1 d0 DATA p256mul<>+0x40(SB)/8, $0x040506071c1d1e1f // SEL 0 d1 d0 d1 DATA p256mul<>+0x48(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL 0 d1 d0 d1 DATA p256mul<>+0x50(SB)/8, $0x0405060704050607 // SEL 0 0 d1 d0 DATA p256mul<>+0x58(SB)/8, $0x1c1d1e1f0c0d0e0f // SEL 0 0 d1 d0 DATA p256mul<>+0x60(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL d1 d0 d1 d0 DATA p256mul<>+0x68(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL d1 d0 d1 d0 DATA p256mul<>+0x70(SB)/8, $0x141516170c0d0e0f // SEL 0 d1 d0 0 DATA p256mul<>+0x78(SB)/8, $0x1c1d1e1f14151617 // SEL 0 d1 d0 0 DATA p256mul<>+0x80(SB)/8, $0xffffffff00000000 // (1*2^256)%P256 DATA p256mul<>+0x88(SB)/8, $0x0000000000000001 // (1*2^256)%P256 DATA p256mul<>+0x90(SB)/8, $0x00000000fffffffe // (1*2^256)%P256 DATA p256mul<>+0x98(SB)/8, $0xffffffffffffffff // (1*2^256)%P256 // External declarations for constants GLOBL p256ord<>(SB), 8, $32 GLOBL p256<>(SB), 8, $80 GLOBL p256mul<>(SB), 8, $160 // The following macros are used to implement the ppc64le // equivalent function from the corresponding s390x // instruction for vector multiply high, low, and add, // since there aren't exact equivalent instructions. // The corresponding s390x instructions appear in the // comments. // Implementation for big endian would have to be // investigated, I think it would be different. // // // Vector multiply word // // VMLF x0, x1, out_low // VMLHF x0, x1, out_hi #define VMULT(x1, x2, out_low, out_hi) \ VMULEUW x1, x2, TMP1; \ VMULOUW x1, x2, TMP2; \ VMRGEW TMP1, TMP2, out_hi; \ VMRGOW TMP1, TMP2, out_low // // Vector multiply add word // // VMALF x0, x1, y, out_low // VMALHF x0, x1, y, out_hi #define VMULT_ADD(x1, x2, y, one, out_low, out_hi) \ VMULEUW y, one, TMP2; \ VMULOUW y, one, TMP1; \ VMULEUW x1, x2, out_low; \ VMULOUW x1, x2, out_hi; \ VADDUDM TMP2, out_low, TMP2; \ VADDUDM TMP1, out_hi, TMP1; \ VMRGOW TMP2, TMP1, out_low; \ VMRGEW TMP2, TMP1, out_hi #define res_ptr R3 #define a_ptr R4 #undef res_ptr #undef a_ptr #define P1ptr R3 #define CPOOL R7 #define Y1L V0 #define Y1H V1 #define T1L V2 #define T1H V3 #define PL V30 #define PH V31 #define CAR1 V6 #define SEL V8 #define ZER V9 // func p256NegCond(val *p256Point, cond int) TEXT ·p256NegCond(SB), NOSPLIT, $0-16 MOVD val+0(FP), P1ptr MOVD $16, R16 // Copy cond into SEL (cond is R1 + 8 (cond offset) + 32) MOVD $40, R17 LXVDSX (R1)(R17), SEL // Zeroize ZER VSPLTISB $0, ZER // SEL controls whether to return the original value (Y1H/Y1L) // or the negated value (T1H/T1L). VCMPEQUD SEL, ZER, SEL MOVD $p256mul<>+0x00(SB), CPOOL LXVD2X (P1ptr)(R0), Y1L LXVD2X (P1ptr)(R16), Y1H XXPERMDI Y1H, Y1H, $2, Y1H XXPERMDI Y1L, Y1L, $2, Y1L LXVD2X (CPOOL)(R0), PL LXVD2X (CPOOL)(R16), PH VSUBCUQ PL, Y1L, CAR1 // subtract part2 giving carry VSUBUQM PL, Y1L, T1L // subtract part2 giving result VSUBEUQM PH, Y1H, CAR1, T1H // subtract part1 using carry from part2 VSEL T1H, Y1H, SEL, T1H VSEL T1L, Y1L, SEL, T1L XXPERMDI T1H, T1H, $2, T1H XXPERMDI T1L, T1L, $2, T1L STXVD2X T1L, (R0+P1ptr) STXVD2X T1H, (R16+P1ptr) RET #undef P1ptr #undef CPOOL #undef Y1L #undef Y1H #undef T1L #undef T1H #undef PL #undef PH #undef CAR1 #undef SEL #undef ZER #define P3ptr R3 #define P1ptr R4 #define P2ptr R5 #define X1L V0 #define X1H V1 #define Y1L V2 #define Y1H V3 #define Z1L V4 #define Z1H V5 #define X2L V6 #define X2H V7 #define Y2L V8 #define Y2H V9 #define Z2L V10 #define Z2H V11 #define SEL V12 #define ZER V13 // This function uses LXVD2X and STXVD2X to avoid the // data alignment requirement for LVX, STVX. Since // this code is just moving bytes and not doing arithmetic, // order of the bytes doesn't matter. // // func p256MovCond(res, a, b *p256Point, cond int) TEXT ·p256MovCond(SB), NOSPLIT, $0-32 MOVD res+0(FP), P3ptr MOVD a+8(FP), P1ptr MOVD b+16(FP), P2ptr MOVD $16, R16 MOVD $32, R17 MOVD $48, R18 MOVD $56, R21 MOVD $64, R19 MOVD $80, R20 // cond is R1 + 24 (cond offset) + 32 LXVDSX (R1)(R21), SEL VSPLTISB $0, ZER // SEL controls whether to store a or b VCMPEQUD SEL, ZER, SEL LXVD2X (P1ptr+R0), X1H LXVD2X (P1ptr+R16), X1L LXVD2X (P1ptr+R17), Y1H LXVD2X (P1ptr+R18), Y1L LXVD2X (P1ptr+R19), Z1H LXVD2X (P1ptr+R20), Z1L LXVD2X (P2ptr+R0), X2H LXVD2X (P2ptr+R16), X2L LXVD2X (P2ptr+R17), Y2H LXVD2X (P2ptr+R18), Y2L LXVD2X (P2ptr+R19), Z2H LXVD2X (P2ptr+R20), Z2L VSEL X1H, X2H, SEL, X1H VSEL X1L, X2L, SEL, X1L VSEL Y1H, Y2H, SEL, Y1H VSEL Y1L, Y2L, SEL, Y1L VSEL Z1H, Z2H, SEL, Z1H VSEL Z1L, Z2L, SEL, Z1L STXVD2X X1H, (P3ptr+R0) STXVD2X X1L, (P3ptr+R16) STXVD2X Y1H, (P3ptr+R17) STXVD2X Y1L, (P3ptr+R18) STXVD2X Z1H, (P3ptr+R19) STXVD2X Z1L, (P3ptr+R20) RET #undef P3ptr #undef P1ptr #undef P2ptr #undef X1L #undef X1H #undef Y1L #undef Y1H #undef Z1L #undef Z1H #undef X2L #undef X2H #undef Y2L #undef Y2H #undef Z2L #undef Z2H #undef SEL #undef ZER #define P3ptr R3 #define P1ptr R4 #define COUNT R5 #define X1L V0 #define X1H V1 #define Y1L V2 #define Y1H V3 #define Z1L V4 #define Z1H V5 #define X2L V6 #define X2H V7 #define Y2L V8 #define Y2H V9 #define Z2L V10 #define Z2H V11 #define ONE V18 #define IDX V19 #define SEL1 V20 #define SEL2 V21 // func p256Select(point *p256Point, table *p256Table, idx int) TEXT ·p256Select(SB), NOSPLIT, $0-24 MOVD res+0(FP), P3ptr MOVD table+8(FP), P1ptr MOVD $16, R16 MOVD $32, R17 MOVD $48, R18 MOVD $64, R19 MOVD $80, R20 LXVDSX (R1)(R18), SEL1 // VLREPG idx+32(FP), SEL1 VSPLTB $7, SEL1, IDX // splat byte VSPLTISB $1, ONE // VREPIB $1, ONE VSPLTISB $1, SEL2 // VREPIB $1, SEL2 MOVD $16, COUNT // len(p256Table) MOVD COUNT, CTR // set up ctr VSPLTISB $0, X1H // VZERO X1H VSPLTISB $0, X1L // VZERO X1L VSPLTISB $0, Y1H // VZERO Y1H VSPLTISB $0, Y1L // VZERO Y1L VSPLTISB $0, Z1H // VZERO Z1H VSPLTISB $0, Z1L // VZERO Z1L loop_select: // LVXD2X is used here since data alignment doesn't // matter. LXVD2X (P1ptr+R0), X2H LXVD2X (P1ptr+R16), X2L LXVD2X (P1ptr+R17), Y2H LXVD2X (P1ptr+R18), Y2L LXVD2X (P1ptr+R19), Z2H LXVD2X (P1ptr+R20), Z2L VCMPEQUD SEL2, IDX, SEL1 // VCEQG SEL2, IDX, SEL1 OK // This will result in SEL1 being all 0s or 1s, meaning // the result is either X1L or X2L, no individual byte // selection. VSEL X1L, X2L, SEL1, X1L VSEL X1H, X2H, SEL1, X1H VSEL Y1L, Y2L, SEL1, Y1L VSEL Y1H, Y2H, SEL1, Y1H VSEL Z1L, Z2L, SEL1, Z1L VSEL Z1H, Z2H, SEL1, Z1H // Add 1 to all bytes in SEL2 VADDUBM SEL2, ONE, SEL2 // VAB SEL2, ONE, SEL2 OK ADD $96, P1ptr BDNZ loop_select // STXVD2X is used here so that alignment doesn't // need to be verified. Since values were loaded // using LXVD2X this is OK. STXVD2X X1H, (P3ptr+R0) STXVD2X X1L, (P3ptr+R16) STXVD2X Y1H, (P3ptr+R17) STXVD2X Y1L, (P3ptr+R18) STXVD2X Z1H, (P3ptr+R19) STXVD2X Z1L, (P3ptr+R20) RET #undef P3ptr #undef P1ptr #undef COUNT #undef X1L #undef X1H #undef Y1L #undef Y1H #undef Z1L #undef Z1H #undef X2L #undef X2H #undef Y2L #undef Y2H #undef Z2L #undef Z2H #undef ONE #undef IDX #undef SEL1 #undef SEL2 #define P3ptr R3 #define P1ptr R4 #define COUNT R5 #define X1L V0 #define X1H V1 #define Y1L V2 #define Y1H V3 #define Z1L V4 #define Z1H V5 #define X2L V6 #define X2H V7 #define Y2L V8 #define Y2H V9 #define Z2L V10 #define Z2H V11 #define ONE V18 #define IDX V19 #define SEL1 V20 #define SEL2 V21 // func p256SelectAffine(res *p256AffinePoint, table *p256AffineTable, idx int) TEXT ·p256SelectAffine(SB), NOSPLIT, $0-24 MOVD res+0(FP), P3ptr MOVD table+8(FP), P1ptr MOVD $16, R16 MOVD $32, R17 MOVD $48, R18 LXVDSX (R1)(R18), SEL1 VSPLTB $7, SEL1, IDX // splat byte VSPLTISB $1, ONE // Vector with byte 1s VSPLTISB $1, SEL2 // Vector with byte 1s MOVD $32, COUNT // len(p256AffineTable) MOVD COUNT, CTR // loop count VSPLTISB $0, X1H // VZERO X1H VSPLTISB $0, X1L // VZERO X1L VSPLTISB $0, Y1H // VZERO Y1H VSPLTISB $0, Y1L // VZERO Y1L loop_select: LXVD2X (P1ptr+R0), X2H LXVD2X (P1ptr+R16), X2L LXVD2X (P1ptr+R17), Y2H LXVD2X (P1ptr+R18), Y2L VCMPEQUD SEL2, IDX, SEL1 // Compare against idx VSEL X1L, X2L, SEL1, X1L // Select if idx matched VSEL X1H, X2H, SEL1, X1H VSEL Y1L, Y2L, SEL1, Y1L VSEL Y1H, Y2H, SEL1, Y1H VADDUBM SEL2, ONE, SEL2 // Increment SEL2 bytes by 1 ADD $64, P1ptr // Next chunk BDNZ loop_select STXVD2X X1H, (P3ptr+R0) STXVD2X X1L, (P3ptr+R16) STXVD2X Y1H, (P3ptr+R17) STXVD2X Y1L, (P3ptr+R18) RET #undef P3ptr #undef P1ptr #undef COUNT #undef X1L #undef X1H #undef Y1L #undef Y1H #undef Z1L #undef Z1H #undef X2L #undef X2H #undef Y2L #undef Y2H #undef Z2L #undef Z2H #undef ONE #undef IDX #undef SEL1 #undef SEL2 #define res_ptr R3 #define x_ptr R4 #define CPOOL R7 #define T0 V0 #define T1 V1 #define T2 V2 #define TT0 V3 #define TT1 V4 #define ZER V6 #define SEL1 V7 #define SEL2 V8 #define CAR1 V9 #define CAR2 V10 #define RED1 V11 #define RED2 V12 #define PL V13 #define PH V14 // func p256FromMont(res, in *p256Element) TEXT ·p256FromMont(SB), NOSPLIT, $0-16 MOVD res+0(FP), res_ptr MOVD in+8(FP), x_ptr MOVD $16, R16 MOVD $32, R17 MOVD $48, R18 MOVD $64, R19 MOVD $p256<>+0x00(SB), CPOOL VSPLTISB $0, T2 // VZERO T2 VSPLTISB $0, ZER // VZERO ZER // Constants are defined so that the LXVD2X is correct LXVD2X (CPOOL+R0), PH LXVD2X (CPOOL+R16), PL // VPERM byte selections LXVD2X (CPOOL+R18), SEL2 LXVD2X (CPOOL+R19), SEL1 LXVD2X (R16)(x_ptr), T1 LXVD2X (R0)(x_ptr), T0 // Put in true little endian order XXPERMDI T0, T0, $2, T0 XXPERMDI T1, T1, $2, T1 // First round VPERM T1, T0, SEL1, RED2 // d1 d0 d1 d0 VPERM ZER, RED2, SEL2, RED1 // 0 d1 d0 0 VSUBUQM RED2, RED1, RED2 // VSQ RED1, RED2, RED2 // Guaranteed not to underflow VSLDOI $8, T1, T0, T0 // VSLDB $8, T1, T0, T0 VSLDOI $8, T2, T1, T1 // VSLDB $8, T2, T1, T1 VADDCUQ T0, RED1, CAR1 // VACCQ T0, RED1, CAR1 VADDUQM T0, RED1, T0 // VAQ T0, RED1, T0 VADDECUQ T1, RED2, CAR1, CAR2 // VACCCQ T1, RED2, CAR1, CAR2 VADDEUQM T1, RED2, CAR1, T1 // VACQ T1, RED2, CAR1, T1 VADDUQM T2, CAR2, T2 // VAQ T2, CAR2, T2 // Second round VPERM T1, T0, SEL1, RED2 // d1 d0 d1 d0 VPERM ZER, RED2, SEL2, RED1 // 0 d1 d0 0 VSUBUQM RED2, RED1, RED2 // VSQ RED1, RED2, RED2 // Guaranteed not to underflow VSLDOI $8, T1, T0, T0 // VSLDB $8, T1, T0, T0 VSLDOI $8, T2, T1, T1 // VSLDB $8, T2, T1, T1 VADDCUQ T0, RED1, CAR1 // VACCQ T0, RED1, CAR1 VADDUQM T0, RED1, T0 // VAQ T0, RED1, T0 VADDECUQ T1, RED2, CAR1, CAR2 // VACCCQ T1, RED2, CAR1, CAR2 VADDEUQM T1, RED2, CAR1, T1 // VACQ T1, RED2, CAR1, T1 VADDUQM T2, CAR2, T2 // VAQ T2, CAR2, T2 // Third round VPERM T1, T0, SEL1, RED2 // d1 d0 d1 d0 VPERM ZER, RED2, SEL2, RED1 // 0 d1 d0 0 VSUBUQM RED2, RED1, RED2 // VSQ RED1, RED2, RED2 // Guaranteed not to underflow VSLDOI $8, T1, T0, T0 // VSLDB $8, T1, T0, T0 VSLDOI $8, T2, T1, T1 // VSLDB $8, T2, T1, T1 VADDCUQ T0, RED1, CAR1 // VACCQ T0, RED1, CAR1 VADDUQM T0, RED1, T0 // VAQ T0, RED1, T0 VADDECUQ T1, RED2, CAR1, CAR2 // VACCCQ T1, RED2, CAR1, CAR2 VADDEUQM T1, RED2, CAR1, T1 // VACQ T1, RED2, CAR1, T1 VADDUQM T2, CAR2, T2 // VAQ T2, CAR2, T2 // Last round VPERM T1, T0, SEL1, RED2 // d1 d0 d1 d0 VPERM ZER, RED2, SEL2, RED1 // 0 d1 d0 0 VSUBUQM RED2, RED1, RED2 // VSQ RED1, RED2, RED2 // Guaranteed not to underflow VSLDOI $8, T1, T0, T0 // VSLDB $8, T1, T0, T0 VSLDOI $8, T2, T1, T1 // VSLDB $8, T2, T1, T1 VADDCUQ T0, RED1, CAR1 // VACCQ T0, RED1, CAR1 VADDUQM T0, RED1, T0 // VAQ T0, RED1, T0 VADDECUQ T1, RED2, CAR1, CAR2 // VACCCQ T1, RED2, CAR1, CAR2 VADDEUQM T1, RED2, CAR1, T1 // VACQ T1, RED2, CAR1, T1 VADDUQM T2, CAR2, T2 // VAQ T2, CAR2, T2 // --------------------------------------------------- VSUBCUQ T0, PL, CAR1 // VSCBIQ PL, T0, CAR1 VSUBUQM T0, PL, TT0 // VSQ PL, T0, TT0 VSUBECUQ T1, PH, CAR1, CAR2 // VSBCBIQ T1, PH, CAR1, CAR2 VSUBEUQM T1, PH, CAR1, TT1 // VSBIQ T1, PH, CAR1, TT1 VSUBEUQM T2, ZER, CAR2, T2 // VSBIQ T2, ZER, CAR2, T2 VSEL TT0, T0, T2, T0 VSEL TT1, T1, T2, T1 // Reorder the bytes so STXVD2X can be used. // TT0, TT1 used for VPERM result in case // the caller expects T0, T1 to be good. XXPERMDI T0, T0, $2, TT0 XXPERMDI T1, T1, $2, TT1 STXVD2X TT0, (R0)(res_ptr) STXVD2X TT1, (R16)(res_ptr) RET #undef res_ptr #undef x_ptr #undef CPOOL #undef T0 #undef T1 #undef T2 #undef TT0 #undef TT1 #undef ZER #undef SEL1 #undef SEL2 #undef CAR1 #undef CAR2 #undef RED1 #undef RED2 #undef PL #undef PH // --------------------------------------- // p256MulInternal // V0-V3 V30,V31 - Not Modified // V4-V15 V27-V29 - Volatile #define CPOOL R7 // Parameters #define X0 V0 // Not modified #define X1 V1 // Not modified #define Y0 V2 // Not modified #define Y1 V3 // Not modified #define T0 V4 // Result #define T1 V5 // Result #define P0 V30 // Not modified #define P1 V31 // Not modified // Temporaries: lots of reused vector regs #define YDIG V6 // Overloaded with CAR2 #define ADD1H V7 // Overloaded with ADD3H #define ADD2H V8 // Overloaded with ADD4H #define ADD3 V9 // Overloaded with SEL2,SEL5 #define ADD4 V10 // Overloaded with SEL3,SEL6 #define RED1 V11 // Overloaded with CAR2 #define RED2 V12 #define RED3 V13 // Overloaded with SEL1 #define T2 V14 // Overloaded temporaries #define ADD1 V4 // Overloaded with T0 #define ADD2 V5 // Overloaded with T1 #define ADD3H V7 // Overloaded with ADD1H #define ADD4H V8 // Overloaded with ADD2H #define ZER V28 // Overloaded with TMP1 #define CAR1 V6 // Overloaded with YDIG #define CAR2 V11 // Overloaded with RED1 // Constant Selects #define SEL1 V13 // Overloaded with RED3 #define SEL2 V9 // Overloaded with ADD3,SEL5 #define SEL3 V10 // Overloaded with ADD4,SEL6 #define SEL4 V6 // Overloaded with YDIG,CAR1 #define SEL5 V9 // Overloaded with ADD3,SEL2 #define SEL6 V10 // Overloaded with ADD4,SEL3 // TMP1, TMP2 used in // VMULT macros #define TMP1 V13 // Overloaded with RED3 #define TMP2 V27 #define ONE V29 // 1s splatted by word /* * * To follow the flow of bits, for your own sanity a stiff drink, need you shall. * Of a single round, a 'helpful' picture, here is. Meaning, column position has. * With you, SIMD be... * * +--------+--------+ * +--------| RED2 | RED1 | * | +--------+--------+ * | ---+--------+--------+ * | +---- T2| T1 | T0 |--+ * | | ---+--------+--------+ | * | | | * | | ======================= | * | | | * | | +--------+--------+<-+ * | +-------| ADD2 | ADD1 |--|-----+ * | | +--------+--------+ | | * | | +--------+--------+<---+ | * | | | ADD2H | ADD1H |--+ | * | | +--------+--------+ | | * | | +--------+--------+<-+ | * | | | ADD4 | ADD3 |--|-+ | * | | +--------+--------+ | | | * | | +--------+--------+<---+ | | * | | | ADD4H | ADD3H |------|-+ |(+vzero) * | | +--------+--------+ | | V * | | ------------------------ | | +--------+ * | | | | | RED3 | [d0 0 0 d0] * | | | | +--------+ * | +---->+--------+--------+ | | | * (T2[1w]||ADD2[4w]||ADD1[3w]) +--------| T1 | T0 | | | | * | +--------+--------+ | | | * +---->---+--------+--------+ | | | * T2| T1 | T0 |----+ | | * ---+--------+--------+ | | | * ---+--------+--------+<---+ | | * +--- T2| T1 | T0 |----------+ * | ---+--------+--------+ | | * | +--------+--------+<-------------+ * | | RED2 | RED1 |-----+ | | [0 d1 d0 d1] [d0 0 d1 d0] * | +--------+--------+ | | | * | +--------+<----------------------+ * | | RED3 |--------------+ | [0 0 d1 d0] * | +--------+ | | * +--->+--------+--------+ | | * | T1 | T0 |--------+ * +--------+--------+ | | * --------------------------- | | * | | * +--------+--------+<----+ | * | RED2 | RED1 | | * +--------+--------+ | * ---+--------+--------+<-------+ * T2| T1 | T0 | (H1P-H1P-H00RRAY!) * ---+--------+--------+ * * *Mi obra de arte de siglo XXI @vpaprots * * * First group is special, doesn't get the two inputs: * +--------+--------+<-+ * +-------| ADD2 | ADD1 |--|-----+ * | +--------+--------+ | | * | +--------+--------+<---+ | * | | ADD2H | ADD1H |--+ | * | +--------+--------+ | | * | +--------+--------+<-+ | * | | ADD4 | ADD3 |--|-+ | * | +--------+--------+ | | | * | +--------+--------+<---+ | | * | | ADD4H | ADD3H |------|-+ |(+vzero) * | +--------+--------+ | | V * | ------------------------ | | +--------+ * | | | | RED3 | [d0 0 0 d0] * | | | +--------+ * +---->+--------+--------+ | | | * (T2[1w]||ADD2[4w]||ADD1[3w]) | T1 | T0 |----+ | | * +--------+--------+ | | | * ---+--------+--------+<---+ | | * +--- T2| T1 | T0 |----------+ * | ---+--------+--------+ | | * | +--------+--------+<-------------+ * | | RED2 | RED1 |-----+ | | [0 d1 d0 d1] [d0 0 d1 d0] * | +--------+--------+ | | | * | +--------+<----------------------+ * | | RED3 |--------------+ | [0 0 d1 d0] * | +--------+ | | * +--->+--------+--------+ | | * | T1 | T0 |--------+ * +--------+--------+ | | * --------------------------- | | * | | * +--------+--------+<----+ | * | RED2 | RED1 | | * +--------+--------+ | * ---+--------+--------+<-------+ * T2| T1 | T0 | (H1P-H1P-H00RRAY!) * ---+--------+--------+ * * Last 'group' needs to RED2||RED1 shifted less */ TEXT p256MulInternal<>(SB), NOSPLIT, $0-16 // CPOOL loaded from caller MOVD $16, R16 MOVD $32, R17 MOVD $48, R18 MOVD $64, R19 MOVD $80, R20 MOVD $96, R21 MOVD $112, R22 // --------------------------------------------------- VSPLTW $3, Y0, YDIG // VREPF Y0 is input // VMLHF X0, YDIG, ADD1H // VMLHF X1, YDIG, ADD2H // VMLF X0, YDIG, ADD1 // VMLF X1, YDIG, ADD2 // VMULT(X0, YDIG, ADD1, ADD1H) VMULT(X1, YDIG, ADD2, ADD2H) VSPLTISW $1, ONE VSPLTW $2, Y0, YDIG // VREPF // VMALF X0, YDIG, ADD1H, ADD3 // VMALF X1, YDIG, ADD2H, ADD4 // VMALHF X0, YDIG, ADD1H, ADD3H // ADD1H Free // VMALHF X1, YDIG, ADD2H, ADD4H // ADD2H Free VMULT_ADD(X0, YDIG, ADD1H, ONE, ADD3, ADD3H) VMULT_ADD(X1, YDIG, ADD2H, ONE, ADD4, ADD4H) LXVD2X (R17)(CPOOL), SEL1 VSPLTISB $0, ZER // VZERO ZER VPERM ZER, ADD1, SEL1, RED3 // [d0 0 0 d0] VSLDOI $12, ADD2, ADD1, T0 // ADD1 Free // VSLDB VSLDOI $12, ZER, ADD2, T1 // ADD2 Free // VSLDB VADDCUQ T0, ADD3, CAR1 // VACCQ VADDUQM T0, ADD3, T0 // ADD3 Free // VAQ VADDECUQ T1, ADD4, CAR1, T2 // VACCCQ VADDEUQM T1, ADD4, CAR1, T1 // ADD4 Free // VACQ LXVD2X (R18)(CPOOL), SEL2 LXVD2X (R19)(CPOOL), SEL3 LXVD2X (R20)(CPOOL), SEL4 VPERM RED3, T0, SEL2, RED1 // [d0 0 d1 d0] VPERM RED3, T0, SEL3, RED2 // [ 0 d1 d0 d1] VPERM RED3, T0, SEL4, RED3 // [ 0 0 d1 d0] VSUBUQM RED2, RED3, RED2 // Guaranteed not to underflow -->? // VSQ VSLDOI $12, T1, T0, T0 // VSLDB VSLDOI $12, T2, T1, T1 // VSLDB VADDCUQ T0, ADD3H, CAR1 // VACCQ VADDUQM T0, ADD3H, T0 // VAQ VADDECUQ T1, ADD4H, CAR1, T2 // VACCCQ VADDEUQM T1, ADD4H, CAR1, T1 // VACQ // --------------------------------------------------- VSPLTW $1, Y0, YDIG // VREPF // VMALHF X0, YDIG, T0, ADD1H // VMALHF X1, YDIG, T1, ADD2H // VMALF X0, YDIG, T0, ADD1 // T0 Free->ADD1 // VMALF X1, YDIG, T1, ADD2 // T1 Free->ADD2 VMULT_ADD(X0, YDIG, T0, ONE, ADD1, ADD1H) VMULT_ADD(X1, YDIG, T1, ONE, ADD2, ADD2H) VSPLTW $0, Y0, YDIG // VREPF // VMALF X0, YDIG, ADD1H, ADD3 // VMALF X1, YDIG, ADD2H, ADD4 // VMALHF X0, YDIG, ADD1H, ADD3H // ADD1H Free->ADD3H // VMALHF X1, YDIG, ADD2H, ADD4H // ADD2H Free->ADD4H , YDIG Free->ZER VMULT_ADD(X0, YDIG, ADD1H, ONE, ADD3, ADD3H) VMULT_ADD(X1, YDIG, ADD2H, ONE, ADD4, ADD4H) VSPLTISB $0, ZER // VZERO ZER LXVD2X (R17)(CPOOL), SEL1 VPERM ZER, ADD1, SEL1, RED3 // [d0 0 0 d0] VSLDOI $12, ADD2, ADD1, T0 // ADD1 Free->T0 // VSLDB VSLDOI $12, T2, ADD2, T1 // ADD2 Free->T1, T2 Free // VSLDB VADDCUQ T0, RED1, CAR1 // VACCQ VADDUQM T0, RED1, T0 // VAQ VADDECUQ T1, RED2, CAR1, T2 // VACCCQ VADDEUQM T1, RED2, CAR1, T1 // VACQ VADDCUQ T0, ADD3, CAR1 // VACCQ VADDUQM T0, ADD3, T0 // VAQ VADDECUQ T1, ADD4, CAR1, CAR2 // VACCCQ VADDEUQM T1, ADD4, CAR1, T1 // VACQ VADDUQM T2, CAR2, T2 // VAQ LXVD2X (R18)(CPOOL), SEL2 LXVD2X (R19)(CPOOL), SEL3 LXVD2X (R20)(CPOOL), SEL4 VPERM RED3, T0, SEL2, RED1 // [d0 0 d1 d0] VPERM RED3, T0, SEL3, RED2 // [ 0 d1 d0 d1] VPERM RED3, T0, SEL4, RED3 // [ 0 0 d1 d0] VSUBUQM RED2, RED3, RED2 // Guaranteed not to underflow // VSQ VSLDOI $12, T1, T0, T0 // VSLDB VSLDOI $12, T2, T1, T1 // VSLDB VADDCUQ T0, ADD3H, CAR1 // VACCQ VADDUQM T0, ADD3H, T0 // VAQ VADDECUQ T1, ADD4H, CAR1, T2 // VACCCQ VADDEUQM T1, ADD4H, CAR1, T1 // VACQ // --------------------------------------------------- VSPLTW $3, Y1, YDIG // VREPF // VMALHF X0, YDIG, T0, ADD1H // VMALHF X1, YDIG, T1, ADD2H // VMALF X0, YDIG, T0, ADD1 // VMALF X1, YDIG, T1, ADD2 VMULT_ADD(X0, YDIG, T0, ONE, ADD1, ADD1H) VMULT_ADD(X1, YDIG, T1, ONE, ADD2, ADD2H) VSPLTW $2, Y1, YDIG // VREPF // VMALF X0, YDIG, ADD1H, ADD3 // VMALF X1, YDIG, ADD2H, ADD4 // VMALHF X0, YDIG, ADD1H, ADD3H // ADD1H Free // VMALHF X1, YDIG, ADD2H, ADD4H // ADD2H Free VMULT_ADD(X0, YDIG, ADD1H, ONE, ADD3, ADD3H) VMULT_ADD(X1, YDIG, ADD2H, ONE, ADD4, ADD4H) LXVD2X (R17)(CPOOL), SEL1 VSPLTISB $0, ZER // VZERO ZER LXVD2X (R17)(CPOOL), SEL1 VPERM ZER, ADD1, SEL1, RED3 // [d0 0 0 d0] VSLDOI $12, ADD2, ADD1, T0 // ADD1 Free // VSLDB VSLDOI $12, T2, ADD2, T1 // ADD2 Free // VSLDB VADDCUQ T0, RED1, CAR1 // VACCQ VADDUQM T0, RED1, T0 // VAQ VADDECUQ T1, RED2, CAR1, T2 // VACCCQ VADDEUQM T1, RED2, CAR1, T1 // VACQ VADDCUQ T0, ADD3, CAR1 // VACCQ VADDUQM T0, ADD3, T0 // VAQ VADDECUQ T1, ADD4, CAR1, CAR2 // VACCCQ VADDEUQM T1, ADD4, CAR1, T1 // VACQ VADDUQM T2, CAR2, T2 // VAQ LXVD2X (R18)(CPOOL), SEL2 LXVD2X (R19)(CPOOL), SEL3 LXVD2X (R20)(CPOOL), SEL4 VPERM RED3, T0, SEL2, RED1 // [d0 0 d1 d0] VPERM RED3, T0, SEL3, RED2 // [ 0 d1 d0 d1] VPERM RED3, T0, SEL4, RED3 // [ 0 0 d1 d0] VSUBUQM RED2, RED3, RED2 // Guaranteed not to underflow // VSQ VSLDOI $12, T1, T0, T0 // VSLDB VSLDOI $12, T2, T1, T1 // VSLDB VADDCUQ T0, ADD3H, CAR1 // VACCQ VADDUQM T0, ADD3H, T0 // VAQ VADDECUQ T1, ADD4H, CAR1, T2 // VACCCQ VADDEUQM T1, ADD4H, CAR1, T1 // VACQ // --------------------------------------------------- VSPLTW $1, Y1, YDIG // VREPF // VMALHF X0, YDIG, T0, ADD1H // VMALHF X1, YDIG, T1, ADD2H // VMALF X0, YDIG, T0, ADD1 // VMALF X1, YDIG, T1, ADD2 VMULT_ADD(X0, YDIG, T0, ONE, ADD1, ADD1H) VMULT_ADD(X1, YDIG, T1, ONE, ADD2, ADD2H) VSPLTW $0, Y1, YDIG // VREPF // VMALF X0, YDIG, ADD1H, ADD3 // VMALF X1, YDIG, ADD2H, ADD4 // VMALHF X0, YDIG, ADD1H, ADD3H // VMALHF X1, YDIG, ADD2H, ADD4H VMULT_ADD(X0, YDIG, ADD1H, ONE, ADD3, ADD3H) VMULT_ADD(X1, YDIG, ADD2H, ONE, ADD4, ADD4H) VSPLTISB $0, ZER // VZERO ZER LXVD2X (R17)(CPOOL), SEL1 VPERM ZER, ADD1, SEL1, RED3 // [d0 0 0 d0] VSLDOI $12, ADD2, ADD1, T0 // VSLDB VSLDOI $12, T2, ADD2, T1 // VSLDB VADDCUQ T0, RED1, CAR1 // VACCQ VADDUQM T0, RED1, T0 // VAQ VADDECUQ T1, RED2, CAR1, T2 // VACCCQ VADDEUQM T1, RED2, CAR1, T1 // VACQ VADDCUQ T0, ADD3, CAR1 // VACCQ VADDUQM T0, ADD3, T0 // VAQ VADDECUQ T1, ADD4, CAR1, CAR2 // VACCCQ VADDEUQM T1, ADD4, CAR1, T1 // VACQ VADDUQM T2, CAR2, T2 // VAQ LXVD2X (R21)(CPOOL), SEL5 LXVD2X (R22)(CPOOL), SEL6 VPERM T0, RED3, SEL5, RED2 // [d1 d0 d1 d0] VPERM T0, RED3, SEL6, RED1 // [ 0 d1 d0 0] VSUBUQM RED2, RED1, RED2 // Guaranteed not to underflow // VSQ VSLDOI $12, T1, T0, T0 // VSLDB VSLDOI $12, T2, T1, T1 // VSLDB VADDCUQ T0, ADD3H, CAR1 // VACCQ VADDUQM T0, ADD3H, T0 // VAQ VADDECUQ T1, ADD4H, CAR1, T2 // VACCCQ VADDEUQM T1, ADD4H, CAR1, T1 // VACQ VADDCUQ T0, RED1, CAR1 // VACCQ VADDUQM T0, RED1, T0 // VAQ VADDECUQ T1, RED2, CAR1, CAR2 // VACCCQ VADDEUQM T1, RED2, CAR1, T1 // VACQ VADDUQM T2, CAR2, T2 // VAQ // --------------------------------------------------- VSPLTISB $0, RED3 // VZERO RED3 VSUBCUQ T0, P0, CAR1 // VSCBIQ VSUBUQM T0, P0, ADD1H // VSQ VSUBECUQ T1, P1, CAR1, CAR2 // VSBCBIQ VSUBEUQM T1, P1, CAR1, ADD2H // VSBIQ VSUBEUQM T2, RED3, CAR2, T2 // VSBIQ // what output to use, ADD2H||ADD1H or T1||T0? VSEL ADD1H, T0, T2, T0 VSEL ADD2H, T1, T2, T1 RET #undef CPOOL #undef X0 #undef X1 #undef Y0 #undef Y1 #undef T0 #undef T1 #undef P0 #undef P1 #undef SEL1 #undef SEL2 #undef SEL3 #undef SEL4 #undef SEL5 #undef SEL6 #undef YDIG #undef ADD1H #undef ADD2H #undef ADD3 #undef ADD4 #undef RED1 #undef RED2 #undef RED3 #undef T2 #undef ADD1 #undef ADD2 #undef ADD3H #undef ADD4H #undef ZER #undef CAR1 #undef CAR2 #undef TMP1 #undef TMP2 #define p256SubInternal(T1, T0, X1, X0, Y1, Y0) \ VSPLTISB $0, ZER \ // VZERO VSUBCUQ X0, Y0, CAR1 \ VSUBUQM X0, Y0, T0 \ VSUBECUQ X1, Y1, CAR1, SEL1 \ VSUBEUQM X1, Y1, CAR1, T1 \ VSUBUQM ZER, SEL1, SEL1 \ // VSQ \ VADDCUQ T0, PL, CAR1 \ // VACCQ VADDUQM T0, PL, TT0 \ // VAQ VADDEUQM T1, PH, CAR1, TT1 \ // VACQ \ VSEL TT0, T0, SEL1, T0 \ VSEL TT1, T1, SEL1, T1 \ #define p256AddInternal(T1, T0, X1, X0, Y1, Y0) \ VADDCUQ X0, Y0, CAR1 \ VADDUQM X0, Y0, T0 \ VADDECUQ X1, Y1, CAR1, T2 \ // VACCCQ VADDEUQM X1, Y1, CAR1, T1 \ \ VSPLTISB $0, ZER \ VSUBCUQ T0, PL, CAR1 \ // VSCBIQ VSUBUQM T0, PL, TT0 \ VSUBECUQ T1, PH, CAR1, CAR2 \ // VSBCBIQ VSUBEUQM T1, PH, CAR1, TT1 \ // VSBIQ VSUBEUQM T2, ZER, CAR2, SEL1 \ \ VSEL TT0, T0, SEL1, T0 \ VSEL TT1, T1, SEL1, T1 #define p256HalfInternal(T1, T0, X1, X0) \ VSPLTISB $0, ZER \ VSUBEUQM ZER, ZER, X0, SEL1 \ \ VADDCUQ X0, PL, CAR1 \ VADDUQM X0, PL, T0 \ VADDECUQ X1, PH, CAR1, T2 \ VADDEUQM X1, PH, CAR1, T1 \ \ VSEL T0, X0, SEL1, T0 \ VSEL T1, X1, SEL1, T1 \ VSEL T2, ZER, SEL1, T2 \ \ VSLDOI $15, T2, ZER, TT1 \ VSLDOI $15, T1, ZER, TT0 \ VSPLTISB $1, SEL1 \ VSR T0, SEL1, T0 \ // VSRL VSR T1, SEL1, T1 \ VSPLTISB $7, SEL1 \ // VREPIB VSL TT0, SEL1, TT0 \ VSL TT1, SEL1, TT1 \ VOR T0, TT0, T0 \ VOR T1, TT1, T1 #define res_ptr R3 #define x_ptr R4 #define y_ptr R5 #define CPOOL R7 #define TEMP R8 #define N R9 // Parameters #define X0 V0 #define X1 V1 #define Y0 V2 #define Y1 V3 #define T0 V4 #define T1 V5 // Constants #define P0 V30 #define P1 V31 // func p256MulAsm(res, in1, in2 *p256Element) TEXT ·p256Mul(SB), NOSPLIT, $0-24 MOVD res+0(FP), res_ptr MOVD in1+8(FP), x_ptr MOVD in2+16(FP), y_ptr MOVD $16, R16 MOVD $32, R17 MOVD $p256mul<>+0x00(SB), CPOOL LXVD2X (R0)(x_ptr), X0 LXVD2X (R16)(x_ptr), X1 XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 LXVD2X (R0)(y_ptr), Y0 LXVD2X (R16)(y_ptr), Y1 XXPERMDI Y0, Y0, $2, Y0 XXPERMDI Y1, Y1, $2, Y1 LXVD2X (R16)(CPOOL), P1 LXVD2X (R0)(CPOOL), P0 CALL p256MulInternal<>(SB) MOVD $p256mul<>+0x00(SB), CPOOL XXPERMDI T0, T0, $2, T0 XXPERMDI T1, T1, $2, T1 STXVD2X T0, (R0)(res_ptr) STXVD2X T1, (R16)(res_ptr) RET // func p256Sqr(res, in *p256Element, n int) TEXT ·p256Sqr(SB), NOSPLIT, $0-24 MOVD res+0(FP), res_ptr MOVD in+8(FP), x_ptr MOVD $16, R16 MOVD $32, R17 MOVD $p256mul<>+0x00(SB), CPOOL LXVD2X (R0)(x_ptr), X0 LXVD2X (R16)(x_ptr), X1 XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 sqrLoop: // Sqr uses same value for both VOR X0, X0, Y0 VOR X1, X1, Y1 LXVD2X (R16)(CPOOL), P1 LXVD2X (R0)(CPOOL), P0 CALL p256MulInternal<>(SB) MOVD n+16(FP), N ADD $-1, N CMP $0, N BEQ done MOVD N, n+16(FP) // Save counter to avoid clobber VOR T0, T0, X0 VOR T1, T1, X1 BR sqrLoop done: MOVD $p256mul<>+0x00(SB), CPOOL XXPERMDI T0, T0, $2, T0 XXPERMDI T1, T1, $2, T1 STXVD2X T0, (R0)(res_ptr) STXVD2X T1, (R16)(res_ptr) RET #undef res_ptr #undef x_ptr #undef y_ptr #undef CPOOL #undef X0 #undef X1 #undef Y0 #undef Y1 #undef T0 #undef T1 #undef P0 #undef P1 #define P3ptr R3 #define P1ptr R4 #define P2ptr R5 #define CPOOL R7 // Temporaries in REGs #define Y2L V15 #define Y2H V16 #define T1L V17 #define T1H V18 #define T2L V19 #define T2H V20 #define T3L V21 #define T3H V22 #define T4L V23 #define T4H V24 // Temps for Sub and Add #define TT0 V11 #define TT1 V12 #define T2 V13 // p256MulAsm Parameters #define X0 V0 #define X1 V1 #define Y0 V2 #define Y1 V3 #define T0 V4 #define T1 V5 #define PL V30 #define PH V31 // Names for zero/sel selects #define X1L V0 #define X1H V1 #define Y1L V2 // p256MulAsmParmY #define Y1H V3 // p256MulAsmParmY #define Z1L V4 #define Z1H V5 #define X2L V0 #define X2H V1 #define Z2L V4 #define Z2H V5 #define X3L V17 // T1L #define X3H V18 // T1H #define Y3L V21 // T3L #define Y3H V22 // T3H #define Z3L V25 #define Z3H V26 #define ZER V6 #define SEL1 V7 #define CAR1 V8 #define CAR2 V9 /* * * Three operand formula: * Source: 2004 Hankerson–Menezes–Vanstone, page 91. * T1 = Z1² * T2 = T1*Z1 * T1 = T1*X2 * T2 = T2*Y2 * T1 = T1-X1 * T2 = T2-Y1 * Z3 = Z1*T1 * T3 = T1² * T4 = T3*T1 * T3 = T3*X1 * T1 = 2*T3 * X3 = T2² * X3 = X3-T1 * X3 = X3-T4 * T3 = T3-X3 * T3 = T3*T2 * T4 = T4*Y1 * Y3 = T3-T4 * Three operand formulas, but with MulInternal X,Y used to store temps X=Z1; Y=Z1; MUL;T- // T1 = Z1² T1 X=T ; Y- ; MUL;T2=T // T2 = T1*Z1 T1 T2 X- ; Y=X2; MUL;T1=T // T1 = T1*X2 T1 T2 X=T2; Y=Y2; MUL;T- // T2 = T2*Y2 T1 T2 SUB(T2+0x00(SB), CPOOL MOVD $16, R16 MOVD $32, R17 MOVD $48, R18 MOVD $64, R19 MOVD $80, R20 MOVD $96, R21 MOVD $112, R22 MOVD $128, R23 MOVD $144, R24 MOVD $160, R25 MOVD $104, R26 // offset of sign+24(FP) LXVD2X (R16)(CPOOL), PH LXVD2X (R0)(CPOOL), PL LXVD2X (R17)(P2ptr), Y2L LXVD2X (R18)(P2ptr), Y2H XXPERMDI Y2H, Y2H, $2, Y2H XXPERMDI Y2L, Y2L, $2, Y2L // Equivalent of VLREPG sign+24(FP), SEL1 LXVDSX (R1)(R26), SEL1 VSPLTISB $0, ZER VCMPEQUD SEL1, ZER, SEL1 VSUBCUQ PL, Y2L, CAR1 VSUBUQM PL, Y2L, T1L VSUBEUQM PH, Y2H, CAR1, T1H VSEL T1L, Y2L, SEL1, Y2L VSEL T1H, Y2H, SEL1, Y2H /* * * Three operand formula: * Source: 2004 Hankerson–Menezes–Vanstone, page 91. */ // X=Z1; Y=Z1; MUL; T- // T1 = Z1² T1 LXVD2X (R19)(P1ptr), X0 // Z1H LXVD2X (R20)(P1ptr), X1 // Z1L XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 VOR X0, X0, Y0 VOR X1, X1, Y1 CALL p256MulInternal<>(SB) // X=T ; Y- ; MUL; T2=T // T2 = T1*Z1 T1 T2 VOR T0, T0, X0 VOR T1, T1, X1 CALL p256MulInternal<>(SB) VOR T0, T0, T2L VOR T1, T1, T2H // X- ; Y=X2; MUL; T1=T // T1 = T1*X2 T1 T2 MOVD in2+16(FP), P2ptr LXVD2X (R0)(P2ptr), Y0 // X2H LXVD2X (R16)(P2ptr), Y1 // X2L XXPERMDI Y0, Y0, $2, Y0 XXPERMDI Y1, Y1, $2, Y1 CALL p256MulInternal<>(SB) VOR T0, T0, T1L VOR T1, T1, T1H // X=T2; Y=Y2; MUL; T- // T2 = T2*Y2 T1 T2 VOR T2L, T2L, X0 VOR T2H, T2H, X1 VOR Y2L, Y2L, Y0 VOR Y2H, Y2H, Y1 CALL p256MulInternal<>(SB) // SUB(T2(SB) VOR T0, T0, Z3L VOR T1, T1, Z3H // X=Y; Y- ; MUL; X=T // T3 = T1*T1 T2 VOR Y0, Y0, X0 VOR Y1, Y1, X1 CALL p256MulInternal<>(SB) VOR T0, T0, X0 VOR T1, T1, X1 // X- ; Y- ; MUL; T4=T // T4 = T3*T1 T2 T4 CALL p256MulInternal<>(SB) VOR T0, T0, T4L VOR T1, T1, T4H // X- ; Y=X1; MUL; T3=T // T3 = T3*X1 T2 T3 T4 MOVD in1+8(FP), P1ptr LXVD2X (R0)(P1ptr), Y0 // X1H LXVD2X (R16)(P1ptr), Y1 // X1L XXPERMDI Y1, Y1, $2, Y1 XXPERMDI Y0, Y0, $2, Y0 CALL p256MulInternal<>(SB) VOR T0, T0, T3L VOR T1, T1, T3H // ADD(T1(SB) // SUB(T(SB) VOR T0, T0, T3L VOR T1, T1, T3H // X=T4; Y=Y1; MUL; T- // T4 = T4*Y1 T3 T4 VOR T4L, T4L, X0 VOR T4H, T4H, X1 MOVD in1+8(FP), P1ptr LXVD2X (R17)(P1ptr), Y0 // Y1H LXVD2X (R18)(P1ptr), Y1 // Y1L XXPERMDI Y0, Y0, $2, Y0 XXPERMDI Y1, Y1, $2, Y1 CALL p256MulInternal<>(SB) // SUB(T+0x00(SB), CPOOL MOVD $16, R16 MOVD $32, R17 MOVD $48, R18 MOVD $64, R19 MOVD $80, R20 LXVD2X (R16)(CPOOL), PH LXVD2X (R0)(CPOOL), PL // X=Z1; Y=Z1; MUL; T- // T1 = Z1² LXVD2X (R19)(P1ptr), X0 // Z1H LXVD2X (R20)(P1ptr), X1 // Z1L XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 VOR X0, X0, Y0 VOR X1, X1, Y1 CALL p256MulInternal<>(SB) // SUB(X(SB) // ADD(T2(SB) // Leave T0, T1 as is. XXPERMDI T0, T0, $2, TT0 XXPERMDI T1, T1, $2, TT1 STXVD2X TT0, (R19)(P3ptr) STXVD2X TT1, (R20)(P3ptr) // X- ; Y=X ; MUL; T- // Y3 = Y3² VOR X0, X0, Y0 VOR X1, X1, Y1 CALL p256MulInternal<>(SB) // X=T ; Y=X1; MUL; T3=T // T3 = Y3*X1 VOR T0, T0, X0 VOR T1, T1, X1 LXVD2X (R0)(P1ptr), Y0 LXVD2X (R16)(P1ptr), Y1 XXPERMDI Y0, Y0, $2, Y0 XXPERMDI Y1, Y1, $2, Y1 CALL p256MulInternal<>(SB) VOR T0, T0, T3L VOR T1, T1, T3H // X- ; Y=X ; MUL; T- // Y3 = Y3² VOR X0, X0, Y0 VOR X1, X1, Y1 CALL p256MulInternal<>(SB) // HAL(Y3(SB) // ADD(T1(SB) // SUB(Y3+0x00(SB), CPOOL MOVD $16, R16 MOVD $32, R17 MOVD $48, R18 MOVD $64, R19 MOVD $80, R20 LXVD2X (R16)(CPOOL), PH LXVD2X (R0)(CPOOL), PL // X=Z1; Y=Z1; MUL; T- // T1 = Z1*Z1 LXVD2X (R19)(P1ptr), X0 // Z1L LXVD2X (R20)(P1ptr), X1 // Z1H XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 VOR X0, X0, Y0 VOR X1, X1, Y1 CALL p256MulInternal<>(SB) // X- ; Y=T ; MUL; R=T // R = Z1*T1 VOR T0, T0, Y0 VOR T1, T1, Y1 CALL p256MulInternal<>(SB) VOR T0, T0, RL // SAVE: RL VOR T1, T1, RH // SAVE: RH STXVD2X RH, (R1)(R17) // V27 has to be saved // X=X2; Y- ; MUL; H=T // H = X2*T1 MOVD in2+16(FP), P2ptr LXVD2X (R0)(P2ptr), X0 // X2L LXVD2X (R16)(P2ptr), X1 // X2H XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 CALL p256MulInternal<>(SB) VOR T0, T0, HL // SAVE: HL VOR T1, T1, HH // SAVE: HH // X=Z2; Y=Z2; MUL; T- // T2 = Z2*Z2 MOVD in2+16(FP), P2ptr LXVD2X (R19)(P2ptr), X0 // Z2L LXVD2X (R20)(P2ptr), X1 // Z2H XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 VOR X0, X0, Y0 VOR X1, X1, Y1 CALL p256MulInternal<>(SB) // X- ; Y=T ; MUL; S1=T // S1 = Z2*T2 VOR T0, T0, Y0 VOR T1, T1, Y1 CALL p256MulInternal<>(SB) VOR T0, T0, S1L // SAVE: S1L VOR T1, T1, S1H // SAVE: S1H // X=X1; Y- ; MUL; U1=T // U1 = X1*T2 MOVD in1+8(FP), P1ptr LXVD2X (R0)(P1ptr), X0 // X1L LXVD2X (R16)(P1ptr), X1 // X1H XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 CALL p256MulInternal<>(SB) VOR T0, T0, U1L // SAVE: U1L VOR T1, T1, U1H // SAVE: U1H // SUB(H(SB) // X=T ; Y=H ; MUL; Z3:=T// Z3 = Z3*H VOR T0, T0, X0 VOR T1, T1, X1 VOR HL, HL, Y0 VOR HH, HH, Y1 CALL p256MulInternal<>(SB) MOVD res+0(FP), P3ptr XXPERMDI T1, T1, $2, TT1 XXPERMDI T0, T0, $2, TT0 STXVD2X TT0, (R19)(P3ptr) STXVD2X TT1, (R20)(P3ptr) // X=Y1; Y=S1; MUL; S1=T // S1 = Y1*S1 MOVD in1+8(FP), P1ptr LXVD2X (R17)(P1ptr), X0 LXVD2X (R18)(P1ptr), X1 XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 VOR S1L, S1L, Y0 VOR S1H, S1H, Y1 CALL p256MulInternal<>(SB) VOR T0, T0, S1L VOR T1, T1, S1H // X=Y2; Y=R ; MUL; T- // R = Y2*R MOVD in2+16(FP), P2ptr LXVD2X (R17)(P2ptr), X0 LXVD2X (R18)(P2ptr), X1 XXPERMDI X0, X0, $2, X0 XXPERMDI X1, X1, $2, X1 VOR RL, RL, Y0 // VOR RH, RH, Y1 RH was saved above in D2X format LXVD2X (R1)(R17), Y1 CALL p256MulInternal<>(SB) // SUB(R(SB) // X- ; Y=T ; MUL; T2=T // T2 = H*T1 VOR T0, T0, Y0 VOR T1, T1, Y1 CALL p256MulInternal<>(SB) VOR T0, T0, T2L VOR T1, T1, T2H // X=U1; Y- ; MUL; U1=T // U1 = U1*T1 VOR U1L, U1L, X0 VOR U1H, U1H, X1 CALL p256MulInternal<>(SB) VOR T0, T0, U1L VOR T1, T1, U1H // X=R ; Y=R ; MUL; T- // X3 = R*R VOR RL, RL, X0 // VOR RH, RH, X1 VOR RL, RL, Y0 // RH was saved above using STXVD2X LXVD2X (R1)(R17), X1 VOR X1, X1, Y1 // VOR RH, RH, Y1 CALL p256MulInternal<>(SB) // SUB(T(SB) VOR T0, T0, U1L VOR T1, T1, U1H // X=S1; Y=T2; MUL; T- // T2 = S1*T2 VOR S1L, S1L, X0 VOR S1H, S1H, X1 VOR T2L, T2L, Y0 VOR T2H, T2H, Y1 CALL p256MulInternal<>(SB) // SUB(T+0x00(SB)/8, $0xffffffff00000001 // P256 DATA p256<>+0x08(SB)/8, $0x0000000000000000 // P256 DATA p256<>+0x10(SB)/8, $0x00000000ffffffff // P256 DATA p256<>+0x18(SB)/8, $0xffffffffffffffff // P256 DATA p256<>+0x20(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL d1 d0 d1 d0 DATA p256<>+0x28(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL d1 d0 d1 d0 DATA p256<>+0x30(SB)/8, $0x0000000010111213 // SEL 0 d1 d0 0 DATA p256<>+0x38(SB)/8, $0x1415161700000000 // SEL 0 d1 d0 0 DATA p256<>+0x40(SB)/8, $0x18191a1b1c1d1e1f // SEL d1 d0 d1 d0 DATA p256<>+0x48(SB)/8, $0x18191a1b1c1d1e1f // SEL d1 d0 d1 d0 DATA p256<>+0x50(SB)/8, $0x0706050403020100 // LE2BE permute mask DATA p256<>+0x58(SB)/8, $0x0f0e0d0c0b0a0908 // LE2BE permute mask DATA p256mul<>+0x00(SB)/8, $0xffffffff00000001 // P256 DATA p256mul<>+0x08(SB)/8, $0x0000000000000000 // P256 DATA p256mul<>+0x10(SB)/8, $0x00000000ffffffff // P256 DATA p256mul<>+0x18(SB)/8, $0xffffffffffffffff // P256 DATA p256mul<>+0x20(SB)/8, $0x1c1d1e1f00000000 // SEL d0 0 0 d0 DATA p256mul<>+0x28(SB)/8, $0x000000001c1d1e1f // SEL d0 0 0 d0 DATA p256mul<>+0x30(SB)/8, $0x0001020304050607 // SEL d0 0 d1 d0 DATA p256mul<>+0x38(SB)/8, $0x1c1d1e1f0c0d0e0f // SEL d0 0 d1 d0 DATA p256mul<>+0x40(SB)/8, $0x040506071c1d1e1f // SEL 0 d1 d0 d1 DATA p256mul<>+0x48(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL 0 d1 d0 d1 DATA p256mul<>+0x50(SB)/8, $0x0405060704050607 // SEL 0 0 d1 d0 DATA p256mul<>+0x58(SB)/8, $0x1c1d1e1f0c0d0e0f // SEL 0 0 d1 d0 DATA p256mul<>+0x60(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL d1 d0 d1 d0 DATA p256mul<>+0x68(SB)/8, $0x0c0d0e0f1c1d1e1f // SEL d1 d0 d1 d0 DATA p256mul<>+0x70(SB)/8, $0x141516170c0d0e0f // SEL 0 d1 d0 0 DATA p256mul<>+0x78(SB)/8, $0x1c1d1e1f14151617 // SEL 0 d1 d0 0 DATA p256mul<>+0x80(SB)/8, $0x00000000fffffffe // (1*2^256)%P256 DATA p256mul<>+0x88(SB)/8, $0xffffffffffffffff // (1*2^256)%P256 DATA p256mul<>+0x90(SB)/8, $0xffffffff00000000 // (1*2^256)%P256 DATA p256mul<>+0x98(SB)/8, $0x0000000000000001 // (1*2^256)%P256 GLOBL p256<>(SB), 8, $96 GLOBL p256mul<>(SB), 8, $160 // --------------------------------------- // iff cond == 1 val <- -val // func p256NegCond(val *p256Element, cond int) #define P1ptr R1 #define CPOOL R4 #define Y1L V0 #define Y1H V1 #define T1L V2 #define T1H V3 #define PL V30 #define PH V31 #define ZER V4 #define SEL1 V5 #define CAR1 V6 TEXT ·p256NegCond(SB), NOSPLIT, $0 MOVD val+0(FP), P1ptr MOVD $p256mul<>+0x00(SB), CPOOL VL 16(CPOOL), PL VL 0(CPOOL), PH VL 16(P1ptr), Y1H VPDI $0x4, Y1H, Y1H, Y1H VL 0(P1ptr), Y1L VPDI $0x4, Y1L, Y1L, Y1L VLREPG cond+8(FP), SEL1 VZERO ZER VCEQG SEL1, ZER, SEL1 VSCBIQ Y1L, PL, CAR1 VSQ Y1L, PL, T1L VSBIQ PH, Y1H, CAR1, T1H VSEL Y1L, T1L, SEL1, Y1L VSEL Y1H, T1H, SEL1, Y1H VPDI $0x4, Y1H, Y1H, Y1H VST Y1H, 16(P1ptr) VPDI $0x4, Y1L, Y1L, Y1L VST Y1L, 0(P1ptr) RET #undef P1ptr #undef CPOOL #undef Y1L #undef Y1H #undef T1L #undef T1H #undef PL #undef PH #undef ZER #undef SEL1 #undef CAR1 // --------------------------------------- // if cond == 0 res <- b; else res <- a // func p256MovCond(res, a, b *P256Point, cond int) #define P3ptr R1 #define P1ptr R2 #define P2ptr R3 #define X1L V0 #define X1H V1 #define Y1L V2 #define Y1H V3 #define Z1L V4 #define Z1H V5 #define X2L V6 #define X2H V7 #define Y2L V8 #define Y2H V9 #define Z2L V10 #define Z2H V11 #define ZER V18 #define SEL1 V19 TEXT ·p256MovCond(SB), NOSPLIT, $0 MOVD res+0(FP), P3ptr MOVD a+8(FP), P1ptr MOVD b+16(FP), P2ptr VLREPG cond+24(FP), SEL1 VZERO ZER VCEQG SEL1, ZER, SEL1 VL 0(P1ptr), X1H VL 16(P1ptr), X1L VL 32(P1ptr), Y1H VL 48(P1ptr), Y1L VL 64(P1ptr), Z1H VL 80(P1ptr), Z1L VL 0(P2ptr), X2H VL 16(P2ptr), X2L VL 32(P2ptr), Y2H VL 48(P2ptr), Y2L VL 64(P2ptr), Z2H VL 80(P2ptr), Z2L VSEL X2L, X1L, SEL1, X1L VSEL X2H, X1H, SEL1, X1H VSEL Y2L, Y1L, SEL1, Y1L VSEL Y2H, Y1H, SEL1, Y1H VSEL Z2L, Z1L, SEL1, Z1L VSEL Z2H, Z1H, SEL1, Z1H VST X1H, 0(P3ptr) VST X1L, 16(P3ptr) VST Y1H, 32(P3ptr) VST Y1L, 48(P3ptr) VST Z1H, 64(P3ptr) VST Z1L, 80(P3ptr) RET #undef P3ptr #undef P1ptr #undef P2ptr #undef X1L #undef X1H #undef Y1L #undef Y1H #undef Z1L #undef Z1H #undef X2L #undef X2H #undef Y2L #undef Y2H #undef Z2L #undef Z2H #undef ZER #undef SEL1 // --------------------------------------- // Constant time table access // Indexed from 1 to 15, with -1 offset // (index 0 is implicitly point at infinity) // func p256Select(res *P256Point, table *p256Table, idx int) #define P3ptr R1 #define P1ptr R2 #define COUNT R4 #define X1L V0 #define X1H V1 #define Y1L V2 #define Y1H V3 #define Z1L V4 #define Z1H V5 #define X2L V6 #define X2H V7 #define Y2L V8 #define Y2H V9 #define Z2L V10 #define Z2H V11 #define ONE V18 #define IDX V19 #define SEL1 V20 #define SEL2 V21 TEXT ·p256Select(SB), NOSPLIT, $0 MOVD res+0(FP), P3ptr MOVD table+8(FP), P1ptr VLREPB idx+(16+7)(FP), IDX VREPIB $1, ONE VREPIB $1, SEL2 MOVD $1, COUNT VZERO X1H VZERO X1L VZERO Y1H VZERO Y1L VZERO Z1H VZERO Z1L loop_select: VL 0(P1ptr), X2H VL 16(P1ptr), X2L VL 32(P1ptr), Y2H VL 48(P1ptr), Y2L VL 64(P1ptr), Z2H VL 80(P1ptr), Z2L VCEQG SEL2, IDX, SEL1 VSEL X2L, X1L, SEL1, X1L VSEL X2H, X1H, SEL1, X1H VSEL Y2L, Y1L, SEL1, Y1L VSEL Y2H, Y1H, SEL1, Y1H VSEL Z2L, Z1L, SEL1, Z1L VSEL Z2H, Z1H, SEL1, Z1H VAB SEL2, ONE, SEL2 ADDW $1, COUNT ADD $96, P1ptr CMPW COUNT, $17 BLT loop_select VST X1H, 0(P3ptr) VST X1L, 16(P3ptr) VST Y1H, 32(P3ptr) VST Y1L, 48(P3ptr) VST Z1H, 64(P3ptr) VST Z1L, 80(P3ptr) RET #undef P3ptr #undef P1ptr #undef COUNT #undef X1L #undef X1H #undef Y1L #undef Y1H #undef Z1L #undef Z1H #undef X2L #undef X2H #undef Y2L #undef Y2H #undef Z2L #undef Z2H #undef ONE #undef IDX #undef SEL1 #undef SEL2 // --------------------------------------- // func p256FromMont(res, in *p256Element) #define res_ptr R1 #define x_ptr R2 #define CPOOL R4 #define T0 V0 #define T1 V1 #define T2 V2 #define TT0 V3 #define TT1 V4 #define ZER V6 #define SEL1 V7 #define SEL2 V8 #define CAR1 V9 #define CAR2 V10 #define RED1 V11 #define RED2 V12 #define PL V13 #define PH V14 TEXT ·p256FromMont(SB), NOSPLIT, $0 MOVD res+0(FP), res_ptr MOVD in+8(FP), x_ptr VZERO T2 VZERO ZER MOVD $p256<>+0x00(SB), CPOOL VL 16(CPOOL), PL VL 0(CPOOL), PH VL 48(CPOOL), SEL2 VL 64(CPOOL), SEL1 VL (0*16)(x_ptr), T0 VPDI $0x4, T0, T0, T0 VL (1*16)(x_ptr), T1 VPDI $0x4, T1, T1, T1 // First round VPERM T1, T0, SEL1, RED2 // d1 d0 d1 d0 VPERM ZER, RED2, SEL2, RED1 // 0 d1 d0 0 VSQ RED1, RED2, RED2 // Guaranteed not to underflow VSLDB $8, T1, T0, T0 VSLDB $8, T2, T1, T1 VACCQ T0, RED1, CAR1 VAQ T0, RED1, T0 VACCCQ T1, RED2, CAR1, CAR2 VACQ T1, RED2, CAR1, T1 VAQ T2, CAR2, T2 // Second round VPERM T1, T0, SEL1, RED2 // d1 d0 d1 d0 VPERM ZER, RED2, SEL2, RED1 // 0 d1 d0 0 VSQ RED1, RED2, RED2 // Guaranteed not to underflow VSLDB $8, T1, T0, T0 VSLDB $8, T2, T1, T1 VACCQ T0, RED1, CAR1 VAQ T0, RED1, T0 VACCCQ T1, RED2, CAR1, CAR2 VACQ T1, RED2, CAR1, T1 VAQ T2, CAR2, T2 // Third round VPERM T1, T0, SEL1, RED2 // d1 d0 d1 d0 VPERM ZER, RED2, SEL2, RED1 // 0 d1 d0 0 VSQ RED1, RED2, RED2 // Guaranteed not to underflow VSLDB $8, T1, T0, T0 VSLDB $8, T2, T1, T1 VACCQ T0, RED1, CAR1 VAQ T0, RED1, T0 VACCCQ T1, RED2, CAR1, CAR2 VACQ T1, RED2, CAR1, T1 VAQ T2, CAR2, T2 // Last round VPERM T1, T0, SEL1, RED2 // d1 d0 d1 d0 VPERM ZER, RED2, SEL2, RED1 // 0 d1 d0 0 VSQ RED1, RED2, RED2 // Guaranteed not to underflow VSLDB $8, T1, T0, T0 VSLDB $8, T2, T1, T1 VACCQ T0, RED1, CAR1 VAQ T0, RED1, T0 VACCCQ T1, RED2, CAR1, CAR2 VACQ T1, RED2, CAR1, T1 VAQ T2, CAR2, T2 // --------------------------------------------------- VSCBIQ PL, T0, CAR1 VSQ PL, T0, TT0 VSBCBIQ T1, PH, CAR1, CAR2 VSBIQ T1, PH, CAR1, TT1 VSBIQ T2, ZER, CAR2, T2 // what output to use, TT1||TT0 or T1||T0? VSEL T0, TT0, T2, T0 VSEL T1, TT1, T2, T1 VPDI $0x4, T0, T0, TT0 VST TT0, (0*16)(res_ptr) VPDI $0x4, T1, T1, TT1 VST TT1, (1*16)(res_ptr) RET #undef res_ptr #undef x_ptr #undef CPOOL #undef T0 #undef T1 #undef T2 #undef TT0 #undef TT1 #undef ZER #undef SEL1 #undef SEL2 #undef CAR1 #undef CAR2 #undef RED1 #undef RED2 #undef PL #undef PH // Constant time table access // Indexed from 1 to 15, with -1 offset // (index 0 is implicitly point at infinity) // func p256SelectBase(point *p256Point, table []p256Point, idx int) // new : func p256SelectAffine(res *p256AffinePoint, table *p256AffineTable, idx int) #define P3ptr R1 #define P1ptr R2 #define COUNT R4 #define CPOOL R5 #define X1L V0 #define X1H V1 #define Y1L V2 #define Y1H V3 #define Z1L V4 #define Z1H V5 #define X2L V6 #define X2H V7 #define Y2L V8 #define Y2H V9 #define Z2L V10 #define Z2H V11 #define LE2BE V12 #define ONE V18 #define IDX V19 #define SEL1 V20 #define SEL2 V21 TEXT ·p256SelectAffine(SB), NOSPLIT, $0 MOVD res+0(FP), P3ptr MOVD table+8(FP), P1ptr MOVD $p256<>+0x00(SB), CPOOL VLREPB idx+(16+7)(FP), IDX VREPIB $1, ONE VREPIB $1, SEL2 MOVD $1, COUNT VL 80(CPOOL), LE2BE VZERO X1H VZERO X1L VZERO Y1H VZERO Y1L loop_select: VL 0(P1ptr), X2H VL 16(P1ptr), X2L VL 32(P1ptr), Y2H VL 48(P1ptr), Y2L VCEQG SEL2, IDX, SEL1 VSEL X2L, X1L, SEL1, X1L VSEL X2H, X1H, SEL1, X1H VSEL Y2L, Y1L, SEL1, Y1L VSEL Y2H, Y1H, SEL1, Y1H VAB SEL2, ONE, SEL2 ADDW $1, COUNT ADD $64, P1ptr CMPW COUNT, $33 // len(p256AffineTable) + 1 BLT loop_select VST X1H, 0(P3ptr) VST X1L, 16(P3ptr) VST Y1H, 32(P3ptr) VST Y1L, 48(P3ptr) RET #undef P3ptr #undef P1ptr #undef COUNT #undef X1L #undef X1H #undef Y1L #undef Y1H #undef Z1L #undef Z1H #undef X2L #undef X2H #undef Y2L #undef Y2H #undef Z2L #undef Z2H #undef ONE #undef IDX #undef SEL1 #undef SEL2 #undef CPOOL // --------------------------------------- // p256MulInternal // V0-V3,V30,V31 - Not Modified // V4-V15 - Volatile #define CPOOL R4 // Parameters #define X0 V0 // Not modified #define X1 V1 // Not modified #define Y0 V2 // Not modified #define Y1 V3 // Not modified #define T0 V4 #define T1 V5 #define P0 V30 // Not modified #define P1 V31 // Not modified // Temporaries #define YDIG V6 // Overloaded with CAR2, ZER #define ADD1H V7 // Overloaded with ADD3H #define ADD2H V8 // Overloaded with ADD4H #define ADD3 V9 // Overloaded with SEL2,SEL5 #define ADD4 V10 // Overloaded with SEL3,SEL6 #define RED1 V11 // Overloaded with CAR2 #define RED2 V12 #define RED3 V13 // Overloaded with SEL1 #define T2 V14 // Overloaded temporaries #define ADD1 V4 // Overloaded with T0 #define ADD2 V5 // Overloaded with T1 #define ADD3H V7 // Overloaded with ADD1H #define ADD4H V8 // Overloaded with ADD2H #define ZER V6 // Overloaded with YDIG, CAR2 #define CAR1 V6 // Overloaded with YDIG, ZER #define CAR2 V11 // Overloaded with RED1 // Constant Selects #define SEL1 V13 // Overloaded with RED3 #define SEL2 V9 // Overloaded with ADD3,SEL5 #define SEL3 V10 // Overloaded with ADD4,SEL6 #define SEL4 V6 // Overloaded with YDIG,CAR2,ZER #define SEL5 V9 // Overloaded with ADD3,SEL2 #define SEL6 V10 // Overloaded with ADD4,SEL3 /* * * To follow the flow of bits, for your own sanity a stiff drink, need you shall. * Of a single round, a 'helpful' picture, here is. Meaning, column position has. * With you, SIMD be... * * +--------+--------+ * +--------| RED2 | RED1 | * | +--------+--------+ * | ---+--------+--------+ * | +---- T2| T1 | T0 |--+ * | | ---+--------+--------+ | * | | | * | | ======================= | * | | | * | | +--------+--------+<-+ * | +-------| ADD2 | ADD1 |--|-----+ * | | +--------+--------+ | | * | | +--------+--------+<---+ | * | | | ADD2H | ADD1H |--+ | * | | +--------+--------+ | | * | | +--------+--------+<-+ | * | | | ADD4 | ADD3 |--|-+ | * | | +--------+--------+ | | | * | | +--------+--------+<---+ | | * | | | ADD4H | ADD3H |------|-+ |(+vzero) * | | +--------+--------+ | | V * | | ------------------------ | | +--------+ * | | | | | RED3 | [d0 0 0 d0] * | | | | +--------+ * | +---->+--------+--------+ | | | * (T2[1w]||ADD2[4w]||ADD1[3w]) +--------| T1 | T0 | | | | * | +--------+--------+ | | | * +---->---+--------+--------+ | | | * T2| T1 | T0 |----+ | | * ---+--------+--------+ | | | * ---+--------+--------+<---+ | | * +--- T2| T1 | T0 |----------+ * | ---+--------+--------+ | | * | +--------+--------+<-------------+ * | | RED2 | RED1 |-----+ | | [0 d1 d0 d1] [d0 0 d1 d0] * | +--------+--------+ | | | * | +--------+<----------------------+ * | | RED3 |--------------+ | [0 0 d1 d0] * | +--------+ | | * +--->+--------+--------+ | | * | T1 | T0 |--------+ * +--------+--------+ | | * --------------------------- | | * | | * +--------+--------+<----+ | * | RED2 | RED1 | | * +--------+--------+ | * ---+--------+--------+<-------+ * T2| T1 | T0 | (H1P-H1P-H00RRAY!) * ---+--------+--------+ * * *Mi obra de arte de siglo XXI @vpaprots * * * First group is special, doesn't get the two inputs: * +--------+--------+<-+ * +-------| ADD2 | ADD1 |--|-----+ * | +--------+--------+ | | * | +--------+--------+<---+ | * | | ADD2H | ADD1H |--+ | * | +--------+--------+ | | * | +--------+--------+<-+ | * | | ADD4 | ADD3 |--|-+ | * | +--------+--------+ | | | * | +--------+--------+<---+ | | * | | ADD4H | ADD3H |------|-+ |(+vzero) * | +--------+--------+ | | V * | ------------------------ | | +--------+ * | | | | RED3 | [d0 0 0 d0] * | | | +--------+ * +---->+--------+--------+ | | | * (T2[1w]||ADD2[4w]||ADD1[3w]) | T1 | T0 |----+ | | * +--------+--------+ | | | * ---+--------+--------+<---+ | | * +--- T2| T1 | T0 |----------+ * | ---+--------+--------+ | | * | +--------+--------+<-------------+ * | | RED2 | RED1 |-----+ | | [0 d1 d0 d1] [d0 0 d1 d0] * | +--------+--------+ | | | * | +--------+<----------------------+ * | | RED3 |--------------+ | [0 0 d1 d0] * | +--------+ | | * +--->+--------+--------+ | | * | T1 | T0 |--------+ * +--------+--------+ | | * --------------------------- | | * | | * +--------+--------+<----+ | * | RED2 | RED1 | | * +--------+--------+ | * ---+--------+--------+<-------+ * T2| T1 | T0 | (H1P-H1P-H00RRAY!) * ---+--------+--------+ * * Last 'group' needs to RED2||RED1 shifted less */ TEXT p256MulInternal<>(SB), NOSPLIT, $0-0 VL 32(CPOOL), SEL1 VL 48(CPOOL), SEL2 VL 64(CPOOL), SEL3 VL 80(CPOOL), SEL4 // --------------------------------------------------- VREPF $3, Y0, YDIG VMLHF X0, YDIG, ADD1H VMLHF X1, YDIG, ADD2H VMLF X0, YDIG, ADD1 VMLF X1, YDIG, ADD2 VREPF $2, Y0, YDIG VMALF X0, YDIG, ADD1H, ADD3 VMALF X1, YDIG, ADD2H, ADD4 VMALHF X0, YDIG, ADD1H, ADD3H // ADD1H Free VMALHF X1, YDIG, ADD2H, ADD4H // ADD2H Free VZERO ZER VL 32(CPOOL), SEL1 VPERM ZER, ADD1, SEL1, RED3 // [d0 0 0 d0] VSLDB $12, ADD2, ADD1, T0 // ADD1 Free VSLDB $12, ZER, ADD2, T1 // ADD2 Free VACCQ T0, ADD3, CAR1 VAQ T0, ADD3, T0 // ADD3 Free VACCCQ T1, ADD4, CAR1, T2 VACQ T1, ADD4, CAR1, T1 // ADD4 Free VL 48(CPOOL), SEL2 VL 64(CPOOL), SEL3 VL 80(CPOOL), SEL4 VPERM RED3, T0, SEL2, RED1 // [d0 0 d1 d0] VPERM RED3, T0, SEL3, RED2 // [ 0 d1 d0 d1] VPERM RED3, T0, SEL4, RED3 // [ 0 0 d1 d0] VSQ RED3, RED2, RED2 // Guaranteed not to underflow VSLDB $12, T1, T0, T0 VSLDB $12, T2, T1, T1 VACCQ T0, ADD3H, CAR1 VAQ T0, ADD3H, T0 VACCCQ T1, ADD4H, CAR1, T2 VACQ T1, ADD4H, CAR1, T1 // --------------------------------------------------- VREPF $1, Y0, YDIG VMALHF X0, YDIG, T0, ADD1H VMALHF X1, YDIG, T1, ADD2H VMALF X0, YDIG, T0, ADD1 // T0 Free->ADD1 VMALF X1, YDIG, T1, ADD2 // T1 Free->ADD2 VREPF $0, Y0, YDIG VMALF X0, YDIG, ADD1H, ADD3 VMALF X1, YDIG, ADD2H, ADD4 VMALHF X0, YDIG, ADD1H, ADD3H // ADD1H Free->ADD3H VMALHF X1, YDIG, ADD2H, ADD4H // ADD2H Free->ADD4H , YDIG Free->ZER VZERO ZER VL 32(CPOOL), SEL1 VPERM ZER, ADD1, SEL1, RED3 // [d0 0 0 d0] VSLDB $12, ADD2, ADD1, T0 // ADD1 Free->T0 VSLDB $12, T2, ADD2, T1 // ADD2 Free->T1, T2 Free VACCQ T0, RED1, CAR1 VAQ T0, RED1, T0 VACCCQ T1, RED2, CAR1, T2 VACQ T1, RED2, CAR1, T1 VACCQ T0, ADD3, CAR1 VAQ T0, ADD3, T0 VACCCQ T1, ADD4, CAR1, CAR2 VACQ T1, ADD4, CAR1, T1 VAQ T2, CAR2, T2 VL 48(CPOOL), SEL2 VL 64(CPOOL), SEL3 VL 80(CPOOL), SEL4 VPERM RED3, T0, SEL2, RED1 // [d0 0 d1 d0] VPERM RED3, T0, SEL3, RED2 // [ 0 d1 d0 d1] VPERM RED3, T0, SEL4, RED3 // [ 0 0 d1 d0] VSQ RED3, RED2, RED2 // Guaranteed not to underflow VSLDB $12, T1, T0, T0 VSLDB $12, T2, T1, T1 VACCQ T0, ADD3H, CAR1 VAQ T0, ADD3H, T0 VACCCQ T1, ADD4H, CAR1, T2 VACQ T1, ADD4H, CAR1, T1 // --------------------------------------------------- VREPF $3, Y1, YDIG VMALHF X0, YDIG, T0, ADD1H VMALHF X1, YDIG, T1, ADD2H VMALF X0, YDIG, T0, ADD1 VMALF X1, YDIG, T1, ADD2 VREPF $2, Y1, YDIG VMALF X0, YDIG, ADD1H, ADD3 VMALF X1, YDIG, ADD2H, ADD4 VMALHF X0, YDIG, ADD1H, ADD3H // ADD1H Free VMALHF X1, YDIG, ADD2H, ADD4H // ADD2H Free VZERO ZER VL 32(CPOOL), SEL1 VPERM ZER, ADD1, SEL1, RED3 // [d0 0 0 d0] VSLDB $12, ADD2, ADD1, T0 // ADD1 Free VSLDB $12, T2, ADD2, T1 // ADD2 Free VACCQ T0, RED1, CAR1 VAQ T0, RED1, T0 VACCCQ T1, RED2, CAR1, T2 VACQ T1, RED2, CAR1, T1 VACCQ T0, ADD3, CAR1 VAQ T0, ADD3, T0 VACCCQ T1, ADD4, CAR1, CAR2 VACQ T1, ADD4, CAR1, T1 VAQ T2, CAR2, T2 VL 48(CPOOL), SEL2 VL 64(CPOOL), SEL3 VL 80(CPOOL), SEL4 VPERM RED3, T0, SEL2, RED1 // [d0 0 d1 d0] VPERM RED3, T0, SEL3, RED2 // [ 0 d1 d0 d1] VPERM RED3, T0, SEL4, RED3 // [ 0 0 d1 d0] VSQ RED3, RED2, RED2 // Guaranteed not to underflow VSLDB $12, T1, T0, T0 VSLDB $12, T2, T1, T1 VACCQ T0, ADD3H, CAR1 VAQ T0, ADD3H, T0 VACCCQ T1, ADD4H, CAR1, T2 VACQ T1, ADD4H, CAR1, T1 // --------------------------------------------------- VREPF $1, Y1, YDIG VMALHF X0, YDIG, T0, ADD1H VMALHF X1, YDIG, T1, ADD2H VMALF X0, YDIG, T0, ADD1 VMALF X1, YDIG, T1, ADD2 VREPF $0, Y1, YDIG VMALF X0, YDIG, ADD1H, ADD3 VMALF X1, YDIG, ADD2H, ADD4 VMALHF X0, YDIG, ADD1H, ADD3H VMALHF X1, YDIG, ADD2H, ADD4H VZERO ZER VL 32(CPOOL), SEL1 VPERM ZER, ADD1, SEL1, RED3 // [d0 0 0 d0] VSLDB $12, ADD2, ADD1, T0 VSLDB $12, T2, ADD2, T1 VACCQ T0, RED1, CAR1 VAQ T0, RED1, T0 VACCCQ T1, RED2, CAR1, T2 VACQ T1, RED2, CAR1, T1 VACCQ T0, ADD3, CAR1 VAQ T0, ADD3, T0 VACCCQ T1, ADD4, CAR1, CAR2 VACQ T1, ADD4, CAR1, T1 VAQ T2, CAR2, T2 VL 96(CPOOL), SEL5 VL 112(CPOOL), SEL6 VPERM T0, RED3, SEL5, RED2 // [d1 d0 d1 d0] VPERM T0, RED3, SEL6, RED1 // [ 0 d1 d0 0] VSQ RED1, RED2, RED2 // Guaranteed not to underflow VSLDB $12, T1, T0, T0 VSLDB $12, T2, T1, T1 VACCQ T0, ADD3H, CAR1 VAQ T0, ADD3H, T0 VACCCQ T1, ADD4H, CAR1, T2 VACQ T1, ADD4H, CAR1, T1 VACCQ T0, RED1, CAR1 VAQ T0, RED1, T0 VACCCQ T1, RED2, CAR1, CAR2 VACQ T1, RED2, CAR1, T1 VAQ T2, CAR2, T2 // --------------------------------------------------- VZERO RED3 VSCBIQ P0, T0, CAR1 VSQ P0, T0, ADD1H VSBCBIQ T1, P1, CAR1, CAR2 VSBIQ T1, P1, CAR1, ADD2H VSBIQ T2, RED3, CAR2, T2 // what output to use, ADD2H||ADD1H or T1||T0? VSEL T0, ADD1H, T2, T0 VSEL T1, ADD2H, T2, T1 RET #undef CPOOL #undef X0 #undef X1 #undef Y0 #undef Y1 #undef T0 #undef T1 #undef P0 #undef P1 #undef SEL1 #undef SEL2 #undef SEL3 #undef SEL4 #undef SEL5 #undef SEL6 #undef YDIG #undef ADD1H #undef ADD2H #undef ADD3 #undef ADD4 #undef RED1 #undef RED2 #undef RED3 #undef T2 #undef ADD1 #undef ADD2 #undef ADD3H #undef ADD4H #undef ZER #undef CAR1 #undef CAR2 // --------------------------------------- // Parameters #define X0 V0 #define X1 V1 #define Y0 V2 #define Y1 V3 TEXT p256SqrInternal<>(SB), NOFRAME|NOSPLIT, $0 VLR X0, Y0 VLR X1, Y1 BR p256MulInternal<>(SB) #undef X0 #undef X1 #undef Y0 #undef Y1 #define p256SubInternal(T1, T0, X1, X0, Y1, Y0) \ VZERO ZER \ VSCBIQ Y0, X0, CAR1 \ VSQ Y0, X0, T0 \ VSBCBIQ X1, Y1, CAR1, SEL1 \ VSBIQ X1, Y1, CAR1, T1 \ VSQ SEL1, ZER, SEL1 \ \ VACCQ T0, PL, CAR1 \ VAQ T0, PL, TT0 \ VACQ T1, PH, CAR1, TT1 \ \ VSEL T0, TT0, SEL1, T0 \ VSEL T1, TT1, SEL1, T1 \ #define p256AddInternal(T1, T0, X1, X0, Y1, Y0) \ VACCQ X0, Y0, CAR1 \ VAQ X0, Y0, T0 \ VACCCQ X1, Y1, CAR1, T2 \ VACQ X1, Y1, CAR1, T1 \ \ VZERO ZER \ VSCBIQ PL, T0, CAR1 \ VSQ PL, T0, TT0 \ VSBCBIQ T1, PH, CAR1, CAR2 \ VSBIQ T1, PH, CAR1, TT1 \ VSBIQ T2, ZER, CAR2, SEL1 \ \ VSEL T0, TT0, SEL1, T0 \ VSEL T1, TT1, SEL1, T1 #define p256HalfInternal(T1, T0, X1, X0) \ VZERO ZER \ VSBIQ ZER, ZER, X0, SEL1 \ \ VACCQ X0, PL, CAR1 \ VAQ X0, PL, T0 \ VACCCQ X1, PH, CAR1, T2 \ VACQ X1, PH, CAR1, T1 \ \ VSEL X0, T0, SEL1, T0 \ VSEL X1, T1, SEL1, T1 \ VSEL ZER, T2, SEL1, T2 \ \ VSLDB $15, T2, ZER, TT1 \ VSLDB $15, T1, ZER, TT0 \ VREPIB $1, SEL1 \ VSRL SEL1, T0, T0 \ VSRL SEL1, T1, T1 \ VREPIB $7, SEL1 \ VSL SEL1, TT0, TT0 \ VSL SEL1, TT1, TT1 \ VO T0, TT0, T0 \ VO T1, TT1, T1 // --------------------------------------- // func p256Mul(res, in1, in2 *p256Element) #define res_ptr R1 #define x_ptr R2 #define y_ptr R3 #define CPOOL R4 // Parameters #define X0 V0 #define X1 V1 #define Y0 V2 #define Y1 V3 #define T0 V4 #define T1 V5 // Constants #define P0 V30 #define P1 V31 TEXT ·p256Mul(SB), NOSPLIT, $0 MOVD res+0(FP), res_ptr MOVD in1+8(FP), x_ptr MOVD in2+16(FP), y_ptr VL (0*16)(x_ptr), X0 VPDI $0x4, X0, X0, X0 VL (1*16)(x_ptr), X1 VPDI $0x4, X1, X1, X1 VL (0*16)(y_ptr), Y0 VPDI $0x4, Y0, Y0, Y0 VL (1*16)(y_ptr), Y1 VPDI $0x4, Y1, Y1, Y1 MOVD $p256mul<>+0x00(SB), CPOOL VL 16(CPOOL), P0 VL 0(CPOOL), P1 CALL p256MulInternal<>(SB) VPDI $0x4, T0, T0, T0 VST T0, (0*16)(res_ptr) VPDI $0x4, T1, T1, T1 VST T1, (1*16)(res_ptr) RET #undef res_ptr #undef x_ptr #undef y_ptr #undef CPOOL #undef X0 #undef X1 #undef Y0 #undef Y1 #undef T0 #undef T1 #undef P0 #undef P1 // --------------------------------------- // func p256Sqr(res, in *p256Element, n int) #define res_ptr R1 #define x_ptr R2 #define y_ptr R3 #define CPOOL R4 #define COUNT R5 #define N R6 // Parameters #define X0 V0 #define X1 V1 #define T0 V4 #define T1 V5 // Constants #define P0 V30 #define P1 V31 TEXT ·p256Sqr(SB), NOSPLIT, $0 MOVD res+0(FP), res_ptr MOVD in+8(FP), x_ptr VL (0*16)(x_ptr), X0 VPDI $0x4, X0, X0, X0 VL (1*16)(x_ptr), X1 VPDI $0x4, X1, X1, X1 MOVD $p256mul<>+0x00(SB), CPOOL MOVD $0, COUNT MOVD n+16(FP), N VL 16(CPOOL), P0 VL 0(CPOOL), P1 loop: CALL p256SqrInternal<>(SB) VLR T0, X0 VLR T1, X1 ADDW $1, COUNT CMPW COUNT, N BLT loop VPDI $0x4, T0, T0, T0 VST T0, (0*16)(res_ptr) VPDI $0x4, T1, T1, T1 VST T1, (1*16)(res_ptr) RET #undef res_ptr #undef x_ptr #undef y_ptr #undef CPOOL #undef COUNT #undef N #undef X0 #undef X1 #undef T0 #undef T1 #undef P0 #undef P1 // Point add with P2 being affine point // If sign == 1 -> P2 = -P2 // If sel == 0 -> P3 = P1 // if zero == 0 -> P3 = P2 // func p256PointAddAffineAsm(res, in1 *P256Point, in2 *p256AffinePoint, sign, sel, zero int) #define P3ptr R1 #define P1ptr R2 #define P2ptr R3 #define CPOOL R4 // Temporaries in REGs #define Y2L V15 #define Y2H V16 #define T1L V17 #define T1H V18 #define T2L V19 #define T2H V20 #define T3L V21 #define T3H V22 #define T4L V23 #define T4H V24 // Temps for Sub and Add #define TT0 V11 #define TT1 V12 #define T2 V13 // p256MulAsm Parameters #define X0 V0 #define X1 V1 #define Y0 V2 #define Y1 V3 #define T0 V4 #define T1 V5 #define PL V30 #define PH V31 // Names for zero/sel selects #define X1L V0 #define X1H V1 #define Y1L V2 // p256MulAsmParmY #define Y1H V3 // p256MulAsmParmY #define Z1L V4 #define Z1H V5 #define X2L V0 #define X2H V1 #define Z2L V4 #define Z2H V5 #define X3L V17 // T1L #define X3H V18 // T1H #define Y3L V21 // T3L #define Y3H V22 // T3H #define Z3L V28 #define Z3H V29 #define ZER V6 #define SEL1 V7 #define CAR1 V8 #define CAR2 V9 /* * * Three operand formula: * Source: 2004 Hankerson–Menezes–Vanstone, page 91. * T1 = Z1² * T2 = T1*Z1 * T1 = T1*X2 * T2 = T2*Y2 * T1 = T1-X1 * T2 = T2-Y1 * Z3 = Z1*T1 * T3 = T1² * T4 = T3*T1 * T3 = T3*X1 * T1 = 2*T3 * X3 = T2² * X3 = X3-T1 * X3 = X3-T4 * T3 = T3-X3 * T3 = T3*T2 * T4 = T4*Y1 * Y3 = T3-T4 * Three operand formulas, but with MulInternal X,Y used to store temps X=Z1; Y=Z1; MUL;T- // T1 = Z1² T1 X=T ; Y- ; MUL;T2=T // T2 = T1*Z1 T1 T2 X- ; Y=X2; MUL;T1=T // T1 = T1*X2 T1 T2 X=T2; Y=Y2; MUL;T- // T2 = T2*Y2 T1 T2 SUB(T2+0x00(SB), CPOOL VL 16(CPOOL), PL VL 0(CPOOL), PH // if (sign == 1) { // Y2 = fromBig(new(big.Int).Mod(new(big.Int).Sub(p256.P, new(big.Int).SetBytes(Y2)), p256.P)) // Y2 = P-Y2 // } VL 48(P2ptr), Y2H VPDI $0x4, Y2H, Y2H, Y2H VL 32(P2ptr), Y2L VPDI $0x4, Y2L, Y2L, Y2L VLREPG sign+24(FP), SEL1 VZERO ZER VCEQG SEL1, ZER, SEL1 VSCBIQ Y2L, PL, CAR1 VSQ Y2L, PL, T1L VSBIQ PH, Y2H, CAR1, T1H VSEL Y2L, T1L, SEL1, Y2L VSEL Y2H, T1H, SEL1, Y2H /* * * Three operand formula: * Source: 2004 Hankerson–Menezes–Vanstone, page 91. */ // X=Z1; Y=Z1; MUL; T- // T1 = Z1² T1 VL 80(P1ptr), X1 // Z1H VPDI $0x4, X1, X1, X1 VL 64(P1ptr), X0 // Z1L VPDI $0x4, X0, X0, X0 VLR X0, Y0 VLR X1, Y1 CALL p256SqrInternal<>(SB) // X=T ; Y- ; MUL; T2=T // T2 = T1*Z1 T1 T2 VLR T0, X0 VLR T1, X1 CALL p256MulInternal<>(SB) VLR T0, T2L VLR T1, T2H // X- ; Y=X2; MUL; T1=T // T1 = T1*X2 T1 T2 VL 16(P2ptr), Y1 // X2H VPDI $0x4, Y1, Y1, Y1 VL 0(P2ptr), Y0 // X2L VPDI $0x4, Y0, Y0, Y0 CALL p256MulInternal<>(SB) VLR T0, T1L VLR T1, T1H // X=T2; Y=Y2; MUL; T- // T2 = T2*Y2 T1 T2 VLR T2L, X0 VLR T2H, X1 VLR Y2L, Y0 VLR Y2H, Y1 CALL p256MulInternal<>(SB) // SUB(T2(SB) // VST T1, 64(P3ptr) // VST T0, 80(P3ptr) VLR T0, Z3L VLR T1, Z3H // X=Y; Y- ; MUL; X=T // T3 = T1*T1 T2 VLR Y0, X0 VLR Y1, X1 CALL p256SqrInternal<>(SB) VLR T0, X0 VLR T1, X1 // X- ; Y- ; MUL; T4=T // T4 = T3*T1 T2 T4 CALL p256MulInternal<>(SB) VLR T0, T4L VLR T1, T4H // X- ; Y=X1; MUL; T3=T // T3 = T3*X1 T2 T3 T4 VL 16(P1ptr), Y1 // X1H VPDI $0x4, Y1, Y1, Y1 VL 0(P1ptr), Y0 // X1L VPDI $0x4, Y0, Y0, Y0 CALL p256MulInternal<>(SB) VLR T0, T3L VLR T1, T3H // ADD(T1(SB) // SUB(T(SB) VLR T0, T3L VLR T1, T3H // X=T4; Y=Y1; MUL; T- // T4 = T4*Y1 T3 T4 VLR T4L, X0 VLR T4H, X1 VL 48(P1ptr), Y1 // Y1H VPDI $0x4, Y1, Y1, Y1 VL 32(P1ptr), Y0 // Y1L VPDI $0x4, Y0, Y0, Y0 CALL p256MulInternal<>(SB) // SUB(T+0x00(SB), CPOOL VL 16(CPOOL), PL VL 0(CPOOL), PH // X=Z1; Y=Z1; MUL; T- // T1 = Z1² VL 80(P1ptr), X1 // Z1H VPDI $0x4, X1, X1, X1 VL 64(P1ptr), X0 // Z1L VPDI $0x4, X0, X0, X0 VLR X0, Y0 VLR X1, Y1 CALL p256SqrInternal<>(SB) // SUB(X(SB) // ADD(T2(SB) VPDI $0x4, T1, T1, TT1 VST TT1, 80(P3ptr) VPDI $0x4, T0, T0, TT0 VST TT0, 64(P3ptr) // X- ; Y=X ; MUL; T- // Y3 = Y3² VLR X0, Y0 VLR X1, Y1 CALL p256SqrInternal<>(SB) // X=T ; Y=X1; MUL; T3=T // T3 = Y3*X1 VLR T0, X0 VLR T1, X1 VL 16(P1ptr), Y1 VPDI $0x4, Y1, Y1, Y1 VL 0(P1ptr), Y0 VPDI $0x4, Y0, Y0, Y0 CALL p256MulInternal<>(SB) VLR T0, T3L VLR T1, T3H // X- ; Y=X ; MUL; T- // Y3 = Y3² VLR X0, Y0 VLR X1, Y1 CALL p256SqrInternal<>(SB) // HAL(Y3(SB) // ADD(T1(SB) // SUB(Y3+0x00(SB), CPOOL VL 16(CPOOL), PL VL 0(CPOOL), PH // X=Z1; Y=Z1; MUL; T- // T1 = Z1*Z1 VL 80(P1ptr), X1 // Z1H VPDI $0x4, X1, X1, X1 VL 64(P1ptr), X0 // Z1L VPDI $0x4, X0, X0, X0 VLR X0, Y0 VLR X1, Y1 CALL p256SqrInternal<>(SB) // X- ; Y=T ; MUL; R=T // R = Z1*T1 VLR T0, Y0 VLR T1, Y1 CALL p256MulInternal<>(SB) VLR T0, RL VLR T1, RH // X=X2; Y- ; MUL; H=T // H = X2*T1 VL 16(P2ptr), X1 // X2H VPDI $0x4, X1, X1, X1 VL 0(P2ptr), X0 // X2L VPDI $0x4, X0, X0, X0 CALL p256MulInternal<>(SB) VLR T0, HL VLR T1, HH // X=Z2; Y=Z2; MUL; T- // T2 = Z2*Z2 VL 80(P2ptr), X1 // Z2H VPDI $0x4, X1, X1, X1 VL 64(P2ptr), X0 // Z2L VPDI $0x4, X0, X0, X0 VLR X0, Y0 VLR X1, Y1 CALL p256SqrInternal<>(SB) // X- ; Y=T ; MUL; S1=T // S1 = Z2*T2 VLR T0, Y0 VLR T1, Y1 CALL p256MulInternal<>(SB) VLR T0, S1L VLR T1, S1H // X=X1; Y- ; MUL; U1=T // U1 = X1*T2 VL 16(P1ptr), X1 // X1H VPDI $0x4, X1, X1, X1 VL 0(P1ptr), X0 // X1L VPDI $0x4, X0, X0, X0 CALL p256MulInternal<>(SB) VLR T0, U1L VLR T1, U1H // SUB(H(SB) // X=T ; Y=H ; MUL; Z3:=T// Z3 = Z3*H VLR T0, X0 VLR T1, X1 VLR HL, Y0 VLR HH, Y1 CALL p256MulInternal<>(SB) VPDI $0x4, T1, T1, TT1 VST TT1, 80(P3ptr) VPDI $0x4, T0, T0, TT0 VST TT0, 64(P3ptr) // X=Y1; Y=S1; MUL; S1=T // S1 = Y1*S1 VL 48(P1ptr), X1 VPDI $0x4, X1, X1, X1 VL 32(P1ptr), X0 VPDI $0x4, X0, X0, X0 VLR S1L, Y0 VLR S1H, Y1 CALL p256MulInternal<>(SB) VLR T0, S1L VLR T1, S1H // X=Y2; Y=R ; MUL; T- // R = Y2*R VL 48(P2ptr), X1 VPDI $0x4, X1, X1, X1 VL 32(P2ptr), X0 VPDI $0x4, X0, X0, X0 VLR RL, Y0 VLR RH, Y1 CALL p256MulInternal<>(SB) // SUB(R(SB) // X- ; Y=T ; MUL; T2=T // T2 = H*T1 VLR T0, Y0 VLR T1, Y1 CALL p256MulInternal<>(SB) VLR T0, T2L VLR T1, T2H // X=U1; Y- ; MUL; U1=T // U1 = U1*T1 VLR U1L, X0 VLR U1H, X1 CALL p256MulInternal<>(SB) VLR T0, U1L VLR T1, U1H // X=R ; Y=R ; MUL; T- // X3 = R*R VLR RL, X0 VLR RH, X1 VLR RL, Y0 VLR RH, Y1 CALL p256SqrInternal<>(SB) // SUB(T(SB) VLR T0, U1L VLR T1, U1H // X=S1; Y=T2; MUL; T- // T2 = S1*T2 VLR S1L, X0 VLR S1H, X1 VLR T2L, Y0 VLR T2H, Y1 CALL p256MulInternal<>(SB) // SUB(T= 1). // //go:noescape func p256OrdSqr(res, in *p256OrdElement, n int) func p256OrdInverse(k []byte) ([]byte, error) { if len(k) != 32 { return nil, errors.New("invalid scalar length") } x := new(p256OrdElement) p256OrdBigToLittle(x, (*[32]byte)(k)) p256OrdReduce(x) // Inversion is implemented as exponentiation by n - 2, per Fermat's little theorem. // // The sequence of 38 multiplications and 254 squarings is derived from // https://briansmith.org/ecc-inversion-addition-chains-01#p256_scalar_inversion _1 := new(p256OrdElement) _11 := new(p256OrdElement) _101 := new(p256OrdElement) _111 := new(p256OrdElement) _1111 := new(p256OrdElement) _10101 := new(p256OrdElement) _101111 := new(p256OrdElement) t := new(p256OrdElement) // This code operates in the Montgomery domain where R = 2²⁵⁶ mod n and n is // the order of the scalar field. Elements in the Montgomery domain take the // form a×R and p256OrdMul calculates (a × b × R⁻¹) mod n. RR is R in the // domain, or R×R mod n, thus p256OrdMul(x, RR) gives x×R, i.e. converts x // into the Montgomery domain. RR := &p256OrdElement{0x83244c95be79eea2, 0x4699799c49bd6fa6, 0x2845b2392b6bec59, 0x66e12d94f3d95620} p256OrdMul(_1, x, RR) // _1 p256OrdSqr(x, _1, 1) // _10 p256OrdMul(_11, x, _1) // _11 p256OrdMul(_101, x, _11) // _101 p256OrdMul(_111, x, _101) // _111 p256OrdSqr(x, _101, 1) // _1010 p256OrdMul(_1111, _101, x) // _1111 p256OrdSqr(t, x, 1) // _10100 p256OrdMul(_10101, t, _1) // _10101 p256OrdSqr(x, _10101, 1) // _101010 p256OrdMul(_101111, _101, x) // _101111 p256OrdMul(x, _10101, x) // _111111 = x6 p256OrdSqr(t, x, 2) // _11111100 p256OrdMul(t, t, _11) // _11111111 = x8 p256OrdSqr(x, t, 8) // _ff00 p256OrdMul(x, x, t) // _ffff = x16 p256OrdSqr(t, x, 16) // _ffff0000 p256OrdMul(t, t, x) // _ffffffff = x32 p256OrdSqr(x, t, 64) p256OrdMul(x, x, t) p256OrdSqr(x, x, 32) p256OrdMul(x, x, t) sqrs := []int{ 6, 5, 4, 5, 5, 4, 3, 3, 5, 9, 6, 2, 5, 6, 5, 4, 5, 5, 3, 10, 2, 5, 5, 3, 7, 6} muls := []*p256OrdElement{ _101111, _111, _11, _1111, _10101, _101, _101, _101, _111, _101111, _1111, _1, _1, _1111, _111, _111, _111, _101, _11, _101111, _11, _11, _11, _1, _10101, _1111} for i, s := range sqrs { p256OrdSqr(x, x, s) p256OrdMul(x, x, muls[i]) } // Montgomery multiplication by R⁻¹, or 1 outside the domain as R⁻¹×R = 1, // converts a Montgomery value out of the domain. one := &p256OrdElement{1} p256OrdMul(x, x, one) var xOut [32]byte p256OrdLittleToBig(&xOut, x) return xOut[:], nil } golang-filippo-nistec-0.0.4/p256_ordinv_export_test.go000066400000000000000000000007051512422514700227560ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package nistec // This file exports the P256OrdInverse function so it's accessible during tests // from the unmodified p256_ordinv_test.go from the stdlib, but not as part // of the public API of filippo.io/nistec. func P256OrdInverse(k []byte) ([]byte, error) { return p256OrdInverse(k) } golang-filippo-nistec-0.0.4/p256_ordinv_noasm.go000066400000000000000000000005051512422514700215110ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build (!amd64 && !arm64) || purego package nistec import "errors" func p256OrdInverse(k []byte) ([]byte, error) { return nil, errors.New("unimplemented") } golang-filippo-nistec-0.0.4/p256_ordinv_test.go000066400000000000000000000044031512422514700213540ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build (amd64 || arm64) && !purego package nistec_test import ( "bytes" "crypto/elliptic" "math/big" "testing" "filippo.io/nistec" ) func TestP256OrdInverse(t *testing.T) { N := elliptic.P256().Params().N // inv(0) is expected to be 0. zero := make([]byte, 32) out, err := nistec.P256OrdInverse(zero) if err != nil { t.Fatal(err) } if !bytes.Equal(out, zero) { t.Error("unexpected output for inv(0)") } // inv(N) is also 0 mod N. input := make([]byte, 32) N.FillBytes(input) out, err = nistec.P256OrdInverse(input) if err != nil { t.Fatal(err) } if !bytes.Equal(out, zero) { t.Error("unexpected output for inv(N)") } if !bytes.Equal(input, N.Bytes()) { t.Error("input was modified") } // Check inv(1) and inv(N+1) against math/big exp := new(big.Int).ModInverse(big.NewInt(1), N).FillBytes(make([]byte, 32)) big.NewInt(1).FillBytes(input) out, err = nistec.P256OrdInverse(input) if err != nil { t.Fatal(err) } if !bytes.Equal(out, exp) { t.Error("unexpected output for inv(1)") } new(big.Int).Add(N, big.NewInt(1)).FillBytes(input) out, err = nistec.P256OrdInverse(input) if err != nil { t.Fatal(err) } if !bytes.Equal(out, exp) { t.Error("unexpected output for inv(N+1)") } // Check inv(20) and inv(N+20) against math/big exp = new(big.Int).ModInverse(big.NewInt(20), N).FillBytes(make([]byte, 32)) big.NewInt(20).FillBytes(input) out, err = nistec.P256OrdInverse(input) if err != nil { t.Fatal(err) } if !bytes.Equal(out, exp) { t.Error("unexpected output for inv(20)") } new(big.Int).Add(N, big.NewInt(20)).FillBytes(input) out, err = nistec.P256OrdInverse(input) if err != nil { t.Fatal(err) } if !bytes.Equal(out, exp) { t.Error("unexpected output for inv(N+20)") } // Check inv(2^256-1) against math/big bigInput := new(big.Int).Lsh(big.NewInt(1), 256) bigInput.Sub(bigInput, big.NewInt(1)) exp = new(big.Int).ModInverse(bigInput, N).FillBytes(make([]byte, 32)) bigInput.FillBytes(input) out, err = nistec.P256OrdInverse(input) if err != nil { t.Fatal(err) } if !bytes.Equal(out, exp) { t.Error("unexpected output for inv(2^256-1)") } } golang-filippo-nistec-0.0.4/p256_table.go000066400000000000000000017761321512422514700201230ustar00rootroot00000000000000// Copyright 2024 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package nistec // p256PrecomputedEmbed is the precomputed table of P-256 basepoint multiples. // See [p256Precomputed]. It's not embedded with go:embed because it's not // supported within the FIPS module boundary. var p256PrecomputedEmbed = [...]byte{0x3c, 0x14, 0xa9, 0x18, 0xd4, 0x30, 0xe7, 0x79, 0x1, 0xb6, 0xed, 0x5f, 0xfc, 0x95, 0xba, 0x75, 0x10, 0x25, 0x62, 0x77, 0x2b, 0x73, 0xfb, 0x79, 0xc6, 0x55, 0x37, 0xa5, 0x76, 0x5f, 0x90, 0x18, 0xa, 0x56, 0x95, 0xce, 0x57, 0x53, 0xf2, 0xdd, 0x5c, 0xe4, 0x19, 0xba, 0xe4, 0xb8, 0x4a, 0x8b, 0x25, 0xf3, 0x21, 0xdd, 0x88, 0x86, 0xe8, 0xd2, 0x85, 0x5d, 0x88, 0x25, 0x18, 0xff, 0x71, 0x85, 0x4d, 0xd6, 0xdd, 0x10, 0xd4, 0x46, 0x0, 0x85, 0x7d, 0x82, 0x33, 0xa4, 0xc1, 0xe3, 0x6a, 0xaa, 0xd9, 0x90, 0x14, 0x8d, 0x3, 0x5, 0x22, 0x73, 0x3b, 0x3a, 0xcf, 0x3d, 0xe4, 0x32, 0xbb, 0xf6, 0xa5, 0xe1, 0xbe, 0x61, 0xd3, 0x48, 0x36, 0x2f, 0xf8, 0x6f, 0x23, 0xeb, 0xcb, 0xd7, 0x2c, 0x15, 0xbe, 0x2d, 0x4, 0x92, 0xe, 0xfb, 0xa8, 0x19, 0x3b, 0x8a, 0x5b, 0xa, 0x51, 0x77, 0xc5, 0x78, 0x27, 0xc1, 0xeb, 0x4e, 0x90, 0x3f, 0xac, 0xff, 0xfb, 0x81, 0x7d, 0x8, 0x4a, 0xf8, 0x27, 0xb0, 0x98, 0xbc, 0xcb, 0x87, 0xdd, 0x77, 0xad, 0x66, 0x7e, 0x74, 0xff, 0xb6, 0x3f, 0x6a, 0x93, 0x26, 0xeb, 0xa7, 0x83, 0xc9, 0x1f, 0x5c, 0x4c, 0xb0, 0x1a, 0xfe, 0x61, 0x8, 0xad, 0x47, 0x3e, 0x58, 0x8e, 0xe9, 0x2e, 0x1a, 0x31, 0x8, 0x82, 0x78, 0x7, 0xcc, 0x87, 0xe5, 0x29, 0x6a, 0xf0, 0xd5, 0xcc, 0x8d, 0x91, 0x46, 0xd, 0xb5, 0xb0, 0x74, 0x73, 0xc1, 0x23, 0xc6, 0xed, 0xa6, 0x50, 0x46, 0xf2, 0xa, 0x10, 0xe8, 0xac, 0xac, 0xda, 0xc, 0x6b, 0x17, 0xb0, 0x41, 0xf5, 0x62, 0x73, 0x57, 0xa6, 0xab, 0xcb, 0xe4, 0x4c, 0xf2, 0x96, 0x2d, 0x47, 0xf4, 0xd6, 0xfa, 0x71, 0x84, 0x62, 0x17, 0x2e, 0xd2, 0xdd, 0xe5, 0xde, 0x36, 0x6c, 0x6b, 0x63, 0xb8, 0x5a, 0x4c, 0x39, 0x4c, 0xb1, 0x84, 0xf5, 0x61, 0x5c, 0xc4, 0xae, 0x8a, 0x1b, 0xbe, 0x7d, 0x53, 0xb9, 0x94, 0x9a, 0x64, 0xec, 0x90, 0xc, 0xc2, 0x76, 0xd0, 0xaa, 0xb5, 0x1c, 0x94, 0xc8, 0x23, 0x5, 0x89, 0x5, 0x96, 0x7, 0xc9, 0x10, 0x4f, 0xba, 0xe7, 0x4a, 0x9b, 0x30, 0xeb, 0x2b, 0x88, 0xeb, 0xe5, 0xef, 0x68, 0xc5, 0x73, 0x68, 0x1f, 0x7a, 0x7e, 0x87, 0xa9, 0x40, 0x35, 0x16, 0xe9, 0xd1, 0x2d, 0xbb, 0x76, 0xa0, 0x73, 0x4a, 0x66, 0x77, 0x3e, 0x37, 0x47, 0x39, 0x40, 0x3e, 0xee, 0x6c, 0x34, 0x4f, 0x74, 0xae, 0x55, 0xad, 0xa3, 0x17, 0x5b, 0x1a, 0x96, 0xa, 0xd5, 0x73, 0x36, 0x21, 0x54, 0x59, 0x4b, 0x7, 0x13, 0x4b, 0xe4, 0x77, 0xd3, 0x20, 0x62, 0xd3, 0x93, 0xb5, 0x14, 0xff, 0xad, 0x53, 0x2b, 0x9c, 0x29, 0x11, 0x9f, 0x63, 0xef, 0x4c, 0xd4, 0x24, 0xf4, 0x5f, 0xf7, 0x7, 0x4a, 0x6d, 0x91, 0xc9, 0xa4, 0x4f, 0x3b, 0x17, 0xa0, 0x4e, 0x35, 0x46, 0x7, 0xf7, 0x0, 0x3c, 0xd2, 0x13, 0x2, 0xd2, 0x2b, 0x8, 0xbb, 0x23, 0xc, 0xb5, 0xaa, 0x3e, 0xf4, 0x3, 0x3e, 0x12, 0xc3, 0x19, 0x51, 0xba, 0x13, 0x4d, 0x9d, 0x5b, 0x3f, 0x30, 0xd0, 0x47, 0x28, 0xdd, 0x7b, 0xa6, 0x5d, 0xf2, 0xf2, 0x42, 0x67, 0x95, 0x41, 0xc9, 0x77, 0xdc, 0x3b, 0x93, 0xef, 0x67, 0x8, 0x24, 0x6e, 0x15, 0xd9, 0xed, 0xea, 0x8f, 0xa7, 0x99, 0x94, 0xd1, 0x4c, 0xf1, 0x27, 0x55, 0x34, 0x9b, 0x6f, 0xc5, 0xb5, 0x2a, 0x46, 0x6b, 0xfc, 0x2c, 0xf0, 0x2a, 0xf0, 0x90, 0x8f, 0xd, 0x23, 0x65, 0xb2, 0x1e, 0x89, 0x63, 0xb7, 0x77, 0x49, 0x2d, 0x53, 0xa9, 0xa3, 0x9d, 0xf5, 0x15, 0xba, 0x9e, 0xcf, 0x7d, 0x32, 0xe3, 0x21, 0xf0, 0xbb, 0x60, 0xbe, 0x84, 0x7b, 0x3c, 0x12, 0x76, 0xdf, 0x6, 0x77, 0xf2, 0x12, 0xec, 0x56, 0xe8, 0x20, 0x4e, 0x26, 0x8f, 0x6e, 0xc9, 0x75, 0x41, 0xa8, 0xa7, 0x59, 0xed, 0xbf, 0xe6, 0xab, 0x0, 0xeb, 0xc8, 0x44, 0x4, 0x9c, 0xc0, 0x2c, 0x6b, 0xe1, 0xc4, 0xf0, 0x80, 0x30, 0x5b, 0xe0, 0x14, 0x33, 0x5f, 0xa4, 0x7a, 0x77, 0xb7, 0x1e, 0xe3, 0x45, 0x5d, 0xce, 0xed, 0x7b, 0xaf, 0x56, 0x1a, 0x2f, 0xb1, 0x88, 0x9a, 0x1, 0x6e, 0x2b, 0x9b, 0x5f, 0x83, 0xfd, 0xcd, 0x59, 0x66, 0x8, 0xc8, 0x1e, 0xc2, 0x9d, 0xd1, 0xdb, 0x18, 0x2c, 0x39, 0x81, 0xcf, 0xf, 0x8a, 0x86, 0xf9, 0x98, 0x49, 0xb, 0x25, 0x48, 0xd6, 0x2c, 0x7d, 0x73, 0x8f, 0x42, 0xb3, 0x24, 0x47, 0xc9, 0x61, 0xcc, 0x76, 0x9e, 0xdd, 0x80, 0x78, 0x40, 0x2b, 0xc, 0x8, 0xbe, 0x3f, 0x38, 0x91, 0x89, 0x3a, 0xc4, 0xd2, 0xe5, 0x9b, 0x77, 0x65, 0x2d, 0x7d, 0x5f, 0xb5, 0x4a, 0x3b, 0xeb, 0x54, 0x9a, 0x71, 0x78, 0x4, 0xe4, 0x45, 0x62, 0xa, 0x26, 0x7d, 0xea, 0xe0, 0xdf, 0x7f, 0x6e, 0x95, 0x7, 0xe4, 0x9d, 0xb5, 0x1a, 0xac, 0x8d, 0x15, 0xa4, 0xf3, 0x1f, 0x73, 0x90, 0x9c, 0x64, 0xf1, 0x90, 0x70, 0x3e, 0x88, 0x4e, 0x94, 0x2b, 0x61, 0x85, 0x76, 0x1a, 0xc8, 0x61, 0x7f, 0xe5, 0x9e, 0x93, 0xf, 0x25, 0x3d, 0x64, 0xad, 0x1e, 0x89, 0xaa, 0xd, 0xc, 0x8e, 0xb8, 0x25, 0xe1, 0x23, 0x0, 0x93, 0x68, 0x68, 0x77, 0x69, 0xd2, 0xa7, 0x1a, 0xb7, 0x4, 0x33, 0x5a, 0x34, 0xca, 0xf5, 0xde, 0xde, 0xab, 0x5e, 0x38, 0x37, 0xee, 0x9d, 0xd2, 0x9, 0x24, 0x56, 0xe1, 0x83, 0xcb, 0x77, 0xdf, 0xe1, 0x4e, 0x43, 0x5b, 0xbb, 0x1c, 0xd9, 0x12, 0xac, 0xc, 0x37, 0x56, 0x89, 0xca, 0xf6, 0xd2, 0xe, 0x17, 0x66, 0x6d, 0xde, 0x8a, 0xfa, 0x8c, 0x22, 0x28, 0xca, 0x8a, 0x23, 0x53, 0x95, 0x7c, 0xf5, 0x7f, 0x9, 0xd7, 0x2e, 0x4b, 0x63, 0x25, 0xc4, 0xcc, 0xd, 0xd3, 0x6f, 0x85, 0x69, 0x67, 0x35, 0xe, 0x11, 0x98, 0x9e, 0x55, 0x3f, 0xd4, 0xbc, 0xbc, 0x59, 0xb7, 0x95, 0x53, 0xac, 0x77, 0x84, 0x73, 0x7f, 0xe1, 0xe, 0xc0, 0x90, 0x2b, 0x75, 0x35, 0xe3, 0xd2, 0x2e, 0x74, 0x90, 0x83, 0x74, 0x68, 0xc1, 0x5b, 0x1f, 0xbd, 0x22, 0x64, 0xd0, 0x7c, 0x97, 0xb7, 0xe7, 0xc9, 0x69, 0x87, 0xc0, 0xfb, 0x4a, 0x66, 0xcf, 0xb0, 0x5b, 0xa3, 0x42, 0xa2, 0xe3, 0x7, 0x97, 0x7f, 0xf7, 0x48, 0x6e, 0x12, 0x60, 0x26, 0x83, 0xc6, 0x54, 0xbf, 0x17, 0x17, 0x2e, 0xc7, 0x12, 0xfd, 0x32, 0x73, 0xae, 0xfa, 0x6b, 0x58, 0x5d, 0x99, 0xb7, 0x2d, 0xb5, 0x27, 0xc2, 0x37, 0x22, 0x83, 0x9e, 0x56, 0x29, 0xbe, 0xdb, 0xe7, 0x65, 0x2a, 0x3e, 0x19, 0xe4, 0xe8, 0xbb, 0x1b, 0xaa, 0x2e, 0xdc, 0x6, 0x27, 0x15, 0x5b, 0x5, 0x60, 0xbc, 0xb7, 0xd8, 0xbc, 0x72, 0x4b, 0x7e, 0xe2, 0x56, 0xee, 0x23, 0xcc, 0x3, 0x70, 0x93, 0x81, 0xe4, 0x24, 0x74, 0x33, 0xee, 0x9, 0xda, 0xd3, 0xa, 0x43, 0xe, 0xaa, 0xe2, 0x5d, 0xc4, 0x83, 0x63, 0x4f, 0x52, 0xb8, 0x40, 0x25, 0x1b, 0xa4, 0x42, 0x54, 0x35, 0x66, 0xd7, 0x97, 0x47, 0x8a, 0x77, 0xde, 0xa6, 0xef, 0x64, 0xf4, 0xad, 0x79, 0x70, 0xa, 0x17, 0x42, 0x20, 0x80, 0xfb, 0xc6, 0xb, 0x65, 0xb, 0x8b, 0x80, 0x6b, 0x2e, 0xfe, 0x3f, 0x75, 0xe0, 0x82, 0x58, 0x49, 0xf5, 0x83, 0x2c, 0x7c, 0x2f, 0xef, 0xd5, 0x23, 0xb7, 0x3, 0x91, 0x80, 0x3c, 0xd6, 0x54, 0x9b, 0x3f, 0xa2, 0x52, 0xd6, 0x1b, 0xf1, 0xf2, 0x87, 0x65, 0xb, 0x4b, 0x19, 0xc3, 0x70, 0x36, 0x9e, 0xe, 0x58, 0xb1, 0x3b, 0x62, 0xc4, 0x55, 0x20, 0xe2, 0xef, 0x1, 0xb2, 0xf7, 0xed, 0x64, 0x9d, 0x5c, 0x3c, 0xd5, 0xcb, 0x1d, 0x9, 0x97, 0x7b, 0x17, 0xa, 0xac, 0xb6, 0x24, 0x76, 0xf1, 0xff, 0x2d, 0xfe, 0x2c, 0x75, 0x39, 0xf1, 0xb0, 0x4e, 0x57, 0x7a, 0x6c, 0xa, 0x5c, 0xa3, 0xc1, 0x87, 0x99, 0xe7, 0x93, 0x46, 0x31, 0x7d, 0x22, 0xe, 0xb8, 0x9c, 0xe8, 0x30, 0xbf, 0x75, 0x5, 0xbb, 0x83, 0x18, 0xd, 0x7f, 0x24, 0x4e, 0x2f, 0xd0, 0xc3, 0x74, 0x32, 0x26, 0x12, 0xd5, 0xeb, 0x7a, 0xa9, 0xad, 0x56, 0xc8, 0x51, 0x3e, 0x5f, 0x3e, 0x40, 0x8b, 0x8f, 0x4d, 0x96, 0xfc, 0x4a, 0x79, 0x29, 0x2e, 0x41, 0xab, 0x47, 0xf2, 0xa6, 0xda, 0xeb, 0x80, 0x6f, 0x1b, 0xbd, 0x5a, 0x67, 0x1d, 0x5a, 0x48, 0x5e, 0x72, 0xbd, 0xa2, 0x66, 0x3c, 0xb, 0x4f, 0x8f, 0xaf, 0x5c, 0x2a, 0x4b, 0xba, 0x7b, 0x84, 0x1b, 0x7f, 0x92, 0x26, 0x26, 0x4d, 0x39, 0x2, 0x5, 0xd9, 0xc7, 0x6f, 0x6c, 0xe8, 0x9a, 0x65, 0xa5, 0xba, 0x12, 0xa9, 0xfe, 0x6e, 0xa1, 0xe1, 0x25, 0xba, 0x3a, 0x36, 0x68, 0xac, 0x41, 0x2c, 0x75, 0x77, 0x22, 0x84, 0xb8, 0xfc, 0xc3, 0x97, 0x28, 0x28, 0x5c, 0x54, 0xfe, 0x6b, 0x69, 0x4c, 0xdc, 0xe7, 0xe9, 0x36, 0x2d, 0xc5, 0x77, 0xa9, 0xfb, 0x4a, 0x24, 0x6, 0x58, 0xc1, 0x8, 0x95, 0xe3, 0x9b, 0x5e, 0x66, 0x85, 0x7b, 0x59, 0x12, 0x6d, 0x25, 0xee, 0x20, 0xf7, 0x31, 0x7a, 0x33, 0xd2, 0x29, 0x91, 0x97, 0x8a, 0xdc, 0x2b, 0x86, 0xf, 0x8f, 0x86, 0x16, 0x59, 0xba, 0x83, 0xd2, 0x5d, 0xd9, 0x99, 0x80, 0x4, 0x4e, 0xfb, 0x5b, 0xfe, 0xb6, 0xee, 0xd1, 0xe2, 0x5d, 0x0, 0x84, 0x78, 0x41, 0x1c, 0xef, 0x82, 0xae, 0xcb, 0xff, 0xff, 0x17, 0xec, 0xd4, 0xa2, 0x66, 0x5e, 0xa9, 0x8a, 0x3f, 0xc5, 0x61, 0x91, 0xd0, 0xe0, 0xfe, 0xc5, 0xe1, 0x4, 0xe1, 0x5e, 0x8, 0xb2, 0x35, 0xc1, 0xec, 0x4c, 0x2e, 0x56, 0x7d, 0xf4, 0x83, 0x47, 0x65, 0xb2, 0xe1, 0x74, 0x30, 0x3b, 0x3f, 0x5a, 0x6c, 0x50, 0x2a, 0x6d, 0xfc, 0x62, 0x67, 0xc1, 0xf4, 0xd9, 0xea, 0xec, 0xb9, 0xe5, 0x86, 0xe2, 0xb2, 0xd4, 0x9d, 0xf2, 0x61, 0x3c, 0xbb, 0x83, 0xc0, 0xad, 0xf, 0x1b, 0xa4, 0x29, 0xac, 0x7f, 0x3e, 0x2, 0x75, 0x7a, 0xa3, 0x7f, 0x47, 0xc9, 0xf1, 0xd5, 0x86, 0xc0, 0x76, 0x30, 0x6f, 0x2f, 0x35, 0x11, 0xc6, 0xf, 0x9a, 0x2a, 0x91, 0xe3, 0x23, 0xfa, 0x9f, 0xc9, 0x3d, 0xba, 0xf8, 0xd2, 0x85, 0x6, 0xb, 0x6a, 0xa4, 0x58, 0x33, 0xe9, 0xe8, 0x77, 0xc7, 0xfd, 0x4, 0x5f, 0x41, 0x35, 0xbb, 0x87, 0xa7, 0x94, 0xa4, 0xfe, 0x23, 0x4d, 0x6a, 0x2d, 0xc, 0x64, 0xb5, 0x35, 0x3a, 0x15, 0xda, 0x17, 0xe9, 0x9d, 0x74, 0xd0, 0x5c, 0x5d, 0x7, 0x8d, 0x3e, 0x79, 0x68, 0x50, 0xe4, 0x2d, 0x53, 0x76, 0xf8, 0xf4, 0x6e, 0x1f, 0x2e, 0x9e, 0xe8, 0xa7, 0xc7, 0x37, 0x69, 0x40, 0x58, 0xa3, 0xa2, 0x5f, 0x82, 0xd0, 0x42, 0xbf, 0x27, 0x17, 0x7c, 0xea, 0x2c, 0xaf, 0xa9, 0x85, 0x47, 0x9e, 0xfb, 0xa4, 0x60, 0x3, 0x4a, 0x9f, 0x29, 0x27, 0x9c, 0xa4, 0xfd, 0xe5, 0x71, 0x2f, 0xac, 0x71, 0x13, 0x8e, 0x6, 0x48, 0x6f, 0x66, 0x77, 0x90, 0x7b, 0x68, 0xd0, 0x83, 0x19, 0x28, 0xd0, 0x15, 0xb2, 0x83, 0x38, 0x6d, 0x35, 0x9a, 0xdd, 0x40, 0x50, 0x75, 0xd, 0x6d, 0x9f, 0x46, 0x2b, 0x1d, 0xf9, 0xcb, 0xd7, 0x61, 0x15, 0x31, 0xfc, 0x2e, 0x2f, 0x23, 0x7b, 0xf9, 0xc7, 0xcb, 0x4b, 0xb2, 0x50, 0xd7, 0x51, 0xa5, 0x56, 0xe3, 0xa1, 0x88, 0x49, 0x49, 0xea, 0x11, 0x1, 0x75, 0xcb, 0x93, 0x31, 0xf0, 0x69, 0x76, 0x8a, 0x7b, 0x73, 0xca, 0x5e, 0xc5, 0x5d, 0x59, 0x9f, 0x87, 0x37, 0xd8, 0xac, 0x19, 0xa3, 0xa4, 0xb0, 0x67, 0x6b, 0xed, 0x9e, 0xb4, 0xc1, 0x6f, 0xaf, 0xf3, 0xf1, 0x32, 0x33, 0x99, 0x95, 0xe3, 0x2e, 0x2a, 0x43, 0x65, 0xeb, 0x42, 0x67, 0x96, 0x28, 0x62, 0x96, 0xb4, 0xfe, 0xc9, 0x8d, 0x4b, 0x50, 0x39, 0xf4, 0x43, 0x12, 0x63, 0xcc, 0x96, 0xee, 0x31, 0xb7, 0xc9, 0x59, 0x88, 0x6, 0x12, 0x68, 0x99, 0xf7, 0x56, 0xc3, 0x8d, 0x94, 0x7b, 0x8, 0x80, 0x1f, 0xed, 0x32, 0xad, 0xe4, 0x61, 0x38, 0x75, 0xb1, 0xd8, 0x7a, 0x26, 0xc9, 0xe6, 0xfb, 0xf6, 0x7f, 0x85, 0xeb, 0xc5, 0xc7, 0x1a, 0x10, 0xfb, 0xf2, 0x55, 0xa8, 0xaa, 0x4b, 0x99, 0x18, 0x80, 0x24, 0x1d, 0xe1, 0x14, 0xcf, 0x84, 0x8, 0xc5, 0x8a, 0x62, 0x8b, 0x89, 0x39, 0x5a, 0xf5, 0x44, 0xa9, 0x5f, 0x7b, 0xe9, 0xfd, 0x14, 0xc7, 0x5a, 0x2e, 0xd1, 0x30, 0x80, 0x17, 0xed, 0xb4, 0xfe, 0xe2, 0x97, 0xf4, 0x2a, 0x2c, 0x4, 0x13, 0x73, 0xbf, 0xae, 0xd7, 0x42, 0x6a, 0xd3, 0xd7, 0xfd, 0x4f, 0x8, 0xeb, 0xc9, 0xd2, 0x49, 0x6a, 0xc7, 0xf7, 0x2e, 0x4b, 0xa5, 0x8a, 0x9f, 0x70, 0x5e, 0x89, 0x9, 0xba, 0xb7, 0x0, 0x92, 0x58, 0xfb, 0xb7, 0xdd, 0x6f, 0xc6, 0xd0, 0x3b, 0xbb, 0x4c, 0xeb, 0x78, 0x8, 0xd1, 0x97, 0x2d, 0x31, 0xde, 0x4b, 0xd8, 0x68, 0x10, 0x43, 0x2d, 0x1f, 0xcd, 0x2c, 0x17, 0xb7, 0x3e, 0x52, 0x4b, 0x92, 0xa8, 0xa6, 0x30, 0x28, 0xcb, 0x23, 0x73, 0xeb, 0x53, 0xe1, 0xcf, 0xc0, 0x2e, 0x8, 0x97, 0x97, 0xdb, 0xaa, 0xf2, 0x6a, 0x6b, 0x7f, 0xe9, 0xa1, 0x3d, 0xa8, 0xd1, 0x3e, 0x39, 0x3d, 0x1d, 0x68, 0x2a, 0x4b, 0x80, 0xc7, 0xf9, 0xa7, 0xa6, 0x1e, 0xb7, 0xc, 0x2d, 0x48, 0x8b, 0x68, 0x4a, 0x78, 0x52, 0x58, 0x40, 0x5f, 0xcc, 0xb4, 0xa9, 0x32, 0xe1, 0x66, 0xcb, 0x6a, 0xb4, 0x5d, 0x5e, 0x80, 0x58, 0x92, 0xd, 0x3a, 0x96, 0xbe, 0xf1, 0xe2, 0xb9, 0x17, 0x3, 0x27, 0x70, 0x4a, 0x94, 0x48, 0x3d, 0x60, 0x48, 0x59, 0xf9, 0x66, 0xe2, 0x99, 0x88, 0x20, 0x5c, 0x73, 0x66, 0xdb, 0x98, 0xa3, 0x18, 0xfb, 0xa2, 0x47, 0x24, 0x47, 0x90, 0x9f, 0x61, 0x7c, 0x77, 0x39, 0x69, 0x96, 0x8a, 0x1b, 0xe2, 0x3b, 0x2a, 0x2a, 0x14, 0x98, 0x37, 0x43, 0xb3, 0x98, 0x32, 0xb1, 0x1c, 0x24, 0xb4, 0xa1, 0x65, 0x4f, 0xb4, 0x49, 0x4e, 0xa1, 0xa3, 0xcd, 0x7a, 0xc7, 0x3a, 0xcd, 0xd6, 0xf4, 0xc5, 0x3c, 0xfc, 0xb6, 0x52, 0xb5, 0x8c, 0x28, 0xd0, 0xbc, 0xa, 0x4, 0x1c, 0x2f, 0x8c, 0xcc, 0xd5, 0x4a, 0x9b, 0xbf, 0x6, 0x1e, 0x51, 0x75, 0xb6, 0x41, 0xa4, 0x3a, 0x9b, 0x37, 0xda, 0x67, 0xd6, 0x72, 0x1f, 0x60, 0x51, 0xce, 0x45, 0xd, 0x46, 0x89, 0xff, 0x55, 0x67, 0x69, 0x3c, 0xf7, 0xe2, 0xe6, 0x17, 0x30, 0x47, 0xe7, 0xf7, 0x3c, 0xdd, 0xd, 0x60, 0xf7, 0x3c, 0x9d, 0x68, 0xf5, 0x8e, 0xb4, 0x87, 0xfc, 0xb1, 0xf8, 0xc4, 0x8d, 0x94, 0x99, 0x32, 0xa5, 0x4e, 0x81, 0xfe, 0xe9, 0xd9, 0x28, 0x60, 0xeb, 0x98, 0xa2, 0x1c, 0x92, 0x2d, 0xfc, 0x3, 0x98, 0xc, 0xfd, 0xed, 0xec, 0xfa, 0x45, 0x47, 0x7b, 0x4d, 0x91, 0xe8, 0x8a, 0xf3, 0xd8, 0xa3, 0xe3, 0xc5, 0xcf, 0xfc, 0xc5, 0xd8, 0xbf, 0xdf, 0x79, 0x40, 0x4c, 0x90, 0xfd, 0xbe, 0x97, 0x1, 0xad, 0xfe, 0x58, 0x6a, 0x6d, 0xbc, 0xa4, 0x32, 0x55, 0x69, 0x77, 0x70, 0x22, 0x39, 0xf5, 0x42, 0xef, 0xdb, 0x6d, 0x3e, 0xe2, 0x9, 0x8, 0x99, 0xa, 0x48, 0x64, 0x9b, 0x44, 0x7e, 0x40, 0x2e, 0x9a, 0xad, 0x1a, 0x9c, 0x96, 0x7b, 0xa4, 0xc2, 0x91, 0x95, 0x92, 0xd7, 0x31, 0x62, 0x80, 0x8b, 0x96, 0x5, 0xf3, 0x96, 0x6d, 0xdb, 0xb9, 0x73, 0x9f, 0x8, 0x13, 0x9, 0xa, 0x38, 0x1, 0x1e, 0xc6, 0xc2, 0x83, 0xb, 0xa7, 0x7d, 0xc7, 0x38, 0x9b, 0x56, 0x94, 0x83, 0xfb, 0x95, 0x2f, 0xfe, 0xed, 0x80, 0x12, 0x65, 0x3c, 0x9a, 0x82, 0xaf, 0xae, 0x8f, 0xb9, 0x6b, 0x72, 0x8f, 0xf8, 0x4b, 0x42, 0x78, 0xa0, 0xa4, 0x10, 0x80, 0x70, 0x49, 0x84, 0xe, 0x44, 0x20, 0x67, 0x29, 0x2a, 0xd6, 0x2a, 0x7a, 0x81, 0xcb, 0xc5, 0x63, 0x54, 0xff, 0x62, 0xac, 0xb9, 0xb6, 0xf2, 0x7e, 0xb5, 0x9d, 0xad, 0xb3, 0xa4, 0xbb, 0x49, 0x37, 0x17, 0xa6, 0xd5, 0x46, 0x2c, 0x1f, 0x31, 0xad, 0x6d, 0x3b, 0xff, 0xc2, 0x87, 0x80, 0x7a, 0xb7, 0xff, 0x34, 0x78, 0x36, 0xf3, 0xea, 0x6f, 0xb4, 0x38, 0xb1, 0xd6, 0x75, 0x6d, 0x26, 0xaa, 0xf8, 0x88, 0x81, 0x0, 0xec, 0x20, 0xd3, 0x38, 0xfa, 0xc6, 0x16, 0x69, 0x4e, 0xfc, 0xaf, 0xf2, 0xc0, 0xda, 0x42, 0x18, 0x81, 0x57, 0x49, 0xb9, 0x6f, 0x57, 0xd1, 0xb4, 0x24, 0xb6, 0xbc, 0x34, 0x60, 0x90, 0xfb, 0x2e, 0x99, 0xc7, 0xfd, 0x2e, 0xde, 0x87, 0x3c, 0x79, 0xac, 0xce, 0x7e, 0x6f, 0xd6, 0xcd, 0xfd, 0xc6, 0x7d, 0x26, 0x26, 0xf0, 0x2, 0x1, 0xc5, 0xa1, 0x9a, 0x5c, 0x23, 0xd3, 0x90, 0xf0, 0x66, 0x46, 0x2b, 0x96, 0x94, 0xe4, 0xf6, 0xfc, 0x46, 0x69, 0x69, 0xfa, 0x8f, 0x6d, 0x48, 0x6d, 0xa5, 0xcb, 0xb9, 0xd8, 0xc6, 0xfb, 0x50, 0x15, 0x5a, 0xf3, 0x90, 0x3e, 0x42, 0x3d, 0x7e, 0x2c, 0x96, 0xdd, 0xc0, 0x95, 0xa1, 0x3d, 0x7c, 0x8b, 0x5d, 0xfd, 0x3c, 0xb0, 0xfd, 0x73, 0xe6, 0xa5, 0xfc, 0x9d, 0x88, 0xc2, 0xb7, 0x4, 0x7, 0xaa, 0x5, 0x23, 0xf5, 0x1f, 0x58, 0xce, 0xf6, 0x53, 0x5e, 0x4d, 0x91, 0xeb, 0x49, 0x9d, 0x39, 0x53, 0xd4, 0x92, 0x7b, 0x36, 0x7c, 0xc9, 0x24, 0xc0, 0x26, 0x9a, 0x24, 0xa2, 0x71, 0xc2, 0xd2, 0x39, 0x4a, 0xd1, 0x89, 0x2b, 0x4b, 0xeb, 0x60, 0x5, 0x80, 0x2e, 0x43, 0x20, 0xde, 0x98, 0x11, 0xd9, 0x80, 0x9b, 0x79, 0x75, 0xea, 0xab, 0x9e, 0xe5, 0x6a, 0x82, 0x8f, 0x2b, 0xc, 0x6e, 0xab, 0xec, 0x61, 0x0, 0xd1, 0xed, 0x4e, 0x0, 0xca, 0xd8, 0x4f, 0x9c, 0xe9, 0x39, 0xf4, 0xa9, 0x31, 0xcd, 0x93, 0xc2, 0x6e, 0x6d, 0x49, 0xa, 0x38, 0xf5, 0x51, 0x70, 0x8e, 0xa7, 0xbd, 0x3d, 0x73, 0xa, 0x14, 0x49, 0xb8, 0x8d, 0x38, 0x7e, 0x3, 0xf6, 0xdb, 0x46, 0x59, 0xb0, 0x32, 0x4b, 0xee, 0xd1, 0x68, 0xe3, 0xca, 0xa9, 0xfd, 0xc4, 0xb1, 0xf3, 0xb2, 0xb0, 0xfd, 0xb0, 0xa7, 0x1, 0x50, 0x6e, 0xc4, 0x3a, 0x2e, 0x74, 0x93, 0xf5, 0x6d, 0x56, 0xe6, 0xb3, 0x39, 0xf2, 0x75, 0xf6, 0x4a, 0xeb, 0x26, 0x78, 0xd6, 0x44, 0x7c, 0xe, 0xb2, 0x37, 0x96, 0x37, 0xac, 0xcf, 0xd3, 0x12, 0x12, 0x5d, 0x3a, 0xe0, 0x7d, 0x87, 0x67, 0x4f, 0x61, 0x26, 0xaa, 0x2b, 0x80, 0xfc, 0xa2, 0x38, 0x75, 0x15, 0x24, 0x25, 0x9d, 0xa1, 0x37, 0x3c, 0x13, 0x87, 0xb5, 0xb4, 0x6e, 0x50, 0x90, 0xb3, 0x7d, 0xd9, 0xd1, 0x49, 0x4c, 0x57, 0xd7, 0x40, 0x5d, 0xba, 0xc4, 0x1, 0xa8, 0x99, 0x6b, 0x12, 0xf1, 0x96, 0x92, 0x94, 0x39, 0x10, 0x81, 0xe3, 0x44, 0xb5, 0xb1, 0x1d, 0x36, 0x7b, 0x82, 0x63, 0x5b, 0xf5, 0xaf, 0x6e, 0x20, 0xed, 0x23, 0x53, 0x3e, 0x90, 0x42, 0x1f, 0xc2, 0xd2, 0x70, 0x23, 0x94, 0xa1, 0x85, 0xd9, 0xe0, 0x2e, 0xaf, 0xca, 0xf2, 0x6d, 0x84, 0x39, 0x72, 0x4b, 0xc6, 0x2c, 0x19, 0xf8, 0x12, 0x63, 0xae, 0x47, 0x8f, 0xb, 0x7c, 0x8, 0x1, 0x62, 0x96, 0x91, 0x1f, 0xc6, 0x7d, 0x47, 0x11, 0x96, 0x70, 0x96, 0xc9, 0xff, 0x40, 0x8c, 0x2c, 0xc2, 0xc7, 0x42, 0x68, 0xe0, 0x79, 0xbd, 0xbb, 0x97, 0x1a, 0xcc, 0xab, 0xf1, 0x63, 0x88, 0x3, 0x73, 0xf0, 0xd0, 0x74, 0xea, 0xe9, 0x66, 0xff, 0xef, 0xd9, 0x4d, 0x50, 0xc3, 0xa6, 0x15, 0x20, 0xe0, 0x57, 0x38, 0xee, 0x54, 0x53, 0xfa, 0x40, 0x70, 0x6d, 0xfe, 0xd7, 0xfe, 0x3b, 0xac, 0x82, 0xca, 0x99, 0xcc, 0x95, 0x2c, 0x69, 0xe9, 0x7d, 0xda, 0xc2, 0x5b, 0xfb, 0x30, 0xb8, 0xbe, 0xd3, 0xf8, 0xf, 0xdf, 0x43, 0xe6, 0xd0, 0x41, 0x96, 0x8a, 0x18, 0xba, 0x77, 0xee, 0x31, 0x2, 0xd5, 0xf6, 0xbc, 0xaa, 0xa3, 0x8a, 0x4e, 0xf, 0x11, 0x49, 0x9a, 0x32, 0x65, 0xfb, 0xf9, 0x20, 0xb2, 0xd6, 0x2d, 0xf6, 0x17, 0x83, 0xd1, 0x5a, 0xea, 0xc3, 0x52, 0x41, 0xed, 0x3c, 0x7e, 0x4a, 0x9c, 0x57, 0x7d, 0x14, 0x6a, 0x29, 0xd, 0x58, 0x6c, 0x2f, 0x94, 0xca, 0x5a, 0x8b, 0x68, 0x39, 0x94, 0x5d, 0x49, 0xc5, 0x89, 0x27, 0x6f, 0x1d, 0x50, 0x4c, 0x50, 0xc, 0xdb, 0x4d, 0xd5, 0xa7, 0xe3, 0xac, 0xbc, 0xf, 0x4d, 0x6a, 0xf1, 0xeb, 0x41, 0x6a, 0x5, 0x6f, 0xbc, 0x6f, 0xb7, 0xc5, 0xd6, 0x5b, 0x82, 0x55, 0xc2, 0x88, 0xe2, 0xd3, 0xe2, 0x42, 0xf, 0x96, 0x77, 0x3, 0x95, 0x44, 0x7b, 0xb5, 0xde, 0xe3, 0x47, 0x3c, 0x9a, 0x17, 0x37, 0x4c, 0xed, 0x3e, 0xa5, 0xd6, 0x35, 0xa3, 0xd2, 0xe, 0x3d, 0xcf, 0x40, 0x82, 0x9f, 0xa5, 0x3a, 0x54, 0xe5, 0x5, 0x4d, 0xd, 0x8c, 0xb4, 0xb4, 0x33, 0xdd, 0xfb, 0xbb, 0xd5, 0x45, 0x8e, 0xd2, 0x7f, 0x13, 0x73, 0xcc, 0x4, 0xfa, 0xfd, 0x3f, 0x3b, 0xc7, 0xef, 0xc6, 0x2a, 0x86, 0xf2, 0x1e, 0xf5, 0x31, 0xf5, 0xf9, 0x3f, 0x40, 0xa2, 0xf5, 0x73, 0xbc, 0xfc, 0xe0, 0xd5, 0x34, 0xb0, 0xfa, 0x59, 0x95, 0x21, 0xef, 0x9a, 0x2c, 0x2d, 0x2f, 0x32, 0x62, 0xce, 0x61, 0x33, 0x83, 0xf9, 0xd, 0xba, 0x72, 0x2b, 0x5e, 0xfd, 0xd3, 0xa, 0x8c, 0x2d, 0x9d, 0x32, 0xe7, 0x85, 0xfc, 0xd4, 0xb8, 0x5d, 0xf1, 0x75, 0x46, 0x23, 0xce, 0x9a, 0x3f, 0x2d, 0xf5, 0x2e, 0xac, 0xf7, 0x6a, 0x92, 0x65, 0xbf, 0x3d, 0x69, 0xf1, 0x55, 0x2d, 0x38, 0x8e, 0x9, 0xd7, 0x6c, 0xcc, 0xc9, 0xb1, 0x4f, 0x3f, 0x91, 0x8, 0x20, 0x68, 0x52, 0xf2, 0x95, 0x3d, 0xc9, 0xea, 0x61, 0xed, 0x20, 0xea, 0x6c, 0xb2, 0xa6, 0x6c, 0xb4, 0x38, 0xed, 0x51, 0xb0, 0x27, 0x43, 0xea, 0xbc, 0xdc, 0x62, 0x86, 0xaa, 0x2a, 0x5d, 0x72, 0x5c, 0x29, 0xaf, 0x6d, 0xda, 0xdc, 0x52, 0x8e, 0x2f, 0x75, 0xd2, 0xba, 0xcc, 0xda, 0x17, 0xb, 0x21, 0xe7, 0x10, 0x22, 0x32, 0x82, 0x1e, 0xd5, 0x12, 0x79, 0x7f, 0xa3, 0xeb, 0xca, 0x40, 0xd5, 0xc, 0x16, 0x0, 0x2a, 0x88, 0x27, 0x1a, 0xa4, 0x5e, 0x14, 0x66, 0x6f, 0xfa, 0x11, 0xc8, 0x51, 0x33, 0x1c, 0xc8, 0xf9, 0x3, 0x54, 0x6f, 0x64, 0xf, 0x8e, 0xe5, 0xee, 0xe3, 0xfa, 0x18, 0xfc, 0xef, 0x20, 0xf9, 0x8d, 0x6c, 0xea, 0x71, 0x9, 0x5e, 0x42, 0x23, 0x79, 0xa7, 0xae, 0xa0, 0xcb, 0xb2, 0xdc, 0xe3, 0xe0, 0xfc, 0x2d, 0x85, 0x4a, 0x5e, 0xaf, 0x1d, 0xbf, 0xdd, 0x3a, 0xcc, 0x44, 0xe1, 0x81, 0x70, 0x4f, 0xcf, 0x82, 0xbe, 0x87, 0xd6, 0xa1, 0xff, 0xd5, 0x72, 0x64, 0xdd, 0xe, 0x6c, 0xb, 0x89, 0x89, 0x63, 0x78, 0xd1, 0x3e, 0x1a, 0x6e, 0xa2, 0xad, 0xaa, 0x3c, 0x48, 0x63, 0x15, 0x27, 0x6f, 0x27, 0xfd, 0x77, 0x60, 0x2f, 0xd9, 0x4c, 0x92, 0xe6, 0x3c, 0x6e, 0x46, 0xa, 0x98, 0xfe, 0xa7, 0x5, 0x1f, 0x2d, 0x90, 0xb1, 0xb0, 0x94, 0xc7, 0xf1, 0x1c, 0x9c, 0xf0, 0xaa, 0x57, 0x63, 0x6, 0xee, 0xd2, 0x76, 0x27, 0xab, 0x8d, 0x87, 0x53, 0x1c, 0x4a, 0x32, 0x4e, 0xae, 0x4c, 0x72, 0xb5, 0x2c, 0x52, 0x83, 0xfe, 0xe0, 0xad, 0x7c, 0x30, 0x13, 0x96, 0x56, 0x39, 0x54, 0x78, 0xbb, 0x2, 0xef, 0x31, 0x4d, 0xb6, 0xb3, 0xf3, 0x2d, 0x59, 0x2c, 0xeb, 0x6a, 0x8b, 0xbc, 0x1a, 0x95, 0x5, 0xf0, 0x5e, 0x27, 0x91, 0x6b, 0x82, 0xbe, 0x60, 0x57, 0x2c, 0x4, 0xa8, 0x82, 0x88, 0x36, 0x21, 0xe5, 0x98, 0x82, 0x27, 0xcd, 0xaf, 0xcf, 0x31, 0xd9, 0x40, 0xa7, 0x97, 0xf5, 0xe0, 0xa, 0x9a, 0x6, 0x7c, 0x10, 0x59, 0xeb, 0xf3, 0xb3, 0xdb, 0xa, 0xb8, 0x8e, 0xaa, 0x5e, 0x1e, 0x95, 0x3e, 0x98, 0x78, 0x8e, 0xb4, 0x11, 0xb5, 0xa8, 0x63, 0xe6, 0xc5, 0xf2, 0x3, 0x8a, 0xd, 0xcc, 0x31, 0x16, 0xe2, 0x71, 0xe2, 0x11, 0x1e, 0xc1, 0x77, 0x75, 0xf6, 0x8f, 0xa0, 0x74, 0x41, 0xbf, 0x5d, 0x8, 0xb, 0x46, 0x76, 0xa5, 0x40, 0xce, 0xba, 0x80, 0x49, 0xba, 0xc1, 0x27, 0xcf, 0xcb, 0x4, 0xd2, 0x49, 0x69, 0x80, 0xe4, 0x32, 0x2f, 0xd1, 0x64, 0xe3, 0xe8, 0xdf, 0x1, 0x22, 0x22, 0xd4, 0xcd, 0xd4, 0x83, 0x5c, 0xd0, 0x6e, 0x3c, 0x5b, 0x3b, 0xc0, 0x0, 0xeb, 0xfc, 0xb3, 0x81, 0xc0, 0xb2, 0x69, 0xd7, 0x67, 0xdd, 0xec, 0x3e, 0xc2, 0xe2, 0x90, 0x9a, 0x36, 0x8, 0x5c, 0x38, 0xb2, 0x33, 0xf8, 0xb4, 0xe, 0x19, 0x9b, 0xc5, 0x90, 0x29, 0x80, 0xac, 0x8e, 0xc6, 0x45, 0x61, 0x9a, 0x81, 0x14, 0xa0, 0xc4, 0x2e, 0x62, 0x6d, 0x78, 0x7a, 0x8d, 0x3a, 0xac, 0x20, 0xbe, 0xad, 0xfa, 0x33, 0x30, 0x2d, 0xba, 0x5a, 0x81, 0x17, 0xa2, 0x31, 0x65, 0xf5, 0xa4, 0xdb, 0x42, 0x27, 0x9d, 0x20, 0xbb, 0xf, 0xaa, 0x55, 0xe3, 0xe9, 0x2c, 0xdb, 0xad, 0xe1, 0xcc, 0x63, 0xb5, 0x24, 0x4f, 0x6f, 0x77, 0x3a, 0xb4, 0x9f, 0x2a, 0x67, 0x66, 0x51, 0x1f, 0x9d, 0xc7, 0x4f, 0x78, 0x40, 0x78, 0xbb, 0xf5, 0xbb, 0x74, 0xf7, 0x6c, 0x1a, 0x82, 0xb3, 0x41, 0xf4, 0x2, 0xdf, 0xce, 0xd4, 0x7b, 0xa2, 0xdf, 0x2a, 0x4e, 0xb8, 0xb9, 0x4e, 0xfa, 0xc5, 0xde, 0xcd, 0xb7, 0xf0, 0xd7, 0xcb, 0xb, 0x91, 0xec, 0x1e, 0x5a, 0x2e, 0x48, 0x40, 0xe6, 0xb7, 0xdf, 0x84, 0x89, 0x16, 0x4b, 0x33, 0xef, 0x8c, 0x38, 0x96, 0x87, 0x33, 0x17, 0xce, 0x1d, 0xe8, 0xf0, 0x20, 0x37, 0x26, 0x9c, 0x94, 0xe6, 0xf6, 0xec, 0xcb, 0x93, 0xf5, 0xaf, 0xfe, 0x56, 0x5c, 0x84, 0x8c, 0xe5, 0xfd, 0x1, 0x56, 0xff, 0x8b, 0x14, 0xb3, 0xcc, 0x2e, 0x17, 0x41, 0xe2, 0x74, 0x78, 0x8a, 0x9a, 0x4c, 0x61, 0x1b, 0xf0, 0xbc, 0x68, 0x98, 0x4c, 0x54, 0x5e, 0xe3, 0x33, 0xa2, 0xfb, 0xd8, 0x65, 0xc7, 0xc9, 0x4b, 0x93, 0x54, 0x1e, 0x75, 0xb, 0xb3, 0x71, 0x65, 0x96, 0xc1, 0x17, 0xc8, 0xa7, 0x91, 0xcf, 0x2f, 0xfd, 0xc4, 0x88, 0xc8, 0xb1, 0xdc, 0x7e, 0xbc, 0x6f, 0x24, 0xff, 0x1b, 0xcc, 0x59, 0xfd, 0x4f, 0x30, 0x27, 0x11, 0x58, 0x9c, 0xe5, 0x8d, 0x4d, 0x5c, 0xc3, 0x21, 0x99, 0x1f, 0x40, 0xb9, 0xff, 0x63, 0xd8, 0x61, 0x69, 0x80, 0x2e, 0x2e, 0x48, 0x14, 0x5b, 0xf1, 0xaf, 0xd7, 0x8b, 0xf3, 0x6b, 0x15, 0xb3, 0x46, 0xb1, 0x81, 0x1d, 0xcb, 0xe4, 0x5e, 0x1b, 0x15, 0xa9, 0x28, 0xd6, 0x41, 0xac, 0xa1, 0x7b, 0x9e, 0x69, 0x89, 0xfd, 0x9c, 0x8f, 0x3a, 0x8f, 0xe7, 0x8b, 0x74, 0xa0, 0xc9, 0xb9, 0x29, 0x73, 0x1f, 0x62, 0x2e, 0xa9, 0x95, 0x1c, 0x39, 0x1d, 0x37, 0xa8, 0x10, 0x4d, 0x21, 0x6b, 0x1e, 0xe5, 0x35, 0xb4, 0x47, 0x49, 0x3a, 0xf5, 0x55, 0xd2, 0x2b, 0x88, 0x20, 0x1f, 0x5a, 0x4, 0x37, 0xc1, 0xc, 0x5, 0x7a, 0x9b, 0xf4, 0x16, 0x4b, 0x92, 0xaf, 0x94, 0x66, 0xea, 0xf5, 0x26, 0xba, 0x8a, 0x3e, 0x6a, 0x82, 0x69, 0x54, 0x28, 0x6, 0x29, 0x27, 0x16, 0x8c, 0xb0, 0xcb, 0xd1, 0xf6, 0x2e, 0x34, 0xc, 0x8c, 0xc5, 0x84, 0x38, 0x31, 0x61, 0xb4, 0xf1, 0xf6, 0xd8, 0x99, 0xc2, 0xc7, 0xa5, 0x87, 0x9f, 0x3e, 0xff, 0xc0, 0xae, 0x5a, 0xcd, 0xe3, 0x8e, 0x78, 0xf1, 0x4, 0x9e, 0x66, 0x7, 0xa2, 0x38, 0x69, 0xa8, 0xaf, 0x27, 0x4f, 0xc1, 0xc0, 0x1, 0x3a, 0xe9, 0x34, 0xa3, 0x47, 0x8b, 0x8, 0x68, 0x36, 0xd9, 0x38, 0x74, 0x62, 0xff, 0x65, 0x59, 0x2a, 0xca, 0xd8, 0x85, 0x9, 0x7a, 0xb3, 0xb9, 0xe9, 0xd6, 0x42, 0x55, 0x9a, 0x3d, 0xe8, 0x72, 0xf9, 0x4c, 0xb, 0xb8, 0x3e, 0xc2, 0xfd, 0x72, 0xdf, 0x4f, 0xbb, 0x33, 0x1c, 0x5c, 0x5a, 0xd4, 0xb3, 0x4c, 0xdd, 0xbd, 0xca, 0x3b, 0xa1, 0x67, 0x7d, 0x41, 0x6b, 0x4d, 0x38, 0xa9, 0x54, 0xfa, 0xa8, 0x6a, 0xba, 0x5b, 0x9f, 0x65, 0xcb, 0xf0, 0xe, 0xcd, 0x21, 0x76, 0x93, 0x4, 0x47, 0x23, 0x8b, 0x51, 0xf5, 0xb2, 0x80, 0xd4, 0x80, 0x87, 0xe3, 0x1f, 0x1e, 0x97, 0x3c, 0x15, 0x38, 0xb5, 0x7, 0xfe, 0xed, 0x8, 0x71, 0x15, 0x29, 0x1, 0x11, 0xab, 0x3, 0x80, 0xd, 0xca, 0x8, 0x61, 0xa8, 0x74, 0xd4, 0x58, 0x4a, 0xc, 0x90, 0x5d, 0x4c, 0xee, 0x8f, 0x8a, 0x4, 0xf8, 0x80, 0x4c, 0x6d, 0xe8, 0x24, 0xc9, 0xc7, 0xe3, 0x60, 0x1e, 0x6a, 0x5, 0xde, 0x89, 0xc8, 0x28, 0x40, 0xa0, 0x14, 0xb2, 0x2e, 0x66, 0xe2, 0x57, 0x47, 0x3, 0xe1, 0x37, 0x98, 0x8e, 0xc4, 0xe8, 0x8a, 0x74, 0xac, 0x80, 0x62, 0x28, 0x74, 0x87, 0xf2, 0x6, 0x6b, 0x18, 0x22, 0x40, 0xc2, 0xf1, 0xd7, 0x51, 0x4e, 0x9, 0x76, 0x33, 0xbb, 0xd0, 0x7a, 0x87, 0xcd, 0x42, 0x22, 0xcc, 0x10, 0x51, 0xc6, 0x97, 0xd1, 0xcf, 0x29, 0x57, 0xd6, 0x7b, 0x71, 0x31, 0xca, 0x8a, 0x5, 0x94, 0x29, 0xf2, 0xa5, 0xae, 0x55, 0x21, 0x15, 0x75, 0x84, 0x7, 0x54, 0x1a, 0x82, 0x9a, 0x48, 0x2d, 0xf1, 0x84, 0x5c, 0xaf, 0x37, 0x37, 0xf9, 0xc1, 0x8c, 0xb1, 0x45, 0x58, 0x48, 0xba, 0xe2, 0xc, 0xba, 0x4f, 0xa, 0x4, 0x74, 0x5f, 0xc3, 0xd4, 0x2d, 0xac, 0x57, 0xc9, 0xea, 0xfc, 0x71, 0xeb, 0x9a, 0x40, 0x23, 0xec, 0xc4, 0x55, 0x82, 0xd7, 0xba, 0x4f, 0xec, 0x76, 0x7b, 0x8a, 0x61, 0xed, 0x59, 0xb3, 0x60, 0x4a, 0x6f, 0xed, 0x26, 0x49, 0x74, 0x12, 0xe3, 0x2d, 0x91, 0x4b, 0x7f, 0x8d, 0x1e, 0xe2, 0x59, 0x5a, 0x70, 0xfc, 0x59, 0x5a, 0x57, 0xe2, 0xe, 0xbc, 0x2d, 0xed, 0xde, 0xd4, 0xf1, 0x72, 0xd2, 0x72, 0x97, 0xb9, 0x5a, 0xd8, 0x79, 0x96, 0x25, 0x1c, 0xcd, 0xdd, 0x7c, 0x71, 0x69, 0x82, 0x77, 0xc3, 0xdc, 0xeb, 0x45, 0x20, 0x97, 0x50, 0xdf, 0xc9, 0xe2, 0x6e, 0x83, 0xde, 0x13, 0xed, 0x7a, 0x21, 0xa7, 0x50, 0x4, 0xf5, 0x39, 0x9f, 0xb6, 0x7, 0xe0, 0xae, 0x41, 0xa9, 0x3b, 0xd3, 0x9a, 0xec, 0x2b, 0xfc, 0x90, 0x71, 0x4f, 0x91, 0x87, 0x24, 0xd9, 0xb0, 0x4e, 0x25, 0xd2, 0x70, 0xb8, 0x26, 0x79, 0xeb, 0xb9, 0x24, 0x2b, 0x3d, 0x9, 0x55, 0xbe, 0xcd, 0xb3, 0x8c, 0xf8, 0xbf, 0xb, 0x64, 0xdd, 0xe4, 0xaf, 0x99, 0xf3, 0xd0, 0x45, 0xed, 0x76, 0x2f, 0x30, 0xe1, 0x5f, 0x3c, 0x3d, 0xfb, 0x64, 0x37, 0xf4, 0x62, 0x35, 0x6f, 0x2d, 0xb6, 0x51, 0x31, 0x18, 0xf3, 0x5a, 0x7b, 0xf3, 0xe5, 0x9c, 0xd7, 0xc7, 0xb, 0xbd, 0xd5, 0xf, 0x89, 0x66, 0xec, 0x20, 0x6b, 0xaf, 0xfd, 0xa2, 0x35, 0x4b, 0xab, 0xe5, 0xb0, 0x72, 0x67, 0xcf, 0xaa, 0xee, 0xf5, 0x1, 0x60, 0x8b, 0x1d, 0x80, 0x95, 0x5b, 0x79, 0xe4, 0x7c, 0x8f, 0x72, 0xda, 0x81, 0xfb, 0x41, 0x2a, 0xed, 0x20, 0x4a, 0xe6, 0x1, 0xec, 0x4f, 0xd4, 0x5c, 0x68, 0x9f, 0xad, 0x50, 0xff, 0xa7, 0xcc, 0xdd, 0xd7, 0x3e, 0xfd, 0x97, 0x2d, 0xc, 0x64, 0xd2, 0xf, 0x46, 0xf9, 0xf4, 0x82, 0xeb, 0x26, 0x14, 0x24, 0x3a, 0xd5, 0x21, 0xd7, 0xd5, 0x62, 0x98, 0x0, 0x80, 0x82, 0xa1, 0xd3, 0x5b, 0xa3, 0x57, 0x33, 0xc, 0xa4, 0xcd, 0xa2, 0x7a, 0x3b, 0xa8, 0xf3, 0x27, 0x85, 0x30, 0xf8, 0xf6, 0x4e, 0xe7, 0x8a, 0xb5, 0x6b, 0xad, 0x6d, 0x2e, 0x81, 0x1a, 0x91, 0x2a, 0x5b, 0x6c, 0x3d, 0xf4, 0x51, 0x60, 0x28, 0xde, 0xd8, 0xc4, 0x96, 0xf9, 0x41, 0xcc, 0xdc, 0x4b, 0x4e, 0xe2, 0xe1, 0xa, 0xc0, 0x2e, 0x31, 0xe7, 0x70, 0xee, 0xe6, 0xaa, 0xfe, 0x68, 0xaf, 0x6f, 0xc9, 0xb0, 0x2, 0x56, 0x15, 0xcc, 0xf4, 0x78, 0x2a, 0x5, 0x94, 0x6e, 0xa8, 0x21, 0x33, 0x7e, 0x80, 0x5d, 0x4d, 0x73, 0xd6, 0xa0, 0xb3, 0x2f, 0xba, 0x43, 0x5a, 0xb2, 0x3b, 0x8f, 0xb9, 0xf3, 0x51, 0x29, 0xee, 0x19, 0x31, 0x80, 0xbf, 0x30, 0x2a, 0x61, 0xb0, 0x21, 0x33, 0xe4, 0xfe, 0x7f, 0xd0, 0x21, 0xb8, 0x2e, 0xe4, 0x75, 0xf7, 0x12, 0xb3, 0x85, 0x64, 0x6e, 0xe7, 0x12, 0xd1, 0xf8, 0xf8, 0x52, 0x1c, 0x77, 0xdb, 0x24, 0x3e, 0x4d, 0x6d, 0x2f, 0x4a, 0x68, 0x41, 0xee, 0xe3, 0x48, 0x51, 0x55, 0xd9, 0x21, 0x7d, 0x95, 0x61, 0x71, 0x6c, 0x2a, 0xb1, 0xcd, 0x83, 0x12, 0x63, 0x19, 0x64, 0xe1, 0x50, 0x2e, 0x82, 0xa8, 0x3f, 0xbf, 0x73, 0xcc, 0x66, 0x31, 0x63, 0x4b, 0x25, 0xf6, 0x38, 0xcc, 0xe8, 0xae, 0xae, 0xa7, 0xef, 0x3a, 0xa9, 0x29, 0xa9, 0x37, 0x80, 0x0, 0xf7, 0x46, 0xbd, 0xc6, 0xfe, 0x19, 0x8e, 0x1a, 0x60, 0x65, 0x62, 0x8b, 0xab, 0x12, 0xdc, 0x5e, 0x7f, 0x53, 0xcf, 0x90, 0x59, 0x5e, 0x95, 0xcd, 0x97, 0xe4, 0xf9, 0xb2, 0xa5, 0x9a, 0x7f, 0x38, 0xcd, 0x2f, 0xe8, 0x8f, 0xb7, 0x67, 0xff, 0xa3, 0xfa, 0xe5, 0x30, 0x5e, 0x5d, 0x29, 0x8d, 0x53, 0xcf, 0x1b, 0xec, 0xa7, 0x13, 0xa8, 0x39, 0x32, 0x57, 0x3a, 0x9, 0x24, 0x7c, 0xd1, 0x6b, 0x28, 0xf5, 0xe9, 0x9b, 0x4d, 0x26, 0x63, 0x93, 0x47, 0x4e, 0x2c, 0xf, 0x88, 0xf6, 0x17, 0xb1, 0x42, 0x70, 0x17, 0x43, 0xee, 0xe1, 0x4c, 0xc8, 0xe2, 0xb7, 0x39, 0xa9, 0xf4, 0x96, 0xd0, 0x22, 0xe7, 0xc8, 0xce, 0x97, 0xe6, 0xd5, 0xbe, 0xcb, 0xae, 0x61, 0x68, 0x11, 0x19, 0x23, 0x6c, 0xf0, 0x53, 0xd1, 0xc2, 0x7a, 0x53, 0x90, 0x28, 0xb8, 0x42, 0x2f, 0xcc, 0xb4, 0x17, 0xa9, 0xd0, 0x51, 0xcb, 0xe2, 0x33, 0x31, 0xf9, 0x99, 0x48, 0xf3, 0xa3, 0xcf, 0xc2, 0xb6, 0xf6, 0xa2, 0xe9, 0x4b, 0x4f, 0xc9, 0xb2, 0xb7, 0x62, 0xa1, 0x7c, 0x81, 0xb1, 0x7, 0x97, 0xd, 0xb1, 0xf8, 0xd5, 0x72, 0xa1, 0x2, 0xb6, 0x2a, 0x54, 0xd4, 0x4f, 0x35, 0x78, 0x30, 0xfd, 0x92, 0x69, 0x99, 0xdd, 0xdd, 0x26, 0xf2, 0xee, 0xe1, 0x15, 0xa, 0xeb, 0x89, 0xa9, 0x1f, 0x22, 0xfd, 0xf9, 0x36, 0x3b, 0x62, 0xfe, 0xb0, 0x79, 0xc0, 0x9f, 0xe1, 0xfd, 0x23, 0x3b, 0x54, 0x26, 0xef, 0x82, 0x84, 0x95, 0xa0, 0x64, 0x6e, 0x13, 0x25, 0x58, 0x9, 0x9b, 0x71, 0x37, 0xf6, 0x23, 0x2e, 0x14, 0xa1, 0xb6, 0x96, 0xd5, 0xcf, 0x14, 0xb, 0xac, 0x5a, 0x33, 0xc6, 0xaa, 0xa6, 0x5e, 0xd5, 0x1d, 0x8, 0xf3, 0xbd, 0xe8, 0xa0, 0x86, 0x2a, 0xc1, 0x3d, 0x0, 0x79, 0x9d, 0xb8, 0x5f, 0xa3, 0x32, 0x11, 0xde, 0x77, 0x86, 0x62, 0x73, 0x47, 0x88, 0xa8, 0x2f, 0x64, 0x7e, 0x12, 0x75, 0x60, 0xe6, 0x49, 0x5b, 0x30, 0x7a, 0x2f, 0x19, 0xa9, 0x6a, 0x43, 0x11, 0xfe, 0x3c, 0x6, 0x1a, 0x89, 0x1, 0x71, 0x4b, 0x57, 0x14, 0x0, 0x72, 0x8d, 0x37, 0x57, 0x2a, 0xde, 0x46, 0xa9, 0xfa, 0x66, 0x30, 0x1c, 0x19, 0x63, 0x5c, 0x49, 0x5c, 0xdb, 0xb4, 0x7d, 0x6b, 0x65, 0x7e, 0x4b, 0x2b, 0x13, 0x4, 0x63, 0xd0, 0x7a, 0xd2, 0xe3, 0xa4, 0xeb, 0x56, 0xfa, 0x19, 0x82, 0xe3, 0x70, 0x57, 0x66, 0x6, 0x4c, 0x75, 0x7a, 0xcf, 0x65, 0x44, 0xf3, 0xc5, 0x69, 0x61, 0xd2, 0x61, 0x91, 0xfe, 0x48, 0xe3, 0xe, 0xdc, 0x22, 0x27, 0xf6, 0x5d, 0x54, 0x4, 0x89, 0x29, 0x6a, 0x59, 0xc6, 0x9c, 0x2a, 0x32, 0x5d, 0x9f, 0x18, 0xd6, 0x43, 0xf0, 0xe9, 0xe3, 0x1e, 0x18, 0x7a, 0x95, 0xce, 0xb4, 0xed, 0x62, 0x5c, 0xfe, 0x49, 0xa, 0x19, 0x8, 0x3d, 0x18, 0x91, 0x36, 0x3d, 0x54, 0x57, 0x2c, 0x23, 0x48, 0x4, 0xa9, 0x8b, 0x31, 0xee, 0x75, 0x58, 0x8f, 0xf2, 0xae, 0x9e, 0xe0, 0xc, 0xd2, 0x66, 0x4a, 0x8a, 0x84, 0x50, 0x3d, 0x61, 0x10, 0xfb, 0x2e, 0xcf, 0x9f, 0xa8, 0xa1, 0x98, 0x4b, 0x27, 0x64, 0xfc, 0x98, 0xd9, 0x1e, 0x5f, 0x41, 0x50, 0x2b, 0x85, 0xe3, 0x56, 0xbb, 0x6a, 0x8, 0xd4, 0x34, 0x2e, 0xf7, 0x3a, 0xc3, 0x15, 0xf6, 0x35, 0xec, 0xe, 0x11, 0x40, 0xea, 0xd9, 0xb, 0x4e, 0xa3, 0xde, 0xc1, 0x5b, 0xbc, 0x12, 0x1c, 0x99, 0x46, 0xae, 0x49, 0xc9, 0x84, 0x65, 0x68, 0x42, 0xb9, 0x97, 0x8c, 0xd3, 0x95, 0xad, 0x13, 0x62, 0x75, 0x5c, 0x4e, 0x1a, 0x56, 0x9, 0x46, 0x89, 0x7f, 0x73, 0xf2, 0xae, 0xa4, 0x94, 0x9e, 0xb6, 0x78, 0x1c, 0x37, 0xc6, 0x94, 0x75, 0xf5, 0xde, 0xa9, 0xed, 0x19, 0xd9, 0x8c, 0x76, 0x5a, 0xd2, 0x51, 0x2a, 0x8e, 0xf4, 0x6, 0x32, 0x6e, 0xef, 0xa3, 0x78, 0x86, 0xc0, 0xe8, 0x56, 0xd3, 0xc9, 0x91, 0x3f, 0x54, 0x6d, 0xd3, 0xf8, 0x93, 0x43, 0x67, 0x8, 0xa4, 0xf4, 0x31, 0xf2, 0xfe, 0xc9, 0xc6, 0x48, 0x91, 0x11, 0x9a, 0x37, 0x4d, 0xce, 0x32, 0x82, 0xdc, 0x1d, 0x58, 0xb5, 0x0, 0x4b, 0x21, 0x2, 0xd7, 0xef, 0x72, 0x7a, 0xa6, 0x92, 0xe8, 0xb4, 0x17, 0xf6, 0xa9, 0x45, 0x61, 0xf1, 0x9f, 0x22, 0x5f, 0x27, 0x2, 0x64, 0xfe, 0xa3, 0x6b, 0x4, 0xdc, 0xa8, 0x3e, 0xb0, 0x6d, 0xcc, 0xda, 0x51, 0x3, 0xd6, 0x73, 0xc8, 0x71, 0x5b, 0x7b, 0x94, 0xc2, 0x37, 0xe3, 0xae, 0x4b, 0x80, 0x43, 0x8b, 0xb0, 0xc7, 0x85, 0x8, 0x90, 0xb9, 0x79, 0x45, 0xc8, 0x61, 0xa6, 0x1e, 0x1f, 0x18, 0x78, 0x1, 0xa5, 0x93, 0xbb, 0xdd, 0xcc, 0x80, 0xb4, 0x9f, 0xcf, 0x3d, 0x88, 0x4d, 0x55, 0x4d, 0x9a, 0xfb, 0xd, 0xc5, 0x71, 0xca, 0x76, 0xea, 0x40, 0x42, 0xe0, 0x2b, 0x14, 0x51, 0xc2, 0x99, 0xfc, 0x7a, 0xfa, 0x3d, 0xa6, 0x9b, 0x89, 0xa3, 0xcd, 0xbb, 0x9f, 0x12, 0x5b, 0x94, 0xed, 0xcc, 0xa4, 0x99, 0xa2, 0x28, 0xd5, 0x4d, 0x3c, 0x92, 0xc0, 0x63, 0x8a, 0x9, 0xb6, 0xe8, 0x68, 0x1b, 0x62, 0x40, 0x3f, 0x6c, 0xa, 0xf5, 0xec, 0xe3, 0x9e, 0x77, 0xe3, 0xfc, 0x65, 0x1, 0xf, 0x9e, 0x5d, 0x49, 0xbd, 0x9d, 0x7f, 0xe, 0xe0, 0x7a, 0x4e, 0x28, 0x20, 0xa2, 0xef, 0xa4, 0x1f, 0x19, 0x62, 0xac, 0x47, 0xde, 0xba, 0x64, 0x45, 0x8e, 0x8e, 0x70, 0xc4, 0x2a, 0x31, 0xe6, 0x90, 0xdf, 0x9a, 0x1e, 0xa7, 0xfb, 0x25, 0x57, 0x4f, 0x9f, 0x4b, 0x68, 0x3d, 0xae, 0x55, 0x5f, 0xe9, 0x15, 0xb4, 0x94, 0x1e, 0xb1, 0xcc, 0xf7, 0x47, 0x1, 0xc2, 0xad, 0xa8, 0xbe, 0x48, 0xfd, 0x50, 0xa8, 0x6, 0xdf, 0x40, 0x0, 0x18, 0x18, 0xce, 0x22, 0xce, 0x82, 0xde, 0x42, 0xca, 0x7, 0x6c, 0x1a, 0x76, 0x24, 0x5a, 0x51, 0x6c, 0x64, 0x23, 0x2f, 0x39, 0x68, 0xb2, 0xf8, 0x91, 0xcf, 0x46, 0x86, 0x14, 0x81, 0x81, 0xff, 0x57, 0xb7, 0xe4, 0xa0, 0x2, 0x61, 0xd2, 0xb, 0x57, 0xdd, 0x94, 0x80, 0xdf, 0x65, 0x3e, 0x2d, 0x4d, 0xc3, 0x2d, 0xd3, 0x56, 0xde, 0x56, 0x44, 0xaf, 0xfe, 0x18, 0x22, 0x79, 0x2, 0x61, 0xe8, 0x68, 0x95, 0xb3, 0xdc, 0x58, 0xa4, 0x28, 0x5c, 0x68, 0xb8, 0xa2, 0x17, 0xa8, 0x95, 0x62, 0x6c, 0xbf, 0xa8, 0x41, 0xdc, 0xd1, 0x98, 0xca, 0x74, 0x40, 0x29, 0x7b, 0xbe, 0x13, 0xe0, 0xb3, 0x59, 0x82, 0xc4, 0x94, 0x56, 0x52, 0x4f, 0x2c, 0x24, 0xd5, 0x2e, 0xb4, 0xec, 0x9f, 0x7c, 0xda, 0x50, 0x89, 0x8e, 0x30, 0x1d, 0x54, 0x6c, 0x31, 0x83, 0x70, 0x2, 0x46, 0xcc, 0xab, 0x9e, 0xd3, 0x6b, 0xbc, 0x5, 0x7f, 0xdc, 0xc, 0xc2, 0x60, 0xa1, 0xfa, 0x37, 0xb8, 0x6, 0x9d, 0xd3, 0xac, 0x1a, 0xf3, 0x8b, 0x4f, 0x51, 0x20, 0x51, 0x0, 0x95, 0xdc, 0x31, 0x83, 0xac, 0xa2, 0x2a, 0xaf, 0x62, 0xf4, 0x74, 0x53, 0xa3, 0xb1, 0x2a, 0xf3, 0xb4, 0xd9, 0x73, 0x76, 0xfc, 0x49, 0x4f, 0xd6, 0xac, 0x51, 0xe1, 0xa6, 0x81, 0x65, 0x94, 0x8d, 0x1b, 0x85, 0x22, 0x73, 0x12, 0xa0, 0xf4, 0xbd, 0x33, 0x31, 0xd1, 0xf0, 0xe0, 0xda, 0x84, 0x65, 0x69, 0xf, 0x51, 0xa3, 0x6d, 0x6c, 0x9f, 0x3c, 0x71, 0xc1, 0xa7, 0x3, 0x1a, 0x38, 0x75, 0xe4, 0x38, 0x7f, 0xe9, 0x5b, 0x34, 0x33, 0x82, 0x85, 0x22, 0xa4, 0x1b, 0xca, 0xda, 0x7d, 0xe1, 0xb, 0xc7, 0xc5, 0x3c, 0xf8, 0xf, 0x8c, 0x91, 0xb, 0x94, 0x14, 0x8b, 0x15, 0x5, 0xf7, 0xa5, 0xdb, 0x88, 0x8a, 0x18, 0xb7, 0x8b, 0xd8, 0xfa, 0xa1, 0xa6, 0xfc, 0xfe, 0x5c, 0x95, 0x85, 0x8e, 0x33, 0x4, 0x88, 0x2d, 0xed, 0x81, 0x9, 0xb4, 0x7e, 0xf8, 0xb, 0x23, 0xc0, 0xc7, 0xf7, 0x87, 0x4b, 0x78, 0xf1, 0xd1, 0x3e, 0x2a, 0xd0, 0x9e, 0x7f, 0x76, 0x60, 0x1d, 0x9d, 0x5b, 0x8d, 0x3f, 0xf2, 0x8b, 0x26, 0x90, 0x22, 0xb9, 0x68, 0xd3, 0x86, 0x35, 0x4c, 0x90, 0xad, 0x82, 0xd6, 0xfb, 0x2a, 0x5, 0x96, 0x64, 0xdc, 0xb1, 0xb0, 0x37, 0x16, 0x13, 0xfb, 0x8, 0xac, 0x9d, 0xf3, 0x84, 0xa1, 0x88, 0xd4, 0x9f, 0xdf, 0xb2, 0x25, 0xe3, 0xac, 0x23, 0xbc, 0xc2, 0x1f, 0x84, 0x9a, 0x6c, 0xbd, 0x36, 0x3b, 0x87, 0x29, 0x9d, 0x52, 0xf8, 0x3c, 0x15, 0x11, 0x2c, 0x46, 0x2d, 0x21, 0x55, 0xc5, 0xd, 0x37, 0xe0, 0xb3, 0xc6, 0xec, 0xaa, 0x89, 0x75, 0x3f, 0xf8, 0x31, 0x99, 0x5a, 0xde, 0xb7, 0x31, 0x74, 0xdf, 0xb1, 0x3c, 0x87, 0x95, 0xf2, 0xe6, 0x8e, 0x52, 0xfb, 0x95, 0x3c, 0x30, 0xcc, 0xf, 0x50, 0xa1, 0xec, 0x60, 0xb7, 0x33, 0xce, 0x97, 0x5, 0x39, 0xdb, 0x36, 0x97, 0x76, 0xe4, 0x86, 0x14, 0x96, 0xd6, 0xa2, 0x9d, 0x33, 0xc3, 0x28, 0xe4, 0x45, 0xd2, 0xce, 0x6c, 0x10, 0xfa, 0x41, 0x7f, 0xca, 0xf5, 0xdd, 0xac, 0x80, 0x70, 0x32, 0xb1, 0xed, 0x37, 0x69, 0x6b, 0x2e, 0x52, 0xe5, 0x77, 0x3a, 0xda, 0x18, 0x6c, 0xcd, 0xbb, 0xc3, 0x8, 0xc9, 0x69, 0x56, 0xfd, 0x24, 0xd9, 0x48, 0x9e, 0x1b, 0x1f, 0xf7, 0xb3, 0x4b, 0xaa, 0x36, 0x4e, 0xc6, 0x37, 0x7d, 0x8d, 0x47, 0xee, 0xdf, 0xdb, 0x4f, 0x5a, 0xa0, 0xf7, 0x93, 0x1, 0xbc, 0xc8, 0x75, 0xba, 0xdf, 0x16, 0xcd, 0x56, 0x84, 0x1e, 0xbc, 0x84, 0x51, 0xd1, 0xfa, 0x46, 0x8, 0x8f, 0xb0, 0x1f, 0x36, 0xbb, 0x6b, 0xb2, 0xef, 0x1, 0x33, 0x29, 0xfa, 0x4d, 0x64, 0xa9, 0xf8, 0xca, 0x68, 0x45, 0xc, 0x3c, 0xc, 0x3e, 0x5, 0xae, 0xac, 0xd, 0xa8, 0x51, 0xa6, 0xec, 0x2, 0xd5, 0xa6, 0x2b, 0xb, 0x61, 0x4, 0x60, 0x68, 0x59, 0xbd, 0xe3, 0x45, 0x72, 0x2b, 0x28, 0xf6, 0x6a, 0x7, 0xc2, 0xa4, 0xe9, 0x94, 0x1e, 0x4a, 0xf2, 0x61, 0xae, 0x63, 0xf1, 0x76, 0x15, 0x5c, 0x99, 0x15, 0x3, 0x47, 0x15, 0x57, 0x74, 0x3d, 0xff, 0xf8, 0x2a, 0x19, 0x9b, 0xe1, 0x2c, 0x7, 0xea, 0xb3, 0x7e, 0x85, 0x99, 0x9, 0x9b, 0x88, 0x62, 0x1b, 0xb8, 0xc5, 0x9, 0xa3, 0xea, 0xd6, 0x22, 0xec, 0xdf, 0x19, 0x34, 0xc3, 0xcf, 0xe2, 0xa0, 0xb5, 0xf9, 0xa0, 0xb3, 0x65, 0xdb, 0x9c, 0xb6, 0xbf, 0x70, 0x95, 0x4d, 0x52, 0x3f, 0x56, 0x15, 0xec, 0x75, 0x30, 0x2f, 0x80, 0xe0, 0x37, 0x97, 0xed, 0xe5, 0xe0, 0x53, 0xc7, 0x4, 0x2b, 0xf4, 0xe7, 0x6a, 0x6c, 0xd4, 0x6, 0xe6, 0x0, 0x42, 0x9, 0x26, 0xa4, 0xdc, 0x80, 0xf6, 0x39, 0x2f, 0xb0, 0x3a, 0xda, 0x37, 0x3b, 0x73, 0xa9, 0x53, 0x88, 0x9b, 0x6a, 0x38, 0x5d, 0x85, 0xae, 0x34, 0x11, 0x2e, 0x61, 0x9b, 0xed, 0x88, 0xe1, 0xbe, 0xa8, 0xd8, 0x59, 0xd4, 0xed, 0x83, 0xc0, 0x8b, 0xa0, 0x2f, 0x68, 0xe1, 0xf, 0x2d, 0x51, 0x21, 0x4d, 0x94, 0x30, 0x9f, 0x2e, 0x84, 0xf9, 0xab, 0x7c, 0x8a, 0xaf, 0x83, 0xab, 0x5e, 0xbf, 0xd4, 0x31, 0xa3, 0x6a, 0x2a, 0x7f, 0x1, 0xba, 0xcf, 0x72, 0xd2, 0xe3, 0xa0, 0xab, 0x83, 0xbc, 0xa, 0x56, 0x27, 0x75, 0x6b, 0x3a, 0xe, 0x87, 0x33, 0xb8, 0x94, 0xf5, 0x50, 0x9f, 0x6b, 0xa2, 0xae, 0xc6, 0x25, 0xd0, 0xf6, 0xfd, 0xb5, 0x1d, 0x69, 0x3d, 0x80, 0x14, 0x35, 0x33, 0xe6, 0x9, 0x75, 0xb7, 0x3, 0x6f, 0xcf, 0x14, 0xbd, 0x34, 0xe2, 0x5e, 0x74, 0xbb, 0x24, 0xc0, 0x49, 0x84, 0x50, 0x8b, 0xde, 0xb4, 0xd7, 0x35, 0xef, 0xdd, 0x4f, 0x33, 0x9c, 0xb4, 0xb2, 0x64, 0xb7, 0x28, 0x77, 0x64, 0xff, 0x31, 0xe0, 0x21, 0xcc, 0xd7, 0xee, 0x4d, 0xf9, 0x85, 0x28, 0xd8, 0xa0, 0xb8, 0x40, 0x47, 0xe3, 0xfb, 0xd2, 0x85, 0xc7, 0xc4, 0x17, 0x3, 0xa7, 0xae, 0x8c, 0xa5, 0xf8, 0xc5, 0x6a, 0x5, 0xdc, 0x5f, 0x4, 0x78, 0x88, 0x8e, 0x4e, 0x27, 0xc4, 0xe0, 0x25, 0xc3, 0xeb, 0xeb, 0x98, 0x66, 0x21, 0x56, 0x6c, 0x39, 0x9, 0xcf, 0xbb, 0xef, 0xf, 0x5e, 0x80, 0x91, 0x4, 0x15, 0x19, 0x19, 0xdc, 0xa2, 0x80, 0x54, 0x5c, 0x87, 0x4e, 0x4c, 0xa7, 0xa, 0xce, 0xc8, 0x72, 0xb3, 0xd1, 0xa8, 0xde, 0xc1, 0xfa, 0x77, 0x7f, 0x1d, 0x70, 0x9f, 0x67, 0x70, 0xb5, 0x6a, 0x6d, 0xb5, 0x0, 0xba, 0x3e, 0xce, 0x50, 0x23, 0xf2, 0x20, 0x4e, 0x0, 0x8, 0x4e, 0x1c, 0x60, 0x8d, 0x19, 0x45, 0x45, 0x6b, 0xd5, 0x77, 0xe1, 0xd5, 0x5a, 0xdc, 0x9, 0xea, 0xd9, 0xba, 0x34, 0x75, 0xaa, 0x19, 0x3e, 0x92, 0x46, 0xc0, 0x80, 0x31, 0xa6, 0x5, 0x29, 0xa4, 0xaa, 0x64, 0xc8, 0xd3, 0xd0, 0x9e, 0x27, 0xc, 0x51, 0x5a, 0x90, 0xff, 0xb6, 0x41, 0xf3, 0x49, 0x32, 0x6b, 0x96, 0xa7, 0x88, 0x9, 0xe2, 0x2b, 0xc1, 0x41, 0xa3, 0x61, 0x3, 0x89, 0x17, 0x36, 0x42, 0x61, 0xfd, 0xc, 0x60, 0xdc, 0x4, 0x36, 0x6c, 0x31, 0x33, 0x85, 0xeb, 0x95, 0x22, 0x2, 0x22, 0x29, 0xaf, 0x44, 0xac, 0xe4, 0xbd, 0x3d, 0x69, 0xef, 0x7e, 0x1c, 0x5d, 0xfc, 0x8a, 0x89, 0xa1, 0x4f, 0x4f, 0xd1, 0x5, 0x68, 0x89, 0x58, 0xca, 0x21, 0x3c, 0x20, 0x60, 0x21, 0x0, 0x5, 0xb, 0x73, 0xef, 0x40, 0x30, 0x1f, 0xd, 0x6f, 0x5a, 0x19, 0xf7, 0x77, 0x9, 0x77, 0xbf, 0xfa, 0x8f, 0x83, 0xeb, 0xad, 0x67, 0x61, 0xc8, 0x8e, 0x2d, 0x1, 0x4f, 0xbb, 0xa8, 0x85, 0x12, 0xea, 0x3f, 0xab, 0x3e, 0x9a, 0x3, 0x35, 0x88, 0xd6, 0xc2, 0x4, 0x90, 0x30, 0xf8, 0x24, 0x5d, 0xee, 0x5e, 0xe9, 0xff, 0x13, 0x76, 0x4b, 0x6e, 0xa9, 0xa4, 0x3e, 0x22, 0xbd, 0x12, 0xfe, 0xdf, 0xc, 0x53, 0x9a, 0x73, 0xb6, 0xe5, 0x2e, 0x5c, 0x8f, 0x2, 0x38, 0x76, 0xbd, 0xa9, 0x6a, 0x40, 0xed, 0xa1, 0x3d, 0x30, 0x65, 0xa0, 0x86, 0x14, 0xc2, 0xc4, 0x2e, 0xe6, 0xc7, 0x1e, 0x29, 0xae, 0x61, 0x3e, 0x33, 0x99, 0xdf, 0x92, 0x4, 0x2a, 0x62, 0xe0, 0x8e, 0x7a, 0xbb, 0x9d, 0xc, 0xd8, 0x7f, 0xdb, 0xae, 0x1, 0x6c, 0xbc, 0xd3, 0x2e, 0xdc, 0xec, 0x74, 0xbe, 0x8, 0x12, 0x5a, 0xc3, 0x35, 0x1f, 0x67, 0x9f, 0x46, 0x1a, 0xcb, 0x40, 0xd5, 0x5b, 0x6f, 0x77, 0xbf, 0x5a, 0x3c, 0xe5, 0x2c, 0x5, 0x7b, 0x35, 0x60, 0x71, 0x40, 0x72, 0x6f, 0x7a, 0x3f, 0xbf, 0x71, 0x17, 0x37, 0x59, 0xb2, 0x9f, 0x4a, 0xc, 0x44, 0x1c, 0x50, 0xd2, 0x87, 0x40, 0x53, 0xb0, 0x87, 0xe1, 0x52, 0x5, 0x44, 0x32, 0x4c, 0x62, 0x21, 0xc8, 0x7c, 0xbf, 0xb7, 0xdb, 0xcd, 0xfa, 0x22, 0xce, 0xa6, 0x55, 0x41, 0xef, 0x37, 0x98, 0x88, 0xcb, 0x28, 0x42, 0x5a, 0x20, 0x5e, 0x4c, 0x58, 0x6a, 0x74, 0xa8, 0xa7, 0x35, 0x70, 0xdc, 0xb9, 0xa1, 0x4e, 0x7e, 0x26, 0x9b, 0x8c, 0x54, 0xb9, 0xcf, 0x15, 0x3a, 0x59, 0xf3, 0x12, 0xd0, 0x4b, 0x35, 0x21, 0x6e, 0x5e, 0x6e, 0x93, 0x8f, 0x8c, 0x6a, 0xcc, 0x31, 0xdf, 0xdc, 0x41, 0xc2, 0xb5, 0x4, 0x4d, 0xf8, 0x8a, 0x86, 0xfb, 0x5e, 0x34, 0x6f, 0xa, 0x99, 0x63, 0xcb, 0x62, 0xb9, 0xb9, 0x61, 0x4e, 0xef, 0x6f, 0x8d, 0xe4, 0xa2, 0xe1, 0x46, 0x82, 0xc4, 0x23, 0x5c, 0xce, 0x3d, 0x54, 0xd1, 0xe6, 0x15, 0xf0, 0xe9, 0x1d, 0x6d, 0x28, 0x52, 0xdb, 0x9e, 0xd1, 0x56, 0x6f, 0x82, 0xdf, 0xf6, 0x87, 0x7, 0xd6, 0xe3, 0x59, 0x14, 0x1c, 0xfe, 0x5d, 0x1d, 0x6e, 0xdc, 0x6c, 0xb0, 0x9e, 0xa4, 0x99, 0xe8, 0x26, 0xdb, 0xfb, 0xa1, 0x14, 0xc9, 0x60, 0x95, 0x2, 0xf5, 0xb4, 0xd3, 0xb3, 0x2f, 0x84, 0x78, 0x8b, 0xcb, 0xec, 0xbe, 0x22, 0x9c, 0xfa, 0x6d, 0xc5, 0xc0, 0xd7, 0x88, 0xa1, 0x4a, 0xa9, 0x41, 0x9c, 0x29, 0x47, 0x32, 0x70, 0xa1, 0x83, 0xc2, 0x36, 0x11, 0x65, 0x3f, 0xb6, 0x50, 0xe2, 0xa0, 0x2d, 0xa0, 0x24, 0x5e, 0x7b, 0xd2, 0x9f, 0x4d, 0x83, 0x42, 0xdd, 0x34, 0x6c, 0x1b, 0xb7, 0x26, 0xac, 0xd9, 0x36, 0x93, 0x32, 0x97, 0xb4, 0xf1, 0xe5, 0x9d, 0x4a, 0xe9, 0x39, 0xcf, 0x1a, 0x68, 0xdc, 0x30, 0x7b, 0xd7, 0x6c, 0xef, 0xcc, 0x80, 0x5c, 0xd0, 0xb6, 0x99, 0xec, 0x99, 0x82, 0x97, 0x49, 0x35, 0xd3, 0x39, 0xb9, 0x5e, 0x48, 0xf4, 0x6b, 0x47, 0xc1, 0xd7, 0x86, 0xab, 0x61, 0x3e, 0xc5, 0xdd, 0x1d, 0x60, 0xfb, 0x52, 0x80, 0x94, 0xdd, 0x48, 0xdd, 0x11, 0x35, 0x39, 0xeb, 0xc5, 0x34, 0x1c, 0xf6, 0xe6, 0x0, 0x76, 0xc6, 0xf5, 0x91, 0x34, 0x1f, 0xe7, 0xb1, 0x25, 0xb5, 0xf1, 0x33, 0x8, 0x26, 0x72, 0x25, 0x9, 0x8f, 0x36, 0xf6, 0xc6, 0xf5, 0x1c, 0x13, 0xdb, 0x60, 0x12, 0x13, 0xac, 0xf7, 0xb4, 0xfa, 0x3b, 0x35, 0xeb, 0x40, 0x29, 0xe8, 0xee, 0x37, 0x80, 0x88, 0xc7, 0x85, 0x4e, 0xf2, 0xbd, 0xc3, 0xff, 0x81, 0x15, 0x4c, 0xa8, 0xc5, 0xc3, 0xf5, 0xcb, 0x75, 0xff, 0x5b, 0x40, 0x6f, 0x4e, 0xa1, 0x3f, 0xc8, 0xe8, 0x35, 0xca, 0xe0, 0x95, 0x2, 0xf, 0x1c, 0x1d, 0xb8, 0x1d, 0xdd, 0xd9, 0xee, 0xf8, 0x53, 0x71, 0xde, 0x2e, 0xcb, 0xeb, 0x52, 0x11, 0xad, 0x9, 0xba, 0xb6, 0x3f, 0x84, 0xe1, 0x15, 0xb0, 0x41, 0xaa, 0xf0, 0xe6, 0x4c, 0xdd, 0xab, 0xa2, 0x33, 0xf9, 0x3f, 0xb8, 0xf6, 0x13, 0x43, 0x83, 0x7f, 0x77, 0x75, 0x3a, 0x11, 0xdb, 0xa4, 0x7d, 0xdf, 0x28, 0x43, 0xd1, 0xa5, 0x72, 0x3c, 0x1b, 0x7d, 0x6d, 0xdf, 0x6d, 0x6c, 0x96, 0x98, 0x96, 0x78, 0x6f, 0x54, 0xa0, 0x2b, 0xa7, 0x33, 0x9a, 0x43, 0xed, 0xba, 0x65, 0xd2, 0xea, 0x15, 0xa, 0x17, 0xa3, 0x8e, 0xa5, 0x99, 0xfe, 0x3, 0xb9, 0x7e, 0xcf, 0x26, 0xc, 0xd8, 0x33, 0xc6, 0xb0, 0x6d, 0xcf, 0x1a, 0xe7, 0x13, 0xf6, 0x5e, 0x25, 0x31, 0xd0, 0x5c, 0x25, 0xca, 0x18, 0x57, 0xbe, 0xcc, 0x12, 0xd, 0xc4, 0x8, 0x78, 0x53, 0xd0, 0x21, 0xdd, 0x6b, 0xbe, 0xf2, 0x3a, 0xbc, 0x8e, 0x48, 0xf5, 0xc5, 0xf9, 0xe3, 0x1b, 0x7c, 0xd, 0x11, 0x47, 0xdd, 0xb4, 0xad, 0x5e, 0x48, 0xe4, 0xb9, 0x12, 0x41, 0x3d, 0x71, 0xb, 0x87, 0x9, 0x8c, 0x6e, 0xae, 0x56, 0x3d, 0x73, 0x56, 0x3, 0xe2, 0xe1, 0x27, 0xa7, 0x5e, 0x44, 0xab, 0x6b, 0x8d, 0xe6, 0xa4, 0xa1, 0x34, 0xc9, 0xea, 0xf6, 0xf4, 0x9e, 0xc3, 0xf1, 0xce, 0xf8, 0x47, 0x55, 0x15, 0xe0, 0xbf, 0xdc, 0x9b, 0x15, 0x9, 0x39, 0x5c, 0xdb, 0xd1, 0x8a, 0x2a, 0x44, 0x3d, 0xe2, 0xef, 0xf2, 0x64, 0xc1, 0xb9, 0x6, 0x7d, 0x6a, 0x81, 0xc3, 0xe5, 0xa5, 0xa, 0xdc, 0x8b, 0x2d, 0xdf, 0xa9, 0x65, 0x8e, 0xa, 0x12, 0x6f, 0xe4, 0x1a, 0x19, 0x5b, 0x1c, 0x61, 0x0, 0x87, 0x7f, 0x66, 0x83, 0x48, 0x99, 0x10, 0xff, 0xd7, 0x1e, 0x17, 0x83, 0x52, 0x59, 0x69, 0xca, 0xf8, 0xec, 0xa2, 0x33, 0x13, 0x1a, 0x8d, 0xf4, 0xee, 0x73, 0x4a, 0xfa, 0x7d, 0x0, 0x4, 0x66, 0x84, 0xcf, 0xca, 0x97, 0xf1, 0xa9, 0x47, 0x2d, 0xb2, 0xb4, 0x92, 0x1e, 0x65, 0xd1, 0x4e, 0x37, 0xd6, 0xe0, 0x8a, 0x85, 0xb8, 0xef, 0x7a, 0x30, 0x6f, 0x3e, 0x97, 0x4c, 0x72, 0xeb, 0x10, 0x8a, 0x23, 0x4a, 0x52, 0x6f, 0xd6, 0x49, 0x28, 0xeb, 0xa9, 0x92, 0x4a, 0x7b, 0xdd, 0x1e, 0xe9, 0x2f, 0xa4, 0xbd, 0x78, 0x36, 0x5c, 0xc3, 0xf, 0x7c, 0xcd, 0x2a, 0x9, 0x56, 0x17, 0xe5, 0x10, 0xb, 0xf1, 0xe9, 0x13, 0x35, 0xd4, 0xc1, 0x81, 0x69, 0x44, 0x25, 0x7d, 0x40, 0xc1, 0xab, 0xd9, 0x60, 0x48, 0xa8, 0x53, 0x49, 0xd0, 0xd5, 0x4f, 0x8c, 0xe4, 0xbd, 0x8d, 0xe3, 0xb1, 0x5a, 0xbb, 0x81, 0xc5, 0x16, 0x52, 0x7e, 0xa1, 0xe0, 0xc5, 0x6, 0x6b, 0x4, 0x8a, 0x32, 0xa6, 0x5e, 0x16, 0x91, 0x44, 0xf6, 0x34, 0x52, 0x36, 0xd, 0xac, 0xcf, 0xf, 0x8b, 0xe6, 0xb6, 0x40, 0x3b, 0x9, 0x1a, 0x63, 0x5b, 0x1d, 0x9, 0x4a, 0xf2, 0x62, 0x58, 0x7, 0x1c, 0x5c, 0xb8, 0xbf, 0x85, 0x8f, 0x3e, 0xb5, 0x4e, 0xd7, 0xc5, 0x56, 0x24, 0xb2, 0xca, 0x46, 0x77, 0x1c, 0xf5, 0x89, 0xda, 0x61, 0xe7, 0xd9, 0xb8, 0x5c, 0xc2, 0xb5, 0x28, 0xf0, 0xc0, 0x2f, 0xec, 0x70, 0x26, 0x5c, 0xaf, 0xb9, 0x2d, 0xd, 0xd3, 0x3f, 0x87, 0x5e, 0x56, 0x62, 0x82, 0xa1, 0x1e, 0xf, 0x3d, 0xf, 0x73, 0x3a, 0xf4, 0xc8, 0x7c, 0xde, 0xfc, 0xe, 0x59, 0xab, 0x33, 0x3c, 0x6f, 0x9b, 0xe8, 0xb, 0x24, 0x3, 0xad, 0x29, 0xf5, 0x23, 0xc8, 0xdb, 0xa5, 0xbe, 0x98, 0xfe, 0x9a, 0xb7, 0x82, 0xde, 0xe5, 0x2f, 0x96, 0x56, 0x28, 0x8f, 0x56, 0xf3, 0x91, 0xc5, 0x60, 0xdb, 0xa, 0x59, 0xc, 0x58, 0xa8, 0x28, 0x4a, 0x14, 0x4a, 0xc7, 0x1f, 0x4c, 0x3f, 0x20, 0xb3, 0x98, 0x24, 0x66, 0x3b, 0x4f, 0x8c, 0xce, 0x88, 0xe2, 0x30, 0x5c, 0x75, 0x3d, 0x3c, 0x63, 0x21, 0xc8, 0x8f, 0x63, 0x56, 0x2d, 0x7c, 0x5a, 0xa0, 0xff, 0x0, 0x60, 0x88, 0xc6, 0x18, 0x2, 0x1, 0x31, 0xe5, 0x92, 0x8f, 0xa3, 0x64, 0x17, 0xb8, 0x3, 0x79, 0xee, 0x9, 0x91, 0x47, 0x63, 0x3c, 0x97, 0x36, 0xc2, 0x95, 0x13, 0x2f, 0x8e, 0x4e, 0x22, 0xf5, 0xec, 0x3c, 0xf8, 0x4f, 0xc3, 0x23, 0x6c, 0xd6, 0x1e, 0x5d, 0xbf, 0xb3, 0x30, 0x19, 0x22, 0xfb, 0xae, 0x9e, 0x73, 0x9c, 0xa1, 0x22, 0x8, 0x6b, 0xc0, 0x25, 0x98, 0xa4, 0xd3, 0x4b, 0x2a, 0x57, 0xa8, 0xd0, 0x51, 0x63, 0xd7, 0xc, 0x2f, 0x85, 0xbc, 0x20, 0xda, 0x25, 0x89, 0xb3, 0x6d, 0x38, 0x1, 0x83, 0x85, 0xf2, 0xec, 0x64, 0x6a, 0xe6, 0xfb, 0x85, 0x7f, 0x61, 0xc9, 0xc0, 0x84, 0x7e, 0x74, 0x53, 0x72, 0x17, 0xbe, 0x1d, 0x26, 0x1d, 0xd6, 0xb0, 0x8a, 0xff, 0xd, 0x8d, 0x95, 0xc2, 0x84, 0xe5, 0x5, 0x63, 0x24, 0xef, 0x8b, 0xf4, 0x2b, 0x55, 0x3e, 0xdb, 0x45, 0x4f, 0xa5, 0x21, 0x9c, 0xc0, 0x8f, 0xbb, 0xee, 0x3c, 0xec, 0x83, 0x30, 0xca, 0xe2, 0xc6, 0x6d, 0x40, 0x7c, 0xd0, 0x4d, 0xbf, 0x1, 0x30, 0xf6, 0xa7, 0x6d, 0x62, 0x96, 0xe, 0xd3, 0xcb, 0x16, 0xaa, 0xfe, 0xfb, 0xa9, 0x81, 0x0, 0x13, 0x3a, 0x67, 0x5c, 0xca, 0x7e, 0xfe, 0x6a, 0x1b, 0xdd, 0x82, 0xd0, 0x4e, 0xfc, 0x48, 0xaf, 0x3, 0xb7, 0x67, 0x38, 0xa1, 0x83, 0x57, 0xaa, 0x6a, 0x5d, 0x0, 0x9a, 0xcb, 0x63, 0x24, 0x43, 0xcd, 0x6e, 0x70, 0x5c, 0xc5, 0x1e, 0xd3, 0x41, 0x76, 0x9a, 0x8e, 0x3f, 0xd3, 0x8e, 0x9f, 0x7a, 0x9e, 0x8d, 0x9, 0xed, 0x53, 0x54, 0x62, 0x93, 0x74, 0x88, 0xec, 0xe4, 0xad, 0xbe, 0xa3, 0x66, 0x55, 0x79, 0x5a, 0x50, 0x80, 0x2b, 0x44, 0x17, 0x50, 0x96, 0xc, 0x31, 0x62, 0xc, 0x98, 0x4f, 0x7a, 0xd, 0x40, 0xb3, 0xc0, 0x8c, 0xaf, 0x97, 0xcf, 0xf4, 0x48, 0xe2, 0x12, 0x58, 0xee, 0x5e, 0xd9, 0x90, 0xbb, 0xb8, 0x7e, 0x58, 0xe4, 0x5e, 0x4, 0x52, 0x81, 0x7f, 0xa5, 0x42, 0x1b, 0x2e, 0x7c, 0x1c, 0x64, 0x6, 0xb9, 0x92, 0xd7, 0xda, 0x87, 0x1c, 0xa7, 0x93, 0xf5, 0xfc, 0x9d, 0xb9, 0x0, 0x4, 0x1b, 0x77, 0x7d, 0xab, 0xc7, 0xe2, 0x70, 0x5a, 0xd8, 0x34, 0x2d, 0x95, 0x16, 0x52, 0x1a, 0x2e, 0xc3, 0x97, 0xff, 0x9, 0x7d, 0xbf, 0x8a, 0x2d, 0xa6, 0x3e, 0xe4, 0xd6, 0xca, 0xbb, 0xfe, 0xaa, 0x25, 0xda, 0x46, 0x76, 0x74, 0xbd, 0x24, 0x4e, 0xe5, 0x96, 0xc4, 0x65, 0x3, 0xe3, 0x50, 0xe8, 0x24, 0x16, 0xa4, 0x99, 0x14, 0x2b, 0xd2, 0x81, 0x67, 0xf7, 0xdd, 0xf6, 0x24, 0x81, 0x59, 0xc3, 0xbf, 0xf1, 0x55, 0xe5, 0x42, 0x38, 0x33, 0xcd, 0xfa, 0xc2, 0x19, 0x23, 0x5b, 0xd1, 0x3e, 0x88, 0x6f, 0x47, 0x50, 0x96, 0xed, 0x19, 0x16, 0x83, 0x16, 0xc3, 0x96, 0x7, 0x37, 0xaa, 0x61, 0x6b, 0x20, 0x69, 0x34, 0xb7, 0x8d, 0xe8, 0x8, 0xa9, 0x1f, 0x17, 0x5d, 0xe, 0xa, 0xfa, 0x40, 0x54, 0xb4, 0xe3, 0x71, 0x72, 0xe8, 0x98, 0xdb, 0x2b, 0x7, 0x3e, 0xe0, 0x6a, 0x7f, 0x8a, 0xb9, 0xc3, 0x28, 0x55, 0xf7, 0x87, 0x6, 0x5a, 0x76, 0x39, 0x6c, 0xd, 0xcf, 0xe3, 0x91, 0xb, 0xca, 0x3c, 0xac, 0xcd, 0x3a, 0xdb, 0xa2, 0x50, 0x3b, 0x95, 0xcb, 0x8, 0x2f, 0x8f, 0x28, 0x1a, 0xcf, 0x43, 0xcf, 0x2c, 0x58, 0x14, 0x24, 0xa8, 0xe9, 0xee, 0x60, 0xbc, 0x8b, 0xec, 0x8d, 0x42, 0xa0, 0x9a, 0x72, 0x2, 0x9f, 0xc7, 0x54, 0xd5, 0xf5, 0x32, 0x65, 0xec, 0xd5, 0x1c, 0xd8, 0x5f, 0xe1, 0x82, 0xcf, 0x3a, 0x30, 0x72, 0xa6, 0xff, 0xf5, 0x73, 0xc3, 0xe2, 0x3, 0xbd, 0xb3, 0x41, 0x63, 0xfc, 0xe7, 0xb4, 0xa8, 0xa8, 0x80, 0xdf, 0x7b, 0x8, 0xa0, 0xd6, 0x52, 0x29, 0xb7, 0x8e, 0xa3, 0x48, 0xc0, 0x9d, 0xbb, 0x3c, 0x80, 0x0, 0xb0, 0xf8, 0xcc, 0x7e, 0x65, 0xa, 0xcf, 0x9, 0xeb, 0xe1, 0x67, 0x18, 0xc0, 0x54, 0x8c, 0xfc, 0x46, 0xb6, 0xf0, 0x26, 0x10, 0xf9, 0x88, 0xd8, 0x4b, 0xff, 0x7d, 0x53, 0xf2, 0xd, 0x9d, 0x42, 0xd5, 0xc6, 0x48, 0x80, 0xc9, 0xfb, 0x4e, 0x2e, 0xf4, 0x25, 0xc9, 0x0, 0xc2, 0x9c, 0x26, 0x3e, 0xfe, 0xf6, 0xbc, 0x6a, 0x44, 0x5a, 0xb5, 0xc5, 0xe5, 0x67, 0xac, 0xd5, 0xdb, 0x2, 0xb0, 0xd8, 0x8e, 0xda, 0xee, 0x64, 0xee, 0xec, 0x91, 0xd2, 0x71, 0xe0, 0xba, 0x2d, 0xf9, 0x89, 0x89, 0x53, 0xbf, 0x7e, 0xaf, 0xe0, 0xdb, 0x45, 0x92, 0x81, 0xa7, 0xef, 0x9e, 0xe7, 0xe6, 0x41, 0xd1, 0x9f, 0x7e, 0xeb, 0x2d, 0xb, 0x49, 0x28, 0x97, 0x6b, 0x25, 0xc7, 0x2, 0xc6, 0xc3, 0x77, 0x88, 0x73, 0xaf, 0x32, 0x22, 0x1d, 0xaa, 0x9d, 0xd2, 0xe8, 0x49, 0xb0, 0x1a, 0x21, 0x90, 0x4b, 0xc9, 0x94, 0xbf, 0xe4, 0xe6, 0x53, 0xdf, 0xe4, 0xdb, 0x6, 0x10, 0x7b, 0x4d, 0xe7, 0x24, 0x73, 0x4a, 0xdf, 0x8b, 0x6a, 0xa, 0x56, 0xd4, 0x46, 0x4, 0x89, 0x55, 0xa3, 0x5c, 0x8b, 0xf9, 0xf2, 0xab, 0x39, 0xb8, 0xfa, 0x3b, 0x2d, 0x58, 0xdf, 0x46, 0xde, 0xda, 0x8a, 0x2f, 0x4, 0x4e, 0x47, 0x92, 0xc3, 0x1b, 0x7a, 0x14, 0x6a, 0x76, 0xa7, 0x36, 0x79, 0xf9, 0xc0, 0xd, 0x54, 0xf, 0x94, 0xb6, 0x25, 0x9f, 0x75, 0xf2, 0xf2, 0x8e, 0x73, 0x44, 0xc6, 0xf4, 0x19, 0xa7, 0x89, 0x57, 0xd9, 0x9d, 0x45, 0xc3, 0x50, 0x7, 0xf4, 0xb7, 0x59, 0x28, 0xd5, 0x80, 0x21, 0xb2, 0xf2, 0x8b, 0x78, 0x5e, 0x7e, 0xb4, 0x71, 0x66, 0x1, 0x5f, 0x21, 0x4b, 0x2a, 0xae, 0x8d, 0x4a, 0xca, 0x33, 0x76, 0xb6, 0xdb, 0x3c, 0xfd, 0x79, 0xf, 0x12, 0x15, 0x29, 0xde, 0xe6, 0x64, 0xb0, 0x6f, 0xa0, 0xf8, 0xc1, 0x20, 0x74, 0xd5, 0xc1, 0x8c, 0x36, 0xd5, 0xf4, 0x75, 0xe4, 0x8d, 0xe1, 0xa8, 0x51, 0xda, 0x6a, 0xb0, 0xd4, 0x49, 0xc7, 0x7c, 0xd4, 0xf0, 0xa0, 0xa5, 0x6a, 0x52, 0x74, 0x0, 0x2c, 0xfa, 0xab, 0x3c, 0x17, 0x59, 0xfc, 0x73, 0xb7, 0xf2, 0x3f, 0x9c, 0x91, 0xa0, 0xa2, 0xa5, 0x12, 0x86, 0xf6, 0x15, 0x7b, 0x4c, 0x23, 0x28, 0xae, 0xa8, 0x9c, 0xdc, 0xe7, 0xbe, 0xed, 0xaf, 0x58, 0xf6, 0xfd, 0x5f, 0x96, 0x18, 0xab, 0xad, 0xd9, 0x55, 0x2c, 0x44, 0xde, 0x0, 0x5c, 0x12, 0x1f, 0x90, 0xb9, 0x51, 0xb, 0x36, 0xee, 0xf1, 0xaa, 0x70, 0x8b, 0xe0, 0x4f, 0x60, 0x5, 0xd5, 0xa9, 0x4b, 0x3e, 0x2b, 0x77, 0xd2, 0xf0, 0x82, 0xe4, 0xb8, 0xbe, 0x99, 0x6, 0xe6, 0x2d, 0x65, 0xab, 0x16, 0xc5, 0xf9, 0xf7, 0xd4, 0xc6, 0x34, 0x1e, 0x4f, 0x1e, 0xee, 0xe4, 0xec, 0x5c, 0xbf, 0x88, 0x98, 0x23, 0x38, 0xd2, 0x3, 0xbc, 0xfe, 0x86, 0xc5, 0x7a, 0x6f, 0x3a, 0x35, 0x7d, 0x15, 0xc7, 0xd3, 0x8c, 0x65, 0xfd, 0xf1, 0xb3, 0xde, 0xaa, 0x96, 0x2, 0x5f, 0x53, 0x1e, 0x3a, 0xd4, 0xed, 0xb8, 0xe3, 0x63, 0x5, 0x9c, 0x71, 0xa8, 0xaf, 0x6a, 0x37, 0x9f, 0xc7, 0x5f, 0xbc, 0xdc, 0xd2, 0x8a, 0xcd, 0xd3, 0xc, 0x75, 0xcb, 0x9f, 0xdb, 0x3f, 0x30, 0x8e, 0xb0, 0x18, 0x44, 0x2f, 0x5, 0xff, 0x14, 0x20, 0x65, 0x2d, 0x3e, 0xcf, 0x84, 0x50, 0xf7, 0x9, 0xd5, 0x4e, 0x14, 0xf8, 0xf0, 0xbd, 0x7e, 0x98, 0x5b, 0xf2, 0xd3, 0xf2, 0xf0, 0x3b, 0xf4, 0x37, 0xd8, 0x54, 0xa3, 0xcf, 0x71, 0xad, 0x86, 0x5d, 0xf7, 0x8a, 0x86, 0xc4, 0xc8, 0xd0, 0xd9, 0xea, 0xc7, 0xc8, 0x45, 0xff, 0x5c, 0x32, 0xd7, 0xb0, 0xec, 0x81, 0xcc, 0x96, 0x19, 0x47, 0xab, 0xed, 0x24, 0x18, 0x61, 0xf3, 0x55, 0x5d, 0xff, 0xee, 0xa0, 0x77, 0x19, 0x41, 0x45, 0x31, 0xbe, 0xc6, 0x38, 0x20, 0x72, 0xc5, 0xc4, 0x85, 0x50, 0x95, 0xb4, 0x4b, 0xf9, 0xbf, 0x35, 0x53, 0x2d, 0x82, 0xa0, 0xe2, 0xc8, 0xa6, 0xd8, 0x4a, 0x89, 0x37, 0xbb, 0x11, 0x2c, 0xb2, 0x34, 0x2, 0x54, 0xa3, 0x74, 0x4c, 0xed, 0xdd, 0x66, 0x3, 0x2d, 0x5d, 0xf2, 0xc5, 0xee, 0xda, 0x68, 0xa9, 0xf9, 0x42, 0x31, 0xb6, 0x67, 0x68, 0x10, 0x60, 0x36, 0xd4, 0xb6, 0xd7, 0x68, 0x2c, 0x6d, 0xcd, 0x7, 0x42, 0x29, 0x84, 0xc, 0x9, 0x4f, 0xf7, 0xa8, 0xee, 0xb1, 0x68, 0x77, 0x4, 0x14, 0x75, 0xe2, 0xe4, 0xae, 0x62, 0xfe, 0x89, 0x7e, 0x5f, 0x4b, 0x20, 0xef, 0x94, 0x19, 0xb2, 0x59, 0xe0, 0xd1, 0x18, 0xe3, 0x8a, 0x63, 0x69, 0x3b, 0x65, 0x2a, 0x10, 0x90, 0x69, 0x2f, 0x58, 0xeb, 0xd5, 0x70, 0x4a, 0xf8, 0xf5, 0x9, 0xf7, 0x39, 0x97, 0x27, 0x36, 0x93, 0x79, 0x8b, 0x3c, 0x66, 0xa4, 0x5d, 0xeb, 0x37, 0x3c, 0x20, 0x4d, 0xf1, 0xfd, 0xfd, 0x2d, 0xfb, 0xdb, 0xa1, 0xdc, 0xa9, 0xd8, 0x32, 0x9b, 0x8f, 0xd4, 0x77, 0xf0, 0xcf, 0x40, 0xab, 0xed, 0xbb, 0x9f, 0x87, 0xb, 0x9f, 0x36, 0xf2, 0x69, 0x18, 0x9d, 0xda, 0x86, 0xae, 0xf0, 0xf, 0x45, 0x6f, 0x76, 0x56, 0x59, 0xd7, 0x51, 0x52, 0xfc, 0xd0, 0xe8, 0x2b, 0xc0, 0xd8, 0x84, 0x49, 0xf0, 0x8, 0x10, 0xd2, 0xa6, 0x95, 0xcc, 0x7e, 0x49, 0x1c, 0x1a, 0x3a, 0xa0, 0x54, 0xbd, 0x29, 0xf3, 0x50, 0x6c, 0xd2, 0xc5, 0x28, 0x98, 0xab, 0x51, 0xd2, 0xd0, 0x51, 0x7c, 0x8, 0xc0, 0x32, 0xa5, 0x50, 0xaf, 0xfb, 0xab, 0x90, 0x17, 0xf6, 0x50, 0x7, 0x4e, 0x68, 0x6b, 0xe7, 0x55, 0xdf, 0x5, 0xb0, 0x76, 0xf1, 0xa7, 0x6d, 0x51, 0xec, 0xc7, 0xdd, 0x2d, 0x7a, 0xbb, 0x53, 0x55, 0x57, 0x73, 0xfa, 0x3a, 0x55, 0xa3, 0x7c, 0xc8, 0x37, 0x51, 0xc2, 0x55, 0x4d, 0xfc, 0x3f, 0x5f, 0x31, 0x35, 0x5d, 0x3e, 0xaf, 0x2a, 0x44, 0x46, 0xe8, 0x28, 0xff, 0x95, 0x64, 0x49, 0x11, 0xb9, 0x61, 0xaf, 0xf3, 0xb5, 0x62, 0x66, 0xeb, 0xfe, 0x47, 0x34, 0x37, 0xbb, 0xa, 0x61, 0xb5, 0xfa, 0xce, 0xb1, 0x5c, 0xf3, 0x19, 0xe, 0xe6, 0x9d, 0x44, 0xb9, 0xe, 0x7f, 0x15, 0x14, 0xdb, 0xf8, 0x39, 0xd6, 0xbf, 0x61, 0x3c, 0x5b, 0xcc, 0xae, 0xff, 0x3, 0x67, 0x21, 0x41, 0x1d, 0xd4, 0xa4, 0xa5, 0xc2, 0x1c, 0x4e, 0x22, 0xed, 0xab, 0x8f, 0x7f, 0x53, 0xd9, 0x1a, 0x87, 0x86, 0x81, 0x5a, 0xd, 0x23, 0x8, 0xf9, 0x56, 0x49, 0x3a, 0xdf, 0x4b, 0x7b, 0x77, 0x1d, 0x74, 0x80, 0x50, 0xf, 0xba, 0x60, 0xf7, 0x8b, 0xf3, 0xc3, 0x71, 0x1d, 0x9, 0x2, 0x5b, 0x62, 0x9b, 0xf, 0xd5, 0x33, 0x96, 0x61, 0xde, 0xc9, 0xb8, 0x43, 0xb7, 0xec, 0x3, 0x20, 0x47, 0xe7, 0x5d, 0x54, 0x12, 0x75, 0xb4, 0xb2, 0x1c, 0xce, 0x74, 0xc9, 0xef, 0x9d, 0x9f, 0xef, 0x32, 0xbd, 0x0, 0x6a, 0x4f, 0x4a, 0x77, 0x52, 0x9a, 0x79, 0x1, 0xa6, 0x8e, 0xd, 0x19, 0x52, 0x29, 0x6d, 0xb8, 0x41, 0xec, 0xc, 0xa2, 0x7c, 0x2a, 0xff, 0x7f, 0xb2, 0xff, 0x62, 0x30, 0x37, 0x9d, 0xf1, 0x79, 0xe5, 0x32, 0x1b, 0x74, 0x47, 0x7d, 0xb5, 0x4e, 0x81, 0x81, 0xd, 0xf8, 0x6b, 0xf0, 0xae, 0x16, 0xd4, 0xe, 0x2d, 0x7a, 0x88, 0xb5, 0xec, 0x1c, 0xb0, 0x5f, 0x73, 0x9, 0x5b, 0x1f, 0x6, 0xc6, 0xaa, 0xca, 0x41, 0x16, 0x5b, 0x1e, 0x13, 0xb0, 0x2, 0xc0, 0x7b, 0x32, 0xd9, 0x14, 0x25, 0xcb, 0xd5, 0xe6, 0x39, 0x17, 0x43, 0x15, 0xa8, 0x55, 0xfe, 0xda, 0xcb, 0xc8, 0x43, 0x72, 0x13, 0xe1, 0x6c, 0xa3, 0xb1, 0x5b, 0x27, 0x53, 0x32, 0x17, 0xc5, 0xa3, 0x5d, 0x20, 0x7e, 0x5, 0x5a, 0x51, 0x36, 0x1a, 0x5c, 0xc3, 0x9b, 0x5f, 0x92, 0x42, 0xc9, 0x64, 0xf, 0xf0, 0x7a, 0x9f, 0xd5, 0xb7, 0x3c, 0x63, 0x14, 0xbd, 0x3a, 0x8c, 0x6e, 0x65, 0x71, 0xd1, 0x2a, 0xae, 0x5, 0x7, 0xcd, 0x1a, 0x63, 0xa4, 0xe2, 0xc0, 0x5c, 0x5, 0xb6, 0xa0, 0x8a, 0x6a, 0x6f, 0x0, 0x6e, 0xa2, 0x65, 0x2b, 0xd7, 0x13, 0x45, 0xaf, 0xbc, 0xd5, 0x16, 0xd6, 0x14, 0x9e, 0x54, 0x3f, 0x1f, 0x3b, 0x25, 0x71, 0x55, 0x39, 0xee, 0x64, 0x3a, 0x24, 0xce, 0xb8, 0xc1, 0xb, 0xb1, 0xe8, 0x77, 0x4e, 0x3a, 0x91, 0xe5, 0xac, 0xbe, 0xbc, 0xbd, 0x7d, 0xf3, 0x41, 0x43, 0x0, 0xc1, 0x47, 0xf6, 0xec, 0x68, 0x61, 0xe3, 0xca, 0xec, 0x96, 0xa3, 0x6a, 0xa4, 0x1c, 0x9d, 0xe5, 0xbd, 0x65, 0xfa, 0x8f, 0x69, 0xb8, 0x7a, 0x2, 0xa7, 0x38, 0x37, 0x44, 0xc3, 0x6d, 0xc8, 0x9d, 0xb8, 0xa2, 0x3f, 0x15, 0xa4, 0x43, 0x8d, 0x11, 0xa, 0x5a, 0xd8, 0x2f, 0xe2, 0x1c, 0x86, 0xa, 0x33, 0x9e, 0xbc, 0xd3, 0xbb, 0xb3, 0xf6, 0x2a, 0x38, 0x28, 0xa7, 0xd6, 0x79, 0xf7, 0x56, 0x22, 0xd3, 0x68, 0x4e, 0x28, 0xe7, 0x19, 0x4d, 0x3b, 0x42, 0x20, 0x53, 0xb1, 0xf3, 0x38, 0x1b, 0xaa, 0x19, 0xde, 0x3, 0xf7, 0x44, 0x84, 0xc2, 0xb6, 0xd0, 0x73, 0xa3, 0xe6, 0x64, 0x9c, 0x48, 0x61, 0x61, 0x66, 0x24, 0x62, 0x25, 0x37, 0x37, 0x7c, 0x58, 0x99, 0x63, 0x15, 0x33, 0x61, 0xfe, 0x77, 0x52, 0x6f, 0x2e, 0x50, 0x56, 0xa6, 0x4a, 0xad, 0x74, 0x71, 0x71, 0x2, 0x1e, 0xd8, 0xc0, 0x27, 0x2e, 0xb, 0x7c, 0x31, 0x7a, 0x11, 0x96, 0x75, 0x7a, 0xa6, 0x99, 0x3d, 0x72, 0xa6, 0x28, 0x89, 0xf0, 0x17, 0xa3, 0x10, 0x53, 0x48, 0x81, 0x56, 0xa7, 0x71, 0xa9, 0x6c, 0xb6, 0xaf, 0x62, 0x54, 0x46, 0x90, 0x9d, 0x22, 0xbe, 0xfb, 0xcc, 0x97, 0x5e, 0x18, 0xc2, 0x8f, 0xad, 0xdd, 0x6a, 0x60, 0x1a, 0x6a, 0xcf, 0x97, 0xc7, 0xb3, 0x16, 0xf3, 0x31, 0x24, 0x8d, 0x91, 0x33, 0x1, 0x92, 0xfc, 0x1f, 0xec, 0x97, 0xef, 0xc9, 0xb2, 0x5e, 0xbf, 0xd9, 0x15, 0x9a, 0xbb, 0x6c, 0xfc, 0x42, 0xb5, 0x85, 0x78, 0x5d, 0xcf, 0x20, 0x57, 0x53, 0x64, 0xbe, 0x8a, 0xab, 0x68, 0xec, 0xd4, 0xce, 0x5d, 0x71, 0x4e, 0xa3, 0x24, 0x9c, 0x27, 0x14, 0x76, 0xa6, 0x57, 0xcf, 0x61, 0xbb, 0x31, 0x2a, 0xd5, 0x8e, 0x78, 0x3, 0xa0, 0x37, 0xf4, 0x44, 0x24, 0xa8, 0xab, 0x32, 0x94, 0x52, 0x93, 0x11, 0x40, 0x3, 0x47, 0x62, 0x34, 0x74, 0x30, 0xdd, 0x6b, 0x10, 0x1f, 0xca, 0xd8, 0x66, 0xcd, 0x64, 0x99, 0xfb, 0xab, 0xd5, 0xad, 0xbd, 0xe9, 0x5a, 0x9d, 0x4d, 0x93, 0x22, 0x3d, 0x8e, 0x90, 0x15, 0xd8, 0x76, 0x59, 0xbd, 0x57, 0xe0, 0x28, 0x2f, 0x36, 0x4a, 0x34, 0xb3, 0xdf, 0x43, 0x54, 0xdc, 0xda, 0x2c, 0xf9, 0x3b, 0x60, 0x89, 0xf0, 0xad, 0x97, 0x12, 0x0, 0x27, 0x14, 0x15, 0x20, 0x4f, 0x82, 0x99, 0x7f, 0x6, 0x2, 0x43, 0x92, 0xb6, 0x28, 0x68, 0x20, 0x57, 0x23, 0x11, 0xe1, 0xd7, 0x97, 0x90, 0xaa, 0xec, 0x14, 0xe4, 0x9, 0xf2, 0xa2, 0xf9, 0xac, 0x56, 0x53, 0x91, 0x27, 0xda, 0xc9, 0xda, 0xdb, 0xe3, 0xfe, 0x1e, 0x0, 0xb7, 0x34, 0x7, 0x7e, 0xe2, 0x88, 0xb2, 0xd2, 0xbb, 0xb5, 0xfa, 0x54, 0x9c, 0xd0, 0x2d, 0xf6, 0xc4, 0xf, 0x63, 0x4c, 0x6b, 0x6, 0x44, 0x50, 0x60, 0xce, 0x2f, 0x4a, 0xf4, 0x47, 0x3a, 0xfa, 0x9c, 0x1, 0x4a, 0x90, 0x60, 0xa, 0x5c, 0xc, 0x9c, 0xea, 0x81, 0xba, 0xbd, 0x98, 0xc0, 0x96, 0xd, 0xea, 0xe4, 0xd7, 0x2, 0xa, 0xd5, 0x9c, 0x41, 0x0, 0xe7, 0xef, 0x8c, 0x4, 0x7f, 0x2d, 0xd4, 0x39, 0xc8, 0xc0, 0x1f, 0x56, 0x9b, 0xe0, 0x64, 0xf2, 0xda, 0xe2, 0x8b, 0xb1, 0x34, 0x50, 0x18, 0x13, 0xbc, 0xc, 0xe1, 0xa5, 0x70, 0xbd, 0x66, 0x3e, 0x88, 0x6d, 0x13, 0xe7, 0x5d, 0xd0, 0xc1, 0x84, 0xd8, 0x9b, 0x7d, 0x48, 0xd8, 0xd4, 0x45, 0xd4, 0xd9, 0x48, 0x5, 0xe4, 0xea, 0xe, 0x8b, 0xcd, 0x40, 0x84, 0x3e, 0xf8, 0x26, 0x3d, 0x29, 0xf, 0xcd, 0xa3, 0xe4, 0xc5, 0xa3, 0x22, 0x30, 0x45, 0xd9, 0x3f, 0xa7, 0x2c, 0xfa, 0x3f, 0x66, 0x78, 0xa0, 0x63, 0x97, 0xa0, 0xd4, 0x0, 0x29, 0xdd, 0xea, 0xbf, 0x7a, 0x3f, 0x32, 0x88, 0xe3, 0xf2, 0xe5, 0x11, 0xcd, 0x84, 0x75, 0x92, 0xc2, 0x74, 0x7a, 0xe0, 0x2d, 0x3d, 0x61, 0x95, 0x34, 0x4b, 0x77, 0x1e, 0x88, 0x74, 0x78, 0x2c, 0xc5, 0x52, 0x9b, 0x9c, 0x8, 0x1f, 0x42, 0xbe, 0x3e, 0x3c, 0xdd, 0x3c, 0x5f, 0x3d, 0x3e, 0x22, 0x9e, 0x81, 0xf7, 0x5f, 0xb9, 0x9, 0xda, 0xc1, 0xb2, 0x39, 0x87, 0xba, 0x1b, 0x49, 0x8b, 0x4e, 0x16, 0x63, 0x72, 0x6b, 0xba, 0x32, 0x84, 0xd6, 0x59, 0xa5, 0xae, 0x13, 0xdb, 0x15, 0x39, 0xd3, 0xfb, 0x43, 0x0, 0x94, 0x8, 0xda, 0xe8, 0xe2, 0x94, 0x7c, 0x6c, 0x47, 0xbb, 0x65, 0x30, 0x44, 0xc4, 0x30, 0x16, 0x6b, 0x75, 0x6c, 0xf0, 0x19, 0x6d, 0x54, 0xd8, 0xd6, 0xbd, 0x5a, 0xb3, 0x2e, 0xc2, 0x98, 0x1e, 0x7e, 0x8e, 0x7d, 0x15, 0xf0, 0x10, 0x93, 0x1c, 0x75, 0x75, 0x60, 0xfa, 0xf6, 0x27, 0x43, 0xf8, 0xde, 0xef, 0x3b, 0x94, 0xa0, 0x3c, 0xd1, 0xaf, 0xb5, 0xcc, 0xb1, 0xab, 0x57, 0x29, 0x77, 0x51, 0xd6, 0xbc, 0xb5, 0x61, 0x9b, 0xdc, 0x52, 0x5a, 0x9d, 0xcd, 0x31, 0x6e, 0x80, 0xa6, 0xfa, 0xce, 0x85, 0xea, 0x1d, 0xa, 0x72, 0x7a, 0x25, 0x84, 0xab, 0x35, 0xd, 0xd7, 0xce, 0x1b, 0x26, 0x60, 0x6a, 0x61, 0xda, 0xd6, 0xb9, 0x4d, 0xf9, 0x23, 0xc0, 0xe, 0xae, 0xa0, 0x54, 0xec, 0x7e, 0x7f, 0x94, 0xe, 0x4e, 0x7a, 0x3a, 0x3c, 0x99, 0x5b, 0x76, 0x14, 0xd3, 0x79, 0x9d, 0xef, 0x4a, 0x8f, 0xfb, 0x24, 0xeb, 0x19, 0x2a, 0xe, 0xc5, 0xa2, 0x5e, 0x8c, 0xbc, 0x91, 0xb8, 0xe5, 0x16, 0x50, 0x92, 0xe7, 0xec, 0xd1, 0x3a, 0xdc, 0xaf, 0x70, 0x8f, 0xe2, 0xab, 0x8f, 0xf0, 0x4c, 0xa8, 0xbb, 0xa, 0x2b, 0x13, 0xf6, 0x15, 0xc8, 0x22, 0x99, 0xa, 0x77, 0x6d, 0x7, 0x5d, 0x73, 0x13, 0x2, 0x6c, 0x87, 0xb7, 0x83, 0x9f, 0x56, 0x87, 0xb7, 0xc3, 0xd7, 0xdd, 0x94, 0x36, 0x26, 0x49, 0xd2, 0xd6, 0x2e, 0xa0, 0x70, 0x5d, 0x94, 0x48, 0xd2, 0x58, 0x6a, 0x8c, 0x27, 0x8c, 0xe, 0x67, 0x16, 0xac, 0xe6, 0xb6, 0x70, 0xe3, 0x58, 0x4d, 0xa9, 0x71, 0x5, 0xdb, 0x53, 0x2, 0x84, 0x63, 0xd7, 0xe4, 0xfe, 0x2c, 0xb3, 0x14, 0x88, 0xc9, 0xb1, 0x99, 0x95, 0xcc, 0x78, 0xcc, 0x70, 0xd8, 0x6b, 0x4e, 0x61, 0x39, 0x45, 0xa4, 0x15, 0x26, 0xaf, 0x0, 0x2c, 0x11, 0x3d, 0x99, 0x4b, 0x49, 0x5, 0x17, 0x52, 0xd6, 0xcd, 0xa1, 0x2a, 0xe1, 0x32, 0x0, 0xb3, 0x9c, 0x6d, 0x4, 0x12, 0xa6, 0xbf, 0xe, 0x8c, 0x72, 0x63, 0x1b, 0xf3, 0xa9, 0x3, 0x9f, 0x5, 0x2b, 0x2, 0xde, 0xa2, 0x18, 0x36, 0x8f, 0xc9, 0xc5, 0x77, 0x3e, 0x90, 0x4d, 0xb2, 0xd5, 0x7c, 0xb7, 0xac, 0x72, 0xa3, 0x38, 0x78, 0x83, 0x14, 0x36, 0xb6, 0xc8, 0x79, 0xca, 0xf7, 0xf5, 0x3c, 0x90, 0xf4, 0x8a, 0x15, 0xb2, 0xbf, 0xf3, 0xd3, 0x7b, 0xd4, 0x96, 0x54, 0x9f, 0xdb, 0x2b, 0xba, 0x63, 0x8a, 0xe, 0x30, 0x15, 0xe7, 0xd6, 0xc4, 0xbe, 0x93, 0x7a, 0x49, 0xa, 0xe9, 0x67, 0xee, 0x63, 0x1e, 0x8c, 0x8b, 0x47, 0x13, 0x86, 0x61, 0xe5, 0xdd, 0xf2, 0xc8, 0xd9, 0x6b, 0xe3, 0x89, 0x86, 0x76, 0x8a, 0x51, 0x86, 0x14, 0x68, 0x47, 0xb0, 0xce, 0x8f, 0xd9, 0xcb, 0x65, 0xfe, 0xa1, 0x11, 0x8b, 0x3f, 0xf5, 0x2e, 0x87, 0xde, 0x2f, 0x80, 0xec, 0x8f, 0x3d, 0xd, 0xba, 0x9a, 0x1d, 0x38, 0x9f, 0x9a, 0x32, 0x1d, 0x9f, 0x13, 0x8d, 0x95, 0x87, 0xc5, 0xd9, 0xae, 0x21, 0x7, 0xda, 0xa7, 0xf6, 0xb9, 0x5c, 0x1, 0x6a, 0x6, 0x6, 0x9d, 0x5d, 0xed, 0xe3, 0xc4, 0x9e, 0x5, 0x1f, 0xca, 0xba, 0x6c, 0x71, 0x85, 0x42, 0x14, 0x1c, 0x53, 0xaa, 0x94, 0x94, 0x7a, 0x61, 0xef, 0x87, 0xad, 0xf4, 0xd6, 0x2f, 0x5e, 0xc3, 0x9a, 0xfb, 0x68, 0x24, 0x12, 0x47, 0xa0, 0xd2, 0xbc, 0xa6, 0x5c, 0x7c, 0xef, 0x3f, 0x42, 0x7a, 0xbd, 0x40, 0x80, 0x4c, 0x6, 0x52, 0xcb, 0x58, 0xab, 0x16, 0x47, 0x64, 0x4a, 0xd5, 0x4e, 0xef, 0x93, 0x8d, 0xd4, 0x2c, 0xc3, 0x97, 0x70, 0xd1, 0xf7, 0x42, 0xcf, 0x7f, 0xd1, 0x73, 0xa1, 0x49, 0xb2, 0xf5, 0xcd, 0x98, 0xe2, 0xff, 0xf, 0xfe, 0x66, 0xb6, 0x51, 0x2e, 0x7b, 0xa4, 0xbe, 0x61, 0x3f, 0xa4, 0xaf, 0xd3, 0xba, 0x17, 0x21, 0x37, 0x7d, 0x2f, 0x6e, 0x65, 0xef, 0x9c, 0xa0, 0x21, 0x65, 0xe7, 0x8f, 0xa5, 0xe8, 0x66, 0xc9, 0xb8, 0xb3, 0xc7, 0xeb, 0x47, 0x5a, 0x11, 0x3a, 0x20, 0x25, 0x73, 0xe5, 0x4b, 0x5c, 0x8d, 0x58, 0x81, 0xfe, 0x3c, 0xa0, 0x49, 0x1f, 0xf3, 0xe2, 0x32, 0x61, 0xc4, 0xec, 0xa7, 0xb7, 0x8, 0xc1, 0xe5, 0xbb, 0x4c, 0x2e, 0xd2, 0xbf, 0x8e, 0xa7, 0xa5, 0x62, 0xd2, 0x8b, 0x18, 0xdf, 0x33, 0x40, 0x97, 0xb7, 0xae, 0xd1, 0xf7, 0x4d, 0xea, 0xde, 0x11, 0xcf, 0xea, 0xe3, 0xac, 0x53, 0x4a, 0x77, 0xcc, 0x99, 0xf6, 0xc1, 0x5c, 0x10, 0x71, 0x3a, 0x37, 0xe0, 0x20, 0x7a, 0x3d, 0x13, 0x7f, 0x98, 0x51, 0xd7, 0x71, 0x58, 0x21, 0xae, 0x4, 0xee, 0x86, 0xab, 0x99, 0x2c, 0x8c, 0xf, 0x13, 0xb0, 0x1a, 0xec, 0xc2, 0x25, 0x77, 0xf1, 0x8f, 0x96, 0xe8, 0x60, 0xb, 0x98, 0xa, 0x94, 0x93, 0xa5, 0xa4, 0xe1, 0xb1, 0xcc, 0xe9, 0x20, 0xb0, 0x15, 0xed, 0x15, 0xec, 0xb, 0xa0, 0x64, 0xcc, 0x54, 0xd7, 0x77, 0x82, 0x73, 0x68, 0x41, 0x33, 0x9c, 0xd0, 0x90, 0x51, 0xb6, 0x1f, 0xc3, 0x2d, 0xe0, 0x4f, 0x29, 0x53, 0xae, 0x94, 0x1c, 0x1a, 0xcd, 0x72, 0x83, 0xe6, 0x10, 0xcd, 0x80, 0xa2, 0xf9, 0x94, 0x20, 0xa7, 0xd, 0x8a, 0x7b, 0xaa, 0x32, 0x52, 0x4, 0x4e, 0x24, 0x3, 0x9c, 0xb6, 0x81, 0x9a, 0x96, 0x55, 0xd9, 0x98, 0x7e, 0xca, 0xb4, 0x93, 0x12, 0xb0, 0x3a, 0x8f, 0xd6, 0x1d, 0x42, 0x31, 0x16, 0x82, 0x8c, 0x73, 0xc3, 0x22, 0x64, 0x10, 0xa0, 0xf9, 0x4f, 0x2c, 0xf8, 0x45, 0x38, 0xf4, 0xc5, 0x8f, 0xf5, 0xa0, 0x1a, 0xbe, 0xac, 0x79, 0xb4, 0x3b, 0x70, 0xc2, 0x1a, 0x7a, 0x10, 0x37, 0x85, 0xb5, 0x57, 0xc8, 0x6b, 0xd8, 0x58, 0x92, 0xb4, 0xd1, 0xcc, 0xda, 0xbc, 0xde, 0x14, 0xdf, 0x57, 0x29, 0x85, 0xae, 0xc4, 0xd7, 0x68, 0xab, 0x24, 0xd0, 0x59, 0x4e, 0x73, 0xd4, 0xb5, 0xd8, 0x7e, 0x80, 0xcc, 0x95, 0xc4, 0xc8, 0x40, 0x87, 0x5f, 0xb3, 0xb9, 0x1d, 0x29, 0x5a, 0xdd, 0xae, 0x84, 0xbe, 0x95, 0xb9, 0x4f, 0xf8, 0x60, 0xb3, 0x80, 0xfa, 0x76, 0x1a, 0xa6, 0x8d, 0xc6, 0xd5, 0x55, 0xdc, 0x54, 0x15, 0xca, 0x1d, 0x44, 0x8b, 0x59, 0x9c, 0x27, 0x3b, 0x77, 0xb9, 0x23, 0x99, 0xd3, 0xfc, 0x9e, 0xbf, 0x36, 0x3c, 0x1d, 0x33, 0x33, 0x99, 0xe3, 0x8d, 0x29, 0x8e, 0x84, 0x4c, 0x2d, 0x56, 0x7f, 0xa2, 0xa1, 0x77, 0x8e, 0xdb, 0xcf, 0x70, 0xab, 0xb8, 0x57, 0xea, 0x55, 0xc8, 0x94, 0xba, 0x79, 0x78, 0x6f, 0xae, 0x9d, 0xdb, 0xdc, 0x38, 0x6a, 0x63, 0x7f, 0x36, 0x7, 0x4f, 0x4c, 0xcb, 0xd5, 0x76, 0xe, 0xb7, 0x3f, 0x94, 0x9f, 0x8b, 0x8b, 0xb6, 0xa8, 0xba, 0x10, 0x35, 0xb0, 0x1f, 0x7a, 0xd0, 0x9e, 0xa, 0x78, 0x46, 0xc2, 0xc2, 0x9f, 0x54, 0x6d, 0x15, 0x14, 0x5, 0x3c, 0xca, 0x81, 0x77, 0x60, 0x31, 0x3f, 0x95, 0xc2, 0x13, 0x54, 0xd9, 0xd8, 0x69, 0x2c, 0x5e, 0x95, 0xe3, 0x82, 0xd2, 0x7b, 0xdc, 0xfa, 0x0, 0xb3, 0xb4, 0x1, 0x79, 0xc2, 0x63, 0x11, 0x4b, 0xa1, 0xf3, 0x8b, 0x9b, 0x89, 0xe0, 0x36, 0x92, 0xfd, 0xa, 0xda, 0xc6, 0xcb, 0xec, 0x91, 0xb0, 0x42, 0x97, 0xd2, 0xd1, 0x5a, 0x6f, 0xac, 0x1d, 0xbb, 0x6e, 0xf7, 0x1c, 0xa9, 0x53, 0x1d, 0xe6, 0x80, 0xe7, 0x1e, 0x1f, 0xd3, 0x12, 0xa4, 0x10, 0x41, 0x77, 0xcf, 0xef, 0x13, 0xba, 0xc3, 0x87, 0x2d, 0x76, 0xd, 0x45, 0xdf, 0xb4, 0x4b, 0x37, 0x1f, 0x9a, 0x51, 0x47, 0x41, 0x2, 0x86, 0x28, 0x20, 0xf0, 0x72, 0xb3, 0x26, 0xac, 0x1e, 0x98, 0xd0, 0xc8, 0xeb, 0x85, 0xa7, 0xca, 0xa7, 0xd4, 0xa9, 0xe9, 0x58, 0xdf, 0xdb, 0xd, 0xc5, 0x53, 0xd9, 0x8f, 0xf, 0x59, 0xfd, 0xcc, 0x61, 0x63, 0x9d, 0x17, 0xc9, 0xe6, 0x44, 0x6b, 0x62, 0xe9, 0x72, 0xcf, 0x64, 0xeb, 0x22, 0x10, 0x61, 0xd9, 0x7f, 0xf3, 0x88, 0xb2, 0x9e, 0x7e, 0xbb, 0x3e, 0x86, 0x3, 0x44, 0x7e, 0x9, 0xa, 0xa, 0xe1, 0x15, 0x65, 0x46, 0x85, 0x19, 0x86, 0xa, 0x3d, 0xcb, 0x26, 0x48, 0x7d, 0xd6, 0x11, 0xe2, 0xd8, 0x88, 0x39, 0x28, 0x9d, 0xb, 0x6e, 0xf6, 0x9a, 0xb3, 0xa8, 0x5c, 0x47, 0xbd, 0x88, 0x45, 0xf9, 0xa5, 0xb, 0xb8, 0x77, 0xc0, 0x66, 0x79, 0x6b, 0xe0, 0x6c, 0xc2, 0x27, 0xda, 0x85, 0x14, 0xdb, 0xfe, 0xe0, 0xd5, 0xf, 0xfe, 0x3a, 0xd3, 0x90, 0xd2, 0x3d, 0x58, 0x6, 0x13, 0xf3, 0x2, 0x62, 0x68, 0x2e, 0x62, 0x7c, 0x43, 0xa0, 0xd, 0xb1, 0x5, 0xc8, 0x7b, 0x6a, 0x7, 0xf, 0xaa, 0x9a, 0xbf, 0x43, 0x4e, 0x8f, 0x8f, 0xfb, 0x4e, 0xe9, 0x25, 0x6d, 0xc2, 0x3d, 0xfa, 0xb7, 0xc9, 0x35, 0x8a, 0xc5, 0x3, 0xff, 0x96, 0x93, 0xfb, 0xe5, 0xe0, 0xce, 0x94, 0xc3, 0xeb, 0x43, 0x38, 0x7e, 0xa7, 0x60, 0xde, 0x61, 0x83, 0x95, 0x65, 0xde, 0xce, 0x40, 0xb5, 0x22, 0xc, 0x9, 0x75, 0x90, 0xbf, 0xd4, 0x67, 0xc2, 0xb7, 0xaa, 0x42, 0xde, 0x2c, 0x93, 0xd6, 0xb0, 0x5a, 0xed, 0xf9, 0x18, 0xba, 0xd9, 0x60, 0x46, 0x6e, 0xa6, 0x2a, 0xa6, 0x3b, 0x6a, 0xa9, 0x9e, 0xab, 0x7b, 0xf9, 0x4b, 0xb2, 0x32, 0xe, 0xb6, 0xe3, 0x42, 0x96, 0x3, 0x5d, 0xd5, 0x9b, 0x4d, 0x7c, 0x6, 0x45, 0x6a, 0x4e, 0xa4, 0xa6, 0xd4, 0x7e, 0x9e, 0x5b, 0x6c, 0x66, 0xb0, 0x31, 0x8a, 0x67, 0xf5, 0x7c, 0x7b, 0x87, 0x20, 0xb6, 0x98, 0x39, 0xae, 0x1, 0x3, 0xd5, 0x96, 0xb3, 0xf, 0xc0, 0xc5, 0x57, 0x42, 0x73, 0xa6, 0x72, 0xe6, 0x4, 0xa0, 0x18, 0xfb, 0xf9, 0x51, 0x88, 0x75, 0xe8, 0xeb, 0xd8, 0x8b, 0xff, 0x44, 0xba, 0x99, 0x5d, 0xc6, 0xe4, 0x64, 0x1e, 0xb7, 0x93, 0xfd, 0x7d, 0xdf, 0xae, 0x8e, 0x4b, 0x8c, 0x6b, 0xe7, 0x4, 0x98, 0x2a, 0x2f, 0xba, 0xbd, 0xdd, 0x56, 0x9b, 0xf0, 0xa2, 0x2, 0xae, 0xf3, 0x1c, 0x2f, 0x8a, 0xac, 0xb5, 0x39, 0x13, 0xd, 0xff, 0x9d, 0x83, 0xc7, 0x69, 0xb5, 0xf2, 0x3d, 0xa4, 0xe9, 0xfe, 0x64, 0xe8, 0xb9, 0xb0, 0x4e, 0x6, 0xbb, 0x77, 0x41, 0xca, 0xf8, 0x4f, 0x63, 0x9f, 0x24, 0xfd, 0x12, 0x28, 0x5a, 0x14, 0x9a, 0x68, 0x6f, 0xf8, 0xac, 0xbe, 0xb7, 0x3a, 0x5e, 0x5f, 0xd3, 0x1, 0x27, 0xec, 0xaf, 0x9b, 0xb7, 0xc7, 0x57, 0xae, 0xdd, 0x3f, 0xa2, 0xbb, 0x22, 0x25, 0x93, 0x1b, 0xf2, 0x42, 0x53, 0x34, 0xa3, 0x4a, 0x6d, 0x55, 0xfe, 0x80, 0x9c, 0xfd, 0x61, 0xbb, 0x25, 0x65, 0xba, 0x7, 0x39, 0xa0, 0x33, 0x89, 0x21, 0xff, 0xe1, 0x10, 0xb0, 0x38, 0x7b, 0x11, 0x52, 0xaa, 0x54, 0xb6, 0x66, 0xc0, 0xea, 0xe6, 0xf2, 0x94, 0x20, 0x19, 0x14, 0x8e, 0xb2, 0xf2, 0x32, 0xd, 0xca, 0x7d, 0xa2, 0x66, 0x92, 0xbe, 0xab, 0xfb, 0x21, 0xb1, 0xe6, 0xb2, 0x76, 0x0, 0x33, 0xe1, 0xfb, 0x50, 0x18, 0x28, 0x15, 0x0, 0x89, 0x97, 0xec, 0x81, 0x35, 0x9, 0xf5, 0x77, 0xff, 0x75, 0xed, 0xdd, 0xb1, 0x69, 0x5, 0x51, 0x10, 0xab, 0x8f, 0xb1, 0xf0, 0x7c, 0xef, 0xcf, 0x9c, 0xa8, 0x31, 0xed, 0x3c, 0x95, 0x9, 0x40, 0x91, 0xeb, 0x5f, 0xf8, 0x51, 0x31, 0xad, 0x48, 0xed, 0x88, 0x87, 0x1b, 0x9f, 0x3c, 0x1e, 0xb2, 0xf, 0xe9, 0xe0, 0x7, 0x8f, 0xa1, 0xa1, 0xfc, 0xa7, 0xbb, 0x80, 0x2b, 0xfd, 0x0, 0xb5, 0x67, 0xcd, 0x95, 0x27, 0x7f, 0x38, 0x20, 0xf7, 0x7, 0x97, 0xd3, 0xe7, 0xa4, 0x89, 0x5b, 0xce, 0x7, 0x44, 0x89, 0x3f, 0xad, 0x83, 0x8f, 0x32, 0x61, 0x22, 0x6c, 0x94, 0x5b, 0x2, 0xa0, 0x3b, 0xc1, 0x6, 0xf9, 0xc7, 0x63, 0x95, 0xc7, 0x25, 0xb0, 0x7b, 0x4e, 0x31, 0x8f, 0x54, 0x5f, 0x1f, 0xc, 0xde, 0x4f, 0x49, 0x89, 0x75, 0xff, 0x20, 0xec, 0xb6, 0xe5, 0xbe, 0x1a, 0x8a, 0xbf, 0x6c, 0xdb, 0xe1, 0x87, 0xfb, 0x78, 0x22, 0x70, 0x8f, 0x65, 0xed, 0x35, 0x7a, 0xad, 0x47, 0xc4, 0xf2, 0xcc, 0xd0, 0x3, 0x38, 0xaa, 0xd4, 0x48, 0x3, 0x7c, 0x9a, 0x81, 0x38, 0xb3, 0xac, 0x80, 0xcc, 0xce, 0x17, 0x6e, 0x9e, 0xc8, 0xc7, 0x9b, 0x82, 0x1d, 0xbe, 0x3, 0x8b, 0x6b, 0x73, 0x46, 0xaa, 0x5e, 0x3b, 0xd4, 0x42, 0xf7, 0x26, 0x21, 0x85, 0x9b, 0xa5, 0xdf, 0x66, 0x7, 0x4a, 0x5, 0x45, 0xfd, 0x6b, 0x12, 0x36, 0x5e, 0xd, 0x9d, 0x8f, 0x8a, 0x4f, 0x38, 0xd7, 0xfb, 0xf8, 0xa1, 0xcc, 0xfc, 0x63, 0xd5, 0xf5, 0x80, 0x76, 0x31, 0x28, 0xa9, 0x80, 0xf2, 0x55, 0x50, 0xca, 0x48, 0xcf, 0x78, 0xb5, 0x27, 0xb2, 0x81, 0xb, 0xe0, 0x14, 0xa5, 0x94, 0x29, 0x18, 0xd9, 0xaa, 0x10, 0xc0, 0xcd, 0x8b, 0x35, 0x1f, 0x30, 0x3f, 0xe6, 0xf8, 0x47, 0x9d, 0xa, 0x99, 0x9e, 0x68, 0x7, 0x3a, 0xd4, 0x43, 0x4f, 0x2f, 0x9e, 0x68, 0x1f, 0x4, 0x9, 0x92, 0x90, 0x16, 0x2a, 0x54, 0x4d, 0x7, 0xa7, 0xa0, 0x9c, 0xd5, 0x93, 0xa2, 0xae, 0x65, 0x80, 0xc6, 0x8a, 0x45, 0xfe, 0x61, 0xd0, 0x8c, 0x0, 0x90, 0x0, 0x1b, 0xbf, 0x33, 0x10, 0xb6, 0x6d, 0x8a, 0xc0, 0x58, 0x95, 0x74, 0x29, 0x94, 0x87, 0x5d, 0xc3, 0xa7, 0xd3, 0xe6, 0xe, 0xe5, 0xba, 0x56, 0x3, 0x58, 0x65, 0x2e, 0x4, 0xfd, 0x22, 0x33, 0x64, 0x8d, 0x69, 0x59, 0x9f, 0x67, 0x19, 0xa6, 0x50, 0x15, 0xae, 0x79, 0x93, 0x1e, 0x98, 0xc9, 0xfc, 0x62, 0xae, 0xb9, 0x64, 0xc6, 0x34, 0x29, 0x6d, 0x31, 0xd6, 0xd3, 0xae, 0xeb, 0x65, 0x4e, 0x5e, 0x2, 0xb3, 0x54, 0x24, 0x28, 0x4, 0x95, 0xf9, 0x47, 0xf6, 0x9, 0xab, 0xcd, 0x71, 0x6e, 0xa6, 0x50, 0x9e, 0xc9, 0x34, 0xe9, 0x13, 0xb7, 0x75, 0x15, 0xf9, 0x94, 0x17, 0xb9, 0x57, 0x45, 0xe0, 0x90, 0xde, 0x40, 0x1e, 0x18, 0x56, 0x7d, 0x26, 0x8b, 0x8c, 0x17, 0x3c, 0xad, 0x32, 0x79, 0xc9, 0x7d, 0x10, 0x62, 0x90, 0xd3, 0x1b, 0x31, 0x81, 0x52, 0x1d, 0x20, 0xa2, 0x9e, 0xb7, 0x5b, 0xbc, 0xeb, 0x5e, 0xd6, 0x35, 0xd0, 0xf4, 0x5c, 0xb7, 0xa6, 0xf, 0x61, 0xef, 0x30, 0xca, 0xe0, 0x99, 0x61, 0x2a, 0x70, 0xc1, 0xe8, 0xa, 0x56, 0x99, 0x6b, 0x6a, 0xd4, 0xbf, 0xc, 0xc3, 0x1c, 0x61, 0xe6, 0xd5, 0x6b, 0xb7, 0x6a, 0x98, 0x5b, 0x75, 0x8b, 0xb7, 0xe, 0x1e, 0xbd, 0x4b, 0x91, 0x34, 0x77, 0x9f, 0xf3, 0x7e, 0xea, 0x56, 0x95, 0xa1, 0xff, 0x4c, 0xc0, 0xe2, 0x57, 0x31, 0xd5, 0x69, 0xce, 0x8e, 0x8b, 0xf7, 0x65, 0x4, 0xe1, 0xa6, 0x78, 0x26, 0xe5, 0xd4, 0x7b, 0xa3, 0x14, 0xf6, 0xec, 0xe5, 0x40, 0x3e, 0xc2, 0x74, 0xfa, 0x6, 0x4, 0x9d, 0xf2, 0x74, 0x86, 0xd, 0x28, 0x61, 0xd8, 0x95, 0xfc, 0x6a, 0x9f, 0x8, 0xf1, 0xae, 0x2, 0xc7, 0xea, 0xba, 0xab, 0xb4, 0x66, 0x34, 0x2b, 0x7d, 0x2a, 0xe4, 0x95, 0xd5, 0x5d, 0xc8, 0xd4, 0x19, 0xf3, 0x20, 0x54, 0xc2, 0xf5, 0xd4, 0x1e, 0x49, 0x48, 0xba, 0x8a, 0x43, 0x31, 0x33, 0xdb, 0xdd, 0xc1, 0xed, 0x9, 0x5f, 0xb8, 0x31, 0xd3, 0xd3, 0xb3, 0xc1, 0x4a, 0xe6, 0x8a, 0xa8, 0x4a, 0x35, 0x45, 0xf, 0xfd, 0x50, 0xec, 0x2f, 0xd3, 0x26, 0xb6, 0xa8, 0x4f, 0x83, 0x28, 0xe8, 0xd4, 0xfb, 0xdc, 0x1b, 0x39, 0x25, 0x52, 0xcd, 0x66, 0x28, 0x5a, 0xe4, 0xb3, 0x7a, 0xf, 0x81, 0x32, 0x47, 0x9d, 0xfa, 0x93, 0xf2, 0x5, 0xc9, 0xb4, 0xd6, 0xc1, 0xd8, 0x97, 0xb5, 0x61, 0x34, 0x47, 0x80, 0xac, 0x10, 0x5, 0x6a, 0x43, 0xc2, 0x36, 0x92, 0xef, 0x11, 0x3d, 0x30, 0x4b, 0xe5, 0xb6, 0x3e, 0x63, 0x97, 0xf1, 0xc, 0x9e, 0xfd, 0x94, 0x49, 0x17, 0xd2, 0x8d, 0xeb, 0xd5, 0x98, 0x44, 0xc1, 0x11, 0x95, 0x6c, 0x2e, 0x8c, 0xe7, 0xc1, 0xfd, 0x77, 0xe5, 0x77, 0x65, 0x4f, 0xbe, 0x1, 0x74, 0xf3, 0x8d, 0xa7, 0x56, 0x81, 0xd3, 0xa5, 0x82, 0x12, 0x3b, 0x53, 0xbe, 0x16, 0x7, 0xeb, 0x96, 0x7f, 0xe0, 0x91, 0x25, 0x1f, 0x74, 0x37, 0x38, 0xcd, 0x29, 0xe2, 0x6e, 0x39, 0x64, 0x9d, 0xc4, 0xdb, 0x4b, 0x8f, 0x26, 0x9d, 0x26, 0x2, 0x71, 0x59, 0xe6, 0x5, 0x63, 0x9a, 0xce, 0xc6, 0x39, 0x6b, 0x89, 0x45, 0x2, 0xb3, 0x10, 0x71, 0x24, 0x5e, 0xc0, 0x72, 0x0, 0x13, 0xa9, 0xa8, 0x19, 0x52, 0x84, 0xc2, 0x9f, 0x2a, 0xe, 0xb1, 0x8c, 0x15, 0x88, 0xc6, 0x91, 0xf1, 0x39, 0x41, 0xf6, 0xc6, 0xcb, 0x56, 0x82, 0xb6, 0xd3, 0x78, 0x46, 0xa3, 0x7e, 0x31, 0x8, 0xd9, 0x94, 0xf5, 0x4a, 0xfd, 0x1, 0x92, 0x95, 0x2f, 0x6f, 0x2f, 0x4f, 0x91, 0x7c, 0x8, 0x55, 0xb3, 0xf5, 0x23, 0xd6, 0x9, 0xba, 0x1a, 0x7c, 0x95, 0xc1, 0x74, 0xdd, 0xbb, 0x27, 0x7c, 0xd5, 0x16, 0xd7, 0x17, 0x55, 0x2a, 0xab, 0x52, 0x85, 0x3f, 0x8f, 0x2d, 0x29, 0xa4, 0xd3, 0x50, 0x7c, 0x4, 0xc6, 0xb2, 0x9c, 0x97, 0x46, 0x2c, 0xcd, 0x91, 0x6d, 0x36, 0x15, 0xc8, 0xe2, 0xe4, 0xf0, 0xa3, 0xda, 0xea, 0xbe, 0xa2, 0x40, 0x83, 0xe0, 0x41, 0x24, 0x59, 0x7a, 0x16, 0xfb, 0x47, 0x3, 0x24, 0xe9, 0xe9, 0x75, 0x46, 0x0, 0x6e, 0x44, 0xe, 0x84, 0xff, 0xaa, 0x48, 0x78, 0x72, 0x8f, 0x30, 0xea, 0x8f, 0x25, 0x9f, 0x9f, 0xd9, 0xfa, 0x9b, 0x63, 0x99, 0x28, 0xf1, 0x50, 0xf6, 0xa, 0x5c, 0x20, 0x63, 0xae, 0x39, 0x9, 0x38, 0x79, 0x6d, 0x48, 0x3e, 0xde, 0xcd, 0xbc, 0x45, 0x8f, 0xea, 0x81, 0xea, 0xc0, 0xb4, 0xaf, 0xda, 0x52, 0xb5, 0xb2, 0x5c, 0x2a, 0xf1, 0x3e, 0xe2, 0xea, 0x78, 0x38, 0x78, 0xa3, 0xe6, 0x6f, 0x55, 0x8f, 0x54, 0x8d, 0x98, 0x53, 0xb8, 0x3f, 0xaf, 0x33, 0x3c, 0x79, 0xc5, 0xa3, 0xaa, 0x47, 0x29, 0xab, 0x5a, 0x11, 0x21, 0x2d, 0x4e, 0x49, 0xde, 0xac, 0xbe, 0x50, 0xba, 0xce, 0xad, 0xd2, 0xe5, 0xaf, 0x95, 0xf1, 0x36, 0x12, 0x5d, 0x46, 0x13, 0x44, 0xcd, 0x2d, 0x12, 0x3c, 0xdb, 0x3, 0x5d, 0xb1, 0xf7, 0xc8, 0x35, 0x3b, 0xcf, 0xf1, 0x7f, 0xc1, 0x4f, 0xb5, 0xe2, 0x30, 0x8d, 0xbc, 0xae, 0x72, 0xe6, 0x40, 0xb9, 0xa3, 0x3a, 0xe7, 0x75, 0x8f, 0xf3, 0x2, 0x8d, 0x84, 0x32, 0xa0, 0x5, 0xa, 0xb1, 0x3b, 0x21, 0xdb, 0xa0, 0x1c, 0x2a, 0x90, 0x8d, 0x68, 0x2f, 0xa7, 0xe9, 0xc5, 0xbc, 0xdd, 0xe4, 0xe7, 0x5d, 0xdb, 0x67, 0xf5, 0x63, 0x3b, 0x61, 0xe7, 0x28, 0x9b, 0x83, 0xbe, 0xd, 0x4, 0xa6, 0x7d, 0xc6, 0x77, 0xcc, 0x81, 0x26, 0x10, 0x4d, 0x23, 0xfb, 0x88, 0x2b, 0x69, 0x82, 0x35, 0x59, 0xd0, 0xfa, 0x35, 0x9d, 0x6e, 0x98, 0x1b, 0x5, 0x56, 0xfe, 0x3c, 0x41, 0xc7, 0x52, 0x23, 0x6b, 0xf4, 0x5e, 0xed, 0xce, 0x3c, 0x85, 0x52, 0xa4, 0x3a, 0x21, 0x16, 0x6f, 0xb7, 0xe2, 0x27, 0xc6, 0x6f, 0x14, 0x75, 0xb1, 0xbb, 0x51, 0x3a, 0x57, 0x91, 0xc5, 0x9b, 0x56, 0xa0, 0xd5, 0x43, 0x82, 0x35, 0x9e, 0x6d, 0x1, 0xa7, 0x92, 0x66, 0x1d, 0xac, 0x56, 0xc, 0xac, 0xd, 0x5f, 0xd, 0x59, 0xda, 0xb5, 0x33, 0x38, 0x99, 0x91, 0x74, 0x81, 0xde, 0x3, 0x78, 0x6, 0xa8, 0xd0, 0x75, 0xbf, 0x4d, 0x12, 0xf2, 0xb4, 0x65, 0xfb, 0xc, 0xf8, 0xcc, 0x32, 0x2, 0x96, 0xcc, 0x5e, 0x3c, 0xcc, 0xbe, 0xf7, 0xf5, 0xdd, 0x87, 0xb9, 0xf8, 0x35, 0x6d, 0xa7, 0xaf, 0xfe, 0x21, 0xcf, 0x77, 0x1d, 0x75, 0x51, 0x9c, 0x27, 0x41, 0x50, 0x2b, 0xc9, 0x6f, 0xeb, 0x26, 0xc7, 0x47, 0xf4, 0x54, 0xfb, 0x4c, 0xc8, 0xb7, 0x18, 0x4b, 0xee, 0xcf, 0x18, 0xa6, 0xab, 0x8d, 0xf8, 0xb0, 0xc8, 0xe0, 0x95, 0x5c, 0x0, 0x9a, 0x46, 0x3f, 0xdf, 0x39, 0x18, 0xd1, 0xf3, 0x28, 0x12, 0xcf, 0x98, 0x7d, 0x5, 0xbd, 0x54, 0xcb, 0x32, 0x1f, 0x87, 0x57, 0xc4, 0xe1, 0x2, 0x1a, 0x5, 0x79, 0xcb, 0x32, 0x76, 0x7d, 0x20, 0x94, 0x85, 0xac, 0x21, 0x94, 0x3, 0xfe, 0x5b, 0x26, 0x8b, 0xce, 0x48, 0x68, 0x7e, 0x59, 0x3e, 0xd, 0x9e, 0x1f, 0x18, 0x9, 0x64, 0xe2, 0x14, 0xf4, 0x1, 0xd0, 0xc9, 0xd, 0x35, 0x8a, 0xcd, 0x48, 0x37, 0xe8, 0x44, 0x4, 0x4f, 0x7b, 0x1e, 0xc8, 0xdd, 0xe, 0xd0, 0xa9, 0xc6, 0x45, 0x8e, 0x94, 0x8, 0x7a, 0xb7, 0xd8, 0x20, 0xc, 0xe5, 0x3c, 0x29, 0xb7, 0x71, 0x3, 0x67, 0x74, 0x29, 0x57, 0x5a, 0x71, 0x40, 0x45, 0x72, 0xae, 0x98, 0xe7, 0xa9, 0x6a, 0x42, 0xb6, 0x71, 0xf9, 0xec, 0xeb, 0xd5, 0x79, 0xf3, 0x98, 0xd4, 0xaa, 0xbb, 0xb2, 0xd7, 0x6f, 0x6b, 0xd4, 0x69, 0x39, 0xf9, 0xb6, 0x46, 0xff, 0x55, 0xe1, 0xd2, 0x29, 0xe3, 0x9a, 0x38, 0xd7, 0xcc, 0x8a, 0x24, 0x22, 0x12, 0x3a, 0x8, 0xb2, 0x66, 0xe3, 0x64, 0x32, 0xef, 0xc0, 0x6e, 0x1f, 0x28, 0xee, 0xfd, 0x5a, 0x4, 0xb7, 0x59, 0x56, 0xb5, 0xb, 0x43, 0xe6, 0x40, 0x3a, 0x82, 0x7a, 0x79, 0xa, 0x90, 0xe1, 0x4, 0x2a, 0x59, 0x24, 0x76, 0x65, 0xee, 0xc9, 0x4a, 0x9d, 0xe0, 0xcd, 0x4a, 0xa5, 0x5e, 0x4b, 0x3f, 0x46, 0xb6, 0x52, 0xa7, 0x65, 0xca, 0xd3, 0xd3, 0x9e, 0xfe, 0x1e, 0xdd, 0x6, 0x54, 0x30, 0xbe, 0x6d, 0x7a, 0xe2, 0x57, 0x19, 0x5d, 0xdd, 0x7f, 0xdc, 0xb7, 0x8e, 0x8f, 0x4d, 0x7d, 0x38, 0x76, 0x68, 0x4a, 0xf5, 0xe4, 0x2d, 0x76, 0xc7, 0x9, 0x94, 0x47, 0x9c, 0x78, 0x7, 0xb3, 0x99, 0x5d, 0x5b, 0x4d, 0xbe, 0x82, 0x36, 0x79, 0x6e, 0x56, 0xc, 0x38, 0x25, 0xe3, 0x40, 0xc7, 0xda, 0xf3, 0x37, 0x2d, 0x60, 0xae, 0xe4, 0x66, 0x15, 0xbe, 0xea, 0xd, 0x14, 0x1e, 0x86, 0x9a, 0xc4, 0x26, 0x61, 0xee, 0xea, 0x6, 0xd, 0x4f, 0xe1, 0x65, 0x3b, 0x4f, 0x2, 0x17, 0xfc, 0x9b, 0xc6, 0xe8, 0xf1, 0xa3, 0x51, 0x81, 0x63, 0x68, 0xa7, 0xe9, 0xa8, 0xc3, 0xc3, 0xc8, 0xd4, 0x3, 0xb1, 0x2c, 0x75, 0x0, 0x34, 0x6b, 0xb3, 0x18, 0x92, 0x13, 0x46, 0xbc, 0x2, 0x4a, 0x50, 0x51, 0x76, 0xeb, 0x75, 0x7f, 0xc6, 0xfa, 0xeb, 0x2a, 0xd0, 0x56, 0x8b, 0x84, 0xd6, 0x9b, 0x26, 0x82, 0x17, 0xdb, 0x81, 0x83, 0x95, 0x50, 0xe5, 0x97, 0x25, 0x79, 0xbf, 0x34, 0xae, 0x53, 0x51, 0x38, 0x5f, 0x64, 0x60, 0x5c, 0xbb, 0x48, 0x80, 0x8, 0xe3, 0xaf, 0x96, 0xe, 0x6f, 0x56, 0x44, 0x88, 0x77, 0x15, 0x2, 0x6a, 0xbf, 0xa7, 0xe, 0x31, 0x69, 0x8c, 0x68, 0xb5, 0xb3, 0xde, 0xd2, 0xfa, 0x4, 0x95, 0x42, 0xc9, 0x17, 0x4d, 0x6d, 0x89, 0x17, 0xe5, 0xf0, 0x20, 0xe0, 0xa9, 0xa1, 0xe5, 0xbb, 0x8d, 0x42, 0xa4, 0xcc, 0x67, 0xbd, 0x26, 0x31, 0x5f, 0xfd, 0x87, 0x81, 0x26, 0x58, 0x10, 0x48, 0x3a, 0x97, 0x36, 0x0, 0xa0, 0x61, 0xbd, 0xb8, 0x63, 0x66, 0x9b, 0xa3, 0x8, 0xa8, 0x65, 0x2d, 0xef, 0xde, 0x42, 0x6d, 0x19, 0x6b, 0x63, 0x94, 0x4f, 0x4, 0x69, 0x49, 0x4c, 0x56, 0x5d, 0xdd, 0x47, 0xee, 0x11, 0xf6, 0x77, 0x30, 0x87, 0xd2, 0x49, 0x3a, 0x2f, 0x7b, 0x14, 0xb2, 0x82, 0xf, 0xdd, 0xd8, 0xb0, 0x3, 0xc6, 0xcb, 0x3, 0xf1, 0xf9, 0x34, 0xc, 0x46, 0x19, 0x9e, 0xd7, 0x18, 0x3, 0x5c, 0x2e, 0xf3, 0xf8, 0x17, 0x41, 0xa8, 0xba, 0x88, 0x88, 0x8b, 0x77, 0x26, 0x72, 0xc0, 0xdc, 0x37, 0x3c, 0x8f, 0x27, 0xf, 0x1c, 0x1c, 0xe9, 0x1b, 0xd2, 0x10, 0xc6, 0xa0, 0xf7, 0xe0, 0x68, 0x84, 0x7c, 0xd4, 0xe0, 0xc0, 0xec, 0xad, 0x13, 0x22, 0xf0, 0x9b, 0x6e, 0x7b, 0xfe, 0xb7, 0x60, 0x41, 0x55, 0x97, 0xb2, 0x3f, 0xa, 0x40, 0x9a, 0x18, 0x16, 0x7d, 0x1e, 0xca, 0x28, 0xe3, 0xea, 0x9b, 0x3e, 0xd7, 0xcc, 0xd8, 0x93, 0xe7, 0x97, 0x4b, 0xd0, 0xd, 0xcc, 0xb8, 0x6d, 0x50, 0x9b, 0x3c, 0xc8, 0xa9, 0x4c, 0x81, 0x38, 0xcf, 0xae, 0x7a, 0xd4, 0x5c, 0xe6, 0x45, 0x4b, 0xb6, 0xd, 0x43, 0xfc, 0x26, 0x84, 0xea, 0x18, 0xd8, 0x99, 0x54, 0x9b, 0x7, 0x41, 0x29, 0xac, 0xe0, 0x1a, 0xd2, 0xb5, 0x3, 0x37, 0x19, 0xd3, 0xc2, 0x54, 0x2, 0x9b, 0x27, 0xd0, 0x92, 0xc9, 0xca, 0x52, 0xc0, 0x7, 0x33, 0xf3, 0xb1, 0xa8, 0xef, 0x92, 0xcb, 0xa7, 0x6a, 0xa5, 0xc7, 0x37, 0xd, 0x80, 0x25, 0x18, 0x5a, 0x22, 0x54, 0x2d, 0x34, 0x37, 0xc, 0x38, 0x13, 0x92, 0xef, 0xd2, 0xd5, 0x66, 0x2d, 0xac, 0x92, 0xc6, 0x63, 0xc, 0x3, 0xc9, 0x70, 0x5a, 0x3, 0x61, 0x18, 0xba, 0x71, 0x85, 0xb7, 0x9, 0x51, 0x3d, 0xf9, 0xc8, 0xd0, 0x5c, 0x2d, 0xb2, 0x48, 0x93, 0xbb, 0x33, 0x86, 0xa7, 0x84, 0xfa, 0xe8, 0x8, 0xbd, 0xeb, 0x5a, 0xba, 0xa6, 0xfb, 0x53, 0xd8, 0xa7, 0xee, 0xe5, 0xf3, 0x7d, 0xf2, 0x7f, 0x58, 0x71, 0xca, 0x68, 0x96, 0x87, 0x1c, 0x52, 0x5, 0x1a, 0x6f, 0xce, 0x3b, 0x13, 0xd5, 0xb9, 0xe4, 0xbe, 0xe, 0xfd, 0x53, 0xcd, 0x50, 0x2d, 0x17, 0xff, 0x4c, 0xf7, 0x33, 0xa1, 0xeb, 0x14, 0xf2, 0x13, 0xb8, 0xec, 0x3, 0xaa, 0xa, 0x24, 0xee, 0x5b, 0x66, 0x6f, 0x40, 0x65, 0xbb, 0xcf, 0x73, 0xad, 0x25, 0xa4, 0xe4, 0x1f, 0x4b, 0x8, 0xa6, 0xf6, 0x81, 0xd0, 0x16, 0x5d, 0x9d, 0x0, 0x90, 0x2c, 0xf8, 0xee, 0xe8, 0x4f, 0x30, 0x35, 0x22, 0xaa, 0x9e, 0xaa, 0xd5, 0x46, 0x3, 0xf2, 0xe3, 0x91, 0x1c, 0xac, 0x7, 0x9f, 0xda, 0xa, 0xcf, 0xf1, 0xd, 0xb4, 0x23, 0x3e, 0x9b, 0x7d, 0xb4, 0x71, 0xe9, 0x94, 0x73, 0x73, 0x33, 0x59, 0x21, 0xf9, 0x9c, 0x66, 0x14, 0xbd, 0x57, 0xbf, 0x64, 0x10, 0x1a, 0xc, 0xdf, 0xae, 0x5d, 0x86, 0x25, 0x91, 0x27, 0x83, 0xd3, 0xb, 0xb7, 0x3e, 0xab, 0xda, 0xec, 0x34, 0x9f, 0x5b, 0x3d, 0xbc, 0xaf, 0x5c, 0x75, 0x5f, 0x7e, 0xed, 0xe3, 0x91, 0x2, 0x6f, 0x1e, 0xd4, 0x54, 0x9f, 0x69, 0x49, 0x34, 0x48, 0x3e, 0xf, 0x58, 0x77, 0x41, 0x30, 0xcb, 0xaf, 0xa9, 0x17, 0xc2, 0x21, 0xbb, 0xfd, 0xb3, 0x67, 0x9a, 0x2f, 0x7f, 0xa1, 0x6f, 0x75, 0xa8, 0xc1, 0x45, 0xa2, 0x21, 0x24, 0x6b, 0x2a, 0x91, 0x22, 0xf0, 0x4a, 0x94, 0x27, 0xbe, 0x64, 0xfe, 0x4, 0x58, 0x2a, 0xc6, 0x65, 0xe4, 0xad, 0xd7, 0x8f, 0xf0, 0xa6, 0x39, 0xbd, 0xff, 0x8d, 0x3b, 0x40, 0x14, 0xaa, 0x4c, 0xa8, 0xef, 0xc4, 0x27, 0x84, 0x71, 0x47, 0x46, 0x80, 0xb4, 0xda, 0x8b, 0xf, 0x83, 0x6e, 0x9b, 0xff, 0x17, 0xdf, 0x47, 0x13, 0x9a, 0xe4, 0xe8, 0x7e, 0x8d, 0x40, 0xae, 0xd4, 0xc1, 0x91, 0x23, 0x1e, 0xc7, 0x6a, 0x3c, 0xd7, 0xef, 0x1d, 0xfd, 0xb9, 0xcb, 0xc8, 0xc5, 0xfe, 0xbb, 0xbb, 0x57, 0x6, 0x84, 0x19, 0xea, 0xf8, 0x7e, 0x9e, 0xb5, 0x1c, 0xdb, 0x39, 0x30, 0x5f, 0x10, 0x64, 0x96, 0x82, 0xaa, 0x78, 0x4a, 0xef, 0x5f, 0x6, 0xc2, 0xf1, 0xbe, 0xcd, 0xe3, 0x92, 0x5b, 0xfd, 0x7d, 0xf, 0xe6, 0x77, 0x50, 0x83, 0x70, 0x26, 0xf0, 0x49, 0xc5, 0xd7, 0xbf, 0x21, 0xf1, 0x34, 0xd0, 0x3a, 0x1b, 0x20, 0x14, 0xfc, 0x34, 0x3, 0xa1, 0xc2, 0xca, 0x5f, 0xf6, 0x52, 0x45, 0x34, 0x9, 0x9e, 0x9a, 0x8a, 0x82, 0x30, 0x65, 0x97, 0xd3, 0xa1, 0xd8, 0x7d, 0x89, 0xf2, 0xd4, 0x79, 0x8f, 0x73, 0xc0, 0x5f, 0xba, 0x2, 0x35, 0xbd, 0x71, 0x8e, 0x60, 0x67, 0xa0, 0x75, 0xde, 0xb4, 0x24, 0x1f, 0xf4, 0x4e, 0xe5, 0x25, 0x61, 0xfd, 0x5e, 0xde, 0x8d, 0xb0, 0x3f, 0x54, 0x9, 0xa4, 0x25, 0x48, 0x48, 0xde, 0x95, 0x22, 0xcc, 0x65, 0x98, 0x8d, 0x19, 0x1f, 0xa2, 0xdf, 0xe, 0x6e, 0x71, 0x37, 0x8a, 0x42, 0xc7, 0x5f, 0xf3, 0xad, 0xa2, 0x97, 0x96, 0x4f, 0xc7, 0xc3, 0xca, 0xf7, 0x79, 0x3c, 0xa4, 0x1, 0xc, 0x44, 0xae, 0x7c, 0x5b, 0x8d, 0x25, 0xc1, 0x31, 0x75, 0x2b, 0x40, 0x41, 0x8b, 0xc0, 0x21, 0x21, 0x23, 0x93, 0xde, 0x55, 0x89, 0x1a, 0xf6, 0xaf, 0x8, 0x14, 0x2d, 0xf8, 0xfa, 0x68, 0x35, 0x5b, 0x96, 0xcf, 0x9e, 0x99, 0x5e, 0xb1, 0x71, 0x6f, 0x27, 0x17, 0xe9, 0x48, 0xd2, 0x4e, 0xf1, 0xe2, 0xf9, 0xc, 0x82, 0xa1, 0xca, 0xf4, 0xc6, 0x7e, 0x3c, 0xd8, 0x18, 0xb2, 0x20, 0x1b, 0x68, 0x17, 0xf2, 0x3e, 0x53, 0x65, 0x6d, 0x9f, 0x88, 0x87, 0x2e, 0xca, 0xc3, 0xe4, 0xc7, 0x58, 0x71, 0x67, 0x41, 0x2b, 0xdc, 0xfb, 0xd, 0x67, 0xfb, 0x7f, 0x25, 0x4c, 0x84, 0x1, 0xa, 0x91, 0x75, 0x7d, 0x57, 0x88, 0xcf, 0x7, 0xbf, 0x36, 0xf3, 0xce, 0x2a, 0x5e, 0xe4, 0x50, 0x52, 0x24, 0x22, 0x85, 0x3d, 0xa2, 0x7c, 0x8d, 0x2e, 0xd9, 0x2e, 0x58, 0x2f, 0x81, 0x2b, 0x4c, 0xbe, 0xf8, 0x29, 0x92, 0xba, 0x67, 0x34, 0x97, 0xf1, 0x5b, 0xd6, 0xb0, 0x54, 0x9, 0xf7, 0xdb, 0x46, 0x9b, 0x8c, 0x5d, 0xf1, 0x78, 0xe, 0xf3, 0xa0, 0xc8, 0x97, 0x61, 0xc9, 0xa4, 0x85, 0x9a, 0xa6, 0xf3, 0xa8, 0x9b, 0xce, 0xe4, 0x61, 0xf, 0x66, 0x42, 0x42, 0xc, 0x79, 0xa6, 0x6e, 0xb3, 0xaa, 0x6, 0xbf, 0x16, 0x64, 0x98, 0xec, 0x8e, 0x6f, 0x70, 0xc6, 0x25, 0xc2, 0x9f, 0x9a, 0xc1, 0xde, 0x56, 0x9e, 0xf1, 0x3, 0x51, 0x9a, 0x71, 0x32, 0xee, 0x4b, 0x6, 0xac, 0xe, 0xf5, 0xc6, 0xef, 0x43, 0x52, 0x19, 0xc1, 0xdc, 0x6a, 0xcb, 0x22, 0xe1, 0xb8, 0x8, 0xa, 0xb8, 0xc0, 0x84, 0xaa, 0x7f, 0x1b, 0x8c, 0xd0, 0xfc, 0x6d, 0xbd, 0xd1, 0xc3, 0x32, 0xde, 0x27, 0xe4, 0xb, 0x4e, 0xec, 0x9d, 0x12, 0x83, 0x3c, 0x26, 0x1d, 0x9c, 0x67, 0xab, 0x98, 0xff, 0x4e, 0xf6, 0xce, 0xb7, 0x3c, 0xc8, 0xaf, 0x51, 0x5a, 0xdf, 0x3f, 0x7d, 0xe4, 0x87, 0x1d, 0xb0, 0xca, 0xc9, 0x55, 0x93, 0x5f, 0xfb, 0x7a, 0x6e, 0x58, 0xe0, 0x89, 0x8f, 0xf5, 0xbb, 0x91, 0x9, 0x37, 0x84, 0xd, 0x18, 0xc0, 0x72, 0x7c, 0xdc, 0xc3, 0xb5, 0x99, 0xfb, 0xaa, 0xa5, 0xa9, 0xb0, 0xae, 0x44, 0x38, 0x1d, 0xf, 0x8a, 0xa4, 0x82, 0xe4, 0x67, 0xb6, 0xdd, 0xb7, 0x78, 0x71, 0x9a, 0xa5, 0x23, 0x6e, 0xe9, 0x85, 0x39, 0x45, 0xa5, 0xb8, 0xf4, 0xea, 0xe0, 0x4d, 0x6a, 0xaa, 0x32, 0xe, 0xc6, 0x4b, 0xca, 0xd9, 0xcf, 0x68, 0x70, 0x5e, 0xd1, 0x7f, 0x1, 0x4b, 0x8a, 0x66, 0x9d, 0xc0, 0x7d, 0xf2, 0x4a, 0x69, 0xf0, 0xd9, 0xcd, 0x8b, 0x70, 0xba, 0xd5, 0xca, 0xc3, 0xf6, 0x2a, 0x5c, 0xb9, 0x5b, 0x69, 0xba, 0xd2, 0x5c, 0x8f, 0xa5, 0xc0, 0x33, 0xd3, 0xc1, 0x28, 0xaa, 0x70, 0x78, 0xc7, 0xab, 0xe3, 0x74, 0xe2, 0x23, 0x4b, 0x88, 0xc1, 0x1c, 0x2d, 0xc8, 0xcf, 0xec, 0xb4, 0x53, 0x47, 0x5d, 0x1, 0xc2, 0x5a, 0xc8, 0x9f, 0x9, 0x8e, 0x65, 0xac, 0xca, 0xa6, 0xc7, 0x90, 0x73, 0xb2, 0x4, 0x9e, 0x36, 0x46, 0xcf, 0xea, 0x67, 0x64, 0x50, 0x49, 0xd0, 0xe7, 0xe2, 0xcc, 0xec, 0xcd, 0x37, 0xa2, 0x63, 0x1b, 0x48, 0x3a, 0x14, 0x80, 0xed, 0xd8, 0xab, 0x29, 0x40, 0x88, 0xb, 0xb0, 0xbc, 0xc7, 0xe3, 0xbf, 0x28, 0xb, 0x4a, 0xe2, 0x33, 0x2f, 0xf8, 0x57, 0xff, 0x79, 0x50, 0x56, 0xf2, 0x3f, 0xe2, 0xbe, 0x9c, 0x25, 0x58, 0x5f, 0xeb, 0x27, 0x34, 0x35, 0x16, 0x62, 0xd6, 0x48, 0xe9, 0xc4, 0xee, 0x6f, 0x27, 0x2b, 0x3, 0x10, 0xda, 0xc6, 0x2b, 0xb6, 0xd1, 0x53, 0x2a, 0xe7, 0xf0, 0xdd, 0x51, 0x83, 0x71, 0xba, 0xe7, 0x20, 0x24, 0x76, 0x20, 0x45, 0x93, 0x8d, 0x11, 0x0, 0x3a, 0xff, 0x8f, 0x36, 0x96, 0x6b, 0x4c, 0x7c, 0x9c, 0x15, 0x53, 0x97, 0xd8, 0xf7, 0x9a, 0x40, 0xd7, 0xc0, 0xa3, 0x3a, 0x60, 0xfb, 0x32, 0x71, 0x0, 0xc, 0x3d, 0xd5, 0xb8, 0x38, 0x92, 0x84, 0xa6, 0xf7, 0x2a, 0xd1, 0x68, 0x79, 0x92, 0x5d, 0xbf, 0xe7, 0x7, 0x6, 0xbe, 0xce, 0x74, 0xda, 0xaa, 0x55, 0x0, 0xa5, 0x9a, 0xcb, 0x8c, 0x7e, 0xba, 0xcb, 0x79, 0x10, 0xe8, 0x5e, 0xff, 0xf4, 0xa5, 0xd1, 0x71, 0xc, 0x61, 0x61, 0xa6, 0xb6, 0xe3, 0xbf, 0x81, 0x47, 0x18, 0xf7, 0x79, 0xd2, 0xe6, 0x1d, 0xcb, 0x51, 0x77, 0x62, 0xb6, 0x9e, 0xc5, 0xd6, 0x95, 0xff, 0xf8, 0xa7, 0xde, 0xd3, 0x58, 0xb7, 0x90, 0x6d, 0x18, 0x54, 0xf7, 0xb4, 0xdf, 0xc1, 0xb6, 0x4b, 0xe, 0xdc, 0x1, 0x28, 0x2b, 0x6b, 0xf5, 0x5c, 0x5c, 0x4d, 0x56, 0x54, 0x1f, 0x52, 0xe4, 0x61, 0xc5, 0x13, 0x7f, 0xdd, 0xf0, 0x60, 0x8c, 0xfb, 0xb4, 0xb3, 0x81, 0xfc, 0x29, 0xb, 0x20, 0x4c, 0xac, 0xc1, 0x87, 0x1d, 0x17, 0x9f, 0xe0, 0xc3, 0xeb, 0x9e, 0xaa, 0x81, 0x14, 0x30, 0x95, 0x79, 0x91, 0xfa, 0x14, 0xe1, 0x92, 0xe1, 0x92, 0x1b, 0x5, 0x7f, 0x53, 0xb5, 0xec, 0xe9, 0x92, 0x8f, 0xdf, 0x83, 0x74, 0xc, 0x29, 0xcc, 0xb2, 0xb1, 0x44, 0x16, 0xb0, 0xde, 0x2a, 0x5a, 0x45, 0x11, 0xa7, 0x2c, 0xc, 0xa1, 0x81, 0x56, 0x68, 0x4b, 0x96, 0x7a, 0x56, 0x88, 0x40, 0x8, 0x59, 0xf4, 0x73, 0x61, 0x4a, 0x21, 0x1f, 0xe, 0x28, 0x6b, 0xeb, 0x3d, 0xc1, 0xf0, 0xca, 0x34, 0xdc, 0x9a, 0x8c, 0x80, 0xfb, 0x61, 0xf5, 0x38, 0x29, 0xd1, 0x39, 0xb4, 0xdf, 0x6e, 0xbc, 0x5e, 0x3a, 0xdc, 0xb2, 0xe, 0x21, 0x4d, 0xfe, 0xb1, 0xb1, 0x85, 0x74, 0x72, 0xae, 0x86, 0xe1, 0x0, 0x4, 0x2e, 0x6, 0x88, 0x3b, 0xeb, 0x6e, 0x5c, 0x2d, 0xe3, 0x91, 0xfa, 0xde, 0x34, 0xb1, 0x85, 0xae, 0xe9, 0xc7, 0x75, 0xd4, 0xb2, 0x1b, 0xd0, 0xb1, 0x73, 0x60, 0xd, 0xc0, 0x63, 0x28, 0x5e, 0x61, 0xad, 0xb9, 0xc4, 0x4a, 0x5f, 0x52, 0x3d, 0x49, 0x29, 0x9e, 0x4f, 0xcf, 0x9a, 0x4e, 0xea, 0x1d, 0x2b, 0xc3, 0x8d, 0xb8, 0xd, 0xa5, 0xc8, 0x1, 0x1f, 0x3e, 0x6c, 0x91, 0xda, 0x4, 0xea, 0x70, 0x5d, 0xb0, 0x3e, 0x80, 0x65, 0xd8, 0xa, 0xd, 0x4b, 0x71, 0xee, 0xaf, 0x79, 0xe0, 0xc, 0x92, 0x45, 0x59, 0x1f, 0x83, 0x89, 0x67, 0xa0, 0x17, 0x6e, 0x68, 0xe5, 0x5a, 0x4a, 0xb7, 0xe8, 0xbe, 0x66, 0x59, 0x46, 0x8d, 0x25, 0x1e, 0xa2, 0x73, 0xa6, 0x38, 0x95, 0x1c, 0x14, 0x83, 0xf2, 0xc1, 0x1c, 0xbd, 0x86, 0xe4, 0x96, 0xe, 0x4f, 0xcf, 0x2e, 0x3b, 0x78, 0xfc, 0xe5, 0x74, 0x96, 0xa8, 0x3a, 0xcd, 0x7a, 0xfa, 0x82, 0x24, 0xc, 0xc1, 0x5e, 0x41, 0x10, 0xf5, 0xc3, 0x6e, 0x31, 0x5a, 0x20, 0x85, 0x75, 0x4, 0x98, 0xd2, 0x14, 0x4a, 0x7e, 0x2c, 0xfd, 0xeb, 0x30, 0x6f, 0xc0, 0x19, 0x3c, 0xde, 0x44, 0xe6, 0xb7, 0xd4, 0x38, 0x1f, 0x1c, 0xdb, 0x4a, 0x36, 0xce, 0x5d, 0x75, 0x1a, 0x29, 0xfe, 0xe3, 0x5b, 0x8f, 0x5, 0x3c, 0x2a, 0xb2, 0xb7, 0x8c, 0xa3, 0xfe, 0x37, 0x2, 0xc3, 0xd2, 0x2c, 0x17, 0xbe, 0x17, 0x2e, 0x7a, 0x96, 0x30, 0x29, 0x44, 0xa, 0x5b, 0xa1, 0x5e, 0x79, 0xf, 0x2, 0x58, 0xa9, 0x58, 0x89, 0xd7, 0xc8, 0x37, 0x8f, 0xb5, 0x75, 0xb6, 0xa4, 0x9b, 0xe8, 0xb7, 0x63, 0xea, 0x1a, 0xc3, 0xf, 0xc, 0xc, 0xfb, 0xb4, 0x2e, 0x1f, 0xff, 0xa7, 0x39, 0xe6, 0x95, 0xed, 0xfb, 0x14, 0x96, 0x61, 0xa3, 0xf5, 0x80, 0x98, 0xab, 0x51, 0x71, 0x94, 0x2, 0xff, 0xb6, 0xde, 0xdb, 0xdc, 0x68, 0xa8, 0x8c, 0x11, 0xc5, 0x5b, 0xed, 0x7a, 0x9f, 0x34, 0x91, 0xcb, 0x97, 0xf1, 0x20, 0x84, 0xca, 0x8f, 0x0, 0x5a, 0x2b, 0x3b, 0xd8, 0xf6, 0xaa, 0x23, 0xe8, 0x5e, 0x17, 0x7c, 0xb6, 0x32, 0xaf, 0x35, 0x21, 0xf4, 0xdc, 0x54, 0x1e, 0x56, 0xd6, 0x27, 0x7, 0x43, 0xa1, 0xb, 0xe2, 0xb1, 0x75, 0xd1, 0xe4, 0x5e, 0x9d, 0x87, 0xb5, 0x7d, 0x80, 0x99, 0x73, 0x36, 0xc4, 0xc7, 0xcd, 0x5b, 0xd5, 0x9c, 0x55, 0x44, 0xa5, 0x77, 0xd9, 0xff, 0x33, 0x21, 0x45, 0xb2, 0xb9, 0xfb, 0x20, 0x1a, 0xf, 0x83, 0xf1, 0xb2, 0xa8, 0x39, 0x2a, 0xf5, 0xa1, 0xd5, 0x7d, 0xc9, 0x4b, 0x48, 0xf8, 0xdd, 0xe, 0xa4, 0x56, 0xbf, 0xae, 0xd6, 0xc6, 0xda, 0xcc, 0x76, 0xcb, 0x7a, 0x25, 0x32, 0x27, 0xff, 0x86, 0x15, 0xec, 0x36, 0x4d, 0xaf, 0xd1, 0x7d, 0xde, 0xf8, 0x63, 0x88, 0xaa, 0x8e, 0x16, 0x7c, 0x64, 0x88, 0xcf, 0xd5, 0x45, 0x0, 0x9d, 0x97, 0x5, 0xc0, 0x74, 0xd5, 0xf3, 0xa6, 0x50, 0xe3, 0x40, 0x6a, 0x42, 0x2b, 0x7, 0xc2, 0xf9, 0xec, 0xe2, 0x8d, 0x56, 0xc1, 0xa5, 0xfc, 0x4e, 0x34, 0x15, 0xa5, 0x5b, 0xbf, 0xc8, 0xa8, 0x4a, 0xf1, 0x4d, 0x11, 0x55, 0xe5, 0xae, 0x97, 0x6b, 0xec, 0xc5, 0xfd, 0x4d, 0x4a, 0x37, 0xd4, 0x18, 0x54, 0xa8, 0x2c, 0x8f, 0xc2, 0x4c, 0x75, 0x78, 0x1f, 0xc4, 0xd3, 0x27, 0x9e, 0xcb, 0x71, 0x39, 0x5c, 0x60, 0x3, 0x79, 0x50, 0x10, 0x89, 0x6c, 0xc9, 0x42, 0xa1, 0x9e, 0x3d, 0x84, 0xf0, 0x84, 0x36, 0x92, 0x16, 0x34, 0x49, 0x74, 0xf3, 0x93, 0x28, 0xa, 0xfa, 0x2f, 0xaa, 0x2c, 0x73, 0x70, 0x1, 0x16, 0x61, 0x70, 0xc2, 0xe8, 0xb2, 0xa3, 0xba, 0x7f, 0x43, 0xcc, 0x88, 0x27, 0xc3, 0xac, 0xa3, 0xed, 0xa6, 0x8e, 0x81, 0xcd, 0x39, 0x7, 0x2e, 0x2b, 0x9e, 0x39, 0x42, 0xe9, 0xe2, 0x2a, 0xe5, 0x60, 0x2, 0x9b, 0xd3, 0x67, 0x69, 0x25, 0x33, 0x65, 0x90, 0xcc, 0x85, 0x25, 0xd4, 0x54, 0x79, 0xca, 0x21, 0x5, 0xd6, 0x9b, 0xd, 0xb3, 0x57, 0xed, 0x81, 0x77, 0x8, 0xa2, 0x4f, 0xbe, 0xb, 0x4a, 0xe3, 0xf8, 0xef, 0xc1, 0x60, 0x64, 0xef, 0xf6, 0x84, 0xc, 0x4, 0xb0, 0x56, 0x83, 0x84, 0xaf, 0xb1, 0x24, 0x2b, 0xbe, 0x28, 0x14, 0x16, 0x53, 0xf5, 0x63, 0x81, 0x27, 0xb2, 0x1c, 0xac, 0x22, 0x59, 0x45, 0x75, 0xf2, 0x8d, 0x63, 0x3f, 0x2b, 0xa5, 0x5c, 0xef, 0xb3, 0xa7, 0xc4, 0x57, 0xde, 0x71, 0x14, 0xb2, 0x77, 0x8e, 0x8b, 0x0, 0x4c, 0x83, 0x10, 0x2c, 0x68, 0x31, 0x31, 0x5d, 0xd5, 0x4b, 0xf0, 0x24, 0x68, 0xc7, 0x71, 0x1c, 0xb6, 0x17, 0x86, 0xc0, 0xd1, 0xb6, 0x9d, 0x8, 0xa5, 0xc2, 0x3, 0x9, 0xdb, 0x31, 0x3f, 0x5d, 0x4e, 0x18, 0x72, 0x21, 0x9, 0x9c, 0x38, 0xc6, 0xc, 0xc0, 0x5b, 0xed, 0x7c, 0xdd, 0xc2, 0x8f, 0x27, 0x61, 0xeb, 0x15, 0x20, 0x1a, 0xd6, 0xf8, 0x37, 0x6a, 0x88, 0x52, 0x8e, 0x2e, 0xad, 0x33, 0x99, 0xe7, 0x6f, 0x78, 0x57, 0xc4, 0x1a, 0x21, 0x51, 0x2c, 0xce, 0x4c, 0xfe, 0xb3, 0x98, 0x4, 0xc2, 0x24, 0xb2, 0x10, 0x9b, 0xad, 0xe5, 0xb5, 0x8d, 0xd2, 0x4f, 0x7a, 0xd8, 0x90, 0xc3, 0x2f, 0xca, 0x3a, 0x5, 0xd1, 0x8c, 0x69, 0x6d, 0x53, 0x1b, 0xe9, 0x7, 0x2d, 0x11, 0x4f, 0xd6, 0x9, 0xba, 0x9e, 0xf2, 0x82, 0xb9, 0xce, 0x6f, 0x39, 0x7c, 0x19, 0x2c, 0x7b, 0x15, 0x3c, 0x24, 0xeb, 0x66, 0x7b, 0x41, 0x2d, 0x3c, 0xe2, 0x37, 0xd, 0x33, 0x3f, 0xd9, 0x57, 0xc, 0x48, 0xeb, 0x8d, 0x10, 0x79, 0xa1, 0xc8, 0xa4, 0xb3, 0xe5, 0x9c, 0x19, 0xcb, 0xde, 0x88, 0x23, 0x70, 0xd4, 0xa8, 0x44, 0xb9, 0x11, 0x92, 0x1, 0xb, 0x36, 0xb3, 0xb, 0x84, 0x92, 0xa6, 0xf2, 0x24, 0x7b, 0xfa, 0x69, 0xa6, 0xdc, 0x3b, 0x35, 0x7c, 0x0, 0xc3, 0xc9, 0xde, 0xfc, 0xd6, 0x20, 0xda, 0x17, 0x4f, 0x3a, 0xa1, 0x2f, 0xbe, 0x5f, 0x62, 0x28, 0x73, 0xc1, 0xdb, 0x1a, 0xb6, 0xb1, 0xa2, 0x21, 0x56, 0x51, 0xa9, 0xbf, 0x65, 0x89, 0x0, 0x46, 0xff, 0x20, 0xc6, 0x39, 0x9, 0x69, 0x49, 0x1c, 0xe9, 0x17, 0x87, 0x7d, 0xd2, 0x2d, 0x18, 0x97, 0x39, 0x6c, 0xea, 0x35, 0x50, 0xce, 0x5a, 0xef, 0xb, 0x61, 0xc2, 0xaa, 0x9a, 0x25, 0x54, 0x39, 0xdd, 0x80, 0x3c, 0x3f, 0xbb, 0x18, 0xef, 0x39, 0xfa, 0xc3, 0x5f, 0x5b, 0xb9, 0x10, 0x69, 0xee, 0x9a, 0xe0, 0x43, 0x10, 0xf5, 0xe2, 0xfc, 0x65, 0x56, 0x67, 0xa7, 0x9f, 0x6c, 0xd5, 0xce, 0x61, 0xdb, 0x72, 0xd8, 0xac, 0x65, 0xe2, 0x10, 0x69, 0xce, 0x9f, 0xae, 0x2e, 0x81, 0x82, 0x69, 0x98, 0x9, 0x80, 0xce, 0xc6, 0x11, 0xbe, 0x29, 0xd9, 0x60, 0x3, 0xb9, 0x52, 0x17, 0xbb, 0x72, 0x90, 0xd5, 0x4a, 0x5a, 0x97, 0x31, 0x19, 0x2c, 0xc0, 0xdb, 0xc1, 0x9f, 0x48, 0xf5, 0xa2, 0x2b, 0xe0, 0xeb, 0x90, 0xe4, 0xbb, 0xee, 0xe4, 0x7f, 0xc0, 0x11, 0xae, 0x7f, 0xcd, 0xa4, 0xa0, 0x12, 0x37, 0xba, 0x3, 0xe9, 0x81, 0xcf, 0x97, 0x71, 0xd8, 0x6d, 0x1c, 0xde, 0xa8, 0x4a, 0x7d, 0xcf, 0x4c, 0x68, 0xd5, 0x3f, 0xf4, 0x6b, 0xaf, 0x92, 0xa1, 0xa, 0x36, 0x80, 0xcf, 0xee, 0x26, 0x2b, 0x82, 0x6a, 0x54, 0x0, 0x30, 0xf, 0x96, 0xbd, 0xfe, 0xd8, 0x9a, 0xf5, 0x43, 0x3c, 0x7b, 0x40, 0xba, 0x82, 0x9c, 0x24, 0xfe, 0xe5, 0xca, 0x86, 0x4c, 0x74, 0x63, 0x24, 0xc7, 0xae, 0xf, 0x9e, 0x72, 0x62, 0x91, 0x94, 0xe8, 0x51, 0xf5, 0x87, 0x15, 0x6, 0xeb, 0x6c, 0x44, 0x93, 0x3f, 0x3, 0x84, 0x2e, 0xe8, 0x8b, 0xd1, 0xb0, 0x5e, 0x1e, 0xef, 0x2f, 0x58, 0x7a, 0xe, 0x7f, 0x96, 0x89, 0xfa, 0x21, 0xe9, 0xa6, 0xd5, 0x87, 0xf6, 0xbc, 0xba, 0x9, 0x7a, 0xd3, 0xf3, 0x4c, 0xee, 0xdf, 0x65, 0xc4, 0x93, 0xb4, 0x65, 0x69, 0xf0, 0x94, 0x30, 0xc0, 0x35, 0x76, 0x1c, 0x9a, 0x8b, 0x63, 0x9f, 0x5e, 0xf0, 0x66, 0x64, 0x78, 0x66, 0x76, 0x25, 0xa7, 0x4d, 0xc0, 0x8, 0x68, 0xaf, 0xcc, 0xfc, 0xcc, 0x8f, 0x76, 0x90, 0xb6, 0x2e, 0xca, 0x62, 0xb3, 0x35, 0xb8, 0x7d, 0xd3, 0x2, 0xf4, 0xce, 0xfc, 0xfd, 0xe2, 0xd0, 0xc0, 0xfa, 0xe, 0x90, 0xd9, 0x38, 0xb6, 0xef, 0xcd, 0xc9, 0xef, 0x8b, 0x9a, 0x66, 0xd1, 0x72, 0x2b, 0xf1, 0x2a, 0xbd, 0xcc, 0x74, 0x57, 0xbc, 0x36, 0xc5, 0x33, 0xe, 0x87, 0x34, 0xfb, 0x9, 0x19, 0xb2, 0x30, 0xca, 0x5a, 0xf2, 0x7d, 0xf7, 0xa2, 0x8f, 0xc3, 0xf5, 0xf3, 0x81, 0xbf, 0x2b, 0xf0, 0xc5, 0x74, 0x81, 0x45, 0x7e, 0xaf, 0xae, 0xa5, 0x25, 0x5, 0xae, 0x54, 0x3c, 0x43, 0xba, 0xaa, 0xd2, 0x88, 0xc5, 0x56, 0x6a, 0x80, 0xdb, 0x75, 0x97, 0xed, 0x7d, 0xb3, 0xed, 0xc0, 0x8a, 0x73, 0x20, 0xd3, 0x51, 0x1f, 0xcc, 0x66, 0xee, 0xb6, 0xfd, 0x25, 0x76, 0xd, 0x60, 0x10, 0x17, 0x1d, 0x66, 0xac, 0x76, 0xed, 0xd1, 0xbd, 0xf3, 0xc1, 0x1e, 0x93, 0xf1, 0x43, 0xee, 0x19, 0x62, 0x1d, 0xc1, 0x65, 0x97, 0x9d, 0x82, 0x60, 0x3e, 0x7c, 0xd5, 0x5c, 0xe8, 0xe6, 0x4b, 0x98, 0xa3, 0x91, 0x6c, 0xd2, 0xbd, 0x53, 0xc, 0x8b, 0x9, 0x93, 0x8d, 0xf0, 0xea, 0xe4, 0x16, 0xc0, 0x5b, 0x9e, 0xbc, 0x94, 0x2b, 0x3d, 0xd4, 0x11, 0x39, 0x68, 0x91, 0xd3, 0x55, 0x11, 0x70, 0x73, 0xd7, 0x5a, 0x6c, 0x88, 0x15, 0x7, 0xb0, 0x20, 0x26, 0x76, 0x37, 0xe0, 0x59, 0xba, 0x80, 0xaa, 0xec, 0xc9, 0x1, 0x7f, 0x51, 0x8e, 0x53, 0x68, 0x1a, 0x41, 0x83, 0x30, 0xaf, 0x28, 0x81, 0xe8, 0xf1, 0x70, 0x3, 0x97, 0x4b, 0xc1, 0xde, 0x91, 0xdb, 0xc3, 0x5c, 0x62, 0x7, 0x31, 0xac, 0x1, 0x6c, 0x66, 0xf9, 0xfe, 0xc3, 0x7a, 0x5, 0xd5, 0x77, 0xd5, 0xa8, 0xb2, 0xf7, 0x5d, 0xbe, 0x92, 0x99, 0x62, 0xf2, 0xb0, 0x24, 0x39, 0x35, 0x0, 0xe5, 0xc8, 0x79, 0xf5, 0x7a, 0xed, 0x41, 0x13, 0x93, 0x3d, 0xfa, 0xb8, 0x49, 0x9d, 0xb5, 0xa7, 0x2c, 0x27, 0x23, 0x42, 0xa4, 0xc4, 0xb8, 0x83, 0x47, 0x19, 0xcb, 0x3d, 0xe4, 0x2, 0x13, 0xed, 0x1, 0x3c, 0x41, 0x4e, 0xce, 0x44, 0x7e, 0xe1, 0x27, 0x91, 0x99, 0x6d, 0xfb, 0xad, 0xb3, 0x33, 0x75, 0xbf, 0x86, 0xee, 0xca, 0x96, 0xaa, 0x25, 0xe6, 0x2f, 0x90, 0xf6, 0x7d, 0xe4, 0xaa, 0xe5, 0xe4, 0x40, 0x35, 0xb7, 0x8c, 0x15, 0x4a, 0x1b, 0x7b, 0x1d, 0x80, 0x32, 0x69, 0xa3, 0xe2, 0x27, 0x9e, 0xc9, 0x71, 0xe5, 0x97, 0xf1, 0xd9, 0x10, 0xc0, 0x76, 0xcb, 0x40, 0xae, 0xc0, 0x67, 0x31, 0x89, 0xc2, 0x8, 0xc3, 0xf2, 0x58, 0x79, 0xeb, 0xd3, 0x9d, 0xef, 0xa6, 0xb1, 0x79, 0x8, 0x30, 0xfc, 0x6d, 0x22, 0xa7, 0x36, 0x6, 0xdf, 0x7e, 0x62, 0xb3, 0xd0, 0x6c, 0xed, 0x7e, 0xc3, 0x7b, 0x6c, 0xce, 0xfb, 0x4e, 0x21, 0x90, 0x69, 0x8d, 0x5, 0x2a, 0xf9, 0x75, 0xe3, 0x66, 0x25, 0x77, 0x79, 0x4c, 0x6d, 0x58, 0x3a, 0xd2, 0x1a, 0x76, 0xf1, 0xa5, 0x8c, 0x37, 0xac, 0xa8, 0x65, 0x14, 0xfc, 0x86, 0xd, 0x65, 0x51, 0xa2, 0x2b, 0x84, 0x57, 0xd4, 0x4e, 0x7a, 0x33, 0x49, 0x23, 0x42, 0xe6, 0xe3, 0x65, 0x6b, 0x57, 0xd6, 0xaa, 0x31, 0xb7, 0x43, 0x15, 0xaf, 0x69, 0xc3, 0xfe, 0xcb, 0x98, 0xfe, 0xce, 0xa4, 0xfb, 0xbe, 0x47, 0x9f, 0x90, 0xda, 0x87, 0xb5, 0x13, 0x2d, 0x31, 0x41, 0xfb, 0xe9, 0x62, 0x65, 0xfe, 0xce, 0xf1, 0xef, 0x59, 0xea, 0x91, 0xa6, 0xf6, 0x4c, 0xfc, 0x5, 0x7a, 0x47, 0x30, 0xcc, 0x3d, 0xfd, 0xf, 0xb, 0x61, 0x24, 0x63, 0xa1, 0x56, 0x59, 0x35, 0x5b, 0x3b, 0x6f, 0xf1, 0xa1, 0x24, 0xec, 0x24, 0x42, 0x53, 0x8d, 0x14, 0x5b, 0x2a, 0x1, 0x77, 0xf9, 0x7b, 0x4e, 0x83, 0xdc, 0xbc, 0x9d, 0xc6, 0xb2, 0x75, 0x5e, 0xfc, 0x7b, 0x6c, 0xda, 0xc3, 0x3, 0x29, 0x7a, 0xa7, 0x3a, 0x71, 0x2, 0x91, 0xca, 0x3c, 0xf0, 0xd, 0xde, 0x55, 0xdc, 0x6, 0x78, 0x4a, 0xca, 0xd5, 0xcb, 0xcb, 0x76, 0xb4, 0x6d, 0x7, 0x58, 0xca, 0xe1, 0x1e, 0xa3, 0x37, 0x5f, 0x62, 0x5d, 0xe1, 0xfd, 0x16, 0xf4, 0x1a, 0xf4, 0x20, 0xf5, 0x9a, 0xf4, 0xb5, 0x2d, 0x34, 0x7d, 0xb1, 0xc5, 0xc5, 0x96, 0x9b, 0xeb, 0x4c, 0xeb, 0xb7, 0x43, 0x5c, 0x15, 0x1a, 0x37, 0x77, 0x4e, 0x10, 0x30, 0x99, 0x2e, 0xaf, 0x43, 0x5d, 0x67, 0xda, 0x87, 0x29, 0x1d, 0x72, 0xfd, 0x99, 0x85, 0xc0, 0xc1, 0x2b, 0xef, 0xb2, 0xf6, 0x42, 0x93, 0x7b, 0x4b, 0x89, 0x96, 0xf0, 0x71, 0x8e, 0x7c, 0xf2, 0xad, 0x1e, 0x20, 0xfc, 0x3e, 0x1f, 0x4a, 0x9f, 0x9d, 0x47, 0xf3, 0x4, 0x97, 0x2a, 0x70, 0x42, 0xa7, 0xf8, 0xe0, 0xc, 0xa4, 0xeb, 0xb3, 0xb6, 0x44, 0xfd, 0xea, 0xd0, 0xe0, 0xc1, 0xc1, 0x29, 0x9f, 0x73, 0xf9, 0x5e, 0x50, 0x9d, 0x61, 0x1a, 0x47, 0x91, 0x0, 0x3e, 0x26, 0x7c, 0x9d, 0x96, 0x9c, 0x5f, 0xc1, 0x33, 0xbe, 0xaf, 0x83, 0x85, 0x72, 0xe4, 0x5b, 0x92, 0xe0, 0xf1, 0x4, 0xaf, 0xd6, 0xb6, 0xa3, 0x11, 0x9d, 0x1a, 0x75, 0xb9, 0x26, 0x65, 0xe7, 0xd2, 0xe4, 0x4a, 0x9a, 0x6d, 0xb2, 0xc5, 0x2e, 0x8d, 0xfb, 0xf6, 0x2, 0xd9, 0xf4, 0x66, 0xeb, 0x64, 0x21, 0x91, 0x96, 0x61, 0xc5, 0x63, 0x40, 0x0, 0x30, 0xef, 0x80, 0xc1, 0x50, 0x70, 0xeb, 0xf0, 0xb3, 0xa5, 0xea, 0x33, 0x1c, 0x8d, 0x28, 0xd8, 0x6f, 0x80, 0x7, 0xd6, 0x68, 0x7c, 0xe8, 0xf, 0xf5, 0xbb, 0x4b, 0xd5, 0xf9, 0xf7, 0xb2, 0x27, 0x66, 0x8d, 0xac, 0x3a, 0x2f, 0x97, 0x25, 0x3b, 0xc1, 0xe8, 0x10, 0x74, 0x77, 0x54, 0xf8, 0x60, 0x4a, 0x2b, 0x87, 0x6c, 0xef, 0x50, 0xcc, 0x1b, 0x52, 0x13, 0x46, 0xa4, 0x34, 0x2a, 0xab, 0xd1, 0x15, 0x3e, 0x98, 0x90, 0xc1, 0xc5, 0x39, 0x12, 0x55, 0x90, 0x59, 0xdf, 0xe5, 0xdd, 0x61, 0xf3, 0x75, 0x22, 0x9f, 0x21, 0xf6, 0x17, 0xe4, 0x4b, 0x89, 0x1d, 0x45, 0xb6, 0xc8, 0x50, 0x7, 0xaa, 0xbd, 0xb0, 0x78, 0xb9, 0x4a, 0xb0, 0x75, 0xbd, 0x89, 0x85, 0x45, 0xd4, 0x9f, 0xfd, 0x3b, 0xb6, 0x20, 0x91, 0xee, 0x30, 0x3e, 0x1, 0xf1, 0x3e, 0x74, 0xa4, 0x23, 0x93, 0xaf, 0x51, 0x2b, 0x9e, 0x4d, 0xd1, 0x48, 0xae, 0xff, 0x96, 0xea, 0x32, 0x1d, 0x8a, 0x69, 0xbe, 0xd, 0xdc, 0x71, 0xa4, 0xcc, 0x80, 0x1, 0xd2, 0x62, 0x49, 0x91, 0x63, 0x89, 0x56, 0xc3, 0x77, 0x6, 0xe6, 0x1a, 0x44, 0xc4, 0x7b, 0x43, 0xb1, 0x27, 0xf2, 0x8c, 0x7a, 0x2c, 0x96, 0xc9, 0x3b, 0xc8, 0x50, 0xc6, 0xc4, 0xcf, 0x7c, 0xfe, 0xdd, 0xc7, 0xc2, 0x23, 0x48, 0x9d, 0x92, 0x1b, 0x9d, 0xc8, 0x25, 0xf9, 0x33, 0x3c, 0x78, 0x6, 0x4b, 0xf7, 0x60, 0x44, 0x5a, 0x47, 0x90, 0xa5, 0x49, 0x8d, 0x2c, 0xac, 0xa0, 0xbb, 0x7, 0xb8, 0x7, 0xb4, 0x40, 0xfb, 0x3a, 0x8f, 0xff, 0x69, 0x2d, 0x36, 0x1e, 0x9d, 0xa4, 0x64, 0xef, 0xcb, 0x81, 0x96, 0x3e, 0xa3, 0xb2, 0xb4, 0x2f, 0x33, 0xfa, 0xe5, 0xec, 0x67, 0xe3, 0x10, 0x9f, 0x73, 0x9b, 0xa9, 0x0, 0x69, 0x25, 0x59, 0x52, 0xff, 0xa9, 0x1c, 0x34, 0xc3, 0x41, 0xd0, 0xe2, 0xa9, 0x26, 0xa6, 0x18, 0xee, 0xdd, 0xd, 0x58, 0x29, 0x85, 0x36, 0xa8, 0xa5, 0xcd, 0xe3, 0x7d, 0x9d, 0x81, 0xc, 0x47, 0xf3, 0x9c, 0xcf, 0x62, 0x20, 0x86, 0x25, 0xf0, 0xed, 0xb0, 0xed, 0x10, 0xc0, 0xfa, 0x22, 0x35, 0xf4, 0xae, 0xb1, 0xa4, 0x13, 0x35, 0x41, 0x31, 0x30, 0x4b, 0xb9, 0x22, 0xdb, 0x2a, 0xe0, 0x92, 0xc7, 0x5b, 0xa4, 0xea, 0xa1, 0xe9, 0x8a, 0x3d, 0x99, 0x63, 0x1c, 0x1e, 0xcd, 0xd3, 0x6c, 0xad, 0x8a, 0x8a, 0x68, 0xce, 0xc5, 0xa7, 0x9c, 0x52, 0x89, 0x53, 0xa2, 0x72, 0xe5, 0xaa, 0xe3, 0xce, 0x2c, 0xfb, 0x1e, 0xa2, 0x2, 0x38, 0x64, 0x2b, 0xe0, 0x58, 0x3, 0x43, 0xc9, 0x6e, 0x1b, 0x9, 0xa7, 0x4, 0xb5, 0x7d, 0x9d, 0xfa, 0xb1, 0xd1, 0x6, 0x33, 0x47, 0x74, 0xc4, 0x32, 0x6d, 0x84, 0x58, 0x34, 0x9e, 0x9f, 0x37, 0x71, 0x7c, 0x51, 0x40, 0xca, 0xf6, 0xe, 0x13, 0x5f, 0x65, 0x65, 0x2f, 0x3f, 0x50, 0xf3, 0xf1, 0x88, 0x44, 0x6e, 0x52, 0x76, 0xa9, 0xe4, 0x7e, 0x17, 0xbd, 0x67, 0x84, 0xd1, 0x63, 0x13, 0x92, 0x13, 0xc9, 0x9d, 0x1d, 0x41, 0xe0, 0x69, 0xb0, 0x33, 0x4c, 0xd2, 0xd8, 0x51, 0x7f, 0xdf, 0x2c, 0xa, 0xda, 0xb5, 0x5e, 0x4f, 0x99, 0x7b, 0x19, 0xb1, 0x3c, 0xf, 0x1c, 0xe9, 0xea, 0x43, 0x28, 0xc5, 0xa6, 0x95, 0x3c, 0xa5, 0x7e, 0x9, 0xa6, 0xc9, 0xff, 0x66, 0x77, 0x67, 0xb8, 0x23, 0xd7, 0x93, 0x40, 0xea, 0x7b, 0xf9, 0x78, 0xb3, 0x4d, 0x73, 0x1f, 0x8e, 0xb4, 0xac, 0x77, 0x7b, 0xe3, 0x0, 0x5b, 0x2, 0x70, 0x46, 0xad, 0x24, 0xaf, 0xe7, 0xc8, 0x3d, 0x94, 0x85, 0xa, 0xd0, 0x16, 0xac, 0x15, 0x8a, 0xb9, 0x4, 0xb0, 0x43, 0x27, 0xba, 0x38, 0xdc, 0x3a, 0xee, 0x15, 0x44, 0x33, 0xf7, 0xf4, 0xc7, 0xb1, 0x5a, 0xd0, 0x62, 0x1e, 0x8f, 0xdf, 0x43, 0xea, 0xb6, 0xa3, 0x76, 0x9d, 0x5, 0x89, 0x61, 0x32, 0x46, 0xf, 0x3a, 0xa2, 0xb5, 0xb, 0xbd, 0x2f, 0x8c, 0x91, 0x1, 0x6a, 0xdb, 0x71, 0xc9, 0x5b, 0x94, 0x3f, 0x74, 0xb4, 0x4a, 0xd9, 0x1, 0x78, 0x2b, 0xe2, 0x6a, 0x67, 0x5e, 0xf6, 0x4d, 0xb9, 0x4c, 0x89, 0x95, 0xaf, 0xab, 0xbf, 0xfc, 0xaa, 0x41, 0x22, 0x6b, 0x27, 0x7, 0xdc, 0x9b, 0x7b, 0x8b, 0xa4, 0xdd, 0x5b, 0x62, 0x83, 0xf9, 0xea, 0xdf, 0xb4, 0xfc, 0xa3, 0xf2, 0xfa, 0x77, 0x59, 0x5b, 0x4b, 0x2c, 0x5, 0xef, 0x42, 0xd0, 0xbe, 0xf0, 0x91, 0x75, 0x6, 0x71, 0x7f, 0xe8, 0x9f, 0xc7, 0x4e, 0xf2, 0x22, 0xca, 0x73, 0x9c, 0xc8, 0x1b, 0x9f, 0x4a, 0xe6, 0x9e, 0xfa, 0x37, 0x7d, 0xf, 0xc, 0x75, 0xa, 0x88, 0x64, 0x7a, 0xcc, 0x83, 0x8e, 0x54, 0x4e, 0xe3, 0xcf, 0xba, 0x39, 0x5, 0xf, 0x11, 0xc, 0x76, 0x8c, 0x41, 0x3d, 0x88, 0x15, 0xf1, 0xb1, 0x4c, 0xaa, 0x4d, 0x3e, 0xff, 0x69, 0xfc, 0x5f, 0xb5, 0xe7, 0x33, 0x27, 0x27, 0x31, 0x5, 0x92, 0xbc, 0x47, 0xf1, 0x46, 0x94, 0xdf, 0x22, 0xd7, 0x34, 0x24, 0x5b, 0x88, 0x7c, 0x6b, 0xfc, 0xe6, 0x65, 0x4f, 0x44, 0x6a, 0xa8, 0x6e, 0xf1, 0xc3, 0x5a, 0x46, 0x1a, 0x7a, 0x1c, 0xd1, 0xf1, 0xb2, 0x1d, 0x46, 0x5a, 0x11, 0x72, 0xa1, 0x68, 0x6c, 0x95, 0xdd, 0x67, 0x47, 0x98, 0x46, 0x3a, 0xd1, 0xeb, 0xf2, 0x92, 0x33, 0xc7, 0xcd, 0x26, 0xe5, 0xcd, 0x9c, 0xa9, 0xc7, 0x81, 0x2b, 0x29, 0x22, 0xdc, 0x7f, 0x53, 0x8e, 0x98, 0x91, 0xd3, 0xa6, 0x69, 0xcf, 0xd8, 0x76, 0x2d, 0x85, 0x46, 0x24, 0x43, 0xff, 0xc5, 0xff, 0xbd, 0xdf, 0xae, 0xbd, 0xf4, 0x16, 0xb, 0x6d, 0xed, 0x6c, 0x74, 0x86, 0x60, 0x32, 0xfd, 0x23, 0x17, 0x3e, 0x4b, 0xff, 0x2f, 0x1d, 0xfb, 0x8b, 0xc8, 0x14, 0x9c, 0x1, 0x2d, 0xec, 0xf2, 0xc7, 0xd, 0x4b, 0x10, 0x45, 0xf2, 0x32, 0x8, 0x3e, 0x7e, 0x2b, 0xea, 0xad, 0xfb, 0xda, 0x0, 0x5f, 0xf, 0xfb, 0xfb, 0x99, 0x66, 0xcf, 0xe5, 0x29, 0xda, 0x7c, 0x82, 0x61, 0x23, 0x97, 0x4f, 0x26, 0xe6, 0x67, 0x5, 0xa9, 0x7e, 0x4f, 0xb1, 0x97, 0xb7, 0x5c, 0xae, 0xb6, 0xb7, 0x57, 0x32, 0x51, 0x3d, 0x90, 0x10, 0x9f, 0x3c, 0x4a, 0x45, 0x85, 0x24, 0x37, 0xbc, 0x69, 0xad, 0xc9, 0xd2, 0xd8, 0x44, 0xcb, 0x29, 0x6b, 0x24, 0x93, 0xda, 0x38, 0xac, 0xcb, 0xc8, 0x77, 0x1d, 0xa2, 0x40, 0xb5, 0x42, 0x8e, 0x91, 0x1, 0x35, 0xe4, 0xbf, 0x9b, 0x4e, 0x61, 0xc3, 0x56, 0x7a, 0x70, 0xfa, 0xff, 0x7f, 0xc2, 0xb, 0xe3, 0xf3, 0xa2, 0xb1, 0x6e, 0x11, 0x65, 0x83, 0xb0, 0x5a, 0xc0, 0xf0, 0xe5, 0xe, 0xab, 0x65, 0x49, 0xbf, 0x1b, 0x74, 0x4d, 0xbd, 0x4b, 0x46, 0x83, 0xca, 0x41, 0xec, 0xfe, 0x9f, 0xb0, 0xd0, 0x99, 0x5f, 0x70, 0xca, 0x1a, 0xfa, 0xa5, 0x2d, 0xf4, 0x56, 0xcc, 0xd6, 0xc5, 0x31, 0xb9, 0x52, 0xcc, 0xdd, 0x4e, 0x96, 0x49, 0xd8, 0xd8, 0x84, 0xc8, 0x15, 0x96, 0xe5, 0x8a, 0xb7, 0x53, 0xe3, 0xd4, 0xf1, 0xe3, 0xe4, 0xc, 0xa0, 0xb0, 0x46, 0xef, 0x14, 0x8a, 0x2d, 0x6, 0xfd, 0x73, 0x4b, 0x57, 0xab, 0xd5, 0x8, 0x64, 0xfd, 0x3f, 0x27, 0xd3, 0xc9, 0xd1, 0x41, 0xbc, 0x0, 0x78, 0xe7, 0x6b, 0xe7, 0xe1, 0x38, 0x35, 0x31, 0x50, 0x65, 0xc5, 0x37, 0x8b, 0xfe, 0x71, 0x1a, 0x33, 0x9b, 0x6b, 0x21, 0x16, 0xd9, 0x1c, 0x73, 0x8f, 0x38, 0xbb, 0xb, 0x5d, 0x82, 0xad, 0x8a, 0x86, 0xf8, 0x39, 0x7b, 0xb5, 0x34, 0xf6, 0xaf, 0x69, 0xcc, 0x75, 0xd4, 0x4f, 0x7f, 0xe2, 0x6e, 0x49, 0xd5, 0xd0, 0xcb, 0x58, 0x7e, 0xa4, 0x7f, 0xe0, 0x23, 0xd3, 0x3f, 0x79, 0x26, 0x8a, 0x49, 0xf3, 0x30, 0xfa, 0x72, 0x9b, 0x1a, 0xc6, 0x34, 0xd1, 0x96, 0xb6, 0xc9, 0xd9, 0xc9, 0x94, 0xd1, 0xa6, 0x80, 0x58, 0xa8, 0xec, 0x2b, 0x79, 0x95, 0x99, 0x3, 0xaf, 0x45, 0x46, 0xcc, 0xbd, 0x19, 0x62, 0xb7, 0x1c, 0x5b, 0xe0, 0xc2, 0x56, 0x7e, 0x7e, 0x56, 0x71, 0x91, 0xbf, 0xc0, 0xe, 0x10, 0xc9, 0xc4, 0x61, 0x86, 0x6f, 0x7, 0xe7, 0xd9, 0x4, 0xbc, 0xba, 0x5b, 0x8, 0x7b, 0xd6, 0x6a, 0xa9, 0x93, 0x5e, 0x59, 0x4, 0xb9, 0x9f, 0x9a, 0x24, 0xdc, 0xfb, 0xea, 0xc1, 0x26, 0x75, 0xb7, 0xb, 0xdd, 0xec, 0x67, 0xd3, 0x44, 0xd, 0x95, 0xd6, 0xc0, 0x9d, 0x17, 0x99, 0x39, 0x95, 0x3c, 0x6c, 0x79, 0x8c, 0xe5, 0xf8, 0x7e, 0xce, 0x7a, 0xe5, 0x66, 0xdd, 0x84, 0xae, 0xda, 0x9a, 0x33, 0x7f, 0x22, 0x45, 0x3e, 0xe1, 0x4a, 0x78, 0x57, 0xe7, 0x85, 0x2a, 0xb8, 0xc5, 0x46, 0xb0, 0x1f, 0x63, 0x37, 0xec, 0xae, 0x50, 0xaa, 0xb7, 0x58, 0x7, 0x30, 0x3b, 0xca, 0x4f, 0xdc, 0xbe, 0xb, 0x70, 0xc9, 0xa, 0x7e, 0x56, 0x82, 0xf, 0xd2, 0xf8, 0xf5, 0x4f, 0xd4, 0xd9, 0x71, 0x10, 0x18, 0xd, 0x24, 0x9e, 0xe9, 0xe, 0x36, 0x61, 0x66, 0x44, 0xb9, 0xb4, 0xac, 0xdc, 0x7c, 0x5, 0x5c, 0x32, 0xe5, 0x2f, 0xd1, 0x7c, 0x66, 0xe7, 0x3b, 0x4e, 0x97, 0x21, 0xb5, 0x97, 0xa2, 0x1f, 0x76, 0x3d, 0x8, 0xdb, 0xe7, 0x81, 0x40, 0xfa, 0x15, 0xbd, 0x6, 0xf2, 0xe6, 0x3b, 0x99, 0x31, 0x8c, 0x9f, 0xc1, 0x14, 0x9b, 0x26, 0x49, 0x89, 0x57, 0x23, 0xd9, 0xa9, 0x72, 0x8d, 0x46, 0x21, 0x11, 0x28, 0x1a, 0xe5, 0xc4, 0xf6, 0x9e, 0xd0, 0xb9, 0x66, 0xfb, 0xb8, 0x2b, 0x86, 0xf6, 0x39, 0x99, 0xaa, 0xdf, 0x22, 0x8d, 0x7f, 0xe7, 0x64, 0xac, 0x8a, 0xb0, 0x61, 0x44, 0x50, 0x10, 0x7b, 0x32, 0xf3, 0x7d, 0x4a, 0x4c, 0x4e, 0x70, 0x71, 0x5b, 0x1, 0xfe, 0x2f, 0x34, 0x34, 0x97, 0xd0, 0xe, 0x2, 0xd3, 0x8, 0x44, 0xaf, 0xe, 0xab, 0x7a, 0xb9, 0x63, 0xed, 0x9e, 0x90, 0xb1, 0x28, 0xec, 0x6, 0xc5, 0xa4, 0x83, 0xc5, 0xcb, 0x2c, 0x97, 0xfe, 0xac, 0xd1, 0x88, 0xd1, 0x7e, 0x95, 0xa2, 0xae, 0xf1, 0x12, 0x33, 0xd8, 0xae, 0x8b, 0x2d, 0x36, 0x25, 0x83, 0xb4, 0x6c, 0x2a, 0xef, 0x43, 0x5c, 0x19, 0x8e, 0x42, 0xde, 0xd, 0x13, 0xc6, 0x50, 0x60, 0xe, 0x5a, 0x2, 0x42, 0xc8, 0x5d, 0x6a, 0x68, 0x8, 0xa7, 0x72, 0xa9, 0x2d, 0xa8, 0xb4, 0x8, 0xe5, 0xa1, 0x99, 0x29, 0xb5, 0x4f, 0xcd, 0xad, 0xcd, 0x82, 0xa8, 0x3f, 0x2f, 0x95, 0x19, 0x63, 0x5f, 0x59, 0x68, 0xef, 0xa4, 0x6f, 0x76, 0x31, 0xe5, 0xf9, 0xa2, 0x2c, 0xe5, 0xd3, 0xc1, 0xe2, 0x57, 0x30, 0x5c, 0xaf, 0x20, 0xb8, 0x94, 0x1e, 0xe5, 0xf6, 0x28, 0x48, 0x1e, 0x4f, 0x5d, 0x2f, 0x1a, 0x75, 0xa1, 0x0, 0xf9, 0xa0, 0x58, 0x2c, 0x39, 0xb3, 0xad, 0x31, 0xe8, 0x66, 0x58, 0x6e, 0x1b, 0xca, 0x90, 0x5a, 0x4c, 0xbd, 0xa8, 0xa5, 0x10, 0xb9, 0x90, 0xf0, 0xd9, 0xda, 0x64, 0x68, 0x9, 0x49, 0xd2, 0x91, 0xca, 0xc1, 0xdb, 0x67, 0x3f, 0xbe, 0x93, 0x6a, 0x8e, 0x4c, 0x76, 0xf4, 0xf5, 0xba, 0x6f, 0xae, 0xac, 0xa0, 0x11, 0x14, 0xd2, 0xe0, 0xc6, 0x63, 0x15, 0xd8, 0x4a, 0xa, 0xda, 0x7f, 0x78, 0xfa, 0x28, 0x30, 0x80, 0x8c, 0x90, 0x1c, 0x49, 0x24, 0xd5, 0x7, 0x5f, 0x79, 0x4c, 0xe, 0xba, 0x57, 0x12, 0x7c, 0x82, 0x82, 0x61, 0xa8, 0xcb, 0x3d, 0x5f, 0x52, 0x72, 0x7e, 0xbd, 0xdd, 0x48, 0xa4, 0xd1, 0x15, 0xb8, 0x93, 0xf4, 0xfc, 0x96, 0x8f, 0x2d, 0x5f, 0xa9, 0xa, 0x3b, 0x26, 0x4c, 0xa, 0xba, 0x7f, 0x0, 0xa0, 0x63, 0x40, 0x51, 0xa1, 0x88, 0x46, 0x58, 0x9c, 0x6a, 0x5e, 0xc2, 0x64, 0x95, 0xca, 0xcb, 0xf, 0xdc, 0xf, 0x7b, 0x4d, 0x5a, 0xe, 0x74, 0x8a, 0x3f, 0xa3, 0xda, 0x75, 0x22, 0x54, 0x97, 0xca, 0xce, 0x67, 0x91, 0xf4, 0x83, 0xa0, 0x39, 0x79, 0x4b, 0xf6, 0x2c, 0x6d, 0x42, 0xbf, 0xd0, 0x3f, 0x72, 0x55, 0xe3, 0x55, 0x25, 0xe2, 0x44, 0xf1, 0xc4, 0x6, 0x6d, 0x6e, 0xa9, 0x61, 0xe, 0x88, 0x87, 0xdd, 0xa8, 0x68, 0x47, 0xd5, 0xe4, 0x8, 0xe5, 0x15, 0x38, 0x54, 0x15, 0x15, 0x5e, 0xb6, 0xb1, 0x72, 0xe7, 0xd7, 0x9, 0xa0, 0x2f, 0x30, 0xac, 0xd6, 0x9d, 0x43, 0x63, 0x6b, 0x8, 0x61, 0x4, 0xcc, 0x91, 0x95, 0x15, 0x51, 0x6e, 0xe6, 0x95, 0x94, 0xaa, 0x95, 0xb6, 0x31, 0xd5, 0xde, 0x79, 0x67, 0x94, 0x4c, 0x2d, 0x79, 0xbe, 0xc2, 0x89, 0xba, 0x82, 0x24, 0xbd, 0x19, 0xbf, 0xb, 0xa2, 0x8a, 0x65, 0xe2, 0x8e, 0x17, 0x79, 0x24, 0x32, 0x8a, 0x52, 0x0, 0xc0, 0x45, 0xe8, 0xea, 0xff, 0x4a, 0xbe, 0x24, 0xd9, 0x8b, 0x2c, 0x99, 0xed, 0xeb, 0x2b, 0x31, 0x51, 0xc2, 0x35, 0x4e, 0xc1, 0x2f, 0x80, 0x3f, 0xb9, 0x3c, 0x33, 0x41, 0x43, 0x7c, 0x5b, 0x73, 0x71, 0x62, 0xf3, 0xd4, 0x16, 0x4, 0x51, 0xa2, 0x3, 0x8e, 0x3c, 0x43, 0xbf, 0x9b, 0x6, 0x4d, 0x3f, 0x7c, 0x5a, 0x8f, 0xf7, 0x1, 0xae, 0x83, 0xd, 0x7, 0xed, 0x4e, 0x7c, 0xbe, 0xff, 0xa8, 0x50, 0x83, 0xf, 0xe1, 0x76, 0x6, 0x89, 0x4f, 0xc7, 0xe1, 0xf8, 0xda, 0x9d, 0x66, 0x9, 0x8, 0x7d, 0xd9, 0x2b, 0x75, 0xdc, 0x58, 0xb9, 0x1, 0x3a, 0x45, 0x5d, 0x21, 0xc, 0xc2, 0xdb, 0xab, 0x2b, 0xc1, 0x41, 0x16, 0x13, 0x9a, 0xd7, 0x89, 0xe6, 0xd4, 0x5e, 0xe0, 0x80, 0xda, 0xf0, 0xe8, 0x48, 0xc4, 0x70, 0xbb, 0x77, 0xeb, 0x5f, 0x50, 0x4b, 0xf7, 0x7e, 0x5, 0xb6, 0x2b, 0x3e, 0xbd, 0xef, 0xa5, 0x3c, 0x60, 0xce, 0x2d, 0xe2, 0x83, 0x75, 0xc7, 0x70, 0x5c, 0x2c, 0xf2, 0xb1, 0xe3, 0xfb, 0xcc, 0x4, 0x8e, 0x69, 0xe1, 0xf8, 0x1d, 0xb1, 0xc8, 0x5, 0x90, 0x16, 0x3, 0xe2, 0x7b, 0x87, 0x79, 0x61, 0x3c, 0x4f, 0x8c, 0x9e, 0x74, 0x32, 0x5, 0xfc, 0x53, 0x78, 0xa, 0x9d, 0xbc, 0x2d, 0x37, 0xd9, 0x54, 0x94, 0x93, 0x4f, 0x7d, 0x18, 0x1b, 0xe, 0x80, 0xb4, 0x9d, 0xce, 0x82, 0xe6, 0xe8, 0x68, 0x5e, 0x16, 0xd8, 0x9a, 0x12, 0xa9, 0x5b, 0x78, 0x7f, 0xbe, 0x35, 0x97, 0xe2, 0xf, 0x5a, 0xe3, 0xe5, 0x29, 0xf0, 0xec, 0xc1, 0x8e, 0xb3, 0xc2, 0x45, 0x86, 0xe5, 0x68, 0x31, 0x2f, 0xb2, 0x4c, 0xf9, 0xc7, 0x62, 0x73, 0x29, 0xe9, 0x39, 0xb, 0xc9, 0xd1, 0x66, 0x14, 0xbf, 0x4f, 0x2a, 0xae, 0xb, 0x92, 0x56, 0x76, 0x4f, 0x3e, 0x72, 0xb1, 0xbe, 0xf1, 0xb9, 0x4, 0x5d, 0x80, 0xb4, 0xd4, 0xdb, 0xdb, 0x8, 0x72, 0x9a, 0x72, 0x53, 0xca, 0xae, 0x87, 0x56, 0xe4, 0xad, 0x1a, 0xb7, 0x2, 0x9e, 0x5b, 0xc, 0xf4, 0x3, 0x53, 0xe8, 0x4, 0xee, 0x35, 0x92, 0x96, 0x7c, 0xa3, 0x2b, 0x63, 0xd6, 0x34, 0x20, 0xcc, 0x46, 0x5f, 0x5b, 0x54, 0xac, 0x96, 0xb2, 0x72, 0xef, 0x55, 0x62, 0xb0, 0x91, 0x7b, 0x1f, 0x5c, 0xec, 0xab, 0x21, 0xe8, 0x33, 0xbb, 0xc7, 0xe1, 0x79, 0xa, 0x17, 0x41, 0x9f, 0x3a, 0x28, 0xb4, 0x4, 0xbb, 0x5a, 0x47, 0x2a, 0xfd, 0x8f, 0xf2, 0xe1, 0xd, 0x8, 0xa5, 0x34, 0x19, 0x54, 0x1f, 0xff, 0xb0, 0x1a, 0xf3, 0xbb, 0x4, 0x76, 0x39, 0xe1, 0x19, 0xb4, 0xa6, 0x17, 0x37, 0x3, 0xe6, 0xa8, 0xb2, 0xb9, 0x2c, 0xf1, 0xe, 0x5d, 0xe4, 0x1, 0xd6, 0x8e, 0xe9, 0x15, 0xb5, 0xf5, 0xa, 0x3f, 0x56, 0x9b, 0x4f, 0x98, 0x33, 0xb6, 0x9d, 0x12, 0x9b, 0x65, 0x4a, 0x7e, 0xa4, 0x2f, 0xba, 0x4a, 0xe3, 0x82, 0x9d, 0x3f, 0x9e, 0xd1, 0x82, 0x6f, 0xb5, 0xb4, 0x34, 0x44, 0x3a, 0xcf, 0x9c, 0x1, 0x31, 0xdc, 0x54, 0x79, 0x1a, 0x11, 0x81, 0x45, 0xa3, 0xa7, 0x72, 0x49, 0xe3, 0xd, 0xc8, 0xda, 0xa9, 0xdd, 0xb8, 0xf6, 0x74, 0x54, 0xd0, 0x43, 0xb0, 0x1a, 0x7b, 0x13, 0x11, 0x9e, 0x31, 0x1c, 0x2, 0x3f, 0xc0, 0x5c, 0xed, 0xce, 0x54, 0xa7, 0x0, 0xd4, 0x5a, 0xea, 0xcb, 0x94, 0xc7, 0xa2, 0xa, 0xb6, 0x15, 0xc0, 0x70, 0xf4, 0x67, 0x3e, 0x9, 0x86, 0x9b, 0x20, 0xb1, 0xfd, 0xef, 0x3, 0x2, 0xbf, 0x6c, 0x9d, 0xb1, 0xed, 0x63, 0xf0, 0x21, 0x5b, 0x27, 0xf, 0x98, 0x76, 0x34, 0xf5, 0x59, 0x80, 0x5e, 0xac, 0xb7, 0xd7, 0x56, 0x24, 0x20, 0xc9, 0xed, 0x0, 0x49, 0x5f, 0xc0, 0xa8, 0xe5, 0x86, 0x1e, 0xf0, 0x70, 0xb4, 0x8e, 0xc0, 0x4, 0xce, 0x98, 0xcd, 0x1d, 0x24, 0xc2, 0x4a, 0xf7, 0xdb, 0x30, 0xe8, 0xe2, 0xc, 0xcc, 0x77, 0x7e, 0x6b, 0x3f, 0x7e, 0xc9, 0xe9, 0xfe, 0xcd, 0x72, 0x61, 0x74, 0xda, 0xb6, 0xb4, 0xca, 0xb, 0xc1, 0xb9, 0x6, 0x98, 0xb5, 0xfc, 0xd2, 0x2, 0x3b, 0x47, 0x6f, 0xde, 0xa1, 0x89, 0x5e, 0x18, 0x85, 0xd4, 0xc4, 0xb6, 0xe, 0x1f, 0x93, 0xe6, 0x39, 0x4, 0x5b, 0xfa, 0xd4, 0xbd, 0x40, 0x44, 0x4d, 0xb8, 0x7e, 0xbe, 0x34, 0x6e, 0x78, 0x18, 0x54, 0xbc, 0x59, 0x72, 0x9d, 0x21, 0xe5, 0x80, 0x63, 0xde, 0x7e, 0x74, 0xa9, 0x34, 0x72, 0xe3, 0x74, 0x13, 0x10, 0x1b, 0x36, 0xb1, 0xfb, 0xc9, 0x4f, 0xef, 0x57, 0xf3, 0x3c, 0x73, 0x33, 0xb5, 0xe7, 0x93, 0x41, 0x1c, 0x99, 0x2c, 0xdd, 0xa2, 0x6a, 0x7a, 0x91, 0x70, 0xa7, 0xd2, 0xe4, 0x87, 0x78, 0xcb, 0x24, 0xd, 0xc2, 0xb4, 0x9, 0x18, 0xdd, 0x3e, 0x2d, 0x9c, 0x8e, 0xc3, 0xd7, 0x4c, 0x0, 0xbe, 0xa, 0x97, 0xa9, 0xab, 0x5b, 0x7c, 0xc7, 0x10, 0xd7, 0x98, 0xd5, 0x51, 0x3, 0xac, 0x20, 0xa4, 0x4d, 0x3a, 0xcb, 0x66, 0x41, 0x2c, 0x27, 0x1f, 0xde, 0x71, 0xca, 0x1a, 0xfe, 0x82, 0xdb, 0xf, 0x4b, 0xf5, 0xd8, 0xf2, 0x79, 0x6e, 0x74, 0x9b, 0x3e, 0x57, 0x4b, 0x36, 0xc7, 0x7f, 0x6e, 0x40, 0x50, 0x4b, 0xfd, 0x46, 0x3f, 0xd0, 0x75, 0x7b, 0xd8, 0x98, 0xb, 0x6d, 0xc3, 0x1c, 0x5c, 0xa1, 0x2d, 0x47, 0x1f, 0xf1, 0xa3, 0x3b, 0x51, 0x7f, 0x23, 0xaf, 0xc3, 0xaa, 0x7e, 0x92, 0x52, 0x67, 0x87, 0x39, 0xd7, 0x65, 0x60, 0xa0, 0xfa, 0xb, 0xce, 0xc6, 0x97, 0xb4, 0x72, 0x2e, 0x4, 0x61, 0x23, 0x9f, 0xa, 0xc4, 0xc, 0xed, 0xda, 0x4a, 0xbb, 0xc1, 0x2f, 0x1c, 0xe1, 0xc2, 0xdd, 0xf8, 0x9e, 0x1a, 0xc, 0x77, 0xa5, 0x1d, 0x63, 0xbf, 0x72, 0x2, 0x68, 0x44, 0xfe, 0x4c, 0x8a, 0xc3, 0x5c, 0xfb, 0x62, 0x72, 0x9f, 0x6b, 0xc7, 0xdd, 0x77, 0xb1, 0xab, 0x26, 0xaf, 0xd0, 0x79, 0x64, 0xd5, 0x91, 0x78, 0x68, 0xb5, 0x2a, 0xf8, 0x73, 0x21, 0x23, 0x72, 0xa9, 0x68, 0x67, 0x2b, 0x19, 0x66, 0x1f, 0x8c, 0xb0, 0x3b, 0xbb, 0xef, 0x58, 0x83, 0xd1, 0xa6, 0xdb, 0x11, 0x9c, 0xb2, 0x3a, 0x6d, 0x91, 0xb0, 0x97, 0x27, 0x9e, 0x51, 0x90, 0xe2, 0x88, 0x91, 0xf0, 0x18, 0xdc, 0xd4, 0x7f, 0xca, 0xb0, 0x98, 0xe3, 0x86, 0x8e, 0x64, 0xe3, 0xaa, 0xb3, 0x38, 0x45, 0x81, 0x8f, 0x24, 0x34, 0x43, 0x20, 0xbc, 0x64, 0x58, 0x34, 0xb5, 0x24, 0x75, 0x12, 0x1d, 0xbc, 0xb5, 0xd6, 0x66, 0xd3, 0x72, 0xf5, 0x14, 0xd, 0x8, 0x12, 0xe3, 0xeb, 0xaf, 0xab, 0x16, 0xa7, 0x15, 0xed, 0x13, 0xbe, 0x67, 0xa9, 0xdb, 0x27, 0xce, 0x18, 0x6f, 0x2d, 0x55, 0x8, 0xef, 0x26, 0xe8, 0xc9, 0x96, 0xe0, 0x63, 0x2b, 0xbe, 0x6, 0x1b, 0x19, 0x2c, 0xb5, 0x38, 0x3c, 0x98, 0x45, 0x31, 0x9d, 0x85, 0x8b, 0xbc, 0x7a, 0x63, 0x6c, 0x17, 0x4f, 0xb1, 0xe6, 0x7b, 0xff, 0xca, 0x9d, 0xfb, 0x93, 0x27, 0x5a, 0x6a, 0xa6, 0x35, 0x5f, 0xa5, 0xe5, 0xeb, 0x59, 0xdc, 0x87, 0x9f, 0xcd, 0x1d, 0xec, 0x7c, 0x60, 0xf5, 0xdb, 0xfb, 0xd3, 0x5c, 0x59, 0x7c, 0x57, 0x32, 0xeb, 0x26, 0x22, 0x3b, 0x54, 0x5b, 0xfd, 0x35, 0xc9, 0xc4, 0x46, 0x6, 0x8, 0x69, 0x96, 0x16, 0x53, 0x1d, 0x38, 0x52, 0x34, 0xb9, 0x69, 0xde, 0xcd, 0x88, 0x0, 0x1c, 0x20, 0x57, 0xc7, 0xaf, 0x86, 0x9a, 0x51, 0x22, 0xe9, 0xdd, 0xa8, 0xce, 0x35, 0xbd, 0x95, 0x38, 0x4, 0xe3, 0xd, 0x97, 0x55, 0x85, 0xe1, 0xc1, 0x8, 0x76, 0x5e, 0x93, 0x35, 0x25, 0xa9, 0xdf, 0x67, 0x82, 0x8b, 0xa3, 0x2e, 0x32, 0x57, 0xa, 0xc6, 0xd4, 0xb5, 0xf8, 0x4e, 0x80, 0x77, 0x79, 0xbf, 0xe0, 0xb5, 0xdb, 0x94, 0xc0, 0x68, 0xea, 0x33, 0x62, 0x10, 0xd4, 0x68, 0xd9, 0x2e, 0x6, 0x7d, 0xb7, 0x2d, 0x0, 0xb3, 0x58, 0xbc, 0x9b, 0x71, 0x3e, 0x58, 0x9d, 0xc4, 0x3d, 0x3d, 0xdd, 0xe7, 0x68, 0x58, 0x5e, 0x3a, 0x1, 0x40, 0x57, 0x82, 0x8d, 0x1b, 0x3c, 0x9e, 0x3c, 0x47, 0x17, 0x31, 0x21, 0xab, 0xb6, 0x99, 0x7c, 0xa7, 0xa2, 0xb0, 0xc, 0xf2, 0x88, 0xf8, 0xc2, 0xb3, 0xa3, 0x48, 0x5c, 0xca, 0xd4, 0x27, 0x29, 0xe1, 0x4b, 0x5c, 0x4c, 0x8e, 0x84, 0x8f, 0x51, 0x16, 0x3f, 0xf2, 0xb0, 0xcb, 0x7b, 0x75, 0xc, 0x22, 0x89, 0xf7, 0x84, 0x96, 0xeb, 0x5d, 0x32, 0xbb, 0x1c, 0xbd, 0x35, 0xa, 0xe1, 0xd, 0x7d, 0xfb, 0x86, 0xb1, 0xbd, 0x85, 0x96, 0x2c, 0xb2, 0xe3, 0x50, 0x73, 0xd0, 0x41, 0xc6, 0x45, 0xef, 0x3e, 0x39, 0x95, 0x3f, 0x44, 0x6d, 0x7b, 0xd0, 0xf1, 0xf, 0x87, 0xb8, 0xf3, 0x24, 0x17, 0x99, 0x91, 0x3e, 0x91, 0xc7, 0x86, 0xd6, 0xcb, 0x39, 0x9c, 0x79, 0xda, 0x5e, 0x1e, 0xfc, 0xd4, 0x63, 0xc7, 0x95, 0xb5, 0xdd, 0x54, 0xed, 0x4f, 0xac, 0xb, 0xb8, 0x63, 0x6b, 0x16, 0xb5, 0x5f, 0x7e, 0x69, 0xfc, 0xa0, 0x6e, 0x64, 0xc9, 0xf1, 0xd0, 0xba, 0x8, 0x77, 0x73, 0xa5, 0x2c, 0xa9, 0x11, 0x5f, 0x74, 0x28, 0x96, 0x7a, 0x96, 0x86, 0x9a, 0x58, 0x79, 0xf3, 0x61, 0x9f, 0x65, 0xa2, 0x47, 0x65, 0xa, 0xcf, 0x64, 0xcb, 0xb, 0x38, 0x33, 0x30, 0xf4, 0x18, 0x12, 0x74, 0x8a, 0xd9, 0xf, 0xe4, 0xe4, 0x1d, 0xfc, 0xb8, 0xed, 0x9e, 0xf0, 0x8f, 0xec, 0xc4, 0xae, 0x83, 0x60, 0xc5, 0x95, 0xe1, 0xb5, 0x6d, 0xde, 0xa1, 0x16, 0xdc, 0x7, 0x56, 0xb0, 0x7, 0x33, 0x97, 0x70, 0xd4, 0xc0, 0x86, 0xc1, 0x82, 0x14, 0x66, 0x3a, 0x4c, 0x51, 0xac, 0x19, 0x83, 0xa0, 0xb3, 0xe6, 0x79, 0x9, 0x61, 0xfd, 0x20, 0x53, 0x23, 0x7, 0xd4, 0x93, 0xe5, 0xd3, 0xb, 0x1d, 0xcc, 0xba, 0x80, 0xaa, 0xfc, 0x6, 0xc0, 0xa, 0x15, 0x25, 0x0, 0xd2, 0xe, 0xc6, 0xd9, 0xb1, 0x92, 0xb, 0x78, 0xaf, 0xd0, 0x7e, 0xe, 0x61, 0x31, 0xce, 0xa9, 0x80, 0x6e, 0x44, 0xbf, 0xf5, 0x4b, 0xb5, 0x20, 0x3c, 0x1d, 0x1, 0x1c, 0x44, 0xc3, 0x96, 0x15, 0x19, 0xa1, 0x6d, 0xf7, 0x77, 0xb4, 0x94, 0x40, 0x4d, 0x2b, 0x5b, 0x2e, 0x97, 0x5f, 0xde, 0x96, 0x5e, 0x4f, 0x95, 0x49, 0x4b, 0x59, 0xd, 0x87, 0x4f, 0xa, 0xe4, 0xa8, 0x6c, 0xef, 0x8d, 0xa6, 0x45, 0x6f, 0x88, 0xe2, 0x9e, 0x13, 0x9a, 0x43, 0xc4, 0xec, 0x60, 0x2, 0xae, 0x1f, 0xb7, 0xcf, 0xb4, 0x3e, 0xcd, 0xae, 0x45, 0x20, 0x76, 0x32, 0x4e, 0xb6, 0xd9, 0xc5, 0x50, 0xf3, 0x2c, 0x18, 0x86, 0xdb, 0xda, 0xa, 0x47, 0x72, 0x50, 0x66, 0xaa, 0x2c, 0x9b, 0xf3, 0x9a, 0xef, 0x24, 0xd3, 0xef, 0xa4, 0x2f, 0x32, 0x78, 0x31, 0xbd, 0x27, 0xc3, 0x94, 0x33, 0x15, 0x3d, 0xb0, 0xda, 0x29, 0x31, 0x71, 0xf2, 0xd5, 0x81, 0xf5, 0x27, 0x80, 0xf4, 0x42, 0xc, 0x2e, 0xc7, 0x17, 0xe7, 0x36, 0x85, 0xbc, 0xcd, 0x40, 0xaa, 0xf, 0x9d, 0x36, 0x2d, 0x7a, 0x65, 0x5a, 0xf4, 0xe6, 0x74, 0x7f, 0xea, 0xc4, 0xbf, 0x3b, 0xb0, 0xf0, 0x69, 0x7c, 0xf3, 0x89, 0x7, 0xb7, 0x4a, 0x2d, 0x80, 0xc5, 0x1, 0x78, 0xd8, 0x26, 0x32, 0x97, 0xf4, 0xd, 0x36, 0x4c, 0x42, 0xe7, 0x4f, 0x50, 0xd, 0x89, 0x5f, 0xe5, 0xd4, 0xae, 0x9e, 0xc6, 0x29, 0x37, 0xdd, 0x5c, 0x99, 0x8e, 0x20, 0xf3, 0xea, 0xd, 0xd0, 0x5c, 0xbd, 0x43, 0xf7, 0x7d, 0x84, 0x61, 0xf1, 0x10, 0x13, 0x5a, 0xfe, 0x25, 0x3f, 0x1a, 0x94, 0xa2, 0x75, 0xe7, 0x34, 0xea, 0x42, 0x6a, 0x9b, 0x42, 0xd5, 0x4, 0x7a, 0xb9, 0x41, 0xaf, 0x3d, 0x85, 0x7e, 0x59, 0xfa, 0x89, 0xb, 0x6b, 0x72, 0x27, 0xec, 0x58, 0x4c, 0xde, 0x43, 0xd, 0x3, 0x6a, 0xb1, 0x8e, 0xed, 0x57, 0xcf, 0x9d, 0xec, 0xe1, 0xe5, 0xe1, 0x65, 0x81, 0xff, 0x7c, 0x69, 0xc1, 0x70, 0xa7, 0xb7, 0x22, 0x2b, 0x6e, 0x9f, 0x8f, 0x91, 0x6d, 0x1e, 0xb7, 0x82, 0x4e, 0xc6, 0x9a, 0x7a, 0x27, 0x7c, 0xcf, 0x35, 0x1f, 0x7b, 0xc8, 0x69, 0xc8, 0xe5, 0x37, 0xd2, 0xd1, 0x55, 0x37, 0x69, 0xfa, 0x29, 0x44, 0x9c, 0x57, 0xde, 0xee, 0x74, 0xc5, 0x5, 0xc, 0x59, 0x6d, 0x33, 0x2b, 0x91, 0xbb, 0x45, 0xeb, 0x4d, 0x7d, 0x77, 0x85, 0x2d, 0x17, 0x5d, 0x67, 0x65, 0x6c, 0x7b, 0xa9, 0xcc, 0x37, 0x1a, 0x8a, 0x3a, 0x37, 0x25, 0x3a, 0x43, 0xa1, 0x1c, 0x3a, 0x35, 0x77, 0x1c, 0xa8, 0x94, 0x3c, 0xd2, 0xed, 0x8d, 0x73, 0xd, 0x18, 0xc4, 0xa8, 0x46, 0x29, 0x57, 0xde, 0xe0, 0xb0, 0x5b, 0x1a, 0x6f, 0x75, 0x16, 0xa8, 0x8b, 0xb9, 0x30, 0x2, 0xf1, 0xd4, 0x33, 0x2b, 0x11, 0xc, 0xf3, 0xc6, 0x32, 0x62, 0xfb, 0xff, 0xd8, 0x9d, 0x12, 0x59, 0x75, 0x5, 0xbf, 0x59, 0xb4, 0x47, 0x1b, 0x28, 0x6a, 0x76, 0x67, 0x3b, 0xfa, 0x3a, 0xbd, 0xc1, 0x77, 0x3a, 0x97, 0x29, 0x78, 0x80, 0xb3, 0x9, 0x7, 0x61, 0xa3, 0x35, 0xc9, 0x7c, 0x22, 0x89, 0x79, 0x7e, 0xa, 0x9a, 0xe3, 0xaa, 0xf8, 0x17, 0xfd, 0xba, 0x63, 0x91, 0x26, 0x86, 0x5e, 0x5c, 0x2e, 0xf4, 0xea, 0x63, 0xc6, 0x78, 0x8e, 0xc9, 0x7, 0x6e, 0xa3, 0x2e, 0x42, 0x9a, 0x20, 0xe8, 0x64, 0x82, 0x8, 0x6a, 0x4c, 0x91, 0xb3, 0xe8, 0x1b, 0x5e, 0xa5, 0x4f, 0xec, 0x3, 0x45, 0xac, 0x4b, 0xdf, 0x68, 0x78, 0xad, 0xca, 0xa7, 0xee, 0xba, 0x47, 0xcb, 0x36, 0xda, 0xc1, 0xe0, 0x75, 0x8, 0xf0, 0x10, 0x2, 0x1e, 0xcb, 0xb7, 0xf5, 0xfd, 0xc8, 0x87, 0x37, 0x3a, 0x4d, 0x7e, 0xc, 0x7e, 0x1f, 0x74, 0x1c, 0x2b, 0x26, 0xf5, 0x43, 0xf0, 0x2d, 0xd7, 0x74, 0x6d, 0x0, 0x1b, 0xdf, 0x76, 0xa9, 0x5b, 0xb4, 0x38, 0x73, 0xdf, 0x14, 0x5, 0x7a, 0x79, 0x6b, 0xa, 0x3e, 0x7c, 0xcf, 0xae, 0x39, 0xac, 0xea, 0xdd, 0x85, 0xb2, 0x30, 0x5e, 0xdb, 0xe3, 0x69, 0xac, 0x9c, 0x33, 0x69, 0xff, 0xbd, 0xd6, 0xe9, 0x59, 0x3c, 0xc8, 0xec, 0x74, 0x82, 0x84, 0xa, 0x82, 0x37, 0x7b, 0x23, 0x67, 0x23, 0xfa, 0x2d, 0x7, 0x35, 0x30, 0x3a, 0x94, 0xb8, 0xbd, 0x48, 0x8f, 0xd2, 0x10, 0x42, 0x6e, 0xf4, 0xc7, 0xec, 0x2e, 0x16, 0x75, 0x51, 0x88, 0x7f, 0x18, 0x2a, 0x63, 0xf4, 0xc5, 0x5, 0xb, 0x4c, 0x1d, 0x7d, 0xd9, 0x5e, 0xfb, 0xfd, 0xca, 0x5, 0x65, 0x32, 0xa3, 0x32, 0xb2, 0x26, 0x8c, 0xbf, 0x41, 0x1d, 0xee, 0x72, 0x92, 0xd6, 0x38, 0xfa, 0x2a, 0xe3, 0xff, 0x3e, 0x45, 0x59, 0x4, 0x87, 0xea, 0xb3, 0x7c, 0xad, 0x43, 0x81, 0xce, 0x66, 0xb6, 0x6a, 0x7e, 0xfa, 0xc1, 0x2e, 0x93, 0x64, 0x62, 0x28, 0x22, 0x30, 0xd2, 0xd2, 0x6c, 0xed, 0xf8, 0x36, 0x67, 0xfe, 0x46, 0x9a, 0x45, 0xbb, 0x85, 0xca, 0x9e, 0x0, 0xd, 0xbf, 0x50, 0xb4, 0xeb, 0xa2, 0x3d, 0xba, 0x6b, 0xc1, 0x6, 0x3e, 0x7c, 0x55, 0x32, 0xbb, 0x21, 0x5b, 0xf3, 0x11, 0x67, 0x7, 0x30, 0x12, 0x23, 0xb1, 0x95, 0xf0, 0x11, 0x76, 0x1b, 0x76, 0xa0, 0x3a, 0x87, 0x61, 0x6d, 0x3a, 0xea, 0x26, 0x90, 0xf6, 0x31, 0x4c, 0xbe, 0xa6, 0x42, 0x6b, 0xb8, 0xc9, 0x7a, 0x2, 0x28, 0x6c, 0x4b, 0xc7, 0xd7, 0xb5, 0xd3, 0xe0, 0x1d, 0x28, 0xab, 0xac, 0x94, 0x48, 0xcd, 0xa5, 0x38, 0x52, 0x60, 0x7d, 0x8f, 0xc7, 0x15, 0xab, 0x96, 0x84, 0x44, 0x42, 0x78, 0xd8, 0xe9, 0xc1, 0xac, 0x10, 0xd2, 0xd0, 0x75, 0xcf, 0xcf, 0xe2, 0x14, 0x8c, 0x5c, 0x29, 0xf2, 0x48, 0x29, 0xcb, 0xf0, 0xda, 0xe8, 0x6d, 0xd7, 0x1f, 0xe8, 0x0, 0xe8, 0x3b, 0xa0, 0xe4, 0x11, 0x2d, 0xd0, 0xc, 0xd3, 0x78, 0x87, 0x51, 0xf3, 0x4d, 0xc, 0xcb, 0x39, 0x51, 0x96, 0x96, 0xbc, 0x82, 0x34, 0x68, 0x1d, 0x81, 0x49, 0x1, 0xd7, 0xa0, 0xef, 0x4e, 0xa0, 0xa1, 0x1e, 0xe5, 0xc8, 0xf6, 0xe4, 0x40, 0x76, 0x23, 0x82, 0xfd, 0xe1, 0x90, 0x59, 0x96, 0xdb, 0x80, 0x1d, 0xf9, 0x25, 0xa2, 0xef, 0xda, 0xcc, 0x96, 0x3a, 0x95, 0x1c, 0x43, 0x17, 0x92, 0xa1, 0x3f, 0xfc, 0xc1, 0xaa, 0x1b, 0x46, 0xb4, 0x84, 0xc1, 0xbb, 0x7, 0xf4, 0xe2, 0x3b, 0x9c, 0xd3, 0x5, 0xd, 0x1d, 0xde, 0x76, 0xd7, 0xec, 0x21, 0x7a, 0x87, 0x52, 0x58, 0x82, 0xb, 0x94, 0x7a, 0x53, 0xf, 0xa7, 0x14, 0x4, 0x30, 0xa2, 0xa6, 0xa9, 0x21, 0x40, 0xba, 0x1c, 0x3f, 0x0, 0x3c, 0x94, 0x76, 0xee, 0x4e, 0x82, 0x50, 0x5d, 0xba, 0x3c, 0xf8, 0xec, 0xfc, 0xdb, 0xa0, 0xc0, 0xf3, 0xb4, 0x93, 0x48, 0x81, 0x53, 0xf9, 0xd7, 0x4d, 0xf2, 0x48, 0x62, 0x41, 0x74, 0x61, 0xdd, 0x9, 0xfb, 0xe4, 0x4d, 0xd6, 0x22, 0x53, 0x5, 0xa7, 0x73, 0xdc, 0xd2, 0x9e, 0xb0, 0xf1, 0x6e, 0x1a, 0xa1, 0x1, 0xc8, 0x0, 0x2b, 0x14, 0xc9, 0x32, 0xa1, 0x98, 0xb0, 0x84, 0x64, 0x72, 0x7a, 0x56, 0xe1, 0x26, 0x63, 0xef, 0xb5, 0xf3, 0x3, 0xfc, 0x4b, 0x57, 0xd0, 0xd2, 0xbe, 0x43, 0x2f, 0x72, 0x8f, 0x76, 0x38, 0x1e, 0x79, 0x74, 0xd8, 0x7e, 0xe9, 0x4c, 0xb3, 0x9f, 0x18, 0x7a, 0x43, 0x5f, 0x8a, 0x16, 0x96, 0x2c, 0x9b, 0x2b, 0xbc, 0x8b, 0x44, 0x8a, 0x27, 0xcf, 0xb6, 0x56, 0xda, 0x51, 0x52, 0xc8, 0xdf, 0x98, 0xa8, 0xc, 0x24, 0x9b, 0xe7, 0x36, 0xd8, 0xca, 0x82, 0x90, 0xa7, 0x51, 0x8e, 0x1a, 0xd3, 0x9e, 0x7b, 0x2e, 0x2, 0xc8, 0xe1, 0x43, 0x8a, 0x31, 0x7d, 0xdc, 0x9d, 0x68, 0xf8, 0xcb, 0x23, 0xe5, 0x50, 0x47, 0x1a, 0x1b, 0x7, 0xf0, 0x72, 0xa0, 0x87, 0x98, 0xc1, 0xfd, 0x4b, 0x81, 0x87, 0xf, 0x9, 0x52, 0xb9, 0x6e, 0x73, 0x8d, 0x2e, 0x85, 0x21, 0x48, 0x6b, 0x1e, 0x4c, 0x54, 0xd3, 0x28, 0xa9, 0x29, 0x86, 0x5, 0x80, 0x77, 0xae, 0x11, 0xa4, 0x1a, 0x93, 0x57, 0xa, 0x1b, 0x7b, 0x6, 0x4d, 0xe9, 0xad, 0x46, 0x5e, 0xa6, 0x4b, 0x8b, 0x9d, 0xb5, 0x4, 0x18, 0x94, 0xcd, 0x87, 0xba, 0x62, 0x3c, 0x1b, 0xe6, 0x20, 0x99, 0x78, 0x4b, 0xb5, 0xfd, 0xac, 0x1a, 0x18, 0xa, 0x84, 0xf2, 0x23, 0xe9, 0xf3, 0x25, 0x93, 0x3d, 0x84, 0x73, 0x44, 0x57, 0x84, 0xcb, 0x71, 0xf3, 0xd0, 0xf2, 0xbe, 0xa9, 0xc5, 0x36, 0x1e, 0xa6, 0x8b, 0x18, 0xd2, 0x77, 0x72, 0xdf, 0x2, 0xc6, 0xd7, 0xa7, 0xd6, 0xbb, 0xb, 0xbc, 0x61, 0x8f, 0x2, 0xa9, 0x3a, 0xba, 0xa1, 0xb6, 0xd0, 0x6e, 0xed, 0x85, 0x90, 0xf4, 0x98, 0x82, 0x6e, 0xae, 0xd6, 0x25, 0xc6, 0x8b, 0x1d, 0xc0, 0xe9, 0xa2, 0x1d, 0xb, 0x2b, 0x83, 0xa0, 0xca, 0xd1, 0x70, 0x82, 0x5c, 0xb4, 0xc2, 0x57, 0xb5, 0x4a, 0x72, 0xd0, 0x41, 0xce, 0x44, 0xfd, 0x71, 0x82, 0x13, 0xac, 0x4b, 0x98, 0x57, 0xc8, 0x8, 0x36, 0xcb, 0x34, 0xc9, 0xe0, 0x67, 0x3, 0xf7, 0x55, 0x54, 0x45, 0xfa, 0x88, 0xc8, 0xb0, 0x2, 0x7b, 0x72, 0xb4, 0xb8, 0xc5, 0xe9, 0xa4, 0x30, 0x71, 0x7c, 0xf0, 0xf0, 0x3e, 0xdc, 0xc, 0x27, 0x9, 0x4b, 0xa3, 0xbe, 0xe4, 0xd9, 0x6e, 0xbc, 0x96, 0x61, 0x19, 0xf2, 0xeb, 0x5b, 0xfd, 0x7e, 0x9, 0xef, 0x6b, 0x73, 0x66, 0xe, 0x3a, 0x29, 0x87, 0xea, 0xb8, 0xf3, 0x28, 0x11, 0xde, 0xfc, 0xdd, 0x6a, 0x5, 0xe4, 0x98, 0x29, 0x61, 0xc9, 0x16, 0x5d, 0xb8, 0x31, 0xcc, 0x55, 0x56, 0xf0, 0x18, 0x24, 0xe1, 0x34, 0xa4, 0x87, 0x19, 0xe8, 0x9f, 0xdc, 0xcc, 0xaa, 0x94, 0x2e, 0xc6, 0x90, 0x64, 0xa5, 0xc1, 0x86, 0xa4, 0x94, 0xb3, 0x2b, 0x8d, 0xcb, 0xd4, 0x83, 0x4d, 0x8a, 0xfd, 0xb1, 0xd2, 0xff, 0xa8, 0x6a, 0x79, 0xea, 0xf6, 0x79, 0xca, 0x4, 0x51, 0xab, 0x75, 0x65, 0xcf, 0x86, 0x6b, 0xc4, 0x36, 0xd5, 0xf0, 0xf4, 0x58, 0x6b, 0xe, 0x67, 0xd9, 0xc5, 0x1e, 0x46, 0x8, 0xd1, 0xae, 0xe, 0xf8, 0x53, 0x50, 0x70, 0xf7, 0x16, 0xdd, 0x14, 0xce, 0x5b, 0xf4, 0xda, 0x65, 0xcf, 0xb2, 0xc4, 0x49, 0x2d, 0x6f, 0x40, 0xd1, 0xce, 0xf0, 0xf1, 0x47, 0xc4, 0x37, 0xa3, 0x2b, 0xdd, 0x92, 0x94, 0x93, 0xc7, 0xc, 0x80, 0xfa, 0x8e, 0xa0, 0xbe, 0x1d, 0x15, 0x93, 0x4b, 0x1e, 0x74, 0xa, 0xde, 0xf8, 0xf3, 0xc, 0x82, 0x13, 0x7d, 0xf, 0x1c, 0xdc, 0x82, 0x19, 0xff, 0xca, 0xe6, 0xdd, 0x84, 0x60, 0x19, 0x92, 0xef, 0xe3, 0x6e, 0xf9, 0x45, 0x72, 0xd9, 0xd7, 0x1a, 0xc7, 0xa0, 0xde, 0x29, 0xbe, 0x8d, 0x9c, 0x31, 0xf8, 0xf5, 0x2e, 0xe8, 0x80, 0xdc, 0x1c, 0x6d, 0xb3, 0x7f, 0x1c, 0x2f, 0xf0, 0xf9, 0x5d, 0x9, 0x88, 0xd8, 0xcf, 0xa3, 0xb9, 0x34, 0x7f, 0xc8, 0xe1, 0x8, 0x2, 0x34, 0x95, 0x70, 0xd7, 0xd5, 0xcb, 0x51, 0x88, 0x91, 0xe4, 0xec, 0x1a, 0x4a, 0x42, 0x71, 0x2b, 0x60, 0xc1, 0xf5, 0xb1, 0xd7, 0x82, 0x4f, 0x52, 0xc6, 0x13, 0x98, 0xd3, 0xf0, 0xb5, 0x1d, 0xb0, 0x6b, 0xae, 0x6e, 0xd9, 0xf6, 0xc8, 0x9e, 0x25, 0xde, 0x5b, 0x38, 0xf2, 0x1f, 0xd, 0x7b, 0xf6, 0x30, 0x6a, 0x83, 0xb0, 0xf6, 0xff, 0x1c, 0x66, 0x6, 0xb0, 0x65, 0xcc, 0x4, 0x5c, 0xf, 0x23, 0xd4, 0x58, 0x63, 0x7e, 0x46, 0xd3, 0xd3, 0xbe, 0x2d, 0x80, 0x8c, 0x46, 0xce, 0xa6, 0xd, 0x92, 0xf1, 0x62, 0x42, 0x98, 0x7b, 0x9f, 0x47, 0x37, 0x15, 0x42, 0x57, 0xd2, 0x34, 0xe1, 0x8d, 0xbb, 0x87, 0x8c, 0xa8, 0x8a, 0x5c, 0x6a, 0xa5, 0xaf, 0x54, 0xa1, 0x68, 0xf7, 0x32, 0xe5, 0x84, 0xf1, 0xfa, 0xa3, 0xec, 0x1e, 0xa5, 0x68, 0x74, 0x8c, 0x61, 0x44, 0xcb, 0xce, 0x20, 0xc0, 0x2c, 0x86, 0x87, 0x5f, 0xd1, 0x34, 0x34, 0xf6, 0x5d, 0xf5, 0xae, 0x11, 0x38, 0x3c, 0x71, 0xf0, 0xf8, 0xe3, 0x81, 0x49, 0xc0, 0xd7, 0x2c, 0xbe, 0x99, 0x2f, 0xff, 0x39, 0xd4, 0x68, 0xee, 0xa6, 0xa6, 0x5d, 0x2b, 0xe7, 0x4e, 0xb6, 0x79, 0x9b, 0xb9, 0x82, 0x7b, 0x71, 0x38, 0xea, 0xd3, 0x24, 0xb6, 0xe, 0x47, 0x4d, 0x2d, 0x92, 0x75, 0x66, 0xd4, 0x95, 0x3b, 0x54, 0xec, 0x66, 0x8f, 0x46, 0xe3, 0xe1, 0xbe, 0xcc, 0x73, 0xe6, 0x66, 0x9a, 0xb8, 0xf2, 0xb5, 0xc4, 0x67, 0xfe, 0x6a, 0xd3, 0x5c, 0xe, 0x29, 0xe6, 0xc1, 0xe9, 0x3d, 0xda, 0x2a, 0xa, 0x31, 0xb6, 0x8b, 0x27, 0x8c, 0x3b, 0x32, 0xdb, 0xb, 0x84, 0xa3, 0xf, 0x42, 0x9b, 0xc4, 0x24, 0x64, 0x79, 0x96, 0x6f, 0x64, 0xc9, 0x41, 0xc2, 0x67, 0xe8, 0xdf, 0x88, 0xf8, 0x49, 0x8b, 0xf6, 0x24, 0x93, 0x4b, 0x2d, 0xe1, 0x20, 0xdf, 0x71, 0xa5, 0xd8, 0x62, 0x6b, 0x9a, 0xcb, 0x83, 0x94, 0x17, 0x6d, 0xb2, 0xb4, 0x81, 0xe2, 0xfa, 0x11, 0x95, 0x32, 0x96, 0x6f, 0x66, 0x1f, 0xa5, 0x3a, 0xd5, 0xe4, 0xb3, 0x81, 0xd2, 0x16, 0xbd, 0x3d, 0x7f, 0x65, 0xa7, 0x96, 0x7f, 0x2b, 0xf6, 0x1a, 0x5, 0x7c, 0xd3, 0x53, 0x85, 0x96, 0x44, 0xf9, 0xb, 0xeb, 0x98, 0xa9, 0xe9, 0xa1, 0x9a, 0xd5, 0xb0, 0x9f, 0x4f, 0x84, 0xe0, 0x13, 0xb8, 0xaf, 0xe6, 0x58, 0xd5, 0x3f, 0x98, 0x4, 0x98, 0xd6, 0x65, 0xca, 0xc0, 0x70, 0x96, 0x2d, 0xff, 0xa5, 0x6e, 0xde, 0x22, 0x2b, 0x73, 0x3b, 0x62, 0xd8, 0x5f, 0xa9, 0xb, 0x64, 0xd7, 0x82, 0x17, 0x35, 0xa6, 0x63, 0x91, 0x61, 0x9f, 0x4f, 0xdd, 0xef, 0xbd, 0xe0, 0xb4, 0x67, 0xf1, 0x1, 0xe4, 0x66, 0xf3, 0x65, 0x84, 0x95, 0x69, 0xc0, 0xbe, 0x3b, 0xa7, 0xab, 0x68, 0xa3, 0x5a, 0x21, 0xc, 0x24, 0x7b, 0x9, 0x87, 0x14, 0x12, 0x6, 0x90, 0x96, 0x18, 0x33, 0x32, 0x8c, 0x37, 0xd1, 0x53, 0xfe, 0xe1, 0xce, 0x73, 0x4d, 0xcb, 0x61, 0x43, 0xc, 0x13, 0xe, 0xa8, 0x50, 0x5f, 0x2b, 0x21, 0xf5, 0x7e, 0x51, 0x59, 0x7f, 0xd6, 0xc0, 0x38, 0xad, 0x8c, 0x8, 0x81, 0x2f, 0x33, 0xe2, 0x8a, 0xd6, 0x6b, 0x90, 0x7e, 0x1b, 0x47, 0xa3, 0x27, 0x8e, 0xd, 0xb2, 0x3f, 0xac, 0x56, 0xd, 0x4b, 0x6b, 0x13, 0xdb, 0x60, 0x46, 0xb5, 0xe4, 0x8d, 0xfd, 0xa6, 0x11, 0x1e, 0x3a, 0x12, 0xef, 0x99, 0x77, 0xa3, 0xea, 0xff, 0xdb, 0x44, 0x7c, 0xc1, 0x6a, 0xce, 0x77, 0xb9, 0x40, 0x45, 0xef, 0xac, 0x60, 0xaf, 0xa8, 0x73, 0x51, 0x49, 0xb0, 0xea, 0x73, 0x45, 0x43, 0x37, 0x44, 0xeb, 0x31, 0x60, 0xac, 0xd1, 0xfb, 0xd, 0x57, 0x11, 0xfd, 0x9a, 0xdd, 0x44, 0x5b, 0xb4, 0xd9, 0xf7, 0x31, 0x72, 0x6, 0x22, 0xdd, 0x6a, 0x6, 0xb8, 0xb4, 0xf0, 0xa3, 0xf8, 0xd8, 0x2a, 0xf9, 0x15, 0xa2, 0xe2, 0xac, 0xe0, 0x99, 0x48, 0xe, 0x9e, 0x80, 0x8b, 0xb3, 0xfa, 0xad, 0xa, 0xcd, 0xbd, 0x52, 0x0, 0x2, 0x17, 0xe9, 0x6a, 0x50, 0x46, 0x9d, 0x39, 0xca, 0x8f, 0xf7, 0x69, 0x9a, 0x42, 0x63, 0xbb, 0x7, 0x2, 0xd2, 0x27, 0x9e, 0xfe, 0x82, 0xf5, 0x88, 0x87, 0xd6, 0x5e, 0x65, 0xec, 0x6e, 0x5f, 0xb7, 0xad, 0x48, 0xd7, 0x26, 0xa4, 0x6d, 0xc6, 0x81, 0xca, 0x2, 0x5c, 0x69, 0x18, 0x25, 0xd4, 0x31, 0xa5, 0x27, 0x8d, 0xfb, 0x84, 0xba, 0x48, 0xff, 0xde, 0x56, 0x89, 0x3a, 0x3a, 0x47, 0x22, 0x6d, 0x76, 0x56, 0xd, 0x1d, 0xaf, 0x5c, 0x4b, 0x2c, 0x35, 0x65, 0x95, 0x5, 0x5a, 0xe2, 0xc3, 0xb, 0x59, 0x31, 0x15, 0x26, 0x49, 0x5f, 0x9f, 0x6f, 0xf6, 0x21, 0x75, 0x9f, 0x80, 0x9b, 0x4a, 0xa, 0xc7, 0xbf, 0xf6, 0xae, 0x2b, 0x61, 0x35, 0xed, 0x9, 0x65, 0xfa, 0xe6, 0xe7, 0xc, 0x23, 0x4b, 0x98, 0x33, 0x2, 0x37, 0x11, 0x69, 0xdc, 0x4c, 0xd0, 0x9b, 0x65, 0x51, 0x21, 0x16, 0xd4, 0x7, 0xf0, 0x63, 0x3c, 0xb8, 0xbd, 0x82, 0x2a, 0x1c, 0x39, 0x4d, 0x28, 0xbb, 0x9e, 0xe8, 0x8, 0x83, 0x15, 0x63, 0x48, 0xdd, 0xbc, 0xca, 0xed, 0xf1, 0x83, 0xec, 0x16, 0x6f, 0x0, 0xc8, 0xc6, 0x5d, 0x69, 0x37, 0x2c, 0x3e, 0xa1, 0x87, 0x7a, 0x5, 0x4a, 0xf0, 0x56, 0xb7, 0x2a, 0x98, 0x8f, 0xb4, 0xa6, 0x0, 0x55, 0x76, 0xa8, 0x44, 0x1c, 0x65, 0x68, 0xce, 0xfa, 0x52, 0x42, 0x2, 0x5e, 0x76, 0xe1, 0xb, 0x54, 0x2b, 0xa5, 0xf0, 0x7f, 0xa3, 0x5c, 0xa8, 0xa1, 0x35, 0xcb, 0x8f, 0x1c, 0x2f, 0xcd, 0x1c, 0x4f, 0xa0, 0xe1, 0x12, 0x61, 0xa2, 0x15, 0xce, 0x16, 0x88, 0x23, 0x7e, 0x17, 0x5b, 0x9, 0x11, 0xa1, 0x6, 0xe2, 0x49, 0x41, 0x42, 0x8a, 0x4, 0xb6, 0x10, 0x3c, 0xfb, 0x2c, 0x75, 0x74, 0x67, 0xf5, 0xa3, 0xc6, 0xb8, 0xdb, 0xf1, 0x47, 0x7a, 0xa3, 0x16, 0xbf, 0xfb, 0x3d, 0x1a, 0xd3, 0x9a, 0x2f, 0x37, 0x7c, 0x2a, 0x4d, 0xb, 0xc2, 0xb5, 0x5, 0x2d, 0x12, 0x67, 0x2a, 0x66, 0xc, 0xf5, 0x9c, 0x65, 0xff, 0xe9, 0xc9, 0xff, 0xe8, 0x28, 0xc1, 0x57, 0xed, 0x83, 0x76, 0x98, 0x9e, 0x85, 0x15, 0xbb, 0xf, 0x2b, 0x9a, 0x31, 0x47, 0xf2, 0xd, 0xd7, 0xad, 0x70, 0xe4, 0x4b, 0x37, 0xba, 0xba, 0x98, 0x4b, 0x7, 0xb3, 0xa7, 0x56, 0x73, 0x74, 0x3d, 0xf0, 0x30, 0xbf, 0xfe, 0x3e, 0x6e, 0x69, 0x2e, 0x34, 0x37, 0xc5, 0x4a, 0x86, 0xf7, 0x48, 0x4b, 0xf8, 0x3d, 0xd, 0x94, 0xa6, 0x9, 0x34, 0x71, 0x4, 0xae, 0xc7, 0x74, 0x61, 0x2d, 0xb2, 0x4d, 0x1, 0x34, 0x30, 0x21, 0x8c, 0x43, 0x1c, 0x3a, 0xc7, 0xec, 0x93, 0xdd, 0xff, 0xa5, 0x4e, 0xac, 0x18, 0x3e, 0x78, 0x2, 0x61, 0x57, 0xc7, 0x4f, 0x72, 0x3f, 0xe8, 0xc3, 0x91, 0xcc, 0x3f, 0xe1, 0x9f, 0xf5, 0xb, 0x8f, 0xf0, 0xc8, 0xc2, 0xa8, 0x92, 0xde, 0xf6, 0x67, 0x8f, 0xfd, 0x22, 0x2e, 0x7f, 0x77, 0x31, 0x69, 0xd8, 0x33, 0x88, 0x1, 0xab, 0x95, 0xca, 0x3e, 0x86, 0xb6, 0x1d, 0x6d, 0x26, 0x2b, 0xef, 0xb5, 0x31, 0x2b, 0x73, 0xb7, 0x6b, 0xce, 0x80, 0x5f, 0x91, 0xc6, 0x27, 0xa9, 0x4f, 0xd8, 0xef, 0x90, 0x5f, 0xd2, 0xd6, 0xa1, 0x6f, 0xad, 0x48, 0x6b, 0x45, 0xe8, 0x5d, 0xd7, 0x7b, 0x29, 0x64, 0x5b, 0x84, 0x7a, 0x50, 0xcb, 0xd2, 0xec, 0xd7, 0x55, 0xe2, 0x2a, 0xf8, 0x2c, 0xa7, 0x4, 0xe2, 0x60, 0xa4, 0x23, 0x5c, 0x2, 0x52, 0x44, 0xa, 0x5b, 0x7d, 0x2d, 0x54, 0xae, 0x10, 0xda, 0xae, 0x5, 0x93, 0x10, 0x43, 0x51, 0xa8, 0xe8, 0xbf, 0x4b, 0xa1, 0xf5, 0x15, 0x83, 0x95, 0xfe, 0x65, 0x53, 0x38, 0x26, 0x18, 0x36, 0x3f, 0x40, 0x50, 0xd9, 0x66, 0x6b, 0xa3, 0xb3, 0xc2, 0xa2, 0xed, 0xf4, 0x7c, 0x34, 0xb3, 0xc7, 0x12, 0x9d, 0x11, 0x44, 0xe7, 0xd1, 0xb4, 0x45, 0xa5, 0xe7, 0x71, 0x9a, 0x82, 0x69, 0xb1, 0x93, 0x4c, 0xbf, 0xfc, 0x17, 0x61, 0x8c, 0x90, 0xbb, 0x2d, 0x85, 0x3d, 0x5a, 0xb3, 0x20, 0x73, 0xc9, 0x4d, 0x5, 0x81, 0xf8, 0x6b, 0x85, 0x4f, 0xc0, 0x94, 0x1f, 0xbc, 0x51, 0x1b, 0xce, 0x1b, 0x2e, 0x45, 0xf3, 0x3a, 0x1, 0xb3, 0x50, 0xff, 0x41, 0xc, 0x24, 0x7e, 0x4d, 0x22, 0x45, 0xf4, 0x7a, 0xf0, 0x6a, 0x4f, 0xd2, 0xa3, 0x7c, 0xe5, 0xb9, 0xbd, 0x63, 0xa7, 0x45, 0xf3, 0xd7, 0x46, 0x82, 0x8a, 0x5f, 0xbb, 0xcf, 0x98, 0x6d, 0x2a, 0xbd, 0x73, 0xdb, 0x4, 0xed, 0x86, 0x5e, 0xe8, 0xd8, 0x1d, 0xb, 0x42, 0x1f, 0xc0, 0x42, 0xda, 0xf2, 0x76, 0xc7, 0x7b, 0x40, 0x64, 0x73, 0x54, 0xf0, 0x7e, 0xf5, 0x48, 0xf5, 0xaf, 0x7f, 0xba, 0x98, 0x7e, 0x4a, 0xb6, 0x30, 0xfd, 0xee, 0xfb, 0x7a, 0x6b, 0xbb, 0xd2, 0xa0, 0x16, 0xc5, 0x2f, 0x92, 0x4f, 0x99, 0x34, 0x62, 0x1a, 0x6c, 0xc1, 0x5c, 0xd, 0x8b, 0x2c, 0xc6, 0x57, 0x3a, 0xcf, 0x41, 0x92, 0x7f, 0x66, 0x1b, 0xfd, 0x61, 0x69, 0x5e, 0x2f, 0x97, 0x17, 0xa0, 0xf5, 0xb, 0xc7, 0x15, 0x5c, 0x92, 0x61, 0x95, 0x60, 0x4d, 0xb4, 0x20, 0x3d, 0x52, 0xdb, 0x1f, 0x7, 0x37, 0x1b, 0x91, 0x4, 0x7b, 0xf, 0x6f, 0x8d, 0x16, 0xf9, 0x48, 0xf6, 0xf8, 0x72, 0x25, 0xeb, 0xea, 0x39, 0x76, 0x6, 0xce, 0x53, 0x8, 0xd7, 0x32, 0xf6, 0xce, 0xb0, 0x4, 0x90, 0x98, 0xe9, 0x31, 0x1f, 0x7f, 0xd8, 0xc0, 0x82, 0x65, 0xa2, 0x36, 0x72, 0xaa, 0x94, 0x56, 0xc6, 0xc2, 0xb0, 0xe5, 0xb8, 0x11, 0x42, 0x4e, 0x41, 0x57, 0xa2, 0x9b, 0xa7, 0xaa, 0x5, 0xb0, 0x9a, 0xf0, 0xe0, 0x41, 0xf8, 0x72, 0x6, 0x65, 0x1c, 0xc8, 0x3e, 0xbf, 0xf9, 0xc5, 0xa3, 0xfa, 0xf0, 0x3, 0xe0, 0x9a, 0x37, 0xf6, 0x4c, 0xb0, 0xc8, 0x75, 0x1e, 0x87, 0xe0, 0x17, 0x79, 0x9f, 0x3c, 0x38, 0xa1, 0xfc, 0x59, 0xc0, 0x1d, 0x67, 0x9, 0x48, 0x64, 0xa6, 0x4e, 0x61, 0xa8, 0xd1, 0x5d, 0x62, 0x79, 0x1, 0xd, 0x4d, 0xc3, 0x88, 0xe7, 0x0, 0x42, 0xe1, 0xa1, 0x47, 0x7d, 0x9d, 0xa5, 0x54, 0xa7, 0x1e, 0x9d, 0xf9, 0xae, 0x78, 0x41, 0xb1, 0x49, 0x0, 0x2d, 0x81, 0x1c, 0xa7, 0xb3, 0x77, 0x8, 0xb6, 0x1b, 0xa1, 0xa4, 0xa9, 0x21, 0xd5, 0x2c, 0xa6, 0x11, 0x4d, 0x24, 0x2c, 0xc6, 0xf5, 0xbf, 0xb7, 0x19, 0x4b, 0x46, 0x7c, 0x65, 0x76, 0x90, 0xa7, 0xeb, 0xf3, 0x27, 0xa9, 0x81, 0x75, 0xc, 0x97, 0xbf, 0x3a, 0x48, 0xf3, 0x22, 0xb, 0xae, 0xe0, 0x8, 0xf1, 0x2e, 0xd5, 0xbc, 0x64, 0x50, 0x66, 0xf3, 0x3, 0xd6, 0x5e, 0x2, 0xf5, 0x5b, 0xa7, 0x75, 0x48, 0xcf, 0x2c, 0xd2, 0xd5, 0xd0, 0xe5, 0x2, 0x93, 0xab, 0x30, 0x40, 0x12, 0x30, 0xb0, 0xe6, 0xa7, 0xd0, 0xf4, 0xa1, 0xa, 0x4f, 0x7b, 0xc5, 0x62, 0xe2, 0x2e, 0x20, 0xba, 0xb, 0xa5, 0x58, 0x7a, 0x49, 0xac, 0xcc, 0xcf, 0xe6, 0x1e, 0xd2, 0x9f, 0x10, 0xec, 0x27, 0x19, 0x8a, 0xe6, 0xcc, 0x96, 0xb5, 0x5a, 0xe8, 0x2, 0x3b, 0xe8, 0xf7, 0xb9, 0x48, 0x34, 0x11, 0x59, 0x8, 0x3c, 0xf8, 0x7e, 0xbf, 0x62, 0xc5, 0xed, 0x62, 0xb1, 0x91, 0x5e, 0xe0, 0x85, 0xd1, 0xbc, 0x62, 0x72, 0xfe, 0xe1, 0xb5, 0x19, 0x5b, 0x10, 0xb8, 0x8, 0x69, 0x52, 0x1d, 0x22, 0xbb, 0x6b, 0x89, 0x7e, 0x44, 0x11, 0xd, 0xf0, 0x13, 0x22, 0x2c, 0x49, 0xaa, 0x7a, 0x64, 0x4b, 0xc1, 0x2f, 0x2e, 0xc6, 0xf8, 0xc9, 0xf6, 0xc6, 0x68, 0x41, 0xbc, 0x9a, 0x25, 0xca, 0x90, 0x61, 0x34, 0x8e, 0xdd, 0x62, 0x27, 0xb9, 0x3b, 0x9a, 0x18, 0x20, 0x5b, 0x94, 0xc0, 0x7f, 0x15, 0xab, 0xc8, 0xf5, 0xb, 0x2d, 0xc6, 0x72, 0x6e, 0xb7, 0x50, 0x77, 0x35, 0xe1, 0x89, 0xf4, 0xf7, 0xc5, 0x31, 0x7d, 0xf8, 0xb2, 0x1a, 0x51, 0x18, 0xc5, 0x35, 0x5f, 0x0, 0x27, 0x78, 0x26, 0xa4, 0x6d, 0xed, 0x80, 0x94, 0x54, 0xa0, 0x8c, 0xa2, 0xb2, 0x7d, 0x24, 0x77, 0x7c, 0xde, 0xef, 0x20, 0x60, 0x9d, 0x14, 0xa4, 0x39, 0x4, 0x16, 0x5e, 0x70, 0xae, 0xde, 0xf3, 0x48, 0xb1, 0x10, 0x5c, 0x33, 0xc4, 0xab, 0x6e, 0x53, 0x4b, 0x4, 0x2, 0x8e, 0xf1, 0x63, 0xfe, 0xc, 0x79, 0x82, 0x1e, 0xf1, 0x5f, 0x69, 0xaa, 0x5a, 0xb6, 0x86, 0x28, 0xed, 0xa4, 0x27, 0x46, 0x93, 0xdf, 0x4f, 0x99, 0xb9, 0xb0, 0x2e, 0x87, 0xc0, 0xde, 0xb4, 0xe9, 0x8f, 0xa2, 0xf7, 0x58, 0x8d, 0xec, 0xb, 0x4c, 0xfe, 0xc5, 0xf9, 0xea, 0xed, 0x4d, 0xc, 0xc3, 0xf7, 0x7c, 0xb, 0xe6, 0xaf, 0xac, 0xc1, 0x6d, 0x69, 0xd8, 0xa9, 0x84, 0x50, 0xa, 0x86, 0x25, 0xc4, 0x8a, 0xba, 0xe7, 0x9, 0x6f, 0xfc, 0x56, 0x9e, 0xd2, 0x48, 0x61, 0xd0, 0x5b, 0x8c, 0x82, 0x5f, 0xae, 0x55, 0xdc, 0x5e, 0x43, 0x6b, 0xac, 0x11, 0x74, 0x11, 0xc0, 0x6c, 0xf5, 0x27, 0xa5, 0x2c, 0x34, 0x24, 0xfd, 0x5e, 0x4, 0xd5, 0x94, 0xd, 0x7c, 0xb6, 0x70, 0x35, 0xa, 0x4c, 0x2c, 0xcd, 0x79, 0x55, 0xb6, 0x38, 0x35, 0xf6, 0x69, 0xa1, 0x33, 0xf9, 0xad, 0x5c, 0x60, 0x70, 0xd0, 0x6c, 0x9f, 0xbe, 0x83, 0x5, 0x87, 0x7e, 0x1, 0xa1, 0xb8, 0x47, 0xb2, 0xaa, 0x2f, 0x44, 0xe9, 0x68, 0x3d, 0xd, 0x54, 0x9e, 0xff, 0xee, 0x54, 0x19, 0xbe, 0xe3, 0xca, 0xab, 0xde, 0x3e, 0x1f, 0x1b, 0x31, 0x35, 0x70, 0xb0, 0x28, 0xc5, 0x95, 0xa7, 0xc0, 0xbc, 0x96, 0xb7, 0x3a, 0x5d, 0xb3, 0xb5, 0x98, 0xd3, 0x5e, 0xfa, 0x3c, 0xca, 0x9b, 0xd7, 0xdd, 0x53, 0x13, 0x65, 0xb4, 0x60, 0x6a, 0xd1, 0x51, 0x1c, 0x1a, 0xbb, 0x17, 0x5c, 0x90, 0x1b, 0xf9, 0x5c, 0x7f, 0x81, 0x4, 0xa3, 0x27, 0xa, 0xbf, 0xd6, 0x9e, 0xf3, 0xc, 0x66, 0xc4, 0x56, 0x1d, 0x9e, 0xf7, 0xb1, 0x3f, 0xb0, 0xb0, 0x54, 0x13, 0x0, 0x36, 0xf1, 0x3b, 0xa1, 0xe3, 0x2a, 0x2b, 0x2b, 0x1f, 0x54, 0x50, 0x72, 0x9a, 0x6d, 0xe1, 0x6, 0x21, 0x5, 0x7d, 0x89, 0xb4, 0x8c, 0x7f, 0xa0, 0x50, 0x9b, 0xdf, 0xbb, 0x85, 0xd7, 0xff, 0x49, 0x6c, 0x3d, 0x2a, 0x63, 0x42, 0xb8, 0x20, 0x7, 0x60, 0x7c, 0x5e, 0x88, 0xb7, 0xac, 0x94, 0xb6, 0xde, 0xdc, 0x7f, 0xa4, 0x6f, 0x79, 0xd1, 0xe0, 0x8a, 0xf5, 0x14, 0x46, 0x38, 0xb3, 0x4a, 0x12, 0xbd, 0x29, 0xba, 0xfc, 0x78, 0xea, 0x12, 0x8f, 0x74, 0x9e, 0x3d, 0x11, 0xbb, 0x18, 0x30, 0xcd, 0xa7, 0x99, 0xef, 0x23, 0x3c, 0x8f, 0xfd, 0xde, 0x83, 0x6, 0xc5, 0x3f, 0x2c, 0x9b, 0x49, 0x88, 0x2b, 0xff, 0x45, 0x7a, 0xf9, 0x6a, 0x7f, 0x6e, 0x34, 0x21, 0x32, 0xaa, 0xae, 0x30, 0x27, 0xf3, 0x50, 0x84, 0x34, 0x47, 0xe7, 0x41, 0xca, 0xd6, 0xf, 0xbb, 0xb8, 0xc0, 0xc2, 0x14, 0xc1, 0x17, 0xaf, 0x79, 0x20, 0x88, 0xa9, 0x4, 0x72, 0xde, 0x1b, 0xa6, 0xf7, 0x35, 0x6, 0xfe, 0x93, 0x84, 0xf3, 0xd0, 0x13, 0xb0, 0xc3, 0x18, 0xf7, 0xba, 0x7, 0x96, 0xae, 0x2c, 0xa3, 0xba, 0xb3, 0x95, 0x20, 0xc2, 0xa6, 0x1d, 0x37, 0x9e, 0x90, 0x41, 0xb0, 0xbd, 0xa, 0x1c, 0x3, 0x60, 0x9e, 0x1a, 0x43, 0xbe, 0x6d, 0xcc, 0x11, 0x6e, 0x8f, 0xf3, 0x5b, 0x76, 0x94, 0x91, 0x7e, 0x33, 0x4a, 0x2a, 0x46, 0x76, 0xf0, 0x47, 0xbe, 0x30, 0xb8, 0x41, 0x30, 0xdf, 0xc9, 0xb3, 0x33, 0x85, 0xbd, 0x63, 0x7b, 0x4e, 0x4d, 0xd7, 0xa7, 0xa6, 0x3d, 0xe2, 0x43, 0x55, 0xc6, 0x36, 0xea, 0x29, 0x96, 0xa7, 0xe5, 0x7f, 0x7d, 0x7b, 0xcd, 0x1d, 0xc0, 0xca, 0x13, 0x47, 0xf7, 0xb1, 0x1f, 0xd3, 0xde, 0x28, 0x90, 0x45, 0xe1, 0xf, 0xaa, 0x97, 0x20, 0x57, 0x19, 0x3b, 0xca, 0x23, 0xb1, 0x77, 0x86, 0x83, 0x74, 0x6d, 0x74, 0xa8, 0x21, 0xc6, 0xcc, 0xab, 0x63, 0xcb, 0x7a, 0xfc, 0x1c, 0x70, 0x3d, 0x5, 0xe5, 0x2, 0x33, 0x65, 0x2, 0xc9, 0xbf, 0xc6, 0xb8, 0x5b, 0xe3, 0x33, 0x3c, 0xe9, 0x1e, 0x2, 0x9a, 0x40, 0x4b, 0x2c, 0xa7, 0xe4, 0x27, 0x65, 0x3f, 0xd, 0x80, 0x1b, 0xe1, 0xb5, 0x37, 0xdc, 0xb6, 0x4a, 0xd4, 0xc1, 0x8f, 0x74, 0xe4, 0x80, 0xf5, 0xb5, 0x6, 0x86, 0x5d, 0xfa, 0xb0, 0xb5, 0x87, 0x4a, 0x75, 0x25, 0xdf, 0x5e, 0x2a, 0x69, 0xbb, 0xe8, 0xc, 0xf5, 0xba, 0x9a, 0x1d, 0xc6, 0xfa, 0xb8, 0xc8, 0x7c, 0x2, 0x8a, 0xfe, 0xc6, 0xe3, 0x62, 0xe0, 0x25, 0x7d, 0x3, 0xf5, 0xbf, 0xe5, 0xbf, 0x5, 0x88, 0xe0, 0xf7, 0x32, 0xf6, 0x6f, 0x6c, 0x1e, 0x27, 0x13, 0xa5, 0x76, 0x2f, 0x23, 0xc0, 0xa6, 0xdc, 0x55, 0x26, 0xf4, 0x1e, 0x70, 0x2d, 0xc3, 0x57, 0x89, 0x78, 0x51, 0xa, 0xa1, 0xcb, 0x8b, 0x72, 0xee, 0x73, 0x51, 0x2c, 0xb6, 0x11, 0x4, 0xa6, 0x5e, 0x50, 0xbc, 0xd8, 0xb4, 0x2b, 0x46, 0xd5, 0x9a, 0x70, 0x57, 0x19, 0xa9, 0x16, 0xb, 0x1c, 0x18, 0x68, 0x2a, 0x41, 0x78, 0x1c, 0xfe, 0xd4, 0xeb, 0x8c, 0xf4, 0xdf, 0xc0, 0xbc, 0x41, 0x3, 0xae, 0x66, 0xe8, 0x3, 0x70, 0xcf, 0x45, 0xbc, 0xb6, 0x1b, 0xa4, 0x24, 0x8a, 0xea, 0x6d, 0x1a, 0xf1, 0xc2, 0x24, 0x4c, 0xd0, 0x1a, 0x15, 0x7, 0x54, 0x68, 0x7b, 0x5b, 0xda, 0x7d, 0xd2, 0xc9, 0x62, 0xf6, 0x8b, 0x3b, 0x52, 0x2e, 0xb1, 0x50, 0xa, 0x1b, 0xc, 0x91, 0x8f, 0x5b, 0xeb, 0x9, 0x80, 0x88, 0x75, 0x16, 0x4a, 0x82, 0xaf, 0x35, 0xf5, 0xbd, 0x2a, 0x2a, 0xfb, 0x9c, 0x5f, 0x83, 0xf, 0x62, 0xeb, 0xfc, 0x2a, 0x31, 0x29, 0x9b, 0xf5, 0x3f, 0x38, 0x9d, 0x16, 0x2a, 0xdf, 0x97, 0xc7, 0xb0, 0x2, 0xac, 0x66, 0xb0, 0x5f, 0x3f, 0xeb, 0xca, 0xd0, 0xa2, 0xda, 0x6f, 0x4c, 0x9d, 0x2, 0x42, 0xe5, 0x7c, 0x2b, 0x5, 0x26, 0x22, 0xb8, 0xe1, 0xbd, 0x72, 0x74, 0x99, 0xce, 0xd4, 0xe6, 0xda, 0xf4, 0xd2, 0x9, 0xbe, 0x6e, 0xe1, 0x53, 0x2e, 0x2b, 0xb9, 0x53, 0x2e, 0xf4, 0xf, 0x18, 0xc6, 0xa1, 0x34, 0x2c, 0x2, 0xcc, 0x9b, 0xc5, 0xc2, 0x46, 0x2c, 0x42, 0xf9, 0xd6, 0x3, 0x38, 0xa2, 0xa8, 0x14, 0x5c, 0x4f, 0xf7, 0xaf, 0x18, 0x28, 0x8b, 0xa0, 0x10, 0x80, 0xbf, 0xae, 0x55, 0xbc, 0x43, 0xb3, 0xf5, 0x10, 0x20, 0xaf, 0x58, 0xfe, 0x42, 0xf1, 0xf2, 0xa, 0x40, 0x2e, 0xf, 0xdf, 0x4b, 0x5f, 0xa8, 0xde, 0xbf, 0x83, 0x34, 0xa9, 0xea, 0xbf, 0x3, 0x93, 0xd0, 0xb1, 0xf0, 0x3, 0x16, 0x8, 0xc7, 0x95, 0x1b, 0xa0, 0x2e, 0x97, 0x10, 0xba, 0x3d, 0xc9, 0xe4, 0x43, 0xe9, 0xa6, 0xf3, 0x38, 0xb4, 0xad, 0x92, 0xbe, 0x47, 0x36, 0x66, 0xbf, 0xe5, 0x42, 0x77, 0xbb, 0x0, 0x61, 0x2a, 0xdf, 0x86, 0xb4, 0x4f, 0x7a, 0x13, 0xa2, 0xb4, 0xf7, 0xec, 0x7, 0x9c, 0xed, 0xa1, 0xff, 0x42, 0xd0, 0x7b, 0xe2, 0x60, 0xe4, 0xb2, 0xec, 0xf5, 0x62, 0x5f, 0xfa, 0xe2, 0xf5, 0xb7, 0xb7, 0x23, 0x24, 0xcc, 0x6b, 0xec, 0xa6, 0x7a, 0xa7, 0xee, 0x63, 0xba, 0x7f, 0xa, 0xce, 0x75, 0xe1, 0xa6, 0x50, 0xf2, 0xb1, 0x5f, 0xa4, 0x67, 0x9f, 0xdc, 0x3c, 0xe5, 0x9c, 0x91, 0xbc, 0x93, 0x45, 0x33, 0xce, 0xdd, 0xaa, 0xcc, 0x2f, 0xec, 0x50, 0x43, 0x2a, 0x1, 0xb7, 0x11, 0x68, 0x2a, 0xdc, 0x8b, 0x59, 0xac, 0xf1, 0xf, 0x76, 0x96, 0x28, 0x41, 0xbf, 0xd1, 0x2a, 0x65, 0x4d, 0x5, 0x5, 0x10, 0xa2, 0x92, 0xd4, 0x51, 0x11, 0xa, 0xdf, 0xf, 0x11, 0x33, 0x71, 0x39, 0x7f, 0xad, 0xf, 0x10, 0x60, 0x19, 0x8c, 0x92, 0x95, 0x8c, 0x62, 0x33, 0xf0, 0x7b, 0x25, 0xc8, 0x91, 0x6c, 0xec, 0x1d, 0x3f, 0xec, 0x5d, 0x12, 0xe6, 0x19, 0xda, 0x78, 0x11, 0x91, 0x40, 0xf0, 0xb1, 0x7, 0x38, 0x67, 0x4a, 0x90, 0xda, 0xde, 0x3e, 0xd9, 0xcd, 0xed, 0xeb, 0xb, 0x5a, 0x7a, 0x18, 0x55, 0x41, 0x9d, 0x32, 0xeb, 0x22, 0x47, 0xd0, 0xf7, 0x91, 0xb3, 0x70, 0xf1, 0x9e, 0x9, 0x49, 0xf4, 0x28, 0xf8, 0x99, 0xca, 0x69, 0x7a, 0x31, 0xfd, 0x6d, 0x97, 0xa4, 0x34, 0x2b, 0xdb, 0xc3, 0x50, 0x78, 0x71, 0xfe, 0x7b, 0x1b, 0x48, 0x74, 0xb6, 0x68, 0x58, 0x40, 0x65, 0xae, 0xeb, 0x1d, 0x4e, 0x7d, 0x86, 0x8c, 0xc4, 0x21, 0x28, 0x1b, 0x6, 0xea, 0x30, 0x3b, 0x51, 0x35, 0x5b, 0xc1, 0x69, 0x88, 0x10, 0x87, 0x36, 0x66, 0x16, 0x4a, 0x3b, 0xff, 0xb1, 0x20, 0x12, 0x5d, 0x9f, 0xe2, 0xe5, 0x4d, 0x9f, 0x3d, 0x23, 0x35, 0xbb, 0x82, 0x4b, 0x75, 0xc6, 0xcd, 0x18, 0x33, 0x63, 0x7, 0x4e, 0x73, 0x44, 0x56, 0xcb, 0xdf, 0xe8, 0xd2, 0x78, 0x1a, 0x62, 0xd5, 0x57, 0x73, 0xa9, 0x49, 0x43, 0x24, 0x8b, 0x8f, 0x21, 0x89, 0x5d, 0x83, 0x9d, 0xe2, 0x6e, 0x9b, 0x7, 0xc5, 0x7b, 0xfe, 0x1, 0xce, 0x5d, 0x3b, 0x5b, 0x2b, 0x2a, 0x7f, 0xe5, 0x65, 0x55, 0xe5, 0x5f, 0xb7, 0x37, 0x86, 0x5a, 0xe7, 0xba, 0x1d, 0xa4, 0xae, 0x34, 0xff, 0x83, 0x8f, 0x7a, 0xa, 0x95, 0x9c, 0x19, 0xe1, 0xfc, 0x6, 0x77, 0x70, 0x3e, 0x1f, 0x54, 0x4f, 0x37, 0xcf, 0xd0, 0x31, 0xa8, 0x38, 0x36, 0x4d, 0x9a, 0x4, 0xca, 0x18, 0x15, 0x83, 0xf4, 0xb4, 0x4a, 0x18, 0xc3, 0x38, 0xfe, 0x5d, 0xee, 0xe3, 0x54, 0x9b, 0x81, 0xc8, 0x3, 0x64, 0xe3, 0x3a, 0x38, 0x4c, 0x86, 0x17, 0x2e, 0xa1, 0xda, 0xd1, 0xa9, 0x5b, 0xaa, 0xee, 0x50, 0xb3, 0x97, 0x5a, 0x24, 0x83, 0x4e, 0xbf, 0x99, 0x9, 0xd0, 0x62, 0x53, 0x80, 0x39, 0xd4, 0x9b, 0xc2, 0x13, 0x3, 0xfc, 0x29, 0xdb, 0x72, 0xf1, 0x70, 0x4b, 0x95, 0x9c, 0x1a, 0xa2, 0x54, 0xf9, 0xb7, 0xdc, 0x9b, 0x67, 0xfc, 0xe4, 0xe2, 0x54, 0x9, 0x17, 0x48, 0x6b, 0xd0, 0xf1, 0xba, 0x30, 0xf5, 0xf5, 0x8a, 0x31, 0x60, 0x20, 0xf9, 0xcb, 0x3c, 0x8a, 0xea, 0x26, 0x58, 0xe2, 0x5a, 0xcd, 0x7c, 0x9d, 0xc6, 0xc3, 0xc9, 0x7, 0xad, 0xe, 0x47, 0xa0, 0x3b, 0xa7, 0x69, 0x5e, 0x81, 0x31, 0x97, 0xc3, 0x63, 0x3a, 0x2, 0x28, 0xdd, 0xdc, 0xd6, 0xcb, 0xf9, 0x6d, 0xaf, 0xf6, 0xb4, 0x15, 0x4a, 0xed, 0x47, 0x4c, 0x78, 0xf9, 0xc0, 0x6a, 0x82, 0x9d, 0x0, 0x62, 0xc7, 0x8f, 0x89, 0x8b, 0xd2, 0x80, 0x4d, 0x66, 0x1f, 0xc9, 0x17, 0x2c, 0xda, 0xee, 0xf1, 0x72, 0x9, 0x66, 0xae, 0x7a, 0xbc, 0xd3, 0x84, 0x9e, 0x95, 0x68, 0x37, 0x28, 0x95, 0xc1, 0xc7, 0x58, 0x7, 0x4f, 0x29, 0xd9, 0x30, 0x76, 0xff, 0xdc, 0xd0, 0x8f, 0xba, 0x8d, 0xd6, 0x65, 0xb7, 0x89, 0xcd, 0xac, 0xbc, 0x8d, 0xde, 0x55, 0x3e, 0x55, 0xf8, 0x2b, 0x70, 0xed, 0x9e, 0x0, 0x4a, 0x9b, 0xd, 0xca, 0xb8, 0x27, 0xdd, 0x34, 0xe5, 0xf6, 0x52, 0xfd, 0x77, 0x61, 0x34, 0x6b, 0x49, 0xc4, 0xb7, 0xb7, 0x7b, 0xc8, 0xf6, 0xe6, 0x8c, 0x37, 0xf0, 0x19, 0xcc, 0x44, 0x48, 0x3d, 0x63, 0x68, 0x63, 0x20, 0x42, 0x5e, 0x91, 0xb9, 0xde, 0x73, 0xc0, 0x1b, 0x75, 0x4a, 0x27, 0x64, 0xd2, 0x7a, 0x4f, 0x34, 0x14, 0x44, 0x22, 0xe2, 0xdc, 0xe6, 0x28, 0x1f, 0x81, 0x85, 0xf7, 0xef, 0x1, 0xad, 0x2b, 0xb7, 0x68, 0xba, 0x90, 0x65, 0x48, 0x25, 0xaf, 0x35, 0x36, 0x20, 0x4a, 0x26, 0x93, 0xdb, 0xa, 0x66, 0x22, 0x28, 0x8a, 0x1f, 0xb0, 0x1e, 0x64, 0x8c, 0x59, 0xee, 0xe8, 0xce, 0x2d, 0xae, 0x74, 0x78, 0xc1, 0x7d, 0xb6, 0xe7, 0x59, 0x35, 0x2a, 0xcc, 0x95, 0x81, 0xef, 0xf0, 0xca, 0xd0, 0xd9, 0x4d, 0xd2, 0xc, 0x88, 0x67, 0xc0, 0x7, 0x41, 0x7c, 0x85, 0x2, 0xa0, 0x9e, 0xa9, 0x1, 0x63, 0x2f, 0xf8, 0x90, 0xe4, 0x79, 0x65, 0xd8, 0x37, 0x92, 0x1c, 0xe4, 0x8a, 0x65, 0xe0, 0xb1, 0x79, 0x1e, 0xfd, 0x93, 0xfd, 0xfa, 0x5f, 0x7, 0x8f, 0xb, 0xf6, 0x47, 0x35, 0x40, 0x70, 0x6e, 0xed, 0xfc, 0xe6, 0xa3, 0xc7, 0xf5, 0x53, 0xd, 0xeb, 0xbd, 0x5f, 0xf4, 0xd5, 0xbd, 0xcb, 0xe8, 0x70, 0x9a, 0x33, 0x13, 0xdf, 0x1, 0x5c, 0xf8, 0x81, 0xeb, 0x2c, 0x14, 0x80, 0x18, 0xf7, 0xf, 0x7a, 0x43, 0x70, 0xbd, 0x74, 0x87, 0x4e, 0x4c, 0x6a, 0xda, 0xb, 0xba, 0x91, 0x28, 0xb3, 0x5f, 0x6e, 0xd2, 0x8b, 0xf1, 0xd2, 0xeb, 0xdb, 0x1c, 0x22, 0xd5, 0xa9, 0x3, 0xf1, 0x26, 0x95, 0x2f, 0xa6, 0xb0, 0x51, 0xbe, 0xda, 0x86, 0x51, 0x76, 0x88, 0x90, 0xce, 0x73, 0xf4, 0xe9, 0x76, 0x53, 0x5a, 0xd8, 0x5b, 0x5b, 0xb, 0x80, 0xed, 0xe3, 0x4, 0xe6, 0xc1, 0x4d, 0x52, 0x95, 0x28, 0x24, 0x5e, 0xd3, 0x27, 0xef, 0x47, 0xcc, 0x6d, 0xe7, 0x7d, 0xa6, 0x0, 0x90, 0xd6, 0xee, 0x96, 0x43, 0xc1, 0x92, 0xde, 0x84, 0xa0, 0x3b, 0xb3, 0x73, 0xfe, 0x1, 0x76, 0x37, 0xae, 0x53, 0x64, 0x22, 0xc2, 0xe9, 0xf7, 0xc1, 0x75, 0x60, 0xfc, 0xec, 0x34, 0xec, 0x5a, 0xbe, 0x20, 0x76, 0x21, 0x6a, 0xa8, 0x3b, 0xa3, 0x9e, 0x54, 0xd0, 0x81, 0x37, 0xd4, 0x85, 0x6b, 0xd8, 0xab, 0x35, 0xef, 0x84, 0x83, 0xee, 0x1f, 0x46, 0x3c, 0xa3, 0x4a, 0x91, 0x6c, 0x7d, 0x5f, 0xb2, 0xc9, 0xe5, 0x11, 0xf3, 0x5c, 0x49, 0x3d, 0xc3, 0xaa, 0xd, 0x11, 0xc6, 0xb9, 0x54, 0x85, 0x81, 0x83, 0xe5, 0x7e, 0x8a, 0xe, 0xec, 0xf4, 0xa7, 0x2a, 0x73, 0x12, 0x36, 0x8f, 0x34, 0x71, 0x9d, 0xd0, 0x88, 0x3e, 0xee, 0xdb, 0xcf, 0x99, 0x75, 0xe4, 0x7, 0xa1, 0xb7, 0xc6, 0x51, 0x1b, 0x61, 0xe8, 0xe7, 0x5d, 0x1f, 0xaa, 0xaa, 0x51, 0x10, 0x59, 0x1d, 0xa1, 0xd6, 0x86, 0xc3, 0xf0, 0x55, 0xf0, 0x31, 0xe5, 0x3d, 0x66, 0xe, 0xf2, 0x9, 0x73, 0x5c, 0xf9, 0x9, 0x79, 0x4b, 0x41, 0x9e, 0x1a, 0xaa, 0x21, 0x64, 0x7e, 0x1d, 0x27, 0xa8, 0x5, 0xc9, 0x52, 0xa7, 0xb, 0x81, 0xe5, 0x58, 0xa5, 0xdf, 0x35, 0x47, 0xeb, 0x5a, 0x92, 0x5d, 0xee, 0x44, 0x8a, 0xe1, 0x53, 0xa8, 0xc8, 0x13, 0x7f, 0x69, 0x8, 0x97, 0xb, 0x9a, 0xcc, 0xbf, 0x40, 0xd5, 0x77, 0x83, 0x3, 0xd4, 0x74, 0xe5, 0x1c, 0xe0, 0x27, 0x7b, 0xa6, 0xa8, 0x60, 0xcf, 0xc, 0x18, 0x3d, 0x3d, 0xbf, 0x98, 0xc2, 0xf1, 0x52, 0xf1, 0x8e, 0xe4, 0x60, 0xb0, 0x29, 0xb8, 0xb1, 0x60, 0xb6, 0xb8, 0x9b, 0xc6, 0x55, 0x5f, 0xf1, 0x3e, 0xa7, 0x9f, 0x88, 0x78, 0x20, 0xef, 0xec, 0x19, 0x5f, 0xc7, 0x9e, 0x12, 0x2b, 0x28, 0x60, 0x2b, 0x9b, 0xb1, 0xc7, 0x30, 0x47, 0xbf, 0xee, 0x27, 0xf3, 0xb2, 0xbe, 0xc0, 0x73, 0xc9, 0x59, 0xf6, 0x9d, 0xeb, 0x98, 0xdb, 0xc1, 0x65, 0xc1, 0x13, 0x49, 0xd1, 0x9c, 0x1a, 0x9d, 0xf7, 0xd4, 0x7d, 0xf5, 0x80, 0x21, 0x28, 0x39, 0x66, 0x6f, 0x2, 0x4, 0x11, 0x49, 0x84, 0x79, 0xe1, 0xf7, 0xbe, 0x3d, 0x25, 0x18, 0x56, 0x3e, 0x3f, 0x37, 0x34, 0x4b, 0x3c, 0x41, 0xe0, 0x64, 0x2c, 0xd6, 0x46, 0x55, 0x5b, 0x2b, 0x76, 0xc5, 0x57, 0x79, 0x32, 0xb5, 0xad, 0xf3, 0x8d, 0x95, 0x92, 0xf0, 0xd0, 0xcb, 0x5d, 0xbe, 0xbd, 0x4f, 0xf6, 0x44, 0x74, 0x45, 0x2c, 0x75, 0x81, 0x40, 0x1d, 0x82, 0xc3, 0xab, 0xb4, 0x79, 0xd7, 0x19, 0xe9, 0x9b, 0xe7, 0x2d, 0xc, 0xbd, 0x78, 0x2e, 0x24, 0x4a, 0x69, 0x84, 0x15, 0xc9, 0x76, 0x13, 0xf6, 0x94, 0x6d, 0x75, 0xa4, 0x98, 0x27, 0xdc, 0x34, 0xbc, 0xa7, 0xcc, 0xfb, 0xa1, 0xf0, 0x8d, 0x10, 0x19, 0x53, 0x87, 0x5e, 0x9d, 0x89, 0x3e, 0x29, 0xae, 0x1, 0xec, 0xe2, 0x91, 0x70, 0x35, 0x92, 0xef, 0xa4, 0x28, 0xc9, 0x65, 0xd0, 0x2e, 0xf6, 0x87, 0x89, 0xa2, 0xd5, 0xc0, 0xa3, 0xea, 0xa, 0x8c, 0x2e, 0x3a, 0x31, 0xa, 0x5b, 0xe8, 0xab, 0x9e, 0x6d, 0xf4, 0x89, 0x3a, 0x7d, 0xa9, 0x2d, 0xbd, 0x9e, 0x88, 0xd2, 0xba, 0x8c, 0x3f, 0x10, 0x6a, 0x2, 0x84, 0x94, 0x5f, 0x3b, 0xd8, 0x87, 0x8a, 0x9f, 0x15, 0x52, 0x95, 0x2, 0xef, 0xb1, 0xd6, 0x20, 0x22, 0xdb, 0xcf, 0x1a, 0xc0, 0x3, 0x6e, 0x74, 0xa0, 0xbd, 0xe3, 0x9f, 0x41, 0x14, 0xa7, 0xb2, 0x97, 0x4f, 0x9f, 0x20, 0x55, 0x25, 0xf7, 0x36, 0x4, 0xac, 0xec, 0x73, 0x27, 0x16, 0xa2, 0x66, 0x34, 0x20, 0xfe, 0x59, 0x8e, 0xb4, 0x39, 0x87, 0x3f, 0xc5, 0x60, 0x56, 0x84, 0x88, 0x2b, 0xda, 0x4c, 0xb2, 0x9a, 0x39, 0x5e, 0xfa, 0xf9, 0xb5, 0x74, 0x8d, 0x5e, 0x25, 0x92, 0x6f, 0xb, 0xed, 0x3d, 0xff, 0xa, 0x9e, 0x5c, 0x4, 0xfe, 0x31, 0x6c, 0xc7, 0x62, 0x46, 0x2b, 0x6d, 0x44, 0xa0, 0xba, 0x85, 0x51, 0x5d, 0xf0, 0xed, 0xbe, 0x8b, 0xaf, 0xb8, 0xb8, 0x8d, 0x8f, 0x71, 0xa6, 0xc7, 0x53, 0x86, 0xdd, 0xff, 0x0, 0xcf, 0x8b, 0xb4, 0xfe, 0x14, 0x40, 0xe1, 0xa9, 0x5c, 0xdb, 0xf7, 0xbc, 0xfc, 0xb7, 0xfd, 0xd8, 0xd9, 0xe8, 0xec, 0xb4, 0x73, 0x21, 0x99, 0x38, 0x2f, 0x68, 0xd3, 0x69, 0xdc, 0x19, 0xc2, 0x8b, 0xc8, 0xe4, 0x2e, 0xd3, 0x10, 0x96, 0x2d, 0x1c, 0x92, 0x27, 0x2c, 0x4d, 0xc0, 0xfd, 0x73, 0x10, 0x3d, 0xb8, 0xfd, 0x81, 0x69, 0xe, 0x20, 0x78, 0x6c, 0xd, 0xf7, 0x2a, 0x25, 0x7e, 0x57, 0xef, 0xa9, 0x67, 0xe8, 0xd0, 0x60, 0x67, 0xe0, 0x13, 0xa4, 0xe8, 0x3f, 0xe6, 0x66, 0x3a, 0x15, 0x14, 0xb9, 0x73, 0xb1, 0xdc, 0xbb, 0xa8, 0xa0, 0xb4, 0xcc, 0x23, 0xe6, 0x9a, 0xb5, 0xa0, 0xb8, 0x35, 0x3c, 0x20, 0x30, 0x5, 0x34, 0xff, 0xf2, 0xda, 0x30, 0x6f, 0x81, 0xb8, 0x19, 0xca, 0xe5, 0x80, 0xc8, 0xc2, 0x7a, 0xbf, 0xcc, 0x50, 0xc4, 0x11, 0x8d, 0xee, 0xdb, 0x99, 0x82, 0xbf, 0xa6, 0x77, 0xf, 0x1b, 0xd1, 0x27, 0xbb, 0x93, 0xe7, 0xdc, 0x5e, 0xb, 0x63, 0x1, 0xc6, 0xea, 0xf8, 0xe7, 0x79, 0xfb, 0xb9, 0x73, 0xdb, 0x88, 0x72, 0x36, 0xf4, 0xa7, 0xbb, 0x48, 0xe4, 0x1b, 0x57, 0x35, 0xb0, 0x6f, 0x41, 0xb6, 0xf5, 0xa2, 0x91, 0x88, 0xa4, 0x5d, 0x8f, 0x1b, 0x98, 0xa0, 0xfa, 0xfb, 0xb4, 0xff, 0x90, 0x96, 0x0, 0xdb, 0xc6, 0x19, 0x36, 0xb7, 0xda, 0xbb, 0x8b, 0xe8, 0x56, 0x83, 0x72, 0x73, 0x42, 0xd4, 0xc6, 0x35, 0xec, 0x53, 0xe4, 0xd8, 0xf0, 0x76, 0xfd, 0x29, 0x8a, 0xc2, 0xaa, 0x54, 0x25, 0x5c, 0x77, 0xf0, 0xe4, 0x55, 0x5c, 0x9d, 0xaf, 0xf7, 0x28, 0x4d, 0xad, 0xe8, 0x88, 0xa6, 0x54, 0xcf, 0xba, 0xdf, 0x6d, 0xa7, 0xa, 0xe8, 0x18, 0xb0, 0x85, 0x93, 0x7a, 0xc3, 0x9, 0xb9, 0xb3, 0xc8, 0x8f, 0x2c, 0xb0, 0x99, 0xa1, 0xcb, 0xeb, 0x8f, 0x75, 0x8c, 0x20, 0x3b, 0x8f, 0x38, 0x45, 0x9b, 0x5c, 0xf0, 0x90, 0xba, 0xf2, 0xde, 0x84, 0x85, 0x7c, 0xe3, 0xcc, 0x95, 0xb3, 0x1c, 0x1a, 0x75, 0x52, 0x50, 0x5f, 0xd4, 0xc1, 0xeb, 0xe4, 0x59, 0xbb, 0xac, 0x5d, 0x63, 0xb0, 0x11, 0xb9, 0xcd, 0xf7, 0x94, 0x36, 0x24, 0xd3, 0x71, 0xd3, 0x24, 0xe9, 0xd6, 0xa8, 0x53, 0x65, 0xfd, 0xc0, 0x32, 0x65, 0x6d, 0x5a, 0x16, 0x45, 0xa5, 0xcb, 0xb8, 0x42, 0x92, 0x2d, 0xf1, 0x3c, 0xea, 0x88, 0x6d, 0x9c, 0xc5, 0xb0, 0x6d, 0x90, 0x30, 0x35, 0xc9, 0xe, 0xdf, 0x6c, 0xcc, 0xec, 0xf8, 0x6, 0x46, 0x49, 0x99, 0x78, 0x38, 0xc6, 0xfc, 0x66, 0xed, 0xa7, 0x4c, 0xae, 0x35, 0x8a, 0x17, 0x2e, 0x2, 0x91, 0xc3, 0xbe, 0xa7, 0xec, 0xe6, 0xca, 0xdb, 0x28, 0x84, 0xd6, 0xc4, 0x92, 0x51, 0x30, 0xce, 0x40, 0xcd, 0xef, 0x12, 0x76, 0x25, 0xd7, 0x4, 0x8b, 0x20, 0xae, 0x9c, 0x6f, 0x36, 0xda, 0xdc, 0xb9, 0x6c, 0x85, 0x58, 0xf0, 0x24, 0x4d, 0xdc, 0xe, 0x0, 0x79, 0x42, 0x85, 0xbf, 0xe6, 0xf2, 0x64, 0xea, 0xdf, 0x9, 0xdc, 0x95, 0x12, 0xe8, 0x3d, 0x6c, 0xf2, 0x9b, 0x37, 0x87, 0x44, 0x1b, 0xd4, 0xa9, 0x35, 0xf1, 0x6d, 0x6d, 0x2c, 0xb6, 0x50, 0x2a, 0x83, 0x5, 0xd0, 0x5e, 0xfb, 0xb2, 0xd, 0x4f, 0x2e, 0x4, 0x91, 0x3b, 0xfd, 0x5e, 0x5f, 0xca, 0xf8, 0x70, 0xed, 0xc6, 0xfd, 0x4f, 0x8c, 0xcc, 0xa9, 0x2d, 0xb5, 0xb, 0x5d, 0x64, 0xe4, 0x1f, 0x1d, 0x0, 0xc9, 0x8b, 0xf5, 0x96, 0x95, 0x5, 0x72, 0x11, 0x4e, 0xbc, 0xf0, 0xc8, 0x52, 0x84, 0xa0, 0x98, 0xe3, 0xd2, 0xa0, 0x4a, 0xfd, 0xde, 0x49, 0x4f, 0x10, 0x3a, 0xfe, 0x5b, 0x81, 0x7b, 0xb3, 0x48, 0xe5, 0xcc, 0x3a, 0xeb, 0x54, 0x49, 0x5, 0xd4, 0x84, 0x42, 0x75, 0x8e, 0xb3, 0x4f, 0x1b, 0x34, 0x7b, 0x51, 0xaa, 0x3d, 0x8c, 0xfa, 0xf7, 0xb, 0x69, 0xec, 0x28, 0x69, 0x2f, 0x41, 0x6c, 0xce, 0x86, 0x23, 0xb3, 0x96, 0x4, 0xcd, 0xad, 0xad, 0x10, 0x55, 0x1c, 0xbe, 0x1, 0xf9, 0xfa, 0xb5, 0x4b, 0xe7, 0x67, 0x4e, 0xc0, 0x85, 0x99, 0x5c, 0xe1, 0x78, 0xf6, 0xba, 0x3c, 0x2d, 0x9a, 0xab, 0xd7, 0x6a, 0x22, 0x4d, 0x52, 0x58, 0xe9, 0xfa, 0x7d, 0xd, 0x9, 0x0, 0x9c, 0xc2, 0xd8, 0x51, 0x87, 0x39, 0xf5, 0xa5, 0xb, 0x2d, 0x26, 0xb8, 0x3a, 0xdd, 0xbc, 0xfc, 0x8a, 0x3b, 0x4, 0x9d, 0xe9, 0x29, 0x27, 0x39, 0x57, 0x3a, 0x94, 0xbc, 0xae, 0x3b, 0x26, 0x51, 0xef, 0x35, 0x29, 0x86, 0x20, 0x93, 0xce, 0xea, 0x9f, 0x7b, 0x81, 0x6c, 0xb0, 0x3, 0xfc, 0x9e, 0x63, 0xdc, 0x81, 0x1d, 0x34, 0x7d, 0xbe, 0x39, 0xe8, 0x79, 0x83, 0x14, 0x32, 0x89, 0x68, 0xdb, 0xcd, 0xad, 0x6e, 0x2, 0xf7, 0xa1, 0x11, 0x62, 0xda, 0x5e, 0xcc, 0xd1, 0xf4, 0x5f, 0x57, 0xb2, 0xf3, 0xe6, 0x3a, 0xa7, 0xa7, 0xf6, 0xc8, 0xcf, 0x40, 0x83, 0xb4, 0xd5, 0x61, 0x5e, 0x9a, 0x87, 0x83, 0xbc, 0xe, 0xa5, 0x41, 0xed, 0xb1, 0xac, 0xc5, 0xfa, 0xd8, 0x7, 0x3c, 0xc8, 0xc, 0xa6, 0x59, 0x90, 0x19, 0xb8, 0xc3, 0x4a, 0x8d, 0xc9, 0xde, 0xfe, 0xc8, 0xc, 0x9e, 0x22, 0x37, 0xb8, 0x1c, 0xb9, 0x27, 0xb4, 0xd2, 0x91, 0x4, 0xb, 0xfe, 0x6c, 0xa6, 0x83, 0xe9, 0xac, 0x86, 0x23, 0xf, 0x13, 0x12, 0x29, 0xb3, 0x1e, 0x4d, 0xc, 0x93, 0xe4, 0x2a, 0xa6, 0x59, 0x2e, 0x2b, 0xf8, 0xa2, 0xe3, 0x89, 0x3e, 0xf9, 0x53, 0x38, 0x23, 0x77, 0x7f, 0x7c, 0x77, 0x11, 0xac, 0x63, 0x80, 0x7f, 0x0, 0x10, 0x37, 0x59, 0x7c, 0xc9, 0x4a, 0x60, 0x18, 0x9c, 0x75, 0x7f, 0x70, 0x8c, 0xc4, 0xe1, 0x65, 0x6b, 0xdb, 0xa5, 0xc5, 0xec, 0x62, 0x3f, 0x95, 0x14, 0xa2, 0x38, 0x73, 0xb1, 0x78, 0xa, 0x94, 0xad, 0xc8, 0xbc, 0x9d, 0x81, 0xe1, 0x6b, 0x0, 0x34, 0x9c, 0xd8, 0xf6, 0x4, 0xdc, 0x70, 0xa, 0x84, 0xb4, 0xa6, 0xb4, 0x57, 0x25, 0x46, 0xc0, 0x21, 0xbd, 0x60, 0xde, 0x6a, 0x4c, 0x54, 0x72, 0x60, 0xff, 0x2, 0xcf, 0x7, 0xe6, 0x36, 0xdc, 0x8c, 0xd9, 0x8a, 0xa9, 0x2c, 0x7d, 0xa4, 0x9, 0x66, 0xf5, 0xf5, 0x1e, 0x1d, 0x47, 0xbf, 0xa0, 0xad, 0x64, 0xf2, 0x23, 0x66, 0xf8, 0xbc, 0xb6, 0x5c, 0x9e, 0xaa, 0x87, 0x6, 0xc, 0xb7, 0x6c, 0x1c, 0x40, 0x17, 0xf2, 0x24, 0x81, 0xc9, 0x35, 0x14, 0xa6, 0xd4, 0x5f, 0x63, 0x89, 0x81, 0xa6, 0x8e, 0xd9, 0xa9, 0xaf, 0xb8, 0x8f, 0xd2, 0x2d, 0x32, 0xc7, 0x65, 0xb6, 0x30, 0x95, 0x43, 0xfb, 0xb3, 0xc1, 0xb3, 0x1, 0xcc, 0x12, 0xcf, 0x85, 0xf6, 0x72, 0x1, 0x86, 0x1, 0xb, 0xc7, 0x1d, 0x39, 0x58, 0x1b, 0x22, 0xee, 0x15, 0xb9, 0x24, 0xdb, 0x17, 0xa3, 0x3b, 0xf0, 0xfd, 0x9a, 0xc4, 0xff, 0xb8, 0x17, 0x59, 0xc6, 0xde, 0x87, 0x50, 0xd0, 0xd3, 0xe4, 0x7b, 0x59, 0x46, 0x7f, 0xe7, 0x0, 0x65, 0x0, 0xed, 0xc1, 0xa1, 0x80, 0xf3, 0x25, 0x70, 0x1, 0xc3, 0xa8, 0x4d, 0x3d, 0xb4, 0x79, 0x95, 0xfb, 0x8c, 0x62, 0xcf, 0xef, 0xec, 0x16, 0x37, 0x1f, 0x16, 0x0, 0x4d, 0x5c, 0x6e, 0x11, 0x1, 0x68, 0xc4, 0xeb, 0x27, 0x9c, 0x7e, 0x76, 0xa1, 0x1d, 0xa1, 0xe, 0xba, 0x5e, 0x57, 0x4c, 0x0, 0x47, 0x52, 0x14, 0x15, 0xfe, 0xb7, 0x73, 0x23, 0x8c, 0xf6, 0x6d, 0xce, 0x3a, 0xac, 0x37, 0xbc, 0x5d, 0xfe, 0xdf, 0xc3, 0x75, 0x49, 0x7, 0x8a, 0xa2, 0xdb, 0x47, 0xa1, 0xa2, 0x65, 0x91, 0x51, 0xee, 0xd6, 0x20, 0x6c, 0x24, 0x15, 0x7, 0x81, 0xd3, 0xb1, 0xd1, 0x68, 0x50, 0xb9, 0x60, 0x81, 0x74, 0x8c, 0x1, 0xe7, 0xb1, 0x62, 0xff, 0x80, 0xf3, 0xfa, 0xb1, 0xf5, 0x3, 0x1e, 0x2c, 0xcb, 0xf3, 0xdd, 0xb1, 0x7f, 0xef, 0xda, 0xa7, 0x91, 0xfc, 0xa8, 0x39, 0xb5, 0xea, 0x61, 0xb5, 0xf9, 0xf3, 0x7, 0xb7, 0xdd, 0x83, 0x98, 0x1b, 0x10, 0x80, 0xd9, 0x76, 0x72, 0xb5, 0x66, 0xf, 0x2f, 0xb8, 0xfd, 0x83, 0x8, 0x76, 0xf3, 0xef, 0xc3, 0x4b, 0x75, 0xde, 0xd7, 0x89, 0x40, 0xab, 0xc2, 0x5d, 0x43, 0x6, 0xb6, 0x3, 0xac, 0xee, 0x5b, 0xe0, 0xdf, 0x53, 0x6e, 0xcd, 0xcd, 0x25, 0x33, 0xbc, 0x62, 0xe8, 0xf1, 0xf2, 0xc3, 0x3, 0x4f, 0x77, 0x21, 0x79, 0xf, 0xdd, 0x1b, 0xcc, 0x52, 0x45, 0x21, 0x72, 0xca, 0x97, 0xea, 0x46, 0xec, 0x9c, 0xf0, 0x4a, 0x9a, 0xe7, 0xc7, 0x9b, 0x8b, 0x65, 0xa1, 0x47, 0x53, 0xb1, 0x75, 0x2f, 0xaf, 0x35, 0x6f, 0x79, 0xd2, 0x6b, 0x35, 0xc4, 0x51, 0x40, 0x90, 0x79, 0x95, 0xac, 0x5d, 0x65, 0x3a, 0xc3, 0xa3, 0xdd, 0x69, 0x26, 0xa3, 0x4a, 0x51, 0x88, 0x2e, 0x3c, 0x50, 0x5d, 0x41, 0xdd, 0x53, 0x37, 0x37, 0x13, 0xa1, 0xdf, 0x78, 0x4f, 0x75, 0xb, 0x73, 0x46, 0x5, 0x3f, 0xd7, 0xc5, 0x24, 0xe2, 0xb5, 0xb3, 0xc, 0x76, 0x19, 0x69, 0x61, 0x68, 0x8c, 0xaf, 0x3b, 0xfa, 0x52, 0x25, 0x14, 0x8d, 0x13, 0xa1, 0xbc, 0x9f, 0xf5, 0xeb, 0x69, 0x76, 0xf1, 0x8b, 0xb1, 0x1a, 0xdd, 0x25, 0xdf, 0x9b, 0x3e, 0xf5, 0xe6, 0x55, 0x54, 0xd1, 0x6c, 0xcb, 0xf3, 0xb, 0xcc, 0x4, 0x80, 0x90, 0xe8, 0x95, 0x49, 0xef, 0x5b, 0x59, 0xc1, 0x9a, 0x4a, 0x10, 0xa8, 0x59, 0x94, 0xfe, 0xf0, 0x3e, 0x12, 0xa8, 0x16, 0x63, 0xd6, 0x49, 0x38, 0x54, 0xf9, 0xe7, 0xb4, 0x2d, 0xc3, 0x73, 0x54, 0x78, 0x9e, 0xd, 0x9, 0xd2, 0x2e, 0x2e, 0x7, 0x5, 0x9f, 0x9d, 0x29, 0x93, 0x8a, 0xf9, 0xa, 0xa2, 0x6a, 0xc, 0xf6, 0x3c, 0xd3, 0xc5, 0xb2, 0x9b, 0x27, 0x75, 0x14, 0xba, 0x32, 0x9a, 0x7, 0x73, 0x4a, 0x77, 0xcb, 0x2, 0x32, 0x7e, 0xbd, 0x2d, 0xc4, 0xe8, 0xc4, 0x4b, 0xed, 0x64, 0xe8, 0x20, 0xb0, 0xab, 0xc5, 0x64, 0x4b, 0x69, 0xc7, 0xee, 0xc4, 0x19, 0x84, 0xc1, 0x18, 0x3d, 0xe5, 0x93, 0x47, 0x1c, 0xef, 0x73, 0x46, 0x9c, 0xe6, 0x92, 0x60, 0x5, 0xb5, 0xae, 0xb8, 0xc7, 0x6b, 0xc1, 0xf8, 0xf0, 0x43, 0xca, 0xa1, 0x3a, 0xf6, 0xb2, 0x79, 0xd6, 0xec, 0xd5, 0x4e, 0x22, 0xc9, 0x5, 0xa2, 0x55, 0xaf, 0xee, 0x56, 0xd, 0x8b, 0x2, 0x8e, 0x4b, 0xba, 0x15, 0xe1, 0xbf, 0xec, 0xf4, 0xac, 0x97, 0xb3, 0xa7, 0x22, 0x3e, 0x40, 0xb6, 0xa8, 0x5e, 0x0, 0xc4, 0x26, 0x4, 0x85, 0x92, 0x96, 0x4e, 0xa6, 0x95, 0x32, 0x5e, 0x70, 0x56, 0xa4, 0xa6, 0x59, 0xbc, 0xaa, 0x22, 0xbc, 0x42, 0x59, 0x5f, 0x4c, 0x71, 0x29, 0xb9, 0xed, 0x82, 0x31, 0xfa, 0xbd, 0x68, 0x61, 0x9a, 0xba, 0x52, 0x41, 0x10, 0x65, 0xa6, 0x16, 0x22, 0x68, 0x63, 0x92, 0xb6, 0x3, 0x8d, 0x90, 0x46, 0x50, 0xa8, 0xcb, 0x7f, 0x24, 0xe0, 0x8b, 0x9b, 0x1e, 0x18, 0xa, 0x82, 0x97, 0x57, 0xeb, 0x81, 0x11, 0x12, 0xa0, 0x30, 0x22, 0x81, 0xf2, 0xa0, 0x21, 0x88, 0x7b, 0xae, 0x3c, 0xdc, 0x9c, 0x7e, 0xe7, 0x15, 0xce, 0x72, 0xcc, 0x32, 0x23, 0x20, 0xd7, 0x38, 0x82, 0xcb, 0xbb, 0xb2, 0x3c, 0xcd, 0x43, 0x2c, 0xe8, 0xc6, 0xdf, 0x63, 0xab, 0xe4, 0x17, 0xd7, 0x83, 0x31, 0x28, 0x0, 0xbd, 0x58, 0xab, 0x42, 0x29, 0xf3, 0xe8, 0x46, 0x8d, 0xd1, 0x18, 0x24, 0x88, 0x10, 0xf6, 0x6e, 0x76, 0x6c, 0x6b, 0xcd, 0xc6, 0xc, 0x1a, 0xcb, 0xff, 0x8e, 0x60, 0x59, 0xd8, 0x68, 0x5c, 0xa0, 0x1d, 0x5a, 0x1c, 0x6e, 0x29, 0x32, 0xa5, 0xf4, 0xa5, 0xc7, 0xc8, 0x2e, 0xd, 0xc9, 0x43, 0x1e, 0xf, 0x3d, 0xd9, 0x29, 0x97, 0x89, 0x22, 0x3a, 0x94, 0x29, 0x17, 0x53, 0xe, 0x36, 0x26, 0x8a, 0x7a, 0x87, 0xb5, 0xd7, 0x7e, 0x71, 0x7e, 0x7b, 0xd5, 0x2, 0xa2, 0xe1, 0xbc, 0x4d, 0x24, 0x5b, 0x2e, 0xd2, 0xf5, 0xdc, 0x4c, 0x2a, 0x71, 0xd7, 0x4b, 0x17, 0xbb, 0x5, 0x82, 0x40, 0x1, 0xb8, 0xfd, 0xa6, 0xe9, 0x87, 0x13, 0x5e, 0x69, 0xb0, 0xb4, 0x67, 0x42, 0xa4, 0x91, 0x5, 0xa1, 0x19, 0x2b, 0x33, 0x66, 0xf3, 0xac, 0xcc, 0x16, 0xd9, 0xed, 0x24, 0x50, 0x8a, 0x95, 0x34, 0x45, 0xcc, 0x34, 0xbe, 0x4b, 0x18, 0x1c, 0x6, 0x99, 0x76, 0x59, 0x81, 0x52, 0x89, 0x89, 0x63, 0x5c, 0x10, 0x3d, 0x65, 0xad, 0xfc, 0x5e, 0x7b, 0xde, 0x6, 0x91, 0xda, 0x52, 0x14, 0xa6, 0x8a, 0xa6, 0x5a, 0x33, 0xa0, 0x4, 0xba, 0xfa, 0x4f, 0x89, 0x7c, 0x7d, 0x33, 0xf6, 0x90, 0xa9, 0x8e, 0xfe, 0xd4, 0xce, 0x9d, 0x28, 0x57, 0x8c, 0x26, 0xb6, 0xb3, 0x28, 0x36, 0xec, 0x21, 0xaa, 0xc2, 0x89, 0x70, 0x93, 0xf9, 0x91, 0xd3, 0x66, 0x3e, 0x1e, 0x6e, 0xf4, 0xa3, 0xb2, 0x69, 0x63, 0x7d, 0xcd, 0x32, 0xa7, 0xb4, 0x22, 0x10, 0x2c, 0x40, 0x5d, 0xb8, 0xc3, 0x99, 0x2e, 0x93, 0x54, 0x2b, 0xbe, 0xfc, 0xcc, 0x7d, 0xe2, 0xdf, 0xb1, 0x56, 0x7b, 0xaa, 0xdd, 0xa6, 0xc9, 0x82, 0x4a, 0xe3, 0xa5, 0x78, 0xdc, 0x31, 0x41, 0x39, 0x4f, 0x70, 0xda, 0xb3, 0xbe, 0x8a, 0x98, 0xfa, 0x55, 0xca, 0x6c, 0xa3, 0x11, 0xdf, 0x66, 0x19, 0x86, 0x89, 0x34, 0x8e, 0x3b, 0xd5, 0x6b, 0x99, 0xea, 0xa0, 0xa1, 0x20, 0xfb, 0x79, 0x43, 0x7f, 0xd3, 0x5a, 0xd9, 0x47, 0x6, 0x30, 0xcd, 0xe3, 0xa7, 0x53, 0xa8, 0xb4, 0x4d, 0xb4, 0xfb, 0x59, 0x66, 0x2e, 0xb9, 0xe1, 0xe3, 0x9e, 0x20, 0x72, 0x68, 0x5f, 0x72, 0x63, 0x32, 0x4b, 0x43, 0x1, 0xa1, 0xb1, 0x25, 0x68, 0xc2, 0x6e, 0xb, 0x6f, 0x7d, 0x86, 0x2b, 0x76, 0xb6, 0xb4, 0x1b, 0xc, 0xe0, 0x16, 0x7a, 0xf7, 0x1, 0x6c, 0xac, 0xaa, 0x9e, 0x83, 0x90, 0x54, 0x51, 0x82, 0x34, 0xd3, 0x70, 0x34, 0xef, 0xa4, 0xf3, 0x62, 0x6c, 0xcd, 0x1d, 0x1c, 0x49, 0xa6, 0x29, 0x5a, 0x25, 0x7a, 0x99, 0xce, 0x2e, 0x78, 0xb6, 0x46, 0x53, 0x99, 0x57, 0xd3, 0x35, 0xfb, 0x78, 0x99, 0xce, 0xe0, 0x60, 0x9, 0xdf, 0xa9, 0xf5, 0x98, 0x4c, 0x7a, 0x52, 0x1f, 0x39, 0xc8, 0x7d, 0x54, 0xc1, 0xbc, 0xba, 0xc2, 0xc6, 0x8a, 0xcb, 0x52, 0x8d, 0xae, 0x81, 0xfe, 0x48, 0xd4, 0x48, 0x47, 0x11, 0xa7, 0xf1, 0x80, 0x3f, 0xf0, 0x44, 0x58, 0xc4, 0x4a, 0xdf, 0xf8, 0xb2, 0x84, 0xb7, 0x3d, 0x36, 0xfe, 0xf1, 0x2d, 0x12, 0x8f, 0x91, 0xad, 0xc0, 0xc7, 0x3c, 0xf3, 0xb9, 0x25, 0xf, 0xe4, 0x55, 0x55, 0x5e, 0x3b, 0xe7, 0xd0, 0x0, 0x47, 0xf9, 0x26, 0x33, 0xb0, 0x8, 0xfa, 0x28, 0x5c, 0x4f, 0xc2, 0x9d, 0x5d, 0x83, 0x15, 0x5b, 0x39, 0x80, 0xe6, 0x3a, 0xc7, 0x32, 0x69, 0x25, 0xa4, 0xe9, 0xc8, 0xa2, 0xfa, 0xe, 0x96, 0x42, 0x5, 0x6a, 0x8c, 0x6, 0x71, 0xee, 0xad, 0xb3, 0x2b, 0x54, 0x45, 0xb, 0x57, 0x9b, 0x9, 0x6, 0xa7, 0xd6, 0x78, 0xe2, 0xf4, 0xb5, 0x2b, 0xd1, 0x85, 0x43, 0x68, 0x29, 0x64, 0xf6, 0xf6, 0x8a, 0xd7, 0x33, 0xc6, 0x28, 0x84, 0x88, 0xb3, 0xd3, 0xc7, 0x58, 0x97, 0x3f, 0xdb, 0x9, 0x67, 0x3b, 0x4c, 0x1a, 0x8c, 0x1d, 0x34, 0x4e, 0xda, 0x9e, 0x16, 0xd2, 0xa6, 0x13, 0x96, 0x18, 0x2f, 0x4f, 0xbd, 0x36, 0xa5, 0xcd, 0xd7, 0x4e, 0x2b, 0x0, 0x9a, 0xb9, 0x3, 0x61, 0x77, 0xd1, 0xf8, 0xbd, 0x97, 0xba, 0x45, 0x79, 0xb3, 0x34, 0xd, 0x67, 0x9c, 0xbf, 0x5b, 0x8c, 0xd7, 0x84, 0xe3, 0x83, 0x9b, 0xb2, 0x14, 0x8d, 0x51, 0xcf, 0x3b, 0x2d, 0x6e, 0x97, 0xe5, 0xb7, 0x43, 0x93, 0x4f, 0xd4, 0x34, 0x42, 0xf, 0x53, 0xc2, 0xa7, 0x40, 0xe4, 0xdd, 0xb9, 0xbd, 0x56, 0x78, 0x81, 0xa0, 0x70, 0x72, 0x2f, 0x3, 0x53, 0x53, 0xeb, 0x45, 0xa9, 0x86, 0x10, 0x98, 0xd3, 0x66, 0x99, 0x8e, 0x2f, 0x6c, 0x6b, 0x4b, 0x8b, 0x9b, 0x1b, 0xa3, 0x42, 0x6, 0x82, 0x9d, 0x50, 0xd1, 0x62, 0x9e, 0x67, 0x51, 0x16, 0xff, 0xf8, 0x90, 0x1c, 0x0, 0x20, 0x1, 0x4a, 0xe3, 0x36, 0x2e, 0x6, 0xc1, 0xa1, 0x50, 0x1a, 0xed, 0x24, 0xe0, 0x8c, 0xf5, 0xe8, 0x74, 0x26, 0xd7, 0x0, 0x13, 0xfa, 0x1d, 0xf, 0x3f, 0x18, 0x2d, 0x4a, 0x7b, 0x26, 0xdf, 0x80, 0x66, 0xb7, 0xb3, 0x35, 0x82, 0x9d, 0x97, 0xb5, 0x12, 0x93, 0x14, 0x61, 0x8a, 0xcb, 0xaf, 0x2f, 0x1d, 0xe5, 0xec, 0x48, 0x88, 0x96, 0xda, 0xeb, 0x73, 0x99, 0xe3, 0x13, 0xa4, 0x75, 0xc2, 0x96, 0xe9, 0x0, 0xf0, 0x5f, 0x49, 0xc7, 0xd7, 0xb7, 0x46, 0xd1, 0x95, 0xed, 0xba, 0x97, 0xd0, 0xe, 0xe6, 0xc0, 0xf9, 0x38, 0x6e, 0xac, 0x4, 0x88, 0xaa, 0xbb, 0xf9, 0xc6, 0x45, 0x6, 0xc, 0x99, 0x92, 0x51, 0x98, 0x91, 0xc0, 0x39, 0xa4, 0xe6, 0xca, 0xf2, 0xe1, 0xf5, 0x1b, 0x15, 0xff, 0x3d, 0x71, 0xdb, 0x8c, 0xb3, 0x2e, 0x30, 0x2c, 0x26, 0x5d, 0xdf, 0x31, 0xdf, 0x90, 0x51, 0x50, 0x3d, 0xb7, 0xe5, 0x2f, 0x5b, 0xe5, 0xc2, 0x32, 0xc8, 0x85, 0xfc, 0xde, 0x19, 0x91, 0x65, 0x21, 0x51, 0xf2, 0xe4, 0xf, 0xb0, 0x99, 0xbc, 0xe3, 0xfd, 0xfc, 0x17, 0x8b, 0x90, 0xd1, 0xe3, 0xf5, 0x67, 0x80, 0x42, 0xae, 0x43, 0x14, 0xb3, 0xf6, 0x21, 0xe9, 0x3b, 0x59, 0xea, 0x64, 0x92, 0xed, 0xcf, 0xa2, 0x35, 0x7a, 0xe0, 0x59, 0x62, 0xb9, 0x89, 0x15, 0xdd, 0x62, 0xa7, 0xd, 0xa, 0x39, 0xbb, 0xc6, 0x8c, 0x26, 0xd9, 0x32, 0x1c, 0x7b, 0x1e, 0x92, 0xd4, 0xfa, 0x76, 0x42, 0x96, 0x2b, 0xdb, 0x34, 0x30, 0xe7, 0x44, 0xcc, 0x34, 0x6d, 0xc5, 0xe, 0xb7, 0x45, 0x65, 0x9, 0x46, 0x3a, 0xbe, 0x59, 0x6a, 0x3a, 0xcf, 0x66, 0x97, 0xbc, 0xfd, 0xe9, 0x53, 0x9b, 0x4e, 0xd0, 0xed, 0x83, 0x2f, 0x7b, 0xe7, 0xe3, 0xba, 0x8f, 0xcc, 0xb3, 0x99, 0x6d, 0x40, 0x3a, 0xda, 0x7a, 0x6c, 0x64, 0xb5, 0x8e, 0xfb, 0x51, 0x12, 0x5a, 0x74, 0xd8, 0xf5, 0xa9, 0xc7, 0x25, 0x27, 0xc7, 0xa8, 0x47, 0x77, 0x96, 0x9e, 0xe8, 0xff, 0x31, 0xe5, 0x33, 0x5c, 0x19, 0x5e, 0x93, 0x64, 0xe9, 0xf, 0x21, 0x9d, 0x60, 0x27, 0x22, 0xe1, 0x2f, 0xa8, 0x6c, 0xfd, 0xca, 0x9d, 0x46, 0x26, 0x4, 0x96, 0x5b, 0x9b, 0xaf, 0x3c, 0x18, 0x93, 0x56, 0x4c, 0xe0, 0x9e, 0x2e, 0xef, 0x6f, 0x14, 0xc8, 0x33, 0xa3, 0x84, 0x10, 0xf7, 0xd1, 0xd1, 0xae, 0x33, 0x99, 0x64, 0x96, 0x90, 0x30, 0x56, 0x50, 0xf3, 0xaf, 0x6e, 0x56, 0xcf, 0x39, 0x2e, 0xad, 0xf0, 0x57, 0x50, 0x34, 0x24, 0x21, 0x83, 0x1f, 0x5b, 0xf6, 0x8f, 0x14, 0xd, 0xcf, 0x94, 0xcf, 0xd4, 0x89, 0x2e, 0x4, 0xb3, 0x58, 0xc, 0x52, 0x84, 0xec, 0x9b, 0x31, 0xd, 0xaa, 0x61, 0x53, 0x26, 0x76, 0x26, 0x2a, 0xad, 0x87, 0xbc, 0x8f, 0x2, 0xa3, 0x6f, 0xc8, 0x6f, 0x69, 0xc1, 0xad, 0xe1, 0xd7, 0x66, 0x6b, 0xd0, 0x72, 0xcd, 0xa, 0x93, 0xe5, 0xeb, 0x98, 0x35, 0x74, 0x1b, 0xcc, 0x50, 0x45, 0xf2, 0x65, 0xec, 0xa5, 0xb9, 0xb4, 0x93, 0x13, 0x23, 0xce, 0xf9, 0x7d, 0x6, 0xdb, 0xd4, 0x22, 0x4a, 0x23, 0x0, 0x9b, 0xff, 0xca, 0x95, 0xa0, 0xdd, 0x98, 0xc1, 0xc9, 0x0, 0x61, 0xa0, 0x75, 0xbc, 0x1b, 0x95, 0xf6, 0x9c, 0x93, 0xc8, 0xa9, 0x60, 0x15, 0x74, 0xbf, 0x51, 0xfe, 0x5e, 0x32, 0x50, 0x8, 0x94, 0x0, 0x46, 0x5e, 0x9e, 0x57, 0x4f, 0x9c, 0x25, 0x2f, 0xda, 0x76, 0x2a, 0xb9, 0x87, 0x5c, 0x33, 0xef, 0xeb, 0x6f, 0xe0, 0xe4, 0x9d, 0x88, 0xce, 0x83, 0x60, 0x64, 0x6, 0xec, 0x0, 0x69, 0x73, 0x27, 0xe1, 0xbf, 0x35, 0x3, 0x2a, 0xbe, 0x10, 0x41, 0x34, 0xc5, 0x35, 0xda, 0xd1, 0xad, 0x20, 0xcd, 0x2, 0xb8, 0xb7, 0x68, 0x75, 0x75, 0xca, 0x67, 0xc3, 0xf1, 0x1c, 0xf, 0x5, 0xe4, 0x7d, 0xbc, 0xf, 0xc9, 0x9b, 0x5a, 0xc8, 0x9b, 0x32, 0x10, 0xa1, 0xe1, 0xa2, 0xc4, 0x73, 0xa3, 0xa9, 0x93, 0x3, 0xad, 0xb7, 0x32, 0x42, 0xb6, 0x29, 0xad, 0x7d, 0x16, 0xb0, 0x7e, 0x57, 0xf5, 0xb2, 0x8a, 0xb7, 0x94, 0x1, 0xf3, 0x4, 0x16, 0x8b, 0x34, 0x29, 0xe8, 0xaf, 0x94, 0xaa, 0xb, 0x42, 0x43, 0x65, 0x41, 0xdd, 0xd8, 0xfb, 0x77, 0x2e, 0xcd, 0xa7, 0x94, 0xb4, 0x51, 0xf6, 0x6f, 0x6c, 0x33, 0x99, 0x6, 0xd1, 0xff, 0x71, 0x56, 0x6a, 0x89, 0x9a, 0x97, 0xcc, 0xd2, 0x5f, 0x6f, 0xef, 0x8c, 0x14, 0xd8, 0xa8, 0x93, 0xe8, 0x11, 0x10, 0x7b, 0xcf, 0x65, 0xa1, 0x6, 0x89, 0x98, 0x85, 0x84, 0xd, 0xc5, 0x78, 0x71, 0xb6, 0x81, 0xde, 0xb3, 0x35, 0x8a, 0x35, 0xeb, 0xd, 0x7c, 0x99, 0x97, 0xd2, 0xc1, 0x55, 0xc8, 0x3a, 0x42, 0x8, 0x87, 0x61, 0x9, 0xe1, 0x69, 0x9f, 0x71, 0xb1, 0xf9, 0x83, 0xc1, 0x64, 0x83, 0x9e, 0xcc, 0xaf, 0x21, 0x6a, 0x36, 0x95, 0x3a, 0x20, 0xec, 0x1f, 0x14, 0x8b, 0x6, 0x6d, 0x5d, 0xec, 0x6a, 0xe9, 0x4, 0x4f, 0x99, 0x8a, 0xf7, 0x2d, 0xee, 0xb0, 0x45, 0x12, 0x27, 0xe8, 0xca, 0x9c, 0xb3, 0x4f, 0x3f, 0xe4, 0x97, 0xa9, 0xa4, 0x75, 0xb8, 0x98, 0xea, 0x2c, 0xdb, 0x11, 0xfe, 0x7d, 0x50, 0x3d, 0x12, 0x32, 0x52, 0xea, 0x7a, 0x4b, 0x31, 0xdb, 0x86, 0xae, 0x65, 0x8c, 0x7c, 0x30, 0x8, 0xed, 0x68, 0x46, 0xaa, 0x5c, 0x16, 0xe7, 0x6, 0x39, 0xec, 0xd3, 0xb4, 0x8b, 0x45, 0x70, 0xb1, 0x86, 0xb9, 0x9b, 0xc1, 0xc6, 0x3e, 0x2e, 0x4d, 0xed, 0x4, 0x3, 0xae, 0x46, 0x48, 0xf3, 0xc5, 0x22, 0x97, 0x9f, 0x6c, 0xa0, 0x95, 0x76, 0x91, 0xa, 0x1c, 0xab, 0x4c, 0x17, 0x73, 0x7f, 0x6c, 0xfd, 0xa7, 0xf0, 0xfc, 0x2, 0x48, 0xf1, 0x31, 0x1e, 0xb0, 0x88, 0x54, 0x89, 0x7, 0xfd, 0x42, 0x98, 0xb4, 0x52, 0x99, 0x6d, 0x8d, 0xd7, 0x71, 0x1, 0x52, 0xac, 0x7, 0xd9, 0x72, 0xb5, 0x8e, 0x88, 0x4a, 0x19, 0x4d, 0x4c, 0xa4, 0xa2, 0xe0, 0x66, 0x7e, 0x1, 0xba, 0xd9, 0x3f, 0xb6, 0xd2, 0xfc, 0xae, 0x88, 0xf8, 0xc8, 0xc6, 0xef, 0x78, 0x11, 0x1a, 0x88, 0x4a, 0xda, 0x6b, 0x6f, 0xb7, 0x38, 0x72, 0xa6, 0xb2, 0x1, 0xe1, 0xb, 0xbf, 0xf2, 0x14, 0x9c, 0xaf, 0x67, 0xd3, 0x56, 0x35, 0x75, 0x20, 0x66, 0xa5, 0x31, 0x78, 0x4b, 0x10, 0xa, 0xe6, 0xd9, 0x79, 0xbb, 0x59, 0xca, 0x58, 0x3b, 0xa7, 0x69, 0xa5, 0x92, 0x53, 0xc4, 0x4b, 0xc9, 0xf6, 0x98, 0x56, 0xe8, 0x52, 0x7a, 0x51, 0x55, 0xd7, 0xad, 0xae, 0xa5, 0x3d, 0x64, 0x85, 0x84, 0x1b, 0x58, 0x2a, 0xd5, 0xc, 0xed, 0x1a, 0x67, 0xe9, 0xf9, 0x19, 0xbc, 0x26, 0xf7, 0xa0, 0x4e, 0xbf, 0xfb, 0xe8, 0x52, 0x31, 0xd0, 0xd9, 0x40, 0x7d, 0x70, 0xb7, 0x1d, 0xf5, 0xd6, 0xcf, 0xe0, 0xe6, 0xf6, 0x63, 0xd9, 0x84, 0x30, 0x63, 0xaf, 0x7e, 0x66, 0x55, 0xdc, 0x9c, 0xcd, 0xed, 0x6f, 0xd5, 0x44, 0x2e, 0x2b, 0xf9, 0xb7, 0x73, 0x14, 0x2b, 0x96, 0x4e, 0xb6, 0x39, 0x2e, 0xfb, 0xbf, 0xfc, 0x71, 0xf6, 0x6e, 0x8f, 0x40, 0x7d, 0x8a, 0xcf, 0xdf, 0xf8, 0x75, 0x30, 0xea, 0x9e, 0x25, 0x98, 0x66, 0x95, 0xaa, 0xf0, 0x84, 0xa2, 0xd8, 0x3f, 0x7d, 0x86, 0x50, 0xa2, 0xfc, 0xb3, 0x1e, 0x69, 0x9d, 0x26, 0x5f, 0x7b, 0x75, 0x20, 0xde, 0xa5, 0xb8, 0x93, 0x20, 0x40, 0xc2, 0xf2, 0xa6, 0x6d, 0xc0, 0xeb, 0x59, 0x33, 0xf9, 0xd3, 0x33, 0x9c, 0x73, 0xb2, 0x3e, 0x29, 0x78, 0x11, 0xe5, 0x86, 0xd6, 0xbc, 0x70, 0xe7, 0xa3, 0xd2, 0xee, 0x43, 0xaf, 0x68, 0x2c, 0x93, 0xf7, 0xa2, 0xbd, 0x0, 0x3d, 0x70, 0x8e, 0x46, 0x2, 0x55, 0xf5, 0x61, 0xb0, 0x2f, 0x8f, 0x97, 0xdc, 0xe5, 0xad, 0x15, 0xc8, 0x28, 0x4a, 0x90, 0xa1, 0xc9, 0xa4, 0x56, 0xc, 0x47, 0x8d, 0x53, 0xaf, 0xd3, 0xed, 0x8c, 0x3d, 0x19, 0x5f, 0xbc, 0x9a, 0x15, 0xf3, 0x8e, 0x10, 0x20, 0x5f, 0x24, 0x37, 0x2a, 0x78, 0x71, 0x3f, 0x22, 0x1e, 0x8, 0x17, 0xfa, 0x3a, 0xa7, 0xf2, 0xec, 0x8d, 0x6e, 0x20, 0x2a, 0x94, 0x19, 0x55, 0x8e, 0x97, 0x63, 0x6a, 0x6, 0xa2, 0x53, 0x8d, 0xb9, 0x8a, 0x8, 0x6a, 0x3a, 0xaa, 0x24, 0x11, 0x2d, 0x7c, 0xc6, 0xe7, 0xc, 0x3c, 0x11, 0x9a, 0x75, 0x71, 0xc6, 0xce, 0x48, 0xfa, 0x67, 0x6f, 0x4f, 0xd3, 0x73, 0xb3, 0xe3, 0x7b, 0x72, 0x36, 0xfd, 0x79, 0xd4, 0x55, 0x54, 0x81, 0xd, 0x3c, 0xa1, 0xee, 0x28, 0xa4, 0xe5, 0x5e, 0xbd, 0xb1, 0x16, 0x5f, 0xea, 0xfe, 0x6b, 0xd3, 0xa, 0xe3, 0x4d, 0x20, 0xe4, 0x57, 0xf9, 0x9e, 0x3b, 0x35, 0x6a, 0x4e, 0x66, 0xaf, 0xcb, 0xeb, 0x4f, 0xd1, 0x26, 0x12, 0x33, 0x87, 0x5c, 0xcb, 0x57, 0x5f, 0xb6, 0x8c, 0xf9, 0x87, 0x4e, 0x41, 0xdd, 0xc, 0x5e, 0x21, 0xa6, 0x60, 0xdb, 0x40, 0x14, 0x88, 0xa6, 0x65, 0x68, 0xc1, 0x67, 0xaa, 0x52, 0xab, 0x46, 0x1a, 0xef, 0x93, 0x10, 0x64, 0xec, 0x2e, 0xbb, 0xba, 0xcb, 0xbc, 0x93, 0xbe, 0xad, 0x3, 0xda, 0x64, 0x3b, 0xc2, 0xa0, 0xc4, 0x6a, 0xe8, 0xe0, 0xa, 0xa0, 0x7a, 0x5f, 0xe6, 0x1, 0x14, 0xfc, 0x1e, 0x94, 0xb, 0x47, 0x74, 0x35, 0xf4, 0x9d, 0x79, 0xd6, 0xd8, 0x5a, 0x10, 0xd8, 0x65, 0xf, 0xa9, 0xb8, 0xcf, 0x4c, 0x81, 0xbd, 0x7f, 0xaa, 0xe3, 0x80, 0xce, 0x1b, 0xa, 0xd2, 0x8, 0x95, 0xad, 0x91, 0x32, 0x27, 0x7c, 0xb6, 0xb4, 0xb4, 0xb2, 0xa9, 0xe2, 0x1f, 0x4, 0x6, 0x2, 0xe8, 0xf0, 0xd, 0xd1, 0xc1, 0xd8, 0x58, 0x80, 0xbc, 0xfc, 0xab, 0x64, 0x9d, 0xbb, 0xf, 0x2a, 0x71, 0xb2, 0xb9, 0x43, 0x89, 0x4, 0xef, 0x3d, 0x3b, 0x14, 0xd9, 0xee, 0x90, 0xff, 0x75, 0xe7, 0x4c, 0xa2, 0x3a, 0xab, 0x85, 0x40, 0x90, 0xbc, 0x7b, 0xca, 0xd4, 0x5f, 0x60, 0xfb, 0x5d, 0xc7, 0xe2, 0x64, 0xa5, 0x34, 0x8b, 0xf, 0x36, 0x82, 0xe3, 0x7c, 0x9f, 0x75, 0x25, 0x57, 0x58, 0xbf, 0x88, 0xc9, 0x5, 0xdb, 0xb6, 0x6c, 0xd4, 0x58, 0x6c, 0x1d, 0xd6, 0x17, 0x29, 0x7a, 0xcb, 0x20, 0xfd, 0x91, 0xe4, 0xf8, 0x14, 0x40, 0x3, 0xc2, 0x11, 0x7a, 0x72, 0x8a, 0xb6, 0xb6, 0xcb, 0x7c, 0xaf, 0x6f, 0xf8, 0x86, 0x3, 0x20, 0x9a, 0xe0, 0xfe, 0xcc, 0xc6, 0x8b, 0x5c, 0x35, 0xea, 0x7e, 0xbb, 0x4a, 0xff, 0x76, 0x7d, 0x88, 0x52, 0x8a, 0xaa, 0xaa, 0xca, 0xab, 0x4d, 0xc9, 0xa1, 0x23, 0xaf, 0x8a, 0xc, 0xcc, 0x91, 0xc, 0xe, 0x22, 0x3f, 0x6a, 0x2c, 0xc7, 0x34, 0x4a, 0x14, 0x32, 0x12, 0xdf, 0xb, 0xc2, 0xbc, 0x1b, 0xde, 0xe, 0xa2, 0xda, 0x42, 0x2f, 0x6e, 0x15, 0x5, 0xa0, 0x74, 0xc, 0xf0, 0x41, 0xc4, 0x4b, 0x8c, 0x4b, 0x73, 0xb6, 0xa5, 0x46, 0xbf, 0xa4, 0xc9, 0x56, 0x7b, 0x3, 0x95, 0x40, 0x57, 0x1b, 0x57, 0xf3, 0x3f, 0xa5, 0x36, 0x68, 0xb4, 0xc1, 0x27, 0x79, 0x83, 0x78, 0x8b, 0xf9, 0x24, 0x16, 0xc7, 0x33, 0x45, 0x6a, 0x25, 0x54, 0x62, 0x96, 0xe1, 0x7e, 0xd0, 0xb, 0xbb, 0x7a, 0xf2, 0xfd, 0x5b, 0x6d, 0x5c, 0xfc, 0x64, 0xcf, 0xd7, 0x77, 0x7a, 0xcd, 0xf0, 0x51, 0xc7, 0x15, 0x69, 0x34, 0xf5, 0x98, 0x87, 0x12, 0x90, 0xf5, 0xd9, 0x5f, 0x8b, 0x1d, 0xf8, 0xa8, 0xd, 0x2b, 0x77, 0x90, 0x7d, 0x2f, 0x8e, 0xf8, 0xac, 0x18, 0x5c, 0xcd, 0x32, 0xbe, 0x77, 0xd7, 0x33, 0xbf, 0xfd, 0xe9, 0x5e, 0xeb, 0xd2, 0xd7, 0x5c, 0x8, 0xa, 0x15, 0x11, 0x20, 0xb3, 0xfb, 0x2c, 0x70, 0x2d, 0xe8, 0x8c, 0xc8, 0x85, 0xdb, 0xeb, 0xe0, 0xb6, 0x17, 0xd6, 0x1, 0x1e, 0x3c, 0xce, 0xa3, 0x23, 0xac, 0x33, 0x73, 0x56, 0x8e, 0x61, 0x41, 0x30, 0x6b, 0xdb, 0x7e, 0x15, 0x8f, 0xfd, 0xd0, 0x9d, 0xb0, 0xd1, 0x7, 0xce, 0x73, 0xda, 0x6b, 0x38, 0x78, 0x41, 0xad, 0x58, 0xc2, 0x10, 0x29, 0xd8, 0xf4, 0x17, 0x26, 0xcd, 0xcf, 0x82, 0x4f, 0x12, 0x70, 0x17, 0x69, 0xef, 0x8d, 0x5e, 0x2f, 0xcc, 0xcc, 0xc, 0xc3, 0xb8, 0x50, 0x25, 0x70, 0x82, 0x5a, 0x57, 0x8e, 0x1a, 0xea, 0x6a, 0x85, 0x7b, 0x59, 0x94, 0xab, 0xb1, 0xef, 0x2f, 0x82, 0xbb, 0x8e, 0xe3, 0x24, 0xec, 0xbc, 0x28, 0x59, 0x8, 0x71, 0x88, 0xb9, 0x8f, 0x11, 0x3d, 0x46, 0x80, 0xff, 0x6a, 0xc7, 0xbb, 0xc3, 0xf5, 0x26, 0xcb, 0x14, 0x36, 0xe0, 0xfb, 0xdd, 0x8e, 0xab, 0xd4, 0xee, 0x2d, 0xcf, 0xc0, 0x9b, 0x57, 0xeb, 0xc8, 0x41, 0xae, 0x3b, 0xc9, 0x15, 0x4c, 0x0, 0xcc, 0xb2, 0xa3, 0xec, 0x3a, 0x5d, 0xae, 0xfb, 0x46, 0xb1, 0x9a, 0x1e, 0xf, 0xcf, 0x35, 0x12, 0x67, 0xc1, 0x85, 0xc2, 0x9e, 0x34, 0xa9, 0xfb, 0xad, 0x77, 0x64, 0x7c, 0xb5, 0x6b, 0x93, 0x6c, 0xa3, 0xc6, 0xbc, 0x4d, 0xe9, 0x64, 0x8b, 0x1f, 0x87, 0x7b, 0xa6, 0x91, 0xa5, 0x62, 0xfb, 0xd0, 0x28, 0xf5, 0x26, 0xd9, 0xc1, 0x81, 0xe0, 0x40, 0x9d, 0x5a, 0x4b, 0xd8, 0xf2, 0xf6, 0xea, 0x11, 0x31, 0x44, 0xb6, 0x65, 0xa5, 0xf9, 0x93, 0x89, 0x22, 0x8b, 0x18, 0x83, 0x2c, 0x92, 0xf5, 0xcb, 0xc, 0x97, 0xe1, 0xf3, 0x3d, 0xab, 0x30, 0x7b, 0xf8, 0xaa, 0x7a, 0xfa, 0x98, 0x7, 0x61, 0xb2, 0xb2, 0x4e, 0xaa, 0x73, 0xf0, 0xe4, 0x9e, 0x20, 0x41, 0x9b, 0xb1, 0xd6, 0xf2, 0x59, 0x3, 0x57, 0xf1, 0xaf, 0x7c, 0x57, 0xfc, 0x8c, 0x86, 0xe6, 0xcb, 0xd3, 0x4d, 0xc0, 0x32, 0xdc, 0x4b, 0x6c, 0x18, 0x97, 0xe3, 0xee, 0xcf, 0xae, 0x5f, 0xc3, 0xa6, 0xcf, 0xc0, 0x86, 0xf0, 0x12, 0xb3, 0xa1, 0xb4, 0xe2, 0x1f, 0x46, 0xd9, 0xc6, 0xcc, 0xa5, 0xe0, 0xd3, 0xe5, 0xaa, 0xa7, 0x79, 0x26, 0x4e, 0xd2, 0xc4, 0xc1, 0xe5, 0xd, 0x3d, 0x1, 0x76, 0x70, 0x29, 0xb6, 0x5, 0xbb, 0xba, 0xf8, 0x50, 0x2d, 0xbb, 0xef, 0x66, 0x6e, 0xe2, 0xab, 0xc1, 0x73, 0xf7, 0x8a, 0x48, 0xf2, 0x22, 0xb4, 0xd4, 0xef, 0x75, 0xa5, 0x3b, 0x66, 0x2, 0x5d, 0x10, 0xe4, 0x57, 0x94, 0xa6, 0x53, 0x8b, 0xa, 0xb6, 0x7e, 0x3b, 0x97, 0x45, 0xc9, 0x8, 0x0, 0x21, 0x62, 0xfb, 0xab, 0x66, 0x4b, 0x86, 0x32, 0x8e, 0x1d, 0x0, 0x9, 0x3, 0x59, 0xe5, 0x52, 0x6f, 0xd2, 0x1a, 0x94, 0x84, 0x55, 0x43, 0xf6, 0xe3, 0x1e, 0x58, 0x59, 0x9f, 0x56, 0x30, 0x37, 0x3b, 0x6d, 0xa5, 0xdb, 0x89, 0x47, 0x2f, 0xa6, 0xf2, 0x9f, 0xb7, 0xc9, 0xb5, 0x72, 0x15, 0xb8, 0xfc, 0x91, 0xe, 0x9a, 0x8f, 0x6c, 0x7d, 0xcb, 0x46, 0xf4, 0xb5, 0xec, 0xb7, 0x39, 0xc1, 0x25, 0xf6, 0x48, 0x12, 0x81, 0x44, 0x30, 0x77, 0x14, 0x7c, 0x7b, 0x56, 0x86, 0xa3, 0xe4, 0xf1, 0x1a, 0xb5, 0x82, 0x10, 0x50, 0x31, 0x2f, 0x8a, 0x2, 0xf2, 0x2b, 0xd4, 0x8c, 0xa8, 0x6e, 0x1f, 0xa0, 0xa4, 0xc9, 0x18, 0x58, 0x7e, 0x25, 0xd8, 0x95, 0x3e, 0xf6, 0x16, 0x9b, 0x51, 0xb4, 0x10, 0xfa, 0x8e, 0xdd, 0xbf, 0x10, 0xa9, 0xd, 0xe0, 0x73, 0x89, 0xed, 0xa9, 0xe4, 0xf, 0x5c, 0x77, 0xd0, 0x49, 0xed, 0xc, 0x11, 0xa6, 0x6f, 0xa3, 0xf3, 0x6f, 0x51, 0x1f, 0x56, 0x93, 0xfb, 0xb1, 0x1e, 0xfb, 0x74, 0x2b, 0x52, 0x57, 0x84, 0x47, 0x90, 0xc, 0x6c, 0xc6, 0xbd, 0xb8, 0x6b, 0x4, 0x21, 0xd3, 0xcf, 0x57, 0xad, 0x80, 0xcc, 0xa2, 0x84, 0x68, 0x2d, 0x37, 0xb6, 0xa9, 0x86, 0x35, 0xfc, 0x27, 0x7c, 0xcd, 0xe8, 0xf4, 0xad, 0xed, 0xba, 0x61, 0x34, 0xf0, 0x42, 0x72, 0x61, 0x1a, 0x25, 0x56, 0x1d, 0x94, 0xe0, 0x95, 0xa9, 0xd1, 0x46, 0x99, 0x71, 0xd8, 0x4, 0x1e, 0xe5, 0xf6, 0x48, 0xe8, 0x65, 0x13, 0x31, 0x1e, 0x6a, 0x0, 0x33, 0x2f, 0xe6, 0x3, 0xe5, 0x1d, 0x50, 0xc1, 0xc7, 0x41, 0x15, 0xde, 0xfa, 0xac, 0xf4, 0xfa, 0xc9, 0xaa, 0x4d, 0x71, 0xb, 0xcd, 0x44, 0x97, 0x58, 0x58, 0xe, 0x77, 0xcd, 0x51, 0xa, 0x69, 0xd8, 0x4f, 0x54, 0x6d, 0x1, 0x31, 0x0, 0xed, 0x20, 0xfc, 0x60, 0x44, 0x44, 0xdb, 0x64, 0xaf, 0x12, 0xe7, 0x3f, 0x80, 0xd4, 0xcd, 0xbe, 0x34, 0xd6, 0xe9, 0x19, 0x8a, 0x97, 0x30, 0xa9, 0x47, 0xc0, 0x8b, 0xe0, 0x33, 0x7, 0x28, 0xa1, 0xec, 0x24, 0xbf, 0x2d, 0xb2, 0x6, 0xd7, 0x2c, 0x8c, 0xe3, 0xa, 0x3c, 0xb9, 0x17, 0x90, 0x35, 0x5b, 0x2a, 0x1, 0x5b, 0xae, 0xf5, 0xe0, 0x72, 0x8c, 0xc3, 0x43, 0x39, 0xa3, 0x6f, 0x17, 0x57, 0xea, 0x67, 0x61, 0x78, 0xb1, 0x49, 0xea, 0xab, 0xb7, 0x9f, 0x97, 0xfa, 0xc5, 0xc6, 0xe2, 0x10, 0x7d, 0xd2, 0xb1, 0xb4, 0x7a, 0xde, 0xaf, 0x23, 0xc4, 0xc2, 0x61, 0xbd, 0x58, 0xd3, 0x86, 0x97, 0xf8, 0x14, 0x66, 0xeb, 0x59, 0x74, 0x6f, 0x7f, 0x6b, 0x81, 0x5d, 0x4a, 0x7b, 0xe, 0x36, 0x9, 0x4f, 0xa4, 0x31, 0xe4, 0x4c, 0x91, 0x9, 0xc3, 0x32, 0xa0, 0x27, 0x8c, 0xd8, 0xe3, 0xed, 0xca, 0x8a, 0xd6, 0xa5, 0xce, 0xe, 0xd8, 0x1d, 0x43, 0xa9, 0x11, 0x40, 0xb8, 0xd9, 0x6c, 0x30, 0x73, 0xca, 0x7c, 0x7c, 0xeb, 0x30, 0xb7, 0xb3, 0xd1, 0x29, 0xdd, 0xfa, 0x20, 0xd3, 0xb3, 0x37, 0xfe, 0x5b, 0x8b, 0x85, 0x83, 0x5c, 0x1d, 0x25, 0xb6, 0x93, 0xd1, 0x4c, 0xbf, 0x52, 0xd9, 0x52, 0x13, 0xd3, 0x1f, 0xca, 0x1c, 0x51, 0xc0, 0xfb, 0x90, 0xa4, 0x57, 0x61, 0xc6, 0x36, 0x86, 0xb9, 0x89, 0x38, 0xa6, 0x90, 0x79, 0xe1, 0xc0, 0xde, 0x87, 0x2a, 0x69, 0xaa, 0xe5, 0x0, 0x9d, 0xb3, 0xf7, 0x8d, 0xed, 0xd, 0x1, 0xb5, 0xa0, 0xcf, 0x54, 0xc8, 0x80, 0x1b, 0x7b, 0x28, 0xea, 0xf8, 0xa0, 0x76, 0xb8, 0xbe, 0x66, 0xe, 0xcd, 0x76, 0x34, 0x31, 0xf5, 0xd7, 0x50, 0x49, 0x39, 0x8d, 0xb0, 0x65, 0xe, 0x3d, 0xa6, 0xc6, 0x9f, 0x47, 0x53, 0xa9, 0xee, 0x9, 0x1a, 0x42, 0xe7, 0x99, 0xf4, 0x91, 0x98, 0xae, 0x82, 0x66, 0xd8, 0xa7, 0x5c, 0x10, 0xb9, 0x58, 0xab, 0x34, 0x3b, 0xdb, 0x3a, 0xe2, 0x67, 0x29, 0x58, 0xbc, 0xc0, 0xea, 0xcc, 0x47, 0x44, 0xae, 0x89, 0xf5, 0x6a, 0xf5, 0x7b, 0x7c, 0x66, 0x9c, 0x91, 0xd7, 0xdc, 0xf5, 0x60, 0xb1, 0x17, 0xec, 0x9a, 0xbc, 0xad, 0xca, 0xdd, 0x9f, 0x7b, 0x69, 0xec, 0xf5, 0x67, 0x34, 0x46, 0x41, 0xf3, 0x98, 0xb, 0x2f, 0x13, 0x67, 0xa9, 0xf7, 0xf1, 0x87, 0xb1, 0x18, 0xeb, 0x4a, 0x21, 0x1d, 0x7a, 0xfe, 0x90, 0xf7, 0x32, 0x14, 0x74, 0x3c, 0xaf, 0x6, 0x15, 0xc4, 0xa0, 0x91, 0xe5, 0xf9, 0x65, 0x55, 0xbb, 0xc3, 0x1b, 0x4f, 0xb4, 0x77, 0x1a, 0xd4, 0x10, 0x96, 0xde, 0x4b, 0xa8, 0xe4, 0x65, 0x9d, 0xa0, 0x1c, 0x6a, 0xa, 0xf2, 0xd8, 0x60, 0xf0, 0x42, 0xe7, 0x9c, 0x7f, 0xf2, 0xfd, 0x3b, 0x2a, 0x65, 0x9f, 0x73, 0x3d, 0x3b, 0x5c, 0xb6, 0xbd, 0xb6, 0x9f, 0xae, 0x7f, 0xec, 0xb6, 0xdc, 0x5d, 0xeb, 0x5a, 0x6e, 0xb6, 0xef, 0x14, 0x27, 0x5f, 0x99, 0x52, 0x5d, 0x44, 0x69, 0x8e, 0x5d, 0xe9, 0xde, 0x20, 0x76, 0xe2, 0x9, 0x46, 0x2d, 0x6c, 0x1b, 0x16, 0xd7, 0x29, 0x81, 0x31, 0x1c, 0x62, 0x32, 0xaa, 0xc1, 0x58, 0x9, 0xf1, 0x9, 0x39, 0xb0, 0x63, 0xaf, 0xf4, 0x1a, 0xf9, 0x8e, 0x46, 0x8c, 0xf6, 0xcd, 0xa5, 0xfb, 0x9f, 0x42, 0x2c, 0x16, 0x71, 0x93, 0x3b, 0x75, 0x43, 0x23, 0x68, 0x2f, 0xd7, 0x9c, 0x1f, 0x5f, 0x5a, 0xb4, 0xca, 0x29, 0x96, 0xdb, 0x45, 0xb2, 0xab, 0x23, 0x16, 0x57, 0x99, 0x99, 0xd7, 0x3f, 0x9, 0xdb, 0x7, 0xc5, 0x32, 0x6c, 0x3, 0xaf, 0x52, 0xf6, 0x2e, 0x4e, 0x5c, 0x8e, 0x1, 0x5, 0x78, 0xcc, 0xf0, 0x86, 0x50, 0xe3, 0x8b, 0xab, 0xd4, 0x73, 0xa, 0xc1, 0x27, 0x63, 0x82, 0x7e, 0x97, 0xb3, 0x19, 0x65, 0xf7, 0x3d, 0x5, 0x9c, 0xef, 0x5e, 0xcb, 0xe8, 0x6f, 0xea, 0x0, 0xb3, 0x37, 0x5b, 0xe2, 0x8d, 0xfb, 0xcf, 0x49, 0xc8, 0x92, 0xfa, 0x3, 0xdb, 0xbb, 0x69, 0x41, 0xe8, 0xa7, 0x43, 0x2e, 0x24, 0x8e, 0x95, 0x6f, 0xdd, 0xf4, 0x51, 0xfa, 0xe4, 0x8d, 0x5a, 0x44, 0xf4, 0x7f, 0xa7, 0x25, 0x69, 0x49, 0x89, 0xd, 0xe9, 0x50, 0x2a, 0xe7, 0xe6, 0x90, 0x63, 0x1f, 0x2b, 0xe3, 0x48, 0x66, 0xc6, 0xc, 0x46, 0x3e, 0x17, 0x57, 0x19, 0xab, 0xb2, 0x90, 0x45, 0x70, 0x30, 0x75, 0xce, 0xbb, 0x1b, 0x62, 0x71, 0x1c, 0xdb, 0xbd, 0xd, 0xa9, 0xc0, 0x5d, 0xd6, 0xcd, 0x15, 0x9e, 0x39, 0x5e, 0x50, 0xb7, 0x7a, 0x79, 0x57, 0xcb, 0x4d, 0x43, 0x68, 0xe8, 0xa8, 0x2c, 0x6a, 0xba, 0x35, 0xad, 0x60, 0xc1, 0x36, 0x33, 0xde, 0xe0, 0xb1, 0xfd, 0x4b, 0x15, 0x90, 0xb3, 0xd8, 0xeb, 0x99, 0xef, 0xbb, 0xec, 0xeb, 0x11, 0x17, 0xf3, 0x96, 0x3b, 0x6c, 0xc4, 0xfd, 0x98, 0xce, 0x1f, 0xf, 0xa4, 0x2d, 0x1f, 0x41, 0xb4, 0x57, 0xd3, 0x74, 0x97, 0xb9, 0xb6, 0x5b, 0xb6, 0x15, 0xf4, 0xbd, 0xc8, 0x87, 0x2d, 0xf1, 0xee, 0xc2, 0xe3, 0x89, 0x3a, 0xda, 0xf3, 0x71, 0x74, 0x3c, 0x9b, 0xbb, 0x95, 0xde, 0x94, 0xc5, 0x12, 0xd8, 0x5b, 0x22, 0xf, 0x60, 0x6b, 0xa5, 0x75, 0x2b, 0x5d, 0x7c, 0x90, 0x54, 0x35, 0xe, 0xb6, 0x8d, 0xf0, 0xc5, 0x3c, 0xa9, 0x19, 0x33, 0x83, 0xfa, 0xd6, 0x3c, 0x3e, 0x74, 0xc9, 0x83, 0x16, 0xf8, 0x41, 0x5c, 0xad, 0x7d, 0x7e, 0x10, 0x34, 0x9c, 0xd9, 0xe7, 0xc1, 0x70, 0x7, 0x9, 0xbe, 0xa6, 0x39, 0x4a, 0xdc, 0xe, 0xd3, 0xb7, 0xd0, 0x86, 0x35, 0x70, 0xd4, 0x36, 0x60, 0xfa, 0x2b, 0x27, 0x3, 0xda, 0x76, 0x8c, 0x14, 0xa4, 0x8, 0xf, 0xea, 0x7, 0x4a, 0xb, 0x53, 0xdd, 0xc1, 0x45, 0x29, 0x4d, 0x9e, 0x69, 0xb5, 0xeb, 0x1d, 0x23, 0x98, 0x58, 0xdc, 0xca, 0xe0, 0x0, 0x7f, 0xa7, 0xc7, 0xfc, 0x49, 0xdf, 0xe, 0x5a, 0x3e, 0xa7, 0xbf, 0x7b, 0x5, 0x93, 0xd1, 0x4c, 0x7a, 0x2, 0xcd, 0x7e, 0x8b, 0x2f, 0x1a, 0x1, 0x14, 0xc6, 0xb3, 0x34, 0x47, 0x11, 0x68, 0x7c, 0x67, 0x67, 0xb7, 0x1d, 0xa0, 0xe7, 0x4f, 0x3f, 0x27, 0x7e, 0x5e, 0xbe, 0xd9, 0x89, 0xef, 0x8, 0x98, 0x8, 0x2e, 0xcb, 0x25, 0xd2, 0x7, 0x41, 0x9e, 0xd5, 0x7d, 0xa2, 0xf7, 0xf1, 0xc9, 0xb9, 0x11, 0x82, 0x61, 0xc7, 0xaf, 0x53, 0x59, 0x91, 0x81, 0xe6, 0x67, 0xbc, 0x61, 0x3, 0x26, 0x14, 0x7, 0x7f, 0xb, 0x5d, 0x86, 0x2a, 0x67, 0x25, 0x7, 0xe7, 0x10, 0x18, 0x3c, 0x6a, 0xbd, 0xca, 0x6b, 0xd, 0x1e, 0xca, 0x3b, 0x3e, 0xbc, 0x91, 0x85, 0x40, 0xc1, 0x2b, 0xb0, 0xa1, 0x39, 0xa2, 0xfb, 0x31, 0x59, 0xee, 0xde, 0xe0, 0xd1, 0x91, 0xbd, 0x98, 0xd3, 0x24, 0x74, 0xf4, 0x1d, 0x3c, 0x1a, 0x7, 0xf4, 0x86, 0x88, 0xf, 0x3b, 0x23, 0x19, 0xa8, 0xe8, 0x41, 0x7d, 0x3f, 0x98, 0xb9, 0x6e, 0xcf, 0xc2, 0x23, 0x86, 0x70, 0x7f, 0x28, 0x9a, 0x60, 0xaf, 0x49, 0xbb, 0x86, 0x62, 0x7, 0xc9, 0x63, 0x49, 0xb2, 0x2b, 0x94, 0x4b, 0x65, 0xa9, 0x55, 0xa5, 0xee, 0xf6, 0xe, 0xfe, 0xde, 0xf5, 0x36, 0x72, 0x2d, 0x6d, 0x5f, 0x76, 0x91, 0xf9, 0x56, 0xdc, 0x22, 0x99, 0xfa, 0xc7, 0xe0, 0x8c, 0xf7, 0xce, 0x5e, 0x8c, 0x6c, 0x5e, 0xb5, 0x9, 0xbe, 0x9d, 0x58, 0x44, 0x7b, 0x70, 0x37, 0xa8, 0x9e, 0xca, 0x3b, 0x1b, 0xe1, 0x47, 0x15, 0xb7, 0x2a, 0x7f, 0x2c, 0xfa, 0xd7, 0xc0, 0xdc, 0x1d, 0x2a, 0xfa, 0xd6, 0x3d, 0x2a, 0x7, 0x77, 0x7b, 0x5a, 0x30, 0xb4, 0xac, 0x9, 0x57, 0x4e, 0x9d, 0x64, 0x2e, 0x4a, 0xdd, 0x4a, 0x6e, 0x52, 0x17, 0x19, 0xb0, 0xa2, 0x53, 0xcd, 0xc4, 0x4a, 0xb4, 0x20, 0x30, 0x23, 0x26, 0xc5, 0x1d, 0xc3, 0xa2, 0xba, 0x6a, 0x74, 0x28, 0x40, 0x4c, 0x1d, 0x29, 0x64, 0x90, 0x83, 0x31, 0x51, 0x9, 0xd9, 0x5a, 0xee, 0x51, 0xf1, 0x48, 0xbf, 0x81, 0x56, 0x18, 0x7b, 0x59, 0x7f, 0xe5, 0xcc, 0x42, 0xd4, 0x54, 0x48, 0xb0, 0xc1, 0x3a, 0x7c, 0x71, 0xc1, 0x93, 0xc0, 0xc3, 0x7d, 0x58, 0x65, 0x65, 0x2b, 0xf4, 0x24, 0x24, 0xcb, 0x7a, 0xae, 0xcb, 0x96, 0x59, 0x95, 0xdb, 0x8a, 0x33, 0x5a, 0x1b, 0xf9, 0x51, 0x60, 0x75, 0x56, 0xe6, 0xc8, 0xb1, 0xd0, 0xb8, 0x28, 0xba, 0x1f, 0x71, 0x66, 0x90, 0xa, 0xc1, 0xb6, 0x37, 0x41, 0xd7, 0x15, 0x80, 0x2a, 0x23, 0x3a, 0xeb, 0xd7, 0xcd, 0x70, 0x24, 0xed, 0x91, 0x61, 0x7f, 0xf0, 0xe2, 0xc9, 0xc0, 0x88, 0x95, 0xf7, 0xb6, 0x1d, 0xd, 0xa8, 0xcc, 0x68, 0x57, 0xb5, 0x69, 0xfc, 0x52, 0xfa, 0x8a, 0x43, 0x54, 0x7f, 0xae, 0xf1, 0x4d, 0xb, 0x4f, 0x6a, 0xb4, 0xf9, 0xa7, 0xd1, 0xad, 0xc, 0x6f, 0xdd, 0x3, 0x18, 0xb3, 0xa6, 0xe, 0xb4, 0x35, 0xae, 0xea, 0x55, 0xa5, 0x4f, 0x8e, 0x48, 0x16, 0x4e, 0x2e, 0x38, 0x55, 0x7d, 0x4, 0x9f, 0x98, 0xc, 0x6e, 0x2f, 0xe0, 0xb7, 0xb5, 0xc9, 0x49, 0x26, 0x76, 0x95, 0xd3, 0xd2, 0x1b, 0x6b, 0xf6, 0xa3, 0xae, 0xc7, 0xe7, 0x4e, 0x60, 0xa9, 0x96, 0xf8, 0xc6, 0x6d, 0x27, 0xff, 0x46, 0x36, 0xd1, 0xba, 0x60, 0x28, 0xf5, 0xe7, 0xf0, 0x9b, 0x92, 0x4b, 0xb4, 0x7c, 0x21, 0xc8, 0x92, 0x2d, 0x82, 0xc1, 0xa9, 0xae, 0x63, 0xce, 0xf5, 0xa2, 0xfd, 0xa5, 0x54, 0x91, 0xb1, 0xaf, 0xa2, 0xd0, 0xa6, 0x1d, 0x80, 0x95, 0x4c, 0x47, 0x2e, 0x48, 0x4b, 0xc2, 0x11, 0xb6, 0xd0, 0x72, 0x99, 0xc1, 0x51, 0xf3, 0xa8, 0x60, 0x65, 0x8e, 0x46, 0x1d, 0x21, 0x64, 0xcf, 0x7b, 0x69, 0x80, 0x75, 0xeb, 0x91, 0xc4, 0xfb, 0x88, 0xee, 0xd0, 0x9d, 0xec, 0x32, 0x2e, 0x6c, 0x95, 0xbf, 0xd2, 0x59, 0x5b, 0x4e, 0xf9, 0xdd, 0xdc, 0x64, 0x68, 0xdc, 0x73, 0x65, 0x76, 0xee, 0xbc, 0x21, 0x23, 0x5e, 0xfd, 0xc4, 0x6, 0x9a, 0x5e, 0xef, 0xf8, 0xb4, 0xa7, 0x55, 0xf8, 0x80, 0x72, 0xdd, 0x18, 0xa9, 0xfb, 0x88, 0xc6, 0xae, 0x8b, 0x60, 0xc2, 0xaa, 0xbb, 0x42, 0xf, 0x40, 0x33, 0xf, 0xf0, 0xb3, 0xa3, 0xe4, 0xe6, 0xf2, 0x66, 0x29, 0xba, 0x2d, 0x3d, 0x75, 0x93, 0x50, 0x98, 0x94, 0x1a, 0xf7, 0xb6, 0xcc, 0x23, 0xa4, 0xce, 0x1f, 0x3, 0x33, 0x8f, 0xfb, 0xe6, 0x7, 0x48, 0xd0, 0x8d, 0x9b, 0x0, 0x4c, 0x95, 0xdb, 0x5c, 0xe5, 0xcf, 0x63, 0x51, 0xe8, 0xc6, 0x41, 0xcf, 0x17, 0x8f, 0xcc, 0x3, 0x5c, 0x92, 0x7b, 0x3, 0x2a, 0x3c, 0xf0, 0xf1, 0x7c, 0x42, 0xd2, 0x66, 0xcc, 0x19, 0x9c, 0xc3, 0xe4, 0x18, 0x6c, 0x7b, 0xba, 0x24, 0x3d, 0x82, 0x4f, 0xb, 0x1f, 0x90, 0x13, 0x90, 0xef, 0x32, 0x2e, 0x1c, 0x94, 0xf8, 0xf1, 0x60, 0x43, 0x68, 0x2e, 0x9, 0x28, 0x2c, 0x52, 0xff, 0xba, 0xe, 0x2f, 0x93, 0x6c, 0x25, 0xe3, 0xe4, 0x91, 0x78, 0x3d, 0x5e, 0x44, 0xac, 0x19, 0x43, 0x26, 0x51, 0x81, 0x43, 0xa7, 0x8e, 0xe7, 0x32, 0x34, 0x55, 0xa, 0xc5, 0xe9, 0x67, 0x69, 0xaa, 0xee, 0xe6, 0xc7, 0x28, 0xe6, 0x62, 0x84, 0xd2, 0xce, 0x27, 0x57, 0xfa, 0x4a, 0x7a, 0x75, 0xd3, 0x96, 0x3f, 0x50, 0xc1, 0x84, 0xe4, 0xc3, 0x14, 0xa, 0xde, 0x23, 0x99, 0xbd, 0x38, 0xeb, 0x24, 0x4a, 0x36, 0x22, 0x74, 0x17, 0xe5, 0xa0, 0x8d, 0xf1, 0x1d, 0x9b, 0x8a, 0xd3, 0xd8, 0x82, 0x8f, 0x4e, 0x17, 0x91, 0x13, 0xde, 0xe7, 0x0, 0xc6, 0x97, 0x2e, 0xdd, 0x75, 0xc1, 0xa1, 0x50, 0x98, 0x70, 0xc5, 0x35, 0x50, 0xae, 0x32, 0xa0, 0x41, 0x90, 0x96, 0x6b, 0x8, 0xa2, 0x76, 0x3b, 0x53, 0xfd, 0xcb, 0xfe, 0xe8, 0xc2, 0xd7, 0x1b, 0xa7, 0xbb, 0xd6, 0x67, 0xfb, 0x9d, 0x9, 0xe6, 0x8e, 0xd5, 0xb2, 0xd9, 0x85, 0x4a, 0x6, 0x2d, 0x34, 0x8b, 0x3a, 0xe3, 0x9b, 0x2f, 0x52, 0x49, 0x76, 0xc0, 0x3b, 0xa8, 0x49, 0x1f, 0xdf, 0x5b, 0x7, 0xc, 0x69, 0x42, 0xec, 0x54, 0x38, 0xe8, 0xae, 0xe1, 0x80, 0xc7, 0x9d, 0x68, 0x17, 0x44, 0xbf, 0x7d, 0x2a, 0x78, 0x40, 0xaf, 0x3f, 0xe, 0xfc, 0x4, 0xc0, 0x2c, 0x86, 0x11, 0xdf, 0x9e, 0x2e, 0xf0, 0xb2, 0xb3, 0xb7, 0xa1, 0xa0, 0xf, 0x5e, 0xa, 0xf1, 0x80, 0xec, 0x36, 0x89, 0x23, 0xa6, 0xac, 0x30, 0x9a, 0xd, 0xf4, 0x2, 0x5, 0xbf, 0x3c, 0xf8, 0x4d, 0x8a, 0x31, 0x2c, 0x68, 0xc4, 0x81, 0x46, 0x74, 0x26, 0x9c, 0xe, 0x18, 0x56, 0x57, 0x98, 0x2e, 0x9, 0x47, 0x18, 0x46, 0xd0, 0x79, 0xbe, 0xe0, 0x1, 0xbd, 0x78, 0xa, 0x48, 0x1e, 0xaf, 0xb9, 0x1d, 0xa5, 0x72, 0xe4, 0x59, 0xd3, 0x6d, 0xb6, 0xba, 0xaf, 0xe3, 0x21, 0x38, 0xce, 0x62, 0x99, 0x31, 0x73, 0x17, 0xb6, 0xe5, 0xce, 0xc5, 0xbb, 0x9f, 0xfd, 0x6f, 0xd4, 0x30, 0x8b, 0xe0, 0xb7, 0x10, 0xc6, 0x36, 0x99, 0xc6, 0x5b, 0x6e, 0xcf, 0x62, 0xe2, 0x9c, 0xf2, 0xcf, 0x43, 0xf3, 0xc1, 0x14, 0xb9, 0x68, 0x35, 0x4e, 0x2e, 0xca, 0xc5, 0x36, 0xde, 0x16, 0xc0, 0x64, 0x1d, 0x1, 0x29, 0xb8, 0xe2, 0x42, 0xdd, 0xf, 0xb1, 0xe0, 0xf8, 0xaa, 0x85, 0x66, 0x81, 0x29, 0x94, 0x78, 0x97, 0xde, 0xe, 0x23, 0x8, 0x17, 0x51, 0xe7, 0xf8, 0x2b, 0x92, 0x3b, 0xfc, 0xd8, 0x1e, 0x67, 0x33, 0xb1, 0x29, 0x4c, 0xa0, 0xc0, 0xd8, 0xe4, 0xc4, 0x99, 0x6e, 0x3b, 0x39, 0x12, 0xeb, 0x87, 0xba, 0xbe, 0x93, 0x87, 0x4c, 0x97, 0xf3, 0xaf, 0x9b, 0xdf, 0x18, 0x2c, 0x5, 0x94, 0x74, 0x3, 0x39, 0x71, 0x0, 0x91, 0x93, 0xa2, 0xc3, 0xc5, 0x95, 0xb, 0x7a, 0xe3, 0x4f, 0x23, 0x77, 0x6a, 0x6b, 0xc9, 0x61, 0xb6, 0x21, 0x9a, 0xc2, 0x2, 0x61, 0xcf, 0x1e, 0x14, 0xd6, 0xf1, 0xaa, 0xc3, 0x53, 0x2f, 0xb2, 0x3b, 0x9e, 0x50, 0x95, 0x91, 0x57, 0x13, 0xd5, 0x22, 0x4, 0x74, 0x59, 0x29, 0x60, 0xed, 0x7b, 0x53, 0x22, 0x38, 0x8, 0x1b, 0xf0, 0x89, 0x72, 0xe0, 0x35, 0x6e, 0x7d, 0xcd, 0xff, 0x6e, 0xd8, 0x6d, 0x8c, 0xc4, 0x94, 0x1f, 0xfa, 0x9c, 0xf, 0xeb, 0x82, 0x1f, 0xbb, 0xc8, 0x7d, 0xb9, 0x2e, 0x1b, 0xe6, 0xb7, 0xe0, 0x9e, 0x31, 0x4e, 0xd7, 0x34, 0x2e, 0xfe, 0x52, 0x5a, 0xb6, 0x9a, 0xf7, 0x3b, 0x10, 0xc3, 0x52, 0xa3, 0x8f, 0xeb, 0xfe, 0xab, 0x5a, 0x6c, 0xff, 0x97, 0x5, 0x73, 0xc9, 0xf5, 0xef, 0x8f, 0xbe, 0xbf, 0x8, 0x46, 0x90, 0xa7, 0xe6, 0x1c, 0x8, 0xd6, 0x49, 0xa2, 0xfc, 0xc4, 0x3a, 0x2f, 0x81, 0x1f, 0x0, 0xe2, 0xe5, 0xb9, 0x9a, 0xbc, 0x24, 0x9b, 0xe8, 0x2e, 0x1, 0x38, 0x67, 0x2c, 0x2, 0x91, 0xa1, 0x13, 0xa7, 0x30, 0x5d, 0x9c, 0x3d, 0xe8, 0x93, 0xf, 0xef, 0x84, 0xf0, 0xe3, 0x76, 0x48, 0x28, 0xf9, 0xfb, 0xc1, 0x29, 0x70, 0x77, 0xc9, 0xa4, 0xd2, 0xe7, 0xbc, 0xb3, 0x6b, 0x7a, 0xef, 0x59, 0xa6, 0xa2, 0xdf, 0x28, 0x72, 0x6, 0xb8, 0x8f, 0xa4, 0x77, 0xd8, 0x98, 0x33, 0xcd, 0xd5, 0x3f, 0xf, 0x5d, 0x2, 0x8f, 0xfd, 0xa4, 0xbe, 0x2b, 0x7c, 0xae, 0x2e, 0x35, 0x2e, 0x7d, 0xd6, 0x94, 0x43, 0x5f, 0xcc, 0xd7, 0xe7, 0x4d, 0x18, 0x42, 0xe1, 0x36, 0x45, 0x5c, 0x1b, 0x55, 0xb5, 0xa, 0xa6, 0x4a, 0xd3, 0x12, 0xb2, 0x89, 0x2e, 0xd5, 0x51, 0x0, 0xf5, 0xea, 0x6f, 0xa9, 0x14, 0xb, 0xbb, 0x12, 0xd, 0x74, 0xef, 0x21, 0x4e, 0x7e, 0x67, 0xb9, 0x60, 0x20, 0xf0, 0x22, 0xc5, 0x1d, 0x73, 0xf7, 0x2d, 0x67, 0xe4, 0x12, 0x8b, 0x31, 0x6d, 0x32, 0x7b, 0x82, 0x3, 0xf8, 0x39, 0x94, 0x4a, 0x2, 0x39, 0xc, 0x63, 0xb8, 0xdf, 0x52, 0x94, 0x31, 0x97, 0xa8, 0x96, 0xcb, 0xaa, 0x7c, 0x86, 0xa3, 0xed, 0x61, 0x39, 0x8a, 0xd6, 0xca, 0xff, 0xc4, 0x77, 0xb0, 0xe2, 0x58, 0xc, 0xfa, 0x19, 0xa9, 0x4d, 0x63, 0x5d, 0x54, 0x3d, 0x89, 0x22, 0x5e, 0xf1, 0x9a, 0xb6, 0x79, 0xef, 0x10, 0xab, 0x8b, 0x80, 0x3d, 0x3d, 0xbc, 0x54, 0x37, 0x2c, 0xf8, 0x45, 0x7, 0x30, 0xab, 0xc8, 0x8a, 0x65, 0x4a, 0x7c, 0xb6, 0x38, 0x27, 0xc1, 0x82, 0x21, 0xe7, 0x40, 0x39, 0x76, 0xc4, 0xb3, 0x4f, 0xe4, 0x98, 0x87, 0x46, 0xbe, 0x77, 0x3b, 0x5f, 0xf8, 0xa7, 0x17, 0xf2, 0x7d, 0x4, 0xdc, 0x2d, 0xd9, 0x59, 0x5e, 0xc5, 0xd4, 0x39, 0x24, 0x8d, 0x4d, 0xe6, 0xe8, 0x75, 0xa4, 0xdc, 0xce, 0x16, 0x9b, 0xca, 0x87, 0xd, 0xcd, 0x24, 0xa7, 0xfe, 0xd, 0x54, 0xa5, 0x59, 0xfd, 0xe4, 0x35, 0x7a, 0x46, 0x29, 0x3a, 0x4f, 0x34, 0x94, 0x98, 0x6d, 0xba, 0x1e, 0xc5, 0x49, 0xe9, 0x81, 0xde, 0xf2, 0xc2, 0xe5, 0xa5, 0x6b, 0x6, 0xea, 0xda, 0xb3, 0xc7, 0xc8, 0x8, 0x14, 0xa6, 0xc8, 0x3f, 0x9f, 0xde, 0xd0, 0x6, 0x8f, 0xf8, 0xdf, 0x7a, 0xa, 0xce, 0x75, 0x3b, 0xf5, 0x1c, 0xc1, 0xbb, 0xd5, 0x87, 0xbc, 0xfb, 0xcc, 0x7a, 0xbb, 0x9f, 0xe2, 0xfd, 0xad, 0x7b, 0x26, 0x8e, 0x45, 0xa1, 0x56, 0xc2, 0x39, 0xe0, 0x68, 0x36, 0xb4, 0x1c, 0x5d, 0xfd, 0x17, 0x7c, 0x8b, 0xfb, 0x26, 0x5f, 0x2b, 0x6, 0xaa, 0x79, 0xaf, 0x26, 0xe4, 0xee, 0x4, 0xbf, 0x8f, 0xd7, 0xd0, 0x2, 0x20, 0x7, 0xe3, 0xb7, 0x4f, 0xe8, 0x37, 0xa2, 0x9c, 0x4c, 0x3d, 0x13, 0x82, 0xc, 0xa1, 0xd8, 0x1, 0xb4, 0x81, 0x41, 0x7e, 0x6d, 0x92, 0x25, 0xa5, 0xaa, 0x52, 0xb1, 0xdb, 0x73, 0x33, 0x8, 0x43, 0xe9, 0x83, 0xc9, 0xe7, 0x6e, 0x1e, 0xad, 0x5f, 0x2f, 0xf5, 0x28, 0x13, 0xb4, 0x7c, 0x9d, 0xf, 0xeb, 0xf7, 0xd5, 0x78, 0x1d, 0x44, 0x8b, 0xa6, 0x9b, 0x6f, 0x72, 0xbc, 0x35, 0x9e, 0x3b, 0x6b, 0xa0, 0xf1, 0x1f, 0x3e, 0x59, 0x55, 0x2, 0x55, 0xa2, 0x15, 0xc1, 0xbe, 0xdf, 0x3d, 0xd4, 0x2d, 0x55, 0x46, 0xf0, 0xa8, 0xbb, 0xab, 0xa7, 0x48, 0x2c, 0x33, 0xf1, 0xb, 0xad, 0xa3, 0x56, 0xfc, 0xd4, 0x9a, 0x31, 0x24, 0xbe, 0x31, 0xda, 0x2d, 0xf9, 0xe7, 0xa8, 0x95, 0xe0, 0x8b, 0xd2, 0xf7, 0x3, 0x85, 0x21, 0x78, 0x98, 0x40, 0xe8, 0x2f, 0xa5, 0xbc, 0x4d, 0xc2, 0x29, 0xfe, 0xda, 0x6d, 0x27, 0xeb, 0x64, 0x7a, 0x1d, 0x96, 0x54, 0xcd, 0x80, 0x42, 0xbe, 0x1d, 0x7f, 0x89, 0x8, 0x36, 0xe4, 0xd5, 0xd2, 0x38, 0x84, 0x77, 0xa8, 0x81, 0x2f, 0x36, 0x90, 0x16, 0x85, 0xa8, 0x52, 0x4d, 0x7e, 0xd1, 0xb5, 0x4, 0xba, 0xef, 0x1c, 0xf2, 0x62, 0x52, 0x73, 0x4c, 0x22, 0x7, 0x27, 0x44, 0x9a, 0x1f, 0x17, 0xc6, 0x33, 0x6c, 0x96, 0x7, 0xbf, 0xb0, 0x16, 0x8, 0x1e, 0x91, 0xa8, 0x7b, 0xdb, 0xa9, 0x45, 0x37, 0x3, 0x59, 0xea, 0x6f, 0x30, 0x67, 0x8f, 0xa7, 0xc0, 0xe0, 0xf7, 0xac, 0x2a, 0xf9, 0x1b, 0x25, 0xad, 0x83, 0x38, 0xaa, 0xb5, 0x86, 0x70, 0xbd, 0x26, 0xe9, 0xed, 0x5a, 0x34, 0x5d, 0x71, 0x59, 0x1d, 0xb1, 0xd5, 0xe3, 0x19, 0x3e, 0x98, 0x88, 0xd7, 0x62, 0xa7, 0xea, 0xc7, 0x48, 0xf2, 0xf1, 0xab, 0xb0, 0x30, 0xa7, 0xe5, 0x83, 0xfd, 0xe3, 0xfa, 0x84, 0x80, 0xab, 0xfb, 0x2f, 0x5b, 0x76, 0x53, 0x21, 0xd, 0xe5, 0x65, 0x3d, 0x7f, 0x12, 0xfa, 0x83, 0xe0, 0xd4, 0xbd, 0x10, 0x1b, 0x7b, 0x39, 0x74, 0xc0, 0xf3, 0x9c, 0xd3, 0x9f, 0xb5, 0xb1, 0xc, 0x9, 0xf8, 0x59, 0x10, 0x9f, 0x11, 0x98, 0x7d, 0xe1, 0x1d, 0xdc, 0xa6, 0x36, 0x8c, 0x48, 0x5d, 0x3c, 0x35, 0x74, 0xdf, 0x23, 0x8e, 0x3d, 0x3a, 0xf3, 0xaa, 0x14, 0x93, 0xf5, 0xba, 0x78, 0xc0, 0x75, 0xe0, 0x31, 0x3c, 0xca, 0xd1, 0x46, 0x3a, 0xa0, 0x7c, 0xf, 0xc7, 0x60, 0xb6, 0x47, 0xac, 0xe3, 0xc5, 0x99, 0x59, 0x2e, 0xfe, 0x88, 0x13, 0x24, 0xd0, 0x70, 0x5, 0xc0, 0x7e, 0x2a, 0xe1, 0x6b, 0x9a, 0x2e, 0x8f, 0xaa, 0x5f, 0x61, 0x9d, 0xfd, 0x15, 0x7b, 0xed, 0x54, 0x85, 0x96, 0x40, 0xeb, 0xa1, 0x8f, 0x82, 0x48, 0xa4, 0x7a, 0x7e, 0x44, 0xb4, 0x7b, 0x32, 0xff, 0x9f, 0x2, 0xd1, 0xd0, 0xb2, 0x2b, 0x2f, 0x6d, 0xaa, 0x6c, 0x64, 0x2a, 0x5e, 0x7, 0x1b, 0x35, 0xe7, 0x22, 0xde, 0x79, 0xb8, 0x8e, 0x62, 0x6c, 0x50, 0x9a, 0x4e, 0x62, 0xd5, 0xbc, 0xdc, 0x24, 0x7e, 0xa8, 0xf0, 0xae, 0x8e, 0x21, 0x6f, 0xbd, 0x1f, 0x24, 0x95, 0x96, 0x44, 0xac, 0x23, 0x12, 0x1c, 0x8, 0x70, 0xb1, 0xc9, 0x67, 0x6f, 0xac, 0x6a, 0xb5, 0x21, 0x8f, 0x86, 0x16, 0x21, 0xb7, 0xbc, 0xf8, 0xa3, 0x8f, 0xbd, 0x34, 0x76, 0x1c, 0x69, 0xb6, 0x33, 0xbd, 0xb6, 0x6, 0x73, 0x79, 0x1a, 0x38, 0x66, 0x47, 0x92, 0x6c, 0xdb, 0x78, 0x40, 0xa5, 0x4c, 0x44, 0x12, 0x6a, 0xcc, 0x51, 0x10, 0x6d, 0xa9, 0x91, 0x2e, 0xd0, 0x35, 0xfa, 0xdd, 0x44, 0x47, 0x68, 0xe5, 0x37, 0x47, 0xf7, 0xb3, 0xda, 0xc5, 0xc5, 0xcf, 0x9c, 0xf4, 0x6c, 0xe9, 0x1e, 0x3f, 0xdf, 0xc1, 0x9a, 0x8f, 0xb, 0x48, 0x3b, 0xa1, 0x71, 0x5, 0xc, 0x3c, 0x7b, 0x3a, 0x4b, 0xd5, 0xb3, 0xbe, 0x2f, 0x99, 0xbb, 0xcd, 0x5d, 0x69, 0x36, 0xc0, 0x35, 0x3a, 0x5b, 0x41, 0xb2, 0xdc, 0xf5, 0xa0, 0x52, 0x9a, 0xed, 0x13, 0x44, 0xb4, 0x59, 0x77, 0xd5, 0xf8, 0xd3, 0x33, 0xb, 0xc0, 0x79, 0x73, 0x7, 0x9, 0xe4, 0x64, 0x70, 0xc6, 0x83, 0x18, 0x42, 0xf6, 0xc8, 0x29, 0x6c, 0xd7, 0x73, 0x8, 0x2d, 0xc8, 0xc0, 0x74, 0xd2, 0xa3, 0x33, 0xa4, 0xbf, 0x1e, 0x89, 0xa5, 0x23, 0x8f, 0x77, 0xdc, 0x56, 0x4, 0xde, 0xe2, 0x35, 0x65, 0xbf, 0x63, 0xd6, 0xce, 0x17, 0xb5, 0x5d, 0x48, 0xdb, 0x8f, 0x48, 0xc2, 0x26, 0xb2, 0x19, 0x5e, 0xa5, 0xbb, 0x0, 0xc5, 0xa2, 0x30, 0x3d, 0xd8, 0x47, 0xe6, 0x1f, 0xdc, 0x81, 0x8a, 0xf7, 0x7e, 0xf7, 0x57, 0x8, 0x9b, 0x4a, 0x1a, 0x13, 0x34, 0xa3, 0xd5, 0x11, 0xf5, 0x93, 0xd3, 0x29, 0xf9, 0x4a, 0xa9, 0xc0, 0x1a, 0xec, 0xa6, 0xda, 0xb, 0x5c, 0x3a, 0xbc, 0xed, 0xd7, 0xd2, 0x88, 0x93, 0xe4, 0x9f, 0xba, 0x97, 0x47, 0x61, 0xbb, 0xb4, 0x35, 0x43, 0xbb, 0x33, 0x35, 0xf8, 0x72, 0x68, 0x4d, 0x1c, 0x99, 0xb6, 0x8f, 0x5, 0x8a, 0xe7, 0xee, 0xbb, 0xed, 0x1a, 0x12, 0x9, 0xfb, 0xdc, 0x9d, 0xd1, 0xb9, 0xce, 0xdd, 0x4d, 0xd3, 0x5b, 0xb4, 0x1b, 0xa4, 0xc4, 0x4b, 0x96, 0x0, 0xb9, 0x80, 0xbc, 0x2d, 0x54, 0xb6, 0x6c, 0x1d, 0x7d, 0x13, 0xd9, 0x4e, 0xc5, 0x1, 0x3d, 0x48, 0xdb, 0x16, 0x90, 0x1b, 0x2e, 0xe2, 0x28, 0x65, 0xbc, 0x1, 0xc5, 0x5f, 0x6b, 0x64, 0xad, 0x6c, 0x81, 0xf8, 0xd2, 0xb2, 0xb3, 0x1c, 0xf0, 0xd2, 0x28, 0x8c, 0x25, 0x53, 0xb1, 0xb0, 0x5d, 0xd7, 0xa3, 0xea, 0xd6, 0x93, 0xb4, 0xd, 0x7d, 0xe8, 0xd, 0x2b, 0x9a, 0x41, 0x93, 0x84, 0xfe, 0xd8, 0x3, 0x8f, 0xe4, 0xa1, 0x3a, 0xb2, 0x8, 0xc5, 0xf6, 0xfa, 0x47, 0xf7, 0x49, 0x35, 0xd5, 0x35, 0x1a, 0x57, 0x37, 0xf1, 0x38, 0xb8, 0xf9, 0xfc, 0xe2, 0x58, 0x5e, 0x9f, 0xf5, 0x3c, 0xfd, 0xa7, 0xee, 0x6c, 0x18, 0xc7, 0x39, 0xad, 0x6b, 0x28, 0x2f, 0xfb, 0x76, 0x5e, 0xe2, 0xd1, 0xca, 0x9d, 0xe3, 0xef, 0xd9, 0xba, 0x4, 0xe9, 0xc7, 0xed, 0x90, 0x51, 0xe7, 0x60, 0xa5, 0xb5, 0xec, 0xf, 0x3e, 0x6, 0x6f, 0x6a, 0xc3, 0xac, 0xd8, 0xae, 0x85, 0xed, 0x50, 0x51, 0x6c, 0xaf, 0x20, 0x6d, 0xbc, 0xcf, 0x6c, 0xb5, 0xfa, 0xdb, 0x69, 0x2c, 0x98, 0x1e, 0xd, 0x7e, 0xa9, 0x10, 0x7e, 0x7c, 0x8a, 0x62, 0xf5, 0xab, 0xd3, 0xa1, 0x78, 0xe9, 0xce, 0x68, 0xb8, 0x77, 0x4, 0x2d, 0xb9, 0x7a, 0x33, 0x8b, 0xa6, 0xe3, 0x62, 0xb8, 0xa5, 0x87, 0x94, 0x97, 0x2, 0x51, 0x1d, 0xd4, 0x61, 0x3a, 0xc3, 0x6, 0x6, 0x5f, 0xf1, 0x26, 0x93, 0x6f, 0x27, 0xbe, 0x14, 0x28, 0x2e, 0x3c, 0xfe, 0xc6, 0x14, 0x1c, 0x52, 0x2f, 0x51, 0x73, 0xdf, 0xac, 0x7d, 0x4d, 0x46, 0x17, 0x44, 0x7e, 0x7f, 0x77, 0xd3, 0xf9, 0xf5, 0x10, 0xab, 0xa2, 0x8, 0x74, 0x19, 0x64, 0x21, 0x1d, 0x6a, 0x91, 0x28, 0x59, 0x18, 0xd5, 0x55, 0xae, 0xea, 0x5e, 0x16, 0xf3, 0x4a, 0x68, 0x75, 0xdf, 0x59, 0xef, 0x4e, 0xd8, 0xd5, 0x64, 0x83, 0x53, 0x1a, 0x3b, 0x56, 0x70, 0x15, 0x20, 0x4e, 0xb5, 0xff, 0xef, 0x4c, 0x6b, 0xa7, 0xbb, 0xd9, 0x74, 0xdc, 0x82, 0x6, 0x7a, 0xd8, 0xcb, 0xbe, 0xfc, 0x6c, 0x11, 0x93, 0xf1, 0x2, 0xa4, 0x0, 0xe, 0x7d, 0xb3, 0x9f, 0x26, 0x6b, 0x61, 0x8e, 0xce, 0xe5, 0x2d, 0xe6, 0x7d, 0x4, 0x38, 0xf7, 0xaa, 0x53, 0x41, 0xdd, 0x4f, 0x75, 0x11, 0xa1, 0xab, 0x9b, 0xb4, 0x70, 0x37, 0xba, 0x59, 0x57, 0x51, 0x61, 0x3a, 0x42, 0xaa, 0xf8, 0xeb, 0x9, 0x8b, 0x92, 0xfb, 0x41, 0xcd, 0xa1, 0x45, 0x22, 0x59, 0x36, 0x89, 0x4c, 0x9b, 0xc1, 0x8e, 0xba, 0x1c, 0xe, 0x71, 0x36, 0xaf, 0xe3, 0x91, 0x7e, 0xa8, 0x16, 0xc4, 0x9f, 0x84, 0x85, 0x89, 0xf6, 0x65, 0x3c, 0xa7, 0xba, 0xcd, 0x34, 0xa9, 0x3, 0x3c, 0x47, 0x66, 0xcb, 0xbf, 0x1b, 0x31, 0x2f, 0x11, 0xcd, 0x93, 0x4e, 0xde, 0x40, 0x13, 0xc1, 0x69, 0x7b, 0x53, 0xdb, 0x66, 0xb9, 0x58, 0x24, 0xbd, 0xe7, 0x7, 0x5b, 0x88, 0x18, 0xb0, 0x74, 0xf9, 0x32, 0xd3, 0xc8, 0x70, 0xa5, 0x45, 0xb1, 0x5d, 0x7b, 0x83, 0x9b, 0x54, 0xd1, 0xd0, 0xfd, 0x30, 0xe3, 0xa2, 0x34, 0x3d, 0xe4, 0x4c, 0xd8, 0x1f, 0x61, 0x5d, 0x3b, 0xb4, 0xce, 0x59, 0x37, 0xee, 0xc7, 0x86, 0x91, 0x61, 0x8c, 0xc7, 0x5b, 0x89, 0x5a, 0x72, 0xb9, 0xcb, 0x9, 0x38, 0x9c, 0xf1, 0x1f, 0x4b, 0x74, 0xde, 0xaa, 0x21, 0xbe, 0xc0, 0x6b, 0x5, 0xf8, 0x60, 0xb0, 0x22, 0xd2, 0xa7, 0x11, 0xfe, 0x3e, 0xb2, 0x57, 0x61, 0xbe, 0x74, 0x53, 0x82, 0xd6, 0xc, 0x4f, 0x2b, 0xab, 0x6f, 0xb4, 0x58, 0x23, 0x51, 0x73, 0x1d, 0x5c, 0x3e, 0xc9, 0x99, 0xbb, 0x30, 0xb2, 0x42, 0x57, 0xcb, 0x1a, 0x3, 0x2d, 0x3c, 0xa8, 0x2f, 0x2e, 0x4a, 0xb8, 0x78, 0x98, 0xfb, 0x2b, 0xc9, 0x1b, 0x37, 0x6c, 0x65, 0x75, 0x82, 0x9c, 0x1f, 0xa7, 0x1e, 0xa1, 0x0, 0x3, 0x1c, 0xa2, 0x94, 0xf7, 0x14, 0xe5, 0x54, 0xea, 0x26, 0x98, 0xe7, 0xea, 0x8, 0xc6, 0x54, 0x1a, 0x17, 0xe5, 0x54, 0x58, 0xcf, 0x25, 0xd7, 0xf1, 0x4b, 0x5f, 0xea, 0x33, 0xad, 0xf, 0x95, 0x6c, 0x4f, 0xe2, 0x8e, 0x1d, 0x9c, 0x6, 0xaf, 0x77, 0xa3, 0x8a, 0xe7, 0x4e, 0x54, 0xe1, 0x13, 0xa1, 0x94, 0xbb, 0x89, 0xf4, 0x54, 0xe8, 0xb7, 0x2f, 0x99, 0x34, 0xd6, 0x11, 0x8f, 0x47, 0x43, 0xa4, 0xa2, 0xaa, 0xa7, 0x69, 0x1, 0x0, 0xe, 0x2, 0x95, 0xaf, 0xd4, 0x49, 0x1d, 0xb, 0x12, 0x8e, 0xe0, 0x22, 0x57, 0x94, 0x95, 0x86, 0x38, 0xba, 0xb7, 0xb3, 0xfb, 0xa, 0x28, 0xa8, 0x34, 0x89, 0x36, 0x3e, 0x3a, 0x80, 0x8, 0xab, 0x71, 0xf6, 0x31, 0x65, 0xdf, 0x80, 0xf9, 0x91, 0x47, 0x72, 0x1a, 0xea, 0x4a, 0x89, 0x90, 0x50, 0xa3, 0x1d, 0x8d, 0xa9, 0x66, 0x5b, 0x54, 0xa5, 0x53, 0x13, 0x41, 0xbf, 0xfb, 0xf4, 0x9d, 0x8a, 0x8, 0x98, 0xa3, 0x3c, 0x74, 0x52, 0x15, 0x17, 0x57, 0x2d, 0xb8, 0xde, 0x4c, 0xc1, 0xd1, 0x82, 0x22, 0xd3, 0xa4, 0x78, 0x38, 0xe3, 0xb6, 0xe7, 0xa, 0x2, 0x48, 0x9d, 0x2, 0x6e, 0xe3, 0x50, 0xb7, 0xa9, 0x37, 0xfb, 0x47, 0x58, 0xe0, 0x19, 0x38, 0x9e, 0xb2, 0x2c, 0x81, 0x76, 0xf8, 0xf0, 0x17, 0x3a, 0xd2, 0x8e, 0x13, 0xad, 0x84, 0xe, 0x95, 0xb3, 0xf0, 0x80, 0x44, 0x7b, 0x6d, 0xe0, 0x7a, 0xd6, 0x2f, 0xf4, 0xae, 0xa8, 0xdf, 0xf6, 0x3a, 0x33, 0x52, 0x24, 0xea, 0x3e, 0x8d, 0x83, 0xec, 0xc5, 0xf5, 0xfd, 0x3a, 0x8d, 0xb2, 0xad, 0x9f, 0x4, 0x91, 0xc1, 0xf6, 0x6a, 0x8d, 0x1a, 0x1e, 0xbe, 0xff, 0xff, 0x64, 0x79, 0x41, 0xa, 0x79, 0x1c, 0xf5, 0xea, 0x9e, 0xce, 0xba, 0x79, 0x29, 0xf, 0xb2, 0x36, 0x22, 0x2, 0x42, 0x1, 0x38, 0x5d, 0x76, 0x29, 0xb7, 0x5, 0x6b, 0xe7, 0xe3, 0x6d, 0x6d, 0x0, 0xe2, 0xe, 0xbe, 0x3a, 0xaf, 0x1, 0x1e, 0x1, 0xd5, 0x6e, 0xb9, 0xcc, 0x5a, 0x5d, 0xb1, 0x75, 0x20, 0x5, 0xd, 0xc4, 0x5b, 0x81, 0xbd, 0x9f, 0xc7, 0xd9, 0xc6, 0xf2, 0x6c, 0xa3, 0xdf, 0x88, 0xfd, 0xca, 0x8d, 0x70, 0x90, 0xaa, 0x38, 0xe2, 0xcb, 0x8c, 0x90, 0xce, 0xaf, 0x35, 0xba, 0xc4, 0x22, 0x87, 0x63, 0xb, 0xbf, 0x6a, 0xfd, 0xb0, 0xa8, 0x3d, 0x5a, 0xc1, 0x35, 0xc3, 0xc9, 0x2c, 0x25, 0xce, 0x2d, 0x9b, 0x79, 0xaa, 0x65, 0xde, 0xf0, 0xe7, 0x84, 0x62, 0xbc, 0xed, 0xe0, 0xec, 0x62, 0x87, 0xef, 0xfb, 0x73, 0x27, 0x85, 0x28, 0x98, 0x44, 0x33, 0x85, 0x38, 0xae, 0xc3, 0xf3, 0x90, 0x9b, 0x2c, 0xb2, 0x56, 0x1e, 0x73, 0x12, 0x18, 0x19, 0xd8, 0xf0, 0x31, 0x68, 0x73, 0x95, 0x7e, 0x5d, 0x20, 0x5d, 0xc1, 0x41, 0xd6, 0x48, 0x8d, 0x81, 0xc3, 0x7c, 0x15, 0x3e, 0xf4, 0x39, 0x38, 0xb6, 0xc6, 0xf0, 0x51, 0xad, 0x36, 0x47, 0x4, 0x16, 0x55, 0xcb, 0x72, 0x9a, 0xb9, 0x22, 0xa5, 0x1, 0x21, 0x16, 0x80, 0x61, 0x87, 0x67, 0x6e, 0xde, 0x6, 0x3e, 0x65, 0xf3, 0xe6, 0xcd, 0xc7, 0xf8, 0x5f, 0x4a, 0x75, 0xa6, 0xc7, 0xb5, 0x1a, 0x82, 0xa, 0xa2, 0xb5, 0xb0, 0x7c, 0x2b, 0xa5, 0x3f, 0x7e, 0x90, 0x87, 0x4, 0xc9, 0x1c, 0x12, 0xfb, 0xa7, 0x3a, 0x5, 0xce, 0x6, 0x20, 0x50, 0x72, 0x1a, 0xb0, 0x29, 0xe9, 0x4, 0x1f, 0xa3, 0x90, 0xb4, 0x6e, 0x7e, 0x40, 0xbc, 0x19, 0x77, 0xbb, 0x70, 0x41, 0xeb, 0x4c, 0xd8, 0xef, 0x28, 0x13, 0x23, 0x20, 0xbb, 0x4, 0xc1, 0x1f, 0x6a, 0xca, 0x8b, 0x71, 0x90, 0xb, 0x28, 0x25, 0xe4, 0xf4, 0xd6, 0x82, 0x6a, 0x89, 0x92, 0xa2, 0x95, 0x1b, 0xb4, 0x67, 0xdf, 0x34, 0xfa, 0x35, 0xf4, 0x5c, 0x73, 0x69, 0xd7, 0xd6, 0xd9, 0x8, 0x1a, 0x33, 0xbc, 0x7e, 0x74, 0x82, 0x26, 0x5, 0x86, 0x97, 0x57, 0xad, 0x61, 0xdd, 0x62, 0x7d, 0xe4, 0x7b, 0xe1, 0x71, 0x13, 0xe0, 0x6b, 0x1c, 0x96, 0x1a, 0x78, 0xba, 0xcb, 0xe3, 0xda, 0xd3, 0xbf, 0x63, 0x10, 0xba, 0xc9, 0x73, 0x7f, 0x6, 0x74, 0x64, 0x35, 0x29, 0xa1, 0x36, 0x27, 0x7b, 0x95, 0xe, 0xf5, 0x56, 0xf2, 0x13, 0xed, 0x2, 0x37, 0x31, 0xa6, 0xc5, 0xfc, 0x19, 0x3a, 0x65, 0xee, 0x36, 0x94, 0xb6, 0xc8, 0xa4, 0xe7, 0x29, 0xdb, 0x2b, 0xcf, 0xbe, 0xb8, 0xf3, 0x87, 0x42, 0xf7, 0x8a, 0x69, 0x1d, 0x59, 0xa1, 0xd1, 0x1a, 0x9d, 0x5d, 0x4f, 0xe1, 0xac, 0xe4, 0xf, 0x3c, 0xac, 0xf, 0x54, 0x7d, 0x4a, 0x89, 0xc6, 0x24, 0x9b, 0xa6, 0x83, 0x46, 0xeb, 0x6f, 0xad, 0xee, 0x7, 0x5c, 0x93, 0xfa, 0x25, 0xf3, 0x7f, 0x88, 0xbd, 0x2c, 0xe0, 0xb, 0x38, 0xc6, 0xbc, 0x9d, 0x8c, 0xf0, 0xe8, 0xce, 0x45, 0xe0, 0xa6, 0xf, 0xf4, 0x7f, 0x9c, 0xd8, 0x5c, 0xf9, 0xc5, 0x44, 0x12, 0x6b, 0xb0, 0xf4, 0x95, 0xab, 0xf4, 0xf0, 0x8a, 0x8c, 0xda, 0x6d, 0x83, 0xe5, 0xb9, 0xc2, 0x59, 0xae, 0x1b, 0xfc, 0xff, 0xcf, 0x3a, 0x7e, 0x1e, 0xd5, 0x7, 0xda, 0xbc, 0xcc, 0xc2, 0x6a, 0x5e, 0xe1, 0x1, 0xe0, 0xc3, 0x28, 0x85, 0x3f, 0x92, 0xc1, 0x3b, 0xd4, 0xea, 0x9f, 0xa4, 0x77, 0x45, 0x32, 0x43, 0x11, 0xa7, 0xa7, 0x2a, 0x84, 0xb8, 0xa1, 0x61, 0x34, 0x3d, 0xe6, 0xb0, 0x31, 0xee, 0xe7, 0x4f, 0xab, 0x4f, 0xe5, 0xa9, 0x72, 0x5, 0x60, 0xf4, 0xa4, 0xb5, 0xe7, 0xd5, 0x34, 0x33, 0x49, 0xc0, 0x31, 0x48, 0xd5, 0x6, 0x92, 0xfb, 0x89, 0x85, 0x3a, 0x55, 0x83, 0x65, 0xcc, 0xf5, 0x70, 0xaa, 0xe5, 0x49, 0x56, 0xe2, 0x4a, 0x9, 0x79, 0x8, 0x52, 0x46, 0x4, 0x10, 0x7, 0x45, 0x90, 0xcc, 0x4f, 0x1c, 0x54, 0x2, 0x6d, 0x69, 0xb0, 0xeb, 0xa6, 0xe7, 0xde, 0xa2, 0x3e, 0x1a, 0x8c, 0x75, 0x84, 0x22, 0x4b, 0x73, 0x3c, 0x2f, 0xde, 0xdc, 0xad, 0xa6, 0xab, 0x4e, 0xd2, 0x45, 0xa4, 0xab, 0xa7, 0xe0, 0xce, 0x76, 0x68, 0xf6, 0xaa, 0x35, 0x9a, 0x4, 0xaa, 0xe5, 0xa9, 0x4, 0xb, 0x7e, 0x84, 0x3e, 0x10, 0x91, 0xad, 0x83, 0x40, 0xe7, 0xc3, 0xec, 0xaf, 0x40, 0xce, 0x83, 0xb1, 0xbe, 0x7a, 0x3f, 0x4, 0xea, 0x9f, 0xde, 0x89, 0x6b, 0x35, 0x52, 0x37, 0x99, 0x3, 0xe, 0x9f, 0xb9, 0x70, 0x79, 0x91, 0xb9, 0x47, 0xc8, 0x14, 0x76, 0x67, 0xc0, 0x4e, 0x52, 0xe9, 0x3c, 0xc9, 0xfe, 0x20, 0x25, 0x12, 0x9b, 0xf8, 0x7b, 0xe, 0xe4, 0x74, 0x47, 0x4c, 0xee, 0x31, 0x6, 0x67, 0xb5, 0x4c, 0x91, 0x4, 0x3b, 0x7a, 0x84, 0x3, 0x6f, 0x26, 0xd2, 0x9d, 0xdc, 0x29, 0x94, 0x6e, 0xc9, 0xf8, 0xc1, 0x57, 0x8c, 0x6c, 0x9b, 0x48, 0x43, 0x66, 0xba, 0x67, 0xfe, 0x23, 0x9d, 0x29, 0xe, 0x34, 0x2f, 0xcf, 0x93, 0x60, 0x7, 0x45, 0x91, 0x13, 0xf9, 0xfc, 0x97, 0xa9, 0x5e, 0x5b, 0xf4, 0xda, 0xdd, 0xd7, 0x8b, 0x43, 0x8, 0xe0, 0x5b, 0x4d, 0xf0, 0x3f, 0xd5, 0x5, 0x3e, 0x8c, 0x35, 0xf7, 0x1e, 0xe9, 0x5d, 0xc3, 0xcd, 0x7c, 0xbf, 0xa0, 0xc1, 0x9e, 0xb6, 0xbf, 0x4d, 0x68, 0xad, 0x97, 0xd9, 0x1f, 0x80, 0xf2, 0x7c, 0x7e, 0x36, 0xfb, 0x38, 0x23, 0xcc, 0x27, 0xd2, 0xff, 0x46, 0x53, 0x61, 0xe2, 0x90, 0xa9, 0x6f, 0xff, 0x89, 0x76, 0x0, 0x1a, 0x33, 0x79, 0x7, 0x57, 0xbe, 0xaf, 0xf3, 0xe1, 0x6, 0xc5, 0x41, 0xd2, 0x43, 0xa3, 0x62, 0x9b, 0xde, 0x7d, 0xb9, 0xcd, 0xfd, 0xea, 0x30, 0xae, 0xa0, 0x84, 0xe9, 0x6, 0x6a, 0x7d, 0xdf, 0xbd, 0x4f, 0x80, 0x16, 0xbf, 0xc9, 0xc4, 0x63, 0x61, 0xd3, 0xa2, 0x71, 0x4, 0x17, 0x5e, 0x65, 0x13, 0x31, 0xae, 0xa8, 0x5b, 0xff, 0x80, 0x31, 0xb8, 0x57, 0x2b, 0x6e, 0x2c, 0xfa, 0xbe, 0xea, 0xe0, 0x77, 0x19, 0x27, 0x48, 0x1c, 0x97, 0xea, 0x7f, 0x33, 0x55, 0xc5, 0xf3, 0xf9, 0xcb, 0x81, 0x25, 0xa4, 0x22, 0x70, 0xf, 0x34, 0xe3, 0x10, 0xf7, 0x18, 0xc2, 0xb, 0xde, 0xe1, 0xa8, 0x5a, 0x2e, 0xf6, 0xde, 0xa, 0x64, 0xee, 0x40, 0x89, 0x42, 0x49, 0x91, 0x38, 0xb2, 0x16, 0xc3, 0xc, 0x95, 0x55, 0xe4, 0x19, 0x16, 0x36, 0xb8, 0x6b, 0xb6, 0x56, 0x5c, 0x66, 0x1d, 0xc7, 0x84, 0x6d, 0xac, 0xaf, 0x34, 0x4b, 0x3, 0xea, 0xe3, 0xc7, 0xe4, 0xe5, 0x32, 0xf8, 0x87, 0xa9, 0xa7, 0xa6, 0x79, 0x7a, 0x72, 0x27, 0x74, 0xa0, 0x23, 0x6c, 0x6d, 0xe2, 0x17, 0xd0, 0xe5, 0x56, 0x10, 0x7e, 0x16, 0x38, 0x76, 0xb9, 0x50, 0x7e, 0x4e, 0xa8, 0x8a, 0xe8, 0xef, 0x81, 0x6c, 0xaa, 0x95, 0x85, 0xdc, 0xb0, 0xb7, 0xf3, 0xa1, 0xc, 0x2e, 0x9f, 0x1d, 0x9f, 0x8, 0x46, 0xde, 0x27, 0xa7, 0x82, 0xdd, 0xba, 0x39, 0xbf, 0xf3, 0x1a, 0x48, 0x24, 0x86, 0x65, 0x79, 0x6a, 0x35, 0x79, 0x52, 0xa0, 0xf9, 0xf5, 0x45, 0x23, 0x60, 0xc0, 0xf9, 0x42, 0x9a, 0x13, 0x89, 0xf, 0x8b, 0x1a, 0xfc, 0x40, 0x4d, 0x84, 0x42, 0xee, 0x3e, 0xb5, 0x68, 0x63, 0x5b, 0x4e, 0xe5, 0xbf, 0xb0, 0x93, 0xbf, 0x5b, 0x32, 0x4d, 0xd7, 0x59, 0x39, 0x47, 0xb9, 0x14, 0x61, 0x8d, 0xec, 0xbe, 0x61, 0x2a, 0xee, 0xe2, 0x4b, 0x92, 0x94, 0x2a, 0x67, 0x25, 0xc, 0x3d, 0xc2, 0xf2, 0xdb, 0x95, 0x85, 0xa4, 0x38, 0x18, 0x22, 0x6a, 0x8b, 0x84, 0x76, 0xe4, 0x73, 0xb6, 0xc1, 0x35, 0x9a, 0xe6, 0x43, 0xe7, 0x3, 0x85, 0x46, 0xd8, 0x99, 0x24, 0xb4, 0x2a, 0xa7, 0xb, 0xe9, 0xe9, 0x54, 0x0, 0xaa, 0x62, 0x11, 0x29, 0x48, 0xbc, 0xf1, 0x13, 0x8d, 0x35, 0x26, 0x7f, 0xfa, 0xb7, 0x71, 0x19, 0x5d, 0x68, 0xe4, 0xae, 0xe1, 0x2b, 0x1d, 0xa5, 0x67, 0x3e, 0xa9, 0x14, 0xd1, 0x98, 0x9, 0x85, 0x41, 0xe0, 0x61, 0x25, 0x5, 0x4e, 0x60, 0x9f, 0x63, 0x59, 0x18, 0x8, 0x5d, 0x15, 0x49, 0x5c, 0x7, 0x32, 0x1c, 0x4b, 0xb6, 0x67, 0x3b, 0x34, 0xa2, 0x2a, 0x6a, 0x3e, 0xf5, 0x67, 0x29, 0x5e, 0x44, 0x1b, 0xe0, 0x4, 0xa9, 0x73, 0x17, 0x27, 0xfb, 0xbd, 0x73, 0x8d, 0x88, 0x28, 0xb, 0xe4, 0xe1, 0x7c, 0x1b, 0x7d, 0xa9, 0xea, 0xf6, 0x35, 0x7e, 0x2e, 0x97, 0xa0, 0xaf, 0xa9, 0x2a, 0x77, 0x61, 0xd0, 0x59, 0x7c, 0x1f, 0x7a, 0xc4, 0xc7, 0x4a, 0x43, 0x9a, 0x7b, 0x9b, 0xe7, 0x4a, 0x12, 0x21, 0x6e, 0xc7, 0xec, 0x22, 0xbb, 0xf3, 0xcf, 0x5a, 0x5, 0xd3, 0x58, 0xc8, 0x84, 0xc9, 0x7a, 0xfd, 0x8b, 0x9c, 0x78, 0x24, 0xc0, 0x2, 0xdd, 0x34, 0x54, 0xfc, 0x7b, 0xb5, 0x41, 0xea, 0xa9, 0xdc, 0x90, 0xdf, 0x98, 0x33, 0x24, 0xe2, 0x98, 0xa8, 0x8a, 0xbb, 0x94, 0x4a, 0x89, 0x34, 0xc8, 0x7, 0xf6, 0x76, 0x9b, 0xc9, 0xc2, 0x97, 0xbe, 0x7, 0xbb, 0x2, 0x93, 0xc2, 0x18, 0x67, 0xba, 0x76, 0x65, 0x8c, 0xa8, 0x3, 0xe7, 0xcc, 0xef, 0x79, 0x3d, 0x6, 0xd1, 0xa0, 0xb6, 0xd7, 0xce, 0x59, 0xf2, 0xad, 0x68, 0x1f, 0x9f, 0xf5, 0x7d, 0xd5, 0x2f, 0xc8, 0x70, 0x64, 0xb0, 0xdb, 0xc6, 0xdc, 0x5d, 0x7, 0x73, 0xb4, 0xa9, 0x51, 0x64, 0x1b, 0x80, 0xf4, 0x1b, 0x55, 0x76, 0xe3, 0xc8, 0x51, 0x6b, 0xa9, 0x1d, 0x4e, 0xd4, 0xf7, 0xd1, 0xb, 0xef, 0xc, 0x60, 0x4e, 0x4d, 0x1d, 0xcb, 0x4b, 0x71, 0xc7, 0x40, 0x65, 0xc, 0xe4, 0xb9, 0x7b, 0xc5, 0x44, 0xc6, 0x7c, 0x32, 0xc2, 0x1e, 0xbd, 0x71, 0xa, 0x4f, 0xd8, 0xcf, 0xb5, 0x33, 0xcd, 0x0, 0xdd, 0xd, 0x6b, 0x4e, 0xf7, 0x68, 0xa5, 0xcf, 0xf4, 0x48, 0xf, 0x2d, 0xdb, 0x4e, 0x69, 0x1c, 0xd8, 0x7d, 0xff, 0xfe, 0xcc, 0xc7, 0x47, 0x27, 0xb2, 0x24, 0x8c, 0xac, 0xad, 0xec, 0xda, 0xce, 0xe5, 0xa5, 0x42, 0x7, 0x3f, 0xde, 0x29, 0xdb, 0x6d, 0x29, 0x90, 0x30, 0xbb, 0x8f, 0x5d, 0xe3, 0x4a, 0xb5, 0x1f, 0xb1, 0xf7, 0xab, 0x8c, 0x78, 0x1f, 0xd8, 0x4d, 0x7f, 0x7e, 0xcf, 0x52, 0x9a, 0x5e, 0xc0, 0x69, 0x5e, 0xe1, 0x2b, 0x13, 0xa0, 0x72, 0x4d, 0xf, 0x2a, 0x47, 0xb7, 0xda, 0x90, 0x6, 0x67, 0x2d, 0x31, 0x11, 0xf9, 0x42, 0xc1, 0x8b, 0x99, 0x61, 0x82, 0x1f, 0x63, 0xd3, 0xe8, 0x94, 0x1c, 0x5c, 0x61, 0xae, 0x2f, 0xf4, 0xf0, 0x5d, 0xfa, 0xc3, 0xae, 0x8c, 0x94, 0x4e, 0x2f, 0x1e, 0x10, 0x74, 0xa3, 0xa8, 0xe7, 0x2a, 0x24, 0xb, 0x61, 0xde, 0xc8, 0x5d, 0x3a, 0x89, 0xf, 0xce, 0x23, 0xe2, 0x67, 0xfb, 0x15, 0xc5, 0xe8, 0xc5, 0x6d, 0xad, 0x4e, 0xa6, 0xbf, 0x74, 0x77, 0x8f, 0x72, 0x5c, 0x92, 0x95, 0xf, 0xd2, 0x89, 0xce, 0x83, 0x85, 0x9, 0x66, 0x9, 0x1e, 0x7a, 0xd7, 0xa7, 0xf2, 0x93, 0x94, 0xdb, 0xee, 0xa2, 0x4a, 0x4d, 0x30, 0x4c, 0x97, 0x20, 0x28, 0x1b, 0x2d, 0x28, 0x77, 0xc0, 0xda, 0xe3, 0x42, 0x8, 0x52, 0xbe, 0x88, 0xd0, 0xca, 0x78, 0xa8, 0x1f, 0x56, 0xe6, 0xe1, 0xa9, 0x7, 0xcb, 0xc2, 0x89, 0xdb, 0x62, 0x9d, 0x21, 0xc3, 0xc5, 0x5b, 0x38, 0x52, 0x27, 0xda, 0x5f, 0x6b, 0x67, 0x2b, 0xd8, 0xfc, 0xea, 0x4, 0xe3, 0x9e, 0xdc, 0x49, 0x24, 0xa2, 0x4e, 0x2f, 0x63, 0x91, 0x79, 0x9e, 0x1e, 0xb9, 0xe0, 0xd5, 0xcd, 0x61, 0xe0, 0x36, 0x30, 0xbc, 0x25, 0x8, 0x83, 0xff, 0xf6, 0xa6, 0x75, 0x9b, 0x5e, 0xf6, 0x81, 0x4, 0x26, 0x5b, 0x2e, 0x37, 0xf8, 0x1, 0x49, 0xc0, 0x56, 0x1, 0x48, 0x33, 0xb7, 0x57, 0xb8, 0xab, 0x86, 0x7f, 0x55, 0x11, 0x44, 0x5b, 0x73, 0xe, 0xed, 0xe3, 0x88, 0x2e, 0x73, 0x33, 0x2a, 0xd, 0x68, 0x37, 0xc3, 0x1f, 0xc1, 0xc9, 0x31, 0xcb, 0xbf, 0x99, 0xa5, 0xc4, 0x1, 0x52, 0xa9, 0x51, 0xf8, 0x82, 0xb2, 0x95, 0xdf, 0x4d, 0x85, 0x8a, 0xda, 0x42, 0xd3, 0xb4, 0xed, 0x9d, 0x44, 0xdc, 0xcd, 0xf, 0xb1, 0xcf, 0x4a, 0x24, 0xd1, 0x42, 0x0, 0x89, 0x2c, 0x17, 0x70, 0xfc, 0xc7, 0xca, 0x72, 0x30, 0x9b, 0x3f, 0x6, 0xe8, 0x9c, 0x85, 0xa6, 0xcd, 0x1a, 0xf5, 0xe2, 0x51, 0x7f, 0x3c, 0x31, 0x43, 0xd2, 0x78, 0x95, 0x3d, 0xd7, 0xa4, 0xf1, 0xa3, 0x52, 0x6e, 0xce, 0xf0, 0x64, 0x7a, 0x5b, 0x78, 0xda, 0x2d, 0x4c, 0x2a, 0x44, 0x15, 0x63, 0x76, 0x2e, 0x7b, 0x2d, 0x9e, 0x3b, 0xa3, 0x72, 0xd9, 0xe4, 0xff, 0x18, 0x82, 0xc4, 0x27, 0xb, 0xc6, 0x7c, 0x91, 0x9d, 0x14, 0x84, 0x38, 0x8, 0xc7, 0x8f, 0xcc, 0x1e, 0x46, 0x2f, 0x6f, 0x34, 0x4, 0x5c, 0xa9, 0x50, 0x46, 0x61, 0xf2, 0xfd, 0xe9, 0xeb, 0xac, 0x66, 0xf6, 0xc1, 0x37, 0xb5, 0x35, 0x5e, 0x83, 0xbc, 0xba, 0x88, 0xd1, 0x13, 0x56, 0x64, 0x3e, 0xc9, 0xe1, 0xc5, 0x3a, 0xce, 0xca, 0x88, 0x1a, 0x11, 0x1f, 0x15, 0x4, 0xb0, 0xf9, 0x94, 0xfa, 0xc5, 0xdb, 0x7, 0x5b, 0x3, 0xa5, 0xc7, 0xd7, 0x49, 0x9e, 0x60, 0xa7, 0x8e, 0x95, 0x53, 0xc0, 0xf4, 0x13, 0x90, 0xd7, 0xb4, 0x26, 0x5, 0xbd, 0x2f, 0x3e, 0x59, 0xbb, 0x5e, 0xde, 0x66, 0x37, 0xc, 0x2e, 0x4c, 0xb4, 0xf8, 0x7c, 0x6e, 0x78, 0x3e, 0x98, 0x8c, 0x8b, 0xfc, 0x72, 0x6f, 0xd7, 0xf9, 0x48, 0x23, 0x63, 0x9b, 0xab, 0x6f, 0x59, 0xac, 0x70, 0xeb, 0x81, 0x2e, 0xd0, 0x58, 0xf7, 0xd8, 0x17, 0x44, 0x9b, 0x76, 0x22, 0xf5, 0xff, 0x74, 0x72, 0x7, 0xd5, 0x63, 0x30, 0x9f, 0xac, 0xe8, 0xf, 0x34, 0x4f, 0x6f, 0xac, 0xf5, 0xba, 0x14, 0x9, 0xb5, 0xd1, 0xd9, 0x72, 0xce, 0x5c, 0x25, 0xbc, 0xb7, 0x84, 0x59, 0x83, 0xb3, 0x8f, 0x3, 0xa5, 0x7c, 0xa7, 0x3f, 0x5d, 0x14, 0x13, 0xab, 0x8f, 0xad, 0xc6, 0xa3, 0xcd, 0x7a, 0x68, 0x84, 0x3d, 0x6a, 0x52, 0xa3, 0x48, 0xc7, 0x32, 0x80, 0xe3, 0x27, 0x99, 0x47, 0xab, 0x3f, 0xe7, 0xc, 0x43, 0xfa, 0x29, 0x36, 0xad, 0x91, 0x44, 0x4c, 0x61, 0x71, 0x2c, 0xb, 0xaf, 0xc5, 0x11, 0x16, 0x21, 0xc, 0xa5, 0x3f, 0xde, 0xce, 0x83, 0x80, 0x33, 0x2, 0xba, 0x89, 0x68, 0x6e, 0x32, 0xfe, 0xf0, 0x77, 0x59, 0x19, 0xa, 0xee, 0x5a, 0xbc, 0x4b, 0xf, 0x5d, 0x90, 0xea, 0x1, 0x23, 0x2e, 0xe9, 0x3d, 0x75, 0xa3, 0x9c, 0x20, 0xe3, 0xb6, 0xbb, 0x5f, 0xc8, 0x3c, 0xb0, 0xcc, 0x7e, 0x48, 0xb1, 0xd7, 0x3, 0xf, 0xb9, 0xcc, 0x1f, 0x94, 0x10, 0xc7, 0x38, 0x2a, 0x9c, 0xfa, 0xed, 0xce, 0x24, 0x67, 0x23, 0x38, 0x6c, 0x75, 0x23, 0x3, 0x2d, 0x19, 0x58, 0x22, 0x90, 0x3a, 0x8e, 0x3, 0x5e, 0xea, 0x19, 0xe5, 0x50, 0xb1, 0x91, 0x75, 0x42, 0xc7, 0x65, 0x28, 0xba, 0xdc, 0x48, 0xdb, 0x93, 0x81, 0x5e, 0xb2, 0xcf, 0x12, 0x8c, 0x70, 0xea, 0x3b, 0x63, 0xae, 0xb4, 0xdd, 0x21, 0xf8, 0x81, 0xf1, 0x2e, 0x10, 0xae, 0xda, 0xd9, 0x89, 0xa0, 0x24, 0x30, 0x92, 0x9d, 0x9d, 0xea, 0x6a, 0x87, 0xa0, 0x2d, 0x12, 0xc4, 0x71, 0x9, 0x9c, 0xe1, 0xbb, 0x3b, 0xea, 0x63, 0x1a, 0xc, 0x8d, 0x6f, 0x1, 0x76, 0x80, 0x89, 0x3b, 0x13, 0xb7, 0xa6, 0xae, 0x5d, 0xcc, 0xcc, 0xa5, 0x7d, 0xe9, 0xf6, 0x6, 0xe3, 0x8e, 0xe, 0x51, 0x8c, 0xaa, 0xe, 0xb0, 0xc5, 0x8f, 0x4a, 0x68, 0x33, 0xbf, 0x3f, 0xb9, 0x79, 0x35, 0x31, 0x15, 0x23, 0x17, 0x6b, 0xf6, 0xa6, 0x5f, 0x7f, 0xe6, 0x8c, 0x74, 0x86, 0xce, 0xf6, 0x81, 0x58, 0x81, 0x10, 0x8b, 0xd5, 0xea, 0x18, 0xd3, 0xce, 0xc1, 0x93, 0x33, 0xf3, 0xf2, 0x5b, 0x77, 0x62, 0x86, 0xf2, 0x6f, 0x83, 0x7d, 0x4, 0xc9, 0xc0, 0x7a, 0x61, 0x2f, 0x8e, 0x4a, 0xaf, 0x2b, 0xf2, 0xc3, 0xa6, 0xa6, 0x6d, 0x17, 0xde, 0x9e, 0xd2, 0x77, 0x63, 0xda, 0x7, 0x16, 0x21, 0x5f, 0xa5, 0x40, 0x91, 0xe3, 0x52, 0x14, 0x56, 0x38, 0x8b, 0x85, 0x56, 0x3c, 0x1b, 0xfe, 0x67, 0xc2, 0xd3, 0xd, 0x7a, 0x22, 0x55, 0x7d, 0xdd, 0x4b, 0xc0, 0x66, 0x9, 0x4e, 0x40, 0xe6, 0x55, 0xfe, 0xd2, 0xfb, 0xbc, 0xfc, 0x9c, 0xea, 0x49, 0xcf, 0x81, 0x59, 0x32, 0x7, 0x89, 0x78, 0x7f, 0x23, 0x49, 0xe5, 0xd9, 0xb4, 0xfc, 0x53, 0xf9, 0xbe, 0x43, 0xc4, 0xd6, 0x80, 0x34, 0xeb, 0xa6, 0xd8, 0x84, 0x98, 0x86, 0xb1, 0x48, 0x30, 0xa1, 0xb6, 0x35, 0x8a, 0xa, 0xa9, 0xe9, 0x65, 0x16, 0x47, 0xe4, 0xb4, 0xc0, 0x6, 0x30, 0x65, 0xd, 0x38, 0xbf, 0x45, 0x3b, 0xae, 0xe9, 0x4f, 0xd, 0x82, 0x3f, 0x8f, 0x71, 0x3b, 0x9a, 0x97, 0xa0, 0x35, 0x4a, 0x24, 0xaf, 0x70, 0xa8, 0xae, 0x2, 0xa9, 0x46, 0xae, 0x99, 0xdc, 0xbe, 0x7c, 0xf5, 0xfc, 0xb9, 0xa9, 0x93, 0xe7, 0xb7, 0x79, 0x3f, 0xca, 0xf2, 0x74, 0x28, 0xeb, 0xbe, 0x1d, 0x23, 0xf2, 0xb8, 0xad, 0x85, 0xdf, 0x64, 0x67, 0xe, 0x6, 0x2, 0x63, 0x54, 0xd5, 0xeb, 0x57, 0xd2, 0x20, 0x33, 0x36, 0xe1, 0x22, 0x8d, 0x79, 0x3e, 0x57, 0xfd, 0xd9, 0xed, 0x7d, 0xb6, 0xeb, 0xf5, 0x85, 0x5f, 0x28, 0xc9, 0x55, 0xeb, 0x8a, 0x13, 0xd6, 0xac, 0xa, 0xf0, 0x85, 0x68, 0xd8, 0xa4, 0x1d, 0x79, 0x79, 0x23, 0x5f, 0xb0, 0x44, 0x67, 0x82, 0x5e, 0x16, 0xed, 0x48, 0x45, 0x28, 0xe8, 0xf5, 0xe5, 0x9e, 0xb8, 0x61, 0xb6, 0x85, 0xcc, 0x48, 0xd5, 0x9f, 0x89, 0x86, 0xc5, 0x89, 0xc0, 0x37, 0x70, 0x25, 0xb2, 0xc, 0x29, 0xf9, 0x6f, 0x30, 0x47, 0x9b, 0xf4, 0xec, 0x77, 0x6, 0xeb, 0x2e, 0xba, 0x56, 0xb5, 0xa2, 0xca, 0x11, 0x92, 0x32, 0x6b, 0xd8, 0xd1, 0x7b, 0x33, 0x39, 0x8e, 0x25, 0x26, 0x2a, 0x91, 0xc2, 0xc8, 0x79, 0xb5, 0xa9, 0xc5, 0x4d, 0xe6, 0x42, 0x19, 0x74, 0x87, 0x3d, 0x44, 0x16, 0xc, 0x40, 0x11, 0xf8, 0xf8, 0xa2, 0xc9, 0x6b, 0xe, 0x4e, 0xeb, 0x9e, 0x35, 0x69, 0x9c, 0x81, 0x4b, 0x21, 0xc, 0xce, 0x73, 0x72, 0xbe, 0xe1, 0x81, 0x15, 0xb6, 0x84, 0x81, 0xfb, 0x9a, 0x42, 0xff, 0x6, 0xcd, 0x74, 0x9d, 0xe, 0x1, 0xa1, 0xac, 0xee, 0xa3, 0xac, 0xdf, 0xc7, 0x17, 0x9c, 0x2b, 0xaa, 0x63, 0x80, 0xd3, 0x6c, 0xc8, 0x74, 0xff, 0x14, 0x46, 0x73, 0xb3, 0xc4, 0x95, 0x85, 0xcc, 0x62, 0xf, 0x99, 0xca, 0x0, 0xde, 0xa3, 0xe5, 0x3b, 0xc, 0xca, 0x13, 0xd2, 0xbe, 0xd9, 0xf5, 0xe9, 0x8c, 0xdf, 0x8a, 0x7, 0x86, 0x78, 0x44, 0x44, 0xd4, 0x5c, 0xe3, 0x7c, 0xb2, 0xdd, 0x82, 0x83, 0xee, 0x26, 0x1d, 0x58, 0x7c, 0x9c, 0x8e, 0x63, 0x9d, 0x35, 0xc5, 0xdc, 0x17, 0xcf, 0x3d, 0xae, 0x28, 0xb7, 0xab, 0x73, 0x82, 0xee, 0x47, 0xf0, 0x21, 0xf8, 0x26, 0x29, 0x11, 0x1d, 0x74, 0x1a, 0x49, 0x50, 0x77, 0x84, 0x49, 0x11, 0xb9, 0xdf, 0xe0, 0xfd, 0x61, 0xa7, 0x7f, 0x68, 0xab, 0x35, 0xa4, 0x7e, 0x22, 0x80, 0x25, 0x2c, 0x3f, 0x7e, 0xce, 0x91, 0x94, 0xdb, 0x8b, 0x6b, 0x56, 0x2b, 0xfb, 0x53, 0xa5, 0x3, 0x3a, 0xb2, 0x78, 0x7f, 0x5, 0x4e, 0xe7, 0x41, 0xe1, 0x6c, 0xd9, 0x90, 0xe4, 0x89, 0xc3, 0x25, 0x65, 0x79, 0x75, 0x7e, 0x1a, 0xa3, 0x25, 0x57, 0xc9, 0xb, 0x6, 0xfd, 0x20, 0x12, 0x91, 0x67, 0xc5, 0x1e, 0xd6, 0xb, 0x8b, 0x40, 0x3c, 0x3a, 0x6e, 0x71, 0xa9, 0xeb, 0xeb, 0xe8, 0xf7, 0x6b, 0xcd, 0x31, 0x70, 0xb6, 0xe6, 0xbe, 0xa6, 0x6c, 0x32, 0xa7, 0xd7, 0x41, 0xf2, 0x99, 0x56, 0x35, 0x95, 0x60, 0x9d, 0x34, 0x1a, 0x0, 0xd7, 0xdb, 0x4a, 0xee, 0x91, 0xe4, 0x89, 0xaa, 0x6a, 0xbf, 0x35, 0xb, 0x46, 0x75, 0x6f, 0x13, 0xf4, 0x76, 0x0, 0x7f, 0x3d, 0xda, 0x64, 0x92, 0xba, 0x18, 0x9a, 0xd1, 0x8b, 0xa2, 0xa7, 0x62, 0xcd, 0xd2, 0xb2, 0x6e, 0x71, 0xc9, 0x61, 0x87, 0x1f, 0x94, 0xba, 0xcd, 0x5d, 0x4a, 0xbe, 0xa3, 0x8b, 0x51, 0x50, 0x15, 0xd2, 0x62, 0x7d, 0xcf, 0x82, 0xc9, 0xd3, 0x20, 0x50, 0x81, 0xba, 0x23, 0x9d, 0xe2, 0x36, 0x1f, 0x9e, 0x3f, 0x76, 0x92, 0xf0, 0xb, 0xae, 0x48, 0x7, 0x70, 0x3a, 0x1d, 0x6b, 0x7e, 0x52, 0x7a, 0xe3, 0x85, 0x1a, 0x58, 0x97, 0x90, 0xa8, 0xb4, 0xe5, 0x8b, 0x15, 0xdc, 0xf, 0x52, 0x1a, 0x1f, 0x6e, 0x72, 0x7d, 0x16, 0x7d, 0xb3, 0x8d, 0xf9, 0x62, 0xe8, 0x13, 0x11, 0x6e, 0x78, 0x2, 0x88, 0x18, 0xfc, 0xce, 0x6b, 0x96, 0x98, 0xc3, 0xc3, 0x0, 0x6e, 0x63, 0x18, 0x43, 0xb3, 0x54, 0xb7, 0x91, 0x19, 0x3b, 0xf5, 0x68, 0xa1, 0xb6, 0x6f, 0xe5, 0x2f, 0x4c, 0xb8, 0x55, 0x1b, 0x18, 0x87, 0x8c, 0xbc, 0x21, 0x27, 0x10, 0xc9, 0x86, 0x16, 0x2a, 0xe, 0x3, 0x95, 0x60, 0x6, 0x49, 0xc6, 0xda, 0x55, 0xdf, 0x97, 0x2f, 0xeb, 0xfd, 0x18, 0x31, 0xd2, 0x27, 0x7c, 0xfc, 0x2c, 0xd5, 0x10, 0xb9, 0x31, 0x87, 0x11, 0x9c, 0xe0, 0x1, 0x2a, 0xd8, 0x3c, 0x39, 0xcd, 0x82, 0x61, 0xc4, 0xb6, 0x28, 0xe3, 0x8, 0x75, 0x65, 0xdd, 0xd7, 0x5e, 0xfa, 0xa8, 0x1d, 0x68, 0x1b, 0xca, 0x2, 0x64, 0x2d, 0x27, 0x9f, 0xce, 0x86, 0xbe, 0x3a, 0x60, 0x9c, 0x7c, 0x16, 0x29, 0x5c, 0x43, 0x63, 0x93, 0x42, 0x2a, 0x5a, 0xc4, 0xc1, 0xf7, 0x14, 0x48, 0xcd, 0xca, 0x22, 0x9a, 0x22, 0x62, 0x65, 0x14, 0xc, 0x47, 0x3b, 0x32, 0x31, 0x64, 0x52, 0xb4, 0x18, 0xe4, 0x36, 0xd5, 0x1a, 0x4e, 0xcd, 0x40, 0xc0, 0x3b, 0x93, 0x1, 0x3d, 0xdd, 0xf, 0x43, 0x23, 0x90, 0x64, 0x7, 0xde, 0x6d, 0x3e, 0x3d, 0xb1, 0x23, 0x95, 0x2e, 0xef, 0x64, 0x5, 0x4b, 0x4f, 0xbc, 0x79, 0x90, 0x5, 0x31, 0xd, 0x8c, 0x58, 0x3d, 0x7d, 0x83, 0x67, 0x69, 0x6c, 0x49, 0x5f, 0x3b, 0x12, 0x89, 0x60, 0xf6, 0x79, 0x3a, 0xb0, 0x9a, 0xf0, 0x36, 0x9e, 0x14, 0xb2, 0xef, 0x5b, 0xbb, 0x10, 0x4a, 0xca, 0x63, 0xf1, 0x3, 0x98, 0x9, 0xe2, 0x6, 0x45, 0x70, 0x29, 0xd0, 0xab, 0x3b, 0x5a, 0x1b, 0x0, 0xaf, 0xf0, 0x56, 0xd, 0xe, 0x88, 0x70, 0xec, 0xcf, 0xf4, 0x7a, 0x3f, 0x91, 0x3d, 0xbe, 0x6f, 0xa6, 0x32, 0x73, 0xbd, 0xb4, 0xce, 0x7e, 0x4a, 0xc8, 0xe6, 0x32, 0x55, 0x8f, 0x22, 0x9c, 0x9a, 0xa7, 0xc4, 0xed, 0x9a, 0x69, 0x2f, 0xa3, 0x9e, 0x14, 0x99, 0x29, 0x70, 0x61, 0x18, 0x72, 0x11, 0x8e, 0x6c, 0x6d, 0x52, 0x6e, 0x54, 0x45, 0x4f, 0x49, 0x74, 0xad, 0xfe, 0xe7, 0xef, 0x89, 0x39, 0xb5, 0x3c, 0x2b, 0x31, 0xb0, 0x2f, 0xe4, 0xe, 0xe6, 0xa2, 0xb9, 0x23, 0x48, 0xe, 0x67, 0xd, 0xfd, 0x58, 0xf8, 0x6d, 0x63, 0x2c, 0x49, 0x7e, 0xab, 0xca, 0xeb, 0x70, 0x46, 0x2c, 0xd3, 0xfc, 0x72, 0xe0, 0x40, 0x1d, 0x4e, 0x34, 0xb2, 0x66, 0x6a, 0x7a, 0x45, 0xfe, 0xdc, 0x37, 0x8f, 0x2a, 0x1f, 0xc8, 0xde, 0xd5, 0xf9, 0x40, 0xab, 0x3e, 0xf8, 0xd5, 0x61, 0x3c, 0x4, 0xdf, 0xf1, 0x76, 0x27, 0xa8, 0x5c, 0x7c, 0x67, 0x46, 0xf8, 0x1e, 0x68, 0x74, 0x21, 0x28, 0x16, 0x6d, 0x51, 0x4f, 0x1f, 0x24, 0x7c, 0x4f, 0x37, 0x1, 0x1f, 0xc3, 0x94, 0x49, 0xf5, 0xc, 0x21, 0xf, 0xdf, 0x67, 0x83, 0x3c, 0x25, 0x20, 0x18, 0xe9, 0x20, 0xeb, 0xbe, 0x4d, 0xc9, 0xe7, 0x41, 0xb6, 0x62, 0x4, 0xc2, 0xaa, 0x19, 0x50, 0xcf, 0x49, 0x8b, 0xf0, 0x34, 0x28, 0xc2, 0x6d, 0x5a, 0x5d, 0x8e, 0x4b, 0xc7, 0xe8, 0x47, 0x6a, 0xcb, 0x2a, 0xf4, 0xdc, 0xc, 0x16, 0x78, 0xb9, 0x68, 0x35, 0x3a, 0x75, 0x64, 0x53, 0x7a, 0x71, 0xeb, 0xd1, 0x6c, 0x47, 0xd5, 0x28, 0x4a, 0x11, 0xbc, 0x8f, 0x8c, 0x3f, 0xbc, 0x60, 0x3, 0xec, 0xb6, 0xc6, 0xf4, 0xd1, 0x94, 0xe8, 0xf6, 0x9b, 0xcd, 0xb3, 0x18, 0x27, 0x8, 0x6b, 0x52, 0xbf, 0x7f, 0x11, 0x12, 0xa8, 0x52, 0xf9, 0x73, 0xf5, 0x5b, 0x94, 0x11, 0xb0, 0x64, 0xe8, 0x2b, 0x64, 0x9b, 0x9, 0x42, 0xa5, 0x8e, 0xf1, 0x86, 0xe2, 0x8c, 0x54, 0x7, 0x8a, 0xb2, 0x70, 0x27, 0x9c, 0x1c, 0x5c, 0x29, 0x28, 0xf, 0x39, 0x97, 0xc3, 0x6, 0x52, 0xcb, 0x43, 0x6a, 0x2e, 0x67, 0xf8, 0xda, 0xba, 0x8e, 0x73, 0x2b, 0x50, 0x66, 0x7, 0x4c, 0xa0, 0xf9, 0x8e, 0xfe, 0xba, 0x27, 0x4, 0xae, 0xf6, 0x1b, 0x2f, 0x43, 0xda, 0x74, 0x3b, 0x40, 0x8d, 0x27, 0x68, 0x82, 0x1d, 0x27, 0x57, 0x1b, 0x47, 0x93, 0xac, 0x91, 0x8b, 0x1, 0x1f, 0xc5, 0x76, 0xb2, 0x69, 0x68, 0x9, 0x1, 0xd2, 0x7d, 0xc5, 0x6d, 0x1, 0xc1, 0x79, 0x5b, 0xa5, 0x80, 0x6c, 0x80, 0x5e, 0x34, 0x23, 0xb6, 0x88, 0x20, 0xd7, 0xe9, 0x49, 0x43, 0xd2, 0x89, 0xe0, 0xf6, 0x9c, 0x3e, 0x3, 0x7a, 0x31, 0xd5, 0xea, 0xf8, 0xc8, 0x73, 0x9d, 0x1a, 0xc6, 0x5b, 0x3d, 0x5a, 0xf, 0xf1, 0xc8, 0xc2, 0xf9, 0x48, 0x7, 0x95, 0x6b, 0x8, 0xdf, 0x14, 0x24, 0x47, 0x92, 0x9b, 0x54, 0xae, 0xdf, 0x8c, 0x81, 0x79, 0xbf, 0x15, 0xa4, 0x62, 0x7a, 0xa7, 0x24, 0x3d, 0x76, 0x29, 0xb2, 0xd3, 0x9f, 0xf5, 0x2d, 0xb9, 0x44, 0xcf, 0x1f, 0xe7, 0x8e, 0xf, 0x45, 0x80, 0x86, 0x99, 0xa, 0xdb, 0xfd, 0xdd, 0x63, 0x27, 0xf2, 0xbc, 0x68, 0x96, 0x7a, 0x8c, 0x28, 0x8c, 0xf6, 0xe2, 0x92, 0x3, 0x35, 0x9b, 0xd0, 0xd7, 0x7a, 0xdd, 0x6, 0x65, 0x82, 0x54, 0x3d, 0xa, 0x4f, 0x9d, 0xce, 0xcd, 0xc1, 0xda, 0x43, 0x9b, 0xb8, 0x63, 0x8b, 0x45, 0x61, 0x4f, 0x15, 0x8d, 0x3b, 0x97, 0x9c, 0x12, 0xd0, 0xa4, 0xbd, 0x77, 0x96, 0x44, 0x5c, 0xc5, 0xd0, 0x7d, 0x7c, 0xc3, 0xd2, 0xab, 0xbb, 0x25, 0x57, 0x63, 0xa9, 0xa6, 0x63, 0xf3, 0xd7, 0xad, 0xf2, 0x63, 0x7e, 0x5b, 0xdf, 0xf1, 0x73, 0x2e, 0x82, 0x37, 0xce, 0x9d, 0x71, 0x1f, 0xb9, 0xb2, 0x6a, 0xa1, 0xe5, 0xe1, 0x3c, 0x16, 0xa0, 0x5b, 0x23, 0x98, 0x48, 0xe4, 0xad, 0x15, 0xe5, 0xf6, 0x32, 0x9c, 0x75, 0xf2, 0xcf, 0xee, 0x15, 0x86, 0xf8, 0xf1, 0xe2, 0xa5, 0xce, 0xab, 0xa6, 0xeb, 0x19, 0xd, 0x6c, 0xb, 0xe4, 0xee, 0x9e, 0x64, 0x45, 0xc4, 0xaa, 0x6c, 0xe, 0xe1, 0x65, 0xb4, 0x83, 0xf2, 0xb4, 0x59, 0x2d, 0x21, 0x29, 0xf7, 0xf2, 0x4, 0x67, 0xd7, 0x92, 0xee, 0xd1, 0x70, 0x83, 0x73, 0x4e, 0x8d, 0xb5, 0x1e, 0x6c, 0xea, 0x8b, 0xc2, 0xca, 0xfb, 0x5, 0x8e, 0xf2, 0x4e, 0x8b, 0x21, 0x84, 0x2c, 0xd, 0x6e, 0x6c, 0x7e, 0xd0, 0xf7, 0x52, 0x2c, 0x16, 0x96, 0xe0, 0xf, 0xf0, 0x4c, 0x13, 0xd8, 0xc3, 0x8c, 0x8c, 0xe4, 0x9a, 0xe5, 0x31, 0x4a, 0x82, 0x7b, 0xb8, 0x5f, 0x66, 0xe5, 0xa, 0x5c, 0xa7, 0x26, 0xbd, 0xb2, 0x5a, 0xf1, 0x2e, 0xdc, 0x65, 0x17, 0x78, 0x5b, 0xf5, 0xae, 0xeb, 0x63, 0x5e, 0x58, 0x39, 0x53, 0x3c, 0xc8, 0x6c, 0x4f, 0xe4, 0x78, 0xfc, 0xab, 0x1, 0xe2, 0x8a, 0xd0, 0x56, 0x2a, 0xbe, 0x1f, 0x9a, 0xee, 0xe7, 0x98, 0xa2, 0x89, 0x14, 0xe, 0xdd, 0x97, 0x48, 0xa, 0x7f, 0x98, 0x3d, 0xe9, 0x36, 0x87, 0x9f, 0xc0, 0x37, 0xa4, 0x79, 0xea, 0xb8, 0x0, 0x7a, 0x42, 0xfa, 0xe9, 0x89, 0xaf, 0xe4, 0x39, 0x2b, 0x3e, 0xf1, 0x38, 0x81, 0x7e, 0x2f, 0x2d, 0x1c, 0x45, 0xb0, 0x8b, 0x14, 0x37, 0x11, 0xe4, 0xcd, 0x8, 0x41, 0xe5, 0x50, 0xd, 0xc7, 0x68, 0x69, 0x1, 0x91, 0x12, 0x47, 0xdd, 0xe1, 0xee, 0xdc, 0x2b, 0x67, 0x43, 0xc6, 0x47, 0xc8, 0xe2, 0xcc, 0xca, 0xc0, 0x4e, 0xaf, 0x45, 0x9f, 0x6b, 0x49, 0x6a, 0x2c, 0x4, 0x34, 0x60, 0xf3, 0x36, 0x8, 0x2a, 0xea, 0x62, 0x6c, 0xb, 0x90, 0xf3, 0xa1, 0x14, 0x40, 0xf5, 0xf1, 0x3e, 0x63, 0x93, 0xfa, 0xe7, 0x93, 0x6d, 0xa7, 0x72, 0xa, 0xb3, 0x23, 0xd3, 0x51, 0xe4, 0xea, 0xf, 0xb5, 0xc8, 0xee, 0xff, 0x87, 0xef, 0x4, 0xbd, 0x72, 0xc1, 0xaf, 0x4e, 0x7, 0x40, 0x48, 0x6c, 0x1b, 0x1e, 0xdb, 0x3b, 0x2, 0x2, 0xbe, 0xe6, 0xa1, 0xd5, 0x10, 0xe1, 0xae, 0x5a, 0x66, 0x15, 0xae, 0xe1, 0x24, 0x1c, 0x27, 0x9d, 0x9c, 0x7c, 0x89, 0xf6, 0xe, 0xfa, 0x7, 0xb6, 0x22, 0x9d, 0x2a, 0x66, 0xa0, 0x1, 0x47, 0xf1, 0x22, 0x67, 0xce, 0x64, 0xc3, 0x18, 0x4c, 0xf7, 0x21, 0x75, 0x6d, 0x14, 0x46, 0x4, 0xb8, 0xab, 0xa8, 0x9f, 0x4e, 0x7a, 0x77, 0x39, 0x27, 0xe4, 0xea, 0x8d, 0xc, 0xb3, 0xa7, 0x36, 0x3e, 0x58, 0x2e, 0xb6, 0x5a, 0x5f, 0xac, 0xb4, 0xa9, 0x39, 0xa, 0xdf, 0xa2, 0x9f, 0xef, 0xac, 0x39, 0x90, 0x65, 0x5d, 0x4, 0xa6, 0x29, 0xc9, 0x7e, 0x2f, 0x26, 0xfc, 0x6e, 0x9d, 0x4d, 0xe1, 0x9d, 0x8d, 0x53, 0x5, 0x2d, 0xd6, 0xe6, 0x15, 0xe0, 0xf9, 0x88, 0xc4, 0x7e, 0xa7, 0x42, 0xee, 0x42, 0x8a, 0x2c, 0x89, 0x65, 0x63, 0x83, 0xae, 0xfd, 0x33, 0xf5, 0x1a, 0x1b, 0xdd, 0xab, 0x90, 0xcb, 0xa, 0xf, 0x75, 0x76, 0x25, 0x3d, 0x7c, 0xc8, 0xc9, 0x6c, 0xc7, 0x5a, 0xc5, 0xa, 0xfa, 0x5, 0xaa, 0x75, 0x52, 0x2e, 0x30, 0xb4, 0xc3, 0x9e, 0xc1, 0x2d, 0xef, 0x1d, 0xb3, 0xcb, 0xe2, 0x7b, 0x35, 0x6, 0x38, 0x51, 0xb7, 0x3d, 0x5f, 0x8e, 0xf9, 0x9, 0xf5, 0x0, 0xdf, 0x74, 0x64, 0x89, 0xbd, 0xeb, 0x28, 0x1e, 0x5f, 0xa7, 0x9b, 0x51, 0xd5, 0xde, 0xab, 0xe7, 0x9b, 0x51, 0x74, 0x10, 0x44, 0xb7, 0xc8, 0xb8, 0x58, 0xd3, 0x3, 0xa9, 0xd9, 0x10, 0xe, 0xb, 0xb1, 0x0, 0x4d, 0xb7, 0x52, 0xda, 0x28, 0xb1, 0xb0, 0x92, 0x63, 0x4, 0xc9, 0x75, 0xb, 0x98, 0xa2, 0x44, 0x67, 0x6c, 0xf9, 0xf7, 0xa8, 0xae, 0xb0, 0x5, 0xc3, 0x32, 0xf9, 0x2c, 0x18, 0x1d, 0x42, 0x2e, 0x4, 0xca, 0x36, 0x46, 0x9e, 0x50, 0x5d, 0xfc, 0xf6, 0xdf, 0x76, 0xd6, 0x5f, 0xe0, 0x1f, 0xcb, 0x47, 0xb, 0x96, 0xa8, 0x9b, 0x91, 0x42, 0xc6, 0x69, 0x6d, 0xde, 0x65, 0x1, 0x6, 0x23, 0xd0, 0x40, 0x9a, 0xb2, 0xb8, 0xd6, 0x4e, 0xf4, 0x3b, 0x78, 0xbd, 0x98, 0xd0, 0x6e, 0xfb, 0x19, 0x4e, 0xc8, 0x23, 0x61, 0xbe, 0xff, 0xf7, 0x9, 0x1f, 0x60, 0x3a, 0x4a, 0xe2, 0xa0, 0xc5, 0x89, 0xae, 0x87, 0x2a, 0xac, 0x5, 0x5e, 0x9c, 0x4e, 0x86, 0x7, 0x0, 0x5e, 0x2c, 0x39, 0xfd, 0x9e, 0xf, 0x85, 0xde, 0x1b, 0x51, 0xe2, 0x7f, 0x66, 0x9f, 0xc2, 0x8f, 0x29, 0x31, 0x84, 0x6d, 0x40, 0xcf, 0xf5, 0x5d, 0xd0, 0xc0, 0x79, 0xc8, 0x10, 0xb, 0xf9, 0x12, 0xf0, 0x38, 0x0, 0x1d, 0x9b, 0x3e, 0xfb, 0x99, 0x97, 0x8c, 0xa, 0x7a, 0x4e, 0xc0, 0x84, 0x86, 0xe9, 0xc8, 0x96, 0xd4, 0x2, 0x61, 0xb7, 0x75, 0xa6, 0x6d, 0x17, 0x13, 0x3b, 0xa6, 0xde, 0x69, 0x53, 0xf5, 0xdd, 0xef, 0xc2, 0xaf, 0x2f, 0xb9, 0x63, 0xac, 0x24, 0x6f, 0xf0, 0xbf, 0x70, 0xdd, 0x6a, 0x92, 0x6e, 0x42, 0x37, 0x1a, 0x1e, 0xcf, 0x18, 0xfa, 0xfd, 0xad, 0x37, 0x35, 0x77, 0x52, 0xb5, 0x84, 0x59, 0x63, 0xea, 0x11, 0xd2, 0x24, 0xed, 0x1a, 0x8c, 0x4d, 0xed, 0x7e, 0xb1, 0x67, 0x8b, 0xb, 0x14, 0x74, 0xde, 0xe9, 0x5d, 0x57, 0xff, 0x8b, 0x76, 0xc8, 0x1, 0x25, 0x74, 0x89, 0x9b, 0xe5, 0xb3, 0x51, 0x5a, 0x43, 0xe4, 0xc9, 0xa1, 0x33, 0x41, 0x55, 0x39, 0x61, 0x13, 0x59, 0xee, 0xb, 0x44, 0x73, 0x69, 0xf4, 0x87, 0xe4, 0x1, 0xc4, 0x0, 0xf8, 0x10, 0x47, 0x71, 0xc9, 0x46, 0xc4, 0xd6, 0xce, 0x4b, 0xcf, 0xc0, 0x68, 0x53, 0x4d, 0x6c, 0xd6, 0x7f, 0xaa, 0xe0, 0x37, 0xfc, 0x68, 0xfc, 0x1a, 0x81, 0x5d, 0xde, 0x57, 0xa0, 0xc2, 0xb7, 0x72, 0xbd, 0xfe, 0x61, 0xe8, 0x25, 0x47, 0xbe, 0x91, 0x2b, 0xff, 0x90, 0x1e, 0x0, 0x81, 0x5e, 0xf6, 0xbf, 0xa, 0x71, 0xf3, 0x4, 0xef, 0xc5, 0x76, 0x34, 0xeb, 0x15, 0xb7, 0xa2, 0xd, 0x3c, 0x1b, 0xb5, 0xda, 0xcc, 0x2b, 0x65, 0xc0, 0x2c, 0xa5, 0x40, 0x38, 0x88, 0x56, 0xa8, 0xe4, 0xf5, 0x9d, 0x7d, 0xfc, 0xd1, 0x88, 0xfc, 0xf, 0x7, 0x53, 0x39, 0xbc, 0xeb, 0xc1, 0xed, 0xef, 0x91, 0x7d, 0x94, 0xf, 0x34, 0xcf, 0x11, 0xbd, 0x6d, 0xbb, 0xbe, 0xdd, 0x1e, 0x3, 0xe2, 0x19, 0xc6, 0x45, 0xaa, 0x97, 0x82, 0xa6, 0xd2, 0x2b, 0x96, 0x6f, 0x82, 0x54, 0x63, 0xc7, 0xed, 0x12, 0xfa, 0x67, 0x3f, 0x3f, 0xba, 0x8d, 0xd8, 0x7a, 0xfc, 0x1d, 0xf, 0x22, 0x25, 0x1, 0xc8, 0x83, 0x86, 0x81, 0x9f, 0x5, 0x5d, 0x64, 0x57, 0x38, 0x2d, 0x6e, 0xf2, 0x77, 0x5, 0xd, 0xe8, 0x53, 0xa4, 0x46, 0xc6, 0x74, 0xa5, 0xc, 0xe3, 0xf4, 0xb8, 0x71, 0x6c, 0xd1, 0x89, 0x29, 0xfa, 0x3d, 0xc6, 0xfb, 0xab, 0x2d, 0x9e, 0xeb, 0x5c, 0xde, 0xdf, 0x5e, 0x6, 0x33, 0x60, 0xc6, 0x45, 0x3c, 0xf, 0x1f, 0x1d, 0x2b, 0x7, 0xec, 0x29, 0xd4, 0xb8, 0x2a, 0xbc, 0xd0, 0xc, 0x89, 0x1f, 0x47, 0xc2, 0x8c, 0x43, 0x47, 0xe7, 0x9e, 0x67, 0x9d, 0x31, 0x56, 0xe8, 0x1c, 0x13, 0xba, 0x4e, 0xb2, 0x87, 0x28, 0xa2, 0x20, 0x75, 0x8c, 0xc7, 0x4c, 0xd6, 0xc9, 0x47, 0x58, 0x79, 0x7b, 0xb2, 0x6c, 0x9b, 0x1b, 0x62, 0x50, 0x6c, 0xab, 0x22, 0x80, 0xdf, 0xf8, 0x9b, 0x9, 0x7, 0x1d, 0xda, 0x4e, 0xc0, 0xeb, 0x62, 0xf8, 0x48, 0x16, 0x3c, 0x60, 0xe1, 0xed, 0x32, 0x27, 0xd1, 0x50, 0x94, 0x9a, 0x5c, 0xf, 0xe, 0xa8, 0x19, 0xfc, 0xb4, 0x29, 0xb4, 0x54, 0x7f, 0x25, 0xe2, 0x15, 0x5, 0x46, 0x45, 0xc6, 0xb2, 0xd3, 0x66, 0xd6, 0xad, 0x3c, 0x45, 0xbc, 0xb7, 0xe2, 0x8d, 0xf8, 0xc1, 0xb, 0xbc, 0xa7, 0x0, 0x39, 0x20, 0xaf, 0xd3, 0xab, 0xa6, 0x47, 0x6e, 0xd8, 0xbc, 0xfb, 0xef, 0x2, 0x85, 0x12, 0xac, 0x1c, 0x91, 0x69, 0x54, 0x96, 0xec, 0x42, 0x2, 0x55, 0x2d, 0x7e, 0x1, 0xe0, 0x29, 0x92, 0x76, 0x9f, 0xe, 0x85, 0x98, 0x97, 0x65, 0x8f, 0x7, 0x3f, 0x63, 0xef, 0x51, 0xf7, 0x4c, 0x49, 0xd4, 0x87, 0xfb, 0x10, 0xee, 0x51, 0xd5, 0xa2, 0xe2, 0x66, 0x60, 0xa6, 0x9, 0x7e, 0x72, 0xd8, 0xf1, 0xa8, 0x87, 0x8d, 0x14, 0x1, 0x2c, 0xab, 0x8b, 0xd0, 0x0, 0xfe, 0x33, 0x4f, 0x42, 0xf1, 0xe4, 0xa8, 0x6d, 0x71, 0x4e, 0x9a, 0xcf, 0xf0, 0x17, 0x6d, 0x46, 0x19, 0xcb, 0xf5, 0x3b, 0x10, 0x20, 0x50, 0xff, 0xc0, 0xec, 0x62, 0xd0, 0xd8, 0x97, 0xcf, 0xdc, 0xc4, 0xa, 0xd8, 0x81, 0xaf, 0xd9, 0xc0, 0x80, 0xab, 0xad, 0x7a, 0x1d, 0xff, 0x45, 0x4, 0x1a, 0x7c, 0xa6, 0xf6, 0xd5, 0x60, 0x82, 0xd3, 0x65, 0x6f, 0xb2, 0xcf, 0x91, 0x8, 0xfb, 0x62, 0x6e, 0xd6, 0x91, 0x7d, 0x5c, 0xa5, 0xf, 0x1e, 0xef, 0xcd, 0x72, 0xdb, 0x33, 0xba, 0xc7, 0xe7, 0x47, 0xb2, 0x74, 0x7c, 0xfa, 0x9, 0xbc, 0x7c, 0x1, 0x3c, 0x50, 0xa, 0xf5, 0x90, 0x15, 0x93, 0x3c, 0x42, 0xaa, 0x6b, 0x61, 0x60, 0x4f, 0xc5, 0xca, 0x1c, 0x58, 0xf4, 0x1b, 0xeb, 0x7c, 0x85, 0x98, 0x66, 0xb1, 0xa7, 0xac, 0x86, 0xe1, 0x35, 0xe6, 0xac, 0x22, 0x97, 0x65, 0x22, 0xdd, 0x8d, 0x27, 0x7, 0x80, 0xb6, 0x1d, 0x4c, 0x3c, 0x90, 0xa0, 0x2, 0x14, 0xf2, 0x48, 0x89, 0x45, 0x6e, 0x36, 0xa2, 0xbd, 0x6a, 0xb9, 0x14, 0x9c, 0xb4, 0x31, 0x90, 0x31, 0x40, 0xe0, 0x9, 0x4b, 0x9c, 0x32, 0xfe, 0x43, 0x9f, 0xd2, 0xa3, 0x7c, 0x19, 0x97, 0xb1, 0xe2, 0x7, 0x4b, 0x5d, 0xdd, 0x73, 0x71, 0x21, 0xa2, 0x9e, 0x8d, 0xcb, 0xc4, 0x44, 0xd1, 0x14, 0xab, 0x5, 0x11, 0xa4, 0x4e, 0xb0, 0xe8, 0xf1, 0xd8, 0x80, 0xfe, 0x42, 0xa5, 0xdd, 0x92, 0xe6, 0xdc, 0x3, 0xcf, 0xa8, 0x2f, 0x98, 0xe9, 0xfc, 0xcf, 0x22, 0x1a, 0x65, 0xa9, 0x5e, 0x8b, 0xc4, 0x88, 0xad, 0x3f, 0x7f, 0xea, 0xf4, 0xf7, 0x5c, 0xa9, 0x5b, 0x6a, 0x3e, 0x77, 0xdb, 0x62, 0xc7, 0x57, 0x3, 0x82, 0xb4, 0x3f, 0xbd, 0x18, 0xad, 0x58, 0x14, 0x6f, 0xae, 0x39, 0x20, 0x99, 0xa1, 0x4a, 0xb4, 0x25, 0xc5, 0xf3, 0x1d, 0x9a, 0x81, 0x52, 0x3d, 0xed, 0x57, 0x3, 0x78, 0x2d, 0xd4, 0xd4, 0x7a, 0xc7, 0x4d, 0x7e, 0xcf, 0x58, 0xc4, 0x4f, 0xdf, 0xf9, 0x98, 0x79, 0x9a, 0xd4, 0x5e, 0x20, 0x71, 0x1d, 0xb5, 0xa8, 0x65, 0x44, 0xaa, 0x54, 0x92, 0x64, 0xa6, 0xe, 0xee, 0xa0, 0x35, 0xb2, 0x92, 0x9c, 0xe8, 0xe6, 0xaa, 0x4b, 0xa1, 0x93, 0x39, 0x6b, 0xe, 0xbd, 0x3b, 0xa7, 0x31, 0xd0, 0x3d, 0x69, 0xec, 0x60, 0x6d, 0xd0, 0x1c, 0x88, 0x56, 0x71, 0x1b, 0xb9, 0xca, 0x3, 0x4b, 0x57, 0xb3, 0x1d, 0x2f, 0x86, 0x15, 0xd6, 0x1a, 0x6, 0xbb, 0x64, 0x85, 0x1, 0x5b, 0x48, 0x6, 0x1e, 0x18, 0xa0, 0x88, 0x49, 0x43, 0x27, 0x57, 0xc7, 0xc0, 0xc1, 0xd4, 0x1a, 0xd6, 0x2c, 0x4a, 0xd, 0x48, 0xf3, 0x1c, 0xde, 0xe2, 0x3, 0x1a, 0xcf, 0x8a, 0xbc, 0xc7, 0xed, 0xd8, 0xf0, 0x9c, 0x5a, 0x29, 0x68, 0x3, 0x33, 0x3e, 0xf2, 0x7d, 0xa9, 0x46, 0xc5, 0x68, 0x5f, 0xdd, 0xfa, 0xb1, 0xac, 0xf8, 0x96, 0xad, 0x97, 0x55, 0x89, 0xe2, 0xda, 0x1b, 0x67, 0xd5, 0x49, 0xdd, 0xbd, 0xf4, 0x43, 0xdd, 0x21, 0x28, 0xd5, 0xfc, 0x16, 0x1a, 0x14, 0x19, 0x66, 0x12, 0x54, 0xa4, 0xa5, 0xa0, 0x86, 0xd, 0x3, 0xd3, 0x34, 0x5c, 0xc8, 0x5e, 0xe9, 0x3c, 0x21, 0x80, 0x2e, 0x4b, 0xf1, 0x7f, 0x6d, 0x7e, 0xf0, 0x9b, 0xed, 0x3e, 0xce, 0x79, 0xec, 0xa3, 0xa3, 0x21, 0x3e, 0x6c, 0x47, 0xd3, 0xa5, 0xde, 0xca, 0xf2, 0x11, 0xec, 0xb4, 0xaa, 0x36, 0xa9, 0xcc, 0x12, 0x5f, 0xad, 0xd1, 0x7d, 0x1c, 0xe6, 0x34, 0x9e, 0x60, 0x24, 0x17, 0xa2, 0x7b, 0xd6, 0x2f, 0xf3, 0xd, 0x52, 0xcc, 0x2a, 0x7f, 0xa1, 0xa9, 0xa8, 0xe2, 0xfb, 0x6b, 0x17, 0x50, 0xd9, 0x3, 0x60, 0x2f, 0xac, 0x1c, 0x8c, 0xb4, 0xa2, 0x8e, 0x57, 0x62, 0xc0, 0x38, 0x8a, 0xc3, 0x3c, 0xcc, 0x5c, 0x4d, 0xca, 0x21, 0x91, 0x20, 0x45, 0x67, 0x54, 0x7a, 0x6, 0xff, 0x2c, 0x46, 0x9d, 0x13, 0x5d, 0xdf, 0xbf, 0x63, 0x6f, 0x0, 0x50, 0x14, 0xa1, 0x76, 0x13, 0x22, 0xec, 0x9a, 0x2a, 0x33, 0x5e, 0xfe, 0x1a, 0xc8, 0x41, 0xa1, 0xfe, 0xba, 0x99, 0x9a, 0xa0, 0x11, 0x40, 0x16, 0xd4, 0x19, 0x4b, 0x41, 0xe0, 0x7f, 0xd1, 0x9, 0xb6, 0xf3, 0x2a, 0x7, 0x6b, 0xd6, 0xd2, 0x54, 0x55, 0xbc, 0x34, 0xde, 0xf7, 0x27, 0x45, 0x7b, 0x51, 0xbc, 0xaf, 0x29, 0x65, 0xd6, 0x9f, 0x8d, 0xd1, 0x12, 0x21, 0x35, 0xe4, 0x8b, 0xd7, 0xef, 0xd, 0x4e, 0xe1, 0x92, 0x21, 0x94, 0x1e, 0xaf, 0xc0, 0x90, 0x1f, 0x87, 0x65, 0xb4, 0xcf, 0x29, 0x9f, 0x43, 0x9f, 0xc7, 0x32, 0xfa, 0x3b, 0x2a, 0xd8, 0x4d, 0xc0, 0x21, 0xf3, 0x7b, 0xb1, 0xc1, 0xa2, 0xea, 0x54, 0x7f, 0x12, 0xff, 0x18, 0x96, 0x5e, 0xf3, 0x2d, 0x5f, 0x36, 0xa8, 0xdd, 0xf8, 0xe, 0x4d, 0x2, 0x29, 0x2d, 0x85, 0x4a, 0x8c, 0x22, 0x59, 0xc1, 0xe2, 0x5c, 0x39, 0xd3, 0xfe, 0x5a, 0x21, 0xe8, 0x44, 0x9f, 0xb6, 0xe3, 0x58, 0x74, 0xb2, 0x98, 0xf8, 0xc1, 0x16, 0xbc, 0x25, 0x3f, 0xf3, 0xe0, 0x87, 0xf, 0x17, 0x98, 0xc0, 0x39, 0xc3, 0x67, 0xb6, 0xdc, 0x24, 0xae, 0x3e, 0x7, 0xab, 0xa4, 0x2, 0x17, 0xbf, 0x44, 0xfb, 0x8c, 0x23, 0x9c, 0x91, 0xa6, 0xad, 0x75, 0x63, 0xee, 0xdd, 0x11, 0x85, 0x0, 0x53, 0xad, 0x60, 0xdb, 0xb8, 0x85, 0xfa, 0x92, 0xdb, 0xe, 0x21, 0x21, 0xa4, 0x66, 0xa3, 0xb6, 0x50, 0x8f, 0x55, 0x37, 0x4c, 0xeb, 0xf8, 0x7b, 0xdc, 0x7e, 0x25, 0x4f, 0x2e, 0x8, 0xa1, 0x7b, 0xe4, 0x7c, 0x9d, 0x68, 0x35, 0xdf, 0xe2, 0xe, 0xcf, 0xd0, 0xa0, 0x1b, 0x32, 0x8e, 0xc3, 0x8f, 0x8b, 0x8b, 0x5e, 0x74, 0xf, 0x4c, 0xc6, 0x70, 0x94, 0x2f, 0xa2, 0x5f, 0xd6, 0xf5, 0x87, 0x38, 0xa7, 0xbe, 0xef, 0xa7, 0xc2, 0x9b, 0xf8, 0x81, 0xa5, 0x8a, 0xc9, 0xe4, 0xee, 0xa6, 0xb, 0x5a, 0x83, 0x71, 0x1a, 0x29, 0xa3, 0xe9, 0x83, 0xe1, 0x86, 0x3b, 0x4, 0xe4, 0x89, 0xb0, 0x87, 0x54, 0xfb, 0xd2, 0x9b, 0x79, 0x9, 0xef, 0x9d, 0xe4, 0x4d, 0xbe, 0x60, 0xe7, 0xb3, 0xc0, 0x70, 0xa8, 0x9d, 0x39, 0x15, 0xee, 0x89, 0xd3, 0x1d, 0x4e, 0x5e, 0xdb, 0x5, 0x57, 0x91, 0xfa, 0x49, 0x38, 0x1b, 0x81, 0xe, 0xac, 0x5e, 0x94, 0xe1, 0xe5, 0x7c, 0x5c, 0x3f, 0xd, 0xb0, 0xa0, 0x72, 0x17, 0x7c, 0xa1, 0xb5, 0x0, 0x6c, 0x76, 0x26, 0x79, 0x54, 0x5a, 0xe2, 0x60, 0xc3, 0xbf, 0xb6, 0xe9, 0x8c, 0x78, 0x1a, 0x5a, 0x7, 0x95, 0x51, 0x42, 0xe6, 0xf4, 0x32, 0x17, 0x48, 0xa8, 0x56, 0xc7, 0x9d, 0x7a, 0xb5, 0x32, 0x54, 0xf, 0x44, 0xc0, 0x83, 0x1f, 0x28, 0x20, 0xd7, 0xf1, 0xb3, 0x70, 0xc6, 0x51, 0xe0, 0x35, 0xd1, 0xe, 0x91, 0x5, 0x22, 0xe7, 0x2b, 0x5, 0xdb, 0xe, 0x4b, 0xd1, 0xde, 0x39, 0xea, 0x68, 0xc5, 0x27, 0x3d, 0x7b, 0x69, 0x4b, 0x71, 0xf6, 0x1a, 0xf1, 0x6c, 0x3a, 0x2e, 0x6f, 0xb9, 0x13, 0x3c, 0xa6, 0x8e, 0xf, 0x77, 0x95, 0xff, 0x8c, 0x4c, 0xfb, 0x42, 0xc2, 0x98, 0x91, 0xbe, 0xa0, 0x95, 0xc, 0x9a, 0xec, 0x67, 0xcf, 0xe7, 0x8e, 0xeb, 0x5a, 0x33, 0xf0, 0xee, 0x24, 0xc4, 0x71, 0x33, 0xe7, 0x4c, 0xf3, 0x63, 0x5, 0xe5, 0xed, 0x31, 0x95, 0x39, 0xb, 0x98, 0x19, 0x36, 0x3f, 0x9b, 0xfe, 0x3a, 0xe8, 0x7c, 0x1c, 0x4a, 0x5e, 0x79, 0x2e, 0xbd, 0xf1, 0xb3, 0x89, 0xca, 0xcd, 0xa1, 0x7e, 0x18, 0xd3, 0x85, 0x3d, 0x68, 0x41, 0x35, 0x3c, 0x4e, 0xe4, 0x15, 0x67, 0x40, 0xed, 0x80, 0x9c, 0x23, 0x8c, 0x2a, 0xed, 0x8, 0xc5, 0xbf, 0x5a, 0x2, 0xe6, 0xbd, 0xed, 0xc5, 0xf2, 0x3b, 0x31, 0x1e, 0x63, 0xb1, 0x12, 0xa1, 0xd9, 0xe7, 0x3b, 0x3b, 0xcb, 0xb2, 0xcc, 0x38, 0x78, 0x7c, 0x4f, 0xc1, 0x54, 0x5, 0xbf, 0xe0, 0x88, 0xaa, 0x27, 0xb7, 0xe6, 0x1b, 0x7, 0x35, 0xe8, 0x64, 0xba, 0xc2, 0x64, 0xd7, 0x86, 0xeb, 0xd7, 0xba, 0x97, 0xf3, 0xbc, 0x4a, 0x4f, 0xb7, 0x20, 0x79, 0xbf, 0x1c, 0xfd, 0xb2, 0x2b, 0x3, 0x3d, 0xf1, 0x5b, 0x91, 0xe8, 0x65, 0x22, 0xd6, 0xfb, 0x19, 0xbb, 0x4a, 0x26, 0x9d, 0xb4, 0xa2, 0x48, 0x2f, 0x79, 0xaf, 0x62, 0x2f, 0xec, 0xba, 0x19, 0x86, 0x5f, 0xb0, 0xa9, 0x22, 0x33, 0x32, 0x45, 0xdc, 0x5, 0x90, 0xf2, 0xde, 0xcf, 0x4b, 0xac, 0x2f, 0x7a, 0xc4, 0x8, 0xc2, 0xac, 0x55, 0x3d, 0xac, 0xfe, 0xa3, 0x57, 0x60, 0x7, 0x12, 0x2c, 0x90, 0x5d, 0x72, 0x23, 0x17, 0xec, 0xf, 0xeb, 0x33, 0x27, 0xc6, 0x31, 0x9c, 0xbb, 0x63, 0x3c, 0xbb, 0xdb, 0xcc, 0x13, 0x49, 0x38, 0x58, 0x30, 0x7, 0x2b, 0x54, 0x3e, 0x11, 0x97, 0x2d, 0xc, 0x31, 0x2a, 0xe7, 0x48, 0x9d, 0x58, 0x6b, 0x31, 0xb8, 0x54, 0x27, 0xd5, 0xc1, 0x60, 0xab, 0x1f, 0x81, 0x42, 0xa3, 0x35, 0x94, 0x35, 0xc9, 0x2, 0x61, 0x76, 0xc3, 0x26, 0xe1, 0x2e, 0x29, 0x25, 0x3e, 0x95, 0x15, 0x4f, 0x7a, 0x59, 0xad, 0x2c, 0x3, 0xc3, 0xe7, 0xc3, 0x1b, 0xb6, 0x1c, 0x2a, 0xfe, 0x81, 0x7a, 0x2d, 0x4b, 0xcb, 0xa6, 0x8b, 0xe0, 0xe2, 0xf4, 0xb, 0xa8, 0x68, 0x2, 0xf9, 0x8c, 0xb2, 0xc9, 0xfc, 0xb7, 0x96, 0x82, 0x28, 0x51, 0xa7, 0xd1, 0xe2, 0xa2, 0xb0, 0xdb, 0x6d, 0xf6, 0x7b, 0x52, 0xca, 0xba, 0xd4, 0x3c, 0x31, 0x80, 0x8f, 0x41, 0x9b, 0x40, 0x8b, 0x6a, 0x3c, 0x87, 0xe8, 0x1a, 0x4b, 0x2b, 0x5f, 0x29, 0x93, 0x2a, 0xc7, 0x5e, 0xe9, 0xb8, 0x5f, 0x79, 0x5a, 0x2e, 0x90, 0x50, 0xf6, 0xe, 0xfa, 0x6a, 0x87, 0x2f, 0x88, 0xc8, 0x5a, 0x16, 0x3, 0xe2, 0xc1, 0x25, 0xd9, 0x87, 0xca, 0x90, 0x36, 0x79, 0xce, 0x93, 0xa7, 0x8d, 0x12, 0xbc, 0xf9, 0x9d, 0xbe, 0x39, 0xd6, 0x9a, 0xc6, 0x3c, 0x7c, 0xd3, 0xb6, 0xec, 0x1f, 0x99, 0x65, 0x69, 0xa3, 0xff, 0xb5, 0xb8, 0xbf, 0x1, 0xe0, 0x64, 0xd, 0x1, 0x34, 0x93, 0xbf, 0xa, 0x61, 0x5d, 0xc, 0x3f, 0xda, 0xdf, 0xb0, 0xee, 0x8f, 0x71, 0xd7, 0x40, 0x5, 0x3, 0xa8, 0x1e, 0x2b, 0x5b, 0x37, 0xd3, 0xb4, 0xf4, 0x73, 0x2f, 0xf2, 0x59, 0x3d, 0xeb, 0xbb, 0xd9, 0xc4, 0x4e, 0x42, 0x54, 0x1c, 0x92, 0xb2, 0xd7, 0xe3, 0xaf, 0xce, 0x34, 0xc5, 0x37, 0x6d, 0x29, 0x2e, 0x2, 0x68, 0x5e, 0xb0, 0x16, 0x9f, 0x35, 0x2b, 0xa, 0x8e, 0xa2, 0x73, 0x9d, 0x3f, 0xbc, 0xd9, 0x2d, 0xd8, 0xfd, 0xff, 0xe1, 0xf3, 0xba, 0xf9, 0xa8, 0x39, 0x69, 0xc4, 0x6d, 0x73, 0x31, 0x5c, 0xf4, 0xcf, 0x55, 0xe7, 0xe8, 0x92, 0x78, 0x42, 0x56, 0xf, 0x91, 0x2c, 0x4, 0xd0, 0xaa, 0x5, 0xbf, 0x35, 0xdf, 0xcc, 0x6a, 0xda, 0x28, 0x70, 0xec, 0x25, 0x29, 0x5c, 0x3f, 0xaa, 0xe1, 0x4, 0xa8, 0x2a, 0x82, 0x63, 0x8e, 0x34, 0x3d, 0x7d, 0xec, 0xed, 0xb5, 0xcf, 0xb2, 0xf6, 0xb4, 0x30, 0x28, 0x36, 0x3, 0x2a, 0xba, 0x6b, 0x9, 0xd, 0xcb, 0xbf, 0x8, 0x4, 0x3f, 0xec, 0x9f, 0x64, 0xe4, 0xfd, 0x8a, 0x17, 0x4e, 0x43, 0x1c, 0x4f, 0x2e, 0x40, 0xfb, 0x26, 0xc3, 0xce, 0x8a, 0x9d, 0x6c, 0xc4, 0xb6, 0xc0, 0xb8, 0x6c, 0x29, 0x3d, 0x58, 0xf5, 0xac, 0x8, 0x72, 0x7, 0xcf, 0xc6, 0xca, 0x52, 0x25, 0xd6, 0x3d, 0xa0, 0xd, 0x83, 0xef, 0x61, 0x52, 0xb4, 0x46, 0x0, 0x5d, 0x30, 0xee, 0xa7, 0xf6, 0x85, 0x3e, 0xa, 0xcb, 0x96, 0x5c, 0x86, 0x24, 0x89, 0x7a, 0xdf, 0x8b, 0x44, 0x91, 0x59, 0x71, 0x83, 0x23, 0xe4, 0xf8, 0xdb, 0x5c, 0x1d, 0x22, 0x9, 0xdc, 0x47, 0x35, 0xf4, 0xaa, 0x1d, 0x95, 0xd4, 0xac, 0xae, 0xd4, 0xb, 0xd5, 0x82, 0xb9, 0x56, 0x11, 0x9f, 0x45, 0x2b, 0x94, 0xc9, 0xdc, 0x72, 0xb2, 0x45, 0xfa, 0xe2, 0xb1, 0x67, 0x80, 0xb7, 0xfb, 0xa3, 0xd6, 0xc, 0xd0, 0xfb, 0xe2, 0x37, 0x2d, 0x74, 0xca, 0xdd, 0x24, 0xfc, 0x46, 0xdd, 0xfb, 0x26, 0x7b, 0x76, 0x44, 0x45, 0x66, 0x7c, 0xf6, 0xd8, 0x2f, 0x61, 0xa3, 0xa6, 0x3f, 0x60, 0x92, 0xe3, 0xdf, 0x49, 0xb3, 0x9, 0xde, 0x93, 0x90, 0x54, 0x73, 0xf7, 0x12, 0x46, 0x98, 0x2, 0x3b, 0x85, 0x67, 0x81, 0xe2, 0xed, 0x7c, 0x3, 0x77, 0xd1, 0x29, 0xb4, 0x9b, 0x80, 0x7d, 0xf0, 0xc4, 0x56, 0x27, 0xfb, 0x6b, 0xb, 0x45, 0x80, 0x2b, 0xf0, 0x93, 0xba, 0xf9, 0x9f, 0xc5, 0x61, 0x95, 0xad, 0x20, 0x57, 0x54, 0x69, 0x3e, 0xc7, 0xe2, 0x31, 0x33, 0xbe, 0xf0, 0x7c, 0xc, 0x3, 0x48, 0x9c, 0xca, 0x9b, 0x7c, 0x72, 0x42, 0x5e, 0xda, 0xdc, 0x29, 0x46, 0x3, 0x14, 0x7c, 0x17, 0xf6, 0x21, 0xba, 0x39, 0xab, 0xec, 0x0, 0xc1, 0xef, 0xba, 0xf0, 0x96, 0xb1, 0x2b, 0xb5, 0x74, 0x1c, 0xac, 0x73, 0xde, 0x3, 0xd5, 0x56, 0x2c, 0x9d, 0x9c, 0x53, 0xf, 0xce, 0x2d, 0x8, 0x87, 0x95, 0x3c, 0xfa, 0x8a, 0xa, 0x77, 0xf7, 0x7d, 0x7e, 0x5c, 0x59, 0x7a, 0x5a, 0x89, 0x96, 0x47, 0xfb, 0xfa, 0x6e, 0xd2, 0x69, 0xdb, 0x29, 0x29, 0x74, 0x5e, 0xee, 0xf2, 0xe9, 0xb9, 0x4, 0x3, 0x2, 0xe9, 0x88, 0x38, 0x1d, 0xf2, 0x91, 0x15, 0xa6, 0xdf, 0x7a, 0x79, 0x8e, 0x3f, 0xcf, 0x37, 0xe7, 0xeb, 0x61, 0x1c, 0x12, 0xf9, 0x89, 0xbd, 0x3, 0xba, 0x6, 0x6, 0x69, 0x59, 0x87, 0xb7, 0xfe, 0x78, 0x97, 0x72, 0x7a, 0xc2, 0x1a, 0x18, 0x60, 0x72, 0x34, 0x3c, 0x72, 0x18, 0xe0, 0x7e, 0x93, 0x70, 0xfc, 0x86, 0xcf, 0x42, 0x7c, 0x5, 0x8f, 0x11, 0xa1, 0x75, 0x33, 0xf8, 0x5b, 0x98, 0xbf, 0xe9, 0x39, 0x13, 0x54, 0xc0, 0x11, 0xf9, 0x8, 0xfa, 0xac, 0x4, 0xf3, 0xa2, 0x4a, 0xb3, 0x6f, 0x8b, 0xda, 0x1a, 0x4d, 0x61, 0xd6, 0xb, 0xad, 0x5, 0x5b, 0x77, 0x3b, 0x73, 0x92, 0x66, 0xdd, 0x15, 0x30, 0xf1, 0xd5, 0x8e, 0xcf, 0x32, 0xa, 0x15, 0xd8, 0x18, 0xef, 0xad, 0x1b, 0xed, 0xf9, 0x3f, 0xfb, 0x9a, 0x9b, 0x59, 0x2e, 0x5c, 0x51, 0xf6, 0x17, 0xab, 0xe0, 0xc2, 0x28, 0x49, 0xa4, 0x4d, 0x47, 0xfd, 0xe4, 0xbe, 0x1c, 0x52, 0x44, 0x36, 0x4f, 0xa4, 0x79, 0x12, 0x7, 0x55, 0xe8, 0xfb, 0x1, 0x66, 0xff, 0xab, 0x97, 0xc4, 0x51, 0xda, 0x5f, 0xe8, 0x94, 0xe3, 0x3e, 0xb, 0x7c, 0x59, 0x67, 0xf6, 0x85, 0x3, 0x19, 0x4b, 0xe3, 0x7e, 0xa2, 0xc6, 0xcc, 0x9f, 0x6e, 0xf8, 0x92, 0xa4, 0xdd, 0xde, 0x7a, 0xc7, 0x3b, 0x5, 0x72, 0x29, 0x78, 0xea, 0x3a, 0x1a, 0xc1, 0x4c, 0x1b, 0x93, 0x34, 0xe7, 0xa3, 0x89, 0x5e, 0xbb, 0x94, 0x56, 0x9f, 0x2e, 0x2e, 0x51, 0x17, 0xb6, 0xf8, 0x7b, 0x17, 0xf3, 0x49, 0xc3, 0x5d, 0x3e, 0xff, 0xc7, 0x8, 0xba, 0xa4, 0x2e, 0x23, 0x5d, 0x14, 0x11, 0xf5, 0x16, 0x9d, 0x4f, 0x9c, 0xc3, 0x79, 0xb3, 0x33, 0xa3, 0x9, 0xf1, 0xcc, 0xa9, 0x24, 0xeb, 0x80, 0x70, 0x85, 0xe2, 0x60, 0xfd, 0xc, 0x8e, 0x48, 0x4d, 0xfb, 0xed, 0x7b, 0xb8, 0xcd, 0x59, 0xc2, 0xd7, 0xbb, 0x1e, 0x72, 0xa9, 0x90, 0x63, 0xbc, 0x55, 0xa8, 0xd, 0xb, 0x70, 0x4c, 0x31, 0xde, 0xdb, 0x4, 0x4d, 0x2b, 0x46, 0xe8, 0x32, 0x6c, 0xbc, 0x1f, 0xbf, 0xcd, 0x9e, 0xfc, 0x62, 0xb1, 0xab, 0x3e, 0x83, 0x33, 0xb7, 0x3a, 0xdd, 0xb0, 0x8b, 0xb4, 0x39, 0x99, 0xb9, 0xdf, 0xc3, 0x97, 0xb1, 0x8a, 0x2b, 0xc4, 0x54, 0x81, 0x16, 0xcf, 0xb0, 0x49, 0xa5, 0x55, 0x92, 0x6, 0xb5, 0xc1, 0xe7, 0x48, 0x67, 0xad, 0xcb, 0xcb, 0xc5, 0x6f, 0xf, 0x78, 0x75, 0x27, 0xc8, 0xd7, 0xc9, 0xe1, 0xb8, 0x80, 0xab, 0x4e, 0x56, 0xcd, 0xdb, 0x3f, 0xe1, 0xda, 0x69, 0x8c, 0xce, 0xea, 0x69, 0x99, 0xfb, 0xb4, 0xe6, 0x47, 0x5a, 0xcb, 0x5, 0xa7, 0x85, 0x10, 0x2f, 0x0, 0xb9, 0xe, 0x1b, 0x71, 0x1f, 0x2c, 0x89, 0x96, 0x54, 0xb9, 0xa, 0x78, 0xc8, 0xf2, 0x5, 0xb9, 0xdb, 0x92, 0x7, 0xa2, 0x9, 0x63, 0xe2, 0xac, 0x26, 0xe1, 0x84, 0x6, 0xb3, 0xc9, 0x8a, 0xec, 0x47, 0x24, 0xa, 0xb4, 0xb6, 0xd8, 0x6a, 0x48, 0x24, 0xfb, 0xe3, 0x9f, 0xc1, 0x1f, 0x12, 0x60, 0x3f, 0x3b, 0x8e, 0x1a, 0xcf, 0xfc, 0x26, 0x56, 0x94, 0xf3, 0xd1, 0x6a, 0x22, 0x86, 0x56, 0x4e, 0x52, 0xbf, 0x37, 0x30, 0x18, 0x43, 0xfb, 0x2b, 0xd7, 0x25, 0xc7, 0x78, 0xb5, 0x6d, 0x1e, 0xb6, 0xd7, 0xe5, 0xb3, 0xbb, 0x60, 0x40, 0xfd, 0x8e, 0x8e, 0x48, 0xac, 0xdb, 0x1, 0x47, 0x1, 0x2e, 0x49, 0xa4, 0xa, 0x36, 0x9a, 0xcf, 0x75, 0xac, 0x8, 0x4d, 0x63, 0x79, 0x5, 0xfd, 0xc, 0xb7, 0xef, 0x15, 0xfb, 0xff, 0x6d, 0x53, 0x91, 0xa5, 0x6c, 0x10, 0x7c, 0xd0, 0x82, 0x75, 0xc3, 0xb2, 0x98, 0x4a, 0x6f, 0x23, 0x22, 0xbb, 0xfb, 0x5c, 0xbb, 0x0, 0x68, 0x6, 0xe9, 0x59, 0xc, 0xb, 0x74, 0x77, 0x9a, 0x5a, 0x8f, 0x9a, 0xc6, 0x4a, 0x48, 0xc9, 0xbe, 0xd6, 0x4, 0xf8, 0x33, 0x2b, 0x66, 0xc4, 0xe6, 0x32, 0x95, 0x92, 0x72, 0xb3, 0x73, 0x9c, 0x59, 0x4e, 0xf, 0x6d, 0x95, 0x68, 0xcc, 0x31, 0x5c, 0x15, 0x9f, 0x24, 0x7a, 0xa4, 0x4e, 0x28, 0xce, 0xe1, 0xd, 0xf, 0xd8, 0x24, 0x88, 0xd1, 0x57, 0x64, 0xd, 0xa7, 0x47, 0xf3, 0x8b, 0x38, 0x7a, 0x8b, 0x6b, 0xa8, 0xed, 0x86, 0x13, 0x60, 0xcd, 0xc, 0x6, 0xff, 0xcd, 0xb7, 0xb2, 0x3f, 0x5, 0xd0, 0xc7, 0xb6, 0xb1, 0xbe, 0x9f, 0xa, 0x24, 0x99, 0x87, 0x23, 0x2, 0xb, 0xb2, 0x89, 0x61, 0x77, 0x4f, 0x38, 0xbb, 0x1b, 0x3a, 0x19, 0x66, 0x90, 0x1e, 0xe7, 0x95, 0x86, 0x7e, 0xac, 0xff, 0x6, 0x97, 0x0, 0xb5, 0x2e, 0x62, 0x3d, 0x8a, 0x4a, 0xc6, 0x46, 0x4b, 0x5a, 0xd2, 0x43, 0x77, 0x24, 0xd0, 0xc4, 0x69, 0x84, 0x33, 0xe4, 0xf7, 0x88, 0x3d, 0xa1, 0xb3, 0x2b, 0x49, 0x58, 0xbe, 0x1, 0x10, 0x3a, 0xb2, 0x62, 0x4c, 0x1a, 0x3d, 0xa6, 0xb4, 0x96, 0x35, 0xe8, 0x3e, 0x3f, 0x18, 0x7d, 0xea, 0x7f, 0x4e, 0x45, 0x1c, 0xb0, 0xaf, 0x17, 0x61, 0xce, 0x3f, 0x64, 0x38, 0x36, 0x4c, 0x1c, 0xe6, 0xe5, 0x65, 0x4e, 0x5f, 0xcd, 0x5f, 0xa3, 0x8d, 0x50, 0x65, 0x40, 0xeb, 0xca, 0x5c, 0x49, 0x8c, 0xdf, 0x65, 0x89, 0x62, 0xa9, 0xe1, 0x12, 0x50, 0xa8, 0x2d, 0xf, 0xc4, 0x1c, 0xcf, 0xc1, 0x94, 0x1b, 0x47, 0xee, 0x75, 0xfb, 0x8, 0xa, 0xc8, 0x9b, 0xf1, 0xce, 0x91, 0x35, 0xde, 0x81, 0xf5, 0x58, 0x49, 0x70, 0x88, 0x4f, 0xef, 0x3a, 0xb2, 0xf8, 0x67, 0x28, 0x5f, 0x9a, 0x9f, 0xea, 0x84, 0x93, 0x74, 0x8d, 0x8b, 0x50, 0x9, 0xdc, 0xe3, 0x30, 0xe8, 0xb7, 0x55, 0x76, 0x31, 0x74, 0xcf, 0xd2, 0xf6, 0xfa, 0x55, 0x3, 0x69, 0xdf, 0xeb, 0x6c, 0x60, 0x72, 0xd6, 0xde, 0xc3, 0xd0, 0xb3, 0x92, 0xbb, 0x48, 0x92, 0xf8, 0x7c, 0x5c, 0x84, 0x54, 0xb7, 0x65, 0x1f, 0xf0, 0xd5, 0xd5, 0xc9, 0x7a, 0xcd, 0xf6, 0x69, 0x1d, 0x40, 0x96, 0x59, 0xa, 0xc3, 0xc2, 0x78, 0x18, 0x92, 0xed, 0x50, 0x86, 0x26, 0x91, 0xd5, 0x68, 0x26, 0x8d, 0xf9, 0x5f, 0x8b, 0xe3, 0x65, 0x19, 0xd8, 0x7a, 0x1a, 0x28, 0x15, 0x7, 0x11, 0xce, 0xc6, 0x3, 0x7c, 0xfc, 0xc8, 0x1b, 0x36, 0x4, 0x65, 0x8b, 0xe2, 0xe6, 0xbe, 0xcb, 0x8, 0x98, 0xdb, 0xc, 0xe8, 0xf, 0xb0, 0x6, 0x15, 0xd3, 0x3e, 0xfe, 0x66, 0xe0, 0xd6, 0x17, 0x18, 0x50, 0xb, 0x4d, 0xc6, 0x38, 0x9d, 0x2e, 0xef, 0xca, 0x4d, 0x84, 0x56, 0xfd, 0x8b, 0xab, 0x45, 0x85, 0xdd, 0x6a, 0x17, 0x77, 0xdb, 0xe5, 0x66, 0x9b, 0xc4, 0x72, 0x66, 0xcb, 0x71, 0x1b, 0x77, 0x1d, 0x42, 0x68, 0x39, 0x7, 0x56, 0xd8, 0xea, 0xaf, 0xe3, 0x83, 0xe8, 0xf, 0x84, 0x3, 0x77, 0x99, 0xc6, 0x1e, 0xd5, 0xda, 0x91, 0xb3, 0x26, 0x67, 0x7f, 0x30, 0xb9, 0x3f, 0x24, 0xae, 0xc, 0x16, 0xca, 0xe8, 0x7b, 0xc8, 0x8a, 0xc8, 0xf4, 0x55, 0xe3, 0x4c, 0xed, 0xcc, 0x74, 0x51, 0x66, 0xf5, 0xa4, 0x53, 0x7d, 0x49, 0xf9, 0xd4, 0x10, 0x68, 0xb5, 0x97, 0x64, 0x46, 0x73, 0x89, 0x21, 0xa6, 0x94, 0x4, 0x74, 0xda, 0xe1, 0xf8, 0x68, 0x1c, 0x1, 0x8d, 0x93, 0x6a, 0x54, 0x82, 0x62, 0xc1, 0x1a, 0xc6, 0x19, 0xcb, 0x3a, 0x1f, 0x3e, 0xd, 0xad, 0xab, 0x9c, 0xfa, 0xf8, 0x52, 0x43, 0xea, 0xb7, 0xb4, 0x23, 0x65, 0x35, 0x15, 0x25, 0x81, 0x60, 0xae, 0x61, 0xad, 0x16, 0x5a, 0x8e, 0x57, 0x81, 0xff, 0xf8, 0x67, 0x20, 0x75, 0x7d, 0x44, 0x45, 0x90, 0x50, 0x21, 0x62, 0x78, 0x6f, 0xaa, 0x5, 0x5, 0xcf, 0x2f, 0xc2, 0xc0, 0x77, 0x1c, 0xed, 0x6b, 0xa6, 0xf0, 0x30, 0x10, 0x39, 0xd7, 0xb, 0x1f, 0x15, 0x9f, 0xf2, 0x31, 0x85, 0xbe, 0xde, 0xe6, 0xc7, 0x89, 0x79, 0x2d, 0x98, 0x7e, 0x67, 0x8e, 0x72, 0xe, 0x7, 0x5c, 0xd5, 0x1f, 0xe8, 0x6, 0xd3, 0x7b, 0x81, 0xa, 0x99, 0x22, 0xe0, 0x7f, 0x72, 0x6a, 0x81, 0xf, 0x19, 0x33, 0x4f, 0x29, 0xc2, 0xcc, 0x35, 0x63, 0xbe, 0xc5, 0x45, 0x47, 0x9f, 0x17, 0x20, 0x38, 0x6e, 0x6, 0x2f, 0x92, 0x82, 0xb7, 0x47, 0xe6, 0x8a, 0xfb, 0xca, 0x2, 0xde, 0x49, 0x2e, 0xc2, 0xcc, 0xec, 0xc2, 0xfc, 0xff, 0xc2, 0x9b, 0x29, 0x82, 0x82, 0xe, 0x6e, 0xa2, 0xee, 0x8f, 0x9a, 0x5, 0x32, 0x89, 0xfe, 0x8b, 0x27, 0x27, 0xa6, 0xe5, 0x13, 0xc6, 0xcb, 0xb6, 0x7e, 0xe1, 0xc1, 0x1c, 0xa6, 0x7e, 0x49, 0x55, 0x1d, 0x13, 0x33, 0xd5, 0xde, 0x7e, 0xaf, 0x9e, 0xd3, 0x69, 0x2f, 0x1b, 0xf1, 0x6a, 0xde, 0x34, 0xf4, 0xc2, 0x73, 0xfa, 0x75, 0xa3, 0xa4, 0x93, 0x24, 0xa5, 0x4c, 0xc2, 0xc5, 0x33, 0xb8, 0x7c, 0x78, 0x6, 0x5f, 0xcf, 0x71, 0x6e, 0x3e, 0x1f, 0x9, 0x4e, 0x81, 0x66, 0x66, 0x74, 0x8b, 0x57, 0x1f, 0x45, 0x76, 0x2a, 0xe9, 0x33, 0xb5, 0x8c, 0xc1, 0x57, 0x6e, 0xde, 0xb5, 0xbf, 0x55, 0xfe, 0xca, 0x9b, 0x33, 0xeb, 0xa2, 0xee, 0x1, 0x9c, 0x8b, 0xea, 0xa1, 0xd6, 0xa7, 0xf8, 0xf4, 0xf5, 0xb4, 0x23, 0x60, 0x42, 0x4e, 0xb5, 0x52, 0xae, 0xe4, 0x52, 0x5e, 0xdc, 0x70, 0xbf, 0x84, 0xe0, 0x55, 0xba, 0x1c, 0x8d, 0xa4, 0x6, 0x3f, 0xba, 0x7a, 0x9, 0x22, 0xa9, 0xbf, 0xb, 0xe9, 0x3f, 0x63, 0x13, 0x55, 0x88, 0x93, 0x53, 0xe1, 0x82, 0xe0, 0xc7, 0x1, 0x6b, 0x9c, 0x9a, 0x75, 0x30, 0x6f, 0x28, 0xfd, 0xfb, 0xac, 0x6b, 0x17, 0x41, 0x10, 0x58, 0x94, 0x53, 0xde, 0xc3, 0x3b, 0x7c, 0xf0, 0x80, 0xe5, 0x2f, 0x77, 0x4d, 0x88, 0x75, 0x6f, 0xdb, 0xdc, 0x4f, 0x9d, 0xbb, 0x40, 0xb8, 0x3b, 0x5c, 0xd7, 0x11, 0x30, 0x8, 0xdb, 0x4e, 0x2e, 0x6c, 0xdc, 0x8d, 0x29, 0x9c, 0xcd, 0xa2, 0x89, 0x87, 0xe1, 0x82, 0xce, 0xa0, 0xff, 0x1c, 0x10, 0xf2, 0xa5, 0x40, 0x34, 0x34, 0x4b, 0xe5, 0x36, 0x6d, 0x7c, 0x3, 0xa3, 0x74, 0xc, 0x29, 0x8d, 0x52, 0x82, 0x17, 0xab, 0xd4, 0x4, 0xc2, 0xa8, 0x83, 0xd0, 0xd, 0x1e, 0x0, 0x76, 0xdd, 0x4e, 0xf1, 0xcf, 0xc7, 0x2e, 0x66, 0xc9, 0x2, 0xc2, 0x11, 0xc9, 0xc6, 0x78, 0x2, 0x81, 0x98, 0xfb, 0x34, 0xdb, 0x68, 0xe3, 0xe4, 0x5e, 0xe, 0x25, 0xb4, 0xa1, 0x47, 0x13, 0xfe, 0x95, 0x84, 0xab, 0xe6, 0x5e, 0x3c, 0x50, 0x24, 0x6f, 0x39, 0x6c, 0xf, 0xab, 0x6b, 0xdd, 0x86, 0x44, 0xfb, 0x3f, 0x7e, 0x80, 0xf5, 0xfe, 0x2, 0x80, 0x74, 0x6c, 0xb, 0xf0, 0x99, 0x29, 0x86, 0xa7, 0xa6, 0xf9, 0xbf, 0x48, 0x26, 0x9e, 0xd8, 0xbe, 0x6c, 0xa0, 0xe5, 0x85, 0xeb, 0x19, 0x84, 0x3d, 0xaf, 0x11, 0xd3, 0x86, 0x16, 0x3f, 0x73, 0x34, 0x78, 0xad, 0xf3, 0x24, 0xaa, 0xa2, 0x6f, 0x5a, 0x5e, 0xee, 0xac, 0x9c, 0x23, 0xe6, 0xd4, 0x75, 0x83, 0xd7, 0x86, 0x6, 0x5d, 0x18, 0x28, 0xb, 0xa, 0x8d, 0x72, 0x3f, 0x6f, 0xed, 0x3c, 0xdd, 0x60, 0xb0, 0x12, 0x79, 0x5a, 0xcc, 0x14, 0xf0, 0xfa, 0x29, 0x31, 0x8d, 0xea, 0x5a, 0x39, 0xd7, 0x5c, 0xde, 0x1d, 0x32, 0xab, 0xba, 0xf, 0x6b, 0xd6, 0xb2, 0x7, 0x96, 0x99, 0xbd, 0xaf, 0x7, 0xae, 0x11, 0x59, 0xbc, 0x44, 0xd, 0x82, 0x11, 0x13, 0x55, 0x20, 0x5e, 0x3a, 0x47, 0xc4, 0x86, 0xcc, 0x1b, 0x65, 0xc, 0xef, 0xe, 0xd8, 0x9b, 0x2b, 0xc, 0x23, 0x1d, 0xe5, 0x5b, 0x51, 0x7, 0x12, 0x4a, 0x2c, 0x4, 0x84, 0xe2, 0xe9, 0xbf, 0xa0, 0x7c, 0x51, 0x42, 0x7a, 0x82, 0x69, 0x23, 0x78, 0x5, 0xf6, 0xe8, 0x9d, 0x69, 0x38, 0x16, 0xf0, 0x4, 0x4f, 0x18, 0x5, 0x6d, 0xbc, 0xf2, 0xed, 0x18, 0x46, 0x17, 0x77, 0xf1, 0x1c, 0x65, 0xd5, 0x78, 0x37, 0x7c, 0xf, 0xbd, 0x52, 0xd8, 0x55, 0x55, 0x68, 0x1b, 0xf8, 0x1f, 0x46, 0xf3, 0x82, 0xf6, 0x3, 0x4a, 0x7b, 0xca, 0x12, 0x9b, 0x35, 0x8c, 0x9, 0xc1, 0x1, 0x34, 0x98, 0x5d, 0xd2, 0x53, 0x5, 0x6a, 0xb0, 0x87, 0xc6, 0x3d, 0x8f, 0x76, 0xc0, 0xe0, 0x2e, 0x73, 0x4b, 0x34, 0x3e, 0xa3, 0x44, 0x7c, 0x2, 0xa, 0xb7, 0x64, 0xc3, 0x71, 0xb1, 0x5e, 0x87, 0xd6, 0x68, 0x6c, 0xfc, 0x3, 0x3e, 0x5e, 0xc7, 0x52, 0xf0, 0x1f, 0x3d, 0x2c, 0x73, 0x3e, 0x7a, 0x6e, 0xd1, 0x6e, 0xa6, 0xef, 0xd0, 0xf2, 0x46, 0xb7, 0x5b, 0xb6, 0x26, 0x2b, 0xd9, 0x63, 0x7c, 0x86, 0x44, 0xdd, 0xba, 0x82, 0xcd, 0xff, 0xb8, 0x81, 0xc0, 0xf8, 0x9e, 0x4a, 0x1b, 0xa7, 0x85, 0x87, 0x6c, 0x73, 0xa7, 0x76, 0x16, 0x6c, 0xd0, 0x32, 0x89, 0x9d, 0x16, 0x6, 0x2c, 0xbe, 0xf2, 0x39, 0x9, 0xb5, 0x49, 0x88, 0x63, 0xd1, 0x8e, 0x85, 0x90, 0xba, 0x2c, 0x69, 0x33, 0xfc, 0x8e, 0x0, 0xa6, 0x2f, 0x91, 0xa, 0x4a, 0x2b, 0x40, 0x39, 0xa3, 0x97, 0xc7, 0x90, 0x1, 0xc0, 0x10, 0x3c, 0x2d, 0xd6, 0xfd, 0x14, 0xff, 0x8a, 0xc1, 0x89, 0x19, 0x57, 0x9, 0x4d, 0xc6, 0x98, 0xba, 0xfe, 0xe5, 0x0, 0x28, 0xea, 0x24, 0x82, 0xc1, 0xc5, 0xa9, 0xf9, 0xc, 0xb9, 0x3c, 0x91, 0x9f, 0x1c, 0xca, 0x9e, 0x4b, 0x1a, 0xfa, 0x7b, 0x35, 0xe5, 0xe5, 0x8c, 0xdc, 0xc1, 0xb, 0x96, 0xa, 0xc3, 0xee, 0x17, 0xf3, 0xd9, 0x67, 0xe2, 0x38, 0x7d, 0x25, 0x6c, 0xef, 0x89, 0xfb, 0x6, 0x6d, 0xa2, 0x64, 0xd3, 0x9a, 0x99, 0x28, 0x23, 0x58, 0xab, 0xea, 0x26, 0xcb, 0x94, 0xb7, 0x69, 0x96, 0xa5, 0x5b, 0xb8, 0x1f, 0xab, 0x28, 0xad, 0x94, 0xaa, 0xd0, 0x56, 0xf3, 0xbf, 0xdc, 0x5, 0x2, 0xa6, 0xa1, 0xa3, 0x80, 0x9e, 0xd7, 0x14, 0xaf, 0xd6, 0xc3, 0x22, 0x5e, 0x18, 0x4f, 0xfc, 0xc8, 0x67, 0xf6, 0xb7, 0x6b, 0xa5, 0x2f, 0x23, 0xf8, 0xea, 0x3e, 0x8f, 0x91, 0xbc, 0xd0, 0x49, 0x48, 0xe2, 0x70, 0x58, 0xb9, 0x51, 0x91, 0xe8, 0xab, 0x9, 0x44, 0x3d, 0x70, 0xe, 0xab, 0x70, 0xe8, 0x83, 0x7, 0x80, 0x10, 0xe9, 0xd8, 0x22, 0x62, 0x77, 0xac, 0xa2, 0xb2, 0x7b, 0x2c, 0x9b, 0xc4, 0xfb, 0xcf, 0x2b, 0x28, 0x6d, 0x37, 0x53, 0x7a, 0xdb, 0xea, 0x6, 0xa7, 0x17, 0x88, 0x70, 0x69, 0xae, 0x35, 0xcd, 0x5, 0xe, 0xf5, 0x6f, 0xde, 0x7f, 0xbc, 0x74, 0x75, 0xfb, 0xb5, 0x63, 0xc4, 0x8, 0xfe, 0xe7, 0x53, 0xe9, 0xc9, 0x71, 0x18, 0xca, 0x83, 0xf5, 0xd4, 0xbf, 0xd8, 0xb4, 0x5c, 0x1c, 0xe8, 0x45, 0x82, 0x78, 0x8d, 0xde, 0x38, 0x41, 0x47, 0xe0, 0x3c, 0xe9, 0xf5, 0xa5, 0x32, 0x19, 0x83, 0xf0, 0x4b, 0x5f, 0xd7, 0xd4, 0xc9, 0x8c, 0xfe, 0x77, 0xc4, 0xa, 0x77, 0x5e, 0xa2, 0x72, 0x2e, 0x86, 0x48, 0xe7, 0xb5, 0x52, 0xfe, 0x35, 0x1d, 0x50, 0x82, 0x54, 0xa4, 0xe9, 0x87, 0xb1, 0x9a, 0x4a, 0x42, 0xe7, 0x93, 0x8a, 0x17, 0xa0, 0x8c, 0xe8, 0x6d, 0x50, 0x72, 0x5a, 0xef, 0x2d, 0xeb, 0x1, 0xb2, 0xdc, 0x80, 0xe6, 0x9d, 0x20, 0x68, 0xba, 0xe6, 0xa4, 0x5a, 0xdc, 0x31, 0x9f, 0x3c, 0x29, 0xf, 0x16, 0x6c, 0x42, 0xa7, 0xd7, 0x64, 0xe8, 0x33, 0x63, 0xb5, 0x8e, 0x30, 0xba, 0xbb, 0x3e, 0x2, 0x64, 0x11, 0xbe, 0x2, 0xa3, 0xd5, 0x2f, 0xe3, 0xba, 0xc2, 0x64, 0x7b, 0xff, 0x5a, 0x26, 0xe1, 0x1, 0x6, 0x80, 0x14, 0x4b, 0xfd, 0x66, 0x80, 0xa8, 0xd8, 0x52, 0x9c, 0x5a, 0x7, 0x46, 0xe7, 0x20, 0xba, 0x5a, 0xc6, 0x34, 0x12, 0x7e, 0xf8, 0x2b, 0xa3, 0xda, 0xc8, 0x2f, 0x56, 0xc4, 0xa5, 0x97, 0x74, 0x45, 0xf8, 0xbf, 0xe2, 0xf3, 0x8a, 0x8e, 0xfd, 0x44, 0x59, 0x7d, 0xc9, 0x49, 0x35, 0x49, 0x23, 0x19, 0xe4, 0xbb, 0x36, 0x40, 0x56, 0x7, 0xe3, 0xda, 0xed, 0xa0, 0xad, 0x49, 0x51, 0x78, 0x37, 0xf1, 0xaa, 0x87, 0xef, 0x80, 0xc5, 0x62, 0xd3, 0xc6, 0x6a, 0x5c, 0xa5, 0x30, 0x12, 0x43, 0x97, 0xc5, 0x37, 0x5a, 0xec, 0x15, 0xe5, 0x7, 0x84, 0x56, 0xe0, 0xb7, 0x4d, 0x69, 0xef, 0xbd, 0xf9, 0x80, 0xc6, 0xdd, 0xfc, 0xb9, 0x87, 0x87, 0xca, 0xed, 0xe1, 0xdc, 0xb8, 0x3, 0x34, 0x1c, 0x98, 0x51, 0xa1, 0xb, 0xe1, 0x70, 0xf1, 0xdc, 0x74, 0x42, 0x1a, 0x6d, 0xef, 0x6d, 0xb8, 0x43, 0x27, 0xf7, 0x66, 0x18, 0xdb, 0xeb, 0x70, 0x16, 0x5b, 0xd2, 0x58, 0x6f, 0xc, 0x5, 0x8c, 0x1e, 0x49, 0xc4, 0xf5, 0xd7, 0xfb, 0x87, 0xab, 0xb2, 0xe2, 0x2b, 0xec, 0xf8, 0x11, 0xd1, 0x9d, 0x5c, 0xe, 0x3e, 0x60, 0xe7, 0xc4, 0xb7, 0x8d, 0x3f, 0xc3, 0xbc, 0x51, 0x2a, 0x39, 0xbd, 0x91, 0x9a, 0x2f, 0x70, 0x2d, 0xe9, 0x32, 0xc1, 0x95, 0xa7, 0xa4, 0x7d, 0x1b, 0x15, 0xb1, 0xb, 0xe3, 0xa, 0xb, 0x1a, 0x51, 0x22, 0xe3, 0x2, 0xc8, 0xba, 0xfe, 0x54, 0x78, 0x9e, 0x4e, 0x69, 0x82, 0x50, 0x3a, 0xea, 0xb8, 0x40, 0xfe, 0xe4, 0xc1, 0xfe, 0x8f, 0xe5, 0xb, 0x12, 0xc4, 0x29, 0x9d, 0x34, 0xb8, 0xfb, 0x15, 0xd9, 0xd0, 0xc0, 0x1f, 0x39, 0x94, 0x9f, 0x51, 0xba, 0x10, 0x54, 0xa7, 0x4f, 0x7, 0xc4, 0x11, 0x59, 0xa, 0x15, 0xf6, 0xdb, 0x6a, 0xa6, 0x38, 0xca, 0xbf, 0x34, 0x3c, 0x54, 0x64, 0xc1, 0xfc, 0xcc, 0xe1, 0xb9, 0x60, 0x75, 0xf2, 0xe0, 0x9c, 0x21, 0x20, 0xe8, 0x53, 0xf, 0xda, 0x99, 0x7a, 0x99, 0xb4, 0xc6, 0x98, 0x44, 0x23, 0xe8, 0xe4, 0x19, 0x6e, 0x51, 0x13, 0xc5, 0x23, 0x7b, 0x93, 0xd5, 0xc4, 0xc5, 0x47, 0xe8, 0xe2, 0x56, 0xf6, 0x1e, 0xe7, 0x5c, 0x73, 0x7d, 0x72, 0x9f, 0xc5, 0x44, 0x9a, 0xf7, 0xa6, 0x4, 0x63, 0x5b, 0x33, 0xe4, 0xb7, 0x3a, 0x36, 0xa7, 0x38, 0x66, 0x83, 0x2f, 0x74, 0xfe, 0x70, 0xa4, 0xde, 0x1a, 0x9f, 0xc1, 0x7f, 0x5b, 0x54, 0xb8, 0x54, 0xe0, 0x98, 0x6, 0x1d, 0xba, 0x1a, 0x38, 0x35, 0xf9, 0x36, 0x49, 0x8e, 0x91, 0x9d, 0x4f, 0x50, 0xb5, 0x82, 0x39, 0x51, 0xb2, 0xf6, 0x5e, 0x3, 0x65, 0xb9, 0x9c, 0x4d, 0x6f, 0xc2, 0xa0, 0x53, 0x5, 0x9, 0x55, 0xa8, 0xbe, 0x56, 0xd, 0xb1, 0x6c, 0x11, 0xda, 0x42, 0xa2, 0xb7, 0x57, 0xd9, 0x48, 0x68, 0x72, 0x2b, 0x67, 0xdd, 0xd3, 0xa4, 0x16, 0x6b, 0xa9, 0x2, 0x85, 0x7c, 0x63, 0x7e, 0x3d, 0x3b, 0x46, 0xd, 0x73, 0x2b, 0x3, 0xc7, 0x27, 0x6f, 0x42, 0x46, 0x58, 0x7d, 0x6b, 0x36, 0x55, 0x1d, 0x44, 0x7d, 0x24, 0x89, 0x9e, 0xd0, 0xe7, 0x48, 0xbf, 0x6f, 0x73, 0x4d, 0x40, 0xb, 0x51, 0x7d, 0xbd, 0x84, 0xe7, 0xd0, 0x3, 0xa0, 0x7f, 0x96, 0x95, 0xfd, 0x17, 0x4f, 0x61, 0xf7, 0x25, 0xdb, 0x98, 0xcb, 0x35, 0xa1, 0xe0, 0xe0, 0x49, 0x6a, 0xa7, 0x83, 0x2e, 0x7b, 0x95, 0x65, 0x2c, 0xf8, 0xe0, 0xdb, 0xcd, 0x8d, 0xda, 0x40, 0x5d, 0x9d, 0x93, 0x95, 0xa5, 0xb4, 0x8b, 0xf6, 0x37, 0x17, 0x2, 0x74, 0x28, 0x79, 0x64, 0x55, 0x3, 0x12, 0x76, 0xad, 0x84, 0x7c, 0xe, 0x74, 0x8e, 0x5f, 0x69, 0x44, 0x90, 0x43, 0xc8, 0x9b, 0xd8, 0x4d, 0x18, 0xa9, 0x85, 0x5d, 0xda, 0xf3, 0xf7, 0x74, 0xb0, 0xc0, 0x9f, 0xbb, 0x63, 0x25, 0x56, 0x8e, 0x88, 0x8a, 0xf8, 0xaa, 0xe6, 0xd2, 0x6, 0x7c, 0xbe, 0x1f, 0x16, 0x43, 0x86, 0x2d, 0x61, 0xb2, 0xb, 0x53, 0x54, 0xa3, 0xbb, 0xb3, 0x9f, 0xea, 0x69, 0x8, 0xcb, 0x77, 0xef, 0xe3, 0xbd, 0x63, 0x11, 0x43, 0xb, 0x46, 0x90, 0xbc, 0x89, 0x35, 0x9a, 0x81, 0xe4, 0xd2, 0xd7, 0x3, 0x4d, 0x82, 0xa7, 0xb6, 0x43, 0x9e, 0x4f, 0xae, 0x33, 0x86, 0xa6, 0x88, 0x9c, 0x7, 0xb3, 0x6d, 0x21, 0xd9, 0xed, 0xff, 0x0, 0xe0, 0x88, 0xdd, 0x91, 0x40, 0x48, 0xbd, 0x12, 0x9f, 0xda, 0x80, 0xb2, 0xd7, 0x8c, 0x53, 0x3e, 0x91, 0x86, 0x8f, 0x45, 0x53, 0xad, 0x8, 0x8e, 0x6c, 0x1f, 0x0, 0xa7, 0xff, 0x15, 0x5d, 0xbf, 0xe6, 0xc6, 0xb8, 0x52, 0xdd, 0x15, 0x12, 0x1, 0xa4, 0x34, 0x82, 0x54, 0x45, 0x40, 0x5b, 0x3d, 0x2d, 0x9d, 0x5a, 0xff, 0x90, 0x41, 0x90, 0x4a, 0xb6, 0xee, 0xff, 0xb0, 0x8b, 0x7f, 0x60, 0x48, 0xa4, 0xac, 0xa3, 0x55, 0x2a, 0x67, 0xa0, 0x30, 0x5c, 0x66, 0xbd, 0x8c, 0x37, 0x59, 0x7f, 0xf3, 0x73, 0x35, 0x7f, 0xa3, 0xa5, 0xfc, 0xe4, 0xd1, 0x7d, 0x6c, 0xf, 0xeb, 0xfc, 0xb0, 0x8a, 0xac, 0x54, 0xa5, 0x65, 0x29, 0xac, 0x76, 0x46, 0x27, 0x6c, 0xf5, 0xfb, 0x17, 0x20, 0xd7, 0xf7, 0xac, 0xd9, 0x6b, 0x2f, 0x2e, 0x66, 0x47, 0x22, 0x10, 0x88, 0x8f, 0xfc, 0x41, 0xef, 0x3b, 0xd5, 0x85, 0xb3, 0x14, 0x7a, 0x51, 0xd1, 0xa7, 0x76, 0x7d, 0xa5, 0x27, 0xe3, 0xda, 0xdc, 0x82, 0x5f, 0x1f, 0x89, 0x5c, 0x5d, 0x51, 0x9e, 0x7, 0x61, 0x63, 0xd7, 0x67, 0x7f, 0x9a, 0x30, 0x53, 0xa3, 0x11, 0xe3, 0x81, 0xda, 0xa8, 0x1b, 0xbe, 0x18, 0x4b, 0xc4, 0x90, 0x49, 0xe4, 0x59, 0x3e, 0x10, 0xaf, 0x95, 0xed, 0xd5, 0xc7, 0x61, 0x92, 0xac, 0x8d, 0xa7, 0xab, 0xe8, 0xec, 0xd3, 0xb8, 0x94, 0x93, 0x99, 0xb0, 0x82, 0xbe, 0x83, 0xfe, 0xad, 0x16, 0x9a, 0xf0, 0x30, 0x68, 0xb1, 0xd9, 0xd7, 0x94, 0xc1, 0x1a, 0xc4, 0x43, 0x17, 0x7f, 0x2e, 0xc8, 0x82, 0xdd, 0xaf, 0x5b, 0xca, 0xf, 0xda, 0x5f, 0xc1, 0x14, 0x6, 0xdf, 0xad, 0x37, 0xae, 0xa8, 0xa7, 0x43, 0xb0, 0x74, 0x4c, 0x73, 0x71, 0x9e, 0xa1, 0xaf, 0xa6, 0x3b, 0x2e, 0xf, 0x45, 0x9c, 0x7e, 0x43, 0xd5, 0x15, 0xb1, 0x42, 0xe2, 0x67, 0xfe, 0x83, 0x58, 0x4a, 0xc2, 0x53, 0x19, 0x2c, 0xc2, 0xbd, 0x43, 0x51, 0xf9, 0xf5, 0x53, 0x6b, 0x7c, 0xce, 0xa9, 0xa2, 0x99, 0x6d, 0x17, 0x1b, 0x95, 0x65, 0x24, 0x64, 0x1b, 0x8, 0x5c, 0xb9, 0x36, 0x8d, 0x29, 0xb1, 0xe6, 0x9e, 0x9a, 0x1d, 0xb8, 0x5b, 0x50, 0x53, 0xb0, 0x70, 0xba, 0xf2, 0x61, 0x9e, 0x6f, 0x3f, 0x53, 0xd4, 0xfa, 0x8a, 0xc9, 0x16, 0x7e, 0xd0, 0x6a, 0x4a, 0xeb, 0xe7, 0xbb, 0x94, 0x16, 0x9f, 0x8e, 0xbc, 0xb0, 0x3c, 0xd9, 0xce, 0xeb, 0xdf, 0xb, 0x39, 0xf3, 0xb1, 0xf2, 0xd7, 0x76, 0xc6, 0x72, 0x12, 0xb6, 0xa5, 0x8c, 0x1b, 0x7a, 0x9f, 0xa9, 0x27, 0xe1, 0xc2, 0xc9, 0xbf, 0xbe, 0x4e, 0xbf, 0x97, 0xd9, 0x5d, 0xc, 0x50, 0x2, 0x46, 0xf, 0x23, 0x11, 0x47, 0x1c, 0x77, 0x9, 0x7f, 0xc1, 0x9, 0xf, 0x2, 0x7c, 0xb3, 0x8e, 0x5, 0x8b, 0xe3, 0xe5, 0xfe, 0x4b, 0x3d, 0x69, 0xab, 0xc0, 0xcb, 0x53, 0x46, 0x1f, 0xeb, 0x89, 0x92, 0xa7, 0xf5, 0x70, 0x17, 0x39, 0x2b, 0x4d, 0xa4, 0x82, 0xeb, 0x44, 0xe, 0x91, 0xd7, 0xd4, 0xe4, 0x2a, 0x71, 0x69, 0x3f, 0x1e, 0x9d, 0xe6, 0x42, 0xe, 0x82, 0x6a, 0xac, 0xd6, 0xc4, 0x11, 0xbf, 0x4c, 0x22, 0xc4, 0x42, 0xe5, 0xf3, 0xe7, 0xb5, 0x1c, 0x94, 0x9d, 0x44, 0x1c, 0xe8, 0xb4, 0xd6, 0x78, 0xe8, 0x50, 0x54, 0x16, 0xbd, 0x72, 0x5d, 0x54, 0xac, 0x25, 0xee, 0x8a, 0xe2, 0x61, 0x6a, 0x78, 0x25, 0x95, 0xab, 0xc7, 0x9d, 0xda, 0x54, 0xb, 0x4d, 0xe8, 0x26, 0xf2, 0x3d, 0x42, 0xb5, 0x42, 0x20, 0x87, 0x9b, 0xeb, 0x4e, 0xb6, 0xa8, 0xdf, 0xf6, 0x90, 0x59, 0x82, 0x57, 0x20, 0xac, 0x7a, 0xc7, 0xf4, 0x21, 0xeb, 0x96, 0xf6, 0x4f, 0xaf, 0x73, 0xb2, 0xaa, 0xe4, 0xc3, 0x79, 0x1a, 0xf1, 0xb3, 0x36, 0x94, 0x2e, 0x92, 0xbc, 0x29, 0x7a, 0xa2, 0xd9, 0xd6, 0xf8, 0x7e, 0x80, 0xff, 0x6c, 0x74, 0xf6, 0x33, 0xf8, 0xa8, 0xf3, 0xc7, 0xca, 0x90, 0xa9, 0xfe, 0x65, 0x6f, 0xe4, 0x21, 0xa9, 0xb0, 0xdd, 0xca, 0xc5, 0xd5, 0x5f, 0x91, 0x55, 0x45, 0x61, 0x78, 0x16, 0xf0, 0x41, 0xbd, 0x58, 0xfb, 0x6f, 0x42, 0x34, 0x44, 0x6f, 0x34, 0x4, 0xc2, 0xdb, 0x14, 0x36, 0x94, 0x55, 0x80, 0x7f, 0x9b, 0x96, 0x5a, 0xfe, 0x20, 0xdd, 0xf3, 0x9a, 0xa3, 0x99, 0xe8, 0x56, 0xe9, 0x59, 0x9d, 0xc0, 0x56, 0x6f, 0xd0, 0x8f, 0x68, 0xca, 0xe4, 0x72, 0x79, 0x2, 0xdf, 0xd, 0xf7, 0x8a, 0xa4, 0x9d, 0x60, 0x9a, 0x5e, 0x4, 0xf, 0x1f, 0x69, 0xe, 0x27, 0x61, 0xee, 0xcd, 0x82, 0xdd, 0xa9, 0xd3, 0x18, 0xef, 0xa0, 0x63, 0xca, 0x3, 0x89, 0xbd, 0xa3, 0x6c, 0x3d, 0x35, 0xee, 0xb7, 0x9f, 0x3, 0x7d, 0xf4, 0xab, 0x9c, 0xa0, 0xb4, 0xa7, 0x8e, 0xde, 0x67, 0x1c, 0x1, 0xda, 0xda, 0x4c, 0x92, 0x15, 0x92, 0x74, 0x37, 0x56, 0xa0, 0xf9, 0x31, 0x9d, 0xbb, 0xb9, 0x1d, 0x26, 0xf1, 0xb4, 0x59, 0x54, 0x9c, 0x4e, 0xb7, 0x29, 0x14, 0x55, 0x53, 0x1f, 0xa7, 0x6e, 0x6f, 0x2e, 0x18, 0xbe, 0x73, 0x5, 0xc5, 0xdf, 0x7c, 0xb0, 0xa3, 0xd3, 0x44, 0x8d, 0xbe, 0x62, 0xda, 0xaf, 0xa1, 0x9b, 0xd3, 0x65, 0xab, 0x52, 0xcb, 0xd2, 0xcf, 0x9b, 0x2, 0x18, 0x57, 0xa9, 0x47, 0xd5, 0x11, 0xdf, 0x75, 0xa6, 0x38, 0xe0, 0xc1, 0x7d, 0x12, 0xac, 0x20, 0x63, 0x5c, 0x8c, 0xf3, 0xef, 0x9d, 0x72, 0x53, 0x2c, 0xd, 0xa9, 0xd4, 0x8f, 0xdf, 0xb7, 0xd3, 0x7c, 0x1e, 0x68, 0xec, 0xb0, 0x74, 0x9b, 0xe5, 0x7, 0xb4, 0xda, 0x23, 0xa6, 0xb5, 0x5c, 0xc6, 0x40, 0xb3, 0x76, 0x15, 0x36, 0xbd, 0xcd, 0x2c, 0x39, 0x28, 0x7d, 0x5a, 0x41, 0x84, 0xa1, 0x30, 0x78, 0x6f, 0xe9, 0xd8, 0xc1, 0x84, 0xc1, 0x61, 0xfc, 0x43, 0x5e, 0x84, 0xb6, 0x89, 0xb1, 0x57, 0xab, 0xd3, 0xe0, 0x75, 0x23, 0x28, 0xf3, 0xa8, 0x1d, 0x18, 0xb1, 0x67, 0x4b, 0xa3, 0x4f, 0xb8, 0x52, 0xee, 0x99, 0xb2, 0xd0, 0x1e, 0x62, 0x76, 0x6, 0x99, 0xad, 0xe1, 0x8d, 0x17, 0x9b, 0x65, 0x40, 0xd5, 0x56, 0x7b, 0xe6, 0x1d, 0xd5, 0x1, 0xc2, 0x38, 0x75, 0xc4, 0x27, 0x2c, 0x2a, 0x5c, 0xf, 0xa4, 0x38, 0xc8, 0x6e, 0x85, 0x33, 0xc3, 0x85, 0x7e, 0x2f, 0x3b, 0x30, 0xa9, 0x86, 0x9b, 0x8f, 0x98, 0x71, 0x21, 0x46, 0xce, 0x5f, 0xb5, 0xac, 0x38, 0xc1, 0xf6, 0x5b, 0x93, 0x5b, 0x12, 0x12, 0x66, 0x25, 0x67, 0x7d, 0xea, 0x30, 0xa2, 0xb9, 0x1a, 0xe5, 0xf4, 0xb5, 0x1e, 0xef, 0x78, 0x7c, 0x6, 0xae, 0x8a, 0xc9, 0x87, 0x5, 0xa6, 0x9c, 0xca, 0x77, 0x3c, 0x1b, 0xce, 0xb3, 0x57, 0xf0, 0xb5, 0x54, 0x4d, 0x3d, 0x55, 0x2a, 0x3d, 0xab, 0x21, 0xcd, 0xb2, 0x68, 0xe4, 0x89, 0x92, 0xd3, 0x93, 0xc3, 0x22, 0xf0, 0x4, 0xe5, 0xf9, 0x3a, 0x1, 0xa5, 0xd4, 0xe1, 0x21, 0xab, 0xcb, 0x8a, 0xc2, 0xc2, 0x78, 0x3f, 0x28, 0xe3, 0x9f, 0xf9, 0x6b, 0x22, 0xf6, 0x35, 0x8b, 0xf3, 0x69, 0x1e, 0x29, 0xe, 0x74, 0x42, 0x35, 0xe8, 0x2d, 0x16, 0xc, 0xb2, 0x15, 0x3a, 0x67, 0x61, 0xbe, 0xbd, 0x4f, 0xb0, 0x75, 0xdc, 0x1, 0xc1, 0xa0, 0x94, 0x18, 0xb, 0xe1, 0x56, 0x71, 0x2c, 0xc0, 0x68, 0x1c, 0xd8, 0x1, 0x40, 0x3, 0x92, 0xb5, 0x15, 0xb1, 0xc8, 0x0, 0x5d, 0x22, 0xed, 0xf2, 0x7, 0xb9, 0x83, 0x22, 0x9c, 0x7f, 0x23, 0xc0, 0xe2, 0x70, 0x44, 0x2f, 0xf3, 0xa2, 0xe, 0x95, 0x4e, 0xbe, 0x58, 0xc1, 0xf7, 0x25, 0xb7, 0x63, 0x54, 0xae, 0xb1, 0xfa, 0xca, 0x1d, 0xf, 0x4, 0xfc, 0xa2, 0x1b, 0x87, 0x51, 0xed, 0x59, 0x57, 0xd6, 0xdd, 0x6, 0xe2, 0xbe, 0xdb, 0x35, 0x6d, 0xa9, 0xf3, 0x2f, 0x11, 0xdd, 0xcb, 0xe7, 0x58, 0xe7, 0x6b, 0x7, 0x68, 0x19, 0x38, 0x88, 0x5d, 0x1f, 0xc9, 0x8, 0x72, 0x7e, 0x73, 0x2d, 0x76, 0x37, 0xec, 0x86, 0x62, 0xab, 0x83, 0x5f, 0xa1, 0xa7, 0x5f, 0x94, 0x9d, 0x64, 0xaa, 0x98, 0x33, 0x9, 0xef, 0x72, 0x37, 0xec, 0x77, 0xf4, 0xb1, 0x17, 0x8c, 0x9, 0x1e, 0x2b, 0xf5, 0x66, 0x11, 0x7, 0x52, 0xc9, 0xde, 0xcc, 0xb0, 0xd1, 0xbf, 0x84, 0x8b, 0x3c, 0xed, 0xe4, 0xa9, 0x55, 0x14, 0xf3, 0xfe, 0xa1, 0x39, 0xbd, 0x26, 0x94, 0x2b, 0x3f, 0xb9, 0x6e, 0x8e, 0x63, 0x5f, 0x4f, 0x1b, 0x34, 0xf9, 0x2b, 0xd3, 0x1e, 0x2a, 0xba, 0xa9, 0xd5, 0x42, 0x4d, 0x21, 0x13, 0x3c, 0xd6, 0xc5, 0xc7, 0x6d, 0x31, 0x89, 0x4a, 0x96, 0xd2, 0x51, 0x18, 0x51, 0xca, 0x6, 0x96, 0x75, 0xd1, 0xbd, 0x7b, 0xe5, 0xcf, 0xe, 0xc1, 0x2e, 0xb1, 0xb5, 0xc2, 0xa0, 0x35, 0x56, 0xb6, 0xc7, 0x82, 0xbd, 0x67, 0x1c, 0x16, 0xcd, 0xd5, 0xc7, 0xdd, 0xcc, 0x32, 0x3a, 0xae, 0x85, 0x89, 0x2e, 0xe3, 0x29, 0x55, 0x1a, 0xd1, 0x44, 0x94, 0xba, 0x7a, 0x1a, 0xfa, 0x27, 0x24, 0x2, 0xed, 0x64, 0xe9, 0xa, 0x77, 0xa1, 0x24, 0x2d, 0x39, 0x28, 0x15, 0xcd, 0x2f, 0xc7, 0x12, 0x2c, 0xce, 0x52, 0xa1, 0x87, 0x11, 0xc5, 0xf8, 0xea, 0x9f, 0xf6, 0xed, 0xa7, 0x4d, 0x1e, 0x74, 0xec, 0x67, 0xbb, 0x5, 0x45, 0x43, 0x11, 0x8, 0x32, 0xf, 0xdf, 0x47, 0xb1, 0x92, 0x97, 0xbb, 0x7, 0xcb, 0xfa, 0x56, 0xe4, 0x29, 0x62, 0x8f, 0xe9, 0x7, 0xe0, 0xf3, 0xf, 0xba, 0x6f, 0x52, 0xf4, 0x3, 0xd1, 0x62, 0x79, 0x9d, 0x33, 0xb0, 0xf7, 0xbe, 0x33, 0x4f, 0xc1, 0xfe, 0x9b, 0xb5, 0x7b, 0x35, 0x41, 0x98, 0xba, 0xf5, 0x8e, 0xe2, 0x67, 0xb, 0x1e, 0xae, 0x69, 0xe1, 0x18, 0xcb, 0x99, 0x46, 0x9a, 0x2c, 0x20, 0xbd, 0x6b, 0x1e, 0x33, 0xe, 0xcd, 0xe, 0xd2, 0x81, 0x5e, 0xaf, 0xe, 0x36, 0x1b, 0x57, 0x45, 0x1d, 0x1c, 0x10, 0x58, 0xea, 0x9f, 0xcd, 0x52, 0x4, 0x88, 0x18, 0x8e, 0x78, 0x51, 0x66, 0x46, 0xd4, 0x8d, 0x1f, 0x35, 0x26, 0x97, 0xa9, 0xd0, 0x81, 0x72, 0xe3, 0x22, 0xd0, 0xbe, 0x44, 0x1f, 0xac, 0xdb, 0x60, 0xea, 0x6e, 0xe, 0x83, 0xf7, 0xa2, 0x6, 0xda, 0x84, 0xc4, 0xd8, 0x23, 0x5b, 0x53, 0xca, 0x50, 0xb0, 0x14, 0x67, 0x89, 0x9b, 0x7a, 0xd9, 0xeb, 0x44, 0x36, 0x8d, 0xdc, 0xb4, 0x77, 0x21, 0xb1, 0xfa, 0xf9, 0x6e, 0x10, 0x9c, 0x5d, 0x4d, 0x53, 0x64, 0xf4, 0x9b, 0xf7, 0xb, 0x36, 0xab, 0xa6, 0x49, 0xa3, 0x37, 0x25, 0x4f, 0x74, 0xc, 0xa0, 0x53, 0x42, 0xc5, 0xc7, 0xd4, 0x69, 0xcf, 0xfa, 0xe5, 0x2d, 0xf8, 0xf0, 0x4c, 0x34, 0x75, 0x47, 0x76, 0x7e, 0x3b, 0x36, 0x4, 0x6d, 0xe3, 0xb2, 0x12, 0xf3, 0x94, 0x68, 0xa5, 0xc9, 0xd1, 0x11, 0xfe, 0xb4, 0x6c, 0x3c, 0xf2, 0xe1, 0x8, 0x40, 0x39, 0xc3, 0xd9, 0x85, 0x6c, 0x32, 0x9f, 0x24, 0xea, 0x85, 0x9a, 0x5e, 0x6, 0x5e, 0x8c, 0x67, 0xa, 0xc6, 0x35, 0xdc, 0xa9, 0xfb, 0x86, 0x9f, 0x4f, 0x94, 0x8b, 0xc0, 0xb0, 0x4a, 0x75, 0x68, 0xd1, 0x61, 0xd6, 0x24, 0x76, 0x9a, 0x42, 0x6f, 0x1d, 0xce, 0x1f, 0x80, 0x69, 0xe7, 0x8c, 0xa5, 0x5f, 0xa8, 0x68, 0xc0, 0x2b, 0xca, 0x5e, 0x5d, 0x54, 0x5c, 0xc3, 0xed, 0xd1, 0x60, 0xf6, 0xa3, 0x6f, 0x27, 0x31, 0xea, 0x67, 0x71, 0xfc, 0xb8, 0xbe, 0x4e, 0x18, 0xa0, 0xae, 0xb0, 0x8d, 0x1d, 0x1a, 0xf2, 0x20, 0xf, 0x12, 0x5e, 0xc3, 0x56, 0x5f, 0x9, 0x6d, 0xd9, 0x5f, 0xaa, 0x33, 0xb7, 0xa9, 0xb, 0x2f, 0x3c, 0x35, 0xf2, 0x5a, 0xf0, 0xcb, 0x47, 0xce, 0xde, 0xa5, 0x82, 0xac, 0xa2, 0x15, 0xf7, 0xe3, 0xf8, 0x8a, 0xf1, 0x3, 0x22, 0x41, 0xa6, 0x7b, 0xc9, 0x60, 0x10, 0xc1, 0x9, 0x4, 0x55, 0xaf, 0xc3, 0x2d, 0x51, 0xaf, 0x46, 0x5, 0x2c, 0xea, 0x56, 0x46, 0x81, 0xf2, 0xf3, 0xaf, 0x8d, 0xc2, 0xfa, 0x94, 0xf4, 0x9e, 0x95, 0x3a, 0xb4, 0xfa, 0x87, 0x5f, 0x10, 0xc5, 0xd4, 0x41, 0x16, 0x89, 0x9, 0x65, 0xbd, 0x7f, 0x6d, 0x8e, 0xf, 0xe8, 0x1a, 0xb0, 0xbd, 0xe6, 0xbe, 0x5f, 0x22, 0x67, 0x9d, 0x60, 0xd8, 0xc4, 0x7f, 0x59, 0x3b, 0x43, 0x3b, 0x38, 0x56, 0xe8, 0x93, 0xb6, 0x6d, 0xe6, 0x44, 0x2f, 0x86, 0xe9, 0xe3, 0x52, 0x92, 0xb5, 0xf7, 0xec, 0x32, 0x5c, 0x66, 0x57, 0x51, 0x78, 0xdb, 0x50, 0x2f, 0x36, 0xae, 0xd7, 0xef, 0x2f, 0x70, 0xc3, 0xb0, 0xef, 0xf, 0x5d, 0x47, 0x54, 0x37, 0x5d, 0xc3, 0xd7, 0x46, 0x6b, 0xb5, 0x8f, 0xd4, 0xa4, 0x98, 0x37, 0x36, 0x33, 0xb6, 0x70, 0xa0, 0xe6, 0x98, 0xdb, 0x8f, 0xd2, 0xf3, 0x89, 0xae, 0x4c, 0xd1, 0x63, 0x63, 0xc8, 0x89, 0xb, 0x97, 0x7d, 0xd2, 0xab, 0x67, 0x21, 0x75, 0x81, 0x89, 0x21, 0xa0, 0xd5, 0x44, 0x74, 0xd4, 0xf7, 0x9b, 0xee, 0x2a, 0xc7, 0xca, 0xaf, 0x3b, 0x8, 0xb3, 0x44, 0x9a, 0x94, 0xbe, 0xde, 0x41, 0x97, 0x38, 0xa5, 0x4f, 0x6a, 0x54, 0x88, 0x93, 0x8e, 0x63, 0xdc, 0x7b, 0x4, 0xa0, 0x9c, 0x41, 0xe6, 0x3f, 0xca, 0x57, 0xea, 0xaa, 0x48, 0xf6, 0x47, 0x70, 0x17, 0xab, 0xfb, 0x41, 0x90, 0x8a, 0xe4, 0x54, 0xa2, 0xdb, 0x6b, 0x57, 0x28, 0xb, 0x8e, 0xda, 0xdc, 0xfd, 0x2a, 0xc7, 0xbc, 0xee, 0x7, 0xe8, 0xbf, 0x77, 0x25, 0xf4, 0x6d, 0x33, 0xd3, 0x7, 0x25, 0x9, 0xe2, 0xbf, 0x44, 0xc2, 0xa8, 0x62, 0x67, 0xe8, 0xdc, 0x8f, 0xc3, 0x9a, 0xc1, 0x91, 0x63, 0x70, 0x38, 0xdd, 0xd5, 0xa5, 0x96, 0x5a, 0xf6, 0x24, 0xd3, 0x21, 0xd4, 0x87, 0xd5, 0x61, 0xea, 0x73, 0x71, 0xa3, 0xa2, 0x73, 0x76, 0xe8, 0x65, 0x8b, 0x77, 0x53, 0x8, 0x80, 0x84, 0x23, 0x3e, 0xb4, 0xba, 0x5, 0x1e, 0x44, 0xf8, 0x10, 0xbe, 0xef, 0x21, 0x46, 0x12, 0xfe, 0x11, 0xfa, 0x7b, 0x5d, 0x68, 0x81, 0x2e, 0x77, 0x7b, 0x4, 0x76, 0xa9, 0x34, 0xbf, 0x81, 0x7d, 0xf2, 0x23, 0xef, 0x48, 0x5f, 0x91, 0xe2, 0x8, 0x76, 0xc2, 0xc3, 0xd5, 0x21, 0xa5, 0xfa, 0x43, 0xb, 0x3b, 0x84, 0x72, 0xca, 0x63, 0x26, 0xfb, 0x13, 0x76, 0x37, 0xb8, 0x4d, 0x1d, 0xb4, 0x29, 0x57, 0x7f, 0x6b, 0x52, 0x3b, 0x58, 0x98, 0x48, 0xb1, 0x87, 0xd1, 0xd3, 0xad, 0xbb, 0xa6, 0x32, 0xb7, 0x0, 0x96, 0xe3, 0x48, 0x20, 0x26, 0xf4, 0x2, 0x8e, 0xe4, 0x9d, 0x3d, 0x38, 0xb6, 0x50, 0x6b, 0x43, 0xad, 0x85, 0x1e, 0x47, 0x81, 0x34, 0x8d, 0xf7, 0xd6, 0xc8, 0x5, 0xd0, 0x6a, 0xea, 0x1, 0x8b, 0x7, 0x5c, 0x1, 0x97, 0xee, 0xaf, 0xc7, 0xd3, 0xae, 0xa2, 0x3b, 0x4e, 0xa9, 0xf1, 0xcd, 0x46, 0xd2, 0xa1, 0xd3, 0x83, 0x1, 0xe5, 0x42, 0x7a, 0xf4, 0xdf, 0x41, 0xb5, 0x68, 0x52, 0x4b, 0xd5, 0xbc, 0xe9, 0x23, 0x4e, 0x30, 0xcf, 0x24, 0x3f, 0x24, 0x36, 0x6e, 0x12, 0x16, 0xf8, 0x87, 0x43, 0x61, 0x6d, 0xb, 0x3b, 0x3, 0x6a, 0xa4, 0x26, 0x7c, 0x77, 0x2d, 0x8b, 0x45, 0xc8, 0x1b, 0xaf, 0x9c, 0xe7, 0x7d, 0x52, 0xba, 0x1, 0xc4, 0x25, 0xb6, 0xbb, 0x61, 0x42, 0xd4, 0x46, 0x13, 0xe, 0xc7, 0x4b, 0x7b, 0x28, 0x4b, 0xc4, 0x96, 0x4b, 0x2f, 0x56, 0x54, 0x52, 0xc7, 0x93, 0x84, 0x65, 0x20, 0x4a, 0xa2, 0xb8, 0xfe, 0x49, 0xf9, 0x23, 0x3f, 0xa5, 0x2c, 0xf5, 0xd1, 0xfe, 0xeb, 0x17, 0x53, 0x48, 0xfb, 0xbc, 0xbe, 0x1b, 0x69, 0x9b, 0x5d, 0xa0, 0x78, 0x62, 0x6b, 0xff, 0x17, 0x56, 0xbd, 0x9e, 0xc9, 0xe3, 0xc5, 0x34, 0x1b, 0x24, 0x6a, 0x15, 0x84, 0x17, 0x2e, 0x24, 0x64, 0xfc, 0xdf, 0x67, 0x5d, 0x69, 0x2f, 0x48, 0x6, 0x42, 0x11, 0xc0, 0x27, 0xee, 0xe, 0xce, 0x67, 0xb9, 0x5d, 0xb, 0xc8, 0x21, 0x51, 0x37, 0xdb, 0x65, 0xa0, 0xcc, 0x1e, 0xa3, 0x3c, 0x56, 0x7a, 0x2e, 0x7e, 0xa0, 0x38, 0x52, 0x4e, 0xfc, 0x6f, 0xe5, 0x54, 0xd8, 0xce, 0x32, 0x66, 0x29, 0x6c, 0x3d, 0x85, 0xb8, 0x70, 0xaf, 0x1a, 0x7d, 0x9d, 0xe9, 0x59, 0x64, 0x68, 0x2d, 0xd9, 0xba, 0xc3, 0xaf, 0x5b, 0xba, 0xc8, 0xc, 0x46, 0xbf, 0x78, 0x9c, 0xa3, 0x5a, 0x95, 0x18, 0x19, 0x95, 0x43, 0x5a, 0x14, 0xe3, 0xe4, 0x5f, 0xa8, 0x17, 0xb5, 0xf8, 0x6f, 0x90, 0xb8, 0xfc, 0xd0, 0x34, 0x2, 0xe6, 0x23, 0x1b, 0x6, 0xf2, 0xac, 0x42, 0xe5, 0xff, 0x9c, 0xb5, 0x4c, 0x6b, 0x1f, 0x19, 0x7e, 0x28, 0xd8, 0x77, 0xd8, 0x9, 0xdc, 0x7d, 0x85, 0x21, 0x41, 0x89, 0x67, 0x14, 0x8c, 0x47, 0x23, 0x1c, 0xa4, 0x5e, 0xe0, 0xb6, 0x56, 0xc0, 0xf0, 0xbb, 0xfe, 0x94, 0x15, 0xb0, 0x53, 0x4b, 0xda, 0x82, 0x8, 0x86, 0xdb, 0xfa, 0x91, 0x67, 0x52, 0xf7, 0xf6, 0xcd, 0x74, 0x7b, 0x2d, 0x83, 0x9e, 0x4, 0x34, 0xa, 0xb9, 0xc2, 0xcc, 0x81, 0x35, 0xa4, 0xc, 0xb1, 0x60, 0x93, 0xb8, 0x9e, 0x63, 0x73, 0x1b, 0xa7, 0xe4, 0xe1, 0x1f, 0x33, 0xba, 0x4f, 0x19, 0xf9, 0x72, 0x80, 0x93, 0x6b, 0xfd, 0x6f, 0x32, 0x90, 0x67, 0x65, 0x1c, 0x27, 0x53, 0x6e, 0xce, 0x72, 0x42, 0xf1, 0x44, 0x64, 0x20, 0x67, 0x34, 0x58, 0x33, 0xb2, 0xa3, 0x34, 0xf7, 0xc0, 0x60, 0x68, 0xef, 0x90, 0x5a, 0x20, 0x26, 0x95, 0xd, 0xbb, 0xe2, 0x4, 0x17, 0xe7, 0x8b, 0xcb, 0xfa, 0x83, 0xf3, 0x2, 0x1e, 0x87, 0x18, 0x24, 0x57, 0xc1, 0x82, 0x40, 0x81, 0x76, 0x17, 0xd7, 0x73, 0x0, 0xc2, 0x29, 0xd0, 0x4a, 0x91, 0xcc, 0x28, 0xe7, 0x87, 0xe5, 0xeb, 0xc1, 0x86, 0xf1, 0xfd, 0xd5, 0xbc, 0x61, 0x22, 0x3c, 0xdb, 0x6f, 0xe9, 0xf8, 0xf9, 0xf2, 0xa6, 0x14, 0xd0, 0x30, 0xd2, 0x49, 0xec, 0x4f, 0x23, 0xce, 0x3e, 0x96, 0xd9, 0xa8, 0x5, 0x96, 0xc5, 0x25, 0x20, 0x86, 0x9a, 0x92, 0xf8, 0x19, 0x45, 0x44, 0x87, 0x39, 0x6a, 0x47, 0xbf, 0x12, 0x65, 0xff, 0xb6, 0x1, 0x91, 0x7d, 0xcf, 0x9, 0xd8, 0x64, 0x8a, 0x59, 0xca, 0x56, 0xbe, 0x93, 0x49, 0x77, 0xec, 0xd7, 0x15, 0x36, 0xb3, 0xcb, 0x85, 0x97, 0x89, 0x10, 0xad, 0xe3, 0xee, 0x2, 0xfd, 0x92, 0xa0, 0xb8, 0x70, 0x52, 0x14, 0x30, 0x35, 0x3d, 0x6b, 0xa8, 0x75, 0xb6, 0x12, 0x85, 0xc6, 0x98, 0x3d, 0x32, 0xf, 0xb4, 0xeb, 0x62, 0x85, 0xc7, 0x8b, 0x4b, 0xde, 0x9c, 0x3f, 0x41, 0x54, 0x1f, 0x30, 0x7d, 0x64, 0x56, 0xab, 0x2b, 0x4f, 0xfb, 0xe4, 0xa5, 0x23, 0xec, 0xbf, 0x1c, 0x2d, 0x25, 0x2b, 0x1d, 0xd, 0x12, 0x77, 0xe1, 0xbb, 0x76, 0xd5, 0xfc, 0x34, 0x1a, 0x73, 0x83, 0x3e, 0x7d, 0x42, 0x4, 0x8e, 0x6e, 0x83, 0xed, 0x8e, 0x2, 0xb9, 0x2b, 0x7c, 0xca, 0x12, 0xb6, 0xf8, 0xcf, 0x6a, 0xb3, 0x3a, 0xc7, 0xd9, 0xd3, 0xef, 0xe5, 0x8f, 0xb8, 0xb3, 0x4e, 0xea, 0xed, 0xc6, 0x6b, 0x2a, 0xbe, 0x77, 0xec, 0x8e, 0x48, 0x33, 0x31, 0xb9, 0x43, 0xe1, 0x6, 0x71, 0xb1, 0x66, 0xf5, 0x1f, 0xf4, 0x32, 0xfa, 0x4e, 0x65, 0x72, 0x91, 0x9e, 0x46, 0xa3, 0x3f, 0xc2, 0x41, 0x4, 0xf, 0x48, 0xb4, 0x2e, 0x9a, 0x98, 0xc1, 0xb0, 0x2e, 0x71, 0xb4, 0xa7, 0x9c, 0xa2, 0x93, 0xf, 0xba, 0xcb, 0x3c, 0x8c, 0x42, 0x19, 0xd6, 0x14, 0x5c, 0x20, 0x6e, 0x86, 0x16, 0x64, 0xb3, 0x57, 0x79, 0xdb, 0x90, 0x4e, 0x8b, 0xac, 0x45, 0x1d, 0x69, 0x32, 0x4, 0x50, 0x3, 0x4e, 0xf6, 0xac, 0x59, 0xa7, 0x7, 0x17, 0x25, 0x97, 0x9c, 0x9c, 0xd8, 0x14, 0x5, 0xc3, 0x7f, 0xe6, 0xa8, 0x7f, 0x14, 0x1, 0x17, 0xbe, 0x85, 0x20, 0xab, 0x8b, 0xb, 0x2e, 0x9e, 0x57, 0x4e, 0x28, 0xac, 0x24, 0x18, 0x65, 0xd5, 0x64, 0x36, 0x89, 0x74, 0x25, 0x43, 0xd, 0x89, 0xa3, 0x68, 0x5e, 0xc5, 0x6e, 0x5e, 0x7c, 0x8a, 0x5a, 0xc8, 0x39, 0x43, 0xb, 0xe9, 0x12, 0xbf, 0x55, 0xb6, 0x22, 0xf9, 0x85, 0x6b, 0x84, 0x31, 0x0, 0xd7, 0xf4, 0xb, 0x4d, 0xce, 0x54, 0x9a, 0x95, 0x42, 0xa1, 0xf1, 0x3a, 0xe8, 0xf4, 0xd7, 0xf9, 0xd4, 0x85, 0xb2, 0x5c, 0x95, 0x6f, 0x91, 0xba, 0xda, 0xff, 0x99, 0xe0, 0xb0, 0x7b, 0xe5, 0x52, 0xd1, 0xb0, 0xea, 0x34, 0x30, 0xa4, 0x28, 0xf8, 0xce, 0xa9, 0xb8, 0xa2, 0xff, 0x36, 0xa, 0x1a, 0x5, 0xec, 0xb9, 0x7e, 0x40, 0x17, 0x55, 0x72, 0xe6, 0x68, 0xea, 0x96, 0x60, 0x79, 0x9c, 0xfb, 0x77, 0x3c, 0xfb, 0xfb, 0xb5, 0x3d, 0x85, 0x1a, 0xa5, 0x64, 0xe8, 0xa9, 0x4b, 0x47, 0x21, 0x8b, 0x1b, 0x8a, 0x6e, 0x99, 0x76, 0x26, 0x6c, 0x28, 0xa, 0x12, 0x94, 0x26, 0x36, 0x82, 0x7c, 0xdb, 0xa5, 0x83, 0x83, 0x48, 0x9a, 0x1e, 0xe6, 0x6d, 0x21, 0x84, 0x9f, 0x3, 0x50, 0xd7, 0x7d, 0x85, 0xcd, 0x43, 0xad, 0x7, 0xd, 0x2, 0xab, 0x59, 0xc6, 0x12, 0xda, 0x48, 0xae, 0x37, 0x94, 0xad, 0x52, 0x54, 0xe6, 0xeb, 0xc2, 0x49, 0x64, 0xc1, 0xd7, 0xf9, 0x2c, 0x1c, 0x4c, 0x7c, 0xcc, 0xab, 0xe5, 0x95, 0xee, 0x6a, 0x88, 0x20, 0x13, 0xc, 0x17, 0xae, 0xbe, 0x56, 0x90, 0x7b, 0xbb, 0x62, 0xd6, 0xc0, 0xdb, 0x50, 0xb2, 0xa5, 0xc8, 0x3, 0x23, 0x1d, 0xc1, 0x32, 0x14, 0xd8, 0x4e, 0x9f, 0x76, 0x3, 0x1f, 0x12, 0x69, 0xa6, 0x7d, 0x28, 0x98, 0x53, 0x84, 0xfd, 0xa5, 0xc7, 0x3a, 0x2, 0xdd, 0xcc, 0x3b, 0x94, 0xda, 0xda, 0x14, 0xd1, 0xb0, 0xf6, 0x7e, 0x21, 0xc3, 0x84, 0x8b, 0x22, 0x3f, 0x93, 0x7c, 0x7a, 0x47, 0xa9, 0x52, 0x82, 0xb, 0x44, 0xfd, 0x8a, 0x72, 0xf6, 0x5e, 0x5e, 0xbd, 0xe4, 0x6c, 0x59, 0xd8, 0x3b, 0x5c, 0x3e, 0x2d, 0x2c, 0xf2, 0xf5, 0x80, 0x8b, 0x91, 0xc5, 0x6c, 0xbb, 0xb7, 0x40, 0x50, 0x8d, 0x36, 0x1c, 0xa1, 0x95, 0x26, 0xa1, 0x42, 0x61, 0xb6, 0x70, 0xea, 0x19, 0xeb, 0x3a, 0x58, 0xac, 0x60, 0x37, 0x24, 0xab, 0xe, 0x98, 0xbb, 0x7c, 0x31, 0xc8, 0x54, 0x26, 0x5e, 0x55, 0x8c, 0xc0, 0x8c, 0x7f, 0x30, 0xd8, 0xe6, 0x20, 0x65, 0x2d, 0xfe, 0x93, 0x89, 0x42, 0x57, 0xf3, 0x47, 0xf1, 0xe9, 0xf1, 0x6c, 0xfd, 0xd2, 0x14, 0x7d, 0x9c, 0x5f, 0xb0, 0xcb, 0x4f, 0x2d, 0x64, 0xd0, 0xec, 0xa3, 0xf7, 0x41, 0x73, 0x8e, 0xf0, 0xfe, 0x83, 0xad, 0x5c, 0x11, 0x63, 0x3a, 0xa0, 0x23, 0x3f, 0x64, 0x43, 0xb7, 0x5a, 0xe6, 0xab, 0x78, 0x8a, 0xd3, 0x9c, 0xc8, 0xed, 0x35, 0xb1, 0x75, 0x7c, 0xbf, 0x68, 0xf5, 0xd, 0x53, 0x2e, 0x75, 0xd8, 0x3d, 0x82, 0xc6, 0x8, 0xe3, 0x76, 0x4a, 0x5c, 0xf8, 0x37, 0xcf, 0x8a, 0xe6, 0xb2, 0x55, 0x99, 0x4c, 0x85, 0xaf, 0x32, 0xab, 0x3d, 0xdf, 0x44, 0xa5, 0x93, 0xf4, 0x5c, 0xa2, 0xf5, 0xc3, 0x8e, 0x4b, 0xeb, 0x2f, 0x62, 0x1a, 0x64, 0x27, 0x8f, 0x4d, 0x49, 0xbc, 0xdc, 0xf0, 0xaa, 0xf7, 0xb4, 0x7b, 0x5b, 0xb4, 0xbb, 0x70, 0xf9, 0x51, 0xe5, 0x7d, 0xe5, 0xa2, 0x2c, 0x9f, 0xe4, 0xf3, 0xd0, 0xcf, 0xef, 0x76, 0x5c, 0x1f, 0x9, 0x87, 0xe5, 0xec, 0xae, 0x79, 0x7d, 0x16, 0xdd, 0xe, 0x92, 0x32, 0xc1, 0x7e, 0x7d, 0xfa, 0xa2, 0xf8, 0x9d, 0x3, 0x91, 0xaf, 0x30, 0xbb, 0xc0, 0x6, 0x62, 0xf4, 0x59, 0x6b, 0x67, 0x22, 0xf5, 0xe2, 0xf5, 0x1f, 0x66, 0x1d, 0xa5, 0x6e, 0x39, 0xa0, 0xf4, 0x11, 0x26, 0x7a, 0x7d, 0x80, 0x45, 0x14, 0x6c, 0x50, 0x24, 0x9b, 0x5a, 0x75, 0x5, 0x57, 0xda, 0x60, 0x9e, 0x31, 0x1a, 0x1f, 0x32, 0xcc, 0xc8, 0x8f, 0x7d, 0xd6, 0x33, 0x94, 0x4d, 0x2d, 0x64, 0x83, 0x96, 0xd2, 0x7d, 0x6a, 0x8f, 0xcb, 0xa5, 0x7f, 0x7, 0xde, 0x7b, 0x9b, 0xdb, 0x91, 0x65, 0x57, 0xfb, 0x16, 0x97, 0x41, 0x25, 0x3d, 0x17, 0x13, 0xff, 0x40, 0xb3, 0xd5, 0x9d, 0x59, 0x30, 0xea, 0xc5, 0x76, 0xfe, 0xb0, 0x97, 0x52, 0x6b, 0xfc, 0xdc, 0x5a, 0x8f, 0xab, 0xc8, 0x68, 0x69, 0x1c, 0x8d, 0x92, 0x1c, 0x90, 0xf5, 0xc7, 0x23, 0xf7, 0x2, 0xd4, 0x73, 0x97, 0x21, 0xc3, 0x3, 0x42, 0x47, 0xdd, 0x51, 0x1b, 0xa3, 0x6a, 0x7c, 0xdf, 0x3c, 0xe2, 0x2b, 0x55, 0x7a, 0xe3, 0x49, 0x3d, 0x87, 0x6e, 0x5a, 0xb, 0xe8, 0xbe, 0xfe, 0x57, 0x39, 0xe7, 0xd8, 0x7b, 0xe4, 0xbe, 0xec, 0xc5, 0x75, 0xbf, 0x63, 0xae, 0x94, 0x49, 0xd4, 0x79, 0x23, 0x89, 0xfb, 0x38, 0xf, 0xd0, 0x8b, 0x16, 0x30, 0x31, 0x53, 0xd0, 0xe4, 0x8e, 0xd4, 0x75, 0x33, 0xdf, 0x5c, 0xdb, 0xaa, 0x77, 0x4f, 0x55, 0x69, 0x67, 0x69, 0x3c, 0x96, 0xe8, 0x96, 0x33, 0x4e, 0x67, 0xfd, 0xd3, 0xf2, 0xdb, 0xdd, 0x2f, 0xe5, 0xe3, 0xd0, 0x99, 0xee, 0xf6, 0xb8, 0xbb, 0x70, 0x2f, 0xae, 0xcb, 0x51, 0x6, 0xb9, 0x51, 0xeb, 0xa8, 0xaa, 0x93, 0x5, 0xbc, 0xc4, 0xef, 0x99, 0xf4, 0x1d, 0xdd, 0x89, 0x86, 0xcd, 0x8e, 0xa5, 0x67, 0xf3, 0x22, 0xa8, 0x99, 0xee, 0x1a, 0xc5, 0x74, 0x82, 0xae, 0xb9, 0x85, 0xd4, 0x95, 0x9c, 0xb3, 0x30, 0x7d, 0x45, 0xd4, 0x14, 0x6c, 0x81, 0xef, 0xc1, 0xbc, 0xb, 0xa9, 0xfe, 0xba, 0xed, 0xa2, 0x59, 0xa4, 0x7a, 0x31, 0x5f, 0x7c, 0x27, 0x42, 0xf4, 0x4e, 0x75, 0x10, 0x21, 0x1, 0x96, 0xf4, 0x20, 0xdc, 0x6e, 0xed, 0x7b, 0xa1, 0xcd, 0x53, 0x98, 0x81, 0x24, 0xe4, 0xdf, 0xc, 0xe7, 0x2c, 0x1e, 0xf7, 0x98, 0x32, 0x79, 0x13, 0x7b, 0x30, 0xbe, 0xdb, 0x78, 0x30, 0x1f, 0x3c, 0x36, 0x99, 0xee, 0x76, 0xe, 0xc2, 0xd1, 0x6d, 0x20, 0xaa, 0x3c, 0x42, 0x57, 0x4b, 0xee, 0x23, 0xe, 0x84, 0xfb, 0x8e, 0x3b, 0x79, 0xc3, 0x4a, 0xa0, 0x8c, 0x1f, 0xed, 0xeb, 0x38, 0x44, 0x93, 0xa2, 0x25, 0xbb, 0x4e, 0x58, 0x66, 0x54, 0x3e, 0x6f, 0x89, 0x69, 0xc0, 0xe, 0xaf, 0x15, 0xc4, 0x3d, 0xa4, 0x5a, 0x9a, 0xb0, 0xdd, 0x3e, 0xc1, 0xf6, 0xb8, 0x9e, 0xd4, 0x4f, 0x20, 0x4, 0x7a, 0x70, 0x16, 0x4f, 0xd7, 0xfc, 0xbd, 0xd5, 0xd0, 0x58, 0x5, 0xfc, 0x56, 0x86, 0xe2, 0x97, 0x36, 0xde, 0xba, 0xce, 0x1, 0x71, 0x73, 0x20, 0x10, 0x2b, 0xa8, 0x47, 0x6, 0x90, 0xe6, 0x87, 0x5f, 0x4f, 0x5, 0x40, 0x8f, 0xd4, 0xe, 0x8e, 0x90, 0x3, 0x38, 0x85, 0x79, 0xd4, 0x33, 0xf6, 0xa9, 0x52, 0xb2, 0x28, 0x4a, 0x9a, 0x3c, 0xd1, 0x8e, 0x64, 0xf, 0x46, 0x1f, 0x76, 0xf6, 0x2e, 0x3e, 0x36, 0x63, 0xd0, 0x36, 0x9b, 0xb, 0x93, 0x53, 0x9b, 0x97, 0xc4, 0x8f, 0xac, 0x73, 0x70, 0x34, 0x97, 0x55, 0xcd, 0x5e, 0xe, 0xe, 0x38, 0x84, 0x39, 0x3c, 0xfe, 0xc4, 0x6b, 0x2c, 0xb2, 0xe3, 0xdf, 0xeb, 0x7b, 0x6c, 0x53, 0x81, 0x4a, 0xba, 0x59, 0x34, 0x69, 0x25, 0xb7, 0xb6, 0x3a, 0xf2, 0x11, 0x2b, 0x92, 0x14, 0x70, 0x37, 0xbc, 0x53, 0xdb, 0x60, 0xfc, 0x5a, 0xab, 0xc8, 0x45, 0x46, 0xa3, 0xf2, 0xb9, 0x20, 0x55, 0x23, 0x2, 0xaa, 0x7, 0xc5, 0xf, 0xce, 0x4c, 0x95, 0xa2, 0x52, 0xe7, 0xc2, 0xe1, 0x7c, 0xbb, 0x31, 0x27, 0x8c, 0x89, 0xb8, 0x8f, 0xe4, 0xc2, 0x91, 0x70, 0x6a, 0x6, 0x9d, 0x8a, 0x7b, 0x13, 0x2c, 0x88, 0x26, 0xe2, 0xa0, 0x82, 0x1b, 0x63, 0x86, 0x49, 0xa2, 0x2d, 0x15, 0x18, 0x35, 0x36, 0xd7, 0x4e, 0x84, 0xc7, 0x27, 0x6e, 0xd8, 0x6f, 0x47, 0x2f, 0x28, 0xdc, 0xef, 0xaf, 0x4, 0xca, 0xda, 0x4e, 0xa0, 0x4d, 0xe3, 0x19, 0x61, 0xbc, 0x6e, 0x25, 0x8b, 0x8b, 0xd7, 0x87, 0x7, 0xe9, 0x13, 0xa4, 0x56, 0x50, 0xbe, 0x74, 0x5a, 0x1d, 0x6, 0xee, 0x82, 0xf5, 0x6f, 0xa1, 0xde, 0xc4, 0x81, 0x17, 0xe4, 0xa2, 0xc8, 0xbf, 0x99, 0x1e, 0xc8, 0xb0, 0xe0, 0x2d, 0x7e, 0x54, 0xb, 0x69, 0x4d, 0x4f, 0x62, 0xe4, 0x9a, 0xcc, 0xbd, 0x5d, 0x54, 0x83, 0x3a, 0x8e, 0x1e, 0x9b, 0x40, 0xb6, 0xdb, 0x73, 0x25, 0x39, 0x35, 0xc9, 0xa6, 0xc4, 0x60, 0x29, 0x48, 0x98, 0x87, 0xe1, 0x5a, 0xad, 0x59, 0x10, 0xf0, 0x96, 0x9d, 0x55, 0x4d, 0x27, 0x1e, 0x15, 0x38, 0x1, 0x6c, 0xdb, 0xb8, 0xd3, 0xc0, 0x18, 0x4f, 0xaf, 0x21, 0x99, 0x6f, 0x83, 0xaa, 0xa3, 0x49, 0x29, 0x60, 0x4, 0x8c, 0x7b, 0xb2, 0xea, 0xdb, 0x3b, 0xbf, 0x40, 0x70, 0xaa, 0x9e, 0x2b, 0x24, 0x91, 0xb0, 0x14, 0x16, 0xe5, 0x79, 0xc4, 0x39, 0x5d, 0xaf, 0x4b, 0xe, 0x2b, 0xde, 0x8e, 0x33, 0x45, 0x39, 0xa5, 0xf0, 0xb7, 0x92, 0xb1, 0x5b, 0x5f, 0x79, 0x12, 0x31, 0x97, 0x9f, 0x5c, 0x71, 0xe1, 0x6e, 0x4e, 0x98, 0x37, 0x44, 0x24, 0xe8, 0xcd, 0x6b, 0xb6, 0xec, 0x58, 0x48, 0xcb, 0x55, 0xee, 0xfb, 0xaf, 0xab, 0x35, 0x67, 0x13, 0x7c, 0x8e, 0xc3, 0xbe, 0x5d, 0x95, 0x15, 0x66, 0x54, 0x53, 0xd1, 0x8a, 0x38, 0x2c, 0x78, 0xc0, 0x51, 0x2f, 0x95, 0xe0, 0xc6, 0x3a, 0xc5, 0xa4, 0x9b, 0xa8, 0xdf, 0x21, 0x1b, 0x2a, 0x78, 0xe6, 0x27, 0x65, 0x7f, 0x5d, 0xec, 0x51, 0xc2, 0x89, 0x7d, 0x87, 0x40, 0x39, 0x90, 0x16, 0x56, 0x8f, 0xc, 0xb3, 0x1a, 0x69, 0xf0, 0xfc, 0x1c, 0x9e, 0x60, 0x21, 0xb, 0xb2, 0xe9, 0xbf, 0x0, 0x3, 0x2a, 0xf4, 0xfa, 0x14, 0xb1, 0xad, 0x2f, 0x53, 0xbf, 0xd1, 0xf5, 0x1b, 0x52, 0xb9, 0xc0, 0x8f, 0x32, 0xde, 0x36, 0xfc, 0x3b, 0x3c, 0xf9, 0x51, 0xbd, 0x60, 0x5f, 0x4e, 0x7a, 0xe, 0x5, 0x89, 0xd9, 0xc2, 0xdb, 0xd2, 0x4e, 0x3d, 0x90, 0x2f, 0x68, 0x83, 0x2d, 0x3b, 0x7c, 0xc8, 0x59, 0xba, 0xe, 0x35, 0x93, 0x7e, 0x9c, 0x4d, 0xc8, 0x9d, 0x8e, 0xd7, 0x26, 0xb2, 0xe, 0xb0, 0x21, 0x9b, 0x5f, 0xae, 0x7b, 0x26, 0xaf, 0x94, 0xd3, 0x3b, 0xe3, 0xae, 0x15, 0x2e, 0xbe, 0x25, 0xcc, 0x86, 0xaa, 0x0, 0xc5, 0x8e, 0x6a, 0x7d, 0xf6, 0xb, 0x4f, 0x58, 0x6, 0x63, 0xf9, 0x44, 0xaa, 0x46, 0x58, 0x78, 0xc2, 0xe0, 0xe7, 0x38, 0xba, 0x86, 0x67, 0x6f, 0x2e, 0x8b, 0x58, 0xce, 0x87, 0xbf, 0x9, 0x3a, 0xee, 0x5f, 0x46, 0x22, 0x70, 0x3b, 0x72, 0x94, 0x23, 0x68, 0x64, 0x14, 0x41, 0xb8, 0x8, 0x29, 0x46, 0xe6, 0x29, 0xe0, 0x2c, 0xb5, 0xe, 0x43, 0x8e, 0xa7, 0xcc, 0x8f, 0xe, 0xb6, 0xad, 0x91, 0xa9, 0x54, 0xb6, 0x62, 0x70, 0xdd, 0x20, 0xe5, 0x6f, 0x9a, 0xc6, 0x28, 0xd4, 0x81, 0x42, 0x15, 0xbf, 0xc2, 0xe2, 0x40, 0x97, 0xb0, 0xfe, 0x4, 0x97, 0xe9, 0xa9, 0x5, 0x22, 0x7a, 0x62, 0x65, 0xc5, 0xfb, 0xc2, 0xd0, 0x73, 0x8d, 0xec, 0xe8, 0x8d, 0xc, 0xc2, 0x8f, 0xed, 0x3e, 0x22, 0x49, 0x3b, 0x36, 0xa8, 0x83, 0x25, 0xe3, 0x1e, 0xa6, 0xb0, 0xc2, 0xc9, 0xb9, 0x6c, 0xb, 0x1a, 0x5c, 0xc8, 0xdb, 0x90, 0xd2, 0xc3, 0xf7, 0x49, 0xac, 0xc1, 0xf4, 0x1e, 0x97, 0xbb, 0xdf, 0xa8, 0xe1, 0x2e, 0x1e, 0xc0, 0xa3, 0x7c, 0x25, 0x5c, 0x61, 0x69, 0xc3, 0x27, 0x14, 0x3a, 0xb4, 0x1f, 0x24, 0xf3, 0x72, 0x34, 0xcb, 0xa7, 0x94, 0xd5, 0x10, 0xbe, 0xa, 0x66, 0x24, 0xc0, 0x5e, 0xc1, 0xed, 0x4c, 0x61, 0x6b, 0x49, 0xd4, 0x76, 0xb1, 0x85, 0xb8, 0xdb, 0x62, 0x4d, 0x73, 0x4, 0xb, 0x87, 0xb5, 0xdd, 0x36, 0xc6, 0x53, 0xb7, 0x2c, 0xc, 0x34, 0xcd, 0x14, 0xe6, 0x80, 0x1c, 0x9a, 0xab, 0xc2, 0xc7, 0x65, 0x4c, 0x4d, 0xb3, 0xaf, 0x84, 0xea, 0xc5, 0xe2, 0xe7, 0x10, 0x46, 0x1d, 0xb5, 0x4a, 0x3c, 0x97, 0x1b, 0x6d, 0x3f, 0x89, 0xc4, 0xa5, 0x5b, 0x94, 0xe9, 0xd7, 0xcd, 0xa3, 0xee, 0x17, 0x44, 0x6, 0x83, 0x49, 0x51, 0x60, 0x2b, 0xdf, 0x6b, 0xad, 0x3c, 0xb2, 0x59, 0x14, 0xc3, 0x26, 0xf7, 0x5c, 0x41, 0xc3, 0xb2, 0x23, 0x4a, 0x35, 0xd6, 0x32, 0x35, 0x96, 0x82, 0x3a, 0xcd, 0xe7, 0x6f, 0xc0, 0x96, 0x56, 0xf6, 0xe9, 0x15, 0x3a, 0xfd, 0x9a, 0x57, 0x30, 0x6, 0x51, 0xed, 0x60, 0x53, 0x18, 0xa6, 0xac, 0xcd, 0x3d, 0x2f, 0x3d, 0x85, 0xc1, 0x3d, 0x70, 0x41, 0x27, 0xa0, 0xf1, 0x33, 0x1a, 0x4a, 0xd8, 0x8a, 0xbd, 0x7c, 0xb0, 0x5c, 0xc3, 0x8c, 0x69, 0x6c, 0x5f, 0xb9, 0xe6, 0x61, 0x65, 0x19, 0xd1, 0x2b, 0x21, 0xd7, 0x4f, 0x7b, 0x61, 0x7e, 0xcd, 0x49, 0xf1, 0x18, 0x2c, 0x19, 0xab, 0x1f, 0x90, 0x4f, 0x29, 0x4f, 0x16, 0x30, 0x70, 0xfe, 0xcb, 0x5f, 0xec, 0xa6, 0x6b, 0x24, 0xe2, 0xb7, 0xfc, 0xe2, 0xe2, 0xc, 0x1a, 0x1a, 0x22, 0xb3, 0x88, 0x7c, 0x1e, 0xc5, 0x88, 0x2d, 0xc9, 0x93, 0xdd, 0xc7, 0x72, 0x59, 0xfb, 0x6, 0x11, 0x8e, 0x14, 0xc2, 0x41, 0x14, 0xf, 0xf6, 0xa0, 0xf5, 0xd4, 0x7d, 0x54, 0x31, 0xf, 0x96, 0x63, 0xb2, 0x52, 0x9b, 0xed, 0xf8, 0x2b, 0xe8, 0x30, 0xc5, 0xc9, 0xe3, 0x1c, 0x2a, 0x77, 0xbb, 0xd, 0x42, 0x25, 0x66, 0x4d, 0x14, 0x72, 0xc1, 0xd9, 0x60, 0x5a, 0xe2, 0x19, 0x55, 0xfa, 0x22, 0x77, 0x4c, 0xf8, 0xbc, 0x13, 0xa7, 0xf7, 0x9e, 0xf8, 0xe, 0xca, 0x8a, 0x22, 0x55, 0xd4, 0x3e, 0xfd, 0x2f, 0x4e, 0xd6, 0x3, 0x4, 0xc9, 0xe6, 0xdd, 0xf5, 0x90, 0xc3, 0xf1, 0x8a, 0xe1, 0x78, 0x76, 0xa6, 0x52, 0x14, 0x73, 0x58, 0xb3, 0xa5, 0xb0, 0xeb, 0x49, 0x83, 0x6c, 0xd6, 0x2e, 0x7e, 0x9e, 0xc2, 0xc5, 0x54, 0xb1, 0xdb, 0x62, 0xa4, 0xed, 0xcf, 0xec, 0xd5, 0xca, 0x69, 0x6b, 0xe6, 0x2d, 0xe4, 0xdb, 0xd6, 0xf2, 0xb2, 0xe5, 0x65, 0x86, 0xf3, 0xed, 0x6a, 0x42, 0x23, 0x57, 0x7f, 0x7b, 0x13, 0x85, 0x8a, 0x48, 0x86, 0xb3, 0xcb, 0x8b, 0xb3, 0x43, 0xcc, 0x15, 0x79, 0xd8, 0x91, 0xd7, 0xf3, 0xa, 0xad, 0x27, 0xba, 0x2c, 0x63, 0xa0, 0x61, 0x6e, 0x0, 0x3c, 0xcd, 0x5c, 0xb3, 0x45, 0x48, 0x92, 0xd, 0x92, 0x65, 0x7f, 0x5c, 0x7c, 0xfb, 0x79, 0x33, 0x4b, 0xb, 0x5, 0x5e, 0xb0, 0x10, 0xdf, 0x6c, 0x52, 0xae, 0xf1, 0x1b, 0xd2, 0x36, 0xe9, 0x88, 0x31, 0x2f, 0xbd, 0x4b, 0x62, 0x39, 0x7b, 0xe0, 0xb3, 0x41, 0xa5, 0x67, 0x13, 0xf3, 0xfc, 0x9b, 0x7b, 0x27, 0x79, 0x36, 0x8a, 0xc8, 0x8e, 0x9f, 0x3, 0x4f, 0x36, 0x6e, 0x84, 0x6e, 0x23, 0x6c, 0xc1, 0xa0, 0xc, 0xa5, 0xde, 0x7c, 0x52, 0x33, 0x7f, 0x6d, 0xb8, 0x26, 0x9, 0x75, 0x7, 0x81, 0xc4, 0xc, 0xe7, 0x98, 0x5, 0x9, 0x36, 0x2a, 0x6c, 0x24, 0xe9, 0x24, 0xf0, 0x52, 0x5e, 0x75, 0xa6, 0xca, 0xaf, 0xb4, 0x9d, 0xa4, 0x7, 0xfa, 0xe0, 0x90, 0x17, 0x83, 0x66, 0x7d, 0xce, 0xc3, 0x15, 0xd6, 0xb0, 0xcb, 0xa6, 0x50, 0xf3, 0x4e, 0x5b, 0xf4, 0x82, 0x69, 0x43, 0xe0, 0x4, 0x85, 0x34, 0x79, 0xec, 0xe3, 0xd8, 0xee, 0x5, 0x49, 0xc9, 0x9e, 0x17, 0x9, 0x35, 0xcb, 0xfd, 0x2c, 0xb9, 0x14, 0xd9, 0xe6, 0xf9, 0xd0, 0x66, 0x52, 0x24, 0x55, 0x69, 0x31, 0xad, 0xd0, 0x50, 0xaa, 0x8b, 0x60, 0x7f, 0x22, 0xca, 0x79, 0x5c, 0x23, 0x77, 0xd8, 0xf9, 0xe5, 0x51, 0xc9, 0x27, 0xc9, 0xf2, 0xf, 0x94, 0x79, 0xe6, 0x30, 0x8c, 0xbf, 0xeb, 0x69, 0x59, 0x20, 0xb6, 0xc4, 0xaf, 0x4a, 0x2c, 0x4f, 0x85, 0xc7, 0xf6, 0x2, 0x3f, 0x56, 0x42, 0x48, 0x3b, 0x98, 0x1d, 0xd5, 0xce, 0x6a, 0x1, 0x55, 0x97, 0x94, 0x99, 0xd8, 0x56, 0xb3, 0xfe, 0xd7, 0x9b, 0xa3, 0xd1, 0x81, 0x2c, 0x2a, 0x8c, 0xe9, 0x4a, 0x93, 0xe6, 0xf, 0x34, 0x44, 0x8f, 0xda, 0x4, 0x79, 0x44, 0x1c, 0xf9, 0x8c, 0x14, 0x26, 0xa9, 0x51, 0xf, 0x5f, 0x18, 0x40, 0x73, 0x90, 0x69, 0xac, 0xce, 0x66, 0x5f, 0xe9, 0xe4, 0xce, 0x16, 0x6c, 0xbe, 0x16, 0x1d, 0xdc, 0x17, 0xbe, 0xc, 0xad, 0x45, 0x55, 0xa0, 0x67, 0x29, 0xb6, 0x7e, 0x6f, 0x71, 0x97, 0x2f, 0xe, 0xdd, 0x91, 0x3b, 0xc3, 0x2d, 0xf3, 0x7f, 0x8b, 0x33, 0xde, 0x76, 0xe9, 0x2f, 0xf5, 0xae, 0xf6, 0xdc, 0x6e, 0x3f, 0x19, 0x43, 0x1c, 0xf7, 0x1c, 0xf5, 0xe3, 0x77, 0xc0, 0xe8, 0xc4, 0x44, 0xe4, 0x15, 0x46, 0xab, 0x9, 0x74, 0xfb, 0x0, 0x8f, 0x2f, 0xb2, 0x89, 0xe2, 0x80, 0xe6, 0x78, 0x7e, 0x5, 0xd1, 0xe5, 0x88, 0xa8, 0x2c, 0x2, 0xe5, 0x3, 0xe2, 0xe4, 0xed, 0x9d, 0x1a, 0x11, 0x87, 0x3c, 0xb, 0x46, 0x9, 0x78, 0x1c, 0xe, 0x9b, 0x5b, 0xc7, 0xab, 0xc9, 0x71, 0x52, 0xc8, 0x51, 0xe7, 0xc9, 0x1d, 0xcc, 0xc7, 0x28, 0x4e, 0x94, 0x8b, 0x8, 0xfa, 0x3c, 0x1d, 0xfa, 0x1f, 0x20, 0x4f, 0x49, 0xc0, 0x9f, 0xf, 0x2d, 0xfe, 0x78, 0x60, 0x1a, 0xd1, 0xf6, 0x40, 0x50, 0x97, 0x9d, 0xd9, 0xb7, 0xc0, 0x54, 0x8, 0x97, 0x9a, 0xae, 0x87, 0x79, 0xfb, 0x2, 0x93, 0x9c, 0xb0, 0xce, 0xf4, 0x3f, 0xa8, 0x32, 0x2c, 0x68, 0x1, 0x2f, 0x50, 0x24, 0x50, 0x68, 0xb1, 0x71, 0x27, 0x35, 0x1e, 0x19, 0x2b, 0x79, 0x66, 0xf2, 0xf6, 0xd, 0x97, 0xfd, 0x87, 0x8d, 0x9c, 0xbb, 0xd0, 0x7, 0xf5, 0xce, 0x21, 0x67, 0x3e, 0x5c, 0x90, 0xfc, 0x2, 0x4c, 0x67, 0xb3, 0xd0, 0xda, 0x70, 0x2d, 0xd5, 0xa4, 0xd, 0x81, 0x18, 0xca, 0xe5, 0xc2, 0x5d, 0x99, 0xdd, 0x69, 0x5c, 0x73, 0xb2, 0x84, 0xa9, 0xa4, 0x5c, 0xde, 0x84, 0x27, 0x25, 0xb9, 0x63, 0xc4, 0xde, 0x52, 0xc8, 0x72, 0x98, 0x1c, 0x2f, 0x9, 0xde, 0xe3, 0xc2, 0x93, 0x35, 0xb0, 0x18, 0x2f, 0xdc, 0x13, 0x98, 0x1, 0xb, 0xd7, 0x19, 0xb2, 0x38, 0x63, 0x42, 0xce, 0x40, 0x4e, 0x15, 0xc9, 0x88, 0xaa, 0x96, 0x0, 0xb0, 0x2c, 0x7b, 0x25, 0xf9, 0x51, 0xad, 0xfc, 0x1, 0xc9, 0xd5, 0x10, 0xee, 0xd0, 0x7e, 0x6c, 0x21, 0xbd, 0x5a, 0x64, 0xe1, 0x7d, 0xf8, 0x57, 0xd5, 0xc3, 0x73, 0x6d, 0x51, 0x39, 0xe1, 0xdc, 0xd1, 0x3a, 0x69, 0x7a, 0x54, 0xbd, 0x3e, 0x3a, 0x7b, 0x76, 0xb4, 0x82, 0xa9, 0xf4, 0x20, 0x4c, 0xc2, 0xb3, 0xb8, 0x29, 0x1d, 0xdc, 0xa6, 0x2d, 0x6b, 0x80, 0x42, 0x44, 0xe1, 0x71, 0xf8, 0x9, 0x0, 0x3, 0xd3, 0x76, 0x92, 0xf4, 0xaa, 0x33, 0xb3, 0xfe, 0xa1, 0x4b, 0xc0, 0xb, 0xc7, 0x9e, 0x3b, 0x58, 0xb5, 0x20, 0x5f, 0x69, 0x95, 0x78, 0xbe, 0xb0, 0x1d, 0xb5, 0x12, 0xd0, 0x89, 0x11, 0x18, 0x84, 0xfc, 0x43, 0x16, 0xf6, 0x5, 0x72, 0xf2, 0x9, 0x64, 0x28, 0x31, 0x88, 0xd5, 0x74, 0x41, 0xd3, 0x40, 0x7b, 0x7c, 0x56, 0x8, 0xcd, 0xa0, 0xfb, 0x64, 0x54, 0xfb, 0xcb, 0xa2, 0xd, 0x59, 0xea, 0xc9, 0x73, 0xd, 0x6d, 0x13, 0x16, 0x77, 0x6f, 0x66, 0xd, 0xa3, 0xf2, 0x38, 0x48, 0x96, 0xa0, 0x2c, 0xa9, 0xc, 0x4e, 0xf, 0x24, 0x45, 0xa5, 0x7f, 0x4b, 0xb8, 0xbe, 0xc1, 0xa8, 0x1, 0x33, 0xef, 0x2a, 0xb9, 0x62, 0xbc, 0xe, 0x93, 0xcb, 0x45, 0xea, 0xcb, 0xb6, 0x9b, 0x5, 0xc7, 0x4a, 0x96, 0x33, 0x98, 0x41, 0x67, 0xf5, 0x96, 0x91, 0xd7, 0x8, 0x7b, 0x3b, 0x86, 0x52, 0xe2, 0x59, 0x60, 0xc, 0x70, 0x56, 0x1c, 0x17, 0x18, 0xda, 0x84, 0xc4, 0x3e, 0x8d, 0xb2, 0x56, 0xee, 0x58, 0x57, 0xa6, 0xe, 0x3b, 0x1, 0x1d, 0x77, 0xa2, 0x7d, 0xb9, 0xe9, 0xc5, 0x54, 0x4b, 0x52, 0xdf, 0xfd, 0x80, 0x5d, 0x30, 0x24, 0xf8, 0xfa, 0xf4, 0x7d, 0x3f, 0x76, 0x97, 0x3a, 0xbf, 0xc1, 0xf5, 0x58, 0x1f, 0x26, 0xf5, 0x81, 0xcc, 0x71, 0xf6, 0xea, 0xef, 0x83, 0xfe, 0xbc, 0x6, 0x35, 0x8, 0x7d, 0x6e, 0x53, 0x88, 0x31, 0xb, 0xc5, 0xcd, 0x94, 0xcd, 0x3e, 0xdd, 0x24, 0x41, 0x2c, 0xb, 0x41, 0xc, 0x52, 0x5, 0x2, 0xcc, 0x99, 0xcb, 0x57, 0x6d, 0x44, 0x6, 0x5f, 0x68, 0xa2, 0xf3, 0x23, 0x17, 0x4b, 0xa0, 0x49, 0x43, 0x7e, 0xb2, 0xb2, 0x12, 0x5a, 0x78, 0x81, 0xf3, 0x66, 0xb2, 0xab, 0x42, 0x60, 0x69, 0x7c, 0xf1, 0x37, 0xaf, 0xa5, 0xde, 0x38, 0x25, 0x4a, 0x2c, 0xa2, 0xcb, 0xd4, 0x0, 0x26, 0xa4, 0x9e, 0x95, 0xb9, 0x1c, 0x21, 0x89, 0x98, 0x6, 0x7b, 0x41, 0x5f, 0x10, 0xcd, 0x74, 0x1e, 0xb8, 0xdd, 0x19, 0xcf, 0xe1, 0xb1, 0xca, 0xb8, 0x57, 0x51, 0x89, 0x2d, 0x2f, 0x47, 0x85, 0xb8, 0x9d, 0xee, 0x8, 0xb0, 0x6f, 0x8, 0x31, 0xd1, 0x26, 0xf, 0x70, 0xd5, 0x5c, 0x36, 0x5a, 0xfe, 0xb7, 0x66, 0x5d, 0xba, 0xa7, 0x0, 0x56, 0x5d, 0xfd, 0x5, 0xac, 0x74, 0x86, 0x81, 0x57, 0x5a, 0x14, 0x4, 0x3c, 0xb0, 0x8f, 0x68, 0x2c, 0x83, 0xd5, 0x97, 0x88, 0x65, 0xc1, 0x76, 0xa7, 0xab, 0x45, 0x12, 0xd8, 0xdc, 0xf0, 0xa0, 0xe9, 0xf6, 0x47, 0x18, 0xaa, 0x7c, 0x7, 0xdd, 0xd0, 0xad, 0x34, 0xd, 0x14, 0x53, 0x3, 0xf9, 0xed, 0x3d, 0xb7, 0x48, 0x11, 0x7c, 0xe3, 0x22, 0x53, 0x70, 0xbe, 0xa2, 0xbb, 0x2, 0x4b, 0x28, 0xd6, 0xa6, 0xb9, 0x7a, 0xc6, 0xf7, 0xbb, 0xdc, 0x30, 0xa5, 0xf7, 0x20, 0x9c, 0x55, 0x25, 0x44, 0xc8, 0x67, 0x87, 0x18, 0xfa, 0x2d, 0x1f, 0x96, 0xc4, 0x80, 0xdc, 0x70, 0x35, 0x94, 0xfd, 0xe2, 0x20, 0x41, 0x78, 0xf0, 0x63, 0x6b, 0x4d, 0x10, 0x22, 0x71, 0x56, 0x53, 0xc1, 0x2b, 0x59, 0x7f, 0x77, 0xad, 0x88, 0xf6, 0x46, 0x12, 0xbc, 0xf6, 0x6, 0xb0, 0xa, 0xb7, 0x6b, 0x43, 0xfe, 0xfd, 0x1d, 0x1a, 0x99, 0x18, 0x19, 0xd1, 0xe7, 0x57, 0xb0, 0xc0, 0xd4, 0x34, 0x28, 0x42, 0x54, 0x3a, 0x4, 0x84, 0xb5, 0x32, 0xd4, 0x1d, 0x9, 0x26, 0x99, 0xf8, 0x2a, 0x27, 0xfc, 0x6d, 0x11, 0x8b, 0x77, 0x87, 0x11, 0x34, 0x87, 0xdc, 0xf8, 0x51, 0xbc, 0xf0, 0xa7, 0xdf, 0x40, 0xa3, 0xf0, 0xc0, 0xdd, 0x97, 0xad, 0x56, 0xf6, 0xa5, 0xc5, 0x22, 0xe9, 0xdd, 0x15, 0xf, 0x5, 0x4c, 0x21, 0x5, 0x82, 0x2b, 0x5f, 0xd, 0xa8, 0x76, 0x7a, 0xa4, 0x62, 0x2b, 0xe8, 0x62, 0x30, 0x4d, 0x25, 0xbb, 0xee, 0x55, 0xc9, 0x3e, 0xe0, 0x5f, 0xa0, 0x11, 0x36, 0x9b, 0x52, 0x9d, 0x6e, 0xf4, 0xaf, 0x7e, 0xf6, 0x3d, 0x9e, 0x8f, 0x1, 0x13, 0xab, 0x55, 0x98, 0x76, 0x31, 0x99, 0x71, 0xe3, 0x63, 0xc4, 0xad, 0x47, 0xda, 0xcc, 0x38, 0x14, 0x25, 0xfd, 0x4e, 0x89, 0xfb, 0xdb, 0xf3, 0x22, 0x31, 0xe1, 0x18, 0x4b, 0x27, 0xce, 0xf6, 0x79, 0x9b, 0xbe, 0xdf, 0xaa, 0x58, 0xca, 0xe5, 0x9d, 0xa4, 0x85, 0x51, 0x73, 0x48, 0x11, 0x58, 0x77, 0x95, 0x24, 0x99, 0x90, 0x93, 0xbb, 0x61, 0xef, 0x1d, 0x11, 0x94, 0x36, 0xd1, 0x26, 0x4a, 0x97, 0x6a, 0x1d, 0x3b, 0x25, 0xfc, 0xd3, 0xce, 0xb4, 0x74, 0x44, 0x5e, 0xb1, 0x5d, 0x4c, 0xe6, 0x85, 0x14, 0x3a, 0x18, 0x6f, 0xd6, 0x1e, 0xec, 0x86, 0xde, 0xeb, 0x43, 0xce, 0x1f, 0xd6, 0x6b, 0x90, 0x5d, 0x22, 0x4d, 0xd7, 0xbe, 0xe8, 0xd6, 0x7, 0xab, 0x5c, 0xb7, 0x5a, 0x85, 0x27, 0x7f, 0x61, 0xe4, 0x16, 0xdd, 0xc3, 0xfb, 0xb2, 0xdd, 0xaa, 0x68, 0x65, 0x5b, 0xdf, 0xed, 0x8a, 0x4f, 0x48, 0xb5, 0xed, 0xad, 0x2f, 0xcf, 0x6d, 0xe8, 0x20, 0x8f, 0x87, 0x99, 0x56, 0x5f, 0x61, 0x7c, 0x49, 0x16, 0x35, 0xe2, 0xac, 0x7b, 0x70, 0xe8, 0xae, 0x58, 0x51, 0x56, 0x1c, 0x6d, 0xf8, 0xc6, 0x14, 0x8d, 0x45, 0xe2, 0xbe, 0xb9, 0xc1, 0x5c, 0xf1, 0xeb, 0x15, 0xc0, 0x9c, 0x37, 0xf, 0x66, 0xdf, 0x15, 0xa0, 0x61, 0xd1, 0x2e, 0x20, 0xa3, 0xeb, 0x4c, 0xb2, 0xf0, 0x3d, 0x4b, 0x20, 0x87, 0xf6, 0x58, 0x45, 0x4, 0x4c, 0x26, 0xbe, 0xed, 0x8e, 0xe, 0x89, 0xb7, 0x8b, 0xde, 0x90, 0x10, 0x87, 0xb7, 0xb5, 0x69, 0x1e, 0x18, 0xfa, 0xec, 0x3f, 0xa, 0xef, 0x98, 0x9a, 0xd6, 0x30, 0x81, 0x2f, 0xa0, 0x9e, 0x5d, 0xb9, 0xea, 0x66, 0x8e, 0xcf, 0xe9, 0xb2, 0x21, 0x0, 0x72, 0x24, 0xeb, 0x2b, 0xf, 0x52, 0x61, 0x43, 0xf8, 0x1d, 0xa, 0x54, 0x1c, 0x62, 0x5d, 0x6d, 0xfa, 0x71, 0x21, 0x77, 0x3, 0x12, 0xff, 0xf6, 0xf5, 0xf, 0x51, 0x7b, 0x3c, 0x6e, 0xf3, 0xbe, 0xb2, 0xab, 0x9b, 0x6, 0x7a, 0x81, 0x5, 0xcd, 0x81, 0x97, 0x11, 0x2f, 0x2b, 0x7e, 0x2b, 0xa1, 0xaf, 0x7e, 0xe2, 0xc2, 0xa8, 0x77, 0x5e, 0x38, 0x81, 0xa3, 0x3c, 0xd0, 0xfd, 0x78, 0xad, 0x85, 0xab, 0x15, 0xbb, 0x54, 0x3b, 0xab, 0xd4, 0x8a, 0x1c, 0xcf, 0xaa, 0x55, 0xbe, 0x48, 0x81, 0xbc, 0x8a, 0x52, 0x58, 0xc, 0xa6, 0x57, 0xb3, 0x93, 0x68, 0x4a, 0xfe, 0xb5, 0xaf, 0xf8, 0xcb, 0xcc, 0x66, 0x9a, 0xcf, 0x79, 0xd1, 0xbd, 0xb1, 0x9, 0x6c, 0x65, 0x77, 0x7d, 0x4f, 0xf1, 0x0, 0xdf, 0xa9, 0x29, 0x95, 0xac, 0x40, 0x4b, 0x33, 0x38, 0x10, 0x14, 0x82, 0x48, 0xdc, 0xe9, 0xc7, 0x45, 0x17, 0x42, 0x33, 0x32, 0x63, 0x4c, 0x69, 0x3, 0xc2, 0x75, 0xc5, 0xcc, 0x2f, 0xd2, 0x36, 0xc, 0x37, 0x89, 0xa5, 0x42, 0xf2, 0x47, 0xcf, 0xec, 0xda, 0x4e, 0xae, 0x16, 0x8c, 0x1e, 0xc4, 0x78, 0xcf, 0x4f, 0xb0, 0xab, 0x8e, 0xad, 0xcf, 0x98, 0xc5, 0x9e, 0xba, 0x5, 0xe6, 0x3d, 0xae, 0x29, 0x30, 0x4d, 0xae, 0xd3, 0x33, 0x19, 0x16, 0x5, 0x14, 0x9b, 0xbd, 0xfa, 0xf2, 0x6b, 0x1c, 0xd0, 0xa7, 0x59, 0x55, 0xfc, 0x2d, 0x71, 0x66, 0x63, 0x57, 0xd2, 0xe0, 0xaa, 0x3e, 0xff, 0xf8, 0x1c, 0x70, 0x48, 0xf9, 0x7, 0xe4, 0x36, 0xd4, 0x4b, 0x1f, 0xb4, 0x89, 0x1d, 0xe2, 0xed, 0xa9, 0xef, 0x6e, 0x66, 0x5c, 0x2f, 0x29, 0xc5, 0xa6, 0xcd, 0x94, 0xb2, 0xb6, 0x2f, 0x57, 0x83, 0x34, 0x9f, 0x3, 0xb9, 0x75, 0xbf, 0xe9, 0x6c, 0x21, 0xbb, 0x5c, 0x9, 0xf0, 0x12, 0xe0, 0x20, 0xda, 0xf0, 0x63, 0xd0, 0x1b, 0xcc, 0xae, 0xa0, 0xe5, 0x9, 0x29, 0xf0, 0x3a, 0x1c, 0xc2, 0x57, 0xdc, 0x9c, 0xce, 0x48, 0xcf, 0x9e, 0xd5, 0xc7, 0xf8, 0x36, 0xe3, 0x8a, 0x44, 0xb8, 0x32, 0x27, 0xf4, 0x85, 0x4f, 0x3f, 0x23, 0x37, 0x6e, 0x5, 0x52, 0xa8, 0x78, 0xef, 0x21, 0x5d, 0xb7, 0xf2, 0x0, 0xa9, 0x31, 0xdd, 0x34, 0xcd, 0x38, 0xba, 0x8a, 0xe1, 0xff, 0x58, 0x86, 0xa6, 0xb3, 0x72, 0x45, 0x57, 0xd9, 0xbf, 0xc, 0x19, 0x64, 0x74, 0x81, 0x6e, 0xed, 0x77, 0x21, 0x53, 0x6e, 0x40, 0xab, 0x5e, 0x53, 0xde, 0x5b, 0x97, 0xf0, 0x1a, 0x82, 0x4c, 0xc5, 0x60, 0xc7, 0x22, 0xba, 0x66, 0xe0, 0x2f, 0xa, 0xb0, 0xce, 0xb1, 0xe3, 0x88, 0x15, 0x7b, 0x33, 0xf0, 0x77, 0xf9, 0xb7, 0x55, 0x3a, 0x97, 0x94, 0xe, 0xa3, 0x72, 0xc8, 0x3b, 0xa0, 0xee, 0xd, 0x77, 0x83, 0xd9, 0x4a, 0x62, 0xdb, 0xef, 0xa5, 0x13, 0x64, 0x33, 0xab, 0xca, 0x47, 0x42, 0xd, 0x7a, 0x2, 0xd0, 0x1d, 0x39, 0xd5, 0xae, 0x12, 0xf3, 0x5d, 0xd, 0x59, 0x39, 0xac, 0x65, 0x13, 0x35, 0xc9, 0x2, 0x28, 0x53, 0x2a, 0xe2, 0xa2, 0x78, 0x45, 0x82, 0x2e, 0xdd, 0x87, 0xe6, 0xbe, 0x2e, 0xa5, 0xa6, 0xc6, 0x98, 0x31, 0xc7, 0xc1, 0x56, 0xfa, 0x5b, 0xf6, 0xcd, 0x10, 0xf2, 0xde, 0x72, 0x27, 0x13, 0xe8, 0x48, 0xa5, 0xb5, 0x83, 0x80, 0x41, 0x19, 0xa1, 0x4e, 0x25, 0xb5, 0xeb, 0xff, 0x4f, 0xea, 0xdc, 0x3f, 0x72, 0xbf, 0x50, 0xfb, 0x19, 0xea, 0xaa, 0x55, 0xc, 0xb4, 0x85, 0x2a, 0xa, 0xdc, 0xbe, 0x5f, 0x9f, 0xf2, 0x44, 0xbf, 0x54, 0xd9, 0x6f, 0xd, 0xca, 0x0, 0xe8, 0x89, 0x31, 0xb5, 0x10, 0x8a, 0xfd, 0x8, 0x52, 0x14, 0x17, 0xc, 0xfe, 0x50, 0x37, 0xba, 0x14, 0xb7, 0xd3, 0xc0, 0x43, 0x9e, 0xcc, 0x9a, 0x18, 0x34, 0xe, 0x20, 0x7d, 0x42, 0xc0, 0xe2, 0x16, 0xe6, 0x4f, 0xe2, 0xde, 0x5, 0xc1, 0x54, 0x18, 0xee, 0xc8, 0xf4, 0x25, 0x9c, 0x73, 0x2a, 0x34, 0x8f, 0xa5, 0x22, 0x32, 0x4d, 0x52, 0xc9, 0x27, 0xa0, 0x4f, 0x80, 0x7, 0x8, 0x6f, 0x32, 0x8f, 0x2e, 0xf8, 0xb7, 0xbf, 0xba, 0x19, 0xa5, 0x25, 0x56, 0x22, 0xac, 0x9c, 0xed, 0xa9, 0xe0, 0xda, 0xe, 0x1a, 0x9c, 0x10, 0xf1, 0x59, 0x12, 0x52, 0x58, 0x98, 0xa, 0xf8, 0x45, 0x44, 0x1f, 0xb7, 0x5a, 0x7, 0x4b, 0xa4, 0x37, 0x1b, 0x16, 0x21, 0x4a, 0xb6, 0x9e, 0x69, 0x21, 0xee, 0x67, 0xfe, 0x56, 0xdf, 0xfd, 0x23, 0xb5, 0x2e, 0xf7, 0xb9, 0x20, 0x21, 0x3a, 0x5c, 0x9f, 0x73, 0x6e, 0xd2, 0x50, 0x33, 0x4a, 0x41, 0xba, 0x88, 0x26, 0xf7, 0x75, 0x94, 0x44, 0x69, 0x45, 0x82, 0xf, 0x55, 0xb1, 0xe3, 0xa6, 0x82, 0xd4, 0x7e, 0x6d, 0x16, 0x43, 0xe6, 0xf7, 0x7f, 0xde, 0x2a, 0x22, 0x94, 0x9c, 0x68, 0xc6, 0x97, 0xad, 0x40, 0x98, 0xfa, 0x72, 0x2d, 0x92, 0xa5, 0x90, 0x5f, 0xaa, 0xe6, 0x32, 0xbd, 0x86, 0x18, 0x37, 0x44, 0xd, 0x5e, 0x7f, 0x67, 0x4f, 0xbd, 0xf1, 0xc5, 0x19, 0xa3, 0xfb, 0x76, 0xb2, 0x8e, 0x5, 0x4a, 0xa5, 0x7f, 0x7f, 0x12, 0x91, 0x3a, 0xd3, 0xab, 0x2d, 0x2a, 0x93, 0xb4, 0xc1, 0x60, 0xf0, 0xbf, 0xd9, 0xc7, 0x79, 0x4e, 0x22, 0x3a, 0xce, 0x23, 0x28, 0xa9, 0xb, 0x8c, 0x38, 0xb0, 0x6f, 0x81, 0x78, 0x78, 0x69, 0x8a, 0x73, 0x31, 0x8d, 0xb7, 0x0, 0xcd, 0x3, 0x2, 0xeb, 0x86, 0x2d, 0x1b, 0x91, 0x69, 0x2b, 0x51, 0x44, 0x6e, 0x4e, 0xf3, 0x56, 0xd, 0x4f, 0x3a, 0x65, 0x22, 0xc2, 0x5, 0xb8, 0x28, 0xca, 0x47, 0x40, 0x1e, 0x96, 0x4b, 0x43, 0x73, 0x4a, 0xb0, 0xf8, 0x3, 0x2c, 0x19, 0x2a, 0x71, 0xab, 0x87, 0x67, 0x96, 0x4c, 0x42, 0xee, 0x4f, 0x86, 0x42, 0x6c, 0x19, 0xcc, 0x5c, 0xce, 0xe, 0x5b, 0xda, 0x93, 0xbe, 0xc1, 0x59, 0xc1, 0x31, 0xc1, 0x22, 0x9f, 0x7d, 0xa8, 0x55, 0x56, 0xe4, 0xdc, 0x93, 0xd5, 0xb6, 0x2b, 0x42, 0x40, 0x89, 0x4c, 0xa9, 0x5a, 0x95, 0xec, 0xed, 0x92, 0x2f, 0xf2, 0x9a, 0x17, 0x32, 0x9d, 0x8, 0x65, 0x28, 0xfa, 0xf0, 0xf, 0x2, 0x5e, 0xda, 0x1c, 0x9b, 0x23, 0x3a, 0x86, 0x49, 0x46, 0x8f, 0x45, 0xf1, 0x11, 0x92, 0x1b, 0x71, 0xa5, 0x6d, 0x35, 0x9b, 0xde, 0xec, 0x93, 0xd4, 0x7d, 0x94, 0x81, 0xad, 0x80, 0x82, 0x6, 0xf9, 0xe4, 0x73, 0x97, 0x30, 0xfe, 0xc1, 0x7a, 0x86, 0x81, 0x3c, 0x91, 0x78, 0xad, 0xfe, 0x96, 0xdd, 0xe9, 0xb5, 0xb7, 0xee, 0x86, 0x14, 0xb5, 0x5e, 0x32, 0x8e, 0xb0, 0x93, 0xa1, 0x61, 0x74, 0x74, 0x85, 0x41, 0x35, 0xdc, 0x5a, 0xaa, 0xd, 0x84, 0xf5, 0xda, 0x9f, 0x36, 0xdb, 0x44, 0xc, 0x1d, 0xc1, 0x5, 0x92, 0x75, 0xad, 0xd9, 0x4a, 0xb1, 0x3a, 0xa2, 0xaf, 0x8f, 0x3, 0x3d, 0x9a, 0x3f, 0x53, 0x4, 0xf7, 0xe3, 0xfd, 0x53, 0x65, 0xdf, 0xfd, 0xc6, 0xa4, 0x15, 0x29, 0x90, 0x69, 0xaf, 0xbe, 0x11, 0x1c, 0xc3, 0x37, 0x4d, 0xc0, 0xdb, 0xd5, 0xc8, 0xcb, 0x1f, 0x28, 0xba, 0x2a, 0xa7, 0xa7, 0x21, 0xe6, 0x4a, 0x3f, 0x8d, 0xf2, 0x78, 0xa1, 0x95, 0x8, 0x8d, 0x9b, 0x76, 0xdc, 0xdd, 0x23, 0xd0, 0x6, 0xb2, 0x93, 0x84, 0xd7, 0xae, 0x88, 0xe4, 0xa4, 0x32, 0xe, 0x9, 0x1a, 0xe6, 0x6e, 0xf4, 0x3, 0x2f, 0x26, 0x3b, 0x2e, 0x48, 0x1d, 0xce, 0xb7, 0x9, 0xb8, 0xc9, 0x9e, 0xc4, 0x22, 0x2c, 0x2c, 0xc7, 0xe2, 0x6b, 0x48, 0x41, 0x8a, 0x36, 0xbf, 0xa0, 0xfe, 0x20, 0x94, 0x3b, 0x81, 0x69, 0xac, 0x6d, 0xa6, 0xe9, 0x6e, 0xd3, 0xb3, 0x87, 0xc9, 0x8c, 0x32, 0x8a, 0xc0, 0xdd, 0x6f, 0x61, 0x64, 0x32, 0x3a, 0x2c, 0xcd, 0x3b, 0xa, 0xba, 0xdb, 0x10, 0xd8, 0x9d, 0xc4, 0x3, 0x71, 0xc4, 0xa4, 0x78, 0x4b, 0x28, 0x1a, 0xd8, 0xf9, 0x99, 0xb, 0x18, 0xdd, 0xe8, 0xd8, 0xd1, 0xfe, 0x49, 0x39, 0x3a, 0xd3, 0x3f, 0x33, 0x8c, 0xdd, 0x99, 0x23, 0xb7, 0xb9, 0x2d, 0xdf, 0xdf, 0xcd, 0x26, 0x55, 0x78, 0x8c, 0x3e, 0xe5, 0xa6, 0xad, 0xb4, 0xe1, 0xbd, 0xc1, 0xed, 0xbf, 0xdf, 0xa0, 0x4e, 0xd5, 0x77, 0x24, 0x81, 0x6b, 0x43, 0xc7, 0xe8, 0x45, 0x32, 0xe7, 0x41, 0xd6, 0xec, 0x27, 0x90, 0xcc, 0x97, 0xe0, 0xf1, 0x77, 0x8f, 0xb6, 0x66, 0x5c, 0x62, 0x2b, 0x1e, 0x62, 0xa3, 0x1a, 0xf, 0xe5, 0xea, 0xa9, 0xae, 0x5d, 0xdc, 0x48, 0x58, 0xa1, 0x52, 0x7d, 0xc2, 0xac, 0x6, 0x57, 0x5c, 0xa2, 0x91, 0xa9, 0xa2, 0x51, 0x15, 0xa, 0xeb, 0xb4, 0xd, 0x97, 0x6a, 0x4, 0x54, 0x46, 0x4b, 0x7e, 0xff, 0x35, 0x4d, 0x4d, 0xbe, 0x2b, 0xb9, 0x2f, 0xa6, 0x18, 0xe7, 0x6a, 0x85, 0xd9, 0x8e, 0xd3, 0xa7, 0x10, 0x4, 0x16, 0xa0, 0xac, 0x89, 0xdb, 0x76, 0x7a, 0xeb, 0xbb, 0xa0, 0x6b, 0xf5, 0x2a, 0x35, 0x13, 0xbd, 0xc3, 0xc5, 0x1b, 0x8, 0xbd, 0x44, 0xdd, 0x18, 0xfe, 0x3e, 0xb8, 0x49, 0x24, 0xd8, 0x8d, 0xa7, 0xbe, 0xd6, 0x4b, 0xe, 0xd9, 0xf9, 0xda, 0x24, 0x31, 0x97, 0x4a, 0x4c, 0xd8, 0x32, 0x33, 0xc, 0x89, 0xdb, 0x6e, 0x1b, 0x84, 0xbb, 0x9b, 0xe6, 0x39, 0x3e, 0xc2, 0x6d, 0x3e, 0xae, 0x7, 0x45, 0x35, 0x8f, 0xc3, 0x41, 0x59, 0xd5, 0xe4, 0xad, 0x65, 0xe8, 0x3d, 0x87, 0x40, 0x38, 0x30, 0x5e, 0xfa, 0xda, 0xde, 0x9b, 0x8b, 0xf1, 0x4e, 0xbb, 0x4a, 0x41, 0x6f, 0x68, 0x52, 0xee, 0xfa, 0x42, 0xea, 0xe9, 0x9e, 0x4a, 0x5a, 0xa5, 0x37, 0x16, 0xaa, 0xf, 0x26, 0xb9, 0x93, 0x5f, 0x1, 0x14, 0xa5, 0x19, 0xeb, 0x98, 0x35, 0x9c, 0x9e, 0xd2, 0xeb, 0xd7, 0x51, 0x8e, 0x17, 0x32, 0x19, 0x6d, 0xc5, 0x3f, 0x52, 0xc8, 0xf1, 0xcf, 0x9a, 0x8, 0xdd, 0xc6, 0x9f, 0xd, 0xb6, 0x25, 0x9b, 0x2f, 0xac, 0xe8, 0x20, 0x4c, 0x5c, 0xd9, 0xd4, 0xab, 0x30, 0x29, 0x22, 0x7b, 0x50, 0xb2, 0x15, 0x4e, 0xb0, 0x77, 0x1e, 0xeb, 0xda, 0x9c, 0x2d, 0x19, 0x88, 0x6b, 0x7a, 0x3a, 0x79, 0x97, 0x31, 0x18, 0x4d, 0x5d, 0xf1, 0x92, 0x4b, 0xed, 0x1c, 0x72, 0x2a, 0x70, 0x38, 0x34, 0x93, 0xea, 0x37, 0xb0, 0x92, 0x8d, 0x94, 0x1d, 0x9d, 0xf3, 0x16, 0xa3, 0x9f, 0xf8, 0xda, 0x51, 0x6f, 0x28, 0x60, 0xa3, 0xec, 0xdf, 0x4f, 0xd2, 0x3a, 0x5, 0x79, 0xe9, 0xc5, 0x37, 0x1d, 0x40, 0xfa, 0x58, 0x19, 0x30, 0xe, 0xa7, 0xde, 0x7c, 0xe6, 0x1f, 0x25, 0xef, 0x96, 0xa, 0xd0, 0x74, 0xbe, 0x94, 0xeb, 0x2b, 0x1a, 0xc0, 0xd8, 0x75, 0x4b, 0xfd, 0xc, 0x38, 0x44, 0x2a, 0xe, 0x2c, 0xf2, 0xbd, 0x85, 0xb2, 0xc7, 0x1b, 0x87, 0xf4, 0x22, 0x86, 0x3c, 0x28, 0x94, 0xff, 0x9f, 0x40, 0x84, 0x46, 0x8c, 0x8f, 0x32, 0x6e, 0xb7, 0x70, 0xf, 0xae, 0x31, 0x97, 0xe1, 0xc5, 0x60, 0xbc, 0x9c, 0x72, 0xec, 0x77, 0xd1, 0x6d, 0xf8, 0xa2, 0x97, 0xf4, 0xf3, 0x30, 0x35, 0x81, 0x21, 0xe7, 0xfe, 0x20, 0x59, 0xc1, 0x92, 0x31, 0x7f, 0xe5, 0x1e, 0xc5, 0xe1, 0x31, 0xc, 0xf, 0xe, 0x10, 0xdd, 0xf4, 0x22, 0x73, 0xcd, 0x36, 0xf3, 0x84, 0xe6, 0x8f, 0xb9, 0xc, 0x7, 0x1d, 0x50, 0x58, 0x14, 0x4a, 0x12, 0x9a, 0xbe, 0xf, 0xd6, 0x3f, 0x6b, 0xbc, 0x92, 0xc8, 0x61, 0x57, 0xa4, 0xcb, 0x27, 0x6f, 0xfe, 0x58, 0x48, 0x38, 0xf5, 0x3b, 0x76, 0x9e, 0xb5, 0xf7, 0x71, 0x2, 0x4b, 0x5e, 0x8e, 0x5a, 0x5b, 0xa9, 0x6, 0x46, 0x3d, 0x92, 0x82, 0xa4, 0x5, 0x9b, 0x5d, 0xda, 0x1e, 0x46, 0xc4, 0xfe, 0xe6, 0xd0, 0x31, 0x77, 0xda, 0x20, 0xff, 0x18, 0xeb, 0x77, 0x51, 0x7b, 0x27, 0x62, 0x6d, 0xf0, 0x28, 0x98, 0x2e, 0x0, 0x48, 0x8d, 0x6d, 0x50, 0xe, 0xc3, 0xd6, 0xe8, 0xec, 0x63, 0xf9, 0x9f, 0xcd, 0x58, 0xa, 0xde, 0x5c, 0xe, 0xaa, 0x3b, 0x4e, 0xb7, 0xcd, 0x97, 0x3b, 0xf9, 0x38, 0x12, 0x63, 0xb, 0xc, 0x56, 0x50, 0x3d, 0x79, 0x79, 0xcf, 0x35, 0x1b, 0xc3, 0xe1, 0x78, 0x21, 0x5e, 0x35, 0x14, 0x2f, 0xd1, 0x95, 0x37, 0x88, 0x42, 0x2f, 0xc3, 0xb9, 0x21, 0x3d, 0xbf, 0x2, 0x34, 0xf, 0x1e, 0x6b, 0xc9, 0x73, 0x9e, 0xf3, 0x4f, 0x42, 0xc9, 0xbf, 0xf7, 0x6c, 0x96, 0xd6, 0xd0, 0xf6, 0x59, 0xa4, 0x2d, 0xca, 0x4e, 0x15, 0xb8, 0x3b, 0x9d, 0xd6, 0xf1, 0x3c, 0xb4, 0xed, 0x30, 0x54, 0x16, 0x9b, 0x42, 0xc2, 0x75, 0xd3, 0xd0, 0x15, 0x8a, 0x47, 0xc6, 0xd3, 0x6b, 0x37, 0xe4, 0x7d, 0x7f, 0x6, 0x33, 0x5e, 0x62, 0x59, 0x20, 0xcb, 0x5d, 0x30, 0x8c, 0x37, 0x9a, 0x59, 0x4, 0x3d, 0x9d, 0x9f, 0x40, 0xe1, 0xb2, 0xc1, 0x57, 0x80, 0x27, 0xba, 0xec, 0x84, 0xb1, 0x80, 0xbd, 0xa2, 0xe7, 0xac, 0x92, 0xcc, 0x60, 0xc7, 0xc4, 0x4c, 0xdb, 0x11, 0x53, 0xcb, 0xfe, 0x8e, 0x6d, 0x46, 0x63, 0xce, 0xf0, 0x18, 0xee, 0x49, 0x72, 0x8, 0x1b, 0xeb, 0xa0, 0xd, 0xf3, 0xde, 0xfb, 0x56, 0xfb, 0xe3, 0x47, 0x7d, 0x71, 0x58, 0xd4, 0x90, 0x93, 0x36, 0xe3, 0xa3, 0x8d, 0x6d, 0x16, 0x6, 0x40, 0x40, 0x76, 0xe9, 0x3, 0x4, 0xa9, 0x89, 0x82, 0x36, 0xc3, 0xb5, 0x37, 0xd6, 0xf1, 0x72, 0x83, 0x79, 0xd1, 0x4b, 0x3a, 0xc5, 0xd2, 0xd5, 0x9e, 0x67, 0x16, 0xa6, 0x87, 0x3b, 0xcf, 0xfd, 0xd8, 0xbc, 0xc4, 0x5e, 0x4e, 0x69, 0x6a, 0xb6, 0x13, 0x76, 0x6d, 0xae, 0xe5, 0x27, 0xfc, 0xe3, 0x76, 0xfc, 0x60, 0x74, 0x62, 0x49, 0x3c, 0xc6, 0xe1, 0x1f, 0x53, 0x80, 0x25, 0xdb, 0x1f, 0x98, 0x89, 0x1e, 0x54, 0x50, 0x6b, 0x2b, 0x4c, 0xfd, 0xa1, 0x91, 0x12, 0xdc, 0xca, 0x4f, 0xdf, 0xa6, 0x17, 0x3a, 0x69, 0xc0, 0x3, 0xf2, 0x17, 0x1, 0x4e, 0x60, 0xc4, 0xb2, 0xd0, 0xb8, 0x99, 0xa, 0x63, 0x19, 0x5f, 0x24, 0x44, 0x2c, 0x21, 0xc6, 0xaa, 0x20, 0xdc, 0xae, 0xa8, 0x52, 0xf, 0x52, 0x56, 0x4e, 0xed, 0xb1, 0xcd, 0x1a, 0xa, 0x70, 0xb6, 0xf, 0x56, 0xb5, 0x81, 0x96, 0x99, 0xfd, 0x73, 0xfd, 0x23, 0xe8, 0xba, 0xe1, 0xb4, 0x6c, 0x1f, 0x5d, 0x91, 0xda, 0xa3, 0x0, 0xbe, 0x6e, 0x18, 0x1, 0x3, 0xd, 0xcd, 0xa8, 0xfc, 0x89, 0xc9, 0xb0, 0x4f, 0x74, 0xb, 0xe, 0xda, 0xf9, 0xdb, 0x1, 0xd, 0x97, 0x6f, 0xd7, 0x31, 0x79, 0x64, 0xc5, 0xd8, 0xa, 0x6a, 0xb9, 0x59, 0xf6, 0xbf, 0x37, 0x57, 0xb1, 0xda, 0x22, 0xdf, 0x6b, 0x9c, 0x7a, 0xf3, 0x18, 0xdf, 0x82, 0xdc, 0x90, 0x2f, 0x43, 0xbc, 0xef, 0x51, 0x36, 0x70, 0x5d, 0x8e, 0xef, 0x2c, 0xc5, 0xa5, 0x81, 0x98, 0xd9, 0xa0, 0x7b, 0x88, 0x82, 0x1d, 0xec, 0x20, 0xb9, 0xda, 0x9d, 0xec, 0x7c, 0x3b, 0x8d, 0x3e, 0xec, 0xc3, 0xe8, 0xd7, 0xd0, 0x47, 0x87, 0xa8, 0x4c, 0x95, 0xc3, 0x5b, 0x44, 0x35, 0x35, 0xd5, 0x9f, 0xe0, 0xa2, 0xea, 0xed, 0xd0, 0xc2, 0x53, 0xce, 0x4e, 0x38, 0x2b, 0xa1, 0xda, 0x6, 0x46, 0x5e, 0x7d, 0x89, 0x9d, 0x77, 0xb0, 0x12, 0xec, 0x73, 0xb0, 0x47, 0x3e, 0xa5, 0xad, 0xf1, 0x56, 0x57, 0xba, 0xbb, 0x2d, 0x46, 0xb6, 0x37, 0xfe, 0xca, 0xf2, 0x9, 0xfe, 0x69, 0x17, 0x2e, 0xce, 0xec, 0xbf, 0x1e, 0x3d, 0x27, 0xfd, 0x7, 0xf6, 0x3c, 0x38, 0xd5, 0xc1, 0x8a, 0x25, 0xc, 0xe1, 0x12, 0xff, 0xf7, 0x35, 0x80, 0x5, 0x90, 0x6c, 0x29, 0xf, 0xcc, 0xd4, 0xb7, 0xdb, 0xeb, 0xa, 0x7b, 0xfa, 0x94, 0x90, 0x4b, 0xd4, 0xc8, 0xe, 0xc0, 0xf1, 0x10, 0xbf, 0xe1, 0x1, 0xc1, 0x67, 0xd6, 0xc4, 0xb1, 0x7, 0xd8, 0x83, 0x33, 0x71, 0xbe, 0xdf, 0x2c, 0x41, 0xa9, 0xa1, 0x2b, 0x14, 0x81, 0x3e, 0x6, 0x5e, 0x43, 0xdc, 0x6b, 0xa, 0xaf, 0xec, 0x15, 0x4c, 0x98, 0xb9, 0xda, 0xa3, 0x92, 0x60, 0x24, 0x2c, 0x59, 0x2a, 0xc2, 0x93, 0x20, 0x5a, 0x2d, 0x44, 0xca, 0xed, 0x3a, 0x70, 0xd5, 0x31, 0xbd, 0xd0, 0xeb, 0xb6, 0x87, 0x32, 0x65, 0xfd, 0x2a, 0x8f, 0x30, 0xba, 0xc8, 0x1b, 0xd, 0xac, 0x8b, 0xb8, 0x9b, 0xb2, 0xe3, 0xc1, 0x75, 0x38, 0x85, 0xaf, 0xfb, 0x7c, 0x44, 0x11, 0xca, 0x50, 0xc9, 0x2a, 0xbd, 0x8d, 0x4c, 0x5c, 0xea, 0x6c, 0x81, 0x6d, 0x28, 0x8, 0x32, 0xdc, 0x28, 0x0, 0xa8, 0x3a, 0xdc, 0x9d, 0x3e, 0xe2, 0x16, 0x0, 0x69, 0x65, 0x93, 0xe1, 0x41, 0xcc, 0xa7, 0x6b, 0xc, 0x22, 0xcb, 0x5c, 0x24, 0xd6, 0x69, 0xc3, 0x20, 0x6b, 0xb3, 0x6a, 0x9a, 0x2e, 0xb6, 0x48, 0xc3, 0x63, 0x2d, 0xb5, 0xbc, 0xc0, 0xcd, 0x19, 0x3e, 0x47, 0xa3, 0x98, 0x1b, 0x60, 0x8f, 0x3f, 0x8b, 0xf1, 0x70, 0xe4, 0x46, 0xe3, 0xcd, 0xc7, 0xa2, 0xd7, 0x8a, 0x64, 0xaa, 0x3a, 0xbd, 0xc3, 0x6e, 0x9f, 0xae, 0x20, 0x55, 0x6c, 0x7e, 0xc7, 0x34, 0x4d, 0x85, 0x58, 0xea, 0xb9, 0xdc, 0xef, 0xf9, 0x7d, 0xc2, 0x6d, 0x66, 0x86, 0xd6, 0x69, 0x23, 0x5f, 0x40, 0x85, 0xaa, 0x17, 0x4, 0xbf, 0xfe, 0xd1, 0x29, 0xfe, 0xa, 0x47, 0x93, 0x9e, 0x81, 0x46, 0x98, 0x9e, 0x7f, 0xa2, 0xe2, 0x69, 0x96, 0x6a, 0x3e, 0x4, 0x65, 0x1e, 0xe3, 0xa2, 0x8, 0xd0, 0x24, 0xa, 0x68, 0xb7, 0x9c, 0xcf, 0xce, 0xa7, 0xdb, 0xe1, 0xc7, 0x74, 0x32, 0x50, 0x23, 0x2, 0x3, 0x26, 0x6c, 0x4b, 0x4c, 0x93, 0x8c, 0xee, 0x61, 0xce, 0x89, 0x93, 0x19, 0xe3, 0x97, 0x43, 0x3c, 0xce, 0x57, 0x87, 0x48, 0x0, 0x26, 0x8, 0xe0, 0xfb, 0xda, 0xb4, 0x6, 0xdf, 0xa2, 0xc3, 0xaa, 0x6a, 0x5b, 0xff, 0xdd, 0x0, 0x7, 0xaf, 0x45, 0xa0, 0x9f, 0x1d, 0x8c, 0x24, 0x74, 0x59, 0xa, 0x8b, 0xc6, 0x1f, 0x39, 0x7d, 0x8, 0x40, 0x16, 0x3d, 0xa5, 0x7f, 0xd0, 0x41, 0x3e, 0xa4, 0x26, 0xc5, 0x5b, 0xe3, 0x74, 0x8a, 0xa7, 0x54, 0x31, 0x8c, 0x2f, 0xda, 0xe0, 0x24, 0x89, 0x76, 0x7b, 0x9a, 0x3f, 0x61, 0x23, 0x2b, 0x4a, 0x96, 0xba, 0xc4, 0x16, 0x1d, 0xba, 0x35, 0x8d, 0x54, 0x5a, 0x57, 0xd0, 0x54, 0xfb, 0xd1, 0xfe, 0x1b, 0x2e, 0x5, 0x2, 0x64, 0xbc, 0x36, 0x21, 0x99, 0xff, 0x29, 0xdf, 0x56, 0x81, 0x14, 0xb9, 0x9c, 0xf3, 0xbd, 0x48, 0x55, 0x4e, 0xcf, 0x3f, 0x87, 0xf4, 0xf0, 0x57, 0xce, 0x3, 0x3f, 0xda, 0x25, 0x87, 0x58, 0x32, 0x95, 0xca, 0x95, 0x5c, 0x2f, 0xd8, 0x7e, 0x74, 0xf0, 0x7c, 0x12, 0x7f, 0x64, 0xac, 0xd5, 0xb, 0x57, 0x2d, 0xb0, 0x38, 0x20, 0xff, 0x3f, 0xe0, 0x3a, 0xa1, 0x67, 0xa7, 0xc2, 0xb0, 0x16, 0x2d, 0x93, 0xe9, 0xcd, 0x27, 0xaa, 0xeb, 0x1, 0xe9, 0x34, 0x12, 0xfc, 0xe3, 0x86, 0xa6, 0xad, 0x44, 0xb4, 0x99, 0x46, 0xe6, 0x13, 0xc9, 0xc5, 0x4, 0x5, 0xc4, 0x9d, 0xe9, 0xfc, 0xdd, 0xdb, 0x53, 0x2e, 0xd4, 0x99, 0x2a, 0x48, 0x58, 0x37, 0xf5, 0xaf, 0xd1, 0x25, 0x2c, 0xaf, 0x9a, 0x67, 0xcf, 0x64, 0x26, 0x96, 0xf7, 0x90, 0xee, 0x2b, 0x3e, 0x39, 0xf1, 0x99, 0x5c, 0xab, 0x74, 0xb0, 0x5b, 0x22, 0xe6, 0xea, 0xfa, 0xd0, 0xfa, 0x6c, 0xdd, 0x63, 0x2d, 0x8c, 0x64, 0x55, 0xc3, 0xcc, 0x1e, 0x26, 0x63, 0x5e, 0x43, 0x80, 0x9f, 0xc9, 0xd6, 0x37, 0x43, 0x2e, 0xa6, 0x2, 0x63, 0xa0, 0x58, 0x49, 0xca, 0x49, 0x6a, 0x91, 0x91, 0xd3, 0xd5, 0x49, 0x31, 0x99, 0x58, 0x49, 0x55, 0x3c, 0xde, 0x91, 0x9f, 0xb, 0x2, 0x8d, 0x37, 0x70, 0x51, 0xd2, 0x4d, 0xa3, 0x39, 0xb8, 0x47, 0x58, 0xf2, 0xb7, 0x38, 0x41, 0x85, 0x25, 0x28, 0xec, 0x7d, 0x7e, 0x43, 0xf7, 0x14, 0x5b, 0xea, 0x9d, 0xcf, 0x91, 0x1d, 0x27, 0x1d, 0xe3, 0xe4, 0xa, 0xb2, 0x77, 0xb3, 0xfd, 0xd4, 0x35, 0xcb, 0x27, 0x13, 0x5e, 0x5, 0x45, 0x1e, 0xde, 0x74, 0x75, 0x3e, 0x70, 0x28, 0x1b, 0xe3, 0x98, 0x32, 0x39, 0x33, 0x1, 0xde, 0x37, 0x72, 0x8, 0x55, 0xc6, 0x1, 0xd1, 0x23, 0x1, 0xf3, 0xcb, 0x32, 0xdc, 0xb0, 0xaa, 0xe8, 0x22, 0xba, 0xd, 0xc7, 0xb9, 0x5b, 0x15, 0x3d, 0x3d, 0x62, 0x52, 0x4a, 0x44, 0x8f, 0x1, 0xb0, 0x36, 0x87, 0xf0, 0x74, 0xf5, 0xd0, 0x46, 0xb4, 0x17, 0x34, 0xa0, 0xf4, 0xb2, 0xa6, 0xc, 0xa4, 0x2f, 0xaa, 0xa4, 0x66, 0xed, 0x60, 0xdb, 0xba, 0xf0, 0x79, 0x56, 0x21, 0xef, 0x4e, 0x3e, 0x32, 0x5a, 0x19, 0x71, 0x38, 0x16, 0x2b, 0x95, 0x20, 0xc3, 0x40, 0x9, 0x8f, 0x7d, 0x5f, 0x9d, 0x87, 0x62, 0xac, 0x8d, 0xfe, 0x75, 0xe8, 0xa6, 0xc1, 0x23, 0xb6, 0x9c, 0x64, 0x43, 0x6e, 0x8d, 0x33, 0x41, 0xf5, 0xaf, 0xec, 0xcc, 0xd5, 0x41, 0x45, 0x73, 0xdd, 0xf7, 0x56, 0xca, 0x88, 0xbc, 0x96, 0xde, 0x26, 0xd4, 0xb5, 0xc3, 0xa2, 0xd3, 0x9e, 0x6b, 0x4f, 0xd9, 0x48, 0x9c, 0x27, 0xf8, 0x2e, 0xbb, 0xa3, 0x54, 0x63, 0xf2, 0x67, 0x18, 0xb, 0x5b, 0x46, 0x75, 0xd5, 0x51, 0x51, 0x22, 0x95, 0xff, 0xb0, 0x99, 0xef, 0xd8, 0x0, 0x45, 0xf9, 0x88, 0x9d, 0xe1, 0xf3, 0x8, 0xc1, 0x3e, 0x13, 0x87, 0x90, 0x6a, 0xa2, 0xc0, 0xbd, 0x12, 0x27, 0x9f, 0x69, 0xc5, 0x5d, 0xa9, 0x24, 0x42, 0xd1, 0x4d, 0x3f, 0x90, 0x96, 0x80, 0x7b, 0xe4, 0x29, 0x24, 0x99, 0xa5, 0x3d, 0x5a, 0xba, 0xdb, 0xf9, 0x2f, 0x71, 0x17, 0xb7, 0xc9, 0x91, 0x63, 0x75, 0x4b, 0x0, 0x52, 0x9e, 0x9c, 0x21, 0x9d, 0xcc, 0x1d, 0xa1, 0x69, 0xe6, 0x7d, 0xc0, 0xd6, 0xd1, 0x84, 0x6b, 0x6e, 0x3b, 0x57, 0xcf, 0x5d, 0xc8, 0xac, 0x35, 0xf4, 0xdb, 0x15, 0x54, 0x8f, 0xc8, 0x58, 0x56, 0x74, 0x61, 0x7, 0x58, 0xc5, 0x17, 0x9a, 0x7e, 0x36, 0x26, 0x6f, 0xc5, 0x90, 0xca, 0xa5, 0x77, 0xd0, 0x22, 0x76, 0x4e, 0xe0, 0xa2, 0x58, 0x22, 0xf7, 0xfb, 0x5, 0xe4, 0x6, 0x6e, 0x3e, 0x5d, 0x96, 0xba, 0x54, 0xf9, 0xe6, 0xe3, 0x6f, 0xd0, 0x24, 0x57, 0x74, 0x1a, 0x25, 0x81, 0x75, 0xd4, 0x47, 0x3e, 0xdb, 0xea, 0x6f, 0x67, 0x6a, 0xc0, 0xee, 0x5f, 0x22, 0xf3, 0x69, 0x9d, 0xc5, 0x9b, 0x44, 0xfc, 0x95, 0x88, 0xda, 0x7c, 0x5e, 0x7b, 0x8d, 0x1d, 0xa7, 0x14, 0x33, 0x1a, 0xc1, 0x4d, 0xd5, 0x5e, 0xc0, 0x89, 0xe8, 0x6d, 0xae, 0xd2, 0x11, 0x1a, 0xd9, 0x2b, 0xed, 0x4c, 0x72, 0x79, 0xa9, 0xb2, 0xf6, 0x5e, 0x6a, 0x30, 0x89, 0x69, 0xcf, 0x6e, 0x49, 0xa2, 0xc8, 0x8c, 0x7b, 0xd5, 0x11, 0x16, 0xf7, 0x82, 0xfb, 0xe0, 0x51, 0x1, 0xba, 0xb8, 0xc2, 0x8a, 0x66, 0xd5, 0x26, 0x7, 0x16, 0xd, 0xb0, 0x11, 0xd7, 0x14, 0x58, 0xa2, 0x2b, 0x62, 0xf2, 0xe2, 0x3f, 0x7f, 0x57, 0xf5, 0xdd, 0x6a, 0x35, 0x94, 0x9c, 0x6b, 0x1c, 0x1e, 0x83, 0x2b, 0xbd, 0x26, 0x38, 0xb7, 0xa, 0x6, 0x3a, 0xce, 0x89, 0xf, 0x24, 0x1c, 0xc1, 0x11, 0xfa, 0x93, 0x3a, 0x30, 0x6e, 0x95, 0xd8, 0xc8, 0x9c, 0x4f, 0x87, 0xbf, 0x7c, 0x0, 0xba, 0x42, 0x99, 0x2d, 0x26, 0xc9, 0x3f, 0xdf, 0xe6, 0xbc, 0x62, 0x4e, 0xff, 0xa, 0x56, 0xe4, 0xb0, 0xe5, 0xee, 0xe7, 0xb7, 0x9, 0xb0, 0x7c, 0xbb, 0x63, 0x19, 0xe5, 0xdd, 0x37, 0x9b, 0xe2, 0xce, 0x18, 0x51, 0xaa, 0x3, 0x39, 0x26, 0x47, 0x47, 0x4a, 0xd8, 0x5c, 0xd8, 0x55, 0x0, 0x62, 0xa6, 0xca, 0x50, 0x30, 0x3d, 0x1e, 0x4b, 0x6c, 0xa7, 0x76, 0xf5, 0x7e, 0xc9, 0x82, 0x1f, 0x64, 0xf6, 0x31, 0x93, 0x4b, 0x56, 0xc7, 0xfe, 0xdf, 0x54, 0x7c, 0x7c, 0xd9, 0xab, 0x58, 0x91, 0x1a, 0x1f, 0x6d, 0xee, 0xf5, 0x7f, 0xda, 0xc3, 0x85, 0xa3, 0x93, 0x44, 0x5, 0xdf, 0x96, 0x7d, 0xeb, 0xf5, 0x5, 0x7a, 0xa5, 0x39, 0x3a, 0x47, 0xe4, 0x47, 0xd4, 0xaf, 0xa3, 0x55, 0x6d, 0xe1, 0x88, 0xc4, 0xd9, 0xa4, 0x42, 0xae, 0x76, 0xf8, 0xf5, 0xf5, 0x44, 0xe1, 0x83, 0xf1, 0x8f, 0x0, 0xe6, 0xdd, 0xa4, 0x26, 0x90, 0x6c, 0xd9, 0x8c, 0x1c, 0xad, 0x95, 0xe9, 0x49, 0x9b, 0x58, 0x3e, 0x50, 0x73, 0x2e, 0x72, 0x80, 0x26, 0xbc, 0xc2, 0x84, 0xe1, 0xbc, 0xbc, 0x5, 0x2c, 0x2c, 0x68, 0xd4, 0xbb, 0x9a, 0x5f, 0x25, 0x56, 0xd4, 0x84, 0xf0, 0xc2, 0xcf, 0x2b, 0xc4, 0x67, 0x7, 0x1c, 0x64, 0xb0, 0xe9, 0xea, 0xa0, 0x2d, 0x9a, 0x4c, 0x86, 0x2d, 0x63, 0x45, 0x1b, 0x20, 0xd6, 0x2d, 0xe3, 0x68, 0x32, 0xa8, 0x92, 0xa2, 0x49, 0x78, 0x62, 0x9f, 0xc9, 0x3e, 0x91, 0x82, 0x88, 0x37, 0x2c, 0xfa, 0xfd, 0xd8, 0xed, 0xfe, 0x8c, 0x6f, 0xee, 0x3e, 0xf3, 0x96, 0xaf, 0xa5, 0xa8, 0x3f, 0xdc, 0xe5, 0x37, 0x67, 0xc0, 0x1d, 0x3a, 0xb0, 0xb0, 0x31, 0xb5, 0x6b, 0x23, 0xb0, 0x37, 0xf0, 0x89, 0x29, 0x9f, 0xe5, 0x33, 0x53, 0x2a, 0xa1, 0xd9, 0xa7, 0xb5, 0xf9, 0x13, 0xe0, 0x24, 0xe0, 0x6a, 0x3b, 0x79, 0x25, 0xcf, 0xb0, 0xc4, 0xb5, 0x84, 0xb4, 0x7, 0x66, 0x1b, 0xc8, 0x24, 0x16, 0x3f, 0x90, 0xfa, 0x79, 0x95, 0xe8, 0x57, 0xbd, 0x68, 0xbe, 0x65, 0xfb, 0x37, 0x3, 0xc2, 0x39, 0xfc, 0x5e, 0xa5, 0x93, 0xd6, 0xe9, 0x52, 0x72, 0xc8, 0xc4, 0x7a, 0x26, 0x4e, 0x13, 0x94, 0x89, 0x9f, 0xb0, 0x8b, 0xd7, 0xb8, 0x8, 0x85, 0x3b, 0xb, 0x7, 0x14, 0xc0, 0xe4, 0xa6, 0x9a, 0x2, 0x59, 0x95, 0xae, 0xd8, 0x50, 0xed, 0xb2, 0x4d, 0x5a, 0x2c, 0x29, 0x4e, 0xd7, 0x3d, 0x37, 0x8f, 0x84, 0x55, 0x33, 0x9c, 0xb, 0x38, 0xab, 0x45, 0xac, 0xb6, 0x8d, 0x1, 0xec, 0xa8, 0x53, 0xcc, 0x69, 0x2, 0x69, 0x44, 0x1f, 0x64, 0x98, 0x87, 0x1a, 0x8d, 0x62, 0x4b, 0x8c, 0x5e, 0x47, 0x13, 0x4b, 0x28, 0x3d, 0x74, 0x1c, 0xf6, 0x19, 0xde, 0x73, 0x38, 0x93, 0x4a, 0xbf, 0x53, 0x35, 0x3f, 0xbc, 0xe5, 0x6, 0x29, 0x66, 0x84, 0x96, 0x45, 0x31, 0x35, 0xd5, 0x38, 0xde, 0xd, 0x28, 0xf7, 0x34, 0xc6, 0xa8, 0x46, 0x8f, 0x8e, 0x19, 0x24, 0x3d, 0x87, 0x1b, 0xf9, 0xaa, 0x7e, 0x11, 0x9b, 0x5f, 0x11, 0xee, 0xd5, 0xec, 0xda, 0x8d, 0xae, 0x50, 0xbe, 0xff, 0x0, 0xce, 0xae, 0xa9, 0x10, 0x77, 0x4e, 0x3d, 0x3a, 0x26, 0x4f, 0xa7, 0x6b, 0xf2, 0x21, 0xf7, 0xf3, 0xf, 0x69, 0xfa, 0xce, 0xf0, 0x47, 0x4f, 0x8a, 0x4a, 0x66, 0x68, 0x54, 0xa4, 0xba, 0x4c, 0x8e, 0xdc, 0xc1, 0x3, 0xf6, 0x23, 0x9b, 0xa6, 0x9b, 0x35, 0xc5, 0x7a, 0x7b, 0x18, 0x1, 0xd6, 0xb4, 0xda, 0xd9, 0xc8, 0xeb, 0xc1, 0x37, 0x43, 0xca, 0xa6, 0x4b, 0x7, 0xb4, 0x52, 0x54, 0x58, 0xa6, 0x9f, 0x33, 0xb7, 0x2f, 0x90, 0x81, 0x4f, 0x4b, 0x1a, 0xaa, 0xde, 0x25, 0xa5, 0x7a, 0x5d, 0xbb, 0xd2, 0x7a, 0x57, 0xb3, 0xe6, 0xc2, 0x7a, 0x28, 0xcc, 0x3b, 0x0, 0x12, 0xf6, 0xa7, 0x8c, 0x52, 0xd7, 0xb8, 0x0, 0x14, 0x2c, 0xf1, 0xb6, 0xfd, 0x8a, 0x8d, 0xdd, 0xa2, 0x46, 0xd3, 0x2e, 0x3a, 0x10, 0x39, 0x13, 0xe2, 0x2e, 0x4d, 0xc5, 0xf8, 0xc8, 0x20, 0x2d, 0x5a, 0x35, 0x92, 0x1b, 0x1, 0x8f, 0xac, 0xf2, 0x46, 0x13, 0x9f, 0xfc, 0xc6, 0x81, 0x4b, 0xd2, 0xa6, 0x5, 0xf0, 0x42, 0x60, 0xdb, 0x67, 0x95, 0x1f, 0xf8, 0xd5, 0x92, 0x2e, 0xeb, 0x70, 0x84, 0x69, 0x4d, 0xea, 0x95, 0xcb, 0x54, 0xeb, 0x81, 0x4c, 0xe0, 0x28, 0xcb, 0x2a, 0x5f, 0x64, 0xec, 0xce, 0xf8, 0xc4, 0xbf, 0x1e, 0x1c, 0x23, 0x74, 0xe0, 0x6, 0xac, 0x9f, 0x79, 0x8f, 0x85, 0xc, 0xfa, 0x37, 0x99, 0x5f, 0x22, 0x72, 0x44, 0xdb, 0xf4, 0x34, 0x16, 0x86, 0xcd, 0xb0, 0x91, 0x90, 0x2c, 0x75, 0x59, 0x61, 0xc3, 0x5e, 0x96, 0xf9, 0xa4, 0xd, 0x63, 0xe3, 0x90, 0xfc, 0xe4, 0x6f, 0x6d, 0xaa, 0x9d, 0xa4, 0xec, 0x8c, 0x9b, 0x61, 0xfc, 0xbd, 0xfd, 0xaf, 0x84, 0x10, 0x4, 0xb, 0x14, 0xc1, 0x72, 0xf6, 0x29, 0x20, 0x5e, 0x3e, 0x6f, 0x13, 0x5f, 0xc2, 0x6e, 0x60, 0x4a, 0x4c, 0x22, 0x2, 0x9b, 0x14, 0x24, 0x6d, 0x4c, 0xcf, 0xdf, 0xcf, 0x42, 0xf1, 0xb0, 0xab, 0xed, 0xa0, 0xb1, 0xfa, 0x19, 0x4, 0xd, 0xe4, 0x10, 0xb3, 0xef, 0x51, 0xce, 0xf6, 0xd, 0xd, 0xbe, 0xf5, 0x8d, 0x95, 0xb4, 0x2e, 0x5b, 0xcb, 0x59, 0x8e, 0x15, 0x36, 0x29, 0x9e, 0x45, 0xd6, 0x36, 0xe3, 0x66, 0x14, 0xb9, 0xe2, 0xaa, 0x82, 0x36, 0xa6, 0x1a, 0x41, 0x39, 0x8a, 0x65, 0xfb, 0x33, 0xa9, 0xc0, 0xd4, 0xc5, 0xec, 0x52, 0x71, 0xb7, 0x26, 0xf0, 0x49, 0x8a, 0x75, 0xc, 0xf1, 0x1f, 0x31, 0x9, 0xcb, 0x97, 0x7f, 0x83, 0xf4, 0xd5, 0x32, 0x63, 0x62, 0x3a, 0x52, 0x4f, 0x99, 0x44, 0xbb, 0x61, 0x55, 0x33, 0x88, 0xc3, 0x7b, 0xa2, 0x5e, 0x84, 0x3d, 0xb0, 0xd4, 0x5e, 0x0, 0x8a, 0xf0, 0xa1, 0xc2, 0xe1, 0x3e, 0x9d, 0xd3, 0xd, 0x6b, 0x67, 0xe7, 0xd3, 0xfd, 0x61, 0x65, 0x17, 0x60, 0x70, 0xfb, 0xff, 0x35, 0xe, 0x62, 0xa8, 0xf9, 0x64, 0xf2, 0x4f, 0x42, 0xce, 0x36, 0xf7, 0x81, 0x26, 0xda, 0x9f, 0x41, 0xc3, 0xc4, 0x48, 0x16, 0xb8, 0x9b, 0x76, 0x31, 0xf8, 0x0, 0xd0, 0x20, 0x31, 0x65, 0x85, 0xb4, 0x9e, 0xd6, 0x62, 0xbc, 0xca, 0x4c, 0xf4, 0x75, 0x7d, 0xd1, 0xb1, 0xfc, 0x49, 0xb7, 0x82, 0x7f, 0xa0, 0x34, 0x54, 0x55, 0xfb, 0xbb, 0x87, 0xf7, 0x3a, 0x2c, 0xf8, 0x83, 0xe2, 0x62, 0xd0, 0xd4, 0x6e, 0xb0, 0xa0, 0x13, 0x92, 0xa1, 0x9f, 0x88, 0x22, 0x57, 0xb4, 0xc7, 0xf3, 0xdc, 0x5e, 0x8, 0x2b, 0x16, 0x7a, 0xf, 0x30, 0xeb, 0xda, 0xd, 0xd9, 0x36, 0x1, 0xe8, 0xb5, 0xed, 0xfc, 0x7d, 0xcf, 0x9d, 0x4c, 0x24, 0xd5, 0x74, 0x68, 0xb2, 0x5c, 0x64, 0xa2, 0x3a, 0x8e, 0x34, 0x79, 0xee, 0x27, 0xa1, 0xbb, 0x1d, 0x5f, 0x57, 0x53, 0xcc, 0x8a, 0x48, 0x1e, 0x16, 0xe6, 0x80, 0x85, 0x7e, 0x3, 0x95, 0xd0, 0x50, 0x26, 0x29, 0x83, 0x92, 0xe5, 0x57, 0x16, 0x82, 0x93, 0x14, 0x99, 0x7d, 0xe6, 0xab, 0x1f, 0xe7, 0x89, 0x71, 0x2f, 0xd, 0x67, 0x32, 0xe7, 0x91, 0xcf, 0x5e, 0x48, 0x87, 0x43, 0xc6, 0x21, 0x7a, 0x75, 0xdb, 0x57, 0x8e, 0x75, 0x15, 0xe5, 0x9c, 0xa, 0x29, 0xf8, 0x9, 0x7d, 0x42, 0x7a, 0x4a, 0x38, 0x38, 0x8f, 0x30, 0x6a, 0x84, 0x99, 0x2b, 0x73, 0xb0, 0xb4, 0xac, 0xc3, 0xaa, 0x19, 0x58, 0x84, 0x17, 0x9, 0x10, 0x94, 0x9e, 0x3, 0x5e, 0xce, 0xa7, 0x11, 0xa1, 0xcb, 0x95, 0x8e, 0x5, 0x78, 0x73, 0x37, 0xaa, 0x81, 0xeb, 0x54, 0x11, 0x41, 0x4, 0xa1, 0x46, 0xc7, 0x41, 0xc7, 0x8a, 0x82, 0xfb, 0xbc, 0x73, 0xc, 0xa1, 0x29, 0x2b, 0x97, 0x9d, 0x91, 0xbe, 0x39, 0x64, 0xad, 0xfb, 0xa2, 0x43, 0xb0, 0xb4, 0xf3, 0x4b, 0x40, 0xe8, 0xb5, 0x82, 0xdf, 0xda, 0xe6, 0x39, 0x4c, 0xbd, 0x97, 0x63, 0x8, 0x64, 0x71, 0x4f, 0xcb, 0xec, 0x1e, 0x7f, 0x68, 0xe5, 0x7d, 0xf, 0xc3, 0xc3, 0x7e, 0xf3, 0x73, 0x2a, 0x33, 0xdb, 0xa0, 0xeb, 0x59, 0xdd, 0xbd, 0x59, 0x52, 0xc6, 0x57, 0x32, 0x4d, 0xdb, 0x9c, 0x70, 0x91, 0x22, 0x90, 0x93, 0x38, 0xbd, 0x25, 0x3b, 0x79, 0x9a, 0xf0, 0x56, 0x37, 0xe4, 0x4b, 0xe3, 0x9f, 0xf3, 0xc9, 0x56, 0xfb, 0x9a, 0xce, 0xbd, 0x76, 0x2f, 0x27, 0x8b, 0x20, 0x61, 0x7a, 0x86, 0x37, 0x9f, 0xc3, 0x72, 0x99, 0x8, 0x7, 0x43, 0x1d, 0xea, 0x4f, 0x9f, 0x42, 0x8a, 0x87, 0x44, 0xa7, 0xd0, 0x9, 0x66, 0x51, 0xdb, 0x2b, 0x71, 0x49, 0x6, 0xdf, 0xb5, 0x69, 0xe7, 0x57, 0xba, 0x26, 0xb8, 0xf2, 0xaa, 0xc7, 0x1f, 0xf2, 0x5d, 0x33, 0x82, 0x95, 0xd9, 0x93, 0x5c, 0x67, 0xf0, 0x89, 0x23, 0xe6, 0x7b, 0x67, 0x68, 0x7a, 0x36, 0xac, 0x59, 0x1b, 0x95, 0xd9, 0x21, 0xff, 0x85, 0x79, 0xa7, 0xce, 0x1c, 0x1, 0x85, 0xfb, 0x56, 0x89, 0x3, 0x9b, 0x5e, 0xca, 0xaa, 0x1a, 0x85, 0xb7, 0x97, 0x97, 0x3b, 0x71, 0x56, 0x21, 0xa5, 0x8a, 0x51, 0xf6, 0x61, 0xa, 0x15, 0xc7, 0xe8, 0x57, 0x33, 0x69, 0x2b, 0x2c, 0xec, 0xe2, 0xe7, 0x42, 0x78, 0x48, 0xa5, 0x68, 0x68, 0x65, 0xaf, 0xff, 0x8d, 0x81, 0xfc, 0x68, 0xe0, 0x82, 0xbd, 0x63, 0xd9, 0x33, 0x77, 0x91, 0x65, 0x8b, 0x5c, 0xda, 0x64, 0x28, 0x73, 0x24, 0x7b, 0xff, 0x90, 0x70, 0x92, 0x97, 0xd, 0x6d, 0x2f, 0x94, 0xdb, 0xff, 0xd6, 0x73, 0x93, 0x3b, 0x44, 0x41, 0xee, 0xc3, 0x5, 0xb6, 0x6d, 0xd3, 0xff, 0xeb, 0x41, 0xe5, 0xb2, 0x3e, 0xcc, 0x1d, 0xce, 0x96, 0x5a, 0x41, 0xb7, 0xf6, 0xa2, 0x3a, 0x16, 0x2e, 0x68, 0x83, 0xe3, 0x18, 0xf2, 0x3a, 0x2f, 0xd4, 0xbd, 0xfe, 0x46, 0xdb, 0xba, 0xfd, 0xba, 0x7e, 0x50, 0xa0, 0x90, 0x1a, 0xe2, 0x52, 0xce, 0x4d, 0xab, 0xa8, 0x4c, 0x73, 0xfb, 0x7c, 0x1b, 0x2e, 0x83, 0xf0, 0xa3, 0xc9, 0x54, 0xc3, 0x3e, 0x52, 0xfe, 0x8a, 0x7a, 0xca, 0xad, 0x8e, 0x37, 0x7e, 0xc9, 0x91, 0xae, 0xbb, 0x32, 0x3b, 0xac, 0x99, 0xc5, 0x49, 0x74, 0x55, 0x46, 0x1c, 0xb, 0x71, 0xc3, 0x19, 0xa6, 0x7e, 0xa8, 0x9d, 0xf7, 0x6a, 0x4c, 0x2e, 0x69, 0x6a, 0xd9, 0x38, 0xde, 0x86, 0x5d, 0x3f, 0xff, 0xec, 0xc0, 0x8, 0x1c, 0x42, 0xf, 0x32, 0xc5, 0xec, 0x5d, 0xec, 0x8f, 0xbc, 0xf2, 0xa6, 0x92, 0x6c, 0x78, 0xd6, 0x84, 0xff, 0x83, 0x13, 0xa7, 0x84, 0xa0, 0xff, 0xdb, 0x6, 0x8c, 0x58, 0x87, 0x15, 0xe7, 0x57, 0x68, 0xca, 0xf5, 0x85, 0xd, 0xd4, 0x74, 0xc7, 0xb6, 0xb3, 0x11, 0x73, 0xe8, 0xa8, 0x21, 0x35, 0x4c, 0xc8, 0x57, 0x23, 0x67, 0xf, 0xfe, 0x29, 0x5b, 0x61, 0x74, 0xfe, 0xe5, 0xcd, 0x58, 0x71, 0x5b, 0x10, 0x51, 0xbc, 0x2, 0x8e, 0xfc, 0x5, 0xa1, 0x48, 0x1e, 0xa0, 0x37, 0x8c, 0xa4, 0x9b, 0x28, 0x4a, 0x75, 0x9d, 0x76, 0x80, 0x21, 0x1c, 0xd5, 0xe1, 0x6f, 0x8c, 0xc0, 0x87, 0x13, 0xbd, 0xb7, 0x33, 0xdd, 0x32, 0xb0, 0xa6, 0xa, 0xb, 0x2, 0xdb, 0x26, 0x38, 0x95, 0x3c, 0xc7, 0x64, 0x6, 0x80, 0x7e, 0x13, 0x5, 0x5d, 0xf9, 0xc, 0x66, 0xc4, 0x2, 0x63, 0xc6, 0x8a, 0xf2, 0xce, 0xb2, 0x11, 0x4e, 0x0, 0x99, 0x36, 0x35, 0x97, 0x4f, 0x28, 0x5b, 0x4f, 0x82, 0xea, 0x4, 0x5b, 0xd3, 0x9e, 0x29, 0x3e, 0xb4, 0x89, 0x30, 0xa0, 0x4d, 0xf7, 0x88, 0x2c, 0xc7, 0x2c, 0xe4, 0xa2, 0x45, 0x7a, 0xd5, 0x69, 0x82, 0x8e, 0xb3, 0x7, 0x66, 0xfc, 0x63, 0x1e, 0x7c, 0xc, 0xb, 0x39, 0x29, 0xaf, 0x2a, 0x9e, 0xe8, 0x69, 0x28, 0xee, 0x1b, 0xda, 0x40, 0xc7, 0xc7, 0x74, 0xb9, 0x3f, 0xaf, 0xfc, 0xf6, 0x56, 0x85, 0xd1, 0xbe, 0xb6, 0xa4, 0x95, 0x39, 0xa, 0x1a, 0x54, 0x5c, 0x9, 0x97, 0x95, 0x57, 0xab, 0x2d, 0xe9, 0x3c, 0xa7, 0x2a, 0xff, 0xa1, 0xc6, 0x6, 0xa7, 0x38, 0xe4, 0x4d, 0x4b, 0xa5, 0xd0, 0xad, 0xcd, 0x6, 0xa9, 0xfc, 0x1a, 0x6b, 0xb, 0x16, 0xdd, 0x10, 0xde, 0x29, 0x16, 0x60, 0xfc, 0x25, 0xa3, 0x3d, 0x63, 0xd3, 0x99, 0x9c, 0x8e, 0x34, 0x5a, 0x4d, 0x8a, 0x15, 0x46, 0xf7, 0xe3, 0x1f, 0x1d, 0x5c, 0xe8, 0x8b, 0xc8, 0xed, 0x53, 0xc2, 0xb6, 0x9c, 0xa0, 0x3c, 0x48, 0xe, 0x3d, 0xdd, 0x5a, 0x5, 0xe3, 0x9a, 0x87, 0xf6, 0x97, 0xb9, 0xbf, 0x1d, 0x43, 0x7, 0xd0, 0x9a, 0x92, 0xc, 0x42, 0xdb, 0xd2, 0x84, 0x15, 0x62, 0xf1, 0xce, 0xcd, 0x28, 0x88, 0x7, 0xef, 0xf3, 0xd, 0xb5, 0x66, 0x4b, 0xbd, 0x6d, 0x9d, 0xda, 0x89, 0x45, 0x4, 0x2b, 0x9c, 0xd9, 0xe3, 0xd2, 0x4f, 0xbc, 0x41, 0xc2, 0x98, 0xd2, 0xa7, 0xc9, 0x4b, 0x21, 0xfd, 0x7c, 0x80, 0x56, 0xba, 0x97, 0xb6, 0xe3, 0xdb, 0xea, 0x64, 0x45, 0x2, 0x78, 0x1c, 0xef, 0xc5, 0x49, 0x81, 0xb4, 0xcf, 0xcd, 0xe8, 0xdd, 0x4, 0x26, 0x4d, 0x5a, 0xa7, 0xf0, 0x6b, 0x94, 0xaf, 0x38, 0x15, 0x6c, 0x7f, 0x4d, 0x15, 0x27, 0xcc, 0x1f, 0x5b, 0xde, 0x30, 0x92, 0xcc, 0x95, 0x82, 0x4f, 0x86, 0x66, 0xe9, 0x19, 0x85, 0xd8, 0x77, 0xbc, 0x86, 0x62, 0xea, 0xa9, 0x1, 0x99, 0xb0, 0x4d, 0x79, 0x69, 0x58, 0xfe, 0x9d, 0x24, 0x21, 0xcd, 0xa6, 0xbb, 0xbd, 0xb, 0x37, 0xc4, 0x6b, 0x5e, 0xfc, 0x21, 0x31, 0x81, 0x8f, 0x71, 0x61, 0x8b, 0xc7, 0x22, 0xbd, 0xed, 0xdf, 0x9c, 0x71, 0x3d, 0xd4, 0xd9, 0xec, 0x3e, 0x31, 0x4b, 0x22, 0x1b, 0xbb, 0x19, 0x1f, 0x3, 0x44, 0x41, 0x58, 0x31, 0xa3, 0x7, 0xab, 0x73, 0x49, 0x97, 0x26, 0x65, 0x36, 0x6, 0xf4, 0xde, 0xaa, 0x67, 0x96, 0x5d, 0x53, 0xae, 0x19, 0x30, 0xd5, 0xd7, 0xc6, 0xeb, 0xa2, 0xe3, 0xa7, 0xdb, 0xfa, 0x72, 0x16, 0x9d, 0x26, 0x75, 0xa5, 0x13, 0x23, 0xa3, 0x2e, 0x92, 0xd, 0xb5, 0x69, 0x1a, 0xfa, 0x97, 0x45, 0x2b, 0x20, 0xca, 0xcf, 0x28, 0x6e, 0x4c, 0x91, 0xb, 0x10, 0x68, 0x0, 0x11, 0xbd, 0xb7, 0x5d, 0x6a, 0xc9, 0x73, 0x8d, 0x41, 0x2e, 0xe0, 0x46, 0x55, 0x80, 0x8e, 0xdc, 0x6e, 0x9e, 0xfa, 0x40, 0x98, 0x63, 0x82, 0x78, 0xe6, 0xe0, 0xc0, 0x3d, 0x64, 0xbe, 0xb7, 0xa4, 0x58, 0x8, 0x43, 0x1e, 0x5f, 0xcf, 0x18, 0x14, 0x24, 0x42, 0x1d, 0xaf, 0x49, 0xef, 0x9f, 0x62, 0xc, 0x99, 0x5, 0x32, 0x1d, 0xc3, 0x5e, 0xcd, 0xe0, 0x46, 0x48, 0xd4, 0x85, 0xbf, 0xba, 0xa8, 0x47, 0xdb, 0x46, 0x7f, 0x9f, 0x75, 0xaa, 0xf1, 0xc9, 0x66, 0x5f, 0xa1, 0x6c, 0xea, 0x96, 0xf7, 0xe4, 0x13, 0x10, 0x71, 0x28, 0x79, 0x1f, 0x2a, 0xdc, 0x7c, 0x56, 0x45, 0x8d, 0x65, 0x5c, 0x70, 0x28, 0xb7, 0xad, 0x98, 0xe, 0x60, 0xce, 0x4a, 0xff, 0xc1, 0xf7, 0x39, 0xad, 0x6c, 0x4b, 0x57, 0x86, 0xba, 0xa1, 0x28, 0xb4, 0x20, 0xba, 0x34, 0xd6, 0x58, 0x3d, 0xfb, 0xfd, 0xe6, 0xa2, 0xde, 0x1c, 0x1, 0xc0, 0xd, 0x96, 0x18, 0x7b, 0x7a, 0x36, 0x32, 0xa8, 0x7, 0x15, 0x52, 0x50, 0x8f, 0x2c, 0x39, 0xb7, 0x9d, 0x2e, 0xef, 0xe5, 0x4b, 0x91, 0xb3, 0xac, 0x85, 0x6f, 0x44, 0xea, 0x78, 0xb1, 0x70, 0x9a, 0xee, 0xc3, 0xd8, 0x98, 0xa6, 0x43, 0x4c, 0xbd, 0x77, 0x1, 0x4c, 0x84, 0xe5, 0xbb, 0x73, 0xa9, 0xea, 0xb3, 0x2a, 0x6, 0x4d, 0x27, 0x9b, 0x29, 0xaf, 0xda, 0x6a, 0x85, 0x7c, 0xe, 0xba, 0x26, 0xb8, 0xb2, 0x5c, 0x76, 0x94, 0x91, 0x9b, 0x13, 0x87, 0xd3, 0x9f, 0xbd, 0x9b, 0xe7, 0x21, 0x7b, 0x71, 0xc, 0x1c, 0x24, 0x9a, 0x76, 0x8f, 0xb4, 0x93, 0x5a, 0x72, 0x8b, 0x36, 0x68, 0xe3, 0x83, 0xe1, 0x96, 0x5b, 0x1f, 0x55, 0x4f, 0x9d, 0xef, 0xa0, 0x10, 0x99, 0x2a, 0xa4, 0x39, 0x71, 0xc6, 0x76, 0x5e, 0x9, 0x4e, 0xa2, 0xc8, 0xe1, 0x71, 0xf2, 0xb8, 0x19, 0x27, 0x36, 0x7f, 0x2f, 0x21, 0x17, 0x12, 0xfa, 0x0, 0x3f, 0xeb, 0x75, 0x9f, 0xb6, 0x6d, 0x3e, 0x34, 0x6e, 0x8e, 0x11, 0x4e, 0x3f, 0x99, 0xb6, 0x25, 0x59, 0x55, 0xbd, 0x98, 0x85, 0xfa, 0x2e, 0xb3, 0x14, 0xd5, 0xd, 0xb4, 0xa1, 0xe3, 0x24, 0x7a, 0x80, 0x55, 0x30, 0x7e, 0xc3, 0x57, 0x58, 0x77, 0x50, 0x95, 0xcc, 0x7d, 0xb0, 0xc1, 0x9b, 0x2c, 0x12, 0x11, 0x63, 0x5, 0xe9, 0xdc, 0xa5, 0x2, 0xd5, 0x85, 0xae, 0x6e, 0x72, 0x41, 0xeb, 0x34, 0xaa, 0xc9, 0x3f, 0xe5, 0xf7, 0x38, 0x49, 0xe, 0x9f, 0x8c, 0x61, 0x47, 0x9e, 0x71, 0x83, 0xdc, 0x69, 0x7d, 0xd4, 0x58, 0xcc, 0x64, 0x1a, 0xf4, 0x23, 0x1a, 0x4c, 0xd7, 0x66, 0x9f, 0x82, 0xb5, 0x68, 0xe0, 0x28, 0x5d, 0xf6, 0x66, 0x4, 0x21, 0x29, 0x75, 0xd3, 0xd8, 0xf8, 0x4e, 0xa6, 0xc6, 0x2f, 0x15, 0xf1, 0x2a, 0x7a, 0x6a, 0xce, 0x19, 0x5c, 0x48, 0xd4, 0x55, 0xd7, 0xe2, 0x48, 0xf6, 0xf5, 0xd2, 0xb, 0x6d, 0x21, 0xb5, 0x9d, 0xf8, 0xb1, 0x6a, 0x2d, 0xf0, 0xc6, 0xed, 0xc, 0x65, 0xfc, 0x1a, 0xf4, 0x46, 0x71, 0xdf, 0x8a, 0x1c, 0x96, 0x73, 0xbc, 0xb1, 0xb9, 0xb1, 0xbd, 0x7e, 0xcb, 0x7f, 0x14, 0xd2, 0x63, 0x3, 0x8, 0xc1, 0xf7, 0xe, 0xaf, 0xca, 0xc5, 0x9, 0x5c, 0xd9, 0xf3, 0x1a, 0xb, 0xf9, 0x83, 0x48, 0xf4, 0xf6, 0xd4, 0xbf, 0xaf, 0x7a, 0x6d, 0x9b, 0x8d, 0x8a, 0x87, 0xe0, 0x64, 0x9b, 0xe5, 0x6a, 0x35, 0xbd, 0xe8, 0x9c, 0xfc, 0xee, 0xf4, 0x5a, 0xd2, 0x2e, 0xc0, 0xa6, 0x98, 0x3d, 0x84, 0xd8, 0x19, 0x63, 0x64, 0xf5, 0x73, 0x31, 0x16, 0x4f, 0x6c, 0xca, 0x64, 0xed, 0x2d, 0x2b, 0xd0, 0xfc, 0x6d, 0xce, 0xe5, 0x19, 0x7b, 0xe2, 0xca, 0x87, 0xd8, 0xa0, 0x5f, 0xbc, 0x69, 0xa3, 0x10, 0x37, 0x46, 0x7, 0x6e, 0x60, 0xc2, 0x59, 0x4e, 0xe7, 0xc6, 0xf3, 0x2a, 0x11, 0xc1, 0x15, 0xa0, 0x13, 0x7a, 0x7e, 0x0, 0x30, 0xba, 0x4a, 0xf5, 0xaa, 0xbb, 0x89, 0x47, 0xbb, 0x83, 0xf4, 0x3f, 0x27, 0xfd, 0x9f, 0xf6, 0x50, 0xd, 0x7c, 0x92, 0xd6, 0xa4, 0xf4, 0x91, 0xc1, 0x63, 0x7e, 0xe6, 0xd6, 0xf2, 0x42, 0x40, 0x34, 0xda, 0x8b, 0xc6, 0x72, 0x8b, 0x93, 0xc2, 0xcd, 0xcf, 0xd7, 0xe9, 0x54, 0x6e, 0x6f, 0xd2, 0xfb, 0x8a, 0xd2, 0xe5, 0x3f, 0x8b, 0xc2, 0xb6, 0x23, 0x4, 0xd4, 0x8d, 0x44, 0x16, 0xf4, 0x2a, 0x3, 0xcc, 0x1e, 0x71, 0xd9, 0x76, 0xec, 0x10, 0x8c, 0x7e, 0x4a, 0xae, 0x6e, 0xb, 0xb9, 0x5, 0x98, 0x4f, 0x85, 0x94, 0x5, 0xed, 0x4b, 0x32, 0x15, 0xb, 0xfd, 0xa3, 0x5c, 0x8b, 0xd9, 0x48, 0x18, 0xf7, 0x89, 0xef, 0xb3, 0x39, 0xf0, 0xfc, 0xe5, 0x1f, 0xd0, 0x2e, 0xda, 0x7b, 0x62, 0x2e, 0x33, 0x81, 0x44, 0x41, 0x3e, 0x7, 0xa5, 0xd7, 0xec, 0x7c, 0xe6, 0xcd, 0xec, 0x9c, 0x8a, 0x46, 0x16, 0x69, 0x2e, 0xa1, 0x6d, 0x3a, 0x5, 0xcc, 0xeb, 0x92, 0xcc, 0x64, 0x6b, 0x3a, 0x78, 0xb8, 0x76, 0x0, 0xa8, 0xa2, 0x2f, 0x99, 0xa5, 0xa0, 0xe8, 0xd0, 0x42, 0x30, 0xec, 0x56, 0x7c, 0x53, 0x1c, 0xc7, 0xd9, 0x69, 0xc7, 0x6b, 0x6b, 0x96, 0x6a, 0x8b, 0x38, 0xc7, 0x9f, 0xbf, 0xd3, 0xab, 0x33, 0xc2, 0xa0, 0x69, 0x53, 0xc4, 0x2f, 0xd0, 0x5b, 0xf5, 0xd0, 0xf9, 0xee, 0x92, 0x32, 0x2, 0x33, 0x2c, 0xa7, 0x16, 0x11, 0x8c, 0x9f, 0x36, 0x40, 0x5a, 0xf, 0x91, 0xa7, 0x96, 0x3e, 0xf0, 0x6e, 0x9e, 0x42, 0x39, 0x39, 0x84, 0xf3, 0x81, 0x61, 0xeb, 0x60, 0xd3, 0x18, 0x25, 0x90, 0x83, 0xf0, 0x49, 0xaf, 0xb, 0x39, 0xe8, 0xb9, 0x13, 0xc0, 0x65, 0xfe, 0xa4, 0x34, 0x4d, 0xec, 0xb3, 0x7c, 0xb9, 0x7a, 0x3d, 0x85, 0x4f, 0x8b, 0x8, 0x7a, 0x42, 0x72, 0x1f, 0xad, 0xfe, 0x2e, 0x68, 0xfc, 0x83, 0x38, 0x68, 0x8d, 0x4d, 0xfc, 0xa1, 0x24, 0x72, 0xdd, 0xdd, 0xaf, 0x1d, 0x9f, 0x4c, 0x84, 0x4e, 0x5c, 0x7d, 0x9b, 0x11, 0x15, 0x8e, 0xd1, 0x40, 0x7f, 0xeb, 0x68, 0xc2, 0xb7, 0x4c, 0xd1, 0xc6, 0x79, 0xe1, 0x89, 0xae, 0xc2, 0x55, 0xc8, 0xb4, 0x65, 0xa2, 0xd9, 0xb0, 0x7c, 0x99, 0xbb, 0x8, 0x35, 0x5b, 0x4a, 0xc6, 0x2e, 0x5b, 0x63, 0x2c, 0xbc, 0x2c, 0x28, 0xb1, 0x7c, 0x1a, 0xdd, 0x28, 0xb8, 0x3a, 0x97, 0x46, 0xbe, 0x26, 0x76, 0x8d, 0xa0, 0xb2, 0xd6, 0x8, 0xe7, 0x40, 0x8d, 0xaf, 0x6b, 0xf3, 0xb3, 0xae, 0x4d, 0xa1, 0x1f, 0x57, 0x72, 0x98, 0xfd, 0x2d, 0xf2, 0x2f, 0x73, 0xb1, 0x85, 0x8d, 0x10, 0x87, 0x0, 0xa7, 0x1, 0xab, 0x87, 0x7a, 0x20, 0x88, 0x59, 0xa8, 0xfe, 0xaa, 0xaa, 0x55, 0x7, 0xf0, 0x69, 0xf8, 0x32, 0xc8, 0xcc, 0x1a, 0x9d, 0x8d, 0xca, 0x85, 0x11, 0x8f, 0x48, 0xd2, 0xde, 0x87, 0xd9, 0x7d, 0xc7, 0xf2, 0xad, 0x24, 0x61, 0xc4, 0x60, 0xf0, 0x39, 0x30, 0x5f, 0xf4, 0x95, 0xe0, 0x71, 0x75, 0xb, 0xd7, 0xe5, 0xf, 0xe7, 0x60, 0x62, 0x50, 0x86, 0xd5, 0x82, 0x5, 0xd1, 0x50, 0xf7, 0xa7, 0x5e, 0xd7, 0x39, 0x64, 0xc3, 0xba, 0x75, 0xb1, 0xd0, 0xf3, 0x8c, 0x29, 0x13, 0xd0, 0x21, 0x4d, 0x56, 0xa7, 0xf3, 0xfc, 0x3e, 0xcd, 0x3f, 0x3e, 0xa4, 0x4a, 0xb2, 0x9a, 0x8e, 0x8, 0xb8, 0x34, 0xc0, 0x26, 0xdd, 0xea, 0x46, 0x3d, 0xbd, 0xc9, 0x4d, 0xef, 0xa5, 0x6f, 0x6a, 0x4c, 0x8a, 0x58, 0x9d, 0xf9, 0xa2, 0x6c, 0xa4, 0x1d, 0x2f, 0x55, 0xd3, 0xab, 0xdd, 0xd1, 0xcd, 0xfa, 0x1a, 0xce, 0xf8, 0xc3, 0x72, 0x78, 0x5, 0xd4, 0x92, 0xee, 0x4e, 0xc, 0xd9, 0x94, 0x3b, 0x62, 0xca, 0x1f, 0xb4, 0x8b, 0xd2, 0xe1, 0x7c, 0x41, 0xe7, 0xd2, 0x92, 0x27, 0x24, 0xf5, 0xe7, 0xe, 0x97, 0x71, 0xbc, 0x42, 0xff, 0x1e, 0xa4, 0x67, 0x5c, 0x6d, 0xdc, 0xf4, 0x1f, 0x58, 0x2a, 0x88, 0x20, 0x7b, 0x9b, 0x70, 0x77, 0x2c, 0x7f, 0x21, 0xbe, 0x1d, 0x73, 0x54, 0x35, 0x77, 0x21, 0xb7, 0x5b, 0xcd, 0xa8, 0xf2, 0x2a, 0x59, 0xd0, 0x1d, 0x59, 0x69, 0xe7, 0xee, 0x58, 0x77, 0x64, 0xba, 0x4b, 0xc9, 0x30, 0x29, 0xbb, 0xc0, 0xf2, 0x76, 0xf1, 0xda, 0xdd, 0x6a, 0x1e, 0x58, 0x26, 0x57, 0xe2, 0x4, 0x46, 0xca, 0x1, 0xfb, 0x2f, 0x34, 0x85, 0xed, 0x4d, 0x40, 0xa, 0xd6, 0x38, 0x18, 0x44, 0x96, 0xf, 0xf6, 0x8c, 0x4a, 0x1c, 0x7, 0xc9, 0x1c, 0x69, 0xbc, 0x9b, 0x3, 0x28, 0x44, 0x34, 0x44, 0x87, 0x58, 0xfd, 0x81, 0xd, 0x9c, 0x80, 0x85, 0x1c, 0x10, 0x97, 0x7f, 0x6f, 0x45, 0x8c, 0x4c, 0x75, 0xfb, 0xa7, 0x3f, 0x1, 0x71, 0xaf, 0xd5, 0xa1, 0xf7, 0x6a, 0x46, 0xc9, 0xed, 0xb, 0xe5, 0x16, 0x82, 0xe6, 0xa0, 0x70, 0x73, 0xd2, 0xb, 0xa3, 0xcb, 0xf4, 0xcc, 0x21, 0x4, 0x87, 0xbf, 0xaf, 0x81, 0x79, 0xe1, 0xf0, 0x49, 0x94, 0x67, 0x6a, 0x49, 0x2, 0xae, 0xed, 0x47, 0xa, 0xbe, 0xc4, 0xcf, 0x86, 0x22, 0xca, 0xfe, 0xb1, 0x36, 0xc9, 0x73, 0x30, 0xfb, 0xf8, 0xf8, 0x3, 0x12, 0x46, 0x69, 0xf5, 0xf8, 0x48, 0xde, 0x5b, 0x71, 0xd6, 0xad, 0xbc, 0x7d, 0xbc, 0x89, 0x21, 0x73, 0x38, 0x70, 0xc9, 0x8a, 0xee, 0x9, 0xc7, 0x9e, 0x29, 0x45, 0x5d, 0xf8, 0xaf, 0x5a, 0x84, 0xe2, 0x7e, 0x28, 0xd1, 0x1f, 0xbf, 0x1d, 0xdb, 0x74, 0x88, 0x1f, 0x7d, 0xd6, 0x88, 0xc, 0x99, 0x8b, 0x58, 0x46, 0xea, 0x13, 0x83, 0x36, 0x84, 0x9a, 0x64, 0xba, 0x60, 0xae, 0x43, 0xd5, 0x60, 0xce, 0xcb, 0xfd, 0xd5, 0x2d, 0x27, 0x90, 0x98, 0x95, 0xe9, 0x3d, 0xcf, 0x10, 0x3a, 0x71, 0x3e, 0x2a, 0x43, 0xf3, 0x75, 0xb8, 0x27, 0x82, 0xe2, 0x9f, 0x47, 0x13, 0x5e, 0xc8, 0xcd, 0xfa, 0xfe, 0xa9, 0x1e, 0x56, 0xb8, 0xfd, 0xaa, 0x32, 0x83, 0xa0, 0x97, 0xa2, 0xa6, 0x62, 0x9b, 0x80, 0x73, 0xb5, 0x8b, 0xd, 0x9b, 0x6f, 0x3, 0x63, 0xc, 0xfd, 0x1c, 0xfa, 0xd2, 0xa8, 0xbd, 0x64, 0xbd, 0x55, 0xeb, 0x16, 0x7a, 0x27, 0x3e, 0xc1, 0x2a, 0x8a, 0x8e, 0xe4, 0xf7, 0xf5, 0xa9, 0xb1, 0x4e, 0xdf, 0xf6, 0x94, 0x44, 0x62, 0xa, 0x1f, 0x98, 0xeb, 0x84, 0xbf, 0xed, 0xf0, 0x38, 0x64, 0x53, 0x32, 0xdc, 0xba, 0x49, 0x71, 0x75, 0x4f, 0x0, 0x41, 0xa5, 0xbe, 0x50, 0xee, 0x94, 0x1c, 0xdf, 0x10, 0x7d, 0xc6, 0xba, 0x31, 0xbc, 0x27, 0xb7, 0xa1, 0x73, 0x3d, 0x25, 0x28, 0x6e, 0x68, 0x30, 0xf2, 0x1c, 0xd0, 0xb3, 0x3b, 0x5a, 0x6a, 0x30, 0x39, 0xc0, 0xb, 0xa4, 0x1b, 0x3a, 0x78, 0x96, 0xfd, 0x41, 0xa, 0x4e, 0xd4, 0xcd, 0x53, 0x2, 0x9a, 0xd3, 0xe8, 0xa1, 0x38, 0x86, 0x38, 0xc7, 0x26, 0xbe, 0x80, 0x64, 0x82, 0xf3, 0x85, 0x22, 0x1d, 0x5e, 0x36, 0xee, 0x36, 0x5c, 0xb, 0xec, 0x8f, 0x8d, 0x8d, 0x18, 0x82, 0x4d, 0xf, 0x1f, 0x48, 0x1a, 0xef, 0x34, 0x9a, 0xd2, 0x87, 0xa4, 0xe1, 0x43, 0x8f, 0x1a, 0xa5, 0xdd, 0x2, 0x39, 0x7c, 0x14, 0xa8, 0xa5, 0xb4, 0x73, 0x69, 0xfe, 0x6, 0xf7, 0xd2, 0x35, 0x7e, 0x45, 0x57, 0xc2, 0xcf, 0xef, 0xc2, 0x5a, 0x1b, 0x61, 0x0, 0x87, 0xd4, 0x48, 0x3f, 0x93, 0xb2, 0xbe, 0x12, 0x49, 0x88, 0xaf, 0x65, 0xc3, 0x94, 0xdf, 0x2e, 0x16, 0xe6, 0x4d, 0x5a, 0x7f, 0x4b, 0xf3, 0x32, 0xc, 0x7c, 0xba, 0x46, 0xc6, 0x74, 0x10, 0x9, 0xb2, 0xf3, 0x6a, 0x2c, 0x63, 0x5f, 0x6f, 0xb2, 0x9b, 0x33, 0xa3, 0xf6, 0x10, 0xb6, 0x85, 0x4d, 0x4, 0x8e, 0xdb, 0x85, 0x1e, 0x54, 0x7e, 0x19, 0x94, 0x8, 0x7a, 0x69, 0xc3, 0xa8, 0x4e, 0xcb, 0xa7, 0xc0, 0x8c, 0xe1, 0x65, 0x6e, 0xfe, 0x71, 0xa4, 0x50, 0x4f, 0x8c, 0xa3, 0x9c, 0x43, 0x13, 0x2f, 0x7a, 0x74, 0x31, 0xf0, 0x8b, 0x31, 0x7, 0xc0, 0xba, 0xa6, 0xc4, 0x53, 0x3d, 0xcb, 0xec, 0x1d, 0xe5, 0x3e, 0xda, 0xa8, 0x3f, 0x8f, 0xa4, 0x5c, 0xdf, 0x1a, 0xc0, 0xbf, 0x84, 0x9b, 0x2a, 0xe2, 0x6, 0x2f, 0x35, 0x64, 0x4a, 0x9e, 0x9, 0xc1, 0xa1, 0x4d, 0xe5, 0xce, 0xc0, 0x89, 0x1b, 0xfa, 0xe8, 0x54, 0xda, 0xbb, 0xfb, 0x55, 0x6e, 0x6f, 0xf5, 0x3d, 0x6a, 0x16, 0x88, 0x6f, 0x17, 0x20, 0x24, 0x4a, 0xa4, 0x1c, 0xff, 0xb5, 0xb7, 0xdf, 0x88, 0xfd, 0x6a, 0x93, 0xa0, 0xd4, 0x11, 0x86, 0x37, 0x24, 0x4c, 0xe3, 0x92, 0x48, 0x55, 0x3e, 0x6d, 0x41, 0x24, 0x5f, 0x45, 0x2a, 0xe, 0x43, 0x3d, 0xb5, 0x13, 0x84, 0xa0, 0xa2, 0x32, 0x90, 0xee, 0x6a, 0xc5, 0x99, 0xb1, 0x67, 0xc3, 0xee, 0xf6, 0x2b, 0x43, 0x9, 0xc1, 0xec, 0xf0, 0xda, 0xc6, 0x50, 0x28, 0x55, 0x48, 0x20, 0xc9, 0x5b, 0x55, 0xce, 0xeb, 0x49, 0x7, 0x13, 0x81, 0x54, 0xa6, 0x6b, 0xb6, 0xdf, 0x97, 0x85, 0x29, 0x6f, 0x97, 0xf7, 0x84, 0x1b, 0xa4, 0xd5, 0xf8, 0x70, 0xeb, 0xd9, 0xb5, 0xd5, 0x28, 0xb2, 0xbb, 0xd7, 0xe7, 0xdd, 0x5a, 0x37, 0x32, 0xb, 0x1c, 0xc, 0x86, 0x8b, 0xe8, 0x31, 0xaa, 0xdb, 0x3e, 0x17, 0xc4, 0x68, 0xf5, 0xd1, 0x2, 0xdf, 0x59, 0x54, 0x83, 0xfc, 0x92, 0x15, 0x7e, 0x9a, 0xcd, 0xf, 0xfb, 0xc0, 0xea, 0x2b, 0xa, 0x3b, 0x47, 0x1b, 0xb8, 0xfd, 0xa6, 0xb0, 0x48, 0xfc, 0xe8, 0xf, 0x6f, 0x4c, 0x22, 0xe3, 0x89, 0xe1, 0x77, 0x57, 0x45, 0xc8, 0xa5, 0xa1, 0x29, 0x28, 0x6f, 0x45, 0xe0, 0xbe, 0x10, 0xcc, 0xd5, 0x2b, 0x76, 0xda, 0x56, 0x5c, 0xd9, 0x8a, 0xa8, 0x1d, 0xd9, 0xe9, 0x14, 0x22, 0x2e, 0x15, 0x74, 0x3c, 0xb2, 0x7c, 0x72, 0xe, 0x5b, 0x97, 0xdf, 0x66, 0xc, 0xa9, 0x70, 0x76, 0x5d, 0xfd, 0x53, 0xfc, 0x5f, 0x22, 0xad, 0xb8, 0xb5, 0xb5, 0xae, 0xd2, 0xde, 0xfa, 0x73, 0xff, 0x6d, 0xab, 0xcf, 0x49, 0x35, 0x6d, 0xf, 0xe5, 0x33, 0xd4, 0x5e, 0x66, 0xcd, 0xfa, 0x6f, 0x69, 0x33, 0x6f, 0xb4, 0xfc, 0x11, 0xce, 0xac, 0xfd, 0x5b, 0x69, 0x60, 0x98, 0x7c, 0xaf, 0x52, 0xe2, 0xe, 0x81, 0x2c, 0xbb, 0x59, 0x71, 0xe1, 0xf, 0x45, 0x65, 0x7b, 0x35, 0x8b, 0x75, 0xbe, 0xbe, 0xdf, 0xf7, 0x72, 0xea, 0x9f, 0xd6, 0x74, 0x7e, 0x5, 0x2b, 0x45, 0x17, 0x73, 0x92, 0x7a, 0x71, 0x85, 0xd4, 0xef, 0xd7, 0x76, 0xb3, 0x84, 0x76, 0x6d, 0x8d, 0x81, 0xda, 0xd5, 0x48, 0xac, 0x2, 0xbf, 0x3d, 0x9c, 0x13, 0x89, 0x1b, 0x5a, 0x38, 0xa5, 0xfa, 0xce, 0xa7, 0x20, 0x68, 0x85, 0xcb, 0x4d, 0x50, 0x26, 0x9d, 0x1a, 0xe6, 0x45, 0x21, 0x98, 0xc0, 0xaf, 0x25, 0x5d, 0xac, 0x32, 0x6c, 0x5c, 0xf3, 0xc2, 0xb3, 0x27, 0x4e, 0x67, 0xa2, 0x3b, 0xaa, 0xc5, 0x7a, 0x6c, 0x9f, 0xa0, 0xa3, 0x69, 0x2e, 0xcf, 0x86, 0xb, 0xf3, 0x1d, 0x5c, 0x6a, 0x90, 0x87, 0xef, 0x7, 0x4d, 0xfc, 0x66, 0x6f, 0xb1, 0x61, 0x22, 0x1, 0xd4, 0xda, 0xc2, 0x75, 0xa9, 0x1e, 0x36, 0xbc, 0xf, 0xe6, 0x48, 0x97, 0xe6, 0xc7, 0x0, 0x99, 0x2d, 0x36, 0x35, 0xa0, 0xa2, 0xf, 0xaa, 0xf6, 0x7c, 0xe1, 0x3c, 0x2a, 0x1f, 0x87, 0x38, 0xe3, 0xa1, 0x3a, 0x44, 0xd5, 0x80, 0xdf, 0xb4, 0x47, 0x5b, 0x8b, 0x24, 0xda, 0x6a, 0x1a, 0x72, 0x3c, 0xdd, 0x8, 0xbb, 0x9f, 0x1f, 0x9c, 0x22, 0xb2, 0x46, 0x7e, 0xf9, 0xa1, 0x93, 0xfb, 0x7e, 0xba, 0x31, 0x46, 0xad, 0xe5, 0x4e, 0xa3, 0x10, 0xae, 0xf3, 0xa5, 0x5c, 0xaa, 0x6b, 0x4, 0x2, 0x6c, 0x74, 0x3e, 0xfc, 0x81, 0x7d, 0xb, 0x6, 0x9a, 0x2b, 0xf0, 0x90, 0xcc, 0x9e, 0xa7, 0x8c, 0x68, 0x7b, 0x2f, 0x16, 0x58, 0xdb, 0xdf, 0xc1, 0x54, 0xf5, 0x99, 0x2a, 0x77, 0xf4, 0xf4, 0x4b, 0xdc, 0x67, 0x7c, 0x4e, 0xb2, 0xed, 0x7b, 0x82, 0x4a, 0xaa, 0x43, 0xc7, 0xe4, 0xcb, 0x2b, 0xf8, 0xcf, 0xfa, 0xf5, 0x72, 0x94, 0x22, 0x9b, 0x4a, 0x2c, 0xcf, 0x82, 0xbb, 0xef, 0x2c, 0xf1, 0x7f, 0x36, 0x59, 0xb8, 0x6, 0x6e, 0x38, 0x75, 0xaf, 0xcd, 0xa3, 0x78, 0x59, 0x24, 0x32, 0x98, 0xb1, 0x7, 0x98, 0x6d, 0xd3, 0xbd, 0x2d, 0xe9, 0x11, 0x85, 0xb7, 0xe7, 0x95, 0x74, 0x43, 0x27, 0xa7, 0xdd, 0x77, 0x65, 0x6e, 0x16, 0x34, 0xcf, 0xaa, 0xaa, 0x3e, 0xc1, 0xa3, 0xa4, 0xb6, 0x40, 0x62, 0x2c, 0x9d, 0xc2, 0x49, 0xcd, 0x9c, 0x63, 0xa1, 0x2b, 0xa4, 0x3d, 0x7f, 0xe1, 0xc2, 0x33, 0x21, 0x6d, 0x7c, 0x5c, 0xeb, 0xf9, 0x91, 0x6, 0x76, 0xa9, 0xe6, 0x2a, 0xbd, 0xce, 0x85, 0xfb, 0xd, 0xb0, 0x65, 0xbd, 0x35, 0x6e, 0x80, 0x82, 0x2a, 0x39, 0xb9, 0x6, 0x79, 0x9f, 0x9e, 0x3b, 0x2b, 0xd, 0x4d, 0x8a, 0x29, 0x9f, 0x23, 0xf1, 0x7, 0xb2, 0xdb, 0xcf, 0x60, 0x97, 0x6c, 0xeb, 0x2e, 0xf9, 0xd4, 0x3f, 0x20, 0xbf, 0xc8, 0x9b, 0x4e, 0xa7, 0x7e, 0xe4, 0x2a, 0xb, 0x29, 0x3d, 0x7d, 0x3a, 0x16, 0x37, 0x93, 0xa6, 0x1f, 0x14, 0xa4, 0xef, 0x87, 0xe8, 0x5e, 0x29, 0xd0, 0x3f, 0x27, 0xf8, 0xf9, 0x37, 0x40, 0x84, 0x54, 0x58, 0xab, 0x41, 0xe3, 0x62, 0xa8, 0x46, 0x30, 0xb, 0xfc, 0xc6, 0x38, 0x53, 0xe9, 0x9f, 0xfb, 0xc8, 0x79, 0x95, 0xac, 0xe8, 0xe2, 0x94, 0xe4, 0x8b, 0xca, 0xd7, 0x69, 0x6f, 0xef, 0x24, 0xc4, 0xec, 0x57, 0xb8, 0x4f, 0x15, 0x52, 0xe, 0x63, 0x48, 0xdf, 0xe2, 0x42, 0x2b, 0x11, 0x13, 0xf0, 0xbf, 0x4, 0x52, 0x62, 0x8, 0xc9, 0xad, 0xef, 0xce, 0xb0, 0x63, 0x11, 0x6c, 0xb1, 0x8b, 0x7d, 0x89, 0x68, 0x14, 0xb7, 0xe3, 0x47, 0x51, 0xdf, 0xad, 0x75, 0xbf, 0xa2, 0x5, 0x8b, 0x37, 0x5b, 0x92, 0x1e, 0xda, 0x25, 0x66, 0x4b, 0x37, 0xfe, 0x12, 0x67, 0x76, 0xff, 0x0, 0x81, 0x4c, 0xfb, 0x60, 0x46, 0xc8, 0xcb, 0x80, 0x63, 0x60, 0xbc, 0xe4, 0xad, 0x10, 0x6c, 0xc9, 0x6e, 0x26, 0x27, 0xa7, 0xec, 0xb6, 0x7a, 0xb5, 0xc2, 0x6a, 0xb4, 0x0, 0xe8, 0x28, 0xbb, 0xd7, 0x73, 0xc6, 0xfd, 0xfe, 0xe3, 0xc0, 0x23, 0x20, 0x5f, 0x64, 0xb5, 0x28, 0x2b, 0x56, 0x30, 0x5f, 0xe, 0x43, 0x76, 0x6, 0xd8, 0xea, 0x36, 0x10, 0xca, 0x41, 0x67, 0x93, 0x12, 0x7f, 0x93, 0x31, 0x50, 0x6e, 0xbf, 0xf0, 0x9a, 0x29, 0x22, 0x6e, 0x9, 0xc3, 0x32, 0x22, 0xdd, 0x45, 0x21, 0x61, 0xb1, 0xa3, 0xd6, 0x33, 0x86, 0x5e, 0xd7, 0x57, 0x90, 0x49, 0x6c, 0xbd, 0xc2, 0xf1, 0x39, 0x51, 0x76, 0x99, 0xa5, 0xf5, 0xab, 0x1f, 0x6b, 0x6d, 0xc, 0x90, 0x3b, 0x63, 0x7c, 0x43, 0xe7, 0x16, 0x68, 0x29, 0xe8, 0x11, 0x4c, 0x16, 0x76, 0xd2, 0xc0, 0xa7, 0x38, 0xe, 0x84, 0x29, 0x9c, 0xf9, 0x95, 0x10, 0x1f, 0x3f, 0x9, 0xb9, 0x57, 0xb3, 0xb9, 0x12, 0x19, 0x17, 0xc8, 0x39, 0xf8, 0x4, 0xd5, 0x9, 0xfe, 0xdd, 0x4b, 0xdd, 0xbd, 0x3b, 0xfb, 0x64, 0x1f, 0x34, 0x45, 0x4, 0xdb, 0x5b, 0xed, 0x42, 0xef, 0xc8, 0x21, 0xe8, 0xb4, 0x95, 0xdd, 0x60, 0x15, 0x4e, 0x52, 0xb9, 0x70, 0x50, 0xaf, 0x39, 0xde, 0x68, 0xc8, 0xd1, 0xad, 0xe9, 0x95, 0x69, 0x79, 0xc9, 0x4c, 0x9a, 0x32, 0x28, 0xb8, 0x90, 0x97, 0x64, 0xae, 0x62, 0x5b, 0xb7, 0xa2, 0xeb, 0x1e, 0x2f, 0xc1, 0xe3, 0xd7, 0xf6, 0xd3, 0x7b, 0x61, 0x21, 0x64, 0x33, 0xdf, 0x1c, 0x71, 0x7e, 0xdb, 0xcf, 0x7, 0x89, 0xd7, 0x37, 0x9, 0xfc, 0x7d, 0xd5, 0x8b, 0x1a, 0x84, 0x99, 0x7a, 0x93, 0x88, 0xba, 0x41, 0xa, 0x5d, 0x4d, 0xc2, 0xa5, 0xb9, 0x1e, 0x86, 0x6c, 0xb6, 0x2, 0x84, 0x29, 0x58, 0xfc, 0xcd, 0x71, 0x4c, 0xf8, 0x6e, 0xdb, 0x99, 0xd9, 0x4c, 0x36, 0xe6, 0xaa, 0xaa, 0xe2, 0x69, 0xd9, 0xc7, 0x8b, 0x64, 0x18, 0x94, 0xf0, 0x4b, 0x6f, 0x3c, 0x71, 0xeb, 0xe9, 0xc2, 0xb3, 0x5a, 0xc2, 0x52, 0x6e, 0xc, 0x58, 0xd5, 0x75, 0x6a, 0x12, 0x0, 0x60, 0xe5, 0x24, 0x8a, 0x2b, 0x46, 0x8e, 0x85, 0x82, 0xfe, 0x8, 0x42, 0x54, 0xca, 0x90, 0x1a, 0xc2, 0x3e, 0x4a, 0xaf, 0xa3, 0x51, 0xd4, 0x14, 0x76, 0xc2, 0x63, 0x9e, 0xc1, 0x63, 0x39, 0xe7, 0x5, 0xe0, 0x95, 0x8c, 0x8, 0x32, 0x0, 0x8d, 0x4a, 0x94, 0xf9, 0x25, 0x50, 0x7c, 0x48, 0x2a, 0x94, 0x9a, 0x7d, 0xe3, 0x98, 0x8f, 0xe7, 0x45, 0x5c, 0x53, 0x51, 0x73, 0x35, 0x53, 0x80, 0x1f, 0x89, 0x44, 0x1c, 0xf1, 0x41, 0xfe, 0x90, 0xc3, 0xa2, 0x5d, 0x9c, 0xe1, 0xf9, 0x20, 0x8a, 0x6d, 0xbd, 0xda, 0x2f, 0xe6, 0x69, 0x1f, 0x65, 0xbb, 0xaa, 0x27, 0x2e, 0xb6, 0x9e, 0x1b, 0xb5, 0xbb, 0xbb, 0x3d, 0x37, 0x83, 0x9, 0xbb, 0xda, 0x32, 0x36, 0x82, 0xc9, 0x88, 0x3b, 0x7d, 0xde, 0xe7, 0x59, 0xa7, 0xf3, 0x74, 0x89, 0x6c, 0x6c, 0x87, 0x52, 0x3d, 0x8, 0x78, 0x65, 0x49, 0xd8, 0xcd, 0x45, 0xe0, 0xbc, 0x73, 0x64, 0xb5, 0x47, 0xe7, 0x53, 0x0, 0xe, 0x7e, 0xe5, 0x5d, 0x53, 0x8a, 0x1c, 0x56, 0x92, 0x65, 0xd3, 0x4, 0xad, 0x2e, 0x7f, 0xca, 0x78, 0xd3, 0x6, 0x6a, 0xdb, 0x59, 0xf8, 0x14, 0x20, 0x56, 0x61, 0xb3, 0xf8, 0xf8, 0x19, 0x14, 0x17, 0x91, 0xb1, 0x4e, 0x32, 0x99, 0x3b, 0x60, 0x25, 0x45, 0xbf, 0xd0, 0x98, 0x58, 0xa1, 0x9d, 0xcd, 0x45, 0x3e, 0xfc, 0x14, 0x8d, 0x32, 0x79, 0x71, 0x9f, 0xe8, 0x5e, 0xc, 0x86, 0x36, 0xee, 0xe8, 0x42, 0x6c, 0x89, 0x2d, 0xc2, 0x13, 0x41, 0xfd, 0x4d, 0xf0, 0xda, 0x13, 0x42, 0x10, 0x44, 0xb7, 0xb7, 0xdb, 0x1a, 0xea, 0x94, 0xd3, 0x1f, 0xa1, 0x5f, 0xfd, 0xe5, 0x51, 0x5, 0x4e, 0x1a, 0x94, 0x5d, 0x23, 0x68, 0x51, 0x1, 0xd1, 0x18, 0xbe, 0xcf, 0x72, 0x67, 0x23, 0x45, 0x98, 0x9, 0xe3, 0x71, 0x60, 0x27, 0x98, 0xba, 0x56, 0x5a, 0xde, 0x79, 0xe8, 0xe4, 0x91, 0x94, 0x5b, 0x28, 0xb0, 0xaf, 0xaf, 0xaa, 0x5e, 0x70, 0x4c, 0x1e, 0x88, 0xbe, 0xa0, 0x1, 0xab, 0xca, 0xd9, 0x2a, 0x5d, 0x4f, 0x1d, 0xff, 0x3f, 0x23, 0x7a, 0xc3, 0x4a, 0x9a, 0x34, 0x6e, 0x16, 0x6a, 0x1c, 0x4a, 0x46, 0x12, 0x1c, 0xcf, 0x60, 0x32, 0x38, 0x29, 0x66, 0x6b, 0x9e, 0xd9, 0x71, 0x54, 0x6d, 0x5f, 0x66, 0x43, 0x3d, 0xea, 0x9b, 0xc8, 0x8c, 0xff, 0x4, 0x4d, 0x97, 0x36, 0x57, 0x90, 0x92, 0x8f, 0x14, 0x9e, 0xf2, 0x27, 0xdf, 0x53, 0xc8, 0xc0, 0x6, 0xae, 0x64, 0x7a, 0xce, 0xc5, 0xe9, 0x58, 0x83, 0xd1, 0x6c, 0x25, 0xa5, 0x92, 0xd0, 0xde, 0x82, 0xce, 0x9c, 0x9d, 0xc7, 0xb7, 0x93, 0x6e, 0x79, 0x59, 0x6e, 0xcc, 0x27, 0x9e, 0xbb, 0x31, 0x92, 0x70, 0xe4, 0xe1, 0xa0, 0x29, 0x9e, 0xaa, 0x83, 0x30, 0xb, 0xb7, 0x44, 0xe6, 0x85, 0x37, 0x75, 0x1a, 0x18, 0xbf, 0x1e, 0x3f, 0xa, 0x5c, 0xc8, 0xe8, 0xd6, 0x8e, 0x7f, 0xc3, 0x87, 0x7c, 0x92, 0x24, 0xad, 0xbc, 0x8d, 0xb7, 0xe3, 0x9e, 0xbb, 0x62, 0xfb, 0xfd, 0x46, 0xba, 0xce, 0xcb, 0x77, 0xe4, 0xa8, 0xeb, 0x4b, 0xde, 0xae, 0xee, 0xb0, 0x8c, 0xd3, 0x37, 0xb6, 0xde, 0x76, 0x79, 0xe8, 0x98, 0xc4, 0xb, 0xfb, 0x47, 0x61, 0x6b, 0x4, 0x4c, 0x94, 0xb2, 0x9, 0x96, 0x1f, 0xf7, 0x35, 0x3f, 0x12, 0x8b, 0xd0, 0xb9, 0x2, 0x14, 0x3f, 0xa1, 0xb3, 0xd3, 0x63, 0xc8, 0x7b, 0x2c, 0xc3, 0x41, 0x34, 0x57, 0x6e, 0x3e, 0x8c, 0x57, 0xc4, 0x1e, 0x30, 0x4b, 0x7e, 0xf5, 0xda, 0xa, 0xc4, 0xc9, 0x6f, 0xc2, 0xa3, 0xce, 0x93, 0x74, 0xfd, 0x1b, 0xe7, 0x96, 0x56, 0x14, 0xf8, 0x1a, 0x3f, 0x4b, 0x5d, 0xd0, 0x8f, 0x60, 0x8c, 0x6a, 0x8a, 0x2a, 0xca, 0xda, 0x76, 0xb2, 0x25, 0x7, 0xf6, 0x7, 0xef, 0x53, 0x78, 0x59, 0x43, 0xc7, 0xf0, 0x23, 0xe0, 0xba, 0x19, 0xe, 0xe3, 0x20, 0x88, 0xc8, 0x52, 0xb1, 0xaf, 0x6f, 0xfa, 0xe3, 0x45, 0x16, 0x24, 0x9c, 0x60, 0x3e, 0x82, 0x84, 0xc1, 0x95, 0x5d, 0x73, 0x17, 0x53, 0x95, 0x3, 0x73, 0x75, 0x19, 0x3, 0x95, 0x49, 0x3b, 0xf0, 0xa9, 0x2, 0x4b, 0xb, 0x0, 0x46, 0x27, 0x70, 0x59, 0xf5, 0x6b, 0x7, 0x8, 0x75, 0xf5, 0xaa, 0x53, 0xcc, 0xc5, 0x32, 0xd2, 0xc5, 0xc7, 0xd5, 0xfd, 0xdb, 0x18, 0x3, 0x2d, 0x34, 0x2b, 0x7, 0xa7, 0x8d, 0x8f, 0xb3, 0x8a, 0xe3, 0x8d, 0x7b, 0xdc, 0xbd, 0x69, 0x35, 0x42, 0x48, 0xc9, 0xa1, 0x87, 0x58, 0x5b, 0xf2, 0x60, 0xad, 0x46, 0x29, 0x84, 0xb2, 0xd5, 0xb2, 0x7e, 0x70, 0xd1, 0xe9, 0xad, 0x29, 0x4f, 0x85, 0x9, 0x45, 0x6a, 0x2c, 0xdc, 0x59, 0x51, 0xaa, 0x37, 0x98, 0x18, 0x57, 0xc0, 0x94, 0x9f, 0x89, 0xe7, 0x89, 0xce, 0x49, 0xe0, 0x36, 0xf5, 0x27, 0xb5, 0xc, 0x89, 0xcc, 0x39, 0x85, 0x90, 0x18, 0xa1, 0x2a, 0x3c, 0xd8, 0xab, 0x9, 0x89, 0x30, 0xd3, 0x3b, 0xb7, 0x1a, 0x2b, 0x14, 0xd3, 0xec, 0x84, 0xab, 0xf5, 0xb3, 0x59, 0xbf, 0x85, 0x6a, 0xc6, 0xa4, 0xbe, 0xf2, 0x68, 0xa, 0x32, 0x3c, 0x1f, 0x54, 0xa4, 0x6d, 0x38, 0xc5, 0x8d, 0xad, 0x86, 0x11, 0xc4, 0xb7, 0xb0, 0x4e, 0xf3, 0xea, 0xd2, 0x49, 0xac, 0x46, 0xd6, 0xc9, 0xb5, 0xa6, 0xa9, 0x7a, 0x13, 0x83, 0xb, 0x7c, 0xc7, 0x42, 0x38, 0x5a, 0x22, 0x68, 0xfc, 0x0, 0xd0, 0x24, 0x7, 0xe9, 0xe1, 0x2f, 0xc8, 0xcf, 0x63, 0xf, 0x95, 0x1f, 0x44, 0xc6, 0x1b, 0xb0, 0xd1, 0x22, 0x8f, 0x44, 0x8e, 0xec, 0x19, 0xf7, 0x38, 0x7d, 0xba, 0xb1, 0x7f, 0x78, 0x5f, 0xfa, 0x33, 0x9b, 0xdf, 0x58, 0x1, 0x19, 0xa1, 0xfd, 0xdc, 0x94, 0xca, 0x1a, 0xa, 0x49, 0x26, 0x93, 0xc7, 0x63, 0x2, 0x6b, 0x52, 0x41, 0x9c, 0xdd, 0x64, 0xcb, 0x58, 0x92, 0x97, 0xa2, 0x91, 0x25, 0x77, 0xbb, 0x46, 0x78, 0xd9, 0x48, 0x70, 0x29, 0x58, 0x3f, 0xa7, 0x3b, 0x21, 0x7c, 0xd1, 0x70, 0x6b, 0xd6, 0xd4, 0xce, 0xa0, 0xe8, 0xb5, 0xeb, 0x8f, 0xc2, 0xc1, 0x38, 0x3, 0xc1, 0x31, 0x18, 0x91, 0x6b, 0xf3, 0x26, 0x1, 0xbf, 0x89, 0xe3, 0x54, 0xd, 0x9b, 0x68, 0x83, 0xb4, 0xfe, 0x2e, 0x24, 0x40, 0x62, 0xc2, 0x3a, 0x51, 0xf6, 0xd3, 0x75, 0x25, 0x72, 0xdb, 0xa6, 0xc, 0xc8, 0x37, 0x0, 0xf3, 0xe2, 0x4b, 0x86, 0x98, 0x82, 0xce, 0xfc, 0xc9, 0x2d, 0x36, 0x49, 0x1, 0xff, 0x12, 0xa1, 0x84, 0x71, 0xe9, 0x4a, 0x1c, 0x82, 0x75, 0xe5, 0x95, 0x6c, 0xf8, 0x5c, 0x94, 0xa8, 0xb1, 0xa4, 0x1f, 0x2f, 0x4a, 0x2, 0xb, 0x34, 0xa7, 0x25, 0x45, 0x5f, 0xd8, 0x5, 0xc9, 0xc2, 0xd1, 0xea, 0xca, 0x57, 0xae, 0x33, 0x7, 0x90, 0xf7, 0xd7, 0xe9, 0x94, 0xdd, 0x7c, 0xf0, 0x5c, 0xa6, 0xc9, 0x24, 0x31, 0x59, 0xb5, 0xa4, 0x9c, 0x35, 0x89, 0x73, 0xf7, 0x45, 0x7e, 0x36, 0xb7, 0x9, 0x87, 0xf5, 0xdc, 0x7a, 0x7e, 0xcb, 0x67, 0x30, 0x20, 0x1f, 0x18, 0x28, 0xb7, 0xc7, 0xff, 0x4b, 0x44, 0x82, 0x33, 0x80, 0xac, 0xba, 0x35, 0x3b, 0x30, 0x7, 0xfd, 0x9, 0x6f, 0x52, 0x45, 0xed, 0x7f, 0x5, 0xa, 0x24, 0x28, 0x81, 0xc, 0xf1, 0xa4, 0xe8, 0x8d, 0xfd, 0x2b, 0xff, 0xc4, 0xef, 0x32, 0x93, 0x31, 0xaa, 0x35, 0xbd, 0xa0, 0x77, 0x4e, 0x21, 0xe, 0xa4, 0xfa, 0x14, 0x73, 0x6d, 0x89, 0x32, 0x86, 0xf1, 0xe5, 0x1, 0xec, 0x67, 0x78, 0x76, 0x3e, 0x81, 0xa1, 0x17, 0xf1, 0xf8, 0xad, 0xc9, 0x95, 0x17, 0x74, 0x54, 0x78, 0xda, 0x6c, 0xcb, 0x85, 0xe1, 0xda, 0x1, 0x1, 0xd0, 0xb4, 0xb7, 0xbc, 0x94, 0x7a, 0x9b, 0xb, 0x4e, 0x43, 0x45, 0xb, 0xcb, 0xd8, 0xfb, 0xaf, 0x39, 0x43, 0xf5, 0x9e, 0xf4, 0x8e, 0xe9, 0x9e, 0x56, 0xc4, 0xdc, 0x99, 0x12, 0xa5, 0x9, 0x8a, 0x31, 0x89, 0x77, 0xd8, 0x25, 0xb0, 0xb2, 0x6, 0xd2, 0xb4, 0x81, 0x92, 0x57, 0xe8, 0xfa, 0x18, 0xa4, 0x4a, 0xf6, 0xf7, 0xba, 0xd7, 0xac, 0x8f, 0x25, 0x50, 0x3e, 0x68, 0xd8, 0x9f, 0xa1, 0xd3, 0xeb, 0x72, 0xc0, 0x3b, 0xdd, 0x8d, 0xdb, 0x1c, 0x48, 0x2e, 0x61, 0x52, 0xd8, 0x64, 0x1a, 0x54, 0xd7, 0xe1, 0xb4, 0xab, 0xc4, 0xc6, 0xc4, 0xac, 0x95, 0xef, 0x0, 0x46, 0x6c, 0xa, 0xaa, 0xed, 0xd2, 0x36, 0x15, 0x90, 0x47, 0x77, 0x43, 0x86, 0x40, 0x29, 0x61, 0x10, 0xda, 0x3f, 0x34, 0xe8, 0x25, 0xaf, 0x54, 0xf2, 0xd6, 0x25, 0xfd, 0x8d, 0xd9, 0xf9, 0x9f, 0xa4, 0xbe, 0x79, 0x55, 0xdf, 0x96, 0xd2, 0x4c, 0xf1, 0xda, 0xee, 0x5c, 0xc8, 0x5a, 0xe3, 0x10, 0xb1, 0xc5, 0xbc, 0xe3, 0xfd, 0xc5, 0xc4, 0x4, 0xf9, 0x2c, 0x41, 0x89, 0x8a, 0xee, 0xf9, 0x95, 0xf, 0xeb, 0xb6, 0x82, 0xee, 0x59, 0x94, 0x2c, 0xdd, 0xaa, 0xc2, 0x95, 0x65, 0x57, 0x84, 0x2e, 0xfe, 0xfc, 0x27, 0xd3, 0xae, 0x84, 0x4a, 0x77, 0x76, 0xd4, 0x68, 0x3, 0x22, 0x37, 0xc9, 0xd8, 0xef, 0x36, 0x6c, 0x29, 0x10, 0xde, 0x1c, 0x21, 0x77, 0xda, 0xc4, 0x82, 0x72, 0x96, 0xe8, 0x7e, 0xda, 0x36, 0x78, 0xa5, 0x70, 0xd2, 0x17, 0xb6, 0xb, 0x56, 0xb7, 0x9c, 0x31, 0x9c, 0xcd, 0xf0, 0x90, 0xfe, 0x55, 0xe4, 0xf7, 0xcb, 0xfd, 0x1, 0xf3, 0x34, 0x73, 0x7e, 0xbb, 0x3c, 0xb5, 0x3f, 0xec, 0xe4, 0x7d, 0x4e, 0xa4, 0x2e, 0x1e, 0x78, 0xd0, 0x4f, 0x38, 0xb, 0xad, 0xb3, 0xda, 0x8a, 0xb8, 0xb3, 0xba, 0xbb, 0xf2, 0x90, 0xe6, 0x60, 0x6b, 0x81, 0x4, 0x8b, 0xae, 0xf8, 0x51, 0x48, 0xd2, 0xe4, 0x92, 0x9c, 0xab, 0x46, 0x20, 0xc7, 0x6b, 0x13, 0xf3, 0x7c, 0xa1, 0x74, 0x8c, 0x51, 0x4c, 0x7d, 0x87, 0xf9, 0xa, 0xb5, 0x4e, 0xff, 0xbb, 0xca, 0x19, 0xa9, 0x90, 0x8d, 0x57, 0x14, 0xb6, 0xb2, 0x5e, 0xac, 0xc4, 0xf8, 0x18, 0x82, 0xe4, 0x16, 0x20, 0x54, 0x47, 0xc5, 0xcc, 0xa3, 0x85, 0x7b, 0xea, 0x1e, 0x6c, 0xa7, 0x3e, 0xe3, 0x5e, 0xf8, 0xd4, 0x92, 0x61, 0xb4, 0x52, 0x23, 0xbb, 0x15, 0xe1, 0xaf, 0x34, 0xd3, 0x1, 0xf1, 0xa3, 0x75, 0x91, 0x88, 0x94, 0x12, 0xbc, 0xfa, 0x25, 0xf9, 0x33, 0x52, 0xc0, 0xcd, 0x6b, 0x7f, 0x55, 0xec, 0x7f, 0xe7, 0xdb, 0x2, 0xa8, 0xe0, 0x59, 0xb6, 0x69, 0x80, 0x75, 0x7b, 0xb4, 0xbd, 0x74, 0xbd, 0x8f, 0xf9, 0xde, 0x12, 0x5e, 0x1c, 0xbb, 0xdd, 0xd8, 0x89, 0x58, 0x46, 0x6c, 0x65, 0xe8, 0x8e, 0xf3, 0x70, 0x6e, 0xb2, 0x30, 0x88, 0xb0, 0x12, 0x12, 0xde, 0x5c, 0xfd, 0x20, 0x43, 0xb2, 0xed, 0xa2, 0xe4, 0xcf, 0x30, 0x4f, 0xc3, 0xb8, 0x64, 0xab, 0x56, 0xa3, 0x31, 0xb1, 0xab, 0x26, 0x5d, 0x9c, 0xd9, 0xcc, 0xf0, 0x77, 0x7f, 0x94, 0x1d, 0x98, 0xbf, 0x37, 0x6a, 0x85, 0x66, 0x6e, 0xd7, 0x8b, 0x73, 0x9, 0x6d, 0xe7, 0x19, 0xc0, 0x18, 0xb6, 0x53, 0x7d, 0xd4, 0x6b, 0x1c, 0x23, 0x79, 0x22, 0x6a, 0x6c, 0xf4, 0x24, 0xc4, 0x64, 0xd9, 0x92, 0xdd, 0xde, 0xff, 0x3, 0x73, 0xf2, 0xab, 0xb5, 0x71, 0x78, 0x28, 0x71, 0xe9, 0x1d, 0x56, 0x15, 0xf8, 0x32, 0xa6, 0x48, 0x8f, 0xd1, 0x55, 0xc0, 0xd3, 0xf5, 0x8f, 0xf4, 0x85, 0x4f, 0x68, 0x25, 0x75, 0x27, 0x14, 0x2a, 0x22, 0xc3, 0xc, 0x36, 0x67, 0xa0, 0x41, 0xd8, 0xd0, 0x99, 0x4a, 0xc3, 0xf2, 0xb1, 0x44, 0xc, 0x86, 0xac, 0x55, 0x58, 0xbf, 0xa4, 0xac, 0x0, 0x3b, 0xbe, 0x37, 0xaf, 0xfa, 0xa0, 0xaa, 0xf6, 0xab, 0x8, 0xec, 0x53, 0x2a, 0x82, 0x36, 0xf4, 0x65, 0xe1, 0x12, 0x1b, 0xa1, 0x1, 0x58, 0x9a, 0x1d, 0x75, 0xd4, 0xe, 0xe2, 0x2c, 0xab, 0xa7, 0x78, 0xd5, 0xe0, 0x41, 0x9a, 0x7e, 0x6, 0xe1, 0xd, 0xea, 0x23, 0x50, 0x30, 0x5f, 0x3f, 0x47, 0x30, 0xc6, 0x68, 0x7f, 0xf9, 0x52, 0xb3, 0xb7, 0xdb, 0x58, 0xcf, 0x2, 0xb, 0x50, 0x3b, 0x77, 0xc, 0xd9, 0x96, 0x1f, 0x3c, 0x21, 0x48, 0x2e, 0xea, 0x15, 0x18, 0xe0, 0xee, 0xb0, 0x57, 0xb3, 0xff, 0x39, 0x80, 0xf2, 0xe0, 0xcd, 0x24, 0xc9, 0xb9, 0xe4, 0xfb, 0xa3, 0x46, 0x5a, 0xc9, 0x36, 0xb, 0x6c, 0xdb, 0x46, 0x5e, 0xa4, 0xae, 0xaa, 0x1f, 0xff, 0xaa, 0x28, 0x19, 0xc3, 0x75, 0xe5, 0xca, 0x6c, 0xb9, 0xcb, 0x70, 0x2a, 0x96, 0x3c, 0x26, 0xa9, 0x24, 0xd1, 0xbc, 0x2a, 0x36, 0x34, 0xe0, 0x8d, 0xe5, 0x2a, 0x3c, 0x28, 0xdb, 0x20, 0xf1, 0x7, 0xd5, 0xf6, 0xfe, 0x49, 0x8d, 0xa3, 0xb9, 0xfd, 0x40, 0xf1, 0x1f, 0x82, 0x2a, 0xfd, 0xb1, 0xe0, 0xe7, 0xae, 0x20, 0x30, 0x2f, 0x16, 0xbd, 0x49, 0x19, 0x25, 0xcb, 0xd4, 0xa5, 0x17, 0x4e, 0x3d, 0x1c, 0x7e, 0x4f, 0x83, 0xcb, 0xeb, 0x2a, 0xf9, 0xf0, 0x9f, 0x59, 0x2b, 0x8a, 0x77, 0x1, 0x6b, 0xfc, 0x4, 0x81, 0xd7, 0x23, 0xa9, 0x68, 0xf3, 0x4f, 0x69, 0xda, 0xdf, 0x44, 0xfa, 0x5b, 0x12, 0x7f, 0x66, 0xf7, 0xdb, 0x99, 0x71, 0x4f, 0x79, 0x2a, 0x6f, 0xe4, 0xf6, 0x8f, 0x6d, 0xc0, 0x1d, 0x13, 0xf8, 0xe9, 0xad, 0xde, 0xb5, 0x8, 0x7c, 0xce, 0xb4, 0xab, 0x59, 0x9a, 0x51, 0x2, 0x3e, 0xec, 0x2a, 0xb4, 0xbc, 0x10, 0xf7, 0xc4, 0x19, 0x27, 0xc2, 0xc0, 0xca, 0xd3, 0xbf, 0xd8, 0x1e, 0x15, 0xca, 0xc9, 0xe4, 0x9, 0x2, 0xc6, 0x9c, 0xa6, 0xa1, 0xd9, 0xb5, 0x4a, 0x74, 0x7a, 0x8f, 0x7f, 0x93, 0x14, 0x8b, 0x4, 0xe5, 0x6d, 0x4, 0xac, 0x15, 0xe1, 0xd8, 0x38, 0x19, 0x17, 0xd2, 0x16, 0x6b, 0x1c, 0x40, 0x9, 0xf7, 0x7d, 0xe7, 0x94, 0x8e, 0x7f, 0x63, 0xb6, 0xae, 0xa6, 0x94, 0xf0, 0x2c, 0x2a, 0x8e, 0x38, 0x30, 0xc1, 0x7c, 0x33, 0x6f, 0x78, 0x9d, 0x71, 0xb6, 0xcd, 0x7d, 0x39, 0x4, 0xe7, 0xd2, 0x1c, 0xc0, 0xd9, 0xef, 0x2f, 0x5c, 0x55, 0x20, 0x3f, 0x4a, 0xf, 0x23, 0xf2, 0xa, 0x7c, 0x9, 0x25, 0x45, 0x0, 0x76, 0x8e, 0xdb, 0x84, 0x47, 0x80, 0xa5, 0x54, 0x6, 0xaa, 0xc8, 0x93, 0xaa, 0xf1, 0xac, 0x3b, 0x22, 0x94, 0x91, 0xf7, 0x7c, 0x95, 0xca, 0x11, 0x40, 0xaa, 0xcd, 0x78, 0x53, 0x10, 0x64, 0x50, 0x75, 0xa7, 0x67, 0x6c, 0x31, 0xb7, 0x6e, 0x9f, 0xb1, 0xd0, 0xc5, 0xef, 0x1a, 0x47, 0x10, 0xcb, 0xb2, 0x6, 0xb8, 0xe1, 0xc, 0x75, 0x33, 0xb4, 0x7e, 0xae, 0xb1, 0x57, 0x4d, 0x71, 0xc5, 0x19, 0x3f, 0xfd, 0x3, 0xed, 0x7b, 0x8b, 0xdc, 0xc0, 0x4e, 0x19, 0xbc, 0x31, 0x4f, 0x34, 0x3, 0xdd, 0xb5, 0x20, 0x63, 0x8c, 0xa7, 0x52, 0x6c, 0xa6, 0x93, 0xfd, 0xb6, 0xd0, 0xe3, 0x2c, 0xc8, 0x8b, 0xd, 0x4, 0xb, 0xe, 0xf, 0xa9, 0x28, 0xb2, 0x7f, 0x89, 0xff, 0x45, 0x82, 0x2d, 0xf0, 0xba, 0x22, 0x61, 0xfa, 0x0, 0xe6, 0x79, 0xac, 0x2a, 0x57, 0xf5, 0x36, 0x8e, 0x17, 0x88, 0x82, 0x24, 0x56, 0xc3, 0x3e, 0x11, 0x31, 0x1d, 0x52, 0xb9, 0xf8, 0xf1, 0xef, 0x15, 0x1e, 0x86, 0x48, 0x9e, 0x15, 0x17, 0xd4, 0xe0, 0x12, 0xd4, 0xa1, 0x2a, 0xb8, 0x31, 0xf1, 0x53, 0x3, 0x62, 0xf8, 0x71, 0x1e, 0xc5, 0x73, 0x6f, 0x3d, 0x48, 0x2a, 0x6d, 0xdd, 0xc2, 0xd, 0xea, 0x12, 0x24, 0xcb, 0xa4, 0xff, 0x17, 0xb9, 0x1e, 0x41, 0x3c, 0x66, 0x50, 0x9e, 0x29, 0xde, 0xea, 0xcf, 0x74, 0x3a, 0x3d, 0x2, 0x92, 0x7a, 0x4a, 0xf, 0x99, 0xb3, 0x29, 0x3d, 0x5c, 0xb1, 0xa7, 0x59, 0xcf, 0xbc, 0xa9, 0x8, 0x92, 0xdf, 0xa5, 0xdc, 0xcc, 0xa3, 0x66, 0x29, 0xf9, 0xf2, 0x43, 0x14, 0x7c, 0x2, 0x48, 0xb4, 0xaf, 0x8c, 0x9, 0xbb, 0xa3, 0x44, 0xe0, 0xaf, 0x8c, 0xd4, 0x60, 0x10, 0x23, 0xed, 0x27, 0x4d, 0xb8, 0x31, 0x3a, 0x75, 0x56, 0x2b, 0x54, 0xd7, 0xbe, 0xdd, 0xfc, 0x50, 0xdd, 0xf3, 0xcb, 0x30, 0xd8, 0xb1, 0x41, 0x16, 0x1f, 0x3, 0x25, 0x27, 0x1e, 0xc, 0xcb, 0x1d, 0x85, 0xec, 0xa7, 0xdb, 0x75, 0xae, 0xb5, 0xe0, 0x8f, 0x1c, 0xac, 0x20, 0x21, 0xc5, 0x8, 0x57, 0x75, 0x4c, 0xb2, 0x9e, 0x3, 0x7, 0xd6, 0x71, 0xe, 0xbb, 0x1f, 0x46, 0x45, 0x3a, 0xcd, 0x15, 0xe2, 0x70, 0x2b, 0x91, 0x40, 0x32, 0x53, 0x1d, 0xf0, 0xd2, 0x32, 0x9b, 0xb1, 0xa, 0x18, 0x8, 0xff, 0x96, 0xb7, 0xaa, 0xc4, 0x57, 0x3c, 0x86, 0x7a, 0xd8, 0x32, 0x27, 0x9a, 0xc4, 0xb7, 0xaf, 0x9c, 0xed, 0x2a, 0x98, 0xd, 0x63, 0x31, 0xac, 0x5e, 0xb3, 0x9f, 0xa3, 0x20, 0x3e, 0x5c, 0xdf, 0x8c, 0x8e, 0x33, 0x40, 0x9, 0xd8, 0x4e, 0x8b, 0x36, 0x14, 0x30, 0xdd, 0xce, 0x6f, 0x7a, 0x56, 0xd0, 0xe6, 0x67, 0x9f, 0x57, 0x97, 0xca, 0x49, 0x8c, 0x20, 0x7c, 0xf6, 0x97, 0x35, 0xa2, 0x81, 0x7a, 0x3d, 0xfe, 0xe2, 0x6a, 0x9, 0x7e, 0x2, 0x32, 0x20, 0x5e, 0x66, 0x93, 0xb3, 0x24, 0xe7, 0xe1, 0xf3, 0xb1, 0xfc, 0xdf, 0xdc, 0x2f, 0xf3, 0x26, 0xda, 0x26, 0x83, 0xbe, 0x97, 0x60, 0x1d, 0x2f, 0x42, 0x79, 0x81, 0xb3, 0xb3, 0x9d, 0xfb, 0x2c, 0x3a, 0x26, 0x4b, 0xa, 0xdf, 0xd4, 0xee, 0x2d, 0x3a, 0x9c, 0x1f, 0xe6, 0x4, 0x7d, 0xe9, 0x6, 0x8d, 0x72, 0x25, 0x93, 0x44, 0x42, 0xbc, 0xdf, 0x1a, 0x8b, 0x1b, 0x3a, 0x5, 0x7e, 0x39, 0xd9, 0xc1, 0x6e, 0x7, 0xf7, 0xda, 0x66, 0xc7, 0xe5, 0x2b, 0xee, 0xab, 0xc7, 0xa, 0x81, 0x14, 0x1e, 0xba, 0x80, 0x74, 0xf1, 0x30, 0xf5, 0x78, 0xe7, 0x2a, 0xdd, 0x8b, 0x9d, 0x5b, 0x20, 0x7a, 0xd9, 0x35, 0x4, 0xd4, 0x56, 0x67, 0x5, 0x64, 0xf0, 0xb8, 0x6e, 0xe, 0x21, 0xf8, 0xb6, 0x8b, 0x8a, 0xe8, 0xd5, 0xea, 0xd9, 0x9f, 0xec, 0x2d, 0xf1, 0xe, 0x7, 0x6a, 0x87, 0xcc, 0x3b, 0x5, 0x95, 0x84, 0x4d, 0xe3, 0x4c, 0x40, 0xa7, 0x38, 0x53, 0xa7, 0x12, 0x5e, 0xdb, 0xa1, 0xb8, 0xe1, 0x49, 0x2b, 0xd2, 0xad, 0xa5, 0xbf, 0x14, 0x51, 0x20, 0x1f, 0xec, 0x36, 0x8f, 0x82, 0xb6, 0x79, 0xeb, 0xba, 0xad, 0x9e, 0x5b, 0xbd, 0x1, 0x58, 0x2, 0x7a, 0x9d, 0xc, 0x4b, 0x84, 0x1e, 0xd, 0x1e, 0xa0, 0xed, 0xc9, 0xdf, 0x7e, 0x88, 0x75, 0x51, 0x62, 0x4b, 0x21, 0xb6, 0x69, 0x96, 0xdd, 0x9f, 0x10, 0x14, 0x98, 0x7b, 0xf8, 0xf6, 0x56, 0xca, 0xa2, 0x88, 0xbc, 0xf6, 0xd, 0x17, 0x88, 0xb7, 0x2e, 0xfe, 0xf9, 0x73, 0xa4, 0xff, 0xf4, 0x6, 0xea, 0xc, 0x33, 0x3d, 0xe8, 0xc4, 0xb5, 0x81, 0xed, 0x43, 0x8b, 0x48, 0xfd, 0x5e, 0x79, 0x58, 0xf3, 0xd9, 0xf, 0x4d, 0xeb, 0x9d, 0xf, 0x62, 0x4a, 0x16, 0x94, 0x73, 0x6a, 0xac, 0xdb, 0x7b, 0x92, 0xc6, 0x3, 0xf, 0x9e, 0x9f, 0xf7, 0x8d, 0xc2, 0x45, 0xa9, 0xe1, 0xd7, 0xfc, 0x1e, 0x66, 0x68, 0x28, 0xf1, 0x48, 0xa3, 0xff, 0xd0, 0xe8, 0xf4, 0x7c, 0xe0, 0x38, 0x85, 0x39, 0x84, 0xc2, 0xd4, 0x6b, 0x19, 0x86, 0x9a, 0x28, 0x91, 0xa0, 0x18, 0x26, 0x73, 0xb1, 0x71, 0x66, 0x60, 0x6e, 0x79, 0xef, 0x32, 0xc6, 0x90, 0x90, 0xe5, 0x46, 0x4e, 0x66, 0xfb, 0xf8, 0x66, 0x1e, 0xd4, 0x62, 0x80, 0xa3, 0x4e, 0x27, 0x73, 0x5, 0x20, 0x4a, 0x74, 0x6c, 0x94, 0x13, 0x27, 0xa9, 0xe4, 0x67, 0x7b, 0xd0, 0x20, 0xe, 0xdc, 0x6b, 0xb2, 0x23, 0x12, 0x39, 0xa7, 0x5, 0xa, 0xeb, 0xf1, 0x93, 0x2d, 0xbe, 0x41, 0xd1, 0x36, 0x3f, 0x53, 0x2e, 0x3e, 0xf2, 0x42, 0xa4, 0xfc, 0x4d, 0xd4, 0xb3, 0x4b, 0xe8, 0x3a, 0x2, 0x7c, 0x6b, 0x8d, 0xa4, 0x4, 0xb8, 0x3b, 0x1c, 0x43, 0x76, 0xfa, 0xa8, 0x16, 0x1e, 0xe0, 0x72, 0xd4, 0xdd, 0xad, 0x52, 0x54, 0x1b, 0x27, 0xe1, 0x1e, 0xd, 0xe7, 0x5e, 0x40, 0x7d, 0x99, 0x75, 0xa2, 0xff, 0x1d, 0x6f, 0xfc, 0x50, 0x35, 0x1b, 0x39, 0xbf, 0x3c, 0xc5, 0x1a, 0x35, 0x6b, 0x89, 0x44, 0x44, 0xb8, 0x14, 0xfa, 0x7e, 0xfb, 0x27, 0x40, 0xf9, 0x2f, 0x4d, 0x97, 0x64, 0x7d, 0x48, 0x84, 0xde, 0xe8, 0xd0, 0xdc, 0xef, 0x9b, 0x98, 0x48, 0x2b, 0x60, 0xb2, 0x45, 0x8c, 0x87, 0x34, 0x46, 0xd8, 0xc2, 0xbb, 0xfc, 0xa8, 0x6c, 0x47, 0xbc, 0x3f, 0xf7, 0xb3, 0xb2, 0xd1, 0xc0, 0x43, 0xf4, 0xc8, 0xb7, 0x5, 0xd0, 0x21, 0x9c, 0x13, 0xc0, 0x40, 0x67, 0x2e, 0x8f, 0x51, 0xc1, 0x5f, 0xd7, 0x6, 0x8c, 0x6e, 0x3, 0x56, 0x9f, 0xa8, 0x49, 0x32, 0xb7, 0x7b, 0xcf, 0x2d, 0xdd, 0xe7, 0x45, 0xe2, 0x3d, 0x1d, 0xdd, 0x81, 0xa7, 0xe2, 0xd6, 0xeb, 0x4b, 0xdc, 0x78, 0xf5, 0xa0, 0xe7, 0x2c, 0xdf, 0x3, 0x89, 0x2, 0x4c, 0xac, 0xaf, 0x39, 0x9c, 0x88, 0x62, 0xe3, 0xae, 0xab, 0x4, 0x64, 0x14, 0x31, 0x7c, 0x84, 0xdc, 0x18, 0x78, 0xe9, 0xa4, 0xd8, 0xc0, 0x4, 0x63, 0x91, 0x67, 0x1f, 0xa9, 0xa2, 0xdc, 0x51, 0xae, 0xfc, 0x9e, 0xaa, 0x9b, 0x90, 0x41, 0xbe, 0x2a, 0xc1, 0x7a, 0x9c, 0x55, 0xf4, 0xe2, 0xd2, 0xd9, 0x3a, 0x77, 0x9f, 0xfc, 0x51, 0x4b, 0x2f, 0xe8, 0x1c, 0xe8, 0x73, 0x40, 0x27, 0x30, 0x71, 0xa7, 0xfc, 0x96, 0xb5, 0xfb, 0xac, 0x6f, 0x27, 0xc0, 0xc, 0xf7, 0x84, 0xa6, 0xc9, 0x9f, 0x81, 0x1d, 0xe0, 0xb1, 0xf7, 0xc9, 0xdd, 0x7f, 0xb4, 0x29, 0x40, 0x19, 0x9b, 0x45, 0x3, 0xe1, 0x8d, 0x35, 0x93, 0x3e, 0x1, 0x5b, 0x59, 0x1c, 0x88, 0xec, 0xd3, 0x2a, 0x53, 0x49, 0x93, 0x4c, 0x57, 0x51, 0xde, 0x46, 0x7b, 0xb3, 0x45, 0xd4, 0xb1, 0x2d, 0xd8, 0x9f, 0x23, 0xdf, 0x87, 0x5b, 0x44, 0xc6, 0xee, 0x24, 0x1d, 0x15, 0x75, 0xaf, 0x18, 0xc7, 0x59, 0x62, 0x3c, 0xf4, 0xa4, 0xc4, 0xa1, 0xae, 0xf7, 0x2, 0xbe, 0x70, 0xd7, 0xe5, 0xc0, 0x40, 0xf2, 0x33, 0x1b, 0x72, 0xf4, 0x90, 0x45, 0x6a, 0xea, 0x4, 0xdf, 0xfe, 0xfb, 0xf1, 0x24, 0x21, 0xe7, 0xef, 0x45, 0x97, 0xde, 0x3c, 0xe5, 0xf8, 0xd9, 0x46, 0xf0, 0x65, 0x32, 0x4, 0xe1, 0xe7, 0xe6, 0xc7, 0xd0, 0xe4, 0x8e, 0xa2, 0xfc, 0xc3, 0x1b, 0x3b, 0x25, 0x87, 0x9a, 0x33, 0x7e, 0x84, 0x43, 0xe6, 0x43, 0x37, 0x48, 0x53, 0x59, 0x9b, 0xc5, 0x2f, 0xd1, 0x4f, 0xb, 0xa, 0x6a, 0xcb, 0xcc, 0x2d, 0xd0, 0x27, 0xc3, 0x36, 0x68, 0xfb, 0xc2, 0xbc, 0x68, 0x7a, 0x82, 0x9, 0xd0, 0x5a, 0x2d, 0x91, 0x5e, 0x0, 0x4c, 0xb4, 0x24, 0x1b, 0xfe, 0xdc, 0x1f, 0x81, 0xf, 0xd2, 0x83, 0xcc, 0xc, 0xba, 0x6f, 0x66, 0xc1, 0x7e, 0x52, 0x36, 0x35, 0x46, 0x75, 0x14, 0x97, 0x81, 0x94, 0x69, 0xc2, 0xa9, 0x6d, 0x55, 0xa8, 0xb1, 0xdc, 0xfc, 0xb2, 0x32, 0xa7, 0x81, 0x67, 0x42, 0x93, 0xa5, 0x1d, 0x18, 0x14, 0xa7, 0xed, 0x14, 0x12, 0xec, 0x41, 0xb3, 0x67, 0x60, 0x3b, 0xc1, 0x9a, 0x60, 0x1f, 0xdf, 0x45, 0xa5, 0x97, 0x4c, 0x4b, 0xff, 0x6b, 0x7, 0xd2, 0x34, 0x1, 0x5, 0x24, 0xa1, 0x97, 0xca, 0x9, 0x14, 0x23, 0xc, 0xfa, 0x6e, 0x43, 0x8c, 0x63, 0x20, 0xa8, 0xc1, 0x4c, 0x25, 0xcd, 0x46, 0xfb, 0xdc, 0xaf, 0x63, 0xe3, 0xd4, 0x27, 0x2a, 0x94, 0x3, 0xc3, 0xad, 0xc2, 0x62, 0x83, 0x64, 0xe4, 0x56, 0xf0, 0x9d, 0x7b, 0xc6, 0x56, 0x63, 0x73, 0x63, 0x20, 0xbb, 0x5a, 0xa5, 0x52, 0xbc, 0x51, 0xc5, 0x98, 0xc0, 0x93, 0xab, 0x4b, 0xe6, 0x5f, 0xb1, 0xf9, 0x49, 0x2b, 0x38, 0x47, 0x8d, 0xff, 0x4d, 0xad, 0x21, 0xc2, 0x9e, 0xd6, 0xf4, 0x7d, 0x43, 0x15, 0xf6, 0xca, 0x79, 0x9, 0x65, 0x45, 0xbb, 0x64, 0xdc, 0x13, 0x5f, 0x14, 0x7, 0x1f, 0x19, 0xd9, 0x89, 0xc5, 0xe4, 0x9, 0xe, 0xd4, 0x3f, 0xab, 0xa8, 0xb6, 0x27, 0xa9, 0x3e, 0x31, 0x77, 0x2e, 0x84, 0x55, 0xe4, 0x8b, 0x98, 0x55, 0x1f, 0xe2, 0xd1, 0x51, 0x8b, 0xfc, 0xbb, 0x2b, 0x6, 0x73, 0xdd, 0x16, 0x57, 0xde, 0xf3, 0x8b, 0x4e, 0xe5, 0x11, 0x3c, 0x63, 0x3b, 0xbe, 0x85, 0x1b, 0xb6, 0x77, 0xe, 0x9a, 0xa6, 0xcc, 0x11, 0x9, 0x29, 0x7, 0x51, 0x56, 0xf, 0x59, 0xa6, 0xef, 0x95, 0x64, 0xe7, 0x27, 0xab, 0x3a, 0xd, 0x7, 0x33, 0x8b, 0xac, 0xe4, 0xe5, 0xd5, 0x2c, 0x9a, 0x2b, 0x67, 0x43, 0x26, 0x73, 0x91, 0xfc, 0x1c, 0x9b, 0xf7, 0xef, 0x52, 0x3f, 0xc1, 0xa7, 0x90, 0x9b, 0xa4, 0x5c, 0x66, 0x98, 0xb9, 0xef, 0xb3, 0x59, 0xda, 0x8d, 0x5a, 0x41, 0x13, 0x2f, 0x5, 0x2d, 0x92, 0x5b, 0x8a, 0x30, 0xa5, 0xf9, 0x3c, 0xab, 0xbb, 0x9e, 0xae, 0xd7, 0xa4, 0x6d, 0xf5, 0x7b, 0x6e, 0x98, 0x35, 0xcc, 0x13, 0x35, 0xff, 0x5c, 0x6b, 0x63, 0x3a, 0xdd, 0xf7, 0x98, 0x31, 0xba, 0xf8, 0xc, 0xbb, 0x86, 0x6f, 0xf1, 0x41, 0x22, 0x5, 0xd4, 0xb8, 0xbf, 0xa7, 0x13, 0xde, 0xd8, 0x75, 0x5, 0x76, 0x81, 0xa1, 0x7a, 0x9f, 0x16, 0x4e, 0xf7, 0x36, 0x1c, 0xed, 0x9, 0xf5, 0xcf, 0x3e, 0x3a, 0x16, 0x91, 0xa4, 0x40, 0x3c, 0x1f, 0xd6, 0xea, 0x6a, 0xaa, 0xfc, 0xe8, 0xdf, 0xfc, 0x95, 0x8c, 0x15, 0x6f, 0xa4, 0xcd, 0x13, 0x6e, 0x1b, 0x99, 0xa3, 0xd0, 0xae, 0x2f, 0x34, 0x15, 0x24, 0x48, 0x79, 0x70, 0x59, 0x6b, 0x66, 0xde, 0x5b, 0xba, 0xf3, 0xdd, 0xb6, 0x6a, 0xb2, 0xbc, 0xe6, 0x52, 0x1d, 0x3d, 0xdd, 0x8, 0x86, 0xe7, 0xa1, 0x8b, 0x76, 0x86, 0x65, 0x7, 0xea, 0x2a, 0xdb, 0x30, 0x49, 0xfa, 0x1a, 0xdc, 0xe7, 0x14, 0x57, 0x57, 0xd9, 0x17, 0x88, 0xc5, 0xf7, 0x7d, 0xbf, 0xc7, 0x1f, 0x6c, 0xe9, 0xee, 0xd9, 0xcd, 0xac, 0x47, 0x6b, 0x37, 0xec, 0x8c, 0xe5, 0xfb, 0x77, 0xa2, 0xc, 0x2a, 0xc4, 0x2, 0xe7, 0x13, 0xe4, 0x3f, 0x11, 0x51, 0xbe, 0x7c, 0xc4, 0xee, 0x64, 0x17, 0xdd, 0x39, 0xd7, 0x3e, 0x7b, 0xde, 0x7c, 0x1e, 0x4, 0xc0, 0xe1, 0xe9, 0x5c, 0x59, 0x74, 0xcb, 0x50, 0x12, 0xb2, 0x25, 0x29, 0x13, 0x85, 0x56, 0x35, 0x1c, 0x8, 0x1b, 0x0, 0xc4, 0x95, 0xff, 0x7c, 0x54, 0xb4, 0x88, 0x80, 0xbd, 0x4c, 0xee, 0x63, 0x8a, 0xc, 0x9e, 0x9a, 0xf7, 0x32, 0x7f, 0xdb, 0xcb, 0x47, 0x24, 0x6b, 0x18, 0xd4, 0x77, 0xb3, 0x9b, 0x21, 0x70, 0xd3, 0xaa, 0x82, 0xe9, 0xe3, 0x93, 0xa5, 0xa2, 0xc2, 0xe4, 0xc1, 0xcc, 0x6, 0x4f, 0xf2, 0x73, 0x7, 0x65, 0x68, 0xc3, 0x72, 0x23, 0x94, 0x85, 0x95, 0xa7, 0x4d, 0x3b, 0xa1, 0x8f, 0xc, 0x4, 0x75, 0x33, 0x1d, 0xbf, 0x8b, 0x91, 0xc9, 0x50, 0xda, 0x73, 0x9, 0x6f, 0x72, 0xe2, 0x6e, 0x2d, 0x82, 0x5b, 0xcd, 0xaf, 0x48, 0x71, 0x77, 0xfd, 0x20, 0x8b, 0x71, 0xfc, 0xe5, 0xa1, 0x7, 0x8, 0xfd, 0x7d, 0xe7, 0xe8, 0xb9, 0x3d, 0x70, 0xa7, 0x99, 0x44, 0xf, 0x5e, 0x7f, 0xf3, 0x36, 0x8e, 0x61, 0xe, 0x93, 0x72, 0x69, 0xbe, 0x7b, 0x80, 0x23, 0xb8, 0x77, 0x7c, 0x2b, 0x50, 0xff, 0x27, 0xcb, 0x5, 0x24, 0xb8, 0xe5, 0x62, 0x90, 0x37, 0xbd, 0xe3, 0x8b, 0x8b, 0xba, 0x92, 0x4a, 0xce, 0x2d, 0x1d, 0x7a, 0x4b, 0xd6, 0x37, 0x2e, 0x95, 0xb2, 0xc5, 0x73, 0xa, 0x4, 0xca, 0xae, 0x38, 0xd4, 0x2e, 0x25, 0x9e, 0xa, 0xcb, 0x3b, 0x9d, 0xc3, 0x6b, 0x95, 0x43, 0xdd, 0x63, 0x2d, 0x2b, 0xb3, 0x0, 0xca, 0x31, 0x1a, 0x18, 0x7a, 0x41, 0x5c, 0xb8, 0x33, 0x71, 0xd6, 0xc8, 0x42, 0xf4, 0x2e, 0x90, 0x47, 0x8e, 0xd0, 0x80, 0x9, 0x5c, 0x25, 0xe9, 0x1a, 0xcb, 0x98, 0x9f, 0x73, 0x4a, 0x2b, 0x81, 0x63, 0xd8, 0x4b, 0xa1, 0x45, 0x4a, 0x1e, 0xe1, 0x31, 0x5c, 0x5a, 0x2f, 0xdb, 0xb0, 0x9c, 0xfe, 0x55, 0x5d, 0x1e, 0x29, 0xcc, 0xf5, 0x8f, 0x6, 0x1b, 0x66, 0x74, 0xf4, 0xa4, 0xb8, 0xe, 0x9f, 0x38, 0x6b, 0x2, 0x24, 0x8c, 0x84, 0x58, 0xa4, 0x21, 0x6b, 0x53, 0xb0, 0x72, 0xdc, 0x81, 0xec, 0xf8, 0x5b, 0x2e, 0xac, 0x6a, 0x88, 0xad, 0xd0, 0x87, 0xc1, 0x3, 0x45, 0xb6, 0x71, 0xb7, 0x8a, 0x87, 0x16, 0x5c, 0xab, 0x45, 0x40, 0xc7, 0x6f, 0xfc, 0x7d, 0xb0, 0xed, 0xca, 0x0, 0x78, 0xbf, 0x60, 0x63, 0x2c, 0xa3, 0x72, 0xc9, 0xb9, 0xb5, 0x5b, 0x29, 0x24, 0xba, 0x6d, 0x9a, 0x7c, 0x8e, 0xf8, 0xe6, 0xc9, 0xa6, 0x9a, 0xa7, 0x92, 0x24, 0xbf, 0xff, 0x90, 0xc2, 0x6a, 0xc2, 0x41, 0xa, 0xd5, 0x29, 0xde, 0xe6, 0xcb, 0x9, 0xd3, 0x83, 0xf4, 0xa, 0x9f, 0x4f, 0xed, 0xbc, 0xe0, 0x8a, 0xd, 0x2, 0x5b, 0xe3, 0x23, 0x80, 0xb3, 0x6d, 0x98, 0x6e, 0x60, 0x33, 0x69, 0xbc, 0x1a, 0x9d, 0x2c, 0x8f, 0xad, 0x93, 0xe, 0x40, 0xe7, 0x1d, 0x2e, 0x29, 0x19, 0x4d, 0x5e, 0xbe, 0x52, 0xa9, 0x18, 0x3e, 0xfe, 0xbf, 0x80, 0x6, 0x2e, 0x1d, 0x77, 0xe9, 0xe8, 0x63, 0xb0, 0x4d, 0xc5, 0x98, 0xec, 0x5b, 0x8c, 0x1f, 0x5d, 0xa5, 0x74, 0x2a, 0x66, 0xf9, 0x2a, 0xd8, 0x66, 0x6f, 0x4, 0x8f, 0xf2, 0xfb, 0xe3, 0x94, 0x47, 0xdc, 0xd4, 0xb4, 0x2a, 0xa7, 0xa3, 0xd8, 0x2d, 0x7c, 0x5c, 0x45, 0x9f, 0x77, 0x9, 0x8d, 0x9d, 0xd1, 0xc3, 0xaf, 0xbd, 0x93, 0xd8, 0xdf, 0xa6, 0xd6, 0x57, 0x94, 0x50, 0xa7, 0xd5, 0x55, 0x62, 0x2e, 0x95, 0xf9, 0xfe, 0xf8, 0x8c, 0xff, 0x8a, 0x9a, 0xda, 0xfb, 0x7c, 0xa6, 0x3d, 0xcd, 0xd, 0x16, 0x2c, 0x2a, 0xf6, 0x23, 0x4c, 0xef, 0xea, 0x90, 0x8f, 0xe3, 0xc5, 0xe6, 0x34, 0x5a, 0x5d, 0xa6, 0xa9, 0x19, 0x55, 0x86, 0x35, 0x3d, 0x8a, 0xd3, 0x8f, 0xae, 0x8a, 0xc4, 0x7, 0x27, 0x85, 0x6, 0x50, 0xda, 0xae, 0xe7, 0xb7, 0x6a, 0x93, 0x90, 0x1c, 0x23, 0xef, 0x9, 0x2c, 0x4c, 0x32, 0x79, 0xe8, 0xb6, 0xfe, 0xec, 0x31, 0x38, 0xc9, 0xe, 0xfb, 0x6b, 0x1f, 0x87, 0xa0, 0x5d, 0x83, 0x4d, 0xd8, 0x68, 0xfb, 0xf0, 0xb1, 0xe6, 0xc1, 0x1d, 0x86, 0x39, 0xaf, 0xc, 0xc9, 0xd7, 0xf8, 0x94, 0x75, 0x46, 0xb0, 0xe5, 0x12, 0x92, 0x2b, 0x1, 0x65, 0xe2, 0x7a, 0x89, 0x26, 0x5d, 0x75, 0xd6, 0xa4, 0x8, 0x8a, 0xf6, 0xbc, 0xda, 0xfb, 0x91, 0x9, 0x1c, 0xe4, 0x3e, 0x40, 0xe8, 0x17, 0xbf, 0x3b, 0x3e, 0x34, 0x3e, 0x73, 0x65, 0x3d, 0x9b, 0x67, 0xd, 0x98, 0xc7, 0xd2, 0x5, 0x13, 0xe1, 0xd2, 0x32, 0x62, 0x5, 0x33, 0x6f, 0x7a, 0xc0, 0xf3, 0x92, 0xe4, 0x6b, 0x96, 0x9d, 0x50, 0x15, 0xbb, 0xff, 0x78, 0x88, 0x6a, 0xa4, 0x59, 0x9b, 0xa, 0x1, 0x11, 0x22, 0xff, 0x29, 0x1, 0xe3, 0xab, 0x4a, 0x56, 0x9f, 0x6c, 0xcf, 0x64, 0x6e, 0x33, 0x40, 0xc9, 0xf2, 0xc6, 0x22, 0x80, 0xc, 0x8b, 0x62, 0x52, 0xe7, 0xf, 0x87, 0xdb, 0xe8, 0x6a, 0xe9, 0x67, 0x2, 0xbe, 0x2b, 0x4, 0xbc, 0x93, 0xf1, 0x92, 0xe1, 0x22, 0x58, 0xc4, 0x37, 0xb2, 0x34, 0xb5, 0x85, 0xf0, 0x68, 0x41, 0x2c, 0x83, 0xbd, 0x92, 0xd1, 0xa0, 0x1d, 0x27, 0xf6, 0xbd, 0xe3, 0xe9, 0x76, 0x7a, 0xb5, 0x11, 0x89, 0xb8, 0xfa, 0x82, 0xa8, 0x52, 0xb5, 0xe, 0xdb, 0xb4, 0xe4, 0x45, 0x53, 0xc8, 0xff, 0xc3, 0xa7, 0x81, 0xa6, 0x2, 0xbe, 0xa3, 0x69, 0x4, 0xec, 0xf0, 0x8c, 0x9c, 0x88, 0x51, 0xe5, 0x29, 0xe8, 0xa5, 0x69, 0x13, 0x3, 0x9d, 0x41, 0xaa, 0x7, 0x16, 0xfc, 0xc6, 0xb4, 0xcb, 0xc1, 0x84, 0x1d, 0x24, 0xa6, 0x59, 0xac, 0x75, 0xee, 0xe0, 0x29, 0x88, 0xbf, 0xf2, 0x43, 0xc0, 0x85, 0xe1, 0xa5, 0x8e, 0x75, 0x8f, 0xa3, 0x82, 0x9f, 0xbd, 0x7c, 0xd8, 0xb9, 0x40, 0xda, 0x8b, 0x1, 0xc6, 0x8f, 0x2d, 0x5e, 0xe7, 0x65, 0x9e, 0xb3, 0x90, 0x56, 0xa3, 0x74, 0x5f, 0x51, 0x3d, 0xac, 0xe5, 0x79, 0xda, 0x4f, 0xcf, 0x4a, 0x53, 0x5f, 0x21, 0x30, 0x86, 0x3a, 0x3b, 0xb8, 0x68, 0x6e, 0x75, 0x85, 0xd0, 0x2e, 0x8b, 0x74, 0x5c, 0xb2, 0x7c, 0xd3, 0xe5, 0x58, 0x72, 0x31, 0xb0, 0xc4, 0xc2, 0xcc, 0xc5, 0x1a, 0x84, 0x35, 0x67, 0x69, 0x50, 0x9d, 0x3d, 0x6b, 0xc9, 0x7d, 0x7d, 0xbd, 0x54, 0x17, 0xfd, 0x10, 0xe4, 0x47, 0xa1, 0xd5, 0xdd, 0x99, 0xd3, 0x94, 0x6e, 0x29, 0x65, 0x3a, 0xfb, 0xc, 0xb3, 0xcd, 0xc4, 0xe0, 0xd7, 0xc8, 0xb4, 0x9d, 0x6c, 0xc1, 0xb8, 0x9, 0x6d, 0xdf, 0xd9, 0xc8, 0x7, 0x42, 0x1a, 0xba, 0x40, 0x6d, 0xc6, 0x52, 0x1c, 0xf7, 0x95, 0xd4, 0x6f, 0xda, 0x64, 0x52, 0x27, 0x9f, 0x16, 0xe, 0xfb, 0x62, 0x83, 0x7d, 0xe5, 0x46, 0xb7, 0xc2, 0x80, 0x22, 0x72, 0xad, 0x49, 0xf7, 0x87, 0xd9, 0xed, 0x7b, 0xec, 0x98, 0x43, 0xaf, 0x29, 0xc2, 0xfd, 0x58, 0x6a, 0x66, 0x52, 0x84, 0xed, 0xd1, 0xb0, 0xc2, 0xc3, 0xa9, 0xe6, 0x0, 0x6e, 0xcb, 0x4b, 0x8, 0x64, 0x90, 0x26, 0x1c, 0x41, 0x57, 0x3c, 0x0, 0x64, 0x55, 0x13, 0x55, 0x7, 0xc2, 0xcf, 0xa3, 0xdb, 0x94, 0x52, 0x50, 0x1c, 0x8b, 0xa0, 0x1e, 0xd3, 0x7d, 0x8b, 0x86, 0xa2, 0xb, 0xa3, 0x74, 0xca, 0x1e, 0x99, 0xe, 0xa9, 0xb, 0xd7, 0xb9, 0xc2, 0x62, 0xe7, 0x2c, 0x14, 0x4e, 0x9, 0xef, 0x13, 0x7f, 0xac, 0x9b, 0x43, 0xea, 0x88, 0x14, 0x7d, 0x9a, 0x8d, 0x3f, 0x14, 0xaa, 0x65, 0x1a, 0x2f, 0xcb, 0x20, 0x2d, 0xcf, 0xe0, 0xff, 0xd1, 0x6a, 0x1c, 0x38, 0xf1, 0x7b, 0x7b, 0x84, 0x4d, 0xb, 0xc8, 0x8a, 0x14, 0xb8, 0xf5, 0x56, 0xf2, 0xaf, 0xce, 0x35, 0x18, 0x44, 0x1b, 0x4, 0xef, 0xfc, 0xa5, 0xcd, 0xc0, 0x88, 0x90, 0xde, 0xce, 0xb8, 0x83, 0xe0, 0x9b, 0x51, 0x68, 0xe6, 0x25, 0x39, 0x9f, 0x97, 0x3e, 0x78, 0x1d, 0xb8, 0xa7, 0x89, 0x4c, 0xaf, 0xa, 0x13, 0xfd, 0x1e, 0xfa, 0xf7, 0x1b, 0xfd, 0x44, 0x21, 0x5c, 0x52, 0x9e, 0x5a, 0x26, 0x1b, 0x4, 0x69, 0x29, 0x4b, 0xb6, 0x65, 0xdb, 0xb9, 0x34, 0x96, 0x8e, 0xed, 0x8a, 0x9d, 0x59, 0x3, 0x32, 0x2e, 0xc8, 0x35, 0xf3, 0x63, 0x35, 0x40, 0x4f, 0xa5, 0xa7, 0xda, 0xab, 0x38, 0x2c, 0x2, 0xad, 0x88, 0xf0, 0x9d, 0xee, 0x60, 0x62, 0x45, 0xc1, 0x5a, 0x69, 0x1c, 0x93, 0x36, 0x78, 0x4d, 0xdf, 0xce, 0x3a, 0x4e, 0x8f, 0x4a, 0x67, 0x11, 0x59, 0x52, 0xfd, 0xda, 0xf9, 0x22, 0x7b, 0x6c, 0x40, 0x6d, 0x84, 0x21, 0x55, 0x1f, 0x89, 0x17, 0xfc, 0x1c, 0x3d, 0x78, 0x75, 0x4, 0x4d, 0xd7, 0x34, 0x3c, 0x17, 0x2a, 0x20, 0xfa, 0x99, 0xb6, 0x7f, 0xbd, 0xfd, 0x3a, 0x62, 0x9f, 0x82, 0xac, 0xb6, 0x8f, 0x24, 0x79, 0xa, 0xd3, 0x3f, 0xbb, 0x66, 0xb0, 0xcf, 0xe5, 0x4e, 0x35, 0xf0, 0xef, 0xda, 0x69, 0x91, 0x42, 0x6c, 0xe3, 0x24, 0x35, 0x52, 0xf8, 0x9c, 0x80, 0x1d, 0xbe, 0x55, 0x1, 0xb3, 0x4f, 0x6f, 0x13, 0x12, 0xa7, 0xbb, 0x1f, 0x1, 0xaf, 0x26, 0x48, 0xa1, 0xa1, 0x6b, 0x50, 0xb4, 0xf0, 0xf0, 0x6e, 0x3e, 0xa7, 0xae, 0x77, 0x31, 0x8b, 0x92, 0xd9, 0x4e, 0x24, 0xaa, 0x5e, 0xf2, 0x6a, 0xbf, 0xe2, 0xb2, 0x1d, 0xc8, 0x1a, 0x3a, 0x36, 0x28, 0x18, 0x66, 0x6, 0x82, 0x48, 0xb3, 0x22, 0x2a, 0x75, 0x6a, 0xab, 0x32, 0x3d, 0x3, 0x0, 0xc0, 0xcf, 0xb1, 0x3c, 0x6a, 0xd9, 0xe1, 0x77, 0xd6, 0x2a, 0x11, 0x30, 0x23, 0xc8, 0x72, 0xe6, 0xe3, 0xa7, 0xb7, 0x3, 0x43, 0x5e, 0x7e, 0xe8, 0x65, 0x2c, 0xcb, 0x4, 0xdf, 0xc6, 0x1b, 0xf7, 0x34, 0x18, 0x34, 0xa8, 0xed, 0x3c, 0x2c, 0x77, 0xf8, 0x32, 0x4b, 0xb6, 0x37, 0x42, 0x12, 0x4f, 0x8, 0x8d, 0x7, 0xfd, 0xec, 0xe3, 0x99, 0xbe, 0x8e, 0x68, 0xd8, 0x5d, 0x84, 0xf6, 0xc, 0xa7, 0xb8, 0x57, 0x25, 0xa3, 0xa4, 0x5d, 0x9c, 0xc5, 0x8f, 0x80, 0x62, 0x58, 0x58, 0xa3, 0x2b, 0x2b, 0x3, 0xa9, 0x86, 0x93, 0xf2, 0xed, 0xd5, 0x25, 0x68, 0xb6, 0x9b, 0xc2, 0x1e, 0x43, 0xdb, 0xa8, 0xa5, 0xb5, 0xc8, 0x8d, 0x1e, 0x3a, 0x98, 0x3a, 0x14, 0xbb, 0xd9, 0xd1, 0xe9, 0xcf, 0x7, 0x6a, 0x35, 0x5b, 0xdd, 0x48, 0x6f, 0x30, 0x3a, 0x68, 0xba, 0xd4, 0xc1, 0x37, 0x64, 0x2c, 0xb5, 0xe7, 0x6a, 0x3b, 0xd4, 0x4f, 0xb6, 0x54, 0xa1, 0xc1, 0xc0, 0xf9, 0xd0, 0x52, 0x54, 0xed, 0xba, 0xd, 0x66, 0x90, 0xf, 0x53, 0x50, 0x28, 0x95, 0x3e, 0x3f, 0x42, 0x81, 0x4d, 0x27, 0x47, 0x6, 0xa2, 0x32, 0x14, 0x74, 0x5, 0xb0, 0x7d, 0xf8, 0xf3, 0xeb, 0xcc, 0x1b, 0x38, 0xae, 0x12, 0xce, 0x94, 0xee, 0x35, 0x90, 0xda, 0xcc, 0x86, 0x6c, 0x17, 0x7f, 0x3a, 0xca, 0xea, 0x6, 0x46, 0x7e, 0x65, 0x3a, 0xc6, 0xdf, 0x4, 0xcd, 0x43, 0x80, 0xa3, 0xe5, 0x9a, 0x46, 0x1b, 0x25, 0xed, 0x15, 0x8d, 0xec, 0x9b, 0x64, 0x5e, 0xca, 0xca, 0x30, 0x6d, 0x5d, 0x1f, 0x7, 0xf, 0xf2, 0x9f, 0x35, 0x3b, 0x7b, 0x34, 0x86, 0xb2, 0xe4, 0xf7, 0x34, 0xf0, 0x65, 0x4d, 0x96, 0x29, 0xc8, 0x6, 0xf6, 0x81, 0x9f, 0xd8, 0xfc, 0x92, 0xc5, 0x15, 0x88, 0x52, 0x73, 0x4f, 0xc6, 0xa8, 0x49, 0xce, 0xa1, 0x3, 0xc, 0x8c, 0x7, 0x59, 0xf2, 0xb9, 0xe0, 0xff, 0x4d, 0xe0, 0x4b, 0xab, 0xf7, 0x4a, 0x50, 0x21, 0x66, 0x22, 0x4c, 0x5c, 0xa3, 0xf5, 0xf6, 0xff, 0x21, 0x9e, 0x98, 0x91, 0x1e, 0x5a, 0x84, 0x44, 0x1d, 0x7, 0x11, 0xfc, 0x9, 0x41, 0x5c, 0x95, 0x11, 0x8, 0x1e, 0x66, 0x11, 0xf1, 0x24, 0xba, 0x93, 0x9e, 0x4, 0xeb, 0x5, 0xb1, 0x84, 0xd4, 0xce, 0xed, 0x78, 0xb5, 0x24, 0xf4, 0xa1, 0x9b, 0xdc, 0x96, 0x69, 0x90, 0x3e, 0xe8, 0xb7, 0x66, 0x8f, 0xbf, 0x16, 0x82, 0xed, 0xd7, 0xf4, 0x4d, 0x2d, 0x87, 0xcf, 0xbe, 0x2c, 0x8e, 0x77, 0xf3, 0x7, 0xbf, 0x54, 0x37, 0xe7, 0x98, 0x99, 0xd8, 0x81, 0x42, 0x8, 0x87, 0xab, 0x8a, 0xbb, 0x5f, 0xc8, 0xfe, 0x5b, 0x39, 0x11, 0x45, 0x1d, 0x41, 0x28, 0xd3, 0xde, 0xf8, 0xcd, 0xe4, 0x79, 0xc0, 0x50, 0x31, 0xd0, 0xbc, 0x34, 0x59, 0xc4, 0xe7, 0x4b, 0x22, 0xae, 0xc9, 0x58, 0x43, 0x75, 0x71, 0x97, 0x9d, 0x4d, 0xdb, 0x30, 0x22, 0x41, 0xbb, 0xb1, 0xdb, 0xdc, 0x31, 0x8e, 0xd, 0xbd, 0x84, 0x8e, 0x16, 0xd2, 0x5f, 0x11, 0x1c, 0x34, 0x4f, 0x1b, 0xa6, 0x8f, 0xc2, 0x88, 0x58, 0x15, 0xfa, 0x75, 0xc7, 0xb, 0x5b, 0xba, 0xa5, 0xee, 0xd, 0x3c, 0x9a, 0x99, 0x52, 0xd0, 0x42, 0xce, 0x16, 0xa1, 0xe6, 0x42, 0x2d, 0xb0, 0xe9, 0xfe, 0x75, 0x97, 0xae, 0xb6, 0x5c, 0x54, 0xa1, 0x0, 0x52, 0xb0, 0x72, 0xea, 0xb4, 0xa3, 0x31, 0x7d, 0x6f, 0x50, 0xbc, 0x32, 0x9b, 0xbd, 0x8b, 0x78, 0x30, 0x89, 0xe5, 0x97, 0x2a, 0xb1, 0xe4, 0x37, 0x5f, 0xbc, 0xc8, 0x71, 0xb6, 0x73, 0x4a, 0x6, 0xc, 0x0, 0x6b, 0x8a, 0x5f, 0xde, 0x17, 0x5c, 0x92, 0xc6, 0xf3, 0xd5, 0x91, 0x49, 0xf3, 0x95, 0x4b, 0xcb, 0xa6, 0x66, 0x5, 0xd5, 0x7d, 0xf0, 0x97, 0xbf, 0xa8, 0x9e, 0xa0, 0x91, 0xb, 0xe5, 0x55, 0x8d, 0x2c, 0x20, 0xe7, 0xd7, 0x3a, 0xed, 0xc2, 0xdc, 0x6a, 0x5a, 0xec, 0x93, 0x0, 0x48, 0x23, 0x4a, 0x73, 0xaf, 0x36, 0xcb, 0x43, 0xbe, 0x8f, 0x1d, 0xfa, 0xe4, 0xa7, 0xa8, 0xa4, 0x1c, 0xb8, 0x87, 0xdc, 0xd0, 0xa7, 0x5f, 0x76, 0x22, 0xbf, 0xb5, 0x13, 0x70, 0x53, 0x6a, 0x1d, 0xf0, 0x5b, 0x80, 0x59, 0x98, 0xdb, 0x80, 0x42, 0x9d, 0xe2, 0xa5, 0x67, 0xe3, 0x1c, 0x6b, 0x77, 0x6f, 0x91, 0x53, 0x4f, 0x26, 0xf6, 0xdd, 0x33, 0x1f, 0xf6, 0x4f, 0x71, 0x3, 0xd1, 0x85, 0xa0, 0x8e, 0x23, 0x6, 0x42, 0xe3, 0x9e, 0x80, 0xe5, 0xb7, 0xd4, 0x50, 0x1c, 0x1d, 0xeb, 0xf8, 0x85, 0xd, 0x45, 0x9f, 0x99, 0x25, 0xf3, 0x39, 0xa2, 0xb1, 0x4, 0x39, 0x5f, 0x90, 0xad, 0x58, 0x1a, 0xf7, 0xa6, 0x26, 0xd0, 0xed, 0x24, 0xb8, 0xd6, 0x36, 0x27, 0x54, 0x43, 0xb8, 0x64, 0x93, 0x4a, 0x75, 0xa7, 0x41, 0x8, 0xe9, 0x1d, 0xeb, 0xcf, 0x41, 0xcb, 0x97, 0x75, 0x4f, 0xa, 0x58, 0xbf, 0x7a, 0x2b, 0x25, 0x20, 0x20, 0x8e, 0xc4, 0x17, 0x81, 0x92, 0x72, 0x37, 0x71, 0xa0, 0xf5, 0xc6, 0x28, 0x1c, 0xdb, 0xda, 0x9b, 0x9e, 0xc7, 0xe4, 0x51, 0x60, 0x8a, 0x65, 0xea, 0x9f, 0x6a, 0xc6, 0x73, 0xcb, 0x94, 0x13, 0x23, 0x7b, 0xbe, 0xc6, 0xd5, 0x1e, 0xf3, 0x27, 0xfe, 0xf8, 0xa6, 0x5a, 0x36, 0x8f, 0xc8, 0xf4, 0x9e, 0x49, 0xaa, 0x4a, 0x1f, 0x72, 0xb0, 0xf, 0x6b, 0x2a, 0xfb, 0xe3, 0xd5, 0xa7, 0xb3, 0x68, 0x1d, 0x85, 0x92, 0x3a, 0x7d, 0x9, 0x88, 0xa7, 0x13, 0x49, 0x6f, 0xe9, 0x8a, 0x7f, 0xe, 0x6, 0xc1, 0xfd, 0xdb, 0x88, 0xe2, 0xc, 0xfa, 0xf1, 0x8, 0xdd, 0xf8, 0xd2, 0x80, 0x74, 0x39, 0x3c, 0xf0, 0x95, 0xdb, 0x4e, 0x8b, 0xa, 0xf1, 0xe, 0x56, 0xe5, 0x47, 0x32, 0x75, 0xbc, 0x58, 0x45, 0xa4, 0x4f, 0xc0, 0xf, 0x5f, 0xef, 0x5c, 0x76, 0x75, 0x3d, 0x6d, 0xd6, 0xe6, 0x2c, 0x9f, 0x72, 0x66, 0xf0, 0x33, 0xb4, 0x5d, 0x27, 0x35, 0x6d, 0x7e, 0x59, 0x4e, 0x36, 0x27, 0x5c, 0xd9, 0x31, 0xbc, 0x93, 0x3a, 0x1a, 0x73, 0xbe, 0xee, 0x82, 0x1a, 0xdc, 0x1a, 0xa2, 0x65, 0xf4, 0xbb, 0x42, 0xfd, 0xe, 0x3, 0xef, 0xa4, 0x6f, 0xb, 0xc1, 0xbb, 0x97, 0xb0, 0x87, 0xc7, 0xa4, 0x7a, 0x24, 0xda, 0x77, 0xc, 0xf6, 0x32, 0xc6, 0x8d, 0x8b, 0x3e, 0x52, 0x23, 0xc2, 0x6a, 0xc2, 0xfb, 0x6f, 0xcf, 0x79, 0x45, 0x34, 0x11, 0xff, 0xf6, 0xa4, 0xf6, 0x50, 0x2, 0x98, 0x3c, 0x65, 0x25, 0x58, 0x8b, 0x39, 0x1f, 0xcc, 0x9a, 0xef, 0xea, 0x88, 0x95, 0x7e, 0x21, 0xf4, 0x25, 0x9a, 0x18, 0x85, 0xef, 0xfc, 0x68, 0xb9, 0xf5, 0xf5, 0x24, 0x94, 0x28, 0x22, 0x7, 0xd0, 0xf9, 0x8a, 0x5d, 0xc0, 0x2a, 0xb2, 0xa1, 0x49, 0x8c, 0xfa, 0x36, 0xb, 0xce, 0x5f, 0x11, 0xf1, 0x57, 0x36, 0x1c, 0xe6, 0x3f, 0x43, 0x62, 0x42, 0xc0, 0xf0, 0xcd, 0x6, 0xdc, 0x20, 0xc8, 0x9e, 0x2d, 0xc5, 0x8a, 0x9d, 0xb9, 0xa2, 0x1a, 0xbc, 0x7e, 0x9, 0xdd, 0xb2, 0x3a, 0x33, 0xa0, 0x37, 0x93, 0x93, 0x88, 0x7, 0x38, 0xdb, 0xa0, 0x37, 0x71, 0x5e, 0xf5, 0x1c, 0x13, 0x16, 0x2c, 0x79, 0x7f, 0x48, 0x48, 0x26, 0x61, 0xf2, 0xce, 0x3f, 0x36, 0x13, 0xd0, 0xda, 0x29, 0xf1, 0xab, 0xe, 0x1d, 0xc8, 0x39, 0x62, 0xe2, 0x6b, 0x27, 0x9d, 0xde, 0x61, 0xe7, 0x8e, 0xd3, 0x6a, 0xda, 0x1e, 0x34, 0x7a, 0x6a, 0x40, 0x7, 0x6a, 0x2, 0xd5, 0xac, 0x10, 0x73, 0x1, 0x1c, 0x28, 0x93, 0xe7, 0x54, 0xc9, 0x26, 0x35, 0x51, 0xac, 0x0, 0x76, 0xc5, 0x7b, 0x6b, 0x41, 0xa7, 0x44, 0x2b, 0xd4, 0x52, 0x89, 0x67, 0x9, 0xb1, 0x9f, 0x4, 0xb6, 0xb7, 0x3f, 0xda, 0xab, 0x7b, 0xef, 0xad, 0xdf, 0x59, 0xa6, 0xb0, 0x3c, 0xd, 0xc, 0x8b, 0x1b, 0x72, 0x31, 0x79, 0x58, 0x1b, 0x61, 0x9d, 0x4e, 0x6e, 0x47, 0x73, 0xfe, 0x31, 0x3b, 0x49, 0x4a, 0xba, 0x67, 0xf3, 0x4b, 0x26, 0xf0, 0xf7, 0x9b, 0x52, 0xa, 0xf2, 0x54, 0x4b, 0x91, 0x95, 0x97, 0x62, 0xe0, 0x96, 0xb6, 0xac, 0x36, 0xf2, 0x8b, 0x6d, 0xb9, 0xda, 0xcd, 0x13, 0xea, 0x25, 0xed, 0xa, 0xc7, 0xf2, 0x4f, 0xe7, 0xbb, 0xcb, 0x81, 0xeb, 0x9, 0x1d, 0xfa, 0xc5, 0x44, 0x85, 0x46, 0x87, 0x8c, 0xfc, 0x88, 0x17, 0x33, 0x6b, 0x69, 0xd, 0x67, 0x7a, 0x84, 0x59, 0x9a, 0x51, 0x45, 0xe2, 0xaf, 0x10, 0x84, 0x74, 0xd7, 0x30, 0xbc, 0xaf, 0x39, 0x97, 0x9a, 0x88, 0x4a, 0xf4, 0xd8, 0x3, 0xde, 0x33, 0x66, 0x37, 0xdb, 0x5d, 0x50, 0xb3, 0x9b, 0x6a, 0xd5, 0x14, 0x5e, 0x81, 0x46, 0x7, 0x7c, 0x66, 0x66, 0xbb, 0x93, 0x44, 0x88, 0xed, 0xf8, 0x28, 0x22, 0x82, 0x48, 0xab, 0x17, 0x1a, 0x56, 0xcc, 0x23, 0xce, 0x1b, 0x1a, 0x52, 0x59, 0x7, 0x83, 0x99, 0x26, 0xb6, 0xbc, 0x64, 0x1e, 0x42, 0x33, 0xf1, 0xb5, 0xe0, 0xde, 0x26, 0xc8, 0x38, 0xa6, 0xae, 0x6c, 0x34, 0x10, 0xb3, 0xb, 0x68, 0xe7, 0xd6, 0xd3, 0xce, 0xd4, 0xd5, 0x97, 0x40, 0x6f, 0xe0, 0xb, 0xa3, 0x12, 0x75, 0x52, 0x14, 0x96, 0x9, 0x9a, 0xa5, 0x89, 0xe5, 0xfd, 0x67, 0xd8, 0xf3, 0x80, 0xc1, 0xd0, 0x52, 0x4f, 0x25, 0x73, 0x2e, 0xac, 0x74, 0x3c, 0x33, 0xa3, 0xd8, 0x63, 0x90, 0x7a, 0x6f, 0xee, 0xe2, 0x44, 0x27, 0x14, 0x12, 0x3f, 0x60, 0x21, 0x65, 0x10, 0x9d, 0x38, 0x63, 0x3a, 0x81, 0x9c, 0x9e, 0xc7, 0x82, 0xcd, 0xa1, 0xeb, 0x42, 0xe3, 0x5a, 0x1c, 0x64, 0x9, 0xc1, 0xe9, 0x6, 0xbb, 0x4, 0x30, 0xfb, 0x85, 0x3c, 0x7f, 0xf1, 0x12, 0xc2, 0x1c, 0x44, 0xed, 0x1f, 0x53, 0x1a, 0xf6, 0x82, 0xac, 0xdf, 0x56, 0x16, 0x5f, 0x8f, 0xd9, 0xce, 0x30, 0x7a, 0xec, 0x88, 0xbc, 0xe7, 0x14, 0xd3, 0x95, 0xc5, 0xa6, 0xed, 0xed, 0x99, 0x78, 0x46, 0x4b, 0x46, 0xe7, 0x2e, 0xd3, 0xd5, 0x1e, 0xa, 0x3c, 0x42, 0xef, 0x1c, 0x13, 0x76, 0xcc, 0x69, 0xea, 0x76, 0x7e, 0x21, 0x17, 0xa9, 0xcd, 0xe7, 0x1f, 0xce, 0xcc, 0x27, 0x16, 0x3f, 0x89, 0x8a, 0x6b, 0x1, 0xd8, 0x12, 0x6b, 0x4f, 0xc7, 0x9f, 0x84, 0xde, 0xd6, 0xbc, 0x61, 0x4e, 0x14, 0xf3, 0xe2, 0x17, 0x58, 0xfa, 0xce, 0x5e, 0xc5, 0x9b, 0xb5, 0x39, 0x89, 0xb, 0xff, 0x70, 0xaa, 0xcb, 0x3b, 0xb3, 0x64, 0xb1, 0x91, 0xb7, 0x2a, 0x3f, 0xf, 0x1, 0x6b, 0xaf, 0x37, 0xcb, 0x52, 0x7b, 0xba, 0x67, 0xb7, 0x98, 0x41, 0x65, 0xf8, 0xfc, 0x80, 0xf3, 0xd, 0xbd, 0x4a, 0x1, 0xa1, 0x64, 0x54, 0xf3, 0x94, 0x51, 0x25, 0xf6, 0x35, 0x4c, 0x2e, 0xf2, 0xc1, 0x42, 0x1b, 0xf5, 0xbb, 0xf7, 0xe2, 0xf3, 0x70, 0x9a, 0x4c, 0xee, 0x21, 0x8, 0x64, 0x41, 0x35, 0x1f, 0x92, 0x19, 0xc6, 0xb, 0xb4, 0xea, 0x83, 0x15, 0x9f, 0x87, 0x72, 0x1d, 0xf6, 0xca, 0x90, 0x74, 0xb2, 0xe7, 0x6a, 0xf7, 0xf3, 0xd9, 0x8a, 0x99, 0xf7, 0x57, 0x11, 0xa4, 0x50, 0x19, 0x18, 0x1e, 0x7e, 0x3a, 0xda, 0xe8, 0xe6, 0xe1, 0xd7, 0xa9, 0x5f, 0xb9, 0x26, 0x84, 0xeb, 0x84, 0x37, 0x96, 0x10, 0x2a, 0x2e, 0x54, 0x6e, 0xed, 0xe4, 0xe, 0x83, 0xfd, 0x12, 0x96, 0xb8, 0x35, 0x4d, 0xbc, 0xe9, 0x5, 0x40, 0x5c, 0x50, 0xca, 0x77, 0xf4, 0xd1, 0xec, 0x7e, 0xa8, 0x3d, 0x20, 0x62, 0xb7, 0x86, 0x25, 0x8, 0x38, 0x22, 0x9b, 0xac, 0x68, 0x91, 0x35, 0x78, 0xcc, 0x59, 0xd6, 0x96, 0x66, 0xb4, 0x52, 0x63, 0xd3, 0xdd, 0x43, 0x46, 0x25, 0x69, 0x1d, 0xad, 0x9d, 0xd9, 0x70, 0xe3, 0xcd, 0xfa, 0x5d, 0x71, 0x62, 0x6c, 0xf2, 0x7a, 0x9d, 0x7b, 0x1e, 0x75, 0xac, 0xc5, 0x4c, 0x9d, 0xb7, 0xbd, 0x11, 0x42, 0xfd, 0x72, 0x64, 0xf9, 0x93, 0xc6, 0x4f, 0xde, 0xc8, 0xd2, 0xd3, 0x72, 0x8c, 0x64, 0xf0, 0x44, 0xdf, 0xf5, 0xcb, 0x69, 0x7b, 0xe1, 0x94, 0xbf, 0xf4, 0xa2, 0xc, 0xa9, 0x3d, 0xe2, 0x94, 0x28, 0xf1, 0xf8, 0x25, 0x53, 0x1a, 0xb, 0xd6, 0x17, 0x79, 0x6c, 0x7f, 0x43, 0xa, 0x5d, 0xcb, 0xc9, 0x96, 0x86, 0x4, 0xe7, 0x9b, 0x26, 0x7c, 0x33, 0xe1, 0x76, 0x99, 0x9c, 0x94, 0xe5, 0x68, 0x3d, 0xd7, 0xbd, 0xde, 0xaa, 0x6f, 0xd9, 0x68, 0xb7, 0xf1, 0x14, 0x86, 0x15, 0x9e, 0x69, 0xf0, 0xc4, 0x9c, 0x57, 0xa5, 0xdf, 0x22, 0xd6, 0xc6, 0x93, 0xbe, 0x17, 0xda, 0xd6, 0xcc, 0xb9, 0xf5, 0x4, 0xa5, 0x61, 0x6c, 0x86, 0x24, 0xa1, 0x4d, 0x69, 0x8d, 0x3c, 0x35, 0x21, 0x21, 0xc6, 0xb8, 0x40, 0x1, 0x80, 0xa5, 0x6c, 0x1c, 0xb8, 0x9b, 0xb7, 0xd4, 0x7d, 0x4a, 0x60, 0xf1, 0xc8, 0x78, 0xc8, 0x52, 0xfb, 0x6, 0xe8, 0xae, 0xe8, 0xb8, 0x47, 0x8d, 0x11, 0x4f, 0x14, 0x34, 0x54, 0x90, 0x9f, 0x94, 0x2b, 0xf5, 0xed, 0x72, 0x5a, 0x1, 0x27, 0x21, 0x4e, 0xa8, 0xfc, 0xeb, 0xf3, 0xce, 0xb7, 0x9c, 0xc0, 0xd0, 0x51, 0x90, 0xc8, 0xee, 0x6d, 0x29, 0x58, 0xfe, 0xe8, 0x86, 0x74, 0xd, 0x1, 0x41, 0x88, 0x81, 0xb2, 0x33, 0x40, 0x9f, 0xed, 0x9a, 0xed, 0x60, 0x56, 0xbd, 0x99, 0x8c, 0x2a, 0x53, 0xd1, 0x6a, 0xca, 0x70, 0xea, 0x71, 0xc3, 0x95, 0xfb, 0x8b, 0x97, 0xc4, 0x9d, 0x10, 0x3, 0x70, 0xd, 0x4d, 0x46, 0xe5, 0xef, 0x35, 0xe5, 0xd9, 0xdf, 0x2f, 0xf3, 0x1a, 0x5b, 0x18, 0xc9, 0x98, 0xa7, 0x7e, 0xf5, 0xab, 0x88, 0x24, 0xb4, 0x12, 0x17, 0x74, 0x7a, 0xed, 0xfa, 0x86, 0x72, 0xe9, 0xa7, 0x96, 0x2, 0x8e, 0x5f, 0x44, 0x1b, 0x17, 0x83, 0x93, 0x7, 0x1, 0x4c, 0xad, 0x31, 0x81, 0xe3, 0x21, 0xcf, 0x9b, 0xe8, 0x87, 0x39, 0xc9, 0x5, 0xe2, 0xdf, 0x8c, 0x8f, 0x8c, 0x2e, 0xc9, 0x52, 0x41, 0x3f, 0xe6, 0x3d, 0xd4, 0xad, 0x30, 0xa9, 0x62, 0x94, 0x72, 0x5a, 0xf0, 0x80, 0xc9, 0x43, 0xb1, 0xeb, 0x62, 0x68, 0xe9, 0x6, 0x3b, 0xe5, 0x54, 0x39, 0x4f, 0xb1, 0xf6, 0x2c, 0x24, 0xad, 0x75, 0x1d, 0xfe, 0x5e, 0x7d, 0x1, 0x1f, 0x6e, 0x41, 0x57, 0x8b, 0x9b, 0xe9, 0x74, 0x76, 0x96, 0x33, 0x53, 0x37, 0xa0, 0x88, 0xf4, 0xe8, 0xc0, 0x94, 0x6d, 0x6e, 0x5e, 0xf9, 0x16, 0xdc, 0x7a, 0x78, 0x3a, 0xb9, 0xcc, 0x9c, 0xc9, 0xdc, 0xa2, 0x51, 0xac, 0xc3, 0x1d, 0x7c, 0xa4, 0x9a, 0x13, 0xb4, 0x34, 0xc1, 0xd5, 0xd8, 0xdf, 0xaf, 0xaf, 0xcd, 0x8f, 0xf2, 0xed, 0x31, 0xb8, 0x10, 0x8e, 0xbd, 0x57, 0xd, 0x46, 0xfc, 0xbc, 0xf0, 0xcc, 0xfb, 0x76, 0x92, 0xe6, 0xfe, 0xcf, 0xb5, 0xce, 0x2a, 0x82, 0x3a, 0x5b, 0x91, 0x5d, 0xc7, 0xfe, 0xd2, 0x8e, 0x32, 0x6c, 0x47, 0x59, 0xc3, 0x13, 0xc1, 0x45, 0xa1, 0xcd, 0x7b, 0xe1, 0x8b, 0x53, 0x81, 0x1a, 0xf6, 0x8f, 0x3d, 0x6c, 0xaa, 0xc3, 0x67, 0xe8, 0x1, 0x2f, 0xc8, 0x16, 0x65, 0x5d, 0xe1, 0x34, 0x56, 0xb0, 0xb9, 0x48, 0x69, 0xd2, 0x7b, 0x43, 0xc1, 0xc7, 0xd4, 0x19, 0x6c, 0x0, 0xd2, 0xfc, 0xd2, 0x76, 0xe9, 0xb1, 0xe1, 0x37, 0xc4, 0xf3, 0xa0, 0xe8, 0x37, 0xf2, 0x94, 0xf6, 0x5f, 0x54, 0xf0, 0xb1, 0x8b, 0xbf, 0xc0, 0x3f, 0xec, 0x10, 0xdd, 0xe1, 0xd3, 0x7c, 0xac, 0x6c, 0x69, 0x89, 0x4f, 0xe6, 0xbf, 0x24, 0x5f, 0xec, 0x14, 0x37, 0xed, 0x6, 0x77, 0xaf, 0x5f, 0xd8, 0xb1, 0x3e, 0x36, 0x32, 0xcc, 0x27, 0xc0, 0x4d, 0x60, 0xbd, 0xfc, 0xc8, 0x85, 0x86, 0xaf, 0xc7, 0xc6, 0x95, 0x5f, 0xaa, 0x1, 0x8f, 0x2f, 0xce, 0xc8, 0xc1, 0xd4, 0x2a, 0x69, 0x74, 0x25, 0x32, 0xbe, 0x4b, 0xc4, 0x68, 0xa0, 0xa4, 0xd4, 0x78, 0x34, 0x0, 0xb8, 0xdb, 0x3c, 0xca, 0x2e, 0xe5, 0xc6, 0x8f, 0x7c, 0x99, 0xd3, 0x4, 0xec, 0x6b, 0xb1, 0x1d, 0xea, 0xcf, 0xc5, 0x2b, 0x8f, 0x2e, 0xc8, 0x5b, 0xb0, 0xd2, 0x93, 0x47, 0xf4, 0x7f, 0x51, 0x3d, 0x76, 0x3b, 0x36, 0x55, 0xc3, 0xdd, 0x8e, 0xce, 0x16, 0x6e, 0xd, 0x82, 0xf8, 0xf, 0xf7, 0xf2, 0x4a, 0x8, 0xa5, 0x61, 0x76, 0xd2, 0xd4, 0x7e, 0xcb, 0x72, 0x54, 0x19, 0xdd, 0x4e, 0x44, 0xd3, 0x41, 0x49, 0x96, 0xda, 0x38, 0xb4, 0xa2, 0xfe, 0x17, 0x0, 0xa2, 0xb4, 0xae, 0x56, 0x93, 0xf6, 0x9b, 0x3d, 0x9c, 0xb1, 0x6a, 0x91, 0x5f, 0x3b, 0xa1, 0xa6, 0x60, 0x93, 0xdc, 0x14, 0x9c, 0x51, 0xc0, 0x71, 0xe1, 0x42, 0x2e, 0xe9, 0x1a, 0x57, 0xc2, 0xf9, 0xcc, 0x41, 0xed, 0x63, 0xab, 0x31, 0xcb, 0x4f, 0x85, 0xc8, 0xb5, 0x76, 0xc5, 0xf3, 0x37, 0xa1, 0x92, 0x23, 0xc6, 0x1b, 0x19, 0xe5, 0x66, 0x3b, 0x68, 0xd5, 0x6c, 0x1c, 0x5a, 0x56, 0x71, 0x89, 0xe6, 0x6f, 0x60, 0x83, 0x2, 0x4b, 0x48, 0xa6, 0xfd, 0xe2, 0x67, 0x67, 0x5d, 0xa2, 0xf3, 0xa4, 0xc0, 0x65, 0x8a, 0xde, 0x21, 0xba, 0x87, 0xd1, 0x84, 0x6, 0xa7, 0x9c, 0xe4, 0x74, 0xde, 0x3d, 0xc, 0xe8, 0x33, 0x61, 0x76, 0xe8, 0x3a, 0x4d, 0xc3, 0xa5, 0x16, 0xa9, 0xa2, 0x84, 0x59, 0x35, 0x8c, 0x29, 0xb8, 0xcc, 0x3e, 0xa8, 0x9, 0xc0, 0xa4, 0x4c, 0xaa, 0x7c, 0x86, 0x19, 0x9a, 0xff, 0xb8, 0x75, 0xb3, 0x10, 0x56, 0x8, 0x2, 0xdc, 0x96, 0x3, 0xf7, 0x8b, 0x32, 0x96, 0xf2, 0x63, 0xae, 0x6f, 0xde, 0x4c, 0xdc, 0x9d, 0x9c, 0xd0, 0x98, 0xbd, 0x8, 0xb8, 0xc1, 0x51, 0x44, 0x40, 0xf2, 0x75, 0x65, 0xd4, 0x1c, 0x4b, 0x64, 0x70, 0xd2, 0x75, 0x73, 0x33, 0xeb, 0x7, 0x69, 0xbd, 0x86, 0x22, 0xfa, 0xbd, 0xbe, 0xc8, 0x56, 0x46, 0x2b, 0x63, 0xc4, 0xac, 0xd2, 0x13, 0xc7, 0x42, 0x2, 0xd6, 0xaf, 0x7a, 0x42, 0xda, 0x17, 0x46, 0x75, 0x5c, 0xc9, 0xb7, 0x65, 0x30, 0x31, 0xde, 0xa3, 0x17, 0xbf, 0x98, 0x98, 0x23, 0xf8, 0x6e, 0x3b, 0x8, 0xb, 0x26, 0x3d, 0x68, 0x94, 0x4d, 0xa5, 0xf6, 0x6, 0xeb, 0x52, 0x37, 0xa, 0xdd, 0x74, 0x20, 0x75, 0x23, 0xdc, 0xbe, 0x48, 0x93, 0x25, 0x82, 0x3e, 0xfc, 0x22, 0x76, 0x63, 0x3b, 0x5d, 0xe5, 0x6b, 0x13, 0x5, 0x0, 0xea, 0x6d, 0x0, 0x4d, 0x32, 0xf4, 0x12, 0x5e, 0x9f, 0x70, 0x2, 0xfc, 0x64, 0xa9, 0x86, 0x94, 0x52, 0xe6, 0x99, 0x33, 0x92, 0xc, 0xd, 0xba, 0x9, 0x80, 0x70, 0x97, 0x3a, 0x47, 0x58, 0x38, 0x36, 0xb6, 0x6a, 0x6a, 0xc, 0xb8, 0xe1, 0xf8, 0x4c, 0x1e, 0x26, 0x82, 0x4, 0x6c, 0x5c, 0x9a, 0x91, 0x6, 0x48, 0xce, 0xe5, 0xd0, 0x9a, 0x7a, 0x51, 0xaa, 0xa7, 0x6a, 0x5, 0xc, 0xd4, 0x92, 0x27, 0xb0, 0x61, 0x6c, 0xe5, 0xda, 0x6a, 0x7c, 0x4c, 0xc, 0x9e, 0xb1, 0xa4, 0x78, 0xb1, 0x9c, 0xf1, 0x7f, 0x26, 0xba, 0xe4, 0x4f, 0x5c, 0x6d, 0x4, 0xb3, 0x50, 0x15, 0x12, 0xab, 0x26, 0xe9, 0xd3, 0x84, 0xce, 0x47, 0xc1, 0x4a, 0x5e, 0x97, 0xe4, 0x2a, 0x72, 0xff, 0x5e, 0xf9, 0xe0, 0x8b, 0x7a, 0xa0, 0xf2, 0xd4, 0x6f, 0x2c, 0x70, 0xe4, 0x71, 0x80, 0xb2, 0xb7, 0x3c, 0xcf, 0x2a, 0xb9, 0x13, 0x73, 0x2d, 0x27, 0x28, 0x6d, 0x71, 0x88, 0xc5, 0x5c, 0xfe, 0xa9, 0xda, 0xf3, 0x7b, 0x2c, 0x86, 0x42, 0x9e, 0xa7, 0xe2, 0xf2, 0x8, 0xc0, 0x78, 0x20, 0x3, 0x83, 0x4c, 0x3f, 0x96, 0xb7, 0xf3, 0xe3, 0x3, 0x32, 0x90, 0xa0, 0x7a, 0x2c, 0x84, 0xfb, 0x7a, 0x32, 0xe7, 0xa, 0xca, 0x22, 0xaf, 0xb6, 0x9, 0x76, 0x96, 0x92, 0x30, 0xe1, 0x38, 0xf1, 0x58, 0x75, 0x75, 0x62, 0xfb, 0xb8, 0x73, 0xc1, 0xa8, 0xec, 0xf7, 0x31, 0xe8, 0xc3, 0x3c, 0x27, 0x16, 0x33, 0xf6, 0x74, 0x44, 0x17, 0xe4, 0x34, 0x2, 0xc4, 0xc3, 0xca, 0x89, 0x79, 0xa7, 0x1f, 0xfa, 0x36, 0xf5, 0xc5, 0x32, 0x58, 0xed, 0xa4, 0x44, 0x82, 0x92, 0x55, 0x3f, 0x6f, 0xe1, 0x90, 0xe1, 0x5b, 0xbf, 0x21, 0x26, 0x3a, 0xf4, 0x2b, 0x6b, 0x2b, 0xca, 0xc3, 0x72, 0xd6, 0xf7, 0x83, 0x5b, 0x7a, 0x82, 0x45, 0x62, 0xf8, 0x64, 0x72, 0x7f, 0xe9, 0x0, 0xf5, 0x9, 0xa1, 0xc1, 0xbb, 0x27, 0x73, 0xa4, 0x5c, 0x78, 0x59, 0xc2, 0xb6, 0x62, 0x6a, 0x7f, 0xe9, 0x9, 0xf1, 0xda, 0x20, 0x51, 0x56, 0x57, 0x18, 0xdf, 0xab, 0x88, 0xf1, 0x2b, 0x5f, 0xf2, 0x72, 0xbc, 0x34, 0xbf, 0x40, 0xea, 0x83, 0x62, 0x22, 0x6a, 0x21, 0xc, 0xe4, 0x18, 0x2e, 0x7, 0x46, 0x20, 0x3d, 0x57, 0x36, 0x81, 0xbe, 0x11, 0x6a, 0xf, 0x11, 0x11, 0x1b, 0x86, 0xe4, 0xd6, 0x84, 0x2a, 0xf3, 0x10, 0x31, 0x75, 0x29, 0xee, 0xe2, 0xde, 0xed, 0x3e, 0x69, 0x42, 0x40, 0xd3, 0x99, 0x7f, 0xf3, 0xb3, 0x3a, 0xd4, 0xc1, 0x1c, 0xe9, 0xf5, 0xa3, 0xce, 0xf4, 0x3a, 0x23, 0x6a, 0xdb, 0xca, 0x4a, 0x62, 0xc2, 0xe7, 0xef, 0xd0, 0xa9, 0x18, 0xdf, 0xc9, 0xf3, 0x79, 0xba, 0x79, 0xe8, 0xb, 0xd, 0xfe, 0xea, 0xf5, 0x2f, 0x52, 0x56, 0x5a, 0x4c, 0xc7, 0x4e, 0x51, 0x7d, 0x6c, 0xf0, 0x79, 0xc3, 0x4a, 0x9f, 0xa2, 0xe, 0xd7, 0x4, 0x14, 0x92, 0x64, 0x70, 0xf2, 0x69, 0x2, 0x91, 0xe5, 0x3e, 0x44, 0xe0, 0x81, 0xa0, 0x44, 0xa1, 0x17, 0xfd, 0xe5, 0x6a, 0x29, 0xe, 0xb7, 0x7d, 0xfb, 0x97, 0xd7, 0x9c, 0x71, 0x1f, 0x48, 0x30, 0x2b, 0x47, 0x2b, 0x52, 0x8c, 0x6f, 0xfe, 0x98, 0x2a, 0x63, 0xe, 0x84, 0xc2, 0xf0, 0xc5, 0x16, 0xd1, 0xcc, 0x89, 0x62, 0x7c, 0x98, 0x2d, 0xaf, 0x88, 0x10, 0xf5, 0xcf, 0xe6, 0x2d, 0x4c, 0xda, 0xcc, 0x2b, 0x2a, 0xf9, 0xf0, 0x79, 0xf6, 0xfe, 0x9e, 0xf, 0x81, 0x39, 0xa5, 0x1e, 0xa6, 0x43, 0xf4, 0x74, 0x38, 0xdf, 0xfe, 0x6, 0xc2, 0x11, 0xa3, 0xa3, 0x90, 0x85, 0x87, 0xbd, 0xf, 0x5b, 0x7b, 0x2a, 0x96, 0x8b, 0x1c, 0xc3, 0x58, 0x70, 0xe9, 0x37, 0xfc, 0x48, 0x10, 0x1a, 0x5f, 0x38, 0x55, 0xeb, 0xcd, 0x55, 0x62, 0xcd, 0x8c, 0x22, 0x51, 0x20, 0x5a, 0x8b, 0x1b, 0x4f, 0x9c, 0x96, 0xd4, 0x62, 0x97, 0xde, 0x5, 0x2f, 0xd5, 0x3, 0x88, 0x3d, 0x21, 0xf6, 0x73, 0x4c, 0xe5, 0x7b, 0x37, 0x64, 0x7c, 0xc0, 0xfb, 0x4e, 0x5a, 0x4, 0xfe, 0xbf, 0x65, 0x41, 0x85, 0xf5, 0x36, 0x63, 0x30, 0xd2, 0xd0, 0xf0, 0xbd, 0xcd, 0x25, 0x6f, 0x6, 0xd6, 0x54, 0x5b, 0x6d, 0xf8, 0x5c, 0x63, 0x2d, 0x5f, 0x68, 0xe5, 0xf6, 0x2e, 0xf1, 0xc1, 0xe9, 0x51, 0x8e, 0x82, 0x6d, 0x34, 0xcb, 0x2d, 0x4, 0xaf, 0xa6, 0x6f, 0x81, 0x73, 0x0, 0x79, 0x50, 0x95, 0x37, 0xf4, 0xf7, 0xc5, 0x13, 0xa7, 0xd3, 0x9c, 0xc8, 0xed, 0x2e, 0x35, 0xac, 0x4e, 0xb5, 0x9c, 0xd, 0x88, 0x47, 0xb3, 0x33, 0xee, 0x7a, 0x2e, 0x46, 0x9a, 0x8d, 0x99, 0x7c, 0x43, 0xf1, 0x1a, 0x83, 0x87, 0x4f, 0xe0, 0x11, 0xc9, 0x2, 0x88, 0xed, 0x69, 0xd9, 0x38, 0x19, 0xb, 0xa0, 0xa1, 0x1c, 0x10, 0x93, 0xbb, 0x7b, 0xb4, 0x5b, 0x80, 0x52, 0x10, 0x64, 0xc1, 0x31, 0xe4, 0xcd, 0xa3, 0xca, 0x3e, 0x4b, 0xfe, 0x7f, 0xb9, 0x94, 0xf3, 0xb0, 0x21, 0x5d, 0xfa, 0xe5, 0x21, 0x1d, 0x69, 0xb, 0x75, 0xbc, 0xfb, 0x9d, 0x47, 0x77, 0xbd, 0xb0, 0x0, 0x8b, 0xf7, 0xfa, 0xda, 0xf, 0x83, 0xd2, 0x57, 0x4f, 0x43, 0x52, 0x9c, 0x24, 0x8c, 0xf7, 0xab, 0x6d, 0x9, 0x98, 0x45, 0x75, 0x1f, 0x4b, 0xb3, 0xc0, 0xf8, 0x8f, 0x94, 0x6f, 0xbf, 0x73, 0x4c, 0x13, 0x4e, 0x45, 0x3d, 0xf0, 0xae, 0x34, 0x59, 0xc0, 0xb, 0x39, 0xd5, 0x56, 0xb8, 0x2e, 0xdf, 0x12, 0x13, 0x4, 0x5f, 0xbd, 0xea, 0xc0, 0x7b, 0xd6, 0x36, 0x86, 0xdf, 0x45, 0xef, 0x7e, 0xb5, 0x7f, 0xea, 0xdf, 0x1f, 0xe8, 0x9, 0x69, 0x37, 0x77, 0xda, 0x31, 0x53, 0x8c, 0x8e, 0x62, 0xbc, 0x55, 0x5b, 0x75, 0xe3, 0x8b, 0x2f, 0x1b, 0xd7, 0x41, 0x78, 0x13, 0x12, 0x5, 0xba, 0x35, 0x7d, 0xe5, 0x7c, 0x31, 0x59, 0x3, 0x55, 0x59, 0xc9, 0x6d, 0xd1, 0xf5, 0x7, 0xd4, 0x51, 0xb2, 0x1c, 0xcc, 0x72, 0x4c, 0xaf, 0xaa, 0x1f, 0x54, 0xcc, 0x73, 0x81, 0xe5, 0xac, 0x70, 0x81, 0xd2, 0x5a, 0x1b, 0xc, 0x7b, 0xc5, 0x57, 0xc0, 0x1c, 0x74, 0x23, 0x6, 0x21, 0xe6, 0x74, 0xb2, 0x4, 0x79, 0x8c, 0xcb, 0xe2, 0xa7, 0xca, 0xac, 0xef, 0x95, 0x94, 0xea, 0x24, 0xec, 0xc3, 0x66, 0xc4, 0x15, 0x7c, 0xef, 0x67, 0xf3, 0x6e, 0x51, 0xc3, 0x1c, 0x5c, 0x57, 0x45, 0x3b, 0x0, 0xef, 0x34, 0xc, 0xfe, 0xc2, 0x49, 0xa0, 0xe7, 0xb3, 0xde, 0x63, 0x9c, 0x14, 0xf7, 0x1d, 0xc0, 0x8e, 0x4, 0x6c, 0x98, 0x9a, 0xc7, 0xb9, 0x69, 0x38, 0x20, 0xef, 0x80, 0x1e, 0x6c, 0x83, 0x40, 0x7c, 0xcf, 0x47, 0x44, 0x29, 0x8e, 0xd5, 0x17, 0xe, 0x21, 0x1c, 0x60, 0x12, 0x12, 0x2e, 0x7d, 0x50, 0x2b, 0x79, 0xe2, 0x17, 0x5a, 0xfa, 0xd3, 0xed, 0x98, 0xc5, 0x7e, 0xac, 0xb7, 0xf4, 0x51, 0xd1, 0xf8, 0xd5, 0xa7, 0xd, 0xe5, 0x5a, 0xb9, 0xce, 0xd6, 0xb8, 0xe, 0x3a, 0xdc, 0xb0, 0x92, 0xb4, 0xa1, 0x63, 0x28, 0xdd, 0xb3, 0x69, 0x7b, 0x15, 0x75, 0x62, 0x3d, 0x41, 0xc5, 0x4e, 0xc7, 0xc4, 0xe2, 0xc7, 0xc4, 0x5f, 0xbc, 0xf7, 0x9f, 0x32, 0xbe, 0xda, 0x9d, 0xfa, 0x60, 0xea, 0x2a, 0x5a, 0x83, 0x87, 0xcb, 0x45, 0x74, 0xad, 0xf5, 0x17, 0xf1, 0x1d, 0x69, 0x1d, 0xe9, 0x36, 0x26, 0xf4, 0x9b, 0xe4, 0x7b, 0xc0, 0x8f, 0x42, 0x32, 0xcc, 0xb, 0x90, 0xaa, 0xe9, 0x69, 0xae, 0x5c, 0x20, 0x5b, 0x5e, 0xf7, 0x9c, 0x39, 0x2b, 0x72, 0x69, 0x6f, 0x35, 0x42, 0x42, 0x79, 0xf6, 0x59, 0xb0, 0x3d, 0x63, 0x54, 0x20, 0xa2, 0x4, 0xb4, 0x98, 0x6b, 0x51, 0xf4, 0x60, 0x6f, 0xe4, 0xf5, 0xca, 0x68, 0x9e, 0x93, 0x8, 0xad, 0x66, 0xfc, 0xf1, 0xe8, 0x1f, 0xb2, 0x46, 0x63, 0xd4, 0x1b, 0x66, 0x36, 0xf0, 0x9d, 0xb6, 0x3c, 0x1d, 0xb0, 0x6f, 0xde, 0xa, 0xb4, 0x84, 0xa8, 0xe4, 0xa0, 0x5, 0x7d, 0xbf, 0x4a, 0x3d, 0xef, 0xd4, 0x69, 0x25, 0xd9, 0xf8, 0x61, 0xb2, 0xe6, 0xe1, 0xd7, 0x2b, 0x1c, 0xef, 0xdb, 0x4d, 0xc7, 0xe5, 0xb0, 0x3, 0x5, 0x37, 0x4c, 0x9a, 0xe0, 0x39, 0x1a, 0x36, 0x6a, 0x73, 0x84, 0xff, 0xe7, 0x8, 0x75, 0xd5, 0x7f, 0xf8, 0xed, 0x76, 0xc7, 0x67, 0xfd, 0x39, 0x19, 0x8a, 0x84, 0x5c, 0xcb, 0x70, 0x7c, 0x84, 0xd0, 0xd1, 0x3, 0xde, 0x5a, 0x91, 0x53, 0xf5, 0x4f, 0x3e, 0x82, 0xa9, 0xcf, 0x83, 0x4d, 0xb5, 0x8f, 0x4, 0x4e, 0xd, 0xf1, 0x6e, 0x14, 0x8, 0xb3, 0x36, 0x2a, 0xcb, 0xb6, 0xb3, 0x91, 0xa6, 0x14, 0x7f, 0x65, 0x20, 0xc6, 0x93, 0x9b, 0x41, 0x2f, 0x7f, 0xda, 0xe1, 0xd3, 0xa2, 0xaa, 0xb7, 0x4d, 0x7a, 0x6f, 0x16, 0xb0, 0xf4, 0x17, 0x83, 0xae, 0xe6, 0x74, 0xec, 0xce, 0xf7, 0xe3, 0xd3, 0xfb, 0xfd, 0x4b, 0x87, 0xe0, 0xac, 0x16, 0xb5, 0xfd, 0xa3, 0xf3, 0x81, 0xc6, 0x19, 0x60, 0x84, 0x3d, 0xb0, 0x20, 0x16, 0x7c, 0x5c, 0xee, 0x12, 0xb, 0x1, 0xc5, 0x63, 0x2b, 0xdd, 0xb4, 0x68, 0xba, 0x1e, 0xc5, 0x68, 0x66, 0x32, 0xcd, 0x3, 0xac, 0x5b, 0xcb, 0xb, 0x4e, 0xf7, 0x79, 0x62, 0x2a, 0xa8, 0xcd, 0x5f, 0x8f, 0x9f, 0x13, 0x8e, 0xfd, 0xfd, 0x5b, 0xee, 0xbd, 0xc4, 0x58, 0xe5, 0xf3, 0x77, 0x9f, 0x3f, 0xe3, 0xf4, 0xba, 0x6c, 0xd7, 0x69, 0x19, 0x77, 0x71, 0xa4, 0x97, 0x4c, 0x3a, 0xa7, 0xe6, 0xdc, 0xf6, 0x4b, 0xe8, 0x27, 0xda, 0xd1, 0xc2, 0xe6, 0x13, 0x96, 0x3d, 0x37, 0xff, 0xe9, 0xa6, 0x59, 0xd7, 0x3c, 0x19, 0x15, 0xf1, 0x2c, 0x26, 0xd2, 0x63, 0x25, 0x70, 0x9b, 0x3f, 0xc8, 0x5c, 0x33, 0x1a, 0x91, 0x84, 0x31, 0x8c, 0xe4, 0x13, 0x59, 0x6a, 0xba, 0x59, 0x34, 0x56, 0x19, 0x29, 0xb3, 0xc7, 0x61, 0xd, 0x92, 0x1b, 0xad, 0x25, 0x24, 0xa0, 0xb6, 0xb8, 0x5a, 0x80, 0x86, 0x60, 0x0, 0x8d, 0xda, 0x12, 0xc5, 0x2a, 0xfd, 0xc0, 0xf5, 0xbc, 0x6a, 0x84, 0xa4, 0x6c, 0xd7, 0x38, 0x21, 0xac, 0xd8, 0x51, 0xea, 0xaf, 0x43, 0xd4, 0x4c, 0x34, 0x45, 0x75, 0x64, 0xcb, 0x85, 0xca, 0xed, 0xcd, 0x66, 0x24, 0x1b, 0x9f, 0x8c, 0x53, 0x9, 0x1a, 0x10, 0xb7, 0xb, 0x14, 0x5d, 0x11, 0x11, 0x5e, 0x51, 0xe8, 0x8a, 0xac, 0x9e, 0xf5, 0x3, 0x6f, 0x67, 0xff, 0x63, 0xd, 0xfb, 0x4a, 0x23, 0x7d, 0x51, 0x55, 0x5e, 0x75, 0xc1, 0x8f, 0x20, 0x7e, 0x4e, 0xdb, 0xc2, 0x61, 0x5d, 0x4b, 0x8a, 0xf2, 0xce, 0x59, 0x98, 0xaa, 0xf, 0x3, 0xaf, 0x34, 0xfc, 0xd4, 0xd6, 0xbd, 0x74, 0x47, 0x54, 0x53, 0xe4, 0x53, 0x10, 0x51, 0xbc, 0xa2, 0xdb, 0x3a, 0xcc, 0xe, 0x4d, 0x83, 0xf5, 0x71, 0xe3, 0xba, 0xf7, 0xd7, 0x15, 0x42, 0xbc, 0x63, 0x86, 0x6c, 0xbf, 0x57, 0xfd, 0xfc, 0x1d, 0x1b, 0x90, 0xd6, 0x3d, 0x38, 0xd2, 0xde, 0xc3, 0x7d, 0x58, 0xb5, 0xb4, 0xfb, 0x49, 0x3b, 0x62, 0x5f, 0x62, 0x7, 0x8d, 0xa0, 0x44, 0xfd, 0x62, 0xb7, 0xe9, 0x9d, 0x5b, 0xd6, 0xe4, 0x3e, 0xde, 0x15, 0x78, 0x71, 0x6e, 0x4b, 0x99, 0x5a, 0xd1, 0x31, 0xe1, 0xa7, 0xa0, 0xc7, 0x95, 0xd9, 0xaa, 0x23, 0xc0, 0x26, 0xf2, 0x6d, 0xb4, 0xc8, 0xed, 0xfc, 0x2a, 0x70, 0x4d, 0x9, 0xfd, 0x8c, 0x86, 0xa8, 0xd6, 0xce, 0xcd, 0x43, 0xc7, 0x7b, 0x75, 0xbe, 0xca, 0x1f, 0xc4, 0xe, 0xd7, 0xb7, 0x90, 0x93, 0xac, 0xdd, 0x47, 0x9e, 0x6c, 0x2a, 0x90, 0xaa, 0x10, 0x93, 0x25, 0x94, 0x6, 0x72, 0xeb, 0xd0, 0x64, 0x54, 0xf5, 0x80, 0x7e, 0xd1, 0xa7, 0x13, 0xa6, 0x67, 0xa7, 0xe1, 0xd3, 0x89, 0xad, 0x7d, 0xc9, 0xc8, 0x60, 0x12, 0x79, 0x77, 0xe7, 0xcb, 0xf0, 0xe4, 0x1f, 0xf2, 0x2f, 0xec, 0x10, 0xbc, 0xe6, 0xe9, 0xc2, 0x4a, 0x98, 0xed, 0x5, 0xa3, 0xcb, 0x77, 0xe8, 0x3d, 0xc5, 0xe3, 0xdc, 0x4f, 0x62, 0x83, 0xb2, 0xf9, 0xba, 0x9b, 0xec, 0xc0, 0x85, 0x14, 0xcd, 0x51, 0x94, 0x5e, 0xc8, 0x1e, 0x76, 0xb1, 0x6d, 0x75, 0x13, 0x1f, 0x55, 0x7e, 0xb9, 0xa4, 0x98, 0x8b, 0x3c, 0xe5, 0x28, 0xcc, 0x96, 0x40, 0xf8, 0xe3, 0xae, 0xb2, 0x8d, 0x1a, 0xf, 0x92, 0xa0, 0x61, 0xc3, 0x48, 0xa, 0x19, 0x31, 0x8c, 0x2d, 0x67, 0x8b, 0xa9, 0xd4, 0x55, 0x18, 0x0, 0xd1, 0xe7, 0xc1, 0x7b, 0x2a, 0x4b, 0x3f, 0xbf, 0x7, 0xfb, 0x2c, 0x24, 0xc4, 0x8b, 0xa2, 0x32, 0x3f, 0x4a, 0xf4, 0x9b, 0xfa, 0xd1, 0x63, 0xd, 0x7d, 0x13, 0xe5, 0x64, 0x9f, 0xd8, 0xa9, 0x2, 0x52, 0xc0, 0x8f, 0x65, 0x9, 0x63, 0x43, 0x50, 0x74, 0x48, 0x89, 0x48, 0x61, 0xda, 0x98, 0xd5, 0xf8, 0x30, 0xae, 0xe9, 0x91, 0xaf, 0x8b, 0x81, 0xd1, 0x10, 0xd7, 0x2e, 0x20, 0xc, 0x6a, 0x8b, 0x6, 0x9e, 0x7e, 0xe2, 0x44, 0x6b, 0x1a, 0x1c, 0xfb, 0xdc, 0x28, 0x1e, 0xdc, 0x57, 0xac, 0xd6, 0x64, 0xcb, 0x3a, 0x88, 0xa5, 0x76, 0xe1, 0x42, 0xac, 0xe2, 0x82, 0x99, 0x64, 0x2b, 0x78, 0xe2, 0x46, 0xba, 0x4e, 0x32, 0xf5, 0x50, 0x83, 0xe1, 0xaf, 0xaa, 0x8c, 0x3d, 0xca, 0x74, 0xd6, 0xf5, 0xf2, 0x2a, 0xd8, 0xf3, 0x1e, 0xd, 0x60, 0x56, 0xed, 0xf, 0x9, 0xc2, 0x7, 0xde, 0x50, 0x59, 0xef, 0xe0, 0x48, 0x45, 0xeb, 0x4f, 0x5a, 0x76, 0x3f, 0x2, 0xf0, 0xb2, 0x90, 0x67, 0xf1, 0x39, 0x33, 0x10, 0x3, 0xb3, 0xb3, 0xc8, 0xa3, 0x61, 0x1d, 0x78, 0x92, 0xa6, 0xe, 0x6d, 0x87, 0x32, 0x54, 0x38, 0xbc, 0x8, 0x3, 0x7b, 0x2, 0x28, 0xfb, 0x5, 0xcf, 0xbe, 0x2f, 0xe1, 0xb1, 0xa4, 0x7d, 0x68, 0x6c, 0x63, 0x58, 0x7c, 0x21, 0x7, 0x3d, 0x0, 0xe3, 0x0, 0xa3, 0xb2, 0x1, 0x5e, 0x37, 0xa9, 0x3b, 0x61, 0x6e, 0xe1, 0x1d, 0x88, 0x5, 0x84, 0x8c, 0xa5, 0x8b, 0xf4, 0xf8, 0x14, 0x30, 0xc4, 0x53, 0xc6, 0xf9, 0xd0, 0xa0, 0xd6, 0x97, 0x68, 0x1c, 0xbc, 0x55, 0x7f, 0xd, 0x3b, 0xe, 0xea, 0xe0, 0xd8, 0xad, 0x7a, 0x5b, 0xb8, 0x92, 0xaa, 0x5b, 0xb3, 0xf4, 0x48, 0x4e, 0x67, 0xb7, 0xd1, 0xec, 0x2b, 0xc2, 0x9a, 0x7a, 0x6d, 0x8d, 0xf7, 0xd7, 0xe2, 0xd0, 0x95, 0x9c, 0xf9, 0x62, 0x42, 0x7, 0xf5, 0xe9, 0x11, 0xf6, 0x89, 0xa, 0x47, 0x52, 0x48, 0xec, 0x9d, 0x86, 0x92, 0x19, 0x91, 0xaa, 0xf7, 0xe2, 0xaa, 0x6d, 0x4e, 0x77, 0x2e, 0x7f, 0xed, 0xbc, 0x19, 0xa, 0x9e, 0xe3, 0xe0, 0x3a, 0x7b, 0x7e, 0x67, 0xae, 0x91, 0x8a, 0x3f, 0x29, 0xd3, 0x1f, 0x61, 0xc8, 0x45, 0xcb, 0xb0, 0x63, 0xd3, 0x3b, 0xe9, 0x9a, 0x30, 0xcf, 0x1c, 0x1d, 0xbe, 0xe1, 0xca, 0x20, 0x39, 0xe7, 0xb, 0xf8, 0xa3, 0x1, 0xdf, 0x8e, 0x49, 0x74, 0xba, 0xac, 0xaa, 0x90, 0xac, 0xf5, 0xb2, 0x4a, 0x2a, 0x6d, 0x1e, 0xf1, 0x50, 0x35, 0x23, 0x3f, 0xf0, 0xc5, 0x60, 0x2e, 0xfd, 0x5a, 0x92, 0x11, 0x94, 0xd0, 0xd4, 0xa6, 0xe5, 0x58, 0xd2, 0xc3, 0x65, 0x5b, 0xa9, 0x6a, 0x2c, 0x90, 0x9f, 0xb5, 0xcf, 0x19, 0x1a, 0x68, 0x5c, 0xad, 0xf5, 0x3a, 0x1, 0x86, 0xb4, 0xf3, 0x38, 0x96, 0x97, 0x76, 0x67, 0x50, 0xa2, 0x28, 0xb, 0x8e, 0xa3, 0xd0, 0xb4, 0x32, 0x12, 0x4f, 0x7b, 0x6a, 0xd3, 0xb8, 0x84, 0x47, 0xa6, 0x96, 0xa6, 0x66, 0x2, 0x9e, 0xa1, 0xcf, 0x7f, 0x4b, 0xfb, 0xc3, 0x92, 0xfd, 0x64, 0x1f, 0x5e, 0xdf, 0x19, 0x6d, 0x50, 0x11, 0x49, 0x95, 0x6d, 0xa1, 0x3c, 0x7a, 0x69, 0xe1, 0x9f, 0x98, 0x9f, 0x7d, 0xa8, 0x27, 0x23, 0x8c, 0x8d, 0x48, 0x7e, 0x17, 0xa3, 0x7d, 0x3, 0x28, 0xce, 0x43, 0xa5, 0x18, 0x55, 0x3c, 0xf9, 0x76, 0x1d, 0x7, 0xea, 0x3b, 0x6d, 0xa, 0x22, 0x48, 0xfd, 0x5f, 0x58, 0x3, 0xe, 0xd7, 0xe7, 0x9d, 0x17, 0x55, 0x56, 0x70, 0x45, 0xa8, 0x72, 0x5c, 0xc, 0x78, 0x3e, 0x9c, 0x2, 0x50, 0x1d, 0xcb, 0xb4, 0x2, 0xc1, 0x39, 0xe8, 0x75, 0xf0, 0xd5, 0xbd, 0x71, 0x3e, 0x22, 0xb8, 0x98, 0xb4, 0xf0, 0xf4, 0x60, 0x64, 0xa5, 0x8d, 0x4b, 0x6d, 0x6c, 0xe0, 0x82, 0x26, 0xd4, 0x40, 0xa7, 0x96, 0xc9, 0x53, 0xae, 0x4e, 0x2c, 0x70, 0x89, 0x63, 0xef, 0x8b, 0x9d, 0xc1, 0x70, 0xff, 0xc6, 0xc2, 0x8d, 0x72, 0x35, 0x87, 0x35, 0x22, 0xdc, 0xc5, 0x2f, 0x12, 0xd6, 0x79, 0xf9, 0x77, 0xe2, 0x19, 0x3, 0xd0, 0xf5, 0x23, 0xc7, 0x8c, 0xed, 0xdd, 0x25, 0x4e, 0xe8, 0x7e, 0xa, 0x88, 0xcd, 0x63, 0xb0, 0xaf, 0xa8, 0x91, 0x60, 0xaf, 0x74, 0x35, 0xc6, 0xa7, 0x3e, 0x3f, 0x42, 0x7f, 0xde, 0x2, 0x84, 0xdc, 0xfc, 0xc, 0x52, 0xa1, 0x1a, 0xb3, 0x2f, 0x79, 0xd0, 0x62, 0x55, 0x16, 0x3b, 0xee, 0xb2, 0x47, 0x9a, 0x95, 0x5b, 0x3d, 0x88, 0xec, 0xdd, 0xb9, 0x99, 0xc7, 0x4, 0x38, 0x93, 0xb7, 0x80, 0x9f, 0xc0, 0x2d, 0xb8, 0x3d, 0x2d, 0x3d, 0x88, 0xe8, 0x69, 0xae, 0xf4, 0xa, 0xe7, 0x25, 0x2f, 0x5e, 0x5d, 0xc1, 0x85, 0x0, 0x4, 0x5, 0xce, 0xd9, 0x5f, 0x87, 0xf2, 0x38, 0x5a, 0x6b, 0xd0, 0xe8, 0x50, 0x28, 0xda, 0xb0, 0xbe, 0x9a, 0x35, 0x7f, 0x22, 0x15, 0xf2, 0x23, 0xe5, 0xe0, 0x37, 0x10, 0xf, 0x65, 0x3b, 0x1, 0x83, 0x95, 0x43, 0xab, 0x38, 0x44, 0x5e, 0x90, 0xc0, 0xef, 0xfb, 0x68, 0x42, 0x3, 0x6b, 0x77, 0x6, 0xc, 0xa2, 0x4b, 0x28, 0x7b, 0x33, 0x11, 0x6c, 0x1b, 0xc4, 0x49, 0xb9, 0x2, 0x4f, 0xef, 0x4b, 0x19, 0x47, 0x8d, 0x3b, 0x7c, 0x35, 0x5, 0x7e, 0xe, 0x0, 0x5b, 0xe1, 0x5f, 0xb4, 0x26, 0xb1, 0x28, 0x74, 0x66, 0x26, 0xc3, 0x44, 0x11, 0x92, 0xe0, 0x42, 0x93, 0xb9, 0xf8, 0x2c, 0x3e, 0x3, 0xb5, 0xf1, 0xc6, 0x4f, 0xf1, 0x54, 0xcf, 0xda, 0xdc, 0x60, 0x37, 0xfb, 0x7d, 0xa5, 0x7b, 0x8d, 0xd8, 0x31, 0xa, 0x5a, 0xd2, 0x77, 0x49, 0xf7, 0x68, 0xcb, 0x2f, 0xed, 0x4d, 0x7, 0x40, 0x76, 0x9a, 0x65, 0x47, 0x88, 0xf1, 0xc7, 0xf4, 0xdc, 0xf2, 0x69, 0xb1, 0x9d, 0x87, 0x6a, 0xf9, 0x6d, 0xd1, 0xd5, 0x75, 0x4d, 0x74, 0xb5, 0xef, 0xcc, 0xbe, 0xaa, 0xf5, 0xfd, 0x40, 0xc7, 0xd7, 0x21, 0x36, 0xe9, 0xed, 0x56, 0xcf, 0xc1, 0x76, 0xb5, 0x52, 0xce, 0xa9, 0x32, 0xb6, 0x27, 0x60, 0x6f, 0x9a, 0xe8, 0x3a, 0x40, 0xd3, 0x64, 0x5a, 0x78, 0xe8, 0xd, 0x5, 0xa, 0x66, 0x2e, 0x65, 0x82, 0x96, 0x47, 0xd6, 0xf3, 0x10, 0x2, 0xbe, 0xbc, 0x4f, 0xdf, 0x5e, 0xb2, 0x78, 0x5d, 0x31, 0xf9, 0xb4, 0xde, 0xf, 0x71, 0xc9, 0xf9, 0x35, 0x2, 0x1e, 0x9a, 0x0, 0x88, 0xf, 0xa1, 0xb8, 0x20, 0x48, 0x27, 0x40, 0xed, 0x2f, 0x40, 0x11, 0x8, 0x86, 0xac, 0xb7, 0x72, 0xbe, 0xe3, 0x63, 0x11, 0x60, 0x72, 0x26, 0x16, 0xd4, 0xea, 0x71, 0xc, 0x75, 0xad, 0xa3, 0x1e, 0xf7, 0xe3, 0x8b, 0xdc, 0xaf, 0x40, 0x71, 0x34, 0x2, 0x6b, 0xa6, 0x5a, 0xc6, 0x29, 0x6f, 0xe6, 0xa5, 0xc8, 0x8f, 0x39, 0x7, 0x64, 0xec, 0xc7, 0xf3, 0xa2, 0x38, 0x99, 0x17, 0x63, 0x67, 0x9, 0x14, 0x77, 0xb8, 0x1c, 0x1c, 0x71, 0xe, 0xba, 0x4f, 0xcf, 0x7c, 0xcf, 0x7c, 0x2f, 0x2a, 0x6f, 0xda, 0x65, 0xde, 0x1b, 0x9, 0x4e, 0x1a, 0x24, 0x91, 0xd8, 0xfc, 0x71, 0x1e, 0xc3, 0x56, 0x28, 0xcc, 0xc3, 0x1c, 0x44, 0x12, 0x7c, 0x7e, 0xb8, 0xc0, 0xaa, 0x24, 0xf2, 0xe5, 0x1e, 0x68, 0xd1, 0x3d, 0xea, 0x8, 0x73, 0xad, 0xf6, 0xd6, 0xae, 0x30, 0x22, 0x3e, 0xb5, 0x28, 0x17, 0xb0, 0xb8, 0xd4, 0x71, 0x7c, 0x7b, 0xf, 0x48, 0xd9, 0x94, 0xe3, 0xdf, 0xaf, 0x1c, 0xb2, 0x68, 0x23, 0x1f, 0xe2, 0x33, 0x78, 0xcc, 0x86, 0xb6, 0xfa, 0x11, 0xc9, 0xd7, 0xcc, 0xd1, 0x39, 0xfd, 0xf6, 0x61, 0xf, 0xa9, 0x90, 0x8d, 0x24, 0x8b, 0xeb, 0x16, 0xe2, 0xd, 0xd2, 0x22, 0xfc, 0x44, 0x8f, 0x5, 0xa5, 0x28, 0x96, 0xc6, 0x57, 0x92, 0x96, 0x26, 0x91, 0xce, 0x7, 0x58, 0x8a, 0x43, 0x4e, 0x1b, 0x8e, 0x7e, 0x9a, 0x10, 0xe4, 0x93, 0x38, 0x28, 0xad, 0xda, 0x9d, 0xd5, 0xaf, 0xcb, 0xc9, 0xc, 0xc3, 0x93, 0x80, 0x8d, 0x3d, 0xc6, 0x36, 0x5f, 0xf6, 0xb2, 0x32, 0xd, 0xa6, 0x9e, 0x46, 0x31, 0xdf, 0xc8, 0x91, 0x81, 0x3e, 0x4b, 0xdf, 0x93, 0xee, 0xb5, 0xde, 0x5b, 0x35, 0xc5, 0x17, 0x10, 0x9c, 0x28, 0xaa, 0x16, 0x86, 0x85, 0x31, 0x62, 0xd2, 0x10, 0xed, 0x48, 0xa4, 0x64, 0x4f, 0xed, 0x38, 0x8b, 0xb7, 0xef, 0xc4, 0xa8, 0x3, 0xeb, 0x81, 0x52, 0x3b, 0x32, 0x91, 0x5c, 0x1b, 0xd9, 0xbf, 0x2e, 0xff, 0xbe, 0xb6, 0x33, 0x2b, 0x88, 0xed, 0xa1, 0xd7, 0x22, 0x67, 0x51, 0x45, 0xfb, 0xd0, 0xab, 0xe8, 0x9f, 0x94, 0x1b, 0x44, 0x91, 0x6f, 0xa6, 0x81, 0xc1, 0x3a, 0x99, 0x4a, 0xa4, 0x63, 0x74, 0x6b, 0xb, 0x95, 0x5f, 0x2b, 0xa6, 0xf4, 0xcf, 0xa2, 0x1, 0xe8, 0x46, 0x44, 0x61, 0x22, 0xdf, 0x8c, 0x47, 0x2e, 0x27, 0x20, 0x3a, 0xfa, 0xb3, 0x50, 0xc6, 0x98, 0x9a, 0xc, 0x2a, 0x10, 0x70, 0xff, 0x73, 0x48, 0x98, 0x93, 0x0, 0xc5, 0x1, 0x6d, 0xa1, 0xfa, 0x6, 0x86, 0xec, 0x87, 0x8b, 0x4d, 0xdd, 0x9e, 0x94, 0x27, 0xc1, 0xf, 0x60, 0xd4, 0x6b, 0x6f, 0x0, 0x7a, 0xa9, 0xe7, 0x59, 0xff, 0xbe, 0x5e, 0x30, 0xd1, 0x9c, 0xf6, 0x28, 0xa2, 0xb5, 0x62, 0x86, 0xd1, 0x9, 0x62, 0x26, 0x8b, 0x40, 0xd4, 0xaa, 0x7d, 0x5d, 0xb8, 0x0, 0xb3, 0xb1, 0x8e, 0xf, 0x11, 0x48, 0x7e, 0xab, 0xaa, 0x64, 0x4, 0xd2, 0x3c, 0x78, 0x66, 0x61, 0xa0, 0x8b, 0xf, 0x25, 0x8b, 0xf6, 0x2d, 0xeb, 0x8a, 0xa0, 0xb2, 0x61, 0xc4, 0xe0, 0x97, 0x38, 0xd, 0x64, 0xbd, 0xe, 0x6f, 0x8f, 0x6f, 0xa6, 0x5d, 0x47, 0x41, 0xe1, 0x22, 0x33, 0x99, 0xe, 0x98, 0x45, 0x32, 0xe7, 0xad, 0x55, 0xd6, 0x0, 0x72, 0x6, 0x81, 0x57, 0x96, 0xf5, 0xa6, 0xe1, 0x6b, 0x13, 0xdb, 0xbe, 0x23, 0xfc, 0xe4, 0x79, 0xd8, 0x13, 0xaf, 0xdc, 0x6c, 0x24, 0x9f, 0xe, 0xac, 0x61, 0xf9, 0x17, 0x31, 0xb9, 0xc2, 0x1a, 0x9e, 0xdb, 0xeb, 0xb5, 0x41, 0xa7, 0xc8, 0xd1, 0x3b, 0x69, 0x6c, 0x46, 0xe2, 0xed, 0x82, 0x1e, 0x70, 0xd1, 0x3d, 0x4f, 0x6b, 0xde, 0xfc, 0x6f, 0x64, 0xa4, 0xca, 0x0, 0x4e, 0x80, 0x1f, 0x24, 0x49, 0x94, 0x70, 0x88, 0xdc, 0x43, 0x86, 0xe9, 0x6d, 0xf8, 0x73, 0xa2, 0x1c, 0x7f, 0xa3, 0x98, 0x98, 0x88, 0x28, 0x92, 0x9f, 0x19, 0xa3, 0xdf, 0x4a, 0x1e, 0xc, 0x58, 0xba, 0x73, 0xc2, 0xf0, 0x82, 0xbc, 0x65, 0xaf, 0x38, 0xd, 0xf, 0x3b, 0xcd, 0xa6, 0xf8, 0xb5, 0x8a, 0xb2, 0xd8, 0x8e, 0x4d, 0x89, 0x75, 0x85, 0xe0, 0xa6, 0xee, 0x15, 0x32, 0xc9, 0xe, 0x98, 0xb9, 0x42, 0x46, 0x9f, 0x34, 0x9d, 0x29, 0xa, 0x17, 0x19, 0xb7, 0xba, 0xb5, 0x36, 0xbc, 0x2b, 0x16, 0x2c, 0xb3, 0xa2, 0x3c, 0xd2, 0x4b, 0x85, 0x73, 0x35, 0x6, 0x15, 0x81, 0xf6, 0xdf, 0x92, 0x62, 0x41, 0xff, 0x99, 0xdb, 0xb5, 0x4b, 0xe3, 0x50, 0xa1, 0xb7, 0x55, 0x3d, 0xc1, 0xa3, 0x28, 0x20, 0x7a, 0xb9, 0x6, 0x45, 0x42, 0xe5, 0xc1, 0x6, 0xf4, 0x86, 0xcf, 0x95, 0xcd, 0xb9, 0xb9, 0xc1, 0xb0, 0xfa, 0x73, 0xae, 0xa9, 0x11, 0xb3, 0xab, 0x85, 0x36, 0xa3, 0xa9, 0x96, 0xa9, 0xaf, 0x3e, 0x97, 0x2, 0x1d, 0x57, 0x34, 0x29, 0xaf, 0x9b, 0x6f, 0xff, 0xe8, 0x40, 0x7c, 0x25, 0x21, 0x81, 0xab, 0xe4, 0xb1, 0x30, 0x2d, 0xd9, 0xe4, 0x28, 0xad, 0x9, 0x82, 0xb5, 0xe4, 0x9, 0x35, 0xa0, 0x51, 0x7c, 0xf, 0x12, 0x5b, 0xc3, 0xf8, 0x1, 0xbb, 0x60, 0x21, 0x1a, 0xc3, 0xde, 0xf9, 0x83, 0x2c, 0xb0, 0x73, 0xd5, 0xd9, 0x6a, 0x23, 0x8b, 0x8c, 0x98, 0x65, 0xe3, 0x7b, 0xa5, 0xae, 0x83, 0xe9, 0x53, 0x4e, 0x83, 0x6f, 0x64, 0x4d, 0x73, 0x68, 0xe9, 0x9b, 0x30, 0xa6, 0x5d, 0x8f, 0xea, 0x37, 0x91, 0x16, 0xce, 0xf1, 0xc1, 0x24, 0xa6, 0xf3, 0x10, 0x21, 0x9, 0x44, 0xca, 0xa2, 0x9e, 0x2a, 0x78, 0xb5, 0xf1, 0x46, 0x5b, 0x9e, 0x73, 0x94, 0xdf, 0x6a, 0xb1, 0xf8, 0xf4, 0xe, 0x41, 0xf8, 0x56, 0x6a, 0x26, 0x7b, 0xc4, 0xfe, 0x1a, 0x24, 0x97, 0xc1, 0x87, 0x9c, 0x6d, 0x8e, 0x6b, 0x40, 0xa, 0x1b, 0xab, 0x42, 0xcd, 0x2, 0x3e, 0x3f, 0x80, 0x69, 0xec, 0xdb, 0x4, 0xa8, 0x9, 0x3, 0x7f, 0x5f, 0xd0, 0xba, 0x3b, 0xf7, 0x85, 0x3b, 0xa8, 0x7f, 0x19, 0x8e, 0xad, 0x73, 0x72, 0x9, 0xc6, 0xc1, 0xad, 0x67, 0x50, 0xe, 0x44, 0x97, 0xc0, 0x8c, 0x89, 0x11, 0xb3, 0xa0, 0x7f, 0x74, 0x3f, 0x65, 0xac, 0xe, 0xcd, 0xe4, 0x72, 0xa2, 0xe2, 0xbc, 0xd0, 0x14, 0xf9, 0x51, 0x58, 0xba, 0x4b, 0xe3, 0x3e, 0xa4, 0xc4, 0x60, 0x96, 0x1a, 0x7a, 0xe9, 0xcd, 0xc8, 0xa1, 0xce, 0x67, 0xa3, 0xe5, 0xe3, 0xab, 0x71, 0x72, 0xa9, 0x8b, 0x95, 0x9d, 0xcd, 0x15, 0x16, 0x3d, 0xb6, 0x7e, 0xff, 0xf3, 0xb0, 0x20, 0xae, 0xf5, 0xce, 0xd, 0x28, 0xa2, 0xdc, 0xf8, 0x94, 0x37, 0xa4, 0x44, 0x63, 0x26, 0x36, 0x5c, 0x3c, 0x48, 0x3a, 0x92, 0xca, 0xdc, 0xa0, 0x10, 0x9d, 0x3f, 0xbf, 0x6b, 0x6b, 0x2d, 0xf3, 0xbd, 0xd9, 0x81, 0xca, 0xc5, 0x20, 0xb3, 0x95, 0xa, 0xb5, 0x47, 0xff, 0x28, 0xe, 0x62, 0x71, 0x33, 0xf0, 0xce, 0x1, 0x3b, 0x3e, 0x93, 0x53, 0x1, 0x10, 0x99, 0x85, 0xbf, 0x81, 0xf0, 0xd6, 0xc8, 0xa8, 0xc3, 0xa0, 0xe9, 0x3b, 0x18, 0x66, 0xa5, 0xdc, 0x41, 0xc3, 0x85, 0xc1, 0xb6, 0xa3, 0x2a, 0x62, 0xd8, 0xda, 0xfe, 0xe7, 0x7d, 0xfb, 0x6d, 0x1b, 0x90, 0x92, 0x4d, 0xe8, 0x99, 0x88, 0xd2, 0x4a, 0x7c, 0xe, 0x2b, 0xa0, 0x30, 0x36, 0xcf, 0xd3, 0x2f, 0xaa, 0x1d, 0xc8, 0xc7, 0x9f, 0xe5, 0x89, 0xdf, 0x47, 0x95, 0x31, 0xd1, 0x33, 0x67, 0x49, 0xcd, 0x84, 0x81, 0xbe, 0xb2, 0x2b, 0x41, 0xd3, 0x93, 0xeb, 0x49, 0xf4, 0xd5, 0x6b, 0x11, 0x85, 0xe0, 0xab, 0xf, 0x47, 0x25, 0x10, 0x53, 0x28, 0x87, 0x75, 0x33, 0xa4, 0x4, 0x2f, 0xd5, 0xbf, 0xe2, 0x7e, 0x18, 0x39, 0x4e, 0x74, 0xbc, 0x9e, 0x7d, 0x44, 0x6b, 0x16, 0x36, 0x2c, 0x32, 0x4b, 0xfd, 0x3c, 0x43, 0xad, 0x92, 0x51, 0xab, 0x79, 0xba, 0x17, 0xa8, 0x6a, 0x72, 0xeb, 0x15, 0xdb, 0xc1, 0xd8, 0xac, 0x6e, 0xf9, 0x63, 0xbe, 0x76, 0x4, 0x91, 0x1e, 0xf7, 0xfa, 0x16, 0x65, 0x7e, 0xc9, 0xda, 0x9b, 0x4e, 0xd7, 0x9e, 0xf4, 0x30, 0xc2, 0x60, 0x93, 0x77, 0x88, 0x49, 0xea, 0x74, 0x1e, 0xe3, 0x1d, 0xec, 0xa6, 0xa2, 0x45, 0xb6, 0x3f, 0xe5, 0xce, 0x1d, 0x58, 0x14, 0x3f, 0x48, 0x8f, 0x91, 0x23, 0xef, 0xba, 0x3b, 0xd1, 0x37, 0xd1, 0xfc, 0xdd, 0x2d, 0x6d, 0x42, 0x3a, 0x74, 0xd2, 0xe, 0xe5, 0xcd, 0x54, 0x67, 0x7e, 0xd9, 0xe4, 0xc5, 0x4f, 0xa3, 0x89, 0x68, 0xe1, 0xde, 0x49, 0xe9, 0xd2, 0xcf, 0x72, 0x39, 0xf2, 0x2a, 0x3e, 0x23, 0x52, 0xe0, 0x1a, 0x6a, 0x6, 0x94, 0x1d, 0xbe, 0x75, 0x9e, 0x0, 0x13, 0xf4, 0xab, 0x38, 0xc7, 0x31, 0xca, 0x6c, 0x8, 0x99, 0xc4, 0x9b, 0x1d, 0xd6, 0xb, 0xb5, 0x1e, 0xbc, 0xe2, 0xf5, 0x8c, 0x4a, 0x9b, 0x4a, 0xac, 0x83, 0x6f, 0x94, 0xf7, 0xc5, 0x6c, 0xeb, 0x28, 0xab, 0xff, 0xeb, 0xfc, 0x93, 0xda, 0x27, 0x4c, 0xf6, 0xd8, 0x4c, 0x64, 0xec, 0x92, 0xc4, 0x51, 0x7b, 0x9d, 0x27, 0x90, 0xd7, 0xa2, 0x58, 0x56, 0x52, 0xc7, 0x1f, 0xc5, 0x1f, 0xed, 0xc, 0x17, 0x30, 0x43, 0x8f, 0xed, 0x8a, 0x65, 0x3e, 0xeb, 0x59, 0xda, 0x5, 0x2e, 0x94, 0x61, 0xb, 0x22, 0x37, 0xdc, 0xd, 0xa3, 0x60, 0x3d, 0xba, 0x87, 0x7f, 0x2e, 0x74, 0xd1, 0x1c, 0x31, 0x7c, 0x6e, 0x1b, 0xb0, 0xf6, 0xee, 0xff, 0x73, 0x64, 0x51, 0x7c, 0x25, 0x76, 0xef, 0x19, 0xe5, 0x3c, 0xe7, 0x77, 0xd4, 0x18, 0xd3, 0x18, 0x58, 0x6f, 0xc0, 0xed, 0x63, 0x79, 0x3, 0x2e, 0x2, 0xab, 0xf3, 0xf5, 0xd1, 0x8b, 0x89, 0x3a, 0x40, 0xf0, 0xca, 0x33, 0x60, 0x49, 0xa0, 0x8d, 0x3b, 0xe4, 0x72, 0xdd, 0xcf, 0xa1, 0xe, 0xe1, 0x94, 0x9, 0xe2, 0xc0, 0x73, 0xba, 0x20, 0x6d, 0xec, 0xb1, 0xd1, 0xfa, 0xbc, 0xb6, 0xec, 0xc9, 0x29, 0x3, 0x9d, 0xbd, 0x84, 0x2c, 0xa1, 0x42, 0xff, 0xf1, 0x4a, 0x67, 0xc, 0x39, 0xc4, 0x3e, 0x1f, 0x75, 0xca, 0xe0, 0xe5, 0x1, 0xf7, 0x36, 0xbb, 0x27, 0x92, 0x66, 0xaf, 0x5c, 0x51, 0xff, 0xdf, 0x65, 0x3f, 0xbd, 0x7b, 0xcd, 0xc4, 0x79, 0xf5, 0x5d, 0x5, 0x12, 0x59, 0x85, 0x97, 0xb2, 0x8f, 0xef, 0x32, 0xc7, 0x7a, 0xe4, 0x3, 0x72, 0xed, 0x1d, 0x1a, 0x33, 0x1c, 0xcd, 0x5c, 0xc4, 0x3d, 0xa9, 0xd4, 0xd2, 0x18, 0x33, 0x8e, 0x33, 0xec, 0xbd, 0x63, 0xe9, 0x8d, 0xbe, 0xbb, 0xd7, 0x3d, 0x73, 0xbd, 0x7e, 0xc4, 0xa2, 0xba, 0xc3, 0xbc, 0x61, 0xde, 0xcb, 0xef, 0x35, 0x19, 0xad, 0x21, 0xa8, 0x5c, 0xdd, 0x4c, 0x2, 0x8c, 0x66, 0xac, 0x91, 0x49, 0xfa, 0xcd, 0xc1, 0xe4, 0x58, 0xa5, 0x7b, 0xda, 0xb4, 0x8f, 0x90, 0xe0, 0x4c, 0x1d, 0x49, 0xe8, 0xbd, 0x85, 0xf6, 0xf9, 0x69, 0xa8, 0x7b, 0x78, 0x1c, 0xf4, 0x81, 0xcb, 0xb, 0x2a, 0x7b, 0xe1, 0x40, 0xd2, 0x1f, 0x85, 0x2c, 0x52, 0x5c, 0xf6, 0xe3, 0x5c, 0xdf, 0x68, 0x2e, 0x51, 0xce, 0x13, 0xee, 0xd5, 0xb6, 0x52, 0xb9, 0xd4, 0xa7, 0xaf, 0x7e, 0xad, 0x31, 0x8b, 0xa, 0xdc, 0x8c, 0x20, 0x5e, 0x91, 0x1b, 0x75, 0x86, 0x5e, 0x16, 0xf4, 0x77, 0x64, 0x5d, 0x9b, 0x26, 0x8c, 0x8e, 0x91, 0x1b, 0x42, 0x44, 0xde, 0x5a, 0x8d, 0xd2, 0xba, 0x64, 0xf4, 0x79, 0xc2, 0x5e, 0x1b, 0xed, 0x26, 0x2e, 0xd7, 0x47, 0x2c, 0xe4, 0x65, 0x2d, 0x26, 0xf9, 0x67, 0x9e, 0x74, 0xe5, 0x98, 0x81, 0x44, 0x7e, 0x74, 0x34, 0x38, 0x67, 0x6, 0x41, 0x47, 0x54, 0x7e, 0xe3, 0xc1, 0xac, 0x37, 0x46, 0x22, 0x58, 0xe1, 0xf3, 0xec, 0xc9, 0xcb, 0x2, 0x3c, 0xa8, 0x5a, 0x80, 0x8e, 0xe9, 0xa8, 0x58, 0x0, 0xe8, 0x95, 0x55, 0x6e, 0xcd, 0xfa, 0x73, 0x18, 0x23, 0xa9, 0x32, 0xb3, 0xfd, 0x7c, 0x19, 0xb6, 0x87, 0xac, 0x25, 0x41, 0xa8, 0xbe, 0x9e, 0x7a, 0xc, 0x51, 0xa3, 0xf7, 0x5, 0xd8, 0x4c, 0x8e, 0x42, 0x6e, 0xe0, 0x9a, 0x99, 0xdf, 0x24, 0x9c, 0x45, 0x71, 0x4d, 0xdc, 0xd5, 0x4d, 0xd5, 0x3c, 0xa0, 0xb8, 0x20, 0x4f, 0x32, 0x84, 0x14, 0x27, 0xb9, 0x74, 0x31, 0xd9, 0xf2, 0x24, 0x79, 0x50, 0xde, 0x3a, 0xf9, 0xbf, 0xac, 0xb8, 0x42, 0x7, 0x5, 0x33, 0x38, 0x3, 0xf8, 0x8f, 0x46, 0x3e, 0xa5, 0x37, 0x40, 0xdf, 0x4d, 0xf3, 0x6, 0xa4, 0x93, 0x69, 0x8d, 0x40, 0x1a, 0xcd, 0x70, 0x22, 0xc0, 0xe5, 0x43, 0x97, 0x15, 0x5a, 0xf8, 0x7d, 0xa6, 0x25, 0xc1, 0xc2, 0xc9, 0x6f, 0x39, 0xcb, 0xbf, 0x64, 0x10, 0xbf, 0xbe, 0xb7, 0x3, 0xcb, 0x6d, 0x80, 0xa9, 0x92, 0x45, 0x44, 0x7c, 0x54, 0xcd, 0x87, 0x44, 0x4b, 0x61, 0x2, 0x1b, 0x42, 0xc5, 0x2a, 0x69, 0x4f, 0x60, 0x3, 0x83, 0xd3, 0x91, 0x7b, 0x22, 0xe1, 0xff, 0x79, 0xf0, 0xbd, 0xf9, 0xaa, 0x15, 0x63, 0x3e, 0xf6, 0x19, 0xfb, 0x44, 0xf3, 0xf1, 0x65, 0xe5, 0x9e, 0xf9, 0x99, 0x91, 0x21, 0xd6, 0x1f, 0x66, 0x1d, 0x8a, 0x1c, 0xe4, 0x8c, 0xd4, 0xc6, 0x3b, 0x88, 0x8c, 0x4, 0xd9, 0x74, 0x3c, 0x8f, 0x11, 0x65, 0x10, 0x1b, 0x8b, 0xaf, 0xf, 0xee, 0x89, 0x38, 0x71, 0xb6, 0x1b, 0xe2, 0xd, 0xf7, 0x60, 0x7b, 0xb4, 0xca, 0x36, 0xd8, 0xdc, 0x4f, 0xae, 0xac, 0x64, 0x63, 0xce, 0x44, 0xc7, 0x6d, 0xea, 0x75, 0x33, 0x5b, 0x95, 0x47, 0xb0, 0x5f, 0x26, 0x64, 0xb7, 0xc3, 0xc2, 0x41, 0x98, 0x4c, 0x5d, 0x8a, 0xc6, 0x60, 0x4f, 0x45, 0xcf, 0xd7, 0x8f, 0xe9, 0x60, 0xc, 0xea, 0x6a, 0x75, 0xe2, 0xfb, 0x1, 0xc7, 0x79, 0x1c, 0xb2, 0xaa, 0x5e, 0x88, 0xc8, 0x9, 0xcf, 0xbd, 0xd1, 0x91, 0xef, 0x59, 0x13, 0xca, 0x86, 0x25, 0x59, 0xf3, 0x57, 0x21, 0x8, 0x6a, 0x1c, 0x95, 0x51, 0x39, 0x94, 0xa5, 0xae, 0xd9, 0x6, 0xe7, 0xb7, 0xa2, 0x24, 0xef, 0xab, 0x57, 0xa2, 0xb1, 0x2e, 0x2e, 0x1e, 0x72, 0xa5, 0x3f, 0x98, 0xce, 0x6a, 0x51, 0xac, 0xee, 0x68, 0x3c, 0xdf, 0x82, 0x87, 0xc2, 0x47, 0x9d, 0xa7, 0xff, 0x7b, 0x57, 0x16, 0x4e, 0x63, 0x9f, 0xd6, 0xbd, 0x6c, 0xd4, 0xd2, 0x69, 0x8, 0x81, 0xbb, 0x45, 0x5a, 0x36, 0xc8, 0x68, 0x39, 0x8b, 0x7c, 0xe4, 0xbd, 0x51, 0x75, 0x26, 0x63, 0x76, 0xb8, 0xf3, 0x7a, 0x54, 0x67, 0x5b, 0x8f, 0x76, 0x90, 0x15, 0xff, 0xd3, 0x2e, 0xfb, 0xb2, 0x1d, 0x1c, 0x37, 0x40, 0x94, 0xa5, 0x17, 0x19, 0x69, 0x16, 0xe3, 0x14, 0x2c, 0x24, 0xdf, 0x78, 0xd1, 0xc0, 0x3, 0xc1, 0x2a, 0x86, 0xed, 0xce, 0x3f, 0xc9, 0x40, 0xaf, 0x84, 0xbb, 0xc5, 0x60, 0x79, 0x2b, 0x40, 0x39, 0xa6, 0xc8, 0xbc, 0xdc, 0xc7, 0x29, 0xcf, 0x6d, 0x7c, 0x8f, 0x47, 0xff, 0x9d, 0xf1, 0xfa, 0x22, 0xbd, 0x37, 0x33, 0xe4, 0x6a, 0x30, 0x71, 0x7a, 0x9b, 0x59, 0xbf, 0x5, 0x55, 0x7c, 0xef, 0xa8, 0x91, 0x46, 0x9c, 0x9e, 0x15, 0x9e, 0xe0, 0x19, 0xb1, 0xce, 0x74, 0x18, 0xe8, 0x3, 0xd4, 0x8d, 0xa9, 0x11, 0x52, 0x2, 0xe7, 0x25, 0x53, 0xd6, 0x82, 0xc9, 0x2b, 0x69, 0xda, 0x86, 0x12, 0xe3, 0xe7, 0xda, 0x7b, 0xf2, 0x80, 0x6d, 0x5f, 0xfb, 0x64, 0xf0, 0xa6, 0x47, 0x56, 0x9c, 0x3d, 0x40, 0x15, 0x4c, 0xd7, 0xa1, 0xe6, 0xc8, 0xfd, 0x5a, 0x13, 0x8b, 0xd6, 0xc6, 0x48, 0xda, 0x97, 0xff, 0xbf, 0x6d, 0xd6, 0x79, 0x79, 0x9, 0xc2, 0x1d, 0x53, 0x20, 0xea, 0xb9, 0xad, 0x96, 0x2, 0xf0, 0xc8, 0xb2, 0x4a, 0xd, 0x73, 0x33, 0xa3, 0x33, 0x19, 0x25, 0x7a, 0x2b, 0x12, 0x97, 0xaf, 0x45, 0x33, 0x23, 0xc1, 0x9c, 0x34, 0xc7, 0x36, 0xb0, 0x0, 0xf4, 0x73, 0x88, 0xde, 0x87, 0x56, 0xaf, 0x95, 0x75, 0x70, 0xa3, 0x47, 0x28, 0x92, 0xc1, 0xde, 0xf6, 0x7f, 0x58, 0x18, 0xe0, 0xb7, 0xcb, 0x91, 0xc1, 0x2f, 0xce, 0x3e, 0x28, 0x6e, 0x56, 0xdc, 0x20, 0x1c, 0x8b, 0xef, 0xc2, 0x78, 0xdc, 0xd2, 0x2e, 0x45, 0x5e, 0x53, 0xe6, 0x51, 0xed, 0x7f, 0x84, 0x29, 0x54, 0x56, 0xb3, 0xe, 0xd0, 0x3d, 0x67, 0xa, 0x86, 0x42, 0xc1, 0xfd, 0xb, 0xdd, 0x62, 0x8b, 0x27, 0x36, 0x1b, 0x72, 0x71, 0x57, 0x1a, 0x71, 0x3e, 0x29, 0x5a, 0x10, 0x27, 0x19, 0x76, 0x7f, 0xce, 0x1c, 0x0, 0xdf, 0x7d, 0x4c, 0xd0, 0x11, 0xb0, 0x81, 0xb6, 0xf7, 0x96, 0x19, 0xac, 0xa3, 0x92, 0xf7, 0xdf, 0x16, 0x30, 0xae, 0xc4, 0xf, 0xb, 0x12, 0xc, 0x58, 0xc7, 0xb8, 0xe, 0x96, 0x97, 0xf6, 0x35, 0xc0, 0xd3, 0x4, 0xde, 0xe2, 0x2c, 0x9f, 0x59, 0xf1, 0x28, 0x92, 0xad, 0xd2, 0xf8, 0x50, 0x24, 0x89, 0xab, 0xc1, 0x29, 0xb8, 0x9b, 0x12, 0x48, 0x7d, 0xc9, 0xaf, 0x50, 0x3a, 0xe1, 0x85, 0xd7, 0x24, 0xe0, 0x6e, 0xa9, 0x63, 0x27, 0xba, 0x45, 0x27, 0x7b, 0x6d, 0xfb, 0x3b, 0x1, 0x34, 0x65, 0x95, 0x42, 0x2a, 0xad, 0x1b, 0x67, 0x2, 0x62, 0x53, 0xbc, 0xd0, 0xe8, 0x7e, 0x4f, 0x3d, 0xea, 0x31, 0xdc, 0xc3, 0x42, 0xf, 0x2a, 0xf2, 0x32, 0x38, 0xf4, 0xa2, 0x87, 0x1a, 0x1a, 0x6, 0x61, 0xc6, 0x6b, 0x57, 0x45, 0x4b, 0xf6, 0xc9, 0x78, 0x9, 0xd2, 0x5f, 0xfb, 0x6d, 0x3c, 0xac, 0xab, 0xb7, 0x90, 0x1b, 0xe0, 0xb7, 0x0, 0x6a, 0xf3, 0x27, 0x36, 0x9e, 0x42, 0xe9, 0xcd, 0x33, 0xf7, 0x68, 0xcb, 0xe8, 0xbf, 0xdc, 0x81, 0x46, 0x3a, 0x95, 0xe3, 0xc2, 0x3, 0x41, 0x24, 0xff, 0x96, 0xe3, 0xe7, 0xad, 0x6, 0x1b, 0x1c, 0x56, 0x33, 0x41, 0x34, 0xa7, 0xd0, 0x65, 0xac, 0xb9, 0x20, 0xe1, 0xd9, 0x19, 0x79, 0x92, 0x7, 0x6f, 0x6f, 0x57, 0x5a, 0x95, 0x1f, 0x69, 0x46, 0xc8, 0xcf, 0xa0, 0x65, 0x9d, 0x44, 0xa6, 0xc0, 0x2b, 0x2e, 0x3d, 0x9b, 0xed, 0x67, 0x97, 0xb8, 0x41, 0xa5, 0x7b, 0xc7, 0x15, 0x92, 0xdc, 0x4, 0x1b, 0xb2, 0xd1, 0xaf, 0x1e, 0xfe, 0x67, 0x10, 0xc4, 0xb7, 0xbf, 0x85, 0xa7, 0x29, 0x69, 0x6a, 0x3c, 0x7, 0xa2, 0x79, 0xdb, 0x5f, 0xa7, 0xf4, 0x36, 0x25, 0x6f, 0x69, 0xca, 0x9b, 0x80, 0x6d, 0xd2, 0x9a, 0x85, 0x7b, 0x7e, 0x19, 0x3b, 0x69, 0xc0, 0xf2, 0x6, 0x73, 0xa5, 0xc0, 0x8e, 0xf4, 0xd9, 0x6a, 0x65, 0x62, 0x2, 0x4d, 0x9a, 0x1f, 0x90, 0xc7, 0xe7, 0x2b, 0x60, 0x38, 0xb9, 0x43, 0x94, 0xc2, 0xbe, 0xa4, 0x73, 0x0, 0xf, 0xfc, 0x97, 0x3, 0xd0, 0x5f, 0x67, 0x8d, 0x6f, 0xa4, 0x8f, 0x66, 0x5b, 0x8c, 0x10, 0x22, 0x15, 0xc9, 0x4a, 0x37, 0x14, 0x2e, 0xe4, 0x83, 0x2, 0xd1, 0xa7, 0xef, 0x92, 0x4a, 0x2, 0x6d, 0xb, 0xf9, 0x6d, 0x3e, 0x67, 0x26, 0x1f, 0x58, 0x57, 0xd4, 0x14, 0xf9, 0x5, 0x12, 0x8c, 0xdf, 0x67, 0x62, 0x51, 0xc8, 0xf5, 0x62, 0x24, 0x6c, 0xe0, 0xb4, 0xf1, 0x97, 0x11, 0xc1, 0x90, 0x9c, 0xdd, 0xb3, 0x1c, 0x2d, 0x6e, 0x9e, 0x57, 0x90, 0x79, 0x5a, 0x2d, 0xf8, 0x28, 0x95, 0x61, 0x22, 0x6, 0xcd, 0x89, 0xe1, 0x90, 0x74, 0xdc, 0xb0, 0x19, 0xdf, 0x39, 0x29, 0xbd, 0x77, 0x71, 0x91, 0xc0, 0x5, 0x85, 0xb1, 0x18, 0xc4, 0xd9, 0x17, 0x31, 0xd, 0x47, 0xd5, 0xee, 0xa0, 0x3c, 0x89, 0x6c, 0xeb, 0x92, 0xef, 0x39, 0x40, 0x19, 0xa4, 0x44, 0x82, 0xef, 0x33, 0x45, 0x95, 0x75, 0x2d, 0x2d, 0x3c, 0x85, 0xac, 0x62, 0x54, 0xad, 0x8f, 0x59, 0xb7, 0xda, 0x83, 0x48, 0xa4, 0xd7, 0x32, 0x6d, 0xd1, 0xf5, 0xf7, 0xbb, 0x81, 0xd8, 0x1d, 0xfd, 0x2d, 0x4f, 0xfb, 0x95, 0x80, 0xc5, 0x5d, 0x54, 0xf2, 0xae, 0x39, 0xe2, 0xb9, 0x39, 0x1e, 0x4d, 0xa, 0xa7, 0x9, 0x46, 0xb2, 0xbb, 0x8e, 0x33, 0x3e, 0xb3, 0xd3, 0x61, 0x61, 0x54, 0xbd, 0x15, 0xc2, 0x1d, 0x5, 0x6, 0xda, 0x3d, 0x94, 0x34, 0xec, 0x9d, 0xee, 0xca, 0x82, 0x67, 0x4b, 0x8b, 0x8e, 0xe9, 0x50, 0x8e, 0x1f, 0x3a, 0xea, 0x91, 0xa5, 0x8e, 0x35, 0x24, 0x94, 0xc1, 0xe1, 0xa9, 0x27, 0xc8, 0xc4, 0x71, 0x94, 0x7a, 0xbb, 0x9, 0x5d, 0xaa, 0x8b, 0xa3, 0x9c, 0x8f, 0xb5, 0x57, 0xc0, 0xb4, 0x4a, 0xfb, 0x19, 0xee, 0xe0, 0x24, 0x5e, 0x6, 0x1, 0x4a, 0xbf, 0x77, 0xb8, 0x7, 0x51, 0x80, 0xcf, 0xb9, 0xbe, 0xb3, 0xa1, 0x81, 0x8f, 0x3f, 0x2b, 0x97, 0xa0, 0x64, 0x27, 0xce, 0x45, 0xe1, 0x3c, 0x4f, 0xf7, 0xf5, 0xc4, 0x28, 0xcc, 0xf1, 0xd0, 0xe2, 0x5b, 0x98, 0xf3, 0xc7, 0xd, 0xc, 0xee, 0xde, 0xc3, 0x25, 0x9e, 0xd3, 0xc0, 0xad, 0xf4, 0x7d, 0x80, 0xa0, 0x67, 0xc4, 0x20, 0x98, 0x61, 0x40, 0x58, 0x5a, 0xcf, 0x61, 0x93, 0xbc, 0xe, 0x44, 0x0, 0xd6, 0x2a, 0x42, 0xa6, 0x29, 0x77, 0x52, 0x49, 0xf4, 0x73, 0x3f, 0x75, 0x6a, 0xb2, 0xef, 0x79, 0xfc, 0x44, 0x8d, 0xf8, 0x94, 0x1c, 0x1d, 0x4d, 0xdc, 0xc0, 0x3b, 0xc5, 0xfb, 0xf0, 0x49, 0xd0, 0xa0, 0x98, 0x36, 0xb, 0xea, 0x47, 0xb7, 0x1e, 0x29, 0x8d, 0x22, 0xfe, 0xc3, 0x18, 0x52, 0xd6, 0x29, 0xc1, 0x43, 0xb5, 0x4, 0xb8, 0x35, 0x16, 0xc5, 0xac, 0xd1, 0xb8, 0x59, 0xc8, 0xfa, 0x68, 0xe6, 0xd6, 0x95, 0x7d, 0x69, 0x10, 0x6c, 0xdb, 0x2f, 0x45, 0xcb, 0x1a, 0x25, 0x30, 0x6e, 0x50, 0x6, 0xf3, 0x50, 0x65, 0x69, 0xee, 0x31, 0xd9, 0x48, 0x35, 0x93, 0x8, 0xe5, 0xb3, 0xb0, 0x5b, 0xef, 0xb0, 0xf4, 0x4f, 0x9a, 0x94, 0xb8, 0xbd, 0xf3, 0x88, 0x3c, 0x26, 0x83, 0x8b, 0x20, 0x89, 0x99, 0x1d, 0xdb, 0x30, 0x7c, 0x14, 0xab, 0x3, 0xdf, 0xd4, 0x44, 0xfd, 0x15, 0x65, 0xed, 0xc5, 0xb0, 0x2e, 0xe7, 0x75, 0x2f, 0xa1, 0x17, 0x89, 0xfe, 0xe3, 0x28, 0xe0, 0xbb, 0x6c, 0x7a, 0xeb, 0xc0, 0xaa, 0xc5, 0xe4, 0xfe, 0xe1, 0xe7, 0x40, 0x51, 0x7e, 0x69, 0xa5, 0xed, 0x47, 0x7f, 0x1f, 0x92, 0x54, 0xb4, 0x37, 0x1, 0x45, 0x4f, 0x85, 0x81, 0xcd, 0x95, 0x84, 0x5f, 0x62, 0xdb, 0x83, 0xe5, 0xb2, 0xcd, 0xa1, 0xb, 0xbe, 0x74, 0xe4, 0x6d, 0x5e, 0xdd, 0x7c, 0xfd, 0xe4, 0xae, 0x39, 0x17, 0x10, 0xe8, 0x7d, 0x43, 0x51, 0x42, 0x90, 0xad, 0xfd, 0x81, 0x78, 0x4f, 0x91, 0x25, 0xab, 0xf6, 0x2c, 0xd, 0x56, 0x8f, 0x63, 0xcf, 0xe5, 0x4d, 0x5, 0xcc, 0x3f, 0xc0, 0xb, 0xb9, 0x50, 0x63, 0xb0, 0x18, 0xa7, 0x11, 0x28, 0x93, 0xff, 0x11, 0xbd, 0x9b, 0x30, 0xb3, 0x0, 0x2f, 0x74, 0x49, 0x4, 0xb4, 0x6f, 0x8a, 0x10, 0x76, 0x66, 0xd2, 0x51, 0xa8, 0xe0, 0xb9, 0x1b, 0x80, 0xc1, 0x90, 0x89, 0xbf, 0xbe, 0x99, 0xd0, 0xd, 0x61, 0x70, 0x7d, 0x51, 0xa, 0xb2, 0x5e, 0x11, 0x83, 0xf6, 0x2d, 0x6c, 0x33, 0x34, 0xfe, 0x77, 0x67, 0xfc, 0xc6, 0xcd, 0xc7, 0xdd, 0x70, 0x68, 0x83, 0xde, 0x87, 0xb, 0x88, 0x5, 0x61, 0xb1, 0xbe, 0xdd, 0xc4, 0xd9, 0xca, 0x84, 0x35, 0x34, 0xe2, 0x4b, 0x75, 0x3d, 0x1c, 0x4f, 0x16, 0xb3, 0x94, 0xc8, 0xe6, 0xc1, 0x3a, 0xed, 0x31, 0x7, 0x4c, 0x90, 0x6b, 0x4f, 0xec, 0x7d, 0x32, 0x26, 0x55, 0x38, 0x1c, 0xc6, 0xae, 0x7b, 0x26, 0x29, 0x3b, 0xfd, 0xc1, 0x58, 0x9d, 0x42, 0xff, 0xeb, 0xb8, 0x93, 0xb, 0x8c, 0xc0, 0x86, 0xd8, 0x22, 0x53, 0x89, 0xdb, 0x2d, 0xb2, 0x0, 0x5e, 0xca, 0xb7, 0xd8, 0xfe, 0xc3, 0x17, 0x1, 0x33, 0xcf, 0xf6, 0x1, 0x9c, 0x81, 0xfa, 0xc6, 0x9a, 0xd4, 0x54, 0xbd, 0xf, 0x3c, 0xbd, 0xa6, 0xda, 0x6d, 0xcf, 0xa2, 0x49, 0x80, 0x68, 0x30, 0x74, 0x91, 0x5a, 0x76, 0x72, 0x76, 0x3c, 0x6, 0x6a, 0xa, 0xbf, 0xb9, 0x47, 0x5, 0x64, 0xce, 0xa3, 0x37, 0x33, 0xa6, 0xb1, 0x98, 0xc8, 0x99, 0xc0, 0x42, 0x61, 0x69, 0xee, 0x5, 0xd, 0x80, 0xab, 0xb5, 0xd6, 0xac, 0xa5, 0x11, 0x59, 0x3f, 0x96, 0xf1, 0x63, 0x10, 0x20, 0x46, 0x57, 0x61, 0xee, 0xba, 0xa, 0x21, 0x96, 0xa5, 0x49, 0xa6, 0xd9, 0x36, 0x8c, 0x13, 0xa7, 0x1b, 0x63, 0x43, 0xd0, 0xae, 0x46, 0xcd, 0xd6, 0x58, 0x8a, 0xdd, 0xc6, 0x14, 0xd2, 0x34, 0x66, 0x8e, 0xb5, 0x33, 0xb6, 0x9c, 0x28, 0xc3, 0x1b, 0xf8, 0x47, 0x50, 0x30, 0xc1, 0xe5, 0x77, 0xa1, 0x26, 0xe2, 0xe0, 0xed, 0x12, 0x4f, 0x6f, 0x5a, 0x6, 0x62, 0xca, 0x2c, 0x33, 0x7b, 0x48, 0xbe, 0x67, 0xcd, 0x7e, 0xa4, 0xc3, 0x1c, 0xed, 0x47, 0xf, 0x87, 0xb1, 0x1e, 0x74, 0x14, 0x8b, 0x59, 0xe7, 0x58, 0x6e, 0xe6, 0x99, 0x6e, 0xe7, 0x1f, 0xf5, 0x76, 0x28, 0x82, 0x36, 0x89, 0x25, 0xd6, 0x11, 0xcc, 0x11, 0x68, 0x8a, 0x18, 0x57, 0x22, 0x46, 0x65, 0x7e, 0xfc, 0xc3, 0xcd, 0xdb, 0x2f, 0xc8, 0x9f, 0x2c, 0xdf, 0xb7, 0x5b, 0x20, 0x7b, 0xdd, 0x52, 0x4e, 0x1d, 0x3b, 0x14, 0xe4, 0xa2, 0x47, 0x78, 0x94, 0x95, 0xb6, 0x48, 0x11, 0xa9, 0xef, 0x93, 0xd7, 0xe4, 0x5, 0x75, 0x96, 0x2e, 0xfd, 0x46, 0xd4, 0x7e, 0xb4, 0x2f, 0x23, 0xf3, 0xeb, 0xe2, 0xd0, 0xe, 0x8f, 0xdd, 0x2e, 0x2a, 0xc5, 0x9e, 0xf, 0xf8, 0xff, 0xdb, 0x5f, 0xb5, 0x75, 0x33, 0xb4, 0x9a, 0xad, 0x11, 0xc, 0x2e, 0xe4, 0x20, 0x78, 0xca, 0x73, 0x46, 0x1b, 0x25, 0xe6, 0xa0, 0xe0, 0xac, 0x6d, 0x2d, 0x93, 0xd, 0x4c, 0x5c, 0x6b, 0xbc, 0x89, 0x9a, 0xa1, 0x5d, 0x9, 0x77, 0xcd, 0x38, 0x34, 0xfb, 0xbd, 0x48, 0x8d, 0x39, 0xa9, 0x24, 0x2f, 0x92, 0xb8, 0x41, 0x55, 0x51, 0xc4, 0x5d, 0x1d, 0x54, 0x9e, 0x9d, 0xfc, 0x41, 0xee, 0x86, 0xb1, 0xd, 0x61, 0xbf, 0xd5, 0x5e, 0x34, 0x9f, 0x9d, 0x9f, 0xca, 0xac, 0xf6, 0x5d, 0xa6, 0x7b, 0x3e, 0x86, 0x94, 0x36, 0xa8, 0x7a, 0x78, 0xda, 0x9d, 0x53, 0xba, 0xb5, 0x8e, 0xb7, 0xda, 0xf9, 0x9, 0xc3, 0x1b, 0x48, 0xd6, 0x33, 0x20, 0xfb, 0x5a, 0x4, 0x21, 0xa6, 0xaf, 0x30, 0xce, 0xf4, 0x76, 0x3d, 0xc9, 0xa, 0x7b, 0x77, 0xa6, 0xd6, 0xeb, 0xd7, 0xe0, 0xf5, 0x78, 0xd, 0x7b, 0xe3, 0xa6, 0x2b, 0x49, 0xf5, 0x76, 0x96, 0xc0, 0x16, 0x25, 0x3a, 0x5f, 0xc0, 0x9a, 0x88, 0xf8, 0x4b, 0x1e, 0x2b, 0xba, 0xf0, 0x4d, 0xe0, 0x2c, 0xb4, 0xcd, 0x1b, 0x34, 0x62, 0x50, 0xfd, 0x5c, 0x5d, 0x93, 0x20, 0xac, 0xac, 0x82, 0x33, 0x33, 0x30, 0x8a, 0xe, 0xb0, 0x98, 0x51, 0xc4, 0x38, 0x94, 0x42, 0x24, 0x8e, 0x1f, 0x5a, 0x3c, 0x18, 0x99, 0x3f, 0xf0, 0x55, 0xd2, 0x9d, 0xfa, 0x18, 0xb1, 0xfd, 0xa6, 0x62, 0x7f, 0xc2, 0x90, 0x8b, 0xb1, 0xb9, 0x91, 0xc1, 0x6e, 0x39, 0xf7, 0x32, 0xf7, 0xe8, 0xab, 0x86, 0xe7, 0xb, 0x91, 0x2d, 0x4a, 0x52, 0xf5, 0xa0, 0xc5, 0xa, 0xef, 0xad, 0x32, 0x5d, 0x94, 0xf6, 0x25, 0x97, 0xd6, 0xd4, 0x53, 0x9b, 0x89, 0xba, 0x10, 0x5, 0xc6, 0x76, 0x2a, 0x3, 0x1c, 0xb1, 0x58, 0x57, 0x59, 0x5d, 0x9b, 0xa4, 0x40, 0x4f, 0x65, 0xc8, 0x93, 0x28, 0x85, 0xb, 0x47, 0x94, 0x37, 0x52, 0xf4, 0xf6, 0x3e, 0xb6, 0xc, 0x69, 0x5e, 0x10, 0x29, 0x7d, 0x95, 0xd4, 0xb0, 0x59, 0x65, 0x64, 0x63, 0x43, 0x48, 0x7d, 0x8e, 0x8a, 0x78, 0x49, 0x3c, 0x27, 0xa8, 0xf4, 0xa9, 0x54, 0xce, 0x34, 0xb8, 0x6c, 0x40, 0xee, 0x9b, 0xda, 0x6f, 0xf8, 0xf, 0x26, 0x1c, 0x1e, 0x50, 0x47, 0x95, 0xe, 0x74, 0x79, 0xbd, 0x9d, 0xc6, 0xd2, 0xf9, 0x64, 0x88, 0xde, 0x21, 0x1, 0x2e, 0x23, 0x85, 0xd9, 0x42, 0x7b, 0x59, 0x2e, 0x77, 0x17, 0x45, 0x53, 0xc5, 0xc3, 0xb6, 0x55, 0xfb, 0xb9, 0x9c, 0x51, 0x47, 0xe5, 0x53, 0xbb, 0xd, 0x60, 0x28, 0x84, 0x9f, 0x1, 0x34, 0xf1, 0x1a, 0x79, 0x81, 0xe0, 0x76, 0x31, 0x47, 0x5a, 0x8, 0xc, 0xfb, 0x35, 0x63, 0x22, 0x3e, 0x2f, 0xe0, 0x73, 0xe5, 0x67, 0xbe, 0x38, 0x28, 0xfb, 0x4b, 0xc4, 0x84, 0x40, 0xb9, 0x1d, 0x89, 0x5, 0xc5, 0xc2, 0xc1, 0x96, 0x73, 0x13, 0x31, 0x91, 0x4b, 0x44, 0x58, 0xd9, 0x3f, 0xfa, 0xeb, 0x6a, 0xc1, 0x55, 0x6e, 0xe5, 0xe9, 0xdc, 0x9c, 0xac, 0xd0, 0x46, 0xaa, 0x2c, 0xd3, 0xce, 0x48, 0x71, 0xeb, 0xe8, 0x1f, 0xb6, 0xef, 0xc7, 0x10, 0x2e, 0x4d, 0xcf, 0x97, 0xff, 0xda, 0x35, 0xd8, 0x9f, 0xdd, 0x99, 0x1d, 0x43, 0x8d, 0xa1, 0xed, 0x9b, 0xe1, 0xcc, 0xd5, 0xf3, 0x3d, 0xb, 0x69, 0xf7, 0xc9, 0x6e, 0x32, 0xb7, 0x6d, 0x65, 0xfb, 0x97, 0x9c, 0x73, 0x95, 0x8c, 0x44, 0x71, 0xb2, 0xc1, 0x98, 0xe2, 0x21, 0x9c, 0x89, 0xea, 0xec, 0x65, 0x34, 0x57, 0x35, 0x37, 0x91, 0x72, 0xe5, 0xd0, 0x3d, 0xeb, 0x65, 0x21, 0x2b, 0x7c, 0xbd, 0x80, 0xc0, 0xf1, 0xc0, 0xdc, 0xe7, 0x16, 0x1e, 0xdf, 0x32, 0xc8, 0x7, 0xc, 0xad, 0x8f, 0xe5, 0x97, 0x9b, 0x43, 0xc3, 0x41, 0xa4, 0x50, 0xee, 0x73, 0x20, 0xe, 0x1f, 0x8e, 0xa4, 0x43, 0x6, 0x23, 0xa3, 0xc6, 0xeb, 0xce, 0x8b, 0x7f, 0x3c, 0x53, 0xb5, 0xe1, 0x63, 0x71, 0xb3, 0x47, 0xa6, 0x4d, 0xfa, 0x26, 0xb, 0x41, 0x4c, 0xd, 0x65, 0x1a, 0xfb, 0xfd, 0xe8, 0xdd, 0x64, 0x3a, 0xa5, 0xd, 0x73, 0xc, 0xd8, 0x88, 0xdf, 0x86, 0xe7, 0xc, 0xca, 0xa, 0x8f, 0x23, 0x27, 0x92, 0xcf, 0x19, 0xfd, 0x4c, 0xac, 0xab, 0xd4, 0xad, 0x86, 0x63, 0x7f, 0xde, 0x5c, 0x5e, 0xa0, 0xc4, 0xb6, 0x17, 0x7, 0x56, 0xaa, 0xc9, 0x58, 0x57, 0x2b, 0x17, 0x8c, 0xe7, 0x1, 0x5f, 0xc5, 0x65, 0xa2, 0xf, 0x1e, 0x4d, 0x12, 0xdc, 0xfb, 0xfd, 0xb2, 0x1f, 0xf8, 0x23, 0xf2, 0x9b, 0x3c, 0x8d, 0x23, 0xcf, 0x6b, 0xbb, 0x94, 0x3, 0x8d, 0x2c, 0x5c, 0x3c, 0x16, 0x6, 0x77, 0xc1, 0x56, 0x6f, 0x62, 0x6c, 0x2d, 0x9a, 0xda, 0x9, 0x9e, 0x90, 0x51, 0x53, 0x45, 0xe, 0x73, 0xa3, 0x25, 0x68, 0x8e, 0xe5, 0x79, 0xa, 0xef, 0x3, 0xc0, 0x8b, 0x8c, 0x9d, 0xfd, 0xec, 0x6b, 0x5, 0xb6, 0x78, 0x3f, 0x54, 0x6d, 0xb3, 0x90, 0xa0, 0x53, 0x32, 0xf1, 0x33, 0xf9, 0x32, 0x44, 0x79, 0x97, 0x49, 0xad, 0x82, 0x2, 0xf5, 0x21, 0x47, 0x3c, 0x49, 0x86, 0x13, 0x14, 0xd7, 0x9e, 0xd4, 0xf1, 0x13, 0xc4, 0xdc, 0xd8, 0xb4, 0xc2, 0x6a, 0x27, 0xd6, 0xd3, 0x18, 0xf8, 0xbc, 0x47, 0x53, 0x45, 0x7a, 0x15, 0xf, 0x44, 0xc9, 0x94, 0x26, 0x12, 0xf4, 0x13, 0x4a, 0xdd, 0x0, 0x77, 0x39, 0x7c, 0xbf, 0xab, 0xe3, 0x39, 0xef, 0x4e, 0x6c, 0x91, 0x8a, 0xa8, 0x72, 0x9c, 0x47, 0x6, 0x46, 0xdb, 0xf8, 0x49, 0xb1, 0xb3, 0xd3, 0xc2, 0x54, 0xab, 0xb1, 0x44, 0xff, 0x9, 0x3d, 0x83, 0x4b, 0x36, 0xac, 0x75, 0x88, 0x9b, 0x5c, 0xed, 0xf0, 0x12, 0x77, 0xc9, 0xca, 0xd, 0x52, 0x81, 0x2, 0x8f, 0x5d, 0xf5, 0x7a, 0x37, 0x62, 0x93, 0x46, 0x3b, 0x47, 0xf7, 0x6, 0xd6, 0x84, 0x6f, 0xfe, 0x51, 0xca, 0x5b, 0x8a, 0xa7, 0x4f, 0x27, 0x84, 0x4b, 0x6f, 0x4b, 0x76, 0x1d, 0xc0, 0x64, 0xb9, 0xdc, 0x91, 0x30, 0xfa, 0x46, 0xb8, 0x3a, 0xa, 0xf6, 0x26, 0x1f, 0x6d, 0xf0, 0xcf, 0xc0, 0x8a, 0x5f, 0xf5, 0xb, 0xd, 0x54, 0xeb, 0x50, 0xc1, 0x82, 0x88, 0x59, 0xd9, 0xd0, 0x93, 0xc2, 0x51, 0x2c, 0xa7, 0xa4, 0x22, 0x8a, 0x19, 0x3c, 0x64, 0xf6, 0x57, 0x6c, 0xf8, 0x10, 0x57, 0x39, 0x20, 0xb0, 0x91, 0xab, 0x97, 0xc0, 0xdb, 0x70, 0x19, 0x6c, 0x71, 0xe1, 0x9a, 0xf8, 0x3d, 0xe5, 0xcc, 0xa2, 0x2b, 0x7a, 0x5b, 0x4c, 0xd6, 0x85, 0xfc, 0x99, 0x9a, 0x79, 0xb2, 0x2a, 0xa8, 0xbe, 0x5a, 0xfa, 0xee, 0x94, 0x37, 0xd4, 0x62, 0xfe, 0x93, 0xb9, 0x11, 0xc6, 0x8d, 0x6, 0xf6, 0x1e, 0x28, 0x37, 0xaf, 0xf1, 0x69, 0x69, 0x9e, 0x83, 0x39, 0xc8, 0x46, 0xf5, 0x6a, 0x23, 0xec, 0x77, 0xc9, 0xc7, 0x78, 0x55, 0x62, 0x76, 0x5, 0x5c, 0xbd, 0x4c, 0x29, 0xde, 0xa8, 0xc0, 0xa4, 0xd1, 0x7c, 0xf, 0xaf, 0xdd, 0xe2, 0xd4, 0xf4, 0x95, 0x4f, 0x70, 0xfc, 0x43, 0x82, 0x12, 0x18, 0xe7, 0x50, 0xda, 0xab, 0xc5, 0x94, 0x7c, 0x6a, 0xbb, 0x3, 0x35, 0x74, 0x94, 0x2, 0x14, 0xbf, 0x8f, 0x79, 0xab, 0x53, 0xa1, 0x2, 0x4e, 0x28, 0x2f, 0x7a, 0xc8, 0x26, 0xef, 0xf8, 0xdc, 0x9e, 0xf9, 0x5, 0x5d, 0x92, 0x3c, 0x86, 0xdd, 0x35, 0x9b, 0x40, 0xe6, 0x81, 0x6d, 0x97, 0x70, 0x91, 0xe9, 0xdc, 0x99, 0x5a, 0x3a, 0xef, 0xe6, 0x1d, 0x13, 0x53, 0xec, 0x80, 0xbc, 0xaa, 0x35, 0xb3, 0x40, 0xc9, 0x64, 0x7c, 0x41, 0x19, 0xe9, 0x97, 0x6e, 0xaf, 0xf5, 0x4e, 0x45, 0x51, 0x9c, 0x30, 0x16, 0xed, 0xac, 0x9b, 0x3c, 0x76, 0x4, 0x48, 0x46, 0x81, 0x4d, 0x17, 0x6d, 0xe2, 0x97, 0x74, 0x19, 0x35, 0x86, 0x42, 0x5a, 0xa0, 0x9, 0xb1, 0xed, 0xad, 0x71, 0xfa, 0x10, 0xa4, 0x6e, 0xf7, 0x95, 0xda, 0xb7, 0xca, 0x19, 0x72, 0x1f, 0xd1, 0x88, 0xbe, 0xe7, 0x23, 0xc3, 0x74, 0x3c, 0x10, 0xdb, 0xb2, 0xd6, 0x91, 0xbb, 0xe1, 0xe3, 0xc2, 0xe2, 0x92, 0xb1, 0x3d, 0x59, 0xbe, 0xc1, 0x25, 0x5e, 0xb4, 0xca, 0x49, 0xf9, 0x53, 0x23, 0x2f, 0x6e, 0xa, 0x16, 0xe6, 0x39, 0x6a, 0xa, 0xd7, 0x57, 0x13, 0x6e, 0xe2, 0x13, 0x2, 0x9c, 0x3e, 0x62, 0x8e, 0x1a, 0x1c, 0x74, 0x73, 0xb2, 0x99, 0x93, 0x8d, 0xba, 0xa9, 0xdf, 0x54, 0x32, 0x8c, 0x59, 0xc, 0x40, 0xc, 0x31, 0x86, 0x3a, 0x73, 0x8, 0xb0, 0x0, 0xf4, 0x66, 0xe5, 0x57, 0x1f, 0x2e, 0x51, 0x7d, 0x69, 0xa0, 0xcb, 0xd0, 0x9c, 0x50, 0x40, 0xb2, 0xc2, 0x37, 0x95, 0x8c, 0x3d, 0x35, 0x57, 0x69, 0x9c, 0x98, 0x5f, 0x2f, 0x2b, 0x3c, 0x4c, 0x72, 0xc9, 0xbe, 0x7d, 0xa8, 0x1f, 0x3, 0xff, 0xa8, 0x2f, 0xe0, 0x90, 0x1f, 0xd1, 0xd5, 0xcf, 0x53, 0x5c, 0xd1, 0xf4, 0xfc, 0x4d, 0x31, 0x48, 0xae, 0x4f, 0x40, 0xb3, 0xef, 0x5f, 0xca, 0xb4, 0xa3, 0xbb, 0xf0, 0xb6, 0x8, 0x90, 0xd1, 0xf, 0xe2, 0xfc, 0x19, 0x49, 0xdc, 0x2a, 0xd1, 0x1b, 0x8d, 0xd1, 0xb4, 0x18, 0x9c, 0x8e, 0x1c, 0xc8, 0x88, 0x3a, 0x2f, 0xb2, 0x49, 0x29, 0x7c, 0xcc, 0x2c, 0xb1, 0xf5, 0x86, 0x7f, 0x98, 0xde, 0x5, 0xd8, 0x1a, 0xf6, 0xa2, 0x70, 0x79, 0x72, 0xed, 0x72, 0x21, 0x74, 0x69, 0xc7, 0x4e, 0x43, 0xd7, 0x8e, 0x2c, 0x9f, 0x3e, 0xb4, 0x52, 0x2c, 0x21, 0xf8, 0xe, 0x49, 0xd1, 0x7b, 0x5a, 0xb7, 0x0, 0xea, 0xfd, 0x2f, 0x5b, 0xa1, 0x8b, 0x95, 0xbf, 0x3e, 0xb2, 0xc7, 0xf2, 0xaa, 0xba, 0x6c, 0x69, 0x39, 0x20, 0xb4, 0x43, 0x96, 0x34, 0xbe, 0x2, 0x94, 0xde, 0x5b, 0x1f, 0xc4, 0xa5, 0xef, 0x39, 0x6b, 0x9d, 0xbe, 0x3a, 0x82, 0x7e, 0x7, 0x47, 0xde, 0x7f, 0x20, 0x2a, 0x28, 0x29, 0x86, 0x65, 0xfc, 0x74, 0xc3, 0x3b, 0xc4, 0x4, 0x6, 0x54, 0x1d, 0xe, 0xd4, 0x35, 0xed, 0x6f, 0x48, 0x3a, 0x3a, 0xb3, 0xa4, 0x16, 0xa1, 0xa4, 0x43, 0xee, 0x6c, 0x49, 0x70, 0x91, 0xaf, 0x8a, 0x94, 0xad, 0xe1, 0xdb, 0x4a, 0x17, 0x99, 0xdf, 0x51, 0x54, 0xa, 0xa3, 0x47, 0x8a, 0xa1, 0x91, 0x17, 0x9e, 0xd1, 0xbd, 0xca, 0x7c, 0x2a, 0xf1, 0xfc, 0xec, 0x3a, 0xb5, 0x12, 0x71, 0xd2, 0xc6, 0xb5, 0xfa, 0x95, 0xb3, 0x1e, 0x56, 0x87, 0x93, 0x1e, 0x8, 0x9, 0xa1, 0x6d, 0xa3, 0x28, 0x58, 0x93, 0x8c, 0xd7, 0x80, 0x97, 0xfb, 0x15, 0xb0, 0x40, 0xe5, 0x32, 0x3, 0x94, 0xd5, 0xfa, 0x66, 0xf4, 0xe0, 0x1b, 0xb5, 0xd7, 0xc9, 0x71, 0xf6, 0xd9, 0xd6, 0x41, 0xcd, 0xad, 0xfa, 0x17, 0xac, 0xa2, 0xb1, 0x28, 0x1e, 0x6c, 0xba, 0x5f, 0x1e, 0x20, 0xed, 0x33, 0x78, 0x6a, 0x6, 0x2b, 0x46, 0xf, 0xf9, 0x19, 0x97, 0xd9, 0x19, 0x61, 0x5f, 0xb, 0x6, 0x62, 0xf4, 0x31, 0xf4, 0xc2, 0x57, 0xd0, 0x7b, 0xb4, 0x46, 0x6f, 0xa5, 0x65, 0xbf, 0xe1, 0x47, 0x6c, 0xca, 0x8d, 0x34, 0xff, 0xf1, 0xbc, 0x41, 0x3e, 0x78, 0x38, 0x9a, 0x18, 0x7, 0x71, 0xda, 0xa9, 0x33, 0x5d, 0x7a, 0xf6, 0xea, 0xa, 0x2e, 0x87, 0x99, 0x77, 0x5a, 0x87, 0xd1, 0x29, 0x2d, 0x4d, 0x31, 0x87, 0xca, 0x33, 0xd7, 0x87, 0xc6, 0x3e, 0xdc, 0xe, 0xfa, 0xc7, 0x8a, 0x19, 0xcb, 0x49, 0x48, 0x89, 0x1c, 0x65, 0x46, 0x26, 0xf, 0x3d, 0xa9, 0x84, 0xa8, 0x78, 0x6, 0x20, 0x9b, 0xef, 0x64, 0xa9, 0x2d, 0xe6, 0x34, 0x98, 0x0, 0x87, 0x1b, 0x35, 0x3c, 0x4b, 0xb4, 0xc4, 0xe2, 0x9f, 0xef, 0xb2, 0xaf, 0xc, 0x79, 0x26, 0x33, 0x47, 0x6c, 0xf, 0x58, 0x4a, 0x26, 0x2, 0xb, 0x21, 0x5, 0x48, 0xb8, 0xe2, 0x94, 0xa1, 0x42, 0xe2, 0xf9, 0xa6, 0x8b, 0xe, 0x3c, 0xb0, 0x5e, 0xb6, 0x6a, 0x9b, 0x49, 0xde, 0x3f, 0xbc, 0x72, 0x54, 0x79, 0x9b, 0xf1, 0xd2, 0x80, 0x3a, 0x6e, 0x9c, 0x5b, 0x6b, 0xa8, 0x9f, 0x81, 0x42, 0x6d, 0x8, 0x75, 0x37, 0xe4, 0xa3, 0xe8, 0x3e, 0xbb, 0x50, 0x36, 0x66, 0xc1, 0x5f, 0x7, 0x32, 0xb1, 0xfc, 0x14, 0xeb, 0x75, 0xf6, 0x34, 0xd8, 0x7a, 0x6, 0xc9, 0xcc, 0xa8, 0xfd, 0x2f, 0xe9, 0xe6, 0x74, 0x24, 0x6a, 0xea, 0xf1, 0x95, 0xc0, 0xd3, 0xab, 0x34, 0xd9, 0x39, 0x71, 0x6d, 0xb7, 0xe4, 0xbe, 0x61, 0xb2, 0x4, 0x84, 0x69, 0x3e, 0xe7, 0x70, 0x69, 0x2e, 0x1d, 0x11, 0xcb, 0x5f, 0x5e, 0x3b, 0xb2, 0x9f, 0x87, 0x90, 0x54, 0xd7, 0xdf, 0x72, 0x6c, 0x50, 0x11, 0xc1, 0xf1, 0xbc, 0x61, 0x85, 0xd0, 0x97, 0x3a, 0x7, 0x70, 0x5e, 0xbf, 0x82, 0x1d, 0x20, 0x43, 0xa7, 0x32, 0x82, 0x79, 0x2f, 0xc5, 0xa, 0x7f, 0x36, 0x91, 0x4, 0x4b, 0xee, 0x20, 0x4d, 0xcb, 0x13, 0x46, 0x6a, 0x35, 0x12, 0xbf, 0x63, 0x8b, 0x28, 0x81, 0xe0, 0x70, 0xf6, 0xae, 0x21, 0x12, 0x16, 0x6b, 0xcb, 0x4a, 0x51, 0x8c, 0x2d, 0xe6, 0x96, 0x78, 0x9e, 0x37, 0x67, 0x4a, 0xf6, 0x71, 0xa5, 0x7f, 0xfd, 0xca, 0xa2, 0x37, 0x52, 0xb2, 0x6a, 0xba, 0x41, 0x38, 0x98, 0xbd, 0x77, 0xf0, 0x7e, 0x6e, 0xd1, 0x3c, 0x44, 0x2, 0xac, 0xc4, 0x82, 0x76, 0x9d, 0x31, 0xfb, 0x1, 0x51, 0xb2, 0xee, 0x2f, 0x98, 0xa, 0x29, 0x31, 0x29, 0xb0, 0x44, 0xb3, 0x61, 0x2, 0xb9, 0xc9, 0xc1, 0x51, 0xfa, 0x71, 0xd3, 0xbf, 0x5b, 0x8c, 0x0, 0xe, 0x33, 0xca, 0x78, 0x2, 0x1c, 0xdd, 0x66, 0xd8, 0xb1, 0x53, 0xaa, 0xe5, 0xa6, 0x76, 0x6f, 0x66, 0xcf, 0xa2, 0x13, 0x60, 0x79, 0xb7, 0xcf, 0xe5, 0x36, 0x18, 0x52, 0xa3, 0xad, 0x1a, 0x3a, 0x1d, 0x9c, 0x5f, 0xf7, 0x50, 0xff, 0x4, 0x56, 0x3c, 0x22, 0x2b, 0x75, 0x7e, 0xf3, 0xdd, 0x8e, 0x1d, 0x18, 0x11, 0x9a, 0x3c, 0xdd, 0x74, 0xf0, 0xe, 0x7b, 0x6d, 0xb8, 0xcc, 0x72, 0xc1, 0xff, 0xd0, 0xf2, 0x90, 0x7d, 0x3, 0xe3, 0xec, 0xd1, 0xab, 0x6c, 0x85, 0x55, 0x60, 0xd6, 0x7, 0xf3, 0xe3, 0xaf, 0x6d, 0x4c, 0x7e, 0x28, 0x93, 0x2f, 0x42, 0xa0, 0x79, 0x48, 0x33, 0x66, 0xac, 0x2a, 0x90, 0xec, 0x93, 0x71, 0x56, 0x1a, 0x13, 0xb4, 0x76, 0xb, 0xe7, 0xf6, 0xe5, 0x5a, 0x30, 0x3c, 0xaf, 0xdd, 0xeb, 0x1e, 0x3, 0x39, 0xbd, 0x87, 0x95, 0x31, 0xe8, 0xbb, 0x71, 0xf8, 0xde, 0x9, 0x57, 0x69, 0xb6, 0xb2, 0xe, 0x83, 0x99, 0x5, 0x57, 0x29, 0x70, 0x5b, 0x87, 0x1b, 0xce, 0x80, 0x4d, 0x16, 0xac, 0x64, 0x3, 0xa8, 0x7d, 0x8a, 0x83, 0xab, 0x83, 0x1c, 0xbe, 0x23, 0x1d, 0x43, 0x2f, 0x1e, 0xc7, 0x40, 0xb9, 0x4c, 0x87, 0x52, 0x8e, 0x3a, 0x4b, 0x5f, 0xdb, 0xa9, 0x35, 0x19, 0x21, 0xc3, 0x1d, 0x1b, 0x30, 0x92, 0x4, 0x35, 0x94, 0x20, 0x86, 0x95, 0x29, 0x6d, 0x64, 0xd2, 0x33, 0x4, 0x14, 0x91, 0xef, 0x4b, 0xd6, 0xb0, 0x16, 0xf4, 0x5e, 0x3c, 0x9a, 0xea, 0x25, 0x1f, 0x9d, 0x78, 0x2c, 0x35, 0x4a, 0xeb, 0x0, 0xf2, 0x20, 0x28, 0xb4, 0xd0, 0x4b, 0x2c, 0x9f, 0x92, 0x43, 0x4e, 0x5d, 0x23, 0x38, 0x66, 0x27, 0x81, 0xe7, 0x98, 0x32, 0x6e, 0x49, 0x67, 0xbd, 0x62, 0x1c, 0xc8, 0x5b, 0x17, 0x3f, 0xc, 0x66, 0x78, 0x83, 0x4d, 0xdd, 0xaf, 0x17, 0x89, 0xe1, 0x4, 0x4d, 0x8c, 0x6, 0xa8, 0x85, 0x1, 0x16, 0xa8, 0x32, 0x85, 0x9a, 0xb2, 0x92, 0xe1, 0xe4, 0x58, 0xdb, 0x3b, 0x8a, 0xd, 0xc7, 0x86, 0x5b, 0xa6, 0xe8, 0x3b, 0x40, 0xa0, 0x98, 0x4e, 0x6f, 0xe, 0x5f, 0x9e, 0x9f, 0x2c, 0xe8, 0xe6, 0x36, 0x46, 0xd4, 0x43, 0x10, 0x3a, 0xc3, 0x7c, 0xb8, 0x1d, 0x71, 0x5, 0xec, 0x8a, 0xaa, 0x63, 0x12, 0x43, 0x6f, 0xaa, 0xa4, 0x44, 0x27, 0xd, 0x12, 0xff, 0x43, 0x9b, 0x77, 0x77, 0xae, 0x2f, 0x89, 0xbd, 0xd3, 0x82, 0x9f, 0xdc, 0x8c, 0xc9, 0xc, 0xfe, 0xf0, 0xbc, 0xb1, 0xc5, 0xf1, 0xe6, 0x7f, 0x5f, 0xca, 0x72, 0x9a, 0x92, 0x44, 0x82, 0xa6, 0x63, 0xcc, 0xe0, 0x4a, 0x89, 0x3f, 0xb7, 0x92, 0x24, 0x2c, 0xce, 0x18, 0x5f, 0xb7, 0xe5, 0xf3, 0x9d, 0xf5, 0xd0, 0xca, 0x53, 0x8f, 0xd2, 0x40, 0xb7, 0x7c, 0x94, 0x12, 0xf0, 0xc4, 0xfb, 0x85, 0xb5, 0x3e, 0x17, 0xf7, 0xc7, 0x32, 0x86, 0xc, 0xda, 0x17, 0x4c, 0x3f, 0x94, 0xaf, 0x5b, 0x79, 0x8c, 0xeb, 0xd2, 0x51, 0x7c, 0xf6, 0xb5, 0x3f, 0xe2, 0x4e, 0x49, 0x99, 0x88, 0x68, 0x75, 0x75, 0x18, 0xef, 0x6f, 0xff, 0x8d, 0xb3, 0x3e, 0xda, 0x34, 0x28, 0xe8, 0x6b, 0x63, 0xea, 0x52, 0x2c, 0x1, 0xbe, 0xf8, 0x37, 0xdd, 0x61, 0x8c, 0x23, 0x2d, 0x29, 0xdb, 0x42, 0x81, 0x8f, 0x3f, 0x52, 0x54, 0xe, 0xd8, 0x5, 0x6a, 0x3, 0x36, 0xb4, 0x1e, 0xe3, 0xff, 0xc0, 0x93, 0x1e, 0xff, 0xcd, 0xe3, 0x83, 0xdf, 0x1d, 0x82, 0x50, 0xf, 0xfe, 0xd2, 0x3f, 0x3b, 0xb3, 0x9e, 0xff, 0xd, 0x9b, 0xe1, 0xc8, 0xd0, 0xf0, 0x22, 0xe8, 0xa4, 0x11, 0xa0, 0x3e, 0xf8, 0x4, 0x87, 0x5a, 0xd1, 0x7a, 0x64, 0xbc, 0xf, 0x82, 0xc6, 0x50, 0x35, 0x5b, 0x31, 0xbb, 0xec, 0x6b, 0xe7, 0xb7, 0x3d, 0xec, 0x3d, 0x86, 0xc7, 0xbf, 0x17, 0xf0, 0x3a, 0x5d, 0xff, 0x1, 0x29, 0x82, 0x6b, 0x97, 0x39, 0x44, 0x5, 0x20, 0x3b, 0xd, 0xbd, 0xb, 0x37, 0xca, 0x7f, 0x6, 0xf, 0x3d, 0x5e, 0x7f, 0x64, 0xde, 0x3d, 0xf6, 0x95, 0xa8, 0x9c, 0x5e, 0x52, 0x90, 0x7d, 0x14, 0xdf, 0x72, 0x20, 0x97, 0x1e, 0xd3, 0x4d, 0x2f, 0x5c, 0x75, 0xc6, 0xe6, 0x8e, 0xda, 0x6f, 0xa1, 0x58, 0x65, 0x19, 0xcf, 0xff, 0x26, 0x68, 0xc6, 0x95, 0x38, 0xf4, 0xc, 0xa3, 0x76, 0x1a, 0x1f, 0x7b, 0x9, 0xc3, 0x83, 0xe0, 0x4, 0xd6, 0xa9, 0xe, 0xe, 0x39, 0x66, 0x9, 0x83, 0x90, 0xe1, 0xff, 0x5e, 0xc8, 0xb3, 0x53, 0xf7, 0xb, 0xa5, 0xcf, 0xcc, 0xf7, 0xad, 0x15, 0xbc, 0xd9, 0x75, 0xb0, 0xe1, 0xa1, 0xdf, 0xd6, 0xe5, 0xa3, 0x81, 0x7e, 0xc1, 0x9b, 0x24, 0x44, 0xe4, 0x39, 0x8c, 0x43, 0xfd, 0xa7, 0x8e, 0xb2, 0xcc, 0x7d, 0xf3, 0x12, 0xba, 0x7f, 0x90, 0x73, 0x48, 0x65, 0xda, 0x4, 0x29, 0x37, 0x4a, 0xda, 0xa6, 0xda, 0x35, 0xc5, 0xa6, 0x83, 0x62, 0xc6, 0xcf, 0x64, 0x5, 0xbf, 0x95, 0x93, 0x4a, 0xf6, 0xa4, 0x9f, 0xd0, 0x31, 0x84, 0x56, 0x6f, 0xa7, 0xf9, 0x64, 0xd, 0x8c, 0x89, 0xf8, 0x2, 0x7c, 0xc2, 0x48, 0xf8, 0xd5, 0x5b, 0xb, 0x26, 0xe1, 0xad, 0x18, 0xf4, 0xe8, 0xde, 0x73, 0x69, 0x23, 0xe3, 0xf3, 0xc1, 0xdd, 0x85, 0xc1, 0x26, 0x9c, 0x31, 0xe9, 0x46, 0xc4, 0xa, 0x6f, 0x54, 0xd8, 0xb7, 0x85, 0x6d, 0x57, 0x9d, 0x7f, 0x24, 0xf2, 0x65, 0x79, 0x42, 0x48, 0x5f, 0x3, 0xb0, 0x36, 0xb6, 0x19, 0xb5, 0xff, 0x9d, 0xa3, 0x6a, 0xb5, 0xb3, 0x10, 0xb5, 0x8c, 0x4d, 0x8e, 0x9f, 0xa2, 0x3d, 0xb4, 0x59, 0x9f, 0x4b, 0x4c, 0x9e, 0xfd, 0x31, 0xce, 0xa8, 0x1, 0x3c, 0x30, 0xc1, 0x26, 0xbe, 0x20, 0xe, 0xc9, 0x47, 0xee, 0xe8, 0x82, 0x71, 0x18, 0x18, 0x1, 0x81, 0xb9, 0x7d, 0xdb, 0x7c, 0x68, 0xd9, 0xf6, 0x4f, 0xe1, 0xa1, 0x4d, 0xe, 0x52, 0x7a, 0x72, 0xd5, 0x36, 0x88, 0xba, 0x8, 0x98, 0x42, 0xc6, 0xe5, 0xa9, 0xdd, 0xe5, 0xc1, 0x2a, 0x68, 0x95, 0xfc, 0xa9, 0xca, 0x72, 0x3c, 0xd, 0x4e, 0x44, 0xea, 0x2b, 0x77, 0xde, 0xaa, 0xfa, 0x17, 0xc8, 0x9, 0x0, 0xab, 0x8c, 0x42, 0xf8, 0x5e, 0x16, 0xf0, 0xf, 0x46, 0x7a, 0xe4, 0x4c, 0xcc, 0xcb, 0x81, 0x52, 0x72, 0xbf, 0x12, 0x6d, 0xda, 0xd2, 0xaa, 0x23, 0x2, 0x48, 0x78, 0xc6, 0x44, 0x28, 0x6e, 0x25, 0x36, 0xfa, 0x2a, 0x34, 0x6e, 0x8e, 0x76, 0x16, 0x6d, 0x99, 0x46, 0x4d, 0x17, 0x17, 0xf2, 0x8b, 0x62, 0x6a, 0xff, 0xc4, 0x9f, 0xd, 0x49, 0x4e, 0x15, 0x94, 0x5a, 0x70, 0x77, 0x7a, 0x99, 0x2d, 0x8d, 0x28, 0xdd, 0x96, 0x9d, 0xc4, 0x72, 0x5d, 0xce, 0xd8, 0xd9, 0xe2, 0x77, 0x4f, 0x71, 0x1c, 0xc1, 0xa4, 0xc5, 0x6, 0x9d, 0x3e, 0xa0, 0xe4, 0x79, 0x36, 0x51, 0xaa, 0x2, 0x8b, 0xf2, 0xf, 0x3, 0xc2, 0xb3, 0x86, 0x13, 0xc2, 0xc9, 0xce, 0x8b, 0xb6, 0x86, 0x61, 0xb8, 0x6, 0x9f, 0xb, 0x68, 0xf9, 0x4d, 0xf2, 0x7c, 0x81, 0x92, 0xd2, 0xc0, 0xea, 0x45, 0x6b, 0xc4, 0x12, 0xe, 0xb1, 0x7, 0xc5, 0x2b, 0xf4, 0xff, 0x27, 0x94, 0x28, 0x4d, 0x40, 0x3c, 0x26, 0x12, 0xc4, 0x8e, 0x84, 0xb4, 0x99, 0x18, 0x5f, 0x3d, 0xc, 0x80, 0x40, 0xd0, 0x10, 0x70, 0xf9, 0x11, 0x20, 0xeb, 0xf, 0x30, 0x29, 0xf5, 0xc5, 0xb4, 0x3a, 0xdc, 0x40, 0xea, 0x69, 0x2d, 0xa4, 0x26, 0x8f, 0x1, 0xcc, 0xae, 0x22, 0xad, 0x84, 0xdc, 0x4a, 0xf0, 0x70, 0x32, 0x7b, 0x6c, 0xc3, 0x25, 0xed, 0x72, 0xfa, 0x50, 0x47, 0x6d, 0xba, 0x46, 0x8e, 0x8a, 0xe5, 0x93, 0xc5, 0xd1, 0x37, 0x6c, 0x8c, 0x8, 0xc, 0x12, 0x31, 0x47, 0x39, 0xa2, 0xda, 0x86, 0x6e, 0xcb, 0x63, 0x42, 0xbe, 0xc3, 0x38, 0xd0, 0x26, 0x71, 0x36, 0x7d, 0x41, 0x2c, 0xd0, 0x59, 0x71, 0xb0, 0x6d, 0x11, 0x3d, 0x9d, 0x10, 0x62, 0x89, 0xc1, 0x7f, 0xa6, 0x7, 0xae, 0x79, 0x15, 0x96, 0xbb, 0x87, 0x4d, 0xc8, 0x8f, 0xd6, 0x8d, 0x1f, 0x1c, 0x49, 0x9e, 0x0, 0x30, 0x19, 0x28, 0x13, 0xe3, 0x22, 0xaf, 0x8c, 0x8a, 0xff, 0xb4, 0x3a, 0xf2, 0x7c, 0x19, 0xfa, 0xcf, 0x87, 0xd6, 0x5d, 0x20, 0x44, 0x3a, 0x10, 0x58, 0xa2, 0x67, 0xed, 0xd, 0xc3, 0x96, 0xb7, 0x57, 0x29, 0x22, 0xe, 0x44, 0xbb, 0x23, 0xa5, 0xcc, 0x4, 0x4d, 0xef, 0x73, 0xa2, 0x73, 0x46, 0x32, 0x39, 0xec, 0x11, 0x3e, 0x34, 0xdf, 0x3a, 0xaf, 0xd3, 0x68, 0x59, 0xdc, 0xf1, 0xd7, 0x36, 0x61, 0x27, 0xa9, 0x53, 0xb0, 0x99, 0x28, 0x7b, 0x7a, 0xcd, 0x7e, 0x6, 0xae, 0x61, 0x26, 0xaa, 0x3e, 0xd9, 0x9c, 0x77, 0x2, 0xc8, 0xb9, 0x49, 0x85, 0xea, 0x85, 0x33, 0xc5, 0x40, 0x79, 0x1d, 0x6, 0xe7, 0x3c, 0xe9, 0xb3, 0x89, 0x7a, 0xd2, 0xd7, 0x1b, 0x2c, 0x3a, 0x5d, 0x75, 0xa8, 0xb5, 0xf7, 0x8a, 0x21, 0x5b, 0x25, 0xa0, 0x68, 0x9e, 0xb2, 0x54, 0x67, 0xf7, 0x8a, 0x7e, 0x83, 0x33, 0xb5, 0x2e, 0xab, 0x9f, 0x57, 0x73, 0x5a, 0xb0, 0xd1, 0x85, 0x43, 0xd7, 0xec, 0xa1, 0x55, 0x10, 0xb4, 0x15, 0x91, 0x5e, 0x44, 0x74, 0x92, 0x36, 0xb2, 0x4e, 0x27, 0x20, 0xf5, 0xc4, 0xa7, 0x72, 0x29, 0x2b, 0x90, 0xa2, 0xaa, 0xfc, 0x41, 0x71, 0xe0, 0xd3, 0x9a, 0xf6, 0xe4, 0x99, 0xd7, 0x9a, 0x53, 0xfd, 0x9f, 0x3f, 0x81, 0x94, 0x3f, 0x45, 0xa6, 0xf7, 0xc2, 0x5b, 0x37, 0x48, 0x3c, 0x8d, 0xc5, 0x96, 0x4e, 0xc6, 0x5d, 0xad, 0x6f, 0x32, 0xb3, 0x54, 0xe3, 0x40, 0xb2, 0xa9, 0xca, 0xaf, 0x3a, 0xa9, 0xe7, 0xa1, 0xac, 0x3, 0x9, 0x1b, 0x1d, 0xa0, 0xb8, 0x11, 0x12, 0x67, 0x97, 0xeb, 0x4c, 0xa0, 0x10, 0x17, 0xc8, 0x79, 0x2e, 0x94, 0x5e, 0xd4, 0xad, 0xcc, 0x27, 0x36, 0x4a, 0x7e, 0x55, 0xc, 0x6d, 0xcf, 0x4b, 0x56, 0xbc, 0xa2, 0x72, 0xc, 0xb8, 0xd7, 0x26, 0x43, 0x5f, 0xee, 0x9, 0x19, 0x2f, 0x29, 0xd4, 0xe9, 0xdb, 0x70, 0x6b, 0x18, 0x6b, 0xf1, 0x63, 0x26, 0x4c, 0xf7, 0x56, 0x2a, 0xb4, 0xfb, 0x35, 0xf7, 0xb0, 0x3d, 0xc2, 0x40, 0x0, 0xe1, 0x6a, 0xf6, 0xbd, 0x6, 0xb6, 0x58, 0x2d, 0x3, 0x87, 0x46, 0xde, 0xb4, 0x1e, 0xe0, 0x79, 0x2c, 0x5e, 0x83, 0x3d, 0x4f, 0xc5, 0x23, 0xef, 0x4, 0x5d, 0xf4, 0x8d, 0x81, 0x7, 0xb4, 0x41, 0x3d, 0x67, 0xc8, 0xa9, 0xfa, 0x55, 0x55, 0x53, 0xb9, 0x89, 0x6f, 0x4f, 0xd6, 0xce, 0x84, 0x5c, 0x41, 0xb7, 0xea, 0xd2, 0x60, 0x48, 0xd3, 0xba, 0xe, 0x5, 0xd2, 0x9b, 0xdb, 0x5f, 0xbf, 0xa5, 0x85, 0x66, 0xcc, 0xe0, 0x53, 0xdb, 0xb3, 0xa7, 0x1e, 0x8b, 0xa0, 0xd2, 0x61, 0x9a, 0x85, 0x14, 0x8b, 0xae, 0x63, 0xab, 0x95, 0xd4, 0x99, 0x2f, 0x5, 0x87, 0x84, 0xf, 0x74, 0x38, 0xea, 0x4e, 0x97, 0xb2, 0x5b, 0xbe, 0x8e, 0x17, 0x7f, 0xd1, 0x36, 0x5b, 0xca, 0xbc, 0xb, 0x3, 0xea, 0x6e, 0xf8, 0xaa, 0xe3, 0xcc, 0xe4, 0xb5, 0xe0, 0xe9, 0xf8, 0x68, 0x20, 0x2, 0x1a, 0xb5, 0x75, 0x3e, 0xeb, 0x9, 0x96, 0x87, 0x34, 0xa4, 0xca, 0xe1, 0xfa, 0xab, 0x5f, 0xca, 0x9f, 0x91, 0x9b, 0x45, 0x21, 0x1a, 0xac, 0xfa, 0x7a, 0x93, 0xd2, 0xa4, 0x66, 0x1f, 0x1c, 0xa9, 0xc, 0x9e, 0x31, 0x13, 0xec, 0x23, 0xf3, 0xc7, 0x4c, 0x19, 0x90, 0x16, 0xa1, 0x8a, 0x3a, 0x14, 0x25, 0xad, 0x8, 0x9e, 0xb5, 0x9, 0x8d, 0xad, 0x40, 0xbe, 0xa, 0x86, 0x50, 0xe7, 0x9b, 0xd, 0xd6, 0x37, 0x4c, 0x43, 0xbf, 0xc6, 0x8, 0xb0, 0x53, 0x6c, 0x17, 0xc5, 0x3e, 0x1d, 0xd0, 0xa0, 0x61, 0xa6, 0xae, 0x21, 0x23, 0x51, 0x52, 0x46, 0x74, 0x98, 0x98, 0x25, 0xa9, 0xec, 0x91, 0xa5, 0x4c, 0x8, 0xeb, 0x3f, 0xcb, 0x1d, 0xc9, 0x9d, 0xbb, 0xa9, 0x40, 0xc2, 0xb4, 0x78, 0x55, 0x43, 0xc5, 0x14, 0xdc, 0xaf, 0xc, 0x61, 0x3b, 0x2a, 0xd6, 0x5e, 0x6b, 0x84, 0x38, 0x1b, 0x37, 0x2f, 0x51, 0x7, 0x61, 0x81, 0xe3, 0xb0, 0xa, 0xb7, 0x1b, 0x57, 0x2d, 0x24, 0x6b, 0xeb, 0x80, 0x70, 0x2d, 0x83, 0x46, 0xe2, 0x71, 0x3b, 0x23, 0xd0, 0xb, 0xd3, 0x9d, 0x13, 0x31, 0xbe, 0x1b, 0x99, 0x27, 0x70, 0x53, 0x4e, 0x2e, 0x46, 0x91, 0x7e, 0x79, 0x68, 0x5a, 0x18, 0x4e, 0x6b, 0xa, 0xe2, 0x3f, 0x42, 0x7, 0xb7, 0xd9, 0x42, 0x7e, 0xc6, 0xf2, 0x82, 0x1b, 0x81, 0xf7, 0x4c, 0x68, 0x17, 0xc8, 0x25, 0x5d, 0xb9, 0x5b, 0x4, 0x5e, 0x0, 0x53, 0xbd, 0xfd, 0x68, 0x8e, 0x9d, 0xbe, 0x49, 0xf6, 0xe5, 0x20, 0x43, 0x4, 0x1b, 0x33, 0x5, 0xf, 0xdb, 0x98, 0x33, 0xc3, 0xe0, 0xb3, 0xe9, 0xfd, 0xf6, 0xae, 0xcf, 0xc8, 0x66, 0x9b, 0x20, 0xf4, 0x92, 0x4b, 0x9d, 0x73, 0x1a, 0xcc, 0xaf, 0xd1, 0xe9, 0xde, 0xb8, 0x8a, 0xa2, 0x5f, 0xa7, 0xae, 0x9, 0xd0, 0xf1, 0xc6, 0xea, 0xb5, 0x5f, 0x37, 0x14, 0xa5, 0x7a, 0x8f, 0x70, 0x60, 0xb5, 0x20, 0x64, 0x41, 0xdc, 0x54, 0x62, 0x9c, 0x49, 0xae, 0x9e, 0x7e, 0x7e, 0x83, 0x7a, 0x24, 0x39, 0x29, 0x7e, 0xa7, 0x24, 0x5, 0x9, 0x8c, 0xc0, 0xae, 0x74, 0xf2, 0x55, 0x6f, 0x8d, 0x19, 0x92, 0x2b, 0xf8, 0xc5, 0xce, 0x2, 0x14, 0x2e, 0x96, 0x3c, 0x49, 0xe7, 0x30, 0x2f, 0xfa, 0x17, 0xca, 0x17, 0x9f, 0xcb, 0x79, 0xb8, 0xe9, 0xe8, 0x83, 0xd7, 0xbc, 0x5f, 0x14, 0x6f, 0x5a, 0x14, 0x8c, 0x3d, 0xea, 0x6e, 0xee, 0xd, 0x5e, 0xe7, 0x15, 0xde, 0xde, 0xa2, 0x8a, 0x62, 0xdc, 0x72, 0x48, 0xf2, 0x74, 0x93, 0xbb, 0x61, 0x78, 0xfe, 0xc4, 0xe9, 0xd3, 0xe0, 0xb2, 0x87, 0x61, 0x2a, 0x82, 0xd4, 0x56, 0xf9, 0x26, 0x98, 0xc5, 0xcf, 0x17, 0x64, 0xb6, 0x9e, 0x16, 0x8, 0x24, 0x69, 0x9, 0x26, 0xca, 0x85, 0xf8, 0x9e, 0xc7, 0x6, 0x9d, 0xf6, 0xed, 0x8f, 0x13, 0x7d, 0xdc, 0x8a, 0x1f, 0x3, 0x0, 0x26, 0xf7, 0xbc, 0xe, 0xe6, 0x46, 0x3c, 0x10, 0xe, 0x47, 0x31, 0x62, 0x31, 0xb8, 0x82, 0x44, 0x9, 0x21, 0x7c, 0x48, 0xca, 0xfa, 0x6d, 0x6f, 0xef, 0x66, 0xe6, 0x62, 0x97, 0xce, 0xa, 0x2e, 0x42, 0x1f, 0x8d, 0x1f, 0xd3, 0xa9, 0x46, 0x32, 0xd2, 0x44, 0x49, 0x57, 0xf1, 0x83, 0x1e, 0x1b, 0x4b, 0x33, 0x7f, 0xa5, 0x3a, 0xa6, 0xdf, 0x13, 0x81, 0x5d, 0x2, 0x9f, 0xed, 0xda, 0xf8, 0xc, 0xc1, 0x11, 0xee, 0x0, 0xa8, 0x8e, 0xd7, 0x30, 0x75, 0xdd, 0xe3, 0xb5, 0xd4, 0x3c, 0x5, 0xeb, 0xc5, 0x43, 0x8c, 0xd5, 0x3e, 0xb1, 0x65, 0x9b, 0x63, 0x16, 0x15, 0xbd, 0xbd, 0x49, 0xad, 0xc3, 0x90, 0x79, 0x42, 0xb6, 0x41, 0x8e, 0xfd, 0x99, 0x1e, 0xae, 0x7e, 0x70, 0xbd, 0x15, 0xcf, 0x12, 0x1e, 0xb7, 0xab, 0x1a, 0x1b, 0x4f, 0xad, 0x29, 0xe, 0x5d, 0x54, 0x7, 0x4d, 0xe7, 0x43, 0x51, 0xe1, 0xde, 0x8b, 0xc8, 0x36, 0x63, 0x26, 0x30, 0x7c, 0x76, 0x76, 0x58, 0x6, 0x93, 0xf2, 0x25, 0x96, 0x19, 0x73, 0xc6, 0x71, 0x85, 0x7, 0x9c, 0x51, 0x29, 0x55, 0xed, 0xb2, 0x90, 0x86, 0xc8, 0xb4, 0x5, 0x27, 0x85, 0x2d, 0x2c, 0x4f, 0x27, 0x2d, 0x55, 0x9, 0x4e, 0x44, 0x8d, 0xbf, 0xb0, 0xd1, 0x75, 0x65, 0x98, 0xeb, 0xbe, 0x28, 0x76, 0x51, 0x46, 0x86, 0x7f, 0x38, 0xe2, 0x7b, 0x40, 0x6b, 0xfc, 0x39, 0xa6, 0x49, 0x30, 0x5e, 0xe, 0x25, 0x36, 0x0, 0x86, 0xd9, 0x35, 0x5c, 0xe7, 0x46, 0x16, 0xcc, 0x5d, 0xd8, 0x5b, 0xf3, 0xc, 0x3a, 0x27, 0x26, 0x6c, 0xd2, 0xce, 0xca, 0x8b, 0x42, 0x67, 0x53, 0xb5, 0x1d, 0xcf, 0x2e, 0xe2, 0x8b, 0x6, 0x9e, 0x1a, 0x97, 0xd8, 0x3d, 0x1, 0xc5, 0x9, 0x79, 0x8a, 0xcb, 0x11, 0xf4, 0x17, 0x6, 0xd5, 0x1d, 0x86, 0x98, 0xac, 0x57, 0x57, 0xbb, 0x5a, 0x93, 0x1e, 0xd, 0x1f, 0xde, 0x85, 0x7a, 0xe3, 0x4d, 0x15, 0xb4, 0x10, 0xfd, 0xde, 0xb5, 0xeb, 0x9c, 0x36, 0x92, 0xe3, 0xd9, 0xb8, 0xbe, 0x24, 0x13, 0x76, 0x9b, 0xef, 0xd5, 0x54, 0x26, 0x7e, 0xf1, 0x74, 0xba, 0x41, 0x63, 0x4d, 0xe4, 0xdd, 0xc1, 0x78, 0xc8, 0xe3, 0xa0, 0xc0, 0xfd, 0x18, 0xd9, 0x87, 0x81, 0x75, 0xd7, 0xa6, 0x13, 0x3a, 0xca, 0x2, 0x15, 0x60, 0x87, 0x66, 0xf0, 0x58, 0x66, 0xf3, 0x9c, 0x3e, 0x31, 0xc7, 0x7e, 0x5, 0xf8, 0x71, 0x1c, 0xef, 0x33, 0xc4, 0x5a, 0x83, 0x6a, 0x1b, 0x46, 0x62, 0x32, 0x85, 0x4c, 0x39, 0x86, 0x7c, 0x98, 0x53, 0xf0, 0xc8, 0xa1, 0xc4, 0x83, 0xe9, 0xdf, 0x8c, 0x39, 0xff, 0x31, 0xb9, 0xb7, 0x3, 0x62, 0x81, 0x5e, 0xbf, 0x5b, 0x4, 0xb9, 0xb7, 0x46, 0x3c, 0x19, 0x93, 0x6b, 0xe4, 0xa6, 0xa4, 0x5d, 0xbf, 0x4e, 0x1e, 0xe7, 0x4f, 0xa2, 0x43, 0x60, 0x2a, 0x94, 0xf9, 0x2b, 0x49, 0xb3, 0xff, 0x1e, 0x19, 0xc1, 0x29, 0x5, 0xde, 0x2f, 0x90, 0x49, 0x24, 0x66, 0x9f, 0x2d, 0xc3, 0x13, 0x67, 0xac, 0xa7, 0x92, 0xc7, 0x2c, 0x98, 0x37, 0xb7, 0xd8, 0x8a, 0xd8, 0x2f, 0xe3, 0x60, 0x1e, 0xa2, 0x19, 0x3, 0x3a, 0x7e, 0x1a, 0x59, 0x83, 0x73, 0x44, 0xde, 0xb0, 0x9, 0x56, 0xa4, 0x10, 0x83, 0xee, 0x41, 0xf1, 0x6d, 0x71, 0xf4, 0xd6, 0xe6, 0x39, 0xa0, 0xc1, 0xae, 0x2e, 0xd1, 0x98, 0x11, 0xf, 0xba, 0xb2, 0x14, 0xac, 0xe5, 0xee, 0x3a, 0x60, 0xa1, 0xc1, 0xeb, 0xce, 0x64, 0xb9, 0xe0, 0x36, 0x48, 0x1f, 0x40, 0x66, 0x3f, 0xd0, 0x4f, 0x96, 0x37, 0xe4, 0x2e, 0x12, 0x3f, 0x8f, 0xdd, 0x49, 0x4e, 0xdb, 0x3f, 0x18, 0xf, 0x38, 0x29, 0xf6, 0x67, 0xf2, 0x6e, 0x16, 0x4d, 0xa6, 0x8d, 0x70, 0x96, 0x8e, 0x3e, 0xf1, 0x74, 0x76, 0x20, 0xc, 0x18, 0x19, 0xbc, 0xdb, 0x8f, 0xae, 0x33, 0xa7, 0x9, 0x2e, 0x11, 0x1e, 0xb7, 0xae, 0x6a, 0x54, 0x75, 0x66, 0x99, 0xc7, 0xb1, 0x1, 0xe1, 0xf1, 0x2a, 0x43, 0x79, 0xc6, 0xde, 0x2d, 0xde, 0x8f, 0x55, 0xeb, 0xd5, 0x3f, 0x75, 0x57, 0x53, 0x1f, 0x2d, 0x39, 0x81, 0x8a, 0x15, 0xe1, 0x3a, 0x97, 0x6b, 0xa7, 0xa7, 0x91, 0x99, 0x89, 0x4a, 0xff, 0xbb, 0x6f, 0x41, 0xcf, 0x9d, 0x4a, 0xd, 0xfd, 0xfd, 0x65, 0x9e, 0x12, 0xdf, 0x4d, 0x94, 0x48, 0x9e, 0xc2, 0x7b, 0x66, 0x68, 0x85, 0x3c, 0xd9, 0x92, 0x1a, 0xbc, 0xe2, 0xdf, 0x98, 0x6e, 0x5, 0x69, 0x3c, 0x27, 0xb8, 0xa6, 0xfa, 0xcd, 0x18, 0xe4, 0xfc, 0x69, 0x9f, 0xc6, 0x61, 0x50, 0x23, 0xd8, 0x6b, 0x60, 0x27, 0x5e, 0xf7, 0x6a, 0xa0, 0x95, 0xd4, 0x42, 0x1f, 0x3a, 0x87, 0x6d, 0x5, 0xd5, 0xd3, 0x8e, 0x6a, 0x5b, 0xb2, 0x6a, 0x41, 0x28, 0x55, 0xaf, 0x23, 0x45, 0x1a, 0x2b, 0xc7, 0xff, 0xc0, 0xc6, 0x3, 0x9e, 0xc9, 0x21, 0x7b, 0x82, 0x18, 0xab, 0x1b, 0x69, 0x34, 0x90, 0x48, 0x86, 0xe, 0x6, 0x98, 0xf3, 0xc7, 0x93, 0xf, 0xf9, 0x7, 0x52, 0xb, 0xd1, 0xf8, 0x82, 0xcb, 0x96, 0x4a, 0x9f, 0xe3, 0xf9, 0xd0, 0x3a, 0x79, 0xcd, 0x71, 0xdd, 0xf5, 0x54, 0x3a, 0xfc, 0xd2, 0x35, 0xf4, 0x84, 0x7f, 0x78, 0x33, 0x8e, 0x5b, 0xc5, 0x3, 0x4b, 0x73, 0x46, 0x38, 0xa6, 0x75, 0xf9, 0x42, 0xef, 0xf0, 0xb9, 0x51, 0x50, 0xf7, 0x4, 0x73, 0xff, 0xc2, 0x87, 0x1c, 0x74, 0xdc, 0xa1, 0xac, 0x18, 0x80, 0xfe, 0x4b, 0x2d, 0xa7, 0x20, 0xf1, 0x56, 0x2c, 0x73, 0x3e, 0x5, 0x3d, 0x3b, 0x82, 0xfd, 0x16, 0xca, 0x37, 0x75, 0xe4, 0xcf, 0xbc, 0x11, 0x6b, 0x99, 0x5a, 0x1b, 0x74, 0x9c, 0x6c, 0xdf, 0xfa, 0xc3, 0x4f, 0x90, 0xc7, 0x32, 0x73, 0xee, 0x6a, 0x63, 0xe3, 0xc7, 0x45, 0x3f, 0xa2, 0x14, 0xaa, 0xd9, 0x91, 0xf0, 0xc3, 0x59, 0x86, 0xc3, 0x40, 0x85, 0x2d, 0xb1, 0x5d, 0x5e, 0x99, 0x4a, 0x8a, 0x59, 0xa5, 0xf3, 0xec, 0x3b, 0xa5, 0x20, 0x95, 0xa9, 0xea, 0xb1, 0x17, 0x4b, 0x53, 0x56, 0x3c, 0xe0, 0x4, 0xbf, 0xa4, 0xdc, 0xd3, 0x9e, 0x68, 0x62, 0xd5, 0xd8, 0x3a, 0x56, 0x6c, 0x71, 0xe7, 0x78, 0x61, 0x1d, 0xa4, 0x77, 0xba, 0x27, 0x8e, 0xff, 0xa1, 0x68, 0x40, 0xc, 0xc8, 0xe4, 0x3d, 0xf6, 0x13, 0xa, 0x99, 0x10, 0x1, 0x75, 0xf3, 0x46, 0x1d, 0xa6, 0x21, 0x35, 0xf3, 0x7b, 0xbb, 0x65, 0xb3, 0x10, 0x8e, 0x21, 0xff, 0xa, 0x75, 0xea, 0xd7, 0xf, 0x4, 0x18, 0x2, 0x81, 0x25, 0xa9, 0xb3, 0xa4, 0x8a, 0xfd, 0xa3, 0x5, 0xe6, 0xb4, 0x3d, 0x9b, 0x5f, 0xe7, 0x29, 0xb8, 0xfb, 0xe5, 0x53, 0x4d, 0xa5, 0x75, 0xdc, 0x6b, 0xe3, 0x17, 0x27, 0xd5, 0x2, 0xdc, 0xa5, 0x4, 0xc2, 0x2e, 0xa4, 0xe9, 0x2f, 0x50, 0xaf, 0x86, 0x82, 0xe3, 0x30, 0x26, 0xfb, 0xe8, 0x67, 0x88, 0x9b, 0x88, 0xc9, 0xbe, 0x6e, 0x5c, 0x84, 0xbf, 0x8d, 0xc9, 0x47, 0xcb, 0xf2, 0x91, 0xf4, 0x54, 0x12, 0x2a, 0xc, 0x79, 0xba, 0x1f, 0x9, 0xa3, 0x8b, 0x70, 0xf, 0xc2, 0x78, 0xfd, 0xf6, 0xd7, 0x17, 0x5e, 0xde, 0xac, 0x30, 0xac, 0x69, 0xa5, 0xd7, 0xb4, 0x52, 0x68, 0xd0, 0x96, 0xf9, 0xd0, 0x54, 0xae, 0x9, 0x46, 0xb5, 0x4b, 0x1d, 0xe5, 0x61, 0xd0, 0xae, 0xd, 0x17, 0x7d, 0xa3, 0x3f, 0x41, 0xfb, 0xb8, 0x34, 0x84, 0x86, 0xa8, 0x62, 0xf1, 0x64, 0xfb, 0x9e, 0xbd, 0xac, 0xa2, 0x99, 0xf2, 0xe1, 0x48, 0x64, 0x5e, 0x1a, 0x5c, 0xb7, 0x69, 0xa0, 0xb5, 0x42, 0x1a, 0x95, 0x99, 0xfa, 0xe7, 0x26, 0x3b, 0x2f, 0x89, 0x6e, 0x95, 0x6d, 0x47, 0x52, 0x87, 0xda, 0x60, 0x98, 0x70, 0xf4, 0xa3, 0xdd, 0x82, 0x24, 0x79, 0x51, 0xd1, 0x3a, 0xf0, 0x82, 0x7d, 0x1, 0xe3, 0x10, 0x41, 0xd6, 0xe4, 0x14, 0xd4, 0xfa, 0x2c, 0x8d, 0x92, 0x14, 0x24, 0x2b, 0xd0, 0x2e, 0x58, 0x5f, 0x15, 0x2b, 0xf1, 0x1b, 0x82, 0xcb, 0x1b, 0x14, 0x1a, 0x48, 0xda, 0xf5, 0x81, 0x4f, 0x70, 0xc7, 0xe3, 0x12, 0x81, 0x83, 0xff, 0x9f, 0xe5, 0x5d, 0x9c, 0xe4, 0x94, 0xc8, 0xbe, 0x5b, 0x32, 0x32, 0x5, 0x11, 0xc4, 0x88, 0x4d, 0x45, 0xcc, 0x51, 0xd0, 0xa0, 0x1b, 0x53, 0x8e, 0x1f, 0x9c, 0xb8, 0x6d, 0x4f, 0x44, 0x3a, 0x56, 0xca, 0xd6, 0x3f, 0xfe, 0x34, 0xb9, 0x8a, 0xda, 0x58, 0x15, 0x22, 0x5c, 0x7f, 0xa1, 0xf0, 0x74, 0x94, 0x6d, 0x1, 0x45, 0x84, 0xa, 0x8a, 0x7d, 0xcb, 0x61, 0x4d, 0xd3, 0x17, 0x19, 0x40, 0x47, 0x1c, 0x10, 0x39, 0x9d, 0x8e, 0xfb, 0xee, 0x2c, 0xd5, 0x29, 0x26, 0xff, 0xca, 0x2b, 0x2c, 0x62, 0xc1, 0x32, 0x3e, 0xcf, 0xf9, 0x5, 0x1a, 0x7, 0xe9, 0x3c, 0x5e, 0xb9, 0xd4, 0x8c, 0x43, 0x94, 0x15, 0x1f, 0xa6, 0xbc, 0xfb, 0xdf, 0xde, 0xaa, 0x4, 0xa6, 0xe6, 0xb6, 0x1e, 0x40, 0x49, 0xe1, 0x68, 0xf4, 0x27, 0x30, 0x85, 0x9c, 0xda, 0xab, 0xdf, 0x2a, 0x32, 0x1d, 0x22, 0x9a, 0x17, 0xcb, 0xb7, 0xf6, 0xa9, 0x8e, 0xed, 0xcc, 0x4d, 0x93, 0xb7, 0x4d, 0x76, 0x7b, 0xdc, 0xd, 0x18, 0x9, 0x5e, 0x40, 0x39, 0xb1, 0xfc, 0xdd, 0xc2, 0x7d, 0xb4, 0xbf, 0xa6, 0x29, 0x66, 0x5e, 0x91, 0x5a, 0x9f, 0x4e, 0x5e, 0xc5, 0xbf, 0x1e, 0x44, 0x4, 0x62, 0x37, 0x9d, 0xdb, 0xb1, 0x53, 0x5f, 0xc, 0x93, 0xcf, 0x68, 0x2d, 0xf8, 0xb1, 0x5, 0xb6, 0xcb, 0x42, 0xa1, 0xd3, 0x17, 0xf2, 0x80, 0x87, 0x30, 0xea, 0x44, 0x59, 0xdd, 0xe4, 0xf5, 0x45, 0x38, 0x61, 0xe7, 0x8d, 0xdc, 0xa3, 0xd7, 0x24, 0x76, 0x7d, 0xba, 0xea, 0x6b, 0x1e, 0xf1, 0x4d, 0x30, 0xfd, 0x9a, 0x70, 0x1e, 0x56, 0x4, 0x17, 0x2, 0x76, 0x43, 0x36, 0x95, 0x64, 0x4b, 0xf9, 0xc8, 0x3a, 0x4b, 0x20, 0xbf, 0x68, 0xca, 0x80, 0x56, 0x7c, 0xaf, 0x53, 0x4e, 0x74, 0x75, 0xc6, 0xe0, 0x4a, 0x7, 0x26, 0x5, 0xf6, 0x2a, 0xd9, 0xec, 0xf8, 0xce, 0xd8, 0x95, 0x5a, 0x74, 0xd1, 0x6c, 0x7a, 0xfa, 0xb9, 0xe6, 0xe4, 0xc3, 0x25, 0xa3, 0x3d, 0x6d, 0x54, 0x3d, 0xae, 0x3a, 0xe9, 0x9a, 0x1d, 0x69, 0x57, 0x1f, 0x33, 0x1a, 0x2e, 0x9d, 0xfe, 0xf3, 0x91, 0xe8, 0x35, 0x3d, 0x6, 0xac, 0x3f, 0x9, 0x30, 0xd4, 0x27, 0xa3, 0x13, 0x55, 0x12, 0x9b, 0xa5, 0xed, 0x8f, 0xf1, 0x36, 0x55, 0xf3, 0x34, 0x21, 0xdc, 0x86, 0x2, 0x21, 0x5c, 0x2c, 0xfe, 0x51, 0xaa, 0x8c, 0x65, 0xab, 0x1c, 0xee, 0xaa, 0x68, 0x3f, 0x92, 0x72, 0x35, 0xf9, 0xb, 0xa0, 0x23, 0x5a, 0xed, 0xab, 0xfd, 0x7e, 0x39, 0x6f, 0x62, 0x9a, 0xe3, 0x78, 0x9d, 0x19, 0xf3, 0x3b, 0x2b, 0xfe, 0x45, 0xc3, 0xbb, 0x71, 0x77, 0xaf, 0xa2, 0xb7, 0x2c, 0x80, 0x59, 0x1e, 0x7a, 0x82, 0x19, 0x3d, 0x1c, 0xa5, 0x87, 0xb4, 0x15, 0xbc, 0x3b, 0x82, 0x22, 0xa4, 0xd0, 0x99, 0xf2, 0x39, 0x61, 0x85, 0xfb, 0xc6, 0x56, 0xf4, 0x65, 0xdf, 0xc3, 0x9a, 0xd6, 0x8b, 0x1f, 0x70, 0xc6, 0x65, 0xdf, 0xad, 0x87, 0xdf, 0x58, 0x37, 0x1e, 0x32, 0x9f, 0x14, 0xba, 0x7e, 0x1b, 0x72, 0x14, 0xf7, 0xec, 0xb1, 0x2a, 0x31, 0xa3, 0x31, 0x98, 0xf0, 0x7d, 0xe1, 0x81, 0xd5, 0xc4, 0xd5, 0xec, 0xd6, 0x2f, 0xdb, 0xb3, 0xa1, 0xce, 0x8f, 0x6f, 0x99, 0x2, 0xfd, 0x4f, 0xf1, 0x82, 0x78, 0x3e, 0xa6, 0x9f, 0xe2, 0xdc, 0xca, 0xc6, 0x7, 0x35, 0xdc, 0xf6, 0xc9, 0xd0, 0xbe, 0x82, 0xb8, 0x6f, 0x2d, 0xf2, 0x46, 0x2c, 0xe5, 0x18, 0xd1, 0x5b, 0x75, 0x45, 0x1a, 0xcf, 0x8, 0x46, 0x7c, 0x27, 0x7c, 0x2c, 0x9f, 0xc2, 0x12, 0x80, 0x56, 0x32, 0xdf, 0xcb, 0x7c, 0xe, 0x9b, 0x72, 0x61, 0xdd, 0xae, 0xb0, 0xfc, 0xbf, 0x5d, 0xd7, 0xf7, 0x9e, 0xca, 0xa2, 0x7c, 0x62, 0xf, 0x64, 0x6f, 0xb1, 0xec, 0x8f, 0xf5, 0x46, 0x19, 0xf5, 0x39, 0x2b, 0xb9, 0x74, 0xe2, 0x44, 0xaf, 0x88, 0x62, 0x4, 0xfc, 0x4d, 0x7f, 0xe5, 0x29, 0xc3, 0xea, 0x2a, 0xf3, 0x91, 0xa, 0x31, 0xba, 0xaa, 0xd6, 0x4b, 0x27, 0xad, 0x43, 0xf9, 0x84, 0x68, 0xf, 0x40, 0x16, 0x9a, 0x71, 0x20, 0x1e, 0xf9, 0xda, 0xf6, 0x29, 0x5d, 0x68, 0x52, 0x9d, 0xe4, 0x27, 0x33, 0xcc, 0xc1, 0x5e, 0x59, 0xa0, 0x54, 0x3b, 0x96, 0xde, 0xf4, 0x38, 0xb3, 0xfd, 0xbc, 0xef, 0xe5, 0x15, 0x0, 0xe, 0xa6, 0x8d, 0xbb, 0x4d, 0xd9, 0x23, 0x7d, 0x17, 0xad, 0x17, 0xa6, 0x97, 0xa2, 0x4a, 0x72, 0x98, 0x8e, 0x55, 0xb6, 0xfd, 0x5b, 0x88, 0xf0, 0x30, 0x96, 0x9a, 0x89, 0xc7, 0x8a, 0xa2, 0xf7, 0xf9, 0x12, 0xc1, 0x2d, 0x87, 0xc8, 0x8a, 0xae, 0xd2, 0x59, 0xc4, 0xc3, 0x73, 0xca, 0x42, 0x6, 0xfa, 0xd6, 0xc8, 0xdf, 0xe7, 0x81, 0x69, 0x29, 0x15, 0x4a, 0xb9, 0xb5, 0x1f, 0x50, 0x44, 0xcd, 0x67, 0x37, 0xfd, 0xdd, 0xe, 0xf1, 0x1c, 0xc7, 0xe, 0xc7, 0xdd, 0x8e, 0x9a, 0xb3, 0xee, 0xe5, 0xc7, 0x28, 0x50, 0xd9, 0x81, 0x3d, 0x8e, 0xac, 0x2, 0x5d, 0xe3, 0xb0, 0x70, 0x72, 0xf1, 0x88, 0x0, 0xe3, 0x1f, 0x88, 0xe1, 0xab, 0x1f, 0x4, 0xec, 0xaa, 0x7f, 0x9e, 0xd9, 0xb8, 0x71, 0xcf, 0x62, 0xc2, 0x22, 0xf2, 0xe0, 0xa7, 0xde, 0x43, 0x50, 0x42, 0x51, 0xe6, 0x72, 0xac, 0x42, 0x9d, 0x30, 0x30, 0xcd, 0x16, 0x92, 0xdd, 0x9d, 0xfe, 0x94, 0xec, 0xfe, 0x87, 0xf, 0x7d, 0x9c, 0x53, 0xd6, 0xd7, 0xc7, 0x2a, 0x43, 0x7c, 0xa5, 0xc5, 0x3, 0x10, 0xda, 0x7f, 0x32, 0xf0, 0x2c, 0x69, 0x72, 0xde, 0x98, 0x6, 0x28, 0x5f, 0xc8, 0x28, 0xec, 0xb1, 0x83, 0xc2, 0x7e, 0x46, 0xfb, 0x31, 0x23, 0x77, 0xa4, 0x57, 0xe4, 0xea, 0x8e, 0x15, 0xa0, 0x5, 0xdc, 0x6d, 0xee, 0xdb, 0x57, 0x98, 0xd1, 0x71, 0x16, 0xc4, 0x18, 0x24, 0x52, 0x26, 0xb3, 0x58, 0xd, 0x2c, 0x3c, 0x7e, 0xfc, 0xfd, 0x3f, 0xda, 0x7c, 0xee, 0x26, 0x54, 0x52, 0x3a, 0x3a, 0xa8, 0xc3, 0x2, 0xdf, 0x69, 0x8, 0x1b, 0x34, 0xc8, 0xbf, 0x3b, 0x72, 0x42, 0xbf, 0x23, 0xa0, 0x91, 0x26, 0x45, 0x14, 0x2a, 0x0, 0x15, 0x3d, 0x30, 0xfa, 0xed, 0x85, 0x4c, 0x32, 0xf7, 0x5e, 0xda, 0xf3, 0xd4, 0x87, 0x54, 0x65, 0x97, 0x25, 0x86, 0xc, 0xb5, 0xdc, 0xc0, 0x5b, 0x2f, 0x35, 0x6c, 0xa9, 0x32, 0x48, 0xb0, 0x27, 0x69, 0x8f, 0x4c, 0xf9, 0xf2, 0x55, 0xba, 0xe1, 0x8e, 0xd0, 0xfa, 0x45, 0x4b, 0x34, 0x99, 0x6f, 0x99, 0x6a, 0x5d, 0x45, 0xaa, 0xa8, 0x8d, 0xcb, 0x33, 0xe1, 0xf7, 0xc1, 0x8d, 0x75, 0xec, 0x21, 0x7, 0x5d, 0x39, 0x35, 0x2a, 0x26, 0xe9, 0xe7, 0xca, 0xf3, 0x9e, 0xd5, 0x70, 0x66, 0x1d, 0x9d, 0xa4, 0x78, 0xb9, 0xe1, 0xc5, 0xc1, 0x63, 0xf, 0xde, 0x37, 0x1c, 0x7c, 0xcb, 0x69, 0xc, 0xc3, 0x72, 0x30, 0xe6, 0x50, 0xc8, 0x77, 0x52, 0x8a, 0x27, 0x1d, 0xe6, 0x3d, 0x6a, 0x1f, 0x8f, 0x5f, 0xf1, 0x84, 0xad, 0xa7, 0x2c, 0x59, 0x45, 0xbb, 0xa8, 0x46, 0xb8, 0x24, 0xd4, 0xe4, 0xee, 0xe3, 0x12, 0x19, 0x67, 0xfb, 0xe5, 0x79, 0x20, 0xa9, 0xa7, 0x6b, 0x5e, 0x72, 0xaa, 0x70, 0xeb, 0x1f, 0x33, 0xe1, 0x37, 0xd8, 0xf5, 0x7d, 0xf5, 0xcc, 0x80, 0x50, 0x21, 0x2e, 0xf7, 0x7f, 0x1d, 0xe0, 0xca, 0xe4, 0x7d, 0xa7, 0x12, 0x4, 0xe6, 0x3e, 0x24, 0xd9, 0x25, 0x90, 0x44, 0xdf, 0xac, 0x7c, 0xff, 0x6, 0x31, 0x5a, 0xef, 0x23, 0xcd, 0xf7, 0x75, 0xbe, 0xa8, 0xf7, 0xde, 0xd, 0x22, 0x78, 0x95, 0xbc, 0x8b, 0x66, 0x5e, 0x36, 0x86, 0x80, 0x98, 0xdc, 0xfb, 0xa5, 0xbd, 0xaa, 0xda, 0xdc, 0xa8, 0xad, 0xbe, 0x1f, 0x5f, 0x25, 0x4c, 0x6b, 0x14, 0xbc, 0xc3, 0xcf, 0x34, 0xcf, 0x29, 0xde, 0xfc, 0x9c, 0xe4, 0xd1, 0x85, 0x7e, 0x3e, 0x45, 0xbb, 0xac, 0xb5, 0x58, 0x23, 0xf9, 0x79, 0x96, 0xa0, 0x9c, 0xff, 0x23, 0x8, 0x24, 0x96, 0x2d, 0xfc, 0x15, 0x1e, 0xd1, 0x11, 0xc, 0xf7, 0xad, 0x65, 0x8d, 0x55, 0x1c, 0xce, 0xb0, 0xc, 0x23, 0xf7, 0x8c, 0x7, 0xb6, 0xbf, 0xb, 0x5, 0x4d, 0x53, 0x5b, 0x3b, 0x36, 0x16, 0xe, 0x13, 0xf1, 0x1e, 0xee, 0x82, 0x9e, 0x99, 0xb4, 0x7a, 0xaa, 0xe0, 0x27, 0x41, 0x2c, 0x36, 0x79, 0x2d, 0xac, 0x1d, 0xce, 0xb0, 0x6c, 0xbb, 0x91, 0x90, 0xc, 0x92, 0x67, 0x24, 0xdf, 0x23, 0x22, 0x63, 0x8d, 0x64, 0x1e, 0x28, 0x8f, 0x2e, 0xe3, 0xef, 0x9e, 0x7d, 0xf, 0xfd, 0xf4, 0x96, 0x2, 0xf1, 0x57, 0x55, 0x77, 0x36, 0xb4, 0x51, 0xea, 0xa3, 0x76, 0xca, 0x1d, 0x5, 0x8, 0x95, 0xfb, 0x60, 0x8f, 0xe9, 0xf3, 0xf1, 0xf7, 0x1c, 0x83, 0xea, 0x32, 0xff, 0x31, 0x4b, 0x71, 0x2c, 0x8d, 0xf1, 0x7b, 0x3e, 0x64, 0xca, 0x2a, 0x9d, 0x2e, 0x39, 0xc3, 0xb5, 0x64, 0x23, 0x2d, 0xdc, 0x6a, 0xcc, 0x9c, 0xfd, 0xa9, 0x9b, 0x1b, 0x72, 0xcc, 0xec, 0x97, 0x23, 0xfc, 0x34, 0x38, 0x83, 0xfa, 0x9a, 0xf3, 0x43, 0x69, 0x62, 0x85, 0x32, 0xa6, 0x22, 0x17, 0x95, 0x22, 0x10, 0xfc, 0x70, 0x41, 0xd5, 0x3d, 0xd6, 0x81, 0x6d, 0x2e, 0xcc, 0xae, 0x8f, 0xa5, 0x5f, 0x9f, 0x3b, 0x9a, 0x7d, 0xe7, 0x25, 0x87, 0x6c, 0xb6, 0xe0, 0xeb, 0x84, 0x63, 0xea, 0x5c, 0x23, 0x11, 0x4a, 0xe2, 0x45, 0x58, 0x18, 0xc1, 0xa8, 0x6, 0xb1, 0x93, 0xd0, 0xeb, 0x86, 0xb2, 0x37, 0x1, 0x7d, 0xc5, 0x8e, 0xb4, 0x2d, 0x18, 0x31, 0xf0, 0xb9, 0x33, 0xb2, 0x4, 0xf8, 0x32, 0x5d, 0x51, 0x26, 0xad, 0x3a, 0x9, 0xd4, 0xb1, 0xbb, 0x6, 0xec, 0xd1, 0x83, 0xd, 0xfe, 0x42, 0xa1, 0x88, 0xf8, 0x73, 0x5c, 0x24, 0x99, 0xc0, 0x95, 0x3b, 0x32, 0xcd, 0xed, 0x52, 0xaf, 0xd4, 0x26, 0xb1, 0xe6, 0x52, 0xcb, 0x8f, 0x1e, 0x2c, 0x2, 0xf8, 0x39, 0xd3, 0x6, 0x1, 0x4c, 0xac, 0x51, 0x5a, 0x50, 0xe1, 0xac, 0x44, 0xce, 0xe1, 0x89, 0xc5, 0x7c, 0xe9, 0x81, 0x43, 0xd9, 0xd3, 0xf8, 0xe0, 0xb8, 0xa4, 0xc5, 0x62, 0x11, 0x9b, 0xe9, 0x59, 0xf9, 0xc9, 0xe, 0xfd, 0xf7, 0x62, 0xd2, 0x90, 0xc9, 0x13, 0x3e, 0x28, 0xc9, 0x54, 0xc8, 0xfb, 0x85, 0x70, 0xdc, 0xae, 0xe7, 0xfd, 0x4, 0x2d, 0xcb, 0xbe, 0xdc, 0x47, 0x65, 0x77, 0x7d, 0x5, 0x5f, 0xfa, 0x76, 0x9a, 0x91, 0xf5, 0xbd, 0x8d, 0x54, 0xa0, 0x64, 0x7c, 0x1a, 0xa, 0xf7, 0xb7, 0x79, 0x3e, 0xb4, 0x9d, 0xdf, 0xc0, 0xc1, 0xd, 0xd6, 0x63, 0xfe, 0x51, 0xe2, 0x4a, 0xa, 0x6d, 0xbf, 0x8a, 0xc, 0x7f, 0x32, 0xe3, 0xd5, 0xe0, 0xe8, 0xce, 0x7e, 0x2b, 0x36, 0x0, 0x55, 0xff, 0x8, 0x50, 0x5, 0x5d, 0xf7, 0xe6, 0xa0, 0x3e, 0x4f, 0xc8, 0x4a, 0xf2, 0x2f, 0xb6, 0xde, 0x30, 0xb7, 0x16, 0x71, 0x5d, 0xfd, 0x69, 0x69, 0x93, 0x78, 0xe5, 0xe1, 0xd, 0x95, 0x6, 0x15, 0xd0, 0xc6, 0x2b, 0xf7, 0xe9, 0xe7, 0x63, 0x14, 0x2e, 0xa5, 0xec, 0x39, 0x1b, 0x41, 0x84, 0xa6, 0xff, 0x2f, 0x7f, 0x3, 0x7c, 0x30, 0x85, 0x3c, 0x67, 0xda, 0x91, 0x7f, 0x74, 0x0, 0xa6, 0xd6, 0xd0, 0xe9, 0x78, 0xcb, 0xc9, 0xe1, 0x43, 0x8d, 0xb0, 0xf5, 0xce, 0xb5, 0x27, 0x44, 0xc6, 0xc0, 0xf, 0xd6, 0x2f, 0xa, 0xa6, 0xa, 0x16, 0x1d, 0x5c, 0x7f, 0xcf, 0x17, 0x26, 0x12, 0x76, 0xda, 0x2, 0x60, 0x52, 0xe3, 0xee, 0x4e, 0x5d, 0xe2, 0xd6, 0xe9, 0x33, 0x35, 0xfd, 0xa, 0x5b, 0xfa, 0xb2, 0x88, 0x6f, 0x12, 0xb9, 0xb0, 0xb7, 0x6b, 0xe7, 0x66, 0x68, 0x85, 0x88, 0x99, 0x6a, 0x2e, 0x69, 0xca, 0x65, 0xdb, 0x49, 0x4f, 0x39, 0xdf, 0x3f, 0x6, 0xd6, 0xd8, 0x22, 0x91, 0x69, 0x29, 0x25, 0xcf, 0xc4, 0xd7, 0x3d, 0xbf, 0xbf, 0x15, 0xe8, 0x3b, 0xe1, 0xc8, 0x28, 0x53, 0xae, 0x8c, 0xf9, 0xd1, 0xdc, 0xed, 0xb2, 0xc4, 0x10, 0x5f, 0x37, 0xad, 0x6, 0xce, 0x5c, 0x7f, 0x8b, 0xeb, 0xd4, 0xef, 0xe1, 0xa2, 0x80, 0x45, 0x9f, 0x66, 0xb4, 0x99, 0x86, 0xbd, 0x5b, 0xd0, 0xf9, 0x93, 0xd5, 0x13, 0x6d, 0x97, 0xe7, 0xc9, 0xa4, 0x28, 0x55, 0xd3, 0x28, 0x7e, 0x1c, 0x95, 0xe0, 0x23, 0x39, 0x77, 0xb5, 0x6b, 0x3f, 0x90, 0x37, 0x29, 0xb9, 0x7f, 0x4e, 0x84, 0x4d, 0xed, 0x84, 0xc9, 0x69, 0x82, 0x8a, 0x2e, 0x4a, 0x17, 0xb2, 0x54, 0xd3, 0x36, 0x41, 0x2c, 0xfb, 0xdd, 0x4a, 0xbd, 0x25, 0xe1, 0x26, 0x4b, 0x14, 0xde, 0xf4, 0x2d, 0xf7, 0xfd, 0x1a, 0x10, 0xe6, 0xb0, 0x9d, 0xaa, 0xd0, 0xb8, 0xd1, 0x9b, 0xe4, 0xaa, 0xef, 0x45, 0x44, 0xb2, 0x93, 0x15, 0x33, 0xee, 0x4e, 0xc5, 0x5d, 0xb, 0xf1, 0x4b, 0x9, 0xb9, 0xe3, 0x35, 0xfa, 0xd2, 0xd6, 0x2b, 0xc4, 0x6a, 0x7d, 0x56, 0xdb, 0xae, 0x96, 0x1f, 0xbb, 0x68, 0x64, 0xf8, 0x6d, 0x8e, 0xb2, 0x43, 0x48, 0x1a, 0x5b, 0xfe, 0xe, 0x40, 0xb2, 0x79, 0x63, 0x5, 0xbb, 0x1b, 0x96, 0x6b, 0xa2, 0xa6, 0x70, 0xf0, 0xf5, 0xca, 0xb6, 0x39, 0x6e, 0x8e, 0x32, 0xd, 0x6c, 0x68, 0x70, 0xd3, 0xc8, 0x5f, 0x89, 0xcf, 0x6, 0xda, 0x80, 0xc9, 0xfd, 0x63, 0xb3, 0x10, 0x88, 0x4d, 0x80, 0xc3, 0x89, 0xa0, 0x3e, 0x89, 0xf, 0xa, 0x66, 0x9, 0x9b, 0x0, 0xc9, 0xaa, 0x23, 0x58, 0xa2, 0xe5, 0xf5, 0x81, 0xa6, 0x7b, 0x2d, 0x26, 0xb2, 0x3a, 0x86, 0x13, 0x34, 0x8c, 0xc, 0xc3, 0x4f, 0xf7, 0x59, 0x20, 0xc3, 0xb7, 0x44, 0x15, 0x69, 0x34, 0x61, 0x1c, 0xb2, 0x76, 0xf2, 0x5c, 0xf6, 0xba, 0xda, 0x4, 0x51, 0x2a, 0x6b, 0xa9, 0xe3, 0x2f, 0xe4, 0x3e, 0xa4, 0x9, 0xd1, 0x8, 0xbb, 0x70, 0x16, 0x7f, 0x20, 0x7b, 0x87, 0x22, 0xbe, 0x91, 0x52, 0x61, 0x4e, 0x88, 0xd1, 0xd, 0x9b, 0xbf, 0xc2, 0xa3, 0x97, 0xdc, 0xe8, 0x5a, 0x62, 0xe8, 0x86, 0x9b, 0x43, 0xf7, 0x4e, 0x58, 0x8, 0xff, 0x98, 0xd8, 0xdc, 0xa5, 0x90, 0x71, 0xde, 0x3d, 0xee, 0x58, 0x20, 0x40, 0x6c, 0x28, 0x26, 0xc1, 0xb1, 0x87, 0x5f, 0x17, 0xb2, 0xb0, 0x3d, 0xb5, 0x6d, 0x2a, 0x10, 0x71, 0x47, 0x33, 0xcc, 0x61, 0x68, 0x91, 0xf9, 0x69, 0x2d, 0xa5, 0x85, 0x13, 0xa8, 0x4f, 0xda, 0xa4, 0x69, 0x54, 0x59, 0x2f, 0x50, 0x38, 0x33, 0x6e, 0x78, 0xd7, 0x1d, 0xc5, 0x3a, 0x96, 0x53, 0x28, 0xef, 0xb8, 0x34, 0x25, 0x1b, 0x89, 0x1a, 0xf8, 0x19, 0xf0, 0xc0, 0x75, 0xd7, 0x4b, 0x4f, 0xc, 0x97, 0x19, 0xb6, 0x81, 0xf6, 0x19, 0xbe, 0xf3, 0x5a, 0x2a, 0x8c, 0x28, 0x17, 0xec, 0x98, 0x4, 0xdb, 0x63, 0x94, 0xb1, 0xf, 0x77, 0x2f, 0x54, 0xe9, 0x9d, 0xd9, 0x5e, 0x53, 0xd7, 0x4c, 0x20, 0xc6, 0xc1, 0x97, 0xfc, 0xce, 0x9, 0x3f, 0x48, 0xc4, 0xb6, 0xd3, 0xf8, 0xb4, 0x63, 0x5a, 0x15, 0xaf, 0x25, 0xd7, 0xec, 0x20, 0x1e, 0xc0, 0x4f, 0xd2, 0x95, 0xc, 0x1f, 0x12, 0xe7, 0x9a, 0x94, 0x74, 0xd3, 0xdf, 0xec, 0xb7, 0x77, 0xec, 0x72, 0xdb, 0x6d, 0x7d, 0xae, 0xa4, 0x53, 0x3, 0x3b, 0x9d, 0x7, 0xfe, 0xab, 0x9e, 0xf3, 0x1, 0x78, 0xc2, 0x62, 0xeb, 0xaa, 0xa4, 0xb3, 0xa, 0x34, 0x39, 0xde, 0x27, 0x8d, 0xca, 0x82, 0xa9, 0x20, 0x75, 0xd1, 0xfb, 0xed, 0xc6, 0xbd, 0xe4, 0xc2, 0x7e, 0x81, 0x58, 0x13, 0xac, 0xc6, 0x31, 0xde, 0x78, 0x2d, 0x31, 0xa6, 0x2e, 0x20, 0x9, 0x76, 0xbf, 0x83, 0x94, 0xe1, 0xd8, 0xc6, 0x22, 0xb6, 0xb8, 0x4a, 0xf6, 0x74, 0xde, 0x80, 0xe5, 0x9c, 0x58, 0xdf, 0xdd, 0xd2, 0xc8, 0x6a, 0x2e, 0xa, 0xe7, 0x66, 0x30, 0x5, 0x5c, 0x6e, 0x10, 0x43, 0x5a, 0x6b, 0x9c, 0x8c, 0x9b, 0xe5, 0xed, 0xf5, 0xc6, 0xd3, 0x52, 0xae, 0xc9, 0xce, 0xfc, 0xc3, 0xa5, 0xd6, 0x30, 0xef, 0xa9, 0xc0, 0x4f, 0x22, 0x7c, 0xec, 0xed, 0xed, 0x6c, 0xc1, 0x95, 0x83, 0xf0, 0xf, 0x19, 0xde, 0xf, 0xde, 0x94, 0x8f, 0xec, 0x12, 0xbe, 0x33, 0x34, 0x2d, 0x85, 0xb8, 0x1a, 0x13, 0xd, 0x2a, 0xa9, 0x98, 0xee, 0x36, 0x33, 0xfa, 0xe0, 0x45, 0xd7, 0xa4, 0x66, 0xef, 0xee, 0x80, 0x7d, 0xd3, 0x19, 0x1, 0xba, 0x1b, 0x53, 0x12, 0xb6, 0x15, 0xfe, 0x51, 0xb3, 0xc1, 0x70, 0xe7, 0x86, 0x97, 0xa3, 0xd5, 0x82, 0xf8, 0xd6, 0xba, 0xaf, 0x10, 0x1, 0xbf, 0xd, 0xb8, 0x1c, 0x5f, 0x1e, 0x3d, 0x6, 0x79, 0x9f, 0xc0, 0x8a, 0x13, 0x25, 0x56, 0xa1, 0x46, 0x27, 0x2f, 0xd2, 0x9e, 0x8, 0x91, 0x12, 0x70, 0x85, 0x7e, 0xe0, 0xac, 0x42, 0xa8, 0x61, 0x40, 0x19, 0xd9, 0x3e, 0x79, 0x94, 0x85, 0xa4, 0xf4, 0xd7, 0xd6, 0x3e, 0xe8, 0x30, 0x4d, 0xff, 0xee, 0xf9, 0x69, 0x72, 0xec, 0x9e, 0x5, 0x80, 0x9d, 0xc, 0x59, 0xba, 0xac, 0x90, 0xd1, 0xb9, 0x79, 0x1e, 0x58, 0xa4, 0xec, 0x5f, 0x1e, 0x6a, 0x50, 0x1d, 0x27, 0x54, 0xbe, 0x8f, 0xa7, 0xcf, 0x39, 0x24, 0x8e, 0x2c, 0x2b, 0xa3, 0xde, 0x8d, 0x8b, 0x7d, 0x5d, 0x1b, 0x8d, 0x19, 0xfb, 0x37, 0xab, 0x8d, 0x7, 0x11, 0x2c, 0xf3, 0x74, 0x38, 0xb9, 0x42, 0x6d, 0xcb, 0x5f, 0xf1, 0x84, 0x4f, 0xf9, 0x41, 0x4f, 0xb7, 0xdd, 0x91, 0xb2, 0x24, 0x15, 0x27, 0xa, 0x54, 0x64, 0x6a, 0x64, 0x5a, 0x8b, 0x75, 0x12, 0xc, 0xa, 0x95, 0x80, 0x95, 0xce, 0x3d, 0x93, 0x37, 0xf2, 0xf9, 0x32, 0xce, 0xf8, 0x2c, 0xab, 0xd0, 0xed, 0xc8, 0x4e, 0xb, 0xdd, 0x73, 0x73, 0xc1, 0x71, 0x16, 0xc6, 0x54, 0xa0, 0x44, 0x14, 0x82, 0xa2, 0x37, 0xf1, 0x53, 0x8b, 0x4e, 0x1b, 0xa, 0x76, 0x81, 0x9e, 0x3b, 0xf9, 0xf9, 0x24, 0x42, 0xc0, 0xa6, 0x3c, 0x1e, 0x67, 0xcf, 0x34, 0x4b, 0x78, 0x18, 0x94, 0xb9, 0xa9, 0xcd, 0xd2, 0xec, 0xbb, 0x81, 0x48, 0x38, 0xab, 0xb2, 0x79, 0x19, 0x83, 0x38, 0x2d, 0x3c, 0xe0, 0xf2, 0xb7, 0xfe, 0x54, 0xef, 0xb7, 0x46, 0x10, 0xae, 0x7e, 0x35, 0xc6, 0xef, 0xe4, 0x32, 0x29, 0x61, 0x29, 0x49, 0x70, 0xe6, 0x17, 0x5b, 0x35, 0xb1, 0xd4, 0x5, 0x3, 0xa2, 0x56, 0xa1, 0xb4, 0x58, 0x6a, 0x13, 0xa9, 0x88, 0xec, 0x75, 0xd2, 0xb4, 0x85, 0x99, 0x37, 0xbc, 0x8b, 0x33, 0xaf, 0x6e, 0x31, 0x91, 0x8b, 0x71, 0x9, 0xa5, 0x52, 0xd1, 0x7a, 0x9a, 0x22, 0x61, 0xe9, 0x7a, 0x15, 0x45, 0xc4, 0xf7, 0x9, 0x11, 0xfa, 0x88, 0x80, 0xfb, 0xa7, 0x7c, 0x19, 0xcf, 0xc5, 0x96, 0xdc, 0x4d, 0x47, 0x72, 0x42, 0x1, 0x76, 0x71, 0x77, 0x30, 0xa, 0x55, 0xd2, 0xa2, 0x1d, 0xf7, 0xc, 0x4d, 0x98, 0x98, 0x46, 0x53, 0xc6, 0xaa, 0x2a, 0x3a, 0xb8, 0x37, 0xe9, 0x6c, 0x9b, 0x8d, 0xf3, 0x5a, 0xc3, 0x1d, 0xf9, 0xe9, 0x99, 0x28, 0xbf, 0xc8, 0x83, 0xad, 0x98, 0x25, 0x16, 0x6c, 0x53, 0xb5, 0xc9, 0x6a, 0x70, 0x8e, 0x2c, 0x5c, 0xf8, 0xd, 0x14, 0x42, 0xde, 0x2b, 0x63, 0x7a, 0x8a, 0x5, 0xf4, 0x39, 0xb8, 0x4f, 0x31, 0x12, 0xf5, 0x47, 0x2a, 0x57, 0x10, 0x7c, 0x4e, 0x82, 0x89, 0x19, 0x23, 0x26, 0x88, 0x87, 0x4a, 0x56, 0xe1, 0x16, 0x20, 0x3d, 0x29, 0xa8, 0x76, 0x45, 0xc0, 0x18, 0xf8, 0xc0, 0x11, 0xcb, 0x31, 0xc6, 0x40, 0x97, 0x7d, 0x1e, 0xb9, 0x83, 0xa0, 0xce, 0xff, 0xcb, 0xd0, 0x23, 0xcb, 0xbd, 0x98, 0xdc, 0x88, 0xf6, 0x95, 0x74, 0xdc, 0x40, 0xfc, 0x4a, 0x4c, 0x12, 0xd7, 0xc, 0x49, 0x26, 0x5c, 0x77, 0x18, 0x1f, 0x84, 0xec, 0x51, 0xe6, 0x4a, 0xaf, 0xfd, 0xb4, 0xc3, 0xa6, 0x3e, 0x39, 0xd, 0x8e, 0x33, 0x7f, 0x43, 0x33, 0x1f, 0x1e, 0xb5, 0xe7, 0x53, 0x60, 0x2b, 0x83, 0xfb, 0x39, 0xd5, 0x14, 0x9e, 0x61, 0xda, 0x2, 0xe7, 0x46, 0xe0, 0xf6, 0xee, 0xcd, 0xd1, 0xac, 0x9c, 0x85, 0xc8, 0xbf, 0x94, 0x90, 0x2a, 0xfd, 0xbd, 0x64, 0x1e, 0x4d, 0xc5, 0xf, 0xc6, 0xac, 0x58, 0x85, 0x1e, 0x72, 0x27, 0xaf, 0x8f, 0x84, 0x92, 0x39, 0x9, 0xd0, 0x4c, 0xa1, 0xda, 0xcb, 0x8f, 0x7a, 0xc2, 0xb9, 0xa4, 0x0, 0x9, 0x12, 0xe6, 0x6d, 0x28, 0x8f, 0xcf, 0x20, 0x1b, 0x2b, 0x19, 0xbd, 0x83, 0xbe, 0xd9, 0x68, 0x1, 0xb9, 0x56, 0x23, 0x8a, 0xa4, 0x49, 0x4a, 0x94, 0x7a, 0x1e, 0xce, 0x7d, 0x0, 0x62, 0x44, 0xe7, 0x9c, 0xb9, 0x63, 0xb7, 0xf5, 0xb5, 0x4c, 0xa5, 0x48, 0xab, 0xb8, 0xe7, 0xdd, 0x5e, 0xf5, 0xd2, 0x73, 0xc6, 0x9e, 0xda, 0xef, 0xfa, 0x8c, 0x74, 0x7f, 0x56, 0xd1, 0xec, 0xbc, 0x87, 0x8, 0x6b, 0x1b, 0x38, 0x46, 0xc2, 0xf3, 0x78, 0xe1, 0xce, 0x97, 0x44, 0x69, 0xcb, 0x66, 0x62, 0x1e, 0xe3, 0x25, 0x65, 0x5e, 0x13, 0x64, 0x7d, 0x69, 0x26, 0xde, 0x31, 0x59, 0x7a, 0x50, 0x93, 0x1a, 0x2, 0x55, 0x2b, 0x14, 0xcf, 0x6, 0x3c, 0x8d, 0x87, 0x11, 0xcd, 0xb4, 0x40, 0x3f, 0xec, 0x91, 0x6a, 0xe7, 0x70, 0xdf, 0xc2, 0x53, 0x75, 0x4e, 0xad, 0x81, 0x4e, 0x48, 0x6e, 0x9d, 0x2e, 0x27, 0xb5, 0x87, 0xf, 0x83, 0x4a, 0x51, 0xff, 0xc6, 0xe5, 0x93, 0x1c, 0xea, 0x8e, 0x2a, 0x19, 0xc4, 0xdc, 0x2a, 0xcc, 0x67, 0x5a, 0x53, 0xf4, 0x42, 0xe2, 0x27, 0x7e, 0xc7, 0x99, 0x51, 0xc0, 0xd0, 0xf2, 0x9c, 0xda, 0x8c, 0x54, 0x84, 0xe7, 0xfa, 0x22, 0xbc, 0x2f, 0x50, 0x82, 0xa1, 0x72, 0xf5, 0xdf, 0xa9, 0xbd, 0xc0, 0x72, 0xb3, 0x58, 0x61, 0xb8, 0x71, 0x9b, 0x5f, 0x7, 0xdd, 0x82, 0x2b, 0x59, 0x3a, 0xf3, 0xe0, 0x2e, 0x3, 0x23, 0x95, 0x35, 0x27, 0x30, 0x76, 0x32, 0x5a, 0x50, 0xc4, 0x21, 0xa7, 0xe1, 0x7f, 0x9f, 0x40, 0x96, 0xf7, 0x82, 0x3e, 0x6e, 0x7b, 0x9e, 0xba, 0x37, 0xea, 0x56, 0x63, 0xc6, 0xb4, 0x5d, 0xf5, 0xff, 0xa, 0x15, 0x84, 0xdc, 0x1a, 0x62, 0xc8, 0x6c, 0x59, 0xf9, 0xe, 0x8, 0xf0, 0xb6, 0x7a, 0x64, 0x6d, 0xb8, 0x85, 0x6c, 0x75, 0x15, 0xc2, 0xb9, 0x1d, 0xaa, 0x94, 0xdb, 0xc9, 0xa5, 0xb1, 0x13, 0x20, 0xb1, 0x6d, 0xd3, 0x2d, 0x3, 0xc9, 0x86, 0x42, 0x1c, 0xc6, 0x6a, 0xde, 0x84, 0xf8, 0x6c, 0xc7, 0x88, 0x2f, 0xd3, 0x3f, 0x4a, 0xb3, 0xd0, 0x35, 0xc0, 0x7b, 0x41, 0xe3, 0xa7, 0xc0, 0x27, 0x83, 0x6b, 0x38, 0xb, 0x44, 0xd1, 0x62, 0x3, 0xac, 0x2d, 0x26, 0xb7, 0x8f, 0x43, 0xf9, 0xcd, 0xe0, 0x4c, 0x11, 0x41, 0x2c, 0xb1, 0xa0, 0x95, 0xad, 0xf1, 0xce, 0xa5, 0x2b, 0x62, 0x43, 0xd5, 0x67, 0xa8, 0x37, 0x9b, 0xc0, 0xc9, 0x86, 0xe4, 0x1, 0xd2, 0xcd, 0xd6, 0x26, 0x97, 0x92, 0xff, 0x42, 0xbf, 0x7a, 0x47, 0x20, 0x8d, 0x46, 0xe9, 0x11, 0xec, 0x82, 0xca, 0x31, 0xa0, 0x5f, 0xa0, 0x1c, 0xb6, 0xe, 0x5d, 0xcf, 0x73, 0x2e, 0x96, 0xaa, 0x5, 0xa3, 0xba, 0x49, 0x56, 0xe4, 0x15, 0x40, 0xb9, 0x61, 0x2b, 0xad, 0x35, 0x38, 0x21, 0x6c, 0x5f, 0x8e, 0x2b, 0x6d, 0x63, 0x47, 0xf7, 0x48, 0x2b, 0x1c, 0xf1, 0xe, 0x68, 0xa7, 0x8b, 0xc1, 0x5e, 0x7b, 0xcd, 0xa8, 0xec, 0xcc, 0x7e, 0x15, 0xef, 0x4d, 0xc8, 0x73, 0x7d, 0x1e, 0x58, 0x51, 0xf6, 0x6a, 0x54, 0x13, 0x2e, 0xdb, 0xc7, 0x39, 0x87, 0xb, 0xe2, 0xc, 0x46, 0x7c, 0x12, 0xd9, 0xed, 0xe2, 0xb1, 0xfa, 0xa8, 0xe6, 0x35, 0x6f, 0xc4, 0x1d, 0x9a, 0xba, 0x7b, 0xe, 0x69, 0x80, 0x6f, 0x66, 0x69, 0x1b, 0xa0, 0x90, 0x88, 0x64, 0x3d, 0xe, 0x53, 0xd6, 0x0, 0x3e, 0xc2, 0x99, 0xb1, 0x4c, 0xbd, 0x37, 0x0, 0x7a, 0xba, 0xb7, 0x2c, 0x4e, 0x27, 0xe7, 0x3a, 0x24, 0x57, 0x67, 0xb6, 0x50, 0xac, 0x9f, 0x72, 0x24, 0xf3, 0x23, 0x61, 0x79, 0x41, 0x8f, 0xf4, 0xcb, 0x72, 0xb3, 0x56, 0x7a, 0x36, 0xeb, 0x3, 0x92, 0x79, 0xb7, 0x5c, 0xe1, 0x37, 0xbe, 0xdd, 0x33, 0x40, 0xdc, 0xdf, 0x1f, 0x52, 0x1b, 0x7f, 0x8d, 0x8d, 0xae, 0xed, 0x10, 0xf4, 0x21, 0x47, 0x75, 0xdc, 0xbd, 0x4e, 0xf2, 0x6a, 0xbe, 0x4d, 0xa7, 0x18, 0x6e, 0x84, 0xae, 0x65, 0x99, 0x87, 0x92, 0x2a, 0x29, 0xb3, 0xdc, 0x4, 0xa0, 0xc7, 0x92, 0xb0, 0x77, 0xf6, 0x5c, 0xc1, 0xdd, 0x5, 0x6, 0x6c, 0x80, 0x64, 0x84, 0x3a, 0x8, 0xb0, 0x97, 0xb9, 0x3d, 0x70, 0xdf, 0x68, 0x4a, 0xd0, 0x7d, 0xbf, 0x5, 0x45, 0x4e, 0x13, 0x9c, 0x8c, 0x7f, 0xcf, 0x8c, 0x39, 0x3d, 0xe6, 0xa4, 0xaf, 0xf8, 0xb5, 0x41, 0x7f, 0x51, 0xe6, 0xa6, 0xcc, 0xc1, 0x7b, 0xad, 0x42, 0x93, 0x8b, 0xaa, 0xc1, 0x5a, 0x89, 0x16, 0xcd, 0xb0, 0xa9, 0x6a, 0x37, 0x4c, 0x8e, 0xf2, 0x53, 0xd3, 0xdc, 0xad, 0xa, 0xae, 0x90, 0x6f, 0xbd, 0x3a, 0x47, 0xff, 0x8e, 0x14, 0x8a, 0x31, 0x9, 0x24, 0x48, 0x76, 0x21, 0x27, 0x19, 0xca, 0xcc, 0x5e, 0xeb, 0xc5, 0xae, 0x22, 0xd2, 0xfb, 0x27, 0x25, 0x54, 0x58, 0x94, 0xd, 0xb5, 0x81, 0xa9, 0x52, 0x48, 0x59, 0xba, 0x8c, 0x6a, 0xe2, 0x3, 0x4e, 0x1f, 0xa0, 0x4a, 0xf9, 0xe0, 0xc2, 0xf5, 0xc5, 0x1d, 0xe1, 0xc7, 0x6c, 0x98, 0x71, 0x4e, 0xfa, 0xb6, 0x1f, 0x2, 0x8d, 0xb3, 0xa5, 0x96, 0x19, 0xfc, 0xf, 0x3f, 0x40, 0x85, 0x93, 0x8e, 0x26, 0x6, 0xe, 0x95, 0x61, 0x1a, 0xd0, 0x9, 0x1f, 0xd1, 0x93, 0x17, 0x65, 0x46, 0x5d, 0x40, 0x96, 0xeb, 0x5, 0xdf, 0x5a, 0xed, 0x77, 0xcc, 0x85, 0xa8, 0x63, 0x72, 0xea, 0xa0, 0x35, 0x25, 0xdc, 0x7, 0xd5, 0x38, 0xc3, 0x4f, 0xa9, 0x81, 0xad, 0xe7, 0x68, 0x9d, 0x4d, 0x22, 0x5a, 0x4b, 0x70, 0x6c, 0x31, 0x5f, 0x59, 0x26, 0x4f, 0x38, 0xa9, 0x4f, 0xe3, 0x36, 0x18, 0x96, 0x98, 0xe9, 0x1f, 0x17, 0x86, 0x6c, 0x49, 0x27, 0x39, 0xc4, 0x1b, 0x99, 0x98, 0xd7, 0x61, 0x87, 0xc6, 0x5a, 0xdb, 0x6f, 0xce, 0xd6, 0x96, 0x9e, 0xb2, 0xfc, 0xfe, 0x24, 0xa, 0xa3, 0x66, 0xac, 0xe5, 0xa6, 0xff, 0x2d, 0xc7, 0xd9, 0x6a, 0x70, 0x1e, 0xb5, 0x35, 0x6f, 0x12, 0xdf, 0xeb, 0xa9, 0xc3, 0xb4, 0xeb, 0x9c, 0xb9, 0x90, 0x8d, 0x60, 0xbf, 0xaf, 0x89, 0x53, 0xa7, 0x58, 0x98, 0xc8, 0xc6, 0x4f, 0x3c, 0x11, 0x76, 0xaa, 0xb5, 0xe2, 0x97, 0xb0, 0x8e, 0xde, 0x80, 0x4, 0x13, 0xb9, 0x63, 0xcc, 0x22, 0x10, 0x7e, 0x6c, 0x6, 0xcc, 0x6c, 0x5, 0xb6, 0xda, 0x3b, 0x0, 0xf9, 0xed, 0xb2, 0x44, 0xb1, 0xcb, 0x33, 0x5b, 0x8a, 0xe0, 0x8a, 0x3a, 0x14, 0x83, 0xb4, 0xa6, 0x2b, 0xb, 0xe6, 0xa1, 0x8f, 0x27, 0x4e, 0xfb, 0x42, 0x78, 0x31, 0x25, 0x1c, 0xb3, 0x24, 0x8, 0x38, 0xcd, 0x90, 0x7c, 0xcf, 0xe4, 0xd4, 0x78, 0xf8, 0x5e, 0x69, 0x86, 0x4d, 0xdf, 0x5c, 0xe8, 0x3a, 0x9a, 0x59, 0x50, 0xab, 0x2a, 0x36, 0xfc, 0x44, 0x58, 0xb3, 0x76, 0x0, 0xe0, 0x22, 0x4, 0x1a, 0xe7, 0xc8, 0xb1, 0x6e, 0x87, 0xa6, 0xd9, 0xd, 0x72, 0xce, 0xff, 0x4b, 0x34, 0x73, 0xa1, 0xe6, 0x3b, 0xfe, 0xc0, 0x16, 0xa6, 0x62, 0x2a, 0x16, 0xec, 0x41, 0xbc, 0x17, 0x41, 0x30, 0xd, 0x67, 0x13, 0x3e, 0xf6, 0xb1, 0xbe, 0x79, 0x6d, 0x3a, 0x90, 0x68, 0xc5, 0x3f, 0xaa, 0xcc, 0xaf, 0xfe, 0x31, 0xf5, 0xac, 0x57, 0x9b, 0x99, 0x55, 0x30, 0x17, 0xdf, 0xd7, 0x95, 0x63, 0xab, 0xf, 0xf8, 0x72, 0xfc, 0x97, 0x1d, 0x7f, 0x7b, 0xe6, 0x4a, 0x28, 0xa6, 0xd9, 0x91, 0x9a, 0x48, 0x6b, 0x86, 0xad, 0x69, 0x31, 0xd4, 0xe6, 0x47, 0x97, 0x7f, 0x17, 0x39, 0x33, 0xe5, 0xe5, 0x93, 0x80, 0xeb, 0x59, 0x2c, 0x8a, 0x2c, 0x5d, 0x23, 0x46, 0xc5, 0xe9, 0x94, 0x77, 0x69, 0xde, 0xed, 0x83, 0x43, 0x93, 0xd5, 0xbc, 0x75, 0x42, 0xf9, 0x53, 0x46, 0x82, 0xec, 0xbf, 0x71, 0x2f, 0xac, 0x8a, 0x3d, 0xd0, 0x17, 0x67, 0x9, 0x52, 0x14, 0xd2, 0x15, 0xf7, 0x7a, 0x71, 0x64, 0x17, 0xc4, 0x96, 0x4a, 0x13, 0xd0, 0x94, 0xf5, 0xf7, 0xe2, 0x56, 0xc9, 0x1e, 0xa4, 0xef, 0x73, 0x18, 0x2c, 0x4, 0x13, 0x82, 0x77, 0xf6, 0xb4, 0xe7, 0xe4, 0x4a, 0x37, 0xd5, 0x88, 0x97, 0xff, 0xc8, 0xe5, 0x5b, 0x3d, 0x82, 0x80, 0x63, 0x5e, 0x91, 0x2b, 0xe2, 0x8f, 0xee, 0xb2, 0x55, 0xc7, 0x6b, 0xea, 0x51, 0x26, 0x11, 0xe7, 0x4c, 0x62, 0x57, 0x66, 0x15, 0x49, 0xcb, 0x8a, 0xac, 0xb3, 0x30, 0xfd, 0x60, 0x4b, 0x0, 0xe1, 0xbf, 0x18, 0x22, 0x8c, 0xcc, 0x5d, 0xc2, 0x4d, 0xfe, 0x4c, 0xa6, 0x80, 0xda, 0xb9, 0xd0, 0x95, 0x6e, 0xf2, 0x6, 0x5, 0x37, 0xef, 0xc3, 0x41, 0xfd, 0x94, 0xaa, 0xab, 0x26, 0xef, 0xbc, 0x89, 0x9d, 0xd2, 0x66, 0x23, 0x63, 0xea, 0xe4, 0x4b, 0x8f, 0xe7, 0xd0, 0x6b, 0x1f, 0x33, 0x21, 0x2e, 0x5f, 0xf3, 0x86, 0x6, 0xce, 0xd9, 0x90, 0x5, 0xf3, 0xc7, 0xf, 0xcb, 0x3b, 0xd5, 0xa, 0xea, 0xd9, 0xc3, 0x22, 0xc0, 0x33, 0x29, 0xba, 0x84, 0xb3, 0x29, 0xc4, 0xa9, 0xcf, 0x92, 0xb8, 0x9d, 0x36, 0x52, 0xe6, 0xfc, 0x52, 0x8d, 0x51, 0x1f, 0x62, 0x28, 0x70, 0x48, 0x32, 0x31, 0x38, 0x10, 0x1e, 0x7d, 0xdf, 0x25, 0x5b, 0x79, 0x36, 0xaa, 0xbd, 0xe, 0x17, 0x3f, 0x47, 0x7e, 0x95, 0x34, 0x4f, 0x88, 0x31, 0xa9, 0x4a, 0xf1, 0x33, 0x58, 0xea, 0xfb, 0x39, 0xdc, 0x33, 0xf, 0xd5, 0x88, 0xc1, 0xa3, 0x10, 0xb0, 0x2c, 0x75, 0xf5, 0x76, 0xbc, 0x45, 0x61, 0xcd, 0x77, 0xde, 0x12, 0x7e, 0x21, 0x25, 0x3b, 0x11, 0xa5, 0x39, 0x18, 0x4, 0x66, 0x78, 0x41, 0x62, 0xd7, 0x9, 0xf3, 0xe, 0xcb, 0x58, 0xca, 0x95, 0x49, 0x22, 0xd0, 0xa2, 0x9d, 0xcc, 0x2, 0x6d, 0xbb, 0x3a, 0xfd, 0xb8, 0x4b, 0xb5, 0x45, 0x87, 0xca, 0x5a, 0xce, 0xda, 0x1, 0xf1, 0x7a, 0x15, 0x67, 0xa2, 0xa6, 0x11, 0xf2, 0xbc, 0xfd, 0xc4, 0x9, 0x86, 0x9c, 0xc4, 0x40, 0xf3, 0xdd, 0xda, 0x65, 0x4a, 0x60, 0xe9, 0x52, 0x9f, 0xe4, 0x97, 0xd5, 0x2a, 0x7e, 0x93, 0x90, 0xe7, 0xe8, 0x9b, 0xf1, 0x17, 0x6e, 0x32, 0x8, 0x25, 0x6e, 0x84, 0xdc, 0xc0, 0xbb, 0xb, 0x7a, 0x0, 0x38, 0x3f, 0xd6, 0x16, 0x1e, 0xb1, 0x3f, 0x60, 0x3, 0xcf, 0xfe, 0xbc, 0xd3, 0x4e, 0xa, 0x15, 0x89, 0x5, 0xb9, 0xc, 0xd8, 0x6c, 0x5c, 0xb6, 0x62, 0xf4, 0x5d, 0x1c, 0x53, 0x29, 0xa8, 0xad, 0x12, 0x34, 0x75, 0xa6, 0x14, 0x2f, 0xe7, 0x69, 0xe9, 0x90, 0x4c, 0x5b, 0xb9, 0xc7, 0x6, 0x89, 0x6c, 0x48, 0xc, 0x78, 0xb4, 0xbc, 0x4c, 0xa9, 0x67, 0x5a, 0x85, 0xf9, 0x2d, 0xd2, 0x13, 0x15, 0x61, 0xde, 0xc, 0xe0, 0x1b, 0x48, 0x9a, 0x86, 0xb4, 0xba, 0x1f, 0x8f, 0xd9, 0xb8, 0xc5, 0xa4, 0xea, 0x2f, 0x50, 0x2, 0x5, 0x41, 0x9c, 0x2, 0x9, 0x7c, 0x2f, 0x13, 0x56, 0x1b, 0x77, 0x42, 0xfa, 0xd4, 0xe5, 0x35, 0x12, 0xda, 0xf1, 0x57, 0xb2, 0xec, 0xaf, 0xae, 0x46, 0x6a, 0x58, 0x21, 0x7e, 0x61, 0xae, 0x3e, 0x65, 0xd4, 0x0, 0xf3, 0xef, 0x65, 0x1, 0x2a, 0x56, 0x3, 0xad, 0x13, 0x7a, 0xf6, 0x27, 0x70, 0xc7, 0x70, 0x87, 0xfa, 0x7f, 0x95, 0x2f, 0x1c, 0xc1, 0x46, 0x90, 0xc4, 0xf2, 0x89, 0x18, 0x8, 0xd5, 0xd7, 0xd6, 0x6, 0xbc, 0xbd, 0xe2, 0x51, 0xbe, 0x82, 0x60, 0xc1, 0xdf, 0x13, 0x95, 0x98, 0x71, 0xc1, 0xf6, 0x3a, 0xb, 0x71, 0x75, 0x84, 0xdd, 0x61, 0x43, 0x46, 0xd5, 0xb, 0x29, 0xe0, 0x44, 0x45, 0xd3, 0x8e, 0x8a, 0xa1, 0x7d, 0xbb, 0x3f, 0xdc, 0xcf, 0xd2, 0x1a, 0xe1, 0x8a, 0x78, 0xe8, 0x79, 0x9b, 0xd7, 0x77, 0xb1, 0xd5, 0xf1, 0x42, 0x74, 0xe0, 0x0, 0xf8, 0xd6, 0xab, 0xe3, 0xe0, 0x66, 0xd1, 0x7, 0x56, 0x47, 0x47, 0x40, 0xc6, 0xb7, 0x16, 0x7f, 0x80, 0x82, 0x3d, 0x88, 0x49, 0xa7, 0xe3, 0xe1, 0x58, 0x88, 0x10, 0xee, 0x31, 0x82, 0xb, 0x12, 0x59, 0x58, 0xce, 0x1e, 0x8a, 0x63, 0xeb, 0xe7, 0x80, 0x1b, 0xa4, 0x73, 0xaa, 0xc6, 0x5a, 0x52, 0x72, 0xcb, 0xac, 0x23, 0x44, 0x84, 0x3d, 0xea, 0xcd, 0xa7, 0x3e, 0xed, 0x80, 0x6b, 0xb0, 0x8d, 0x3a, 0x86, 0x13, 0xfa, 0xd3, 0x75, 0xe3, 0x47, 0xa7, 0x19, 0x1, 0xf7, 0xc8, 0x69, 0x2e, 0xcf, 0x35, 0x5a, 0xe9, 0xbb, 0xe5, 0xf8, 0x13, 0x4, 0x9f, 0x76, 0x6a, 0xe5, 0x64, 0x1d, 0xc0, 0x36, 0x6d, 0x3b, 0x96, 0x98, 0x6a, 0x45, 0x32, 0x2b, 0xd9, 0xb9, 0xda, 0x9c, 0x8e, 0xcf, 0x70, 0xce, 0x47, 0xd, 0x64, 0x98, 0x1, 0x6c, 0x5e, 0x35, 0xe3, 0x19, 0xed, 0x23, 0x51, 0x2, 0xac, 0x1a, 0x10, 0x7f, 0x6, 0x6, 0xad, 0x93, 0xef, 0x93, 0x6e, 0xf1, 0xd1, 0x85, 0xcf, 0x46, 0x48, 0x89, 0xfe, 0x89, 0xe, 0x91, 0x8e, 0xf7, 0xcb, 0xc, 0x1d, 0xe3, 0x78, 0xf6, 0x61, 0xd5, 0x1c, 0xab, 0xab, 0xbc, 0x33, 0x28, 0xc9, 0x87, 0xc8, 0xe5, 0x31, 0x73, 0x8d, 0xf6, 0x72, 0xe, 0x26, 0xad, 0x38, 0x63, 0xc3, 0x5, 0xdb, 0x35, 0x3e, 0x5, 0xc, 0x80, 0x8, 0x6b, 0xb0, 0xa1, 0x76, 0xeb, 0xe2, 0x81, 0xc9, 0x82, 0x7e, 0x8d, 0x78, 0x55, 0xae, 0x81, 0x96, 0x8a, 0xf7, 0x48, 0x38, 0x3e, 0xec, 0x3, 0x1, 0x9b, 0xa3, 0x81, 0x53, 0xf7, 0xb4, 0x1b, 0x26, 0x8a, 0xee, 0xeb, 0x1c, 0xb0, 0x4e, 0x42, 0x2c, 0x8f, 0xae, 0xd4, 0xf5, 0xf7, 0x11, 0x13, 0xf1, 0x1, 0x8c, 0xaf, 0x76, 0xb0, 0x3a, 0x15, 0x77, 0xc1, 0x2, 0x5e, 0x83, 0x4c, 0xc9, 0x2e, 0x38, 0x7c, 0xae, 0xf8, 0x7, 0xc0, 0xd0, 0x5e, 0x92, 0x1, 0x74, 0x3d, 0x5c, 0x7a, 0xb0, 0x6d, 0xb3, 0x6d, 0xe3, 0x5f, 0x2a, 0x9c, 0x5e, 0xbe, 0x46, 0x50, 0xe9, 0x76, 0x7a, 0xd5, 0xb9, 0xd5, 0xf2, 0x20, 0xba, 0x8e, 0xe7, 0x32, 0xac, 0x54, 0x52, 0xa3, 0xb9, 0x71, 0x8f, 0xca, 0x11, 0xef, 0x58, 0xa6, 0x98, 0xff, 0x3e, 0x37, 0x5e, 0x30, 0x67, 0xb6, 0x3e, 0x82, 0x0, 0xa1, 0xe5, 0xff, 0xcf, 0xee, 0x8c, 0xdc, 0x0, 0xc8, 0xb7, 0x46, 0xa5, 0x94, 0x59, 0x81, 0x2d, 0x9c, 0xe4, 0xd6, 0xea, 0x56, 0x62, 0xbb, 0xfc, 0x14, 0x78, 0x6b, 0x22, 0x10, 0x6e, 0x4a, 0xfc, 0x51, 0x8f, 0x7e, 0x38, 0x20, 0xde, 0xca, 0x83, 0x53, 0x80, 0xf9, 0xea, 0xfb, 0x54, 0x74, 0x31, 0x2f, 0x76, 0x9f, 0x68, 0x80, 0x38, 0x65, 0x29, 0xc, 0xba, 0x5a, 0x51, 0xb2, 0x1c, 0x72, 0xfa, 0x61, 0x75, 0xa2, 0xcf, 0x32, 0x5e, 0x94, 0x38, 0x49, 0x14, 0x5c, 0xa6, 0x91, 0x82, 0x5a, 0x75, 0x7e, 0x99, 0x9e, 0xd6, 0x7, 0x6e, 0xfc, 0x46, 0xe8, 0x70, 0x5, 0x7d, 0x44, 0x74, 0x1e, 0x64, 0x13, 0x68, 0xe2, 0xe2, 0xf2, 0x1f, 0x72, 0xce, 0x10, 0x17, 0xbf, 0x3d, 0xe8, 0x14, 0xf8, 0x19, 0x8, 0x45, 0xea, 0xd2, 0x7a, 0x69, 0xed, 0xb, 0xa7, 0xf0, 0x27, 0x36, 0x3f, 0x6b, 0x8, 0x99, 0x98, 0x36, 0x90, 0xdb, 0xcf, 0x46, 0xdb, 0xfc, 0x40, 0xff, 0xe9, 0xc4, 0x94, 0x7e, 0x5e, 0x15, 0x67, 0x52, 0x1b, 0xbf, 0xb3, 0x0, 0x97, 0xc5, 0x6b, 0x98, 0xb8, 0x28, 0x31, 0x8c, 0xc, 0x59, 0xaf, 0x8c, 0xc9, 0xeb, 0xbb, 0x1b, 0x30, 0x5d, 0x1, 0xfb, 0xd1, 0xa9, 0xd1, 0x2f, 0xba, 0x28, 0x4f, 0xe6, 0x18, 0x70, 0x5b, 0x36, 0xc0, 0x7e, 0x78, 0x12, 0x92, 0x4, 0x6c, 0x38, 0x98, 0xd0, 0x51, 0x4b, 0xc6, 0xd2, 0x32, 0x17, 0xe5, 0x11, 0x7b, 0x47, 0x57, 0xe, 0xfc, 0x38, 0x25, 0x28, 0xeb, 0xd6, 0xdf, 0xc5, 0xee, 0x39, 0x3b, 0xcc, 0xb0, 0x43, 0x5c, 0x57, 0xcc, 0x36, 0xcb, 0x78, 0x27, 0xf1, 0x6a, 0xae, 0x25, 0xc4, 0x6, 0x2d, 0x85, 0xb0, 0x70, 0x9b, 0x1b, 0x22, 0x5c, 0x8c, 0x2f, 0xf9, 0x6d, 0x9c, 0x6d, 0x82, 0xce, 0x9e, 0x4f, 0x8d, 0x6c, 0xc3, 0x59, 0x93, 0xb4, 0x7b, 0xba, 0x9a, 0xf5, 0xa4, 0x3a, 0x1d, 0x42, 0x2e, 0x2c, 0x7e, 0xc3, 0x40, 0xa8, 0x4f, 0xe8, 0x7c, 0x40, 0x26, 0xf9, 0x1c, 0xe4, 0x54, 0x14, 0x3d, 0xc0, 0xab, 0x18, 0x44, 0xf6, 0x7a, 0x3f, 0xcd, 0x5e, 0x60, 0x26, 0xbf, 0xea, 0xa5, 0xd6, 0xa6, 0x41, 0x23, 0x24, 0x8e, 0x66, 0x6b, 0x21, 0xf4, 0x84, 0xdb, 0x1e, 0x2, 0x1, 0x1, 0x4, 0xb8, 0xed, 0x36, 0xd8, 0x8c, 0x1d, 0x5e, 0x94, 0xe7, 0x7c, 0x33, 0x5b, 0x82, 0xdc, 0x3d, 0xd2, 0x86, 0x6b, 0x7, 0x4c, 0xf0, 0x43, 0x1, 0x7e, 0x4c, 0x34, 0xfd, 0x3, 0xc5, 0xf2, 0x7a, 0x31, 0xff, 0x62, 0x53, 0xa9, 0x4f, 0x7a, 0x8b, 0xe1, 0xb7, 0x3d, 0xdd, 0xa, 0x1b, 0xe0, 0x60, 0x82, 0x3f, 0x3e, 0x67, 0x9c, 0x91, 0xcc, 0xa1, 0x54, 0xe5, 0x49, 0xeb, 0xfb, 0x33, 0xe4, 0xf2, 0x92, 0xf2, 0x1b, 0x35, 0x91, 0xeb, 0x41, 0x11, 0x85, 0xec, 0xe7, 0x55, 0xc7, 0x4, 0x38, 0x9f, 0xda, 0x68, 0xe3, 0x9a, 0x34, 0x9c, 0x34, 0x64, 0xa1, 0xfe, 0x7, 0xf, 0x47, 0xa5, 0xba, 0x62, 0x85, 0xc9, 0x4c, 0x2f, 0xd5, 0xf3, 0xd, 0x29, 0x2b, 0x86, 0x9e, 0x4a, 0xc7, 0x24, 0x1a, 0x47, 0x43, 0x35, 0xaa, 0xa1, 0xd3, 0x11, 0x45, 0x19, 0xb8, 0xbe, 0x46, 0x94, 0x23, 0x4d, 0xd4, 0xdc, 0x81, 0x0, 0xdd, 0xc2, 0xbe, 0x2d, 0xc8, 0x2a, 0xc4, 0xf, 0x7f, 0x3d, 0xca, 0xd5, 0x6, 0x32, 0xf2, 0x47, 0xdb, 0xf5, 0x2b, 0x52, 0x1, 0x26, 0x1d, 0x20, 0x34, 0x6d, 0x2f, 0x9a, 0xf8, 0x8f, 0x3f, 0x53, 0x76, 0xb8, 0x17, 0x58, 0xa4, 0x8f, 0x37, 0xc, 0xc3, 0x57, 0x51, 0x36, 0xb9, 0x4f, 0x2d, 0xc5, 0xc5, 0x17, 0x75, 0xdc, 0x8c, 0x51, 0xe6, 0xac, 0xf7, 0x22, 0xef, 0x64, 0x7a, 0x84, 0xbf, 0xe6, 0x83, 0xb4, 0xde, 0x89, 0xfa, 0xe0, 0x92, 0x58, 0x45, 0x8, 0xf5, 0x60, 0x31, 0x58, 0x9b, 0xa6, 0xc2, 0x18, 0xb4, 0x94, 0x91, 0xe5, 0xb4, 0xd4, 0xfc, 0x74, 0xbe, 0xff, 0xe3, 0x83, 0x3c, 0xaa, 0xee, 0x78, 0xf1, 0x9b, 0xf2, 0x96, 0xe2, 0x95, 0xf8, 0x51, 0xe0, 0x4a, 0xb8, 0xce, 0x6, 0x38, 0x52, 0x23, 0xd0, 0x6b, 0xfe, 0x11, 0xe1, 0xce, 0x48, 0xce, 0x5a, 0x45, 0x55, 0x4, 0x1c, 0x49, 0x3a, 0xe4, 0x40, 0x46, 0x21, 0x52, 0xdd, 0xdd, 0x86, 0xfa, 0xf3, 0xb5, 0xc5, 0x8e, 0x90, 0xfa, 0x16, 0x96, 0x95, 0x2d, 0xb1, 0x1a, 0xa0, 0x1d, 0x66, 0x2d, 0x88, 0x8a, 0xae, 0x82, 0x43, 0x82, 0x60, 0x9f, 0xc4, 0x5e, 0x3f, 0x13, 0x5d, 0xeb, 0x92, 0xdf, 0x5c, 0xc1, 0xc9, 0xf6, 0x5e, 0x42, 0xcc, 0xce, 0x98, 0xee, 0x84, 0x4d, 0x66, 0x82, 0x66, 0x2d, 0xb5, 0xc4, 0xb8, 0x25, 0x6f, 0xd8, 0x5e, 0x28, 0x9e, 0x88, 0xbe, 0xde, 0x48, 0xc7, 0xcd, 0x80, 0xeb, 0xa0, 0x2b, 0x22, 0xec, 0xc1, 0x94, 0x97, 0x2d, 0x48, 0x5d, 0x3e, 0x52, 0x2f, 0xf4, 0xdf, 0xc3, 0x6b, 0x84, 0xe4, 0xf, 0x70, 0xd5, 0x7c, 0x4a, 0x74, 0x51, 0x13, 0xff, 0x13, 0xb1, 0xc5, 0xef, 0x85, 0x5e, 0xb0, 0xc6, 0x5b, 0xb2, 0x30, 0x26, 0x77, 0xd0, 0x4c, 0x65, 0x29, 0x30, 0x6d, 0xa, 0x9d, 0xb8, 0xd8, 0x32, 0x4f, 0xf5, 0xf1, 0xb4, 0x27, 0xfc, 0x27, 0x16, 0xf2, 0xaf, 0x3b, 0xde, 0xd4, 0x4, 0x73, 0xdf, 0xd8, 0x59, 0x96, 0xab, 0x8e, 0xe, 0x21, 0xff, 0x1b, 0xcf, 0x1b, 0xb7, 0x60, 0xbd, 0x3f, 0xd7, 0x8b, 0x43, 0xa2, 0xa9, 0xde, 0xb4, 0x11, 0x5d, 0x1f, 0xcd, 0x95, 0x45, 0x9d, 0x85, 0x35, 0x48, 0x9a, 0x32, 0xd, 0x9c, 0x56, 0x6e, 0xbb, 0x7d, 0x2d, 0xd, 0xf, 0x4a, 0x4e, 0x8a, 0x92, 0xdf, 0x5e, 0x8e, 0x3, 0xc6, 0x54, 0xd1, 0x5a, 0x8f, 0x21, 0x96, 0x42, 0xc9, 0x3e, 0xdf, 0xa2, 0xa4, 0x3b, 0xb8, 0x83, 0xb8, 0x63, 0xa3, 0xe5, 0x44, 0xc2, 0x7c, 0x5b, 0x4, 0xde, 0x96, 0xd, 0x4e, 0x73, 0xd7, 0x2b, 0xa4, 0x65, 0xc1, 0x93, 0x8d, 0x47, 0x75, 0x25, 0xb9, 0x8e, 0x13, 0xc8, 0x73, 0x26, 0x1, 0xf9, 0xe8, 0xbf, 0x84, 0x7d, 0x60, 0x4d, 0xe7, 0x8e, 0x5a, 0x63, 0x43, 0xea, 0x49, 0x50, 0xbb, 0xec, 0x1b, 0x86, 0x32, 0xda, 0x5a, 0x14, 0x61, 0x4b, 0x1d, 0x15, 0x3b, 0x9, 0xaa, 0xb5, 0x78, 0xb6, 0xeb, 0xc, 0xb4, 0xe2, 0xd3, 0x44, 0xdf, 0xac, 0xe, 0x9f, 0x19, 0x89, 0x20, 0xc4, 0x23, 0x42, 0xbc, 0xa4, 0x6, 0xa, 0x49, 0xb4, 0x2b, 0x25, 0xe, 0xf7, 0x5d, 0x2c, 0xcc, 0xb5, 0x79, 0x64, 0x1e, 0x8a, 0x32, 0x94, 0xba, 0xd2, 0x22, 0x69, 0x8b, 0x8c, 0x94, 0x8b, 0x21, 0xe7, 0xcc, 0x78, 0x42, 0x39, 0x4f, 0x6, 0xe6, 0x5c, 0x99, 0x7e, 0x94, 0x94, 0x69, 0xd9, 0xf1, 0x65, 0x2d, 0xf3, 0xcd, 0x18, 0x2b, 0x5b, 0xb7, 0xf3, 0xd8, 0xb3, 0x8b, 0x98, 0x77, 0x30, 0xcb, 0xa3, 0xd2, 0x95, 0x5a, 0xb5, 0xa8, 0x15, 0xcb, 0xcc, 0x29, 0x86, 0xdf, 0x26, 0x49, 0x8c, 0x54, 0xbe, 0xdc, 0x5b, 0x37, 0xa6, 0xb3, 0x25, 0x3c, 0xc6, 0x58, 0xad, 0x94, 0x88, 0x48, 0xac, 0x8f, 0x52, 0xd, 0x4e, 0xe9, 0xe3, 0x5b, 0xba, 0x69, 0x46, 0x77, 0xbe, 0x9c, 0xc4, 0x6e, 0xc, 0xa7, 0x40, 0x38, 0xa3, 0x8, 0x95, 0x11, 0x31, 0xe0, 0xf7, 0x19, 0x88, 0x9e, 0x2, 0xb2, 0x8a, 0x70, 0x96, 0x9d, 0x20, 0xed, 0x27, 0x3a, 0x94, 0xce, 0xe7, 0xc4, 0xd7, 0x10, 0xa1, 0x49, 0x9b, 0xa2, 0x17, 0xb3, 0x2f, 0x37, 0x1f, 0x7d, 0x62, 0x46, 0xb3, 0x7f, 0xa6, 0x57, 0xec, 0x39, 0xdf, 0x7c, 0x1e, 0x56, 0x12, 0xf9, 0x17, 0x8f, 0x7c, 0x6f, 0xf2, 0xe6, 0x3c, 0xfa, 0xc1, 0xed, 0x2f, 0x78, 0xe7, 0x6d, 0xc1, 0x4, 0xc4, 0xe7, 0x3a, 0x9, 0x1a, 0xc1, 0xe2, 0xfe, 0xb1, 0x90, 0xde, 0x3d, 0x85, 0x7d, 0x7a, 0x35, 0xdc, 0x23, 0x69, 0xce, 0xf2, 0x6a, 0x13, 0x68, 0x36, 0x45, 0x86, 0x8e, 0x44, 0x9b, 0xaa, 0xa, 0x2f, 0x1c, 0xaa, 0xfe, 0x52, 0x34, 0xb5, 0x16, 0x55, 0xd9, 0x46, 0x59, 0xd1, 0x94, 0xf4, 0xe8, 0xe3, 0x69, 0x15, 0x3b, 0x51, 0x16, 0x31, 0xb5, 0xe7, 0xe3, 0x51, 0xbe, 0x7d, 0xfd, 0xeb, 0xdd, 0x31, 0x68, 0x2, 0x7f, 0x40, 0xfc, 0x25, 0xb, 0xd1, 0x5f, 0xe4, 0xac, 0x3b, 0xad, 0x3b, 0x4f, 0xa7, 0x9, 0x68, 0x70, 0xba, 0x32, 0xb3, 0x8c, 0xca, 0x3f, 0xb9, 0xd6, 0xb1, 0x60, 0xe1, 0x40, 0xed, 0xbd, 0x28, 0x8b, 0xdf, 0x8e, 0x36, 0x85, 0xfd, 0xc2, 0xb4, 0x90, 0x8c, 0xa, 0x6f, 0x26, 0x4f, 0xd2, 0xaa, 0xff, 0xf6, 0x87, 0xd9, 0xaa, 0x3b, 0x62, 0x1b, 0x4e, 0x42, 0xd, 0x31, 0x9f, 0xa5, 0x66, 0x62, 0x81, 0x9b, 0x74, 0x45, 0xf0, 0x27, 0x78, 0xdb, 0xa0, 0x51, 0xd7, 0x4f, 0x94, 0x59, 0x72, 0x1d, 0x68, 0xa6, 0xd, 0x12, 0x80, 0x88, 0xc5, 0xa9, 0x31, 0xd, 0xd2, 0xcd, 0x0, 0xf1, 0x4b, 0xae, 0x97, 0xd3, 0xab, 0xf2, 0x7b, 0x6a, 0xc0, 0x8, 0x6b, 0x90, 0x22, 0x5a, 0xf7, 0x8b, 0xdc, 0x12, 0x4a, 0x84, 0xe5, 0xa3, 0xf, 0x92, 0x2d, 0x3f, 0xf2, 0x62, 0x34, 0x21, 0x91, 0x78, 0x40, 0xb9, 0x60, 0xbd, 0x71, 0xab, 0x6c, 0x20, 0xde, 0x6c, 0x17, 0x63, 0xa, 0xdd, 0x6b, 0xbc, 0x54, 0x4d, 0xee, 0xc, 0xb2, 0xc9, 0x54, 0x2f, 0xc0, 0x2a, 0x9f, 0xaa, 0xd8, 0xd2, 0x3c, 0xb0, 0xed, 0x6e, 0x20, 0x17, 0xe6, 0xf8, 0x3, 0x34, 0x64, 0x8, 0x93, 0x16, 0x8e, 0xf6, 0xc7, 0xb9, 0x3d, 0xdd, 0x92, 0xc5, 0x69, 0x14, 0x83, 0x41, 0x22, 0xba, 0x69, 0xfe, 0x2c, 0x5e, 0xf3, 0xbd, 0xd5, 0xf4, 0x8c, 0xe0, 0x6c, 0x44, 0x95, 0x92, 0x4f, 0xdb, 0xb8, 0xcd, 0x1b, 0xba, 0xdc, 0x58, 0xd9, 0x70, 0x59, 0x8e, 0xae, 0x79, 0x96, 0x4b, 0xb9, 0xd5, 0x40, 0x45, 0xb4, 0x9c, 0x95, 0xd2, 0x1f, 0xa3, 0x33, 0x14, 0x78, 0x56, 0xad, 0xc1, 0x2b, 0x0, 0x1b, 0xd1, 0xc3, 0xd4, 0xc7, 0xe3, 0x53, 0xc8, 0x8a, 0xcc, 0x81, 0xa2, 0x59, 0xcd, 0xb1, 0x28, 0xdd, 0xc0, 0xae, 0x75, 0xfd, 0xc2, 0x4d, 0x37, 0x7a, 0x5, 0x2, 0x12, 0xc7, 0x2f, 0x62, 0xf0, 0x8, 0xe4, 0x2b, 0x6a, 0xab, 0x58, 0x8b, 0x26, 0x12, 0xa1, 0xd0, 0x4a, 0xcb, 0x94, 0x3a, 0x19, 0xf5, 0x7c, 0xed, 0xf8, 0x34, 0x2b, 0x9c, 0x45, 0x1c, 0x7e, 0x16, 0xcd, 0xba, 0x74, 0xe2, 0xbc, 0x57, 0x54, 0x62, 0xcc, 0x24, 0xec, 0x60, 0x40, 0x2d, 0xa8, 0x64, 0x71, 0xf4, 0x1b, 0x75, 0xac, 0xe2, 0x5a, 0x6e, 0x5d, 0xf, 0x69, 0x45, 0x4d, 0xd4, 0xf3, 0xb3, 0x9, 0xc6, 0x33, 0x4c, 0x96, 0xb, 0x80, 0xac, 0xc4, 0x38, 0x5, 0xc5, 0x43, 0xc1, 0x1b, 0x45, 0xf9, 0xde, 0x86, 0x75, 0x4d, 0x39, 0x95, 0x92, 0x1f, 0x98, 0xd1, 0xa6, 0x58, 0xd0, 0x9b, 0x1e, 0xd, 0x4c, 0x3d, 0x80, 0xe8, 0x7, 0x1c, 0xcf, 0xa4, 0x76, 0xd6, 0x1, 0xdd, 0x4d, 0x33, 0x76, 0x5f, 0x2b, 0x5f, 0x3c, 0x3f, 0x65, 0x65, 0x74, 0x7d, 0xfe, 0xb1, 0xfe, 0x40, 0xf0, 0x5e, 0xd4, 0x3d, 0x28, 0xfe, 0xed, 0xb7, 0xf3, 0x9b, 0x59, 0xfe, 0x91, 0x11, 0x93, 0x37, 0x80, 0xad, 0x39, 0xf0, 0x5f, 0x49, 0xfa, 0x96, 0x4e, 0x5b, 0x99, 0x76, 0xbf, 0x94, 0x50, 0xe2, 0xa3, 0xb2, 0xb6, 0x40, 0x26, 0x74, 0x3f, 0xc8, 0xc1, 0x41, 0x63, 0x9, 0x8b, 0xc3, 0xa, 0x56, 0xfa, 0x84, 0xc8, 0xbe, 0xd2, 0x5, 0x14, 0xf3, 0xb9, 0x6b, 0x57, 0x6b, 0x9, 0x5e, 0x2b, 0xb0, 0x62, 0x87, 0x22, 0xfc, 0x40, 0x18, 0x61, 0x2f, 0xe6, 0xbb, 0xbd, 0xb2, 0x42, 0x1a, 0x49, 0x3, 0x73, 0xf7, 0x80, 0x8d, 0x62, 0x96, 0xbe, 0x33, 0x8f, 0xfd, 0xd8, 0x7e, 0x89, 0xa, 0x8d, 0x49, 0x48, 0xca, 0x69, 0x56, 0x4d, 0xef, 0x9d, 0x9c, 0xe9, 0x1a, 0x40, 0x4c, 0xf7, 0x5a, 0xb8, 0x44, 0x65, 0x5b, 0xeb, 0x38, 0x79, 0x88, 0x12, 0xf2, 0xe7, 0x12, 0xd3, 0xb, 0x43, 0x33, 0xe3, 0x94, 0x87, 0x25, 0xa7, 0x81, 0x73, 0xfc, 0xd2, 0x53, 0xb2, 0x8b, 0x2f, 0x5d, 0x94, 0x9e, 0xff, 0xa3, 0xbe, 0x85, 0x35, 0x59, 0x79, 0x6, 0x60, 0xaf, 0x8d, 0x7f, 0xf6, 0xc3, 0xb0, 0x77, 0xd8, 0xa6, 0x19, 0x85, 0xd0, 0x48, 0x78, 0x4f, 0x1b, 0x21, 0x62, 0x1b, 0x70, 0x38, 0x6e, 0x6d, 0x39, 0x6, 0x5, 0x6e, 0xf0, 0x7, 0xaf, 0xff, 0xb8, 0xfa, 0x91, 0x8d, 0xc8, 0x9a, 0xe5, 0xed, 0x96, 0x7c, 0x3f, 0xe, 0x1c, 0x5e, 0x2f, 0x79, 0x50, 0x8, 0xb4, 0x16, 0x8a, 0xf2, 0xff, 0x9f, 0xc0, 0xe0, 0x94, 0x9e, 0x5f, 0x76, 0x8d, 0xbe, 0x37, 0x3, 0xa0, 0xce, 0x3e, 0xa5, 0xd2, 0x88, 0xd0, 0xfa, 0x4a, 0xbd, 0x5d, 0x21, 0x98, 0x20, 0x89, 0x23, 0xa9, 0xa9, 0x6f, 0x2b, 0xa3, 0x2a, 0xed, 0xd9, 0x64, 0x15, 0x80, 0x65, 0xe1, 0x54, 0x13, 0x98, 0x8f, 0x24, 0xdf, 0x21, 0x85, 0x59, 0xa2, 0x88, 0x35, 0xec, 0x23, 0x7e, 0x58, 0x2c, 0x99, 0xa0, 0xd7, 0x81, 0xf2, 0xed, 0xcb, 0x7, 0x14, 0x96, 0x38, 0x55, 0xa, 0x93, 0x6, 0x21, 0xbe, 0x5b, 0xbe, 0xeb, 0xd, 0x32, 0x9, 0x7f, 0x81, 0x91, 0x24, 0xb5, 0xa5, 0xff, 0xa7, 0x60, 0x51, 0x6, 0x9, 0xd9, 0xb4, 0xc8, 0xe6, 0xa9, 0xd2, 0xf6, 0xff, 0x92, 0x39, 0x4f, 0xac, 0x76, 0x9c, 0x7b, 0x56, 0xf5, 0xc8, 0x5d, 0x5c, 0xc6, 0x9a, 0xd1, 0x96, 0xbe, 0xcc, 0xe0, 0xaa, 0x5f, 0xa2, 0x26, 0xcf, 0xa8, 0xf8, 0x71, 0xd4, 0x8, 0x52, 0x36, 0x37, 0x4a, 0x70, 0xf9, 0x1d, 0x5, 0xda, 0x45, 0xa1, 0x1b, 0x54, 0xbc, 0xab, 0xaf, 0xd8, 0xb7, 0xf5, 0x3d, 0x32, 0x43, 0x9d, 0xdd, 0x53, 0xe2, 0xf1, 0x92, 0xb0, 0xaf, 0xa3, 0xcf, 0x36, 0xcb, 0xdb, 0x79, 0xeb, 0xa7, 0xc4, 0x23, 0x91, 0xaa, 0xa3, 0x15, 0x6f, 0x4d, 0x2e, 0x42, 0xd3, 0x4d, 0x38, 0x8c, 0x9c, 0xff, 0x33, 0xc, 0x1b, 0x2d, 0x8f, 0x17, 0x86, 0x16, 0xb0, 0x62, 0x5, 0x6d, 0xbd, 0x7d, 0xd8, 0xae, 0x66, 0xe8, 0x66, 0xa4, 0x4e, 0xac, 0x76, 0x31, 0x40, 0x7b, 0xbe, 0x10, 0x1e, 0xc, 0x8f, 0x4d, 0x15, 0x4b, 0xa4, 0xd1, 0x58, 0x76, 0xf7, 0x75, 0x5f, 0x5, 0x39, 0xa5, 0x33, 0x10, 0x98, 0xb2, 0xc9, 0x1, 0xb1, 0x7f, 0xa4, 0xf5, 0x73, 0xbd, 0x56, 0xfb, 0x59, 0xbf, 0xfb, 0x84, 0x86, 0x25, 0x36, 0x2b, 0x84, 0x4c, 0x86, 0x38, 0xdd, 0xc8, 0x43, 0x3, 0x87, 0x4e, 0xf5, 0x92, 0x65, 0x46, 0xf1, 0xc5, 0x78, 0x6, 0xd1, 0x92, 0xc3, 0x37, 0x11, 0x8a, 0x91, 0xd5, 0xf0, 0xde, 0x82, 0xa8, 0x86, 0xd0, 0x33, 0x10, 0x2d, 0x4d, 0xd2, 0xe1, 0x8e, 0x26, 0xe9, 0x76, 0xe3, 0x62, 0xe1, 0x9c, 0x64, 0x66, 0xda, 0x53, 0xcc, 0xa3, 0xb2, 0x4e, 0x2e, 0x4e, 0x9b, 0x7a, 0xf1, 0x71, 0x8a, 0x70, 0x4, 0x2c, 0x5b, 0xe0, 0xd, 0xb2, 0xc7, 0xfd, 0xdb, 0x1, 0xa2, 0x7, 0x49, 0xee, 0x9a, 0xdc, 0x4c, 0x66, 0x55, 0x47, 0x6c, 0xfc, 0x8d, 0xcc, 0xe5, 0x91, 0x16, 0xbe, 0x47, 0xfb, 0xcb, 0x83, 0x2b, 0xfd, 0xc3, 0x5, 0x4c, 0xa7, 0x33, 0x58, 0x69, 0xb0, 0xde, 0xb0, 0x43, 0x72, 0x8a, 0x93, 0xee, 0xf, 0x8f, 0x42, 0x3f, 0x77, 0x25, 0x86, 0x7, 0x1f, 0xed, 0x3d, 0x4c, 0xa9, 0xdb, 0x63, 0x9b, 0xbd, 0x51, 0x67, 0x35, 0x44, 0xae, 0x2a, 0x85, 0x80, 0x1c, 0x2f, 0x3b, 0x11, 0x49, 0xec, 0xe2, 0xfb, 0x20, 0xc4, 0x73, 0x54, 0xf3, 0xb0, 0xed, 0xc3, 0x55, 0xc2, 0xb, 0xab, 0xcc, 0x63, 0xd6, 0xa9, 0x46, 0xae, 0xcf, 0x5d, 0x1, 0x3e, 0x1c, 0x84, 0x7d, 0x18, 0x1f, 0x99, 0x89, 0x55, 0x98, 0x1a, 0x3d, 0x8b, 0xb7, 0x1e, 0x4f, 0xd3, 0x2c, 0xe, 0x4c, 0xf8, 0x5f, 0xc6, 0xfa, 0x13, 0x17, 0x60, 0xec, 0x9c, 0xc2, 0xc9, 0xfa, 0xe9, 0xde, 0x52, 0xa5, 0x7a, 0xb2, 0xfd, 0x7b, 0x91, 0x53, 0x9f, 0x12, 0x64, 0xee, 0x4d, 0x53, 0x6f, 0x89, 0xe0, 0x1e, 0xeb, 0xdb, 0xf2, 0x23, 0xa5, 0x76, 0x27, 0x11, 0x59, 0xd2, 0x9, 0x33, 0xc1, 0xe1, 0x6c, 0xf6, 0x4c, 0xad, 0x57, 0x1d, 0x6f, 0x87, 0xa9, 0xa3, 0x76, 0xb5, 0x89, 0xc7, 0x32, 0xc6, 0xc8, 0xd7, 0xd, 0x69, 0xf2, 0x21, 0xc0, 0xcf, 0x6d, 0xad, 0x84, 0xeb, 0x32, 0xea, 0x55, 0xcf, 0x66, 0x95, 0x5, 0x72, 0x2b, 0xb7, 0x70, 0x61, 0x28, 0xf2, 0xa5, 0xcf, 0x10, 0x56, 0xa0, 0xfb, 0x1a, 0xbf, 0x4c, 0x89, 0x15, 0xdd, 0xb3, 0xc1, 0x36, 0xf4, 0x4f, 0x31, 0xf0, 0x24, 0xc5, 0xc6, 0xdd, 0xff, 0xa1, 0x7, 0x61, 0xc, 0x7e, 0xb2, 0xbd, 0xc1, 0xe9, 0x3a, 0x58, 0xa1, 0xa7, 0x7a, 0x40, 0xe2, 0x7c, 0xe3, 0x98, 0x6d, 0xaf, 0xe0, 0xb4, 0x38, 0xab, 0x28, 0xd9, 0x42, 0x43, 0xe5, 0xca, 0x98, 0x1c, 0xa, 0x7, 0x50, 0xb7, 0xe8, 0xf2, 0x58, 0x23, 0xe0, 0xaf, 0x86, 0xce, 0xef, 0x28, 0x12, 0x92, 0xea, 0x56, 0xb8, 0xb8, 0x31, 0xfc, 0x67, 0x1c, 0xa, 0x12, 0x19, 0x2a, 0x5, 0x59, 0xad, 0xae, 0xe3, 0xa4, 0x9e, 0x6, 0xb4, 0x19, 0xf0, 0x8d, 0x55, 0x9e, 0x43, 0x51, 0x9f, 0x27, 0x2b, 0x71, 0xac, 0xba, 0xa4, 0xd, 0x23, 0x24, 0x5a, 0x18, 0x55, 0xe3, 0x19, 0x89, 0x51, 0x50, 0x8f, 0xb7, 0x84, 0xdd, 0xfc, 0xce, 0x4d, 0x5a, 0x4c, 0x7d, 0xa4, 0xb2, 0xf, 0xd9, 0xa7, 0x9e, 0x0, 0xe, 0xb3, 0xbf, 0x9a, 0xac, 0x55, 0x73, 0xd2, 0xee, 0x74, 0x59, 0xc3, 0x2f, 0xfd, 0xaf, 0x8f, 0xea, 0xdb, 0x4c, 0x82, 0x2d, 0xb7, 0x89, 0x92, 0x7d, 0xef, 0xb5, 0xb2, 0x9d, 0x54, 0x5a, 0x1, 0x7f, 0x19, 0xa8, 0xd4, 0x80, 0x24, 0xb6, 0x93, 0x4, 0xc4, 0xb, 0x59, 0xd5, 0x61, 0x31, 0x3, 0x78, 0x6f, 0x2e, 0xb5, 0x55, 0x3a, 0xb0, 0xad, 0x9e, 0x30, 0x15, 0x81, 0xeb, 0x40, 0x25, 0xc6, 0xe5, 0x92, 0x5a, 0xde, 0xa7, 0xde, 0x5a, 0x3d, 0x6a, 0xcc, 0xf0, 0x31, 0xd6, 0x64, 0x61, 0xdd, 0xe8, 0x93, 0x7c, 0x9d, 0x5e, 0x9d, 0xdd, 0x2b, 0xc8, 0x4, 0x8d, 0x58, 0x7a, 0x1b, 0xfd, 0x9d, 0x31, 0xf8, 0x34, 0x55, 0x0, 0x68, 0x80, 0x95, 0xeb, 0xd8, 0xb5, 0x55, 0x8a, 0xde, 0x81, 0xca, 0x5b, 0x8d, 0xda, 0x86, 0xa8, 0x5e, 0x4d, 0xb, 0x2a, 0x25, 0x1, 0xa, 0x53, 0xe8, 0xa1, 0xa0, 0xea, 0x35, 0xfe, 0xb4, 0xff, 0x1b, 0x63, 0x95, 0xe9, 0xd8, 0xb1, 0x28, 0xd8, 0x2a, 0x87, 0xcd, 0xf9, 0x95, 0xf5, 0x6e, 0xe9, 0x7d, 0xe5, 0xe0, 0x84, 0x1e, 0x41, 0x60, 0x68, 0x19, 0x93, 0x4c, 0xa3, 0xae, 0xd3, 0x84, 0xdb, 0xa5, 0x32, 0xa7, 0x73, 0x70, 0x19, 0xbb, 0xd5, 0xf9, 0xc0, 0xd7, 0xcf, 0x6b, 0x56, 0xfe, 0xd2, 0xb8, 0xfa, 0x82, 0xeb, 0xf3, 0x36, 0x5f, 0x77, 0x45, 0x58, 0x8b, 0xff, 0xfd, 0xcc, 0xc, 0xb2, 0x8c, 0x10, 0xc1, 0x74, 0x83, 0x5f, 0xb6, 0x59, 0x16, 0x9a, 0x78, 0xc, 0x33, 0x22, 0xa4, 0xb4, 0xb8, 0xdc, 0x73, 0xa9, 0x7e, 0xe5, 0x41, 0x57, 0x74, 0x2e, 0x8f, 0x88, 0x20, 0x70, 0xca, 0x0, 0x5c, 0xf1, 0x9c, 0xfd, 0x45, 0xcf, 0xe3, 0xdc, 0x7c, 0x72, 0xf8, 0x7, 0x55, 0xf1, 0x1e, 0x74, 0x8a, 0xec, 0x4c, 0x6b, 0x19, 0x2f, 0x1c, 0xc5, 0x47, 0x18, 0xa6, 0x7e, 0xc9, 0x43, 0x8e, 0xd0, 0x70, 0x2b, 0x8a, 0xb1, 0x15, 0x5c, 0xa1, 0xd, 0x93, 0x14, 0x5, 0x61, 0x2f, 0x78, 0xc6, 0xb6, 0x33, 0x9f, 0xae, 0xdb, 0xae, 0x87, 0xff, 0x25, 0xc9, 0x54, 0xa, 0x88, 0x36, 0xb9, 0xe, 0xaf, 0x7d, 0x71, 0xe, 0x4d, 0x9c, 0xf5, 0xdd, 0x84, 0x92, 0xf5, 0x8c, 0x6f, 0x31, 0x93, 0xcf, 0x81, 0x15, 0x52, 0xf4, 0xc1, 0x3a, 0x87, 0xa8, 0xec, 0x3e, 0xfe, 0xef, 0x6a, 0xfb, 0xe9, 0xfc, 0x17, 0xb4, 0xc3, 0x8d, 0xfb, 0xee, 0x46, 0x80, 0x91, 0xa5, 0x0, 0x94, 0x20, 0x2, 0xac, 0x18, 0xd3, 0x73, 0x8b, 0x78, 0x85, 0x9a, 0xda, 0x35, 0xa5, 0x6b, 0xd4, 0x26, 0x6, 0xbd, 0xae, 0x3, 0x1f, 0xd2, 0x64, 0xdc, 0x73, 0xe8, 0x47, 0x8c, 0x9f, 0x9, 0x7e, 0xc9, 0x8e, 0x1, 0x4d, 0x56, 0xa8, 0xcd, 0x8c, 0xc6, 0x92, 0xde, 0x5c, 0x7a, 0x8d, 0x3e, 0xc4, 0x3c, 0x32, 0x73, 0xa1, 0x35, 0xe0, 0x78, 0x7c, 0xff, 0x80, 0xf8, 0x75, 0x62, 0xf2, 0x3e, 0xaa, 0xed, 0x3e, 0x27, 0xff, 0x3d, 0xee, 0xa4, 0x2f, 0xbc, 0x2e, 0xaf, 0xa3, 0xcd, 0xf4, 0xc4, 0x24, 0xfe, 0x4e, 0xcb, 0x3d, 0x84, 0xaf, 0xa0, 0xb1, 0x10, 0xcd, 0x9c, 0xc1, 0x57, 0xb8, 0x53, 0x4, 0x3e, 0x4d, 0x91, 0xeb, 0xd1, 0xc9, 0xdd, 0xeb, 0x1d, 0x77, 0x62, 0xbb, 0xc8, 0xde, 0x7b, 0x81, 0xaa, 0xc5, 0x91, 0xaa, 0x77, 0x92, 0x82, 0xae, 0x91, 0x23, 0x83, 0xd6, 0x8d, 0xf1, 0x7a, 0xca, 0x84, 0x1a, 0xc7, 0x16, 0xf3, 0x40, 0x17, 0xed, 0x73, 0x6d, 0xa5, 0x88, 0x5c, 0x9e, 0xba, 0xd3, 0x54, 0xa0, 0x2c, 0x71, 0xf7, 0x24, 0x6c, 0xe1, 0xea, 0x3b, 0x8, 0x35, 0xc2, 0x37, 0x4a, 0xfd, 0xe9, 0x83, 0x64, 0xb2, 0x83, 0xa8, 0x4, 0x5d, 0x2c, 0x7c, 0xe2, 0xae, 0xf3, 0x63, 0xc, 0xf1, 0x71, 0x46, 0xae, 0x8d, 0xa8, 0x1d, 0xe, 0xdb, 0xe1, 0x95, 0x59, 0xe2, 0xe8, 0x77, 0xa5, 0x6a, 0x6, 0xd6, 0x6e, 0xb1, 0xb1, 0xc4, 0xbf, 0xf8, 0x31, 0x2b, 0xe1, 0xd8, 0x12, 0x4a, 0xdd, 0xe6, 0x36, 0x77, 0x17, 0xbc, 0x29, 0x7e, 0x57, 0xe8, 0x35, 0x89, 0xa8, 0x2b, 0x72, 0x53, 0x23, 0x6d, 0x28, 0x5f, 0x1, 0x29, 0x37, 0x1d, 0xca, 0x35, 0xe0, 0xa3, 0x39, 0xa2, 0xb6, 0xc7, 0x86, 0x9f, 0x3a, 0xb0, 0xd3, 0xbf, 0x50, 0x52, 0x6e, 0x6e, 0x53, 0xd, 0xfd, 0x30, 0x89, 0xd9, 0x79, 0x32, 0x38, 0xc, 0xfa, 0xab, 0xbb, 0x4c, 0x8c, 0x39, 0x23, 0x3b, 0xa4, 0xc9, 0x38, 0x9b, 0x16, 0xab, 0xbf, 0x32, 0x17, 0xd9, 0x8, 0x43, 0x88, 0xdd, 0x2, 0xf2, 0x8f, 0xa2, 0x93, 0xb5, 0xe4, 0x6c, 0x37, 0x65, 0x1e, 0x1f, 0xd1, 0x51, 0xaf, 0xff, 0x25, 0x15, 0x74, 0xde, 0x48, 0xc6, 0x6e, 0x28, 0xc6, 0xf4, 0x9f, 0x36, 0xbd, 0x3c, 0xf9, 0x79, 0x9c, 0x12, 0xb1, 0xef, 0xf9, 0x6d, 0xc7, 0x94, 0x72, 0xa6, 0xb7, 0xe2, 0xf2, 0xa5, 0x31, 0x1e, 0x1f, 0xb9, 0xca, 0x10, 0x9, 0x50, 0x2d, 0x16, 0xd2, 0x1c, 0x4d, 0x44, 0x9e, 0xdd, 0xbe, 0x52, 0x22, 0xd0, 0xed, 0x4f, 0xb7, 0x34, 0xd6, 0x7a, 0x61, 0x58, 0x12, 0xe1, 0xf8, 0x60, 0xbd, 0x4a, 0x61, 0x5, 0x9e, 0x7b, 0x53, 0xc7, 0xd8, 0xc5, 0x5f, 0xaf, 0xe7, 0x66, 0xc7, 0x26, 0xfd, 0x26, 0xd9, 0x2b, 0x58, 0x81, 0xb5, 0x60, 0x6, 0xc8, 0x7f, 0xf0, 0xac, 0x44, 0x92, 0x1, 0x87, 0x8e, 0xfe, 0xdc, 0xba, 0x22, 0x73, 0x3b, 0x2c, 0x4, 0x5a, 0xe2, 0xc5, 0xfa, 0x16, 0x6, 0x6e, 0xa2, 0xe4, 0xa6, 0x3d, 0x75, 0x12, 0x3c, 0xa, 0x1, 0xca, 0x7b, 0x7, 0x7e, 0x95, 0x6c, 0xe4, 0x4b, 0xe6, 0x4b, 0xda, 0xe3, 0xa4, 0x6c, 0xb4, 0x78, 0xee, 0x75, 0x8e, 0x66, 0xda, 0x9b, 0xa5, 0xf2, 0x98, 0xde, 0xa4, 0x84, 0x51, 0x83, 0x41, 0x68, 0xa5, 0xd6, 0x4e, 0x92, 0x1f, 0xfb, 0x6e, 0xb6, 0xec, 0x64, 0xaf, 0xcf, 0x6c, 0xa2, 0xaf, 0x75, 0x27, 0xd7, 0x4b, 0x97, 0x4f, 0x5, 0xe6, 0x5a, 0x69, 0xf, 0x14, 0x5b, 0xab, 0xcb, 0xbb, 0xde, 0xef, 0x48, 0xe3, 0xa4, 0xb4, 0x71, 0xbc, 0x63, 0xd9, 0x96, 0xcc, 0xbe, 0x52, 0x2e, 0xfc, 0x18, 0x90, 0x5d, 0x5e, 0x5f, 0xbf, 0xa, 0x15, 0x71, 0x87, 0x56, 0x4, 0xa6, 0x2f, 0x18, 0xbd, 0x83, 0x9f, 0x33, 0x70, 0x61, 0xc0, 0xb4, 0x35, 0x5, 0x6, 0x37, 0x11, 0xb3, 0xb9, 0x41, 0x47, 0x55, 0xb3, 0x9, 0x5d, 0xf7, 0x72, 0xfa, 0x47, 0x6a, 0x4c, 0x14, 0x7a, 0xac, 0x71, 0x1a, 0x39, 0xca, 0xe3, 0xb6, 0x98, 0xf4, 0xc0, 0x8, 0x8, 0x0, 0x39, 0xe5, 0x7f, 0xef, 0xd9, 0xae, 0x7e, 0xba, 0x30, 0xa8, 0xe5, 0xa5, 0xa2, 0x57, 0xf1, 0xfc, 0x4a, 0x97, 0x27, 0x91, 0xc0, 0x3e, 0xd1, 0x7d, 0x99, 0x87, 0xb, 0xa7, 0x10, 0xd7, 0x78, 0x49, 0x8c, 0xaf, 0xee, 0x9a, 0xe9, 0x28, 0x89, 0x28, 0xd7, 0x24, 0x6e, 0x3d, 0xa7, 0x7a, 0xee, 0x6c, 0x15, 0x2b, 0xe7, 0xc2, 0x7, 0x50, 0x4c, 0x1d, 0x8a, 0x40, 0xed, 0xc5, 0x57, 0xcf, 0x5f, 0x4, 0x76, 0x5, 0xb6, 0x39, 0x9e, 0x71, 0x9f, 0xbf, 0x8b, 0x86, 0xc2, 0x1, 0x3c, 0x34, 0x7d, 0x2d, 0x3e, 0x10, 0x7e, 0x4b, 0x25, 0xca, 0x2c, 0xa2, 0xbe, 0x31, 0xf1, 0xa9, 0x38, 0xeb, 0xe6, 0x11, 0x19, 0x20, 0xcd, 0xec, 0xd3, 0xe1, 0x27, 0xeb, 0xc0, 0x72, 0xad, 0x70, 0x9a, 0x11, 0xb1, 0xfb, 0x7f, 0xb5, 0x6a, 0xaf, 0xe3, 0xb3, 0xf8, 0x2b, 0xc4, 0x92, 0x5b, 0x5b, 0x68, 0xc1, 0x23, 0xaf, 0x7a, 0x8d, 0xd0, 0xb9, 0xb7, 0x27, 0x2c, 0x1c, 0x59, 0x9a, 0x18, 0xc3, 0xd, 0x66, 0xf, 0xca, 0x43, 0xc8, 0xad, 0x2, 0xa1, 0xca, 0x7b, 0x52, 0x76, 0xb2, 0x1a, 0xb4, 0x8b, 0xd3, 0xde, 0x52, 0xff, 0x40, 0x5f, 0x4e, 0xa0, 0x24, 0xc6, 0x4a, 0x91, 0xd2, 0xfc, 0xcf, 0xd7, 0x11, 0x36, 0xd6, 0xbf, 0xd3, 0x1f, 0x2b, 0xb4, 0xe8, 0xb7, 0x3a, 0x6, 0x85, 0xfa, 0xfd, 0x40, 0xde, 0x6c, 0x5b, 0x7e, 0x8b, 0x17, 0x49, 0xc4, 0x11, 0x78, 0x13, 0xcc, 0x72, 0x29, 0x31, 0x9, 0xb6, 0x4c, 0x35, 0x61, 0xb4, 0x33, 0x5e, 0x12, 0x79, 0xf5, 0x6e, 0xe5, 0xa4, 0x88, 0xf7, 0x2e, 0x10, 0xca, 0x84, 0xb, 0xef, 0x5d, 0x7f, 0x67, 0xbd, 0x96, 0xb9, 0x99, 0xde, 0x97, 0x7b, 0xa8, 0x6f, 0xe9, 0x53, 0x15, 0xbe, 0x4e, 0xc1, 0xfe, 0xd3, 0x5d, 0xcd, 0x75, 0x42, 0x7e, 0xe6, 0x43, 0x57, 0x31, 0x23, 0x83, 0xb4, 0xb1, 0x25, 0x31, 0xf1, 0x81, 0x75, 0x8e, 0x49, 0x4d, 0xdd, 0xb1, 0xaf, 0xc4, 0xd9, 0xda, 0x15, 0x3f, 0x7d, 0x8e, 0x56, 0x84, 0xb8, 0x73, 0xae, 0xa3, 0x1b, 0xa6, 0xe3, 0xd8, 0xd, 0x1b, 0x98, 0xa, 0x52, 0xe3, 0xa4, 0xb, 0xa4, 0x41, 0x1a, 0xbd, 0xb3, 0x4c, 0x35, 0x1c, 0x9c, 0xab, 0x9f, 0xdf, 0x3a, 0xaa, 0xab, 0x1a, 0xd5, 0x18, 0xc4, 0x53, 0xd1, 0xa7, 0x1, 0x7, 0x21, 0xb9, 0xf2, 0xdc, 0xef, 0x7c, 0x1a, 0xdd, 0x61, 0x80, 0xf4, 0xbc, 0xb3, 0xf0, 0xee, 0x6c, 0xe6, 0xcc, 0x25, 0xde, 0x98, 0xb5, 0x83, 0x10, 0x34, 0x5e, 0xa, 0xe9, 0xc7, 0x54, 0xa, 0x89, 0xf4, 0xca, 0x2, 0x1c, 0x42, 0xb4, 0x2b, 0xa6, 0x5a, 0x7b, 0x62, 0xdb, 0x1d, 0x48, 0x74, 0x6a, 0x2d, 0xf5, 0x6b, 0x2c, 0xf6, 0x25, 0x56, 0x1d, 0xa0, 0x46, 0xb2, 0x73, 0x4c, 0xfd, 0xc5, 0x1f, 0x3d, 0x81, 0x31, 0x17, 0x62, 0xfc, 0x6d, 0x3f, 0xbe, 0x54, 0x88, 0xe5, 0x79, 0xdf, 0x22, 0x83, 0xe4, 0x2e, 0x8b, 0xfa, 0xb2, 0x38, 0x14, 0xe5, 0xa0, 0xcd, 0x4a, 0x2d, 0x48, 0x78, 0x73, 0xbe, 0x7, 0x18, 0xac, 0x40, 0x66, 0x95, 0x35, 0xc5, 0x1e, 0xb, 0xda, 0x84, 0x66, 0xe5, 0xc1, 0xd4, 0x21, 0x24, 0xb8, 0xe0, 0x97, 0x3f, 0xb3, 0xc4, 0x0, 0xbe, 0x41, 0x7b, 0x17, 0x23, 0xbd, 0xd0, 0xe1, 0x72, 0x7b, 0x14, 0x2e, 0xb4, 0xa4, 0x53, 0x4c, 0x10, 0x77, 0xf7, 0x5f, 0x9f, 0xd3, 0xf8, 0xd, 0x53, 0xfb, 0xd3, 0x64, 0x4e, 0xe6, 0x36, 0xdd, 0x4f, 0x7, 0x56, 0x67, 0xba, 0xa6, 0xa7, 0x71, 0x7c, 0xca, 0x1e, 0xe3, 0x8f, 0x65, 0x1b, 0xb8, 0xda, 0xad, 0xe4, 0x14, 0x52, 0x94, 0x20, 0x99, 0xc2, 0xf9, 0x11, 0x3f, 0x5d, 0x4e, 0x7d, 0x4, 0x50, 0x84, 0x2f, 0xe7, 0x2a, 0xf6, 0xd7, 0x92, 0x1e, 0x2a, 0xe2, 0x6a, 0x6d, 0x7e, 0x41, 0x41, 0x71, 0x4c, 0xca, 0x85, 0x7f, 0xb6, 0x1a, 0xed, 0xb5, 0x9a, 0x27, 0xc0, 0xd9, 0xb2, 0x44, 0x11, 0xce, 0x57, 0xfa, 0xb8, 0xf0, 0xb, 0x2d, 0xb1, 0x1, 0x6d, 0x4f, 0xdb, 0x18, 0x57, 0x40, 0xa0, 0xe8, 0x11, 0x8f, 0xc2, 0x6b, 0x3c, 0xe7, 0x3b, 0x1a, 0x59, 0xa0, 0x8c, 0xbb, 0x11, 0xac, 0x31, 0x45, 0xcc, 0xa, 0x5a, 0x9a, 0xd0, 0x12, 0xf4, 0x13, 0xde, 0xe7, 0xee, 0x74, 0xf1, 0xcb, 0x82, 0xd6, 0x4f, 0x4, 0xe6, 0x2b, 0x7e, 0x17, 0x70, 0xaf, 0x48, 0x1c, 0xcb, 0x74, 0xf5, 0x65, 0x7c, 0xcb, 0x61, 0x99, 0x92, 0x66, 0x59, 0xce, 0xe9, 0xba, 0xf6, 0x10, 0xfc, 0x6b, 0x83, 0x64, 0x8, 0x76, 0x8, 0xa, 0x6e, 0x61, 0xd5, 0x6b, 0x7, 0x78, 0xb, 0x2f, 0x63, 0xc4, 0xd5, 0xcf, 0x78, 0x85, 0xa0, 0x61, 0x12, 0x27, 0x68, 0x5, 0xcd, 0x2c, 0xf, 0x63, 0x77, 0x37, 0x30, 0x30, 0x40, 0xab, 0xe2, 0xc2, 0x32, 0xa7, 0xfd, 0x9e, 0x92, 0x95, 0xf, 0x6b, 0xc5, 0xb1, 0x95, 0xca, 0xd8, 0xf2, 0xf2, 0xd0, 0x3e, 0xb2, 0x8f, 0xf7, 0x9f, 0xab, 0x6f, 0xbc, 0x4e, 0xe8, 0x9f, 0x98, 0x74, 0x64, 0xf, 0xc8, 0xb1, 0xe6, 0xc, 0xe7, 0xbc, 0xa1, 0x2, 0x3b, 0x5, 0xf3, 0x9f, 0xbe, 0xd3, 0xaf, 0xc0, 0x99, 0x66, 0x48, 0xef, 0x12, 0x26, 0x1a, 0x41, 0xe3, 0xf9, 0x57, 0xd9, 0x22, 0x98, 0x5b, 0x48, 0x7b, 0x81, 0xd8, 0x41, 0xb, 0x19, 0x1, 0xe2, 0x4a, 0xd0, 0x56, 0xe, 0x82, 0xe0, 0x28, 0x85, 0x32, 0x1f, 0xd0, 0xe3, 0x81, 0x8a, 0x7c, 0x82, 0xbe, 0x77, 0xd4, 0x7d, 0xd4, 0x4d, 0xe4, 0x10, 0xec, 0xe7, 0x69, 0x4a, 0xee, 0x7c, 0xd7, 0xe, 0x13, 0x38, 0x60, 0x23, 0xaf, 0xf0, 0x65, 0x4c, 0x80, 0xce, 0x5c, 0x4, 0xf2, 0xdb, 0x70, 0x4b, 0x2a, 0x3, 0x19, 0x87, 0xfb, 0xf5, 0x9f, 0x3c, 0xb3, 0xcc, 0xb3, 0x36, 0xff, 0x3d, 0x78, 0xd2, 0x1f, 0xe6, 0xf2, 0x37, 0x4c, 0xd6, 0x71, 0x0, 0x91, 0xde, 0x7e, 0x11, 0xe5, 0xa1, 0x52, 0x87, 0x4, 0x6c, 0xed, 0x9e, 0xc5, 0xb4, 0x41, 0x13, 0xa0, 0x2e, 0x70, 0xf2, 0x41, 0x92, 0xb0, 0xc6, 0x9d, 0x3b, 0x90, 0x35, 0x6e, 0x23, 0x5b, 0x5b, 0x1f, 0xa8, 0xab, 0x91, 0x42, 0x1d, 0xd6, 0x53, 0xa6, 0x70, 0xaa, 0x73, 0x81, 0x1e, 0xb5, 0x2e, 0x4f, 0xd4, 0x48, 0xb6, 0xd1, 0x8f, 0x3f, 0xb9, 0x5a, 0x6, 0xce, 0xb7, 0x31, 0xfe, 0xf4, 0xe2, 0x99, 0xee, 0x8, 0x54, 0xa5, 0x4, 0x44, 0xdc, 0xda, 0x8b, 0xfa, 0xc4, 0x1b, 0xe3, 0x2e, 0xa1, 0xda, 0x34, 0x95, 0xdb, 0xe, 0x9c, 0x28, 0xf7, 0xa5, 0xb6, 0x81, 0x44, 0x8, 0xd2, 0xb3, 0x8f, 0x9d, 0x1d, 0x46, 0x42, 0x7f, 0x70, 0x3c, 0x29, 0x12, 0x32, 0x1d, 0x3f, 0xf9, 0xa3, 0x3e, 0xb7, 0x6b, 0x59, 0x6, 0x47, 0xc1, 0xad, 0x9c, 0x33, 0xde, 0xaf, 0x34, 0x8, 0xf8, 0x53, 0x29, 0xf2, 0x81, 0x0, 0xfc, 0xdc, 0x99, 0x60, 0x41, 0xe3, 0x85, 0x9, 0xed, 0xa4, 0x1f, 0xe2, 0xcd, 0x3, 0x7a, 0xc3, 0x7d, 0x6d, 0xa2, 0x2d, 0xdf, 0x84, 0xfa, 0x48, 0x8, 0xac, 0x1d, 0x8, 0x71, 0x69, 0x1b, 0xd6, 0x28, 0x9a, 0x5e, 0xa1, 0xe, 0xea, 0x14, 0xd9, 0x4, 0x80, 0xa8, 0x20, 0x55, 0xfe, 0x3f, 0x28, 0x54, 0xd1, 0xa8, 0x9c, 0x13, 0x9b, 0x63, 0xae, 0x2d, 0x42, 0x4f, 0x61, 0xa8, 0xb5, 0xd4, 0xd, 0xcc, 0xdc, 0xee, 0xcd, 0x8e, 0x74, 0xd7, 0x36, 0x16, 0x1d, 0x54, 0x2e, 0x5c, 0x86, 0x7b, 0xf0, 0xab, 0x5a, 0x38, 0x31, 0xe4, 0xdc, 0xe1, 0xec, 0xf9, 0xc2, 0xd2, 0x52, 0xe0, 0x95, 0x8b, 0x25, 0x3, 0x16, 0xff, 0x7a, 0x7, 0x33, 0x7a, 0x3f, 0x4c, 0xde, 0xc, 0x97, 0x1f, 0xe4, 0x12, 0x56, 0xdd, 0x5b, 0x67, 0xf1, 0xa6, 0xf5, 0x71, 0xae, 0x81, 0x51, 0xc3, 0xf8, 0x3e, 0x75, 0xae, 0xc8, 0x0, 0x56, 0xd5, 0xb4, 0x62, 0xe7, 0x8b, 0x4f, 0x62, 0x3e, 0xb3, 0x13, 0x34, 0x8e, 0x5, 0xd1, 0xe4, 0x9e, 0x2a, 0xfa, 0x5, 0xd8, 0x67, 0x69, 0x63, 0x8e, 0x96, 0xd7, 0xbf, 0xb8, 0x7d, 0x9b, 0x94, 0x48, 0x98, 0x17, 0x84, 0x3a, 0xd2, 0xe5, 0xd7, 0x8, 0x53, 0xa5, 0x9d, 0xe2, 0xf3, 0x1d, 0x3b, 0x2f, 0x89, 0x1f, 0x47, 0xee, 0x3d, 0x9e, 0x13, 0x5c, 0xc9, 0x89, 0xe0, 0x57, 0xd7, 0x4d, 0x59, 0x31, 0x86, 0x15, 0x56, 0x9, 0x1f, 0xea, 0xe2, 0x83, 0x10, 0x33, 0x8c, 0xe6, 0x14, 0x77, 0xad, 0x28, 0xa, 0xbe, 0x18, 0x88, 0x3d, 0x52, 0x2, 0xfc, 0x6b, 0xcd, 0x50, 0x58, 0xf3, 0x3a, 0x11, 0x85, 0xb5, 0xa1, 0x8a, 0xdf, 0x30, 0xb, 0x5f, 0x93, 0x7d, 0xac, 0xe3, 0xb7, 0x4a, 0x7c, 0xa0, 0xdd, 0xad, 0xcb, 0x0, 0x2f, 0x55, 0x99, 0x42, 0xc3, 0x92, 0x6c, 0xdf, 0x9, 0x29, 0xde, 0xd1, 0x3e, 0xc3, 0x3c, 0x11, 0x7, 0x3e, 0x48, 0xd, 0xc4, 0x2d, 0xae, 0x63, 0x8b, 0x7d, 0x39, 0x5d, 0x4a, 0x6e, 0x2b, 0x4c, 0x68, 0x79, 0x4b, 0xa9, 0x82, 0x55, 0x6c, 0xa2, 0x2d, 0x62, 0xd4, 0x33, 0x2b, 0x93, 0x8d, 0xf0, 0xbb, 0xd, 0x51, 0xf6, 0x34, 0xf5, 0x52, 0x3a, 0xc2, 0x64, 0xc9, 0x7, 0x1d, 0x21, 0x9b, 0xdc, 0x5b, 0xee, 0xf, 0xce, 0xee, 0xe, 0x58, 0x55, 0x1, 0xf7, 0x68, 0x81, 0x17, 0xdf, 0xe, 0xd6, 0xcd, 0x83, 0x5a, 0x90, 0xe7, 0xab, 0x84, 0x1, 0x17, 0xa1, 0xb5, 0x2f, 0x60, 0x50, 0x2a, 0x64, 0x23, 0xb0, 0xcd, 0x86, 0x98, 0x68, 0x0, 0xfb, 0xe1, 0xa6, 0x90, 0xd0, 0x68, 0xd5, 0x7f, 0x21, 0x59, 0x2, 0xc7, 0x22, 0x19, 0x5b, 0xe4, 0x41, 0x31, 0xc4, 0xd9, 0x1c, 0x83, 0x93, 0x6e, 0xf8, 0x95, 0xc, 0x87, 0x35, 0xca, 0xdf, 0x28, 0xe8, 0x8a, 0x56, 0x7a, 0x5, 0xc2, 0xde, 0x6d, 0xc1, 0x3c, 0x91, 0x25, 0x89, 0x8f, 0x56, 0x5a, 0x6f, 0xa2, 0xe1, 0x6d, 0x5b, 0xbc, 0x18, 0xae, 0x99, 0xf4, 0xf5, 0xbe, 0x13, 0xa4, 0xdf, 0x84, 0xae, 0xf0, 0xc3, 0xec, 0x5d, 0x83, 0xf8, 0xb0, 0xa, 0xa4, 0x65, 0xd8, 0xb, 0xe6, 0xb6, 0x7e, 0x37, 0x4b, 0x19, 0x39, 0x64, 0x59, 0x65, 0x69, 0x4a, 0x8, 0x92, 0x25, 0x56, 0xd8, 0xbc, 0xe0, 0xed, 0x23, 0x4f, 0xb9, 0x33, 0xe4, 0x5c, 0x89, 0x61, 0xe0, 0x42, 0x3d, 0x52, 0xd, 0x86, 0x13, 0xff, 0x3a, 0x4e, 0x41, 0x79, 0x7, 0xbf, 0x50, 0x6, 0xb2, 0xc1, 0xca, 0x6d, 0x61, 0xb, 0xd, 0x30, 0x31, 0x21, 0xd1, 0xd6, 0x6d, 0xe6, 0xde, 0xab, 0x99, 0xff, 0x67, 0xfd, 0xa0, 0xd4, 0xd, 0xc5, 0xaa, 0xc7, 0x50, 0x35, 0x90, 0xc9, 0xd7, 0xb2, 0x46, 0x7c, 0x8b, 0xcf, 0x2e, 0x2, 0xaf, 0x92, 0xbf, 0x3a, 0xe8, 0xb1, 0x33, 0x33, 0x5d, 0x36, 0xd6, 0x84, 0xe7, 0x65, 0xda, 0xc0, 0xb8, 0x9f, 0x75, 0x8f, 0x3f, 0x44, 0xb7, 0xbc, 0x30, 0x19, 0xe8, 0x7a, 0xb1, 0x12, 0xc7, 0x35, 0xab, 0x8, 0x6e, 0x4c, 0xff, 0x8d, 0x42, 0x80, 0x43, 0xf8, 0xfa, 0xa4, 0xef, 0xaf, 0x9d, 0xf1, 0x5f, 0x85, 0xa9, 0xff, 0x8d, 0x53, 0xd8, 0xce, 0xce, 0xc7, 0x3a, 0xbe, 0x9c, 0x40, 0xac, 0x20, 0x1e, 0xa7, 0x2d, 0x88, 0xb6, 0x1f, 0x8c, 0x35, 0x82, 0xa5, 0x42, 0xbe, 0xf7, 0xde, 0xec, 0xef, 0xe6, 0x6b, 0x4, 0x65, 0x80, 0x60, 0xfc, 0xd3, 0xa9, 0xdb, 0xe8, 0x9, 0xc8, 0x13, 0xaf, 0xc9, 0xff, 0x91, 0x14, 0x64, 0x47, 0x98, 0x6c, 0x1e, 0xf7, 0x31, 0xc, 0xd3, 0x25, 0x49, 0x57, 0x3b, 0x22, 0x21, 0x2a, 0xac, 0xba, 0x72, 0xeb, 0xb7, 0xe7, 0x59, 0x8, 0xef, 0xac, 0xd, 0x6a, 0x77, 0x42, 0x9, 0x90, 0x21, 0x14, 0xc3, 0xfe, 0x6, 0x2b, 0x12, 0x50, 0x7e, 0xb0, 0x94, 0x47, 0x32, 0xa5, 0x7c, 0xf0, 0x4a, 0x8b, 0x4f, 0x74, 0xdd, 0x7b, 0xc9, 0x3f, 0xd6, 0x8, 0x2f, 0xa1, 0x30, 0x9d, 0x6d, 0x62, 0x76, 0x1a, 0xf, 0x65, 0x39, 0x77, 0x84, 0xa3, 0x1f, 0xf7, 0x47, 0x1b, 0x10, 0x4f, 0x12, 0xdc, 0xd4, 0x19, 0x5f, 0x81, 0x3d, 0x8a, 0xb5, 0x6e, 0xb2, 0x95, 0xae, 0x69, 0x15, 0x87, 0x18, 0xfb, 0x95, 0x88, 0xe1, 0xcd, 0xc3, 0x21, 0x7f, 0x73, 0xf4, 0xbb, 0x2f, 0xc6, 0x7e, 0xac, 0xf5, 0x9, 0x62, 0xab, 0xa5, 0xdb, 0xd8, 0xbe, 0xad, 0xf9, 0xa5, 0xa9, 0xd7, 0xb5, 0x24, 0x68, 0xc7, 0x1d, 0xa6, 0xf7, 0x28, 0x7d, 0x70, 0xea, 0x99, 0xa9, 0xca, 0xb, 0x46, 0x11, 0x77, 0xcc, 0xe4, 0x92, 0x1c, 0x4d, 0x17, 0x7b, 0xba, 0x2d, 0xbf, 0xd4, 0x18, 0x66, 0xab, 0x4b, 0x3c, 0x79, 0xd2, 0x8b, 0xeb, 0x80, 0xc9, 0xf0, 0xb8, 0xbf, 0x91, 0x6, 0x79, 0x32, 0x89, 0x65, 0x9d, 0xae, 0x36, 0xb7, 0x6, 0x89, 0x5, 0x61, 0xed, 0x6e, 0x3b, 0xd6, 0xc0, 0x4, 0x2f, 0x2c, 0x71, 0x8f, 0x48, 0x3d, 0xc6, 0xd5, 0x6f, 0xf0, 0x5c, 0x41, 0x8e, 0x58, 0xd9, 0xac, 0x3f, 0x36, 0x97, 0x7e, 0x25, 0x93, 0x2b, 0x62, 0xf7, 0x9b, 0x1f, 0xce, 0xca, 0x7a, 0x66, 0xc4, 0xff, 0xd1, 0xa9, 0xcf, 0x1e, 0x6, 0xa, 0xaa, 0xa1, 0xf4, 0x1c, 0x23, 0x9a, 0x51, 0xc0, 0xb2, 0x75, 0xd6, 0x28, 0xe3, 0x52, 0x69, 0x4f, 0xfe, 0x94, 0xbf, 0x9e, 0x8a, 0x4a, 0x29, 0xa2, 0x67, 0xb7, 0x8b, 0xf2, 0xf5, 0xf3, 0xa, 0xfe, 0x4d, 0x2b, 0x51, 0x85, 0xd, 0x6a, 0xb1, 0x99, 0xa8, 0x8b, 0x95, 0x18, 0xa7, 0x48, 0x75, 0xba, 0xc, 0x43, 0xc2, 0x95, 0x15, 0xe6, 0x6b, 0xa1, 0x10, 0x1b, 0xd, 0xb3, 0x4c, 0xb7, 0xbf, 0x85, 0x97, 0xbb, 0xeb, 0xe3, 0x45, 0x36, 0xe6, 0xb2, 0x5e, 0x3f, 0xb5, 0x7, 0x32, 0x42, 0xc8, 0x84, 0x47, 0xe5, 0x57, 0xbe, 0xcf, 0xd5, 0x14, 0x72, 0x16, 0xc2, 0x79, 0xd7, 0xca, 0x3a, 0x9a, 0x2, 0xcd, 0x69, 0x79, 0x61, 0xa0, 0x17, 0x70, 0x8a, 0xcd, 0x68, 0x76, 0xd1, 0xe8, 0x7e, 0x9b, 0xbe, 0x9a, 0xd1, 0xb4, 0x77, 0x76, 0x17, 0x16, 0x9c, 0x93, 0xe, 0xfd, 0x58, 0x72, 0x8a, 0x96, 0xd5, 0xef, 0xf4, 0xc4, 0xa8, 0x23, 0xca, 0xfd, 0xd2, 0x65, 0xb8, 0xee, 0x81, 0x95, 0xf8, 0x8e, 0xcc, 0x8, 0xee, 0x15, 0x5a, 0x14, 0x56, 0x90, 0x1, 0xa, 0xa1, 0x8f, 0x76, 0x9b, 0xe1, 0xe, 0x88, 0xef, 0xb8, 0xf5, 0xef, 0xe, 0x8a, 0x1c, 0xcb, 0xbb, 0xca, 0xc0, 0xf0, 0xf9, 0x38, 0xc8, 0xb8, 0xcd, 0xe9, 0x1e, 0x2e, 0xc0, 0x14, 0x4a, 0x8a, 0xb8, 0xd8, 0x87, 0x5, 0xe5, 0x98, 0xf6, 0x2f, 0x96, 0x78, 0xf2, 0xf6, 0x80, 0xda, 0x44, 0xbf, 0xb3, 0x34, 0x9d, 0x51, 0x66, 0x2e, 0xb3, 0x5a, 0xf9, 0x34, 0x38, 0x28, 0x0, 0xa0, 0x78, 0x62, 0x97, 0x87, 0x60, 0x6e, 0xf6, 0x12, 0x73, 0x62, 0xe, 0x96, 0x62, 0x1e, 0x55, 0x1c, 0x90, 0xe6, 0x7b, 0xb2, 0x87, 0x9b, 0x1f, 0xbc, 0xfd, 0x24, 0x38, 0x85, 0xe7, 0x80, 0x7d, 0xc2, 0xac, 0x2f, 0x51, 0x9, 0xbc, 0xbb, 0x5a, 0x3b, 0x14, 0xac, 0x39, 0x42, 0x39, 0x6, 0x99, 0xce, 0x2f, 0x9e, 0x6e, 0x64, 0x4b, 0x9c, 0x7f, 0x85, 0x80, 0x1e, 0x81, 0x10, 0xa2, 0x68, 0x2a, 0xb5, 0x43, 0x36, 0x44, 0x4e, 0xd5, 0x6, 0x43, 0xb8, 0x8e, 0xd, 0x63, 0x6d, 0x8d, 0xde, 0xa, 0x6a, 0x14, 0x42, 0x63, 0x15, 0x32, 0x70, 0x22, 0x36, 0xaa, 0x5e, 0xf2, 0x26, 0xa8, 0x8b, 0x87, 0x87, 0x13, 0x86, 0xbd, 0x58, 0x7a, 0x22, 0x37, 0x1d, 0x28, 0x10, 0x3c, 0xc0, 0xb6, 0x43, 0xff, 0xde, 0x41, 0x2f, 0x95, 0x7a, 0xb3, 0x2, 0xb7, 0x89, 0x3b, 0xe6, 0x9a, 0xa5, 0x44, 0xe, 0x51, 0xf9, 0x3f, 0x14, 0xdc, 0x57, 0x32, 0x67, 0xf4, 0xba, 0x52, 0xd7, 0x5, 0x22, 0xc0, 0x19, 0x92, 0xd6, 0xb7, 0xc4, 0x69, 0x30, 0xc2, 0x46, 0xac, 0x2, 0x15, 0xfd, 0xc3, 0x92, 0x63, 0x2e, 0x46, 0x8, 0x22, 0x1b, 0xa2, 0xb1, 0x57, 0x60, 0x63, 0x5b, 0x1b, 0xc, 0x46, 0xf9, 0x1f, 0xe5, 0xf0, 0xc0, 0x2f, 0xf0, 0x32, 0x26, 0xca, 0x7a, 0x86, 0x1c, 0xf0, 0xc7, 0x7d, 0x33, 0x2b, 0xb9, 0x7d, 0xdc, 0xfb, 0x5a, 0xbf, 0xc4, 0x4b, 0x62, 0x5e, 0x1a, 0xe2, 0x4d, 0xbc, 0x7, 0x2b, 0x81, 0xcc, 0x90, 0x20, 0xb, 0x24, 0x37, 0xd1, 0x29, 0x32, 0x21, 0x1b, 0x5a, 0x9, 0xc5, 0x3, 0x4, 0x15, 0xe0, 0x35, 0xe, 0xd5, 0x34, 0xca, 0x1d, 0x6f, 0xb6, 0xbb, 0x3b, 0x7d, 0xed, 0x85, 0xf0, 0x35, 0x57, 0xae, 0x2e, 0x86, 0x66, 0xc8, 0xbe, 0x3e, 0xf0, 0xb6, 0xf9, 0xf2, 0x1, 0x5, 0x58, 0xc2, 0x74, 0xe, 0x99, 0x63, 0x20, 0xff, 0x8b, 0x40, 0xc8, 0x40, 0x9f, 0x3d, 0x4e, 0xdc, 0xfa, 0x2a, 0x6f, 0xeb, 0x32, 0xa0, 0xd3, 0x57, 0x3, 0x8a, 0xc9, 0xf1, 0xd, 0x2e, 0xb2, 0x18, 0xe3, 0x38, 0xdd, 0x2a, 0x50, 0x8d, 0x2d, 0x9a, 0xbb, 0x6a, 0xce, 0x84, 0x4a, 0x7a, 0x95, 0x7e, 0x6f, 0x65, 0xe8, 0x81, 0xf7, 0xf9, 0x98, 0x7b, 0xc2, 0x45, 0x13, 0x4e, 0x99, 0x92, 0xf6, 0xe1, 0x51, 0xee, 0x61, 0x93, 0xe1, 0x16, 0xd5, 0x7, 0x8, 0xef, 0x8a, 0x99, 0xfb, 0xef, 0x5c, 0x88, 0x13, 0x17, 0x8a, 0xf, 0x2f, 0xe9, 0xd5, 0x23, 0xd2, 0x80, 0x2, 0xd2, 0xe8, 0x10, 0x20, 0x67, 0x48, 0x98, 0xac, 0x7e, 0x23, 0x60, 0xfd, 0x2, 0x6f, 0xe7, 0x7e, 0xda, 0x9a, 0xad, 0xbf, 0x51, 0xcc, 0x48, 0x36, 0x1f, 0x3d, 0x67, 0x8d, 0xe7, 0xb, 0x44, 0x26, 0xf8, 0x26, 0xbf, 0xae, 0x70, 0xb1, 0xf5, 0xa6, 0xaa, 0x11, 0xaf, 0xb5, 0x88, 0x9d, 0xb2, 0xe, 0x93, 0x40, 0xb2, 0x4e, 0x44, 0x57, 0x6, 0x29, 0xd9, 0x4a, 0x76, 0x4a, 0x96, 0xd0, 0x5f, 0x7e, 0xf8, 0xbf, 0xe3, 0x5d, 0xa0, 0x4c, 0x84, 0x90, 0x86, 0xb, 0xc8, 0xa6, 0x41, 0x11, 0x8d, 0x94, 0xda, 0x4a, 0xa3, 0xfc, 0x83, 0x31, 0x1d, 0x70, 0x9, 0x1e, 0xdd, 0xbc, 0x56, 0x27, 0x80, 0x5c, 0xd4, 0x90, 0xb9, 0x1d, 0xe3, 0x94, 0x84, 0xe5, 0x66, 0x85, 0xa9, 0x56, 0xe8, 0xb9, 0xf3, 0xe3, 0x10, 0xab, 0xde, 0xd9, 0x87, 0x4f, 0xb2, 0x9c, 0xed, 0x3d, 0x37, 0xcb, 0x6e, 0x16, 0x3e, 0x3d, 0x65, 0x3f, 0x7, 0xc7, 0x14, 0xfd, 0x25, 0xc4, 0xae, 0x92, 0x9b, 0x4, 0x5d, 0x10, 0x11, 0x2e, 0xa4, 0x9, 0x49, 0x7e, 0x65, 0x7f, 0xa1, 0x9, 0xd6, 0xa5, 0x9b, 0xa3, 0x80, 0xc3, 0xcb, 0xe, 0xc1, 0x24, 0x77, 0x1e, 0x71, 0x6c, 0x70, 0xd0, 0x22, 0xb9, 0xc6, 0x3c, 0xd5, 0xe8, 0x84, 0x7d, 0xb5, 0xa, 0x81, 0x7b, 0xc3, 0xea, 0xa7, 0xca, 0x70, 0xa7, 0x78, 0xc9, 0x60, 0xe2, 0xb5, 0xf4, 0x71, 0xaa, 0x29, 0x61, 0xf2, 0xdb, 0x30, 0x8e, 0x9a, 0x48, 0xb6, 0xd9, 0xee, 0xe2, 0xfe, 0x75, 0x3f, 0xeb, 0x7f, 0xd2, 0x8f, 0x48, 0x94, 0x95, 0x15, 0x6a, 0x7, 0x90, 0x64, 0xea, 0x52, 0xce, 0x97, 0x1f, 0x6b, 0x4d, 0x42, 0x3e, 0xcb, 0x8c, 0x5e, 0x18, 0xa, 0xf3, 0x6d, 0xac, 0xbf, 0x47, 0x77, 0x51, 0x80, 0xec, 0x56, 0xad, 0x93, 0xfe, 0x91, 0x43, 0xcf, 0x5c, 0x93, 0xf0, 0x40, 0x1d, 0x81, 0x3, 0xf, 0x26, 0x6b, 0x86, 0xbe, 0x9a, 0x7b, 0x9f, 0xb9, 0x47, 0x20, 0x79, 0x84, 0x2d, 0xe4, 0x8e, 0xc8, 0xb, 0x60, 0xb1, 0x23, 0x71, 0xa3, 0x7c, 0x92, 0x45, 0x58, 0xdd, 0xd5, 0xbd, 0x8b, 0x8, 0x11, 0x13, 0x3f, 0x90, 0x2e, 0x27, 0xc2, 0xa2, 0x65, 0xcf, 0xde, 0xdc, 0xe0, 0x6f, 0x1f, 0xd6, 0x26, 0x6e, 0x35, 0x9e, 0xc0, 0xd, 0x48, 0x54, 0x9d, 0x9f, 0xad, 0xee, 0x5a, 0xbe, 0x46, 0x14, 0x40, 0xa1, 0xca, 0x91, 0xd1, 0x75, 0xc0, 0xc4, 0x8d, 0xcc, 0x66, 0x9c, 0xb8, 0xc9, 0x85, 0xbc, 0x62, 0x9a, 0x52, 0x5e, 0x5f, 0xa8, 0x68, 0x77, 0xdb, 0xb3, 0x97, 0x2d, 0x38, 0xe0, 0x87, 0x42, 0x33, 0xf6, 0x78, 0x2b, 0xb1, 0x2b, 0x89, 0x6f, 0x67, 0x47, 0xc9, 0x86, 0x0, 0xc2, 0xa9, 0xc0, 0x1a, 0xfb, 0xb, 0x92, 0xb2, 0x41, 0x20, 0x33, 0xec, 0xf6, 0x92, 0x42, 0x54, 0x9d, 0x98, 0xc9, 0x37, 0xb9, 0xb, 0xa3, 0x9e, 0x87, 0xd5, 0xc6, 0xeb, 0x41, 0xf9, 0x39, 0x87, 0xb1, 0xdb, 0xdf, 0xfc, 0x50, 0xa4, 0x76, 0x90, 0xa8, 0x29, 0x9c, 0xc3, 0x93, 0xb7, 0x5f, 0xb1, 0x11, 0xa8, 0x87, 0xfd, 0x3b, 0xa0, 0xb0, 0xd3, 0x28, 0xf1, 0x12, 0x49, 0x9e, 0x24, 0xb0, 0xde, 0x3e, 0xed, 0x5a, 0x13, 0x3a, 0x7b, 0x10, 0x32, 0xd9, 0x34, 0x20, 0x56, 0x99, 0xe1, 0x98, 0x1c, 0xd7, 0xc7, 0xd, 0x71, 0xc7, 0xce, 0xd8, 0xb2, 0xe0, 0x31, 0xb2, 0x13, 0x37, 0x56, 0xe7, 0x2, 0x8c, 0x96, 0xac, 0x85, 0xd2, 0x84, 0x62, 0xb6, 0xd, 0x43, 0xee, 0x89, 0x60, 0x25, 0x31, 0x56, 0x6f, 0x83, 0xf6, 0xd8, 0x9b, 0xce, 0xae, 0x46, 0xa0, 0x85, 0xfb, 0x4b, 0xfc, 0x4c, 0x48, 0xb9, 0xb2, 0x99, 0x15, 0x2c, 0x3e, 0x1e, 0xee, 0xaf, 0x2e, 0x12, 0x3d, 0x90, 0x38, 0x3c, 0x7e, 0x6c, 0x55, 0x70, 0xc7, 0xe0, 0xc, 0x94, 0xaa, 0xe8, 0xfa, 0x8, 0x1b, 0x63, 0xd6, 0x2, 0x48, 0xba, 0xf8, 0x69, 0x7f, 0x80, 0x85, 0x8a, 0xb0, 0xae, 0x1e, 0x41, 0x5, 0x4, 0xa, 0xed, 0x70, 0x66, 0x4c, 0x49, 0x16, 0x8f, 0xb0, 0xde, 0x60, 0xbb, 0x97, 0x37, 0x13, 0xc6, 0xf, 0xf2, 0x8c, 0x10, 0xc3, 0x6b, 0xc, 0xf5, 0xf4, 0x30, 0x3e, 0xc7, 0x46, 0x9c, 0x74, 0x29, 0x7c, 0x67, 0x1a, 0x1c, 0x98, 0x1e, 0xf1, 0xf4, 0x93, 0x1d, 0xfe, 0x8b, 0x68, 0x3e, 0x2e, 0xd8, 0x3, 0x73, 0x93, 0x85, 0x9e, 0xaa, 0xa6, 0xa7, 0xf5, 0xae, 0x1, 0x20, 0xb9, 0x59, 0xb9, 0x95, 0xf4, 0x2, 0x49, 0x85, 0xd8, 0xa2, 0xfc, 0xbd, 0xfd, 0xb0, 0x13, 0xfa, 0xf0, 0xa2, 0xb6, 0xe7, 0xd9, 0xcb, 0x41, 0x87, 0xb, 0x43, 0x56, 0x10, 0xf1, 0xbd, 0xf9, 0xb9, 0x19, 0x4d, 0x95, 0x23, 0xa2, 0x5, 0xd7, 0xde, 0x4f, 0x2a, 0x97, 0x5c, 0xfc, 0xd0, 0x74, 0xea, 0x77, 0x29, 0x91, 0xd6, 0xfe, 0xcb, 0xcb, 0xaf, 0xa5, 0x59, 0xcc, 0xfd, 0x11, 0x6, 0x87, 0x57, 0x2f, 0x30, 0xbb, 0xab, 0x19, 0x72, 0xba, 0x30, 0x27, 0xb3, 0xfa, 0x59, 0x0, 0xce, 0x28, 0x22, 0x43, 0xf5, 0xa8, 0xa0, 0xdc, 0x26, 0xfd, 0xcf, 0xbd, 0x6b, 0xb2, 0x6b, 0xd, 0xa9, 0x69, 0x8b, 0x63, 0x49, 0x89, 0xbc, 0xd3, 0x5d, 0xe9, 0x2d, 0x6a, 0x2b, 0x92, 0xf1, 0xa4, 0xe1, 0x76, 0xfd, 0x2c, 0x87, 0xd5, 0xb1, 0x3c, 0xf7, 0x99, 0xce, 0xa3, 0x32, 0xdb, 0x9a, 0x14, 0x2b, 0x75, 0x6a, 0x23, 0x89, 0x40, 0xd0, 0x9b, 0xf1, 0xf4, 0xb, 0xe, 0x3d, 0x31, 0x12, 0x6c, 0x20, 0x3b, 0xb2, 0xae, 0xfe, 0x3, 0xf3, 0xd, 0xe7, 0x73, 0xe0, 0xef, 0xd1, 0x9b, 0xeb, 0xa0, 0xdb, 0x9, 0x5, 0x53, 0x4e, 0xfc, 0x32, 0xd5, 0x7f, 0x4c, 0x7a, 0x78, 0x3d, 0xe9, 0xed, 0xff, 0x92, 0xd7, 0x10, 0x50, 0x24, 0xe4, 0xe2, 0xc4, 0x2d, 0xc7, 0xbd, 0xbb, 0x66, 0x4, 0x7d, 0xd4, 0xe0, 0xe7, 0x43, 0x5c, 0x6c, 0x56, 0x51, 0xcb, 0x85, 0x6e, 0x46, 0xf0, 0x97, 0x35, 0x19, 0xc9, 0xf9, 0xcf, 0x4a, 0xd9, 0x94, 0x49, 0xc, 0xe9, 0x54, 0x93, 0x7d, 0x92, 0x47, 0x21, 0x32, 0x93, 0xa3, 0xe0, 0x2b, 0xeb, 0xc1, 0xd, 0xc1, 0xfa, 0x27, 0x84, 0xfa, 0x19, 0xf3, 0x2f, 0xc2, 0xd8, 0xcf, 0x88, 0x74, 0x52, 0x96, 0x1, 0x84, 0xe6, 0xd4, 0xe2, 0x46, 0xa7, 0xaa, 0x67, 0x7d, 0x6, 0x2e, 0xfa, 0x11, 0x9f, 0x5f, 0x3e, 0x7f, 0x2a, 0xd9, 0xb6, 0x8e, 0x3b, 0xcb, 0xd6, 0x3a, 0x15, 0xfe, 0x9a, 0xbd, 0x0, 0xf8, 0xdd, 0xd7, 0x6d, 0x1a, 0x4d, 0x19, 0x7e, 0xf1, 0xca, 0xc0, 0x3c, 0xc1, 0xf6, 0xee, 0xc3, 0x5f, 0x32, 0x8e, 0xc5, 0xf6, 0x15, 0xb2, 0xc3, 0x1d, 0xa3, 0x0, 0x54, 0x9, 0x71, 0xe7, 0xd3, 0xa3, 0xaf, 0x7, 0x7c, 0x8e, 0x16, 0x2d, 0xae, 0xc7, 0x94, 0xa1, 0x17, 0x84, 0x3f, 0xc3, 0x40, 0x95, 0x31, 0x9b, 0x58, 0x42, 0x28, 0xf8, 0xd6, 0x83, 0xa2, 0x59, 0xf, 0x49, 0x18, 0xcb, 0x9f, 0xae, 0xda, 0x84, 0x1f, 0x73, 0xa2, 0xa0, 0x3b, 0x68, 0xc3, 0x60, 0xd9, 0xb6, 0x3d, 0x69, 0x10, 0x61, 0x14, 0xbb, 0x63, 0x5c, 0xc8, 0x5, 0xbf, 0x88, 0x7, 0xaf, 0x36, 0x94, 0xb1, 0xd2, 0x60, 0x74, 0x34, 0xdf, 0x59, 0x54, 0x90, 0xb1, 0x7d, 0x1a, 0xe1, 0x94, 0xe0, 0xf6, 0x73, 0x38, 0x9c, 0x1b, 0xc3, 0x91, 0xbb, 0x85, 0x7b, 0xb5, 0x57, 0xef, 0x48, 0xb, 0xa9, 0x5a, 0xc, 0x6f, 0xab, 0x3b, 0xaf, 0x69, 0xb1, 0xde, 0xde, 0x85, 0x36, 0x37, 0x2d, 0x73, 0xad, 0x10, 0xe6, 0x15, 0x8e, 0xba, 0x2, 0xdf, 0x70, 0x38, 0xf1, 0x71, 0xf7, 0xa7, 0x8c, 0xb6, 0xed, 0x37, 0x3, 0x6c, 0x3, 0x2c, 0xb6, 0x47, 0xf7, 0xac, 0xe4, 0x81, 0x4e, 0xb9, 0xb6, 0x76, 0xd5, 0x21, 0xd9, 0xcb, 0x76, 0x3c, 0xee, 0xc8, 0xa3, 0x6, 0xf3, 0x6e, 0x1f, 0x2a, 0xd3, 0x23, 0x16, 0xf1, 0x3c, 0x56, 0xe9, 0x63, 0x68, 0x64, 0xab, 0xd5, 0xe6, 0x26, 0x5c, 0x0, 0x5c, 0xbe, 0x4c, 0x8a, 0x3b, 0x27, 0xbb, 0xe6, 0x9c, 0xa5, 0x29, 0xd5, 0xdc, 0x6f, 0xb1, 0xd4, 0x4, 0x52, 0xaa, 0xaf, 0xc4, 0x8d, 0x79, 0x23, 0x79, 0x26, 0x4a, 0x62, 0xb0, 0xab, 0x7f, 0x30, 0x6b, 0xf6, 0x6d, 0xe5, 0x85, 0x14, 0xd6, 0x9d, 0x85, 0x34, 0x53, 0x3e, 0x3a, 0xee, 0xc8, 0xd0, 0x18, 0x5b, 0x5b, 0x47, 0x9c, 0xd5, 0x51, 0xcd, 0x7, 0x1f, 0xd, 0x8, 0x63, 0x26, 0x43, 0x8b, 0xb8, 0xa6, 0xd0, 0xc0, 0xc9, 0x6f, 0x29, 0x34, 0xc2, 0x91, 0x86, 0xc9, 0x1a, 0xb6, 0x7f, 0x88, 0x94, 0xa4, 0x83, 0xa, 0x2a, 0xf2, 0x9c, 0xea, 0xc, 0x27, 0x14, 0x51, 0x56, 0xf5, 0x2, 0x48, 0xa2, 0xe8, 0xa6, 0x30, 0x52, 0xaf, 0x13, 0xe9, 0xbc, 0x3d, 0xc7, 0xf, 0xad, 0xcb, 0x7, 0x8a, 0x45, 0x7b, 0x58, 0x9e, 0x90, 0x8a, 0xc, 0xf0, 0xd4, 0x84, 0xda, 0x0, 0x13, 0xac, 0x66, 0x44, 0xb5, 0x48, 0xd0, 0x5c, 0x42, 0xbf, 0xd8, 0xe9, 0x90, 0xbe, 0xb9, 0x9c, 0xb5, 0xe, 0x1b, 0x43, 0x3e, 0xdb, 0x16, 0x16, 0x99, 0xff, 0xec, 0x1a, 0x53, 0x7a, 0x11, 0xaa, 0xd3, 0x3b, 0xdc, 0xf4, 0x59, 0xd3, 0x92, 0xaf, 0x91, 0x36, 0x5c, 0x44, 0x20, 0x7, 0xe2, 0x3e, 0x7a, 0x74, 0x71, 0x87, 0x59, 0x82, 0xac, 0xd1, 0x71, 0xe9, 0x73, 0x9f, 0x94, 0xf7, 0x39, 0xc5, 0xf, 0x81, 0x30, 0x2e, 0x98, 0xd7, 0xf3, 0x5c, 0xd0, 0x29, 0x71, 0x1c, 0x7b, 0xb, 0xe2, 0x58, 0x87, 0xf2, 0x61, 0x9e, 0x56, 0x20, 0xcc, 0xad, 0xff, 0x2d, 0x4c, 0x54, 0x59, 0x2f, 0x3a, 0x5d, 0xb0, 0x53, 0x5e, 0xff, 0x9f, 0xc1, 0xf5, 0x16, 0xbe, 0x63, 0xa4, 0x4c, 0x4e, 0xef, 0xf, 0x33, 0xb2, 0x63, 0xcc, 0x66, 0x35, 0x87, 0x72, 0xef, 0xbc, 0x0, 0x9, 0x78, 0xcf, 0xca, 0xd2, 0x61, 0xd1, 0x7d, 0x82, 0x54, 0x5b, 0x39, 0xc5, 0x5d, 0x13, 0xc6, 0x1b, 0xbf, 0x27, 0x2e, 0x5, 0x8f, 0x63, 0x6c, 0xa0, 0xdf, 0x7, 0xf0, 0x24, 0xa2, 0x10, 0xda, 0x21, 0x33, 0x6d, 0x6d, 0x58, 0x73, 0xe9, 0x8f, 0x2c, 0x15, 0x26, 0x38, 0x57, 0xc, 0x8b, 0x98, 0x60, 0x55, 0xb9, 0x8b, 0x17, 0x43, 0x70, 0x86, 0x38, 0x1c, 0x80, 0xdf, 0xa1, 0x90, 0x40, 0x12, 0xb9, 0x67, 0x9b, 0xff, 0x0, 0x98, 0x75, 0xc8, 0x20, 0x26, 0x23, 0x4, 0x3, 0x5c, 0x3e, 0xca, 0xee, 0xdc, 0x70, 0x4b, 0x3c, 0x9d, 0x4b, 0x8e, 0x64, 0x1f, 0x18, 0x15, 0x3c, 0x2d, 0xbb, 0x5c, 0x34, 0x33, 0x6e, 0x37, 0xd8, 0x81, 0xf9, 0x7a, 0x29, 0xf2, 0xc, 0x9b, 0x28, 0x26, 0xb6, 0xf, 0x5e, 0xbe, 0x32, 0xbd, 0x4c, 0xc7, 0x9d, 0x75, 0x13, 0xa0, 0x17, 0xb7, 0xbc, 0x75, 0x74, 0xb1, 0x72, 0xd8, 0x50, 0xc9, 0x77, 0x84, 0x43, 0x3d, 0xd6, 0xe1, 0xff, 0x79, 0x78, 0xc6, 0xce, 0x70, 0x8c, 0x57, 0xd8, 0x14, 0x60, 0x0, 0x9b, 0x8b, 0x6b, 0xbb, 0x78, 0xa8, 0x99, 0xad, 0xc9, 0x6, 0x38, 0xfb, 0x11, 0x8e, 0x0, 0x99, 0x67, 0xb3, 0xca, 0x44, 0xcd, 0x35, 0x14, 0xe8, 0xcf, 0xe4, 0xd2, 0xf2, 0x9e, 0xc1, 0xfe, 0x3f, 0x11, 0x7f, 0xea, 0xa0, 0xd5, 0x7e, 0x76, 0xf6, 0x1b, 0xa, 0x4c, 0x71, 0x3, 0x5e, 0xf7, 0xff, 0x57, 0xee, 0xe9, 0x23, 0xa, 0x2e, 0x42, 0x3c, 0xa2, 0xaf, 0x83, 0xf, 0x54, 0x2d, 0x6b, 0x5f, 0xdd, 0xa7, 0x46, 0xea, 0x55, 0x7e, 0xc2, 0xc2, 0xc2, 0x8, 0x12, 0x2a, 0x67, 0x46, 0x42, 0x6b, 0xeb, 0x7a, 0x4f, 0x63, 0xae, 0xf7, 0x99, 0x35, 0xd1, 0xf7, 0xaa, 0x84, 0x98, 0x95, 0x95, 0x68, 0x89, 0xa6, 0x48, 0xb3, 0x7, 0xe3, 0x9b, 0x95, 0xb1, 0x87, 0x7c, 0x14, 0x3c, 0x57, 0xe, 0x25, 0x96, 0xf8, 0x61, 0xc, 0xdd, 0x3a, 0xfb, 0xe, 0xae, 0x5e, 0x32, 0x8c, 0xca, 0x5e, 0x74, 0x0, 0xed, 0x70, 0x3f, 0xff, 0xec, 0x96, 0x16, 0x91, 0x3c, 0x1d, 0xd4, 0x9a, 0x31, 0x65, 0xbc, 0xac, 0x73, 0xef, 0xc7, 0xb1, 0xf0, 0x20, 0xa0, 0x1, 0x7b, 0x6e, 0x4, 0x79, 0x9d, 0xd, 0x79, 0x89, 0xaf, 0x76, 0x9, 0xee, 0x6c, 0x2d, 0xf, 0x65, 0x4d, 0xca, 0x1e, 0x7, 0x43, 0x9a, 0x5d, 0x93, 0xa3, 0xfe, 0xb, 0x3b, 0x28, 0xc9, 0xd2, 0xfc, 0x66, 0xf1, 0x5, 0x66, 0x69, 0xb5, 0x5e, 0x66, 0xe, 0x8d, 0xd3, 0x4c, 0xa5, 0x7, 0x5d, 0x7e, 0xe7, 0xcf, 0x50, 0xd9, 0x43, 0xa, 0x5, 0xee, 0x90, 0xb5, 0x69, 0x2e, 0xd3, 0xda, 0xeb, 0xdd, 0x86, 0xe8, 0x31, 0x86, 0x3a, 0x9b, 0xb8, 0xed, 0xd2, 0x46, 0x37, 0x21, 0x7a, 0xde, 0x55, 0xe8, 0x8d, 0x11, 0x5f, 0xc, 0xb0, 0xb7, 0x6c, 0x5, 0xb2, 0xe4, 0x85, 0x9b, 0x2c, 0xd0, 0xfb, 0xae, 0xde, 0x2d, 0x89, 0x50, 0xd1, 0x8d, 0x9a, 0xf3, 0x3, 0x85, 0x79, 0x8b, 0x21, 0x86, 0x46, 0xb8, 0x37, 0x1a, 0x5f, 0x37, 0xb7, 0xd8, 0x6d, 0x29, 0x36, 0x8e, 0x89, 0x8e, 0xb7, 0xb1, 0xd4, 0x2c, 0x47, 0x93, 0xbd, 0x8f, 0x30, 0x53, 0xae, 0x45, 0xeb, 0xda, 0x6f, 0xc3, 0x2, 0x2e, 0x5a, 0xcd, 0x46, 0x85, 0x83, 0xa4, 0xba, 0x90, 0x4e, 0x3d, 0x6a, 0x60, 0x99, 0xbe, 0x9d, 0x2e, 0xe6, 0x55, 0xdd, 0xe7, 0xed, 0x81, 0x2a, 0xa0, 0x6a, 0x40, 0xa1, 0xa7, 0x4e, 0x27, 0xf9, 0x14, 0xdd, 0x60, 0x68, 0x86, 0x4f, 0x41, 0x80, 0xc2, 0xb0, 0xdc, 0xcf, 0x27, 0x43, 0xf9, 0x22, 0x10, 0xb, 0x41, 0xff, 0x96, 0xd8, 0xa5, 0x23, 0x6b, 0xba, 0x10, 0x99, 0x4e, 0x36, 0xe4, 0x7f, 0x35, 0x9e, 0xe1, 0x1f, 0x77, 0xc6, 0x33, 0x9a, 0xc3, 0xa8, 0x1d, 0x6e, 0xd0, 0x9f, 0xfd, 0x29, 0x8b, 0x48, 0xb4, 0x15, 0xbf, 0x22, 0x1f, 0x1a, 0x54, 0x92, 0x43, 0x1f, 0xe8, 0x63, 0x81, 0xab, 0x70, 0x8a, 0xa, 0x92, 0x8e, 0x65, 0xe5, 0x7, 0x49, 0xb2, 0xd1, 0x3f, 0x9b, 0x83, 0xec, 0xb6, 0x9c, 0xf7, 0xc4, 0xf2, 0x84, 0x3f, 0x4a, 0xb4, 0xe3, 0x5d, 0xd5, 0x17, 0x90, 0xc6, 0xc6, 0x17, 0x44, 0xf3, 0xb2, 0xac, 0x90, 0x23, 0x23, 0x10, 0x68, 0x81, 0x8, 0x32, 0xf7, 0x3b, 0x73, 0x6c, 0x1f, 0xa6, 0xe8, 0xf2, 0x52, 0x76, 0x2d, 0x9c, 0xb6, 0xaa, 0x74, 0xa7, 0xbc, 0xc5, 0x95, 0xed, 0xe3, 0x7, 0x53, 0xfb, 0x10, 0xf1, 0x81, 0x49, 0xc2, 0x73, 0x5c, 0xa0, 0xc9, 0x58, 0x94, 0xa3, 0x1c, 0xe3, 0xaa, 0x1b, 0x8b, 0x2d, 0x5d, 0xc5, 0xbb, 0xb2, 0x1d, 0xce, 0x56, 0xca, 0xf6, 0xf4, 0xb7, 0x8b, 0xd5, 0x41, 0x14, 0x76, 0x87, 0x8f, 0x80, 0xb6, 0x50, 0x76, 0xed, 0x49, 0xc3, 0xf4, 0xba, 0x16, 0x5e, 0x90, 0xac, 0xac, 0x61, 0xf6, 0x40, 0x51, 0x41, 0xed, 0xaf, 0x70, 0x22, 0xcb, 0xf0, 0x84, 0x87, 0x3b, 0xba, 0x2c, 0x40, 0x8a, 0xac, 0x80, 0xc2, 0x3b, 0x1a, 0x92, 0x37, 0x9, 0x46, 0x71, 0x3f, 0xd5, 0x30, 0x17, 0x34, 0x78, 0x6c, 0xd8, 0x1e, 0x7f, 0x48, 0xe2, 0x25, 0xb5, 0xb8, 0xbe, 0xf5, 0x8e, 0x38, 0xbf, 0x4f, 0xb7, 0xfd, 0x89, 0xc4, 0xbb, 0x82, 0xb3, 0xa0, 0x91, 0xe, 0x2a, 0xa9, 0x38, 0xcf, 0x3c, 0x43, 0x22, 0x3f, 0xba, 0x77, 0x7a, 0xa9, 0x5, 0x9f, 0xa2, 0xd6, 0x62, 0x83, 0xde, 0xfc, 0x9a, 0x18, 0x61, 0xea, 0x30, 0x6a, 0x7f, 0x4f, 0x11, 0xef, 0x59, 0x5, 0x55, 0x3b, 0x69, 0xdc, 0x8, 0x4c, 0x22, 0xb5, 0x43, 0x21, 0x26, 0x91, 0xc, 0xb5, 0x81, 0xb4, 0x9, 0xbb, 0x2b, 0x4f, 0xc8, 0xa8, 0xac, 0x9, 0xd7, 0x6e, 0xc1, 0xa8, 0xc, 0x85, 0xb2, 0x9d, 0xd, 0x21, 0xa6, 0xd6, 0x54, 0xcb, 0x9, 0x7a, 0xf6, 0x8d, 0x6d, 0xa4, 0x19, 0x9, 0x50, 0xe0, 0xf6, 0xee, 0x91, 0x57, 0x28, 0x13, 0xf, 0x81, 0x13, 0xf6, 0x90, 0x8b, 0x2, 0xd5, 0xf8, 0x47, 0xde, 0xce, 0x9a, 0xb8, 0x6, 0xd8, 0xce, 0xa8, 0x2f, 0x1a, 0x7, 0x78, 0x14, 0x7f, 0x69, 0x34, 0x61, 0x2e, 0x22, 0xbf, 0xdb, 0xfc, 0xab, 0x5d, 0xfd, 0x16, 0xdc, 0xb8, 0x53, 0x1b, 0x12, 0xbf, 0x2e, 0x91, 0x44, 0x7c, 0xc2, 0x96, 0x24, 0x74, 0x36, 0x94, 0xac, 0xb0, 0x26, 0xfc, 0x1f, 0x6c, 0x17, 0xa3, 0x8e, 0x2c, 0xbf, 0xde, 0x13, 0xac, 0x24, 0xe2, 0xb6, 0x32, 0xa8, 0x72, 0xf3, 0x35, 0xc2, 0x4c, 0x52, 0x2f, 0x96, 0x67, 0x35, 0x7d, 0x36, 0x98, 0x7e, 0xfb, 0xbf, 0x88, 0x81, 0x1f, 0xd6, 0x9e, 0x37, 0xa1, 0x30, 0xf1, 0xfa, 0x48, 0xa3, 0xbb, 0x73, 0x34, 0xd7, 0x4e, 0x90, 0xe1, 0x75, 0x1f, 0x6c, 0xfc, 0x79, 0x4a, 0x3b, 0x42, 0x66, 0x95, 0x18, 0x93, 0x44, 0xef, 0x54, 0x3d, 0xc8, 0xb, 0xf2, 0xa1, 0xec, 0x11, 0x91, 0x5d, 0x42, 0x6d, 0x83, 0xcf, 0x8d, 0x9a, 0x0, 0x18, 0xc3, 0xb5, 0xe5, 0x34, 0xd5, 0x85, 0xda, 0xbd, 0xa5, 0x71, 0x27, 0xea, 0xe, 0x98, 0xff, 0x1f, 0x8c, 0xe7, 0x53, 0xe7, 0x85, 0x3, 0x90, 0x84, 0xcf, 0xf1, 0xad, 0x62, 0x7b, 0x38, 0xc9, 0xf6, 0x14, 0x3b, 0x7d, 0xd2, 0x2b, 0x8f, 0xcb, 0xb0, 0x74, 0xe, 0x17, 0x93, 0xa9, 0x7f, 0x82, 0x86, 0xb4, 0x50, 0x2d, 0xab, 0x2b, 0xf3, 0xf6, 0x9a, 0x8c, 0xbe, 0xcd, 0xb8, 0x3a, 0xb9, 0xc3, 0xb0, 0x6, 0xe9, 0x55, 0xa5, 0xa6, 0x16, 0x14, 0x69, 0xa0, 0xce, 0x84, 0x1c, 0x88, 0xef, 0x43, 0x79, 0xc, 0x86, 0x8f, 0x5d, 0x8a, 0x3, 0x38, 0x8a, 0x1f, 0x31, 0x41, 0x67, 0x20, 0x61, 0xfc, 0xc0, 0x2e, 0x8c, 0xe7, 0x81, 0x35, 0xd7, 0x5a, 0x81, 0x2e, 0x4d, 0x49, 0x97, 0x40, 0x60, 0x59, 0x0, 0x9e, 0xcc, 0xb4, 0xba, 0x2c, 0x61, 0xf3, 0xec, 0x8a, 0x55, 0xff, 0x9e, 0xc3, 0x36, 0x9e, 0x7a, 0xef, 0xbe, 0x35, 0xee, 0x6, 0xba, 0x36, 0xcc, 0xc0, 0x4e, 0x32, 0xc, 0xcc, 0xd2, 0x3d, 0x15, 0x31, 0xce, 0xfa, 0x1f, 0xe9, 0x33, 0xf3, 0xbe, 0xf3, 0x64, 0xb3, 0xb0, 0x32, 0xe8, 0x28, 0x73, 0xff, 0x8a, 0xef, 0x1b, 0x84, 0x5, 0x2d, 0x4, 0xad, 0x9b, 0x1e, 0xe2, 0x21, 0x6a, 0x35, 0xdf, 0xe3, 0xf0, 0x42, 0x7e, 0x62, 0xdd, 0x4a, 0xcb, 0xb, 0x27, 0xa3, 0x11, 0xe7, 0x22, 0xd3, 0x58, 0x81, 0x9a, 0xb0, 0x4, 0x6e, 0x92, 0x66, 0xcd, 0x8e, 0x3f, 0x32, 0xba, 0xc1, 0x10, 0x81, 0x8f, 0xe3, 0x1, 0x0, 0x7, 0x7f, 0x6a, 0xfc, 0x12, 0xac, 0xbc, 0x8d, 0x27, 0x8, 0xec, 0xc, 0x58, 0x1d, 0x5e, 0xd6, 0x2d, 0xca, 0x76, 0xbe, 0x41, 0x41, 0xcd, 0xd2, 0x3a, 0xf3, 0x92, 0xe8, 0x5c, 0xcf, 0x95, 0x78, 0xd2, 0x39, 0x71, 0x36, 0xd, 0x23, 0x6d, 0x95, 0xc1, 0xc4, 0x12, 0xd0, 0x3e, 0xbd, 0x1a, 0xa9, 0x26, 0xd4, 0x95, 0x62, 0x9d, 0x77, 0xff, 0x28, 0x7b, 0xad, 0xa3, 0x3f, 0xc7, 0x6a, 0x4f, 0xc, 0x4, 0x26, 0x8e, 0x8b, 0x54, 0xd0, 0x44, 0xec, 0xe1, 0x50, 0x0, 0x8b, 0x6d, 0xa6, 0x32, 0x9b, 0xe2, 0x6c, 0x47, 0xf0, 0x66, 0x33, 0x94, 0x1f, 0xb4, 0xc7, 0x2, 0xa6, 0x53, 0xd9, 0x54, 0x75, 0x9, 0x28, 0x4f, 0x52, 0xa6, 0xac, 0x35, 0xbe, 0xea, 0xdb, 0x4e, 0xfd, 0x29, 0x12, 0x88, 0xb6, 0x29, 0x36, 0x67, 0xde, 0x46, 0x14, 0xe2, 0x45, 0x21, 0x2d, 0x3c, 0x70, 0x1e, 0xaa, 0xf7, 0x57, 0xc7, 0x68, 0xc8, 0x98, 0x7f, 0x9b, 0xe9, 0xa0, 0x76, 0x16, 0x64, 0x8b, 0x6d, 0xf6, 0x42, 0x4e, 0x96, 0x78, 0x7, 0x91, 0xdc, 0x84, 0x28, 0x60, 0x5b, 0x88, 0xc9, 0xc2, 0xcf, 0x90, 0xd6, 0xa0, 0x87, 0x51, 0x9a, 0x3b, 0x33, 0xda, 0xb4, 0xfe, 0xee, 0x87, 0x3c, 0x15, 0x98, 0x95, 0x78, 0x5f, 0x90, 0x96, 0xf0, 0x15, 0xe7, 0xdc, 0x82, 0xb7, 0xc9, 0xf, 0xfc, 0x2d, 0x12, 0x9b, 0x8b, 0x50, 0xc6, 0x9f, 0xd8, 0x65, 0x4b, 0xab, 0x15, 0x90, 0xf, 0xbb, 0xd5, 0xd6, 0xb7, 0xda, 0x79, 0x5e, 0xa2, 0x5a, 0x77, 0x6c, 0xf0, 0x21, 0xf0, 0x64, 0xa1, 0xec, 0xc7, 0x37, 0xcc, 0xd8, 0x9, 0xdf, 0x6, 0xa5, 0x2f, 0xef, 0x67, 0x13, 0x76, 0x9a, 0xc6, 0xee, 0x81, 0x5b, 0x76, 0xa4, 0x4c, 0xed, 0x7c, 0x86, 0xb0, 0x67, 0x19, 0x71, 0x83, 0x3b, 0x20, 0x45, 0x36, 0x9d, 0x8, 0xd, 0x5e, 0x8d, 0xe3, 0xf0, 0x30, 0xd9, 0x1e, 0xcc, 0xdc, 0x52, 0xaf, 0xbb, 0x20, 0xbf, 0xc7, 0xce, 0xbb, 0xef, 0x10, 0xad, 0x63, 0x2, 0xab, 0xfc, 0xcf, 0x99, 0x8a, 0x8f, 0xd1, 0xfc, 0x6d, 0x9e, 0x19, 0xd8, 0x17, 0x6, 0xf1, 0xe9, 0x3f, 0x77, 0xe2, 0x64, 0x48, 0x48, 0x70, 0x8, 0xe1, 0xe8, 0x79, 0x0, 0x2b, 0x34, 0x2f, 0x5c, 0x4d, 0xce, 0x9c, 0xbb, 0xae, 0x7a, 0x2d, 0xb5, 0x7a, 0x90, 0x80, 0xbf, 0xd0, 0xbc, 0x61, 0x21, 0xcd, 0xd3, 0xf3, 0x97, 0x4d, 0x74, 0x62, 0x9, 0x34, 0x8, 0x5b, 0xb2, 0xda, 0x1d, 0x3a, 0x6c, 0xa5, 0x8e, 0xb1, 0xc5, 0x17, 0x23, 0xc9, 0x6, 0xeb, 0xc7, 0x4e, 0xfe, 0xfe, 0x4a, 0x1c, 0xad, 0x90, 0xb8, 0x87, 0xb7, 0x1a, 0x80, 0xde, 0xe, 0x92, 0x9a, 0xcd, 0xdc, 0xe8, 0x7e, 0x49, 0x76, 0x9c, 0x61, 0x5c, 0x8b, 0xe, 0x37, 0x17, 0xc7, 0xc6, 0xa, 0x2b, 0x5d, 0xe1, 0x68, 0xcf, 0x4f, 0xb6, 0x4c, 0x20, 0x98, 0x92, 0x67, 0xbc, 0x62, 0x11, 0xc2, 0xde, 0xb, 0x11, 0x10, 0x3b, 0xa6, 0xef, 0xcc, 0x73, 0x69, 0xc5, 0x1a, 0xde, 0xe0, 0x97, 0xfa, 0xe3, 0xf9, 0x8b, 0xc, 0xe, 0x3d, 0x3e, 0x69, 0xfb, 0x5e, 0xb4, 0xfc, 0xd4, 0xd2, 0xe9, 0x48, 0x72, 0x3, 0x9e, 0x4f, 0xc3, 0x1e, 0xc9, 0x2d, 0x80, 0x80, 0x3, 0x6, 0x81, 0x33, 0x35, 0x2d, 0x77, 0xd8, 0xf3, 0xb4, 0xc, 0x53, 0x6c, 0xd6, 0x6, 0x3f, 0x29, 0xc1, 0x75, 0xc4, 0xd, 0xed, 0xe5, 0x7b, 0x10, 0x2b, 0xe8, 0x31, 0x19, 0x3c, 0x9e, 0xcb, 0x4c, 0x6b, 0xff, 0xc9, 0x57, 0x28, 0x3d, 0xc6, 0x5e, 0xb4, 0xa1, 0x92, 0xc6, 0x18, 0x21, 0xb9, 0xca, 0xbb, 0x85, 0x72, 0x14, 0x44, 0xec, 0xa, 0xef, 0xa3, 0x29, 0x1e, 0xe7, 0x9a, 0x18, 0xfc, 0x2e, 0x30, 0x93, 0x4c, 0xf0, 0x6, 0xe9, 0xcb, 0xe, 0xe1, 0xaa, 0xce, 0x14, 0x79, 0x10, 0xd0, 0xf8, 0x19, 0x8e, 0xb6, 0x34, 0x3f, 0xa2, 0xb7, 0x9d, 0x11, 0xd2, 0xef, 0xc2, 0x75, 0xd8, 0xe9, 0xc8, 0xc9, 0xad, 0xfc, 0x6e, 0x8c, 0x19, 0x3, 0x13, 0x71, 0xa1, 0x4d, 0xf6, 0x1b, 0x59, 0x65, 0x38, 0x30, 0x44, 0x3d, 0xf8, 0xbb, 0xf0, 0x3c, 0x59, 0x47, 0x72, 0x2b, 0xb7, 0x5b, 0x48, 0xae, 0x3a, 0xc6, 0xd4, 0xb2, 0xe1, 0x53, 0x53, 0x94, 0x2c, 0x6f, 0x7d, 0xde, 0x7, 0x9d, 0x15, 0x82, 0x9, 0xb1, 0xc5, 0x4e, 0xf3, 0xae, 0x9c, 0x38, 0x14, 0xef, 0x65, 0xdb, 0x53, 0xbb, 0x8e, 0x4a, 0x43, 0xde, 0x99, 0xdd, 0x7e, 0xcb, 0xc2, 0x2d, 0x5f, 0x40, 0xf2, 0x83, 0xed, 0xa3, 0x6f, 0x81, 0xa3, 0x8, 0x42, 0xc1, 0xb9, 0x9b, 0x42, 0x73, 0x27, 0x6e, 0x1e, 0xb0, 0x90, 0xd5, 0x18, 0xb6, 0xdc, 0xb2, 0x80, 0xe1, 0xcd, 0x2c, 0x7e, 0x4, 0xa9, 0xa4, 0xae, 0x4, 0xb5, 0x99, 0xb2, 0xd1, 0xa4, 0x3, 0xa4, 0x9f, 0x1e, 0x9e, 0x2c, 0x41, 0x52, 0x75, 0x40, 0x79, 0x36, 0x8a, 0xd2, 0x88, 0xe3, 0xb8, 0x32, 0xf3, 0x36, 0x1, 0xc5, 0x49, 0x19, 0xde, 0x68, 0xe6, 0xcc, 0x6f, 0x1b, 0x3a, 0x97, 0x2b, 0x12, 0x75, 0xbc, 0x51, 0x88, 0x17, 0x4c, 0xfa, 0x85, 0xfb, 0x52, 0x37, 0xe1, 0xb1, 0xe9, 0x8c, 0x3c, 0x38, 0xce, 0x57, 0x12, 0xd6, 0xae, 0x4d, 0xf7, 0xd2, 0x70, 0xa6, 0x3d, 0xd4, 0xbb, 0x6b, 0x84, 0xbf, 0x3f, 0xa2, 0x5a, 0xa3, 0x83, 0xfc, 0x21, 0x44, 0x5d, 0x23, 0x74, 0x5e, 0x3b, 0x47, 0x63, 0xc3, 0xe0, 0x8e, 0xdf, 0xf6, 0x58, 0xa1, 0x4a, 0x3c, 0x2a, 0xf5, 0xd7, 0x34, 0x2e, 0xd2, 0xc6, 0x9b, 0xab, 0x5a, 0xd0, 0x50, 0xf4, 0x85, 0x47, 0xa6, 0x35, 0xe7, 0x56, 0x8c, 0x7, 0xcd, 0x29, 0x5f, 0x7b, 0x63, 0x56, 0xbc, 0x67, 0x50, 0xe3, 0x3e, 0x80, 0xbb, 0xb2, 0x53, 0x70, 0x92, 0x91, 0xdc, 0xf, 0x5a, 0x23, 0x50, 0x65, 0xaa, 0xc4, 0xf2, 0xd8, 0xb6, 0x1a, 0x19, 0x3b, 0x2, 0x96, 0x83, 0x31, 0x58, 0x47, 0xc3, 0xba, 0x5, 0xf8, 0xf0, 0xa5, 0xb, 0x40, 0x80, 0xf, 0xf8, 0xc0, 0x5e, 0x5b, 0x6, 0x81, 0x88, 0x83, 0x5e, 0x1b, 0xcc, 0x22, 0xe5, 0x70, 0xc3, 0xfb, 0x8b, 0xb, 0x86, 0xd1, 0x4a, 0x2d, 0xde, 0xdf, 0x56, 0xb2, 0x67, 0xf0, 0x4d, 0x36, 0xad, 0x97, 0x89, 0x13, 0xe0, 0x2e, 0x50, 0x12, 0x8f, 0xa, 0x92, 0x83, 0x77, 0xdc, 0xa0, 0x3f, 0x50, 0x6a, 0x86, 0xbc, 0xc0, 0xad, 0x14, 0x0, 0xe8, 0xa6, 0x4b, 0x6, 0xd3, 0x44, 0xb7, 0x89, 0x3f, 0xa5, 0xdb, 0xa5, 0xcb, 0xcd, 0x1d, 0x51, 0x3, 0xa2, 0xb1, 0xa7, 0x95, 0x6d, 0xd4, 0x7d, 0x19, 0xfb, 0x41, 0x63, 0x3c, 0xd6, 0x7a, 0x4e, 0x9c, 0xce, 0x2e, 0x4c, 0x48, 0x29, 0xca, 0x6e, 0x42, 0x8a, 0x4f, 0x7f, 0xde, 0x89, 0xe4, 0x11, 0x92, 0xf4, 0xf1, 0x8e, 0xc7, 0x6e, 0x7f, 0x99, 0x14, 0x86, 0x45, 0x57, 0x6, 0x10, 0x9, 0x2c, 0x2b, 0xe8, 0xed, 0x3e, 0x1c, 0x6e, 0x6a, 0x28, 0x17, 0x18, 0xe0, 0x60, 0xf, 0x47, 0x2e, 0xf9, 0x25, 0x36, 0xa, 0x89, 0x31, 0x46, 0x56, 0x5c, 0x80, 0x5b, 0xea, 0xfe, 0x57, 0x0, 0xf6, 0x3e, 0x70, 0x30, 0x30, 0x3c, 0xaf, 0x7c, 0x74, 0x9f, 0x38, 0x39, 0x37, 0xdd, 0x54, 0xeb, 0xda, 0xe5, 0xe0, 0x55, 0xf1, 0xc9, 0xc9, 0xc3, 0xa4, 0x24, 0xfe, 0x62, 0x39, 0x39, 0xb5, 0x76, 0xf1, 0x4b, 0x7e, 0x29, 0xbf, 0x20, 0xaf, 0xe2, 0x3d, 0x18, 0x37, 0x3b, 0x8c, 0x5a, 0xf9, 0xb5, 0xd7, 0x1b, 0x4a, 0x3d, 0x1d, 0x19, 0x46, 0x99, 0x96, 0x3b, 0xa8, 0x57, 0xf2, 0x87, 0x7b, 0xdd, 0xc8, 0x1f, 0x28, 0x88, 0x75, 0x10, 0x54, 0x13, 0x2c, 0x8e, 0xb1, 0xe8, 0xaf, 0x2b, 0x9b, 0xf7, 0xde, 0x72, 0x63, 0xca, 0x72, 0x89, 0xd, 0x48, 0xbb, 0xf4, 0xda, 0x3f, 0x7a, 0x16, 0x56, 0xb7, 0xd4, 0x2d, 0x3f, 0xf4, 0xc, 0x31, 0x84, 0x2d, 0xe3, 0xac, 0x1e, 0xaa, 0x0, 0x27, 0xe4, 0xaf, 0xef, 0xbc, 0xe3, 0x3d, 0xe7, 0x85, 0xd7, 0x1e, 0x69, 0xe5, 0x5f, 0x67, 0x4, 0xa6, 0x2e, 0xb6, 0x5a, 0xdb, 0xa5, 0x4a, 0x51, 0xc6, 0xdf, 0x41, 0x3d, 0xe2, 0x2, 0x65, 0x36, 0x3c, 0xe0, 0x8e, 0x4, 0xe8, 0x35, 0xf8, 0xa0, 0xda, 0x1a, 0x8f, 0x11, 0x8b, 0x3f, 0x5a, 0x1a, 0xce, 0x84, 0x45, 0x3b, 0xec, 0x28, 0xb8, 0x46, 0x66, 0x2c, 0x6e, 0xcc, 0xca, 0xe8, 0xf, 0xe4, 0xd0, 0xdb, 0x85, 0xd1, 0x43, 0x13, 0x8c, 0x35, 0xaa, 0xca, 0x44, 0xf8, 0xd7, 0xe5, 0x2a, 0x18, 0x24, 0x99, 0xe4, 0xb7, 0x1d, 0x1a, 0x9a, 0x5d, 0x87, 0x9c, 0x2d, 0xd4, 0x4c, 0xd6, 0xc8, 0xee, 0x2e, 0x4, 0x5f, 0x51, 0x7b, 0xb3, 0xbe, 0x5f, 0x16, 0x7b, 0x9, 0xd4, 0x4d, 0x4d, 0xf3, 0xef, 0x6, 0xe2, 0xd9, 0x2e, 0x32, 0xfc, 0x7e, 0xe1, 0xb7, 0x59, 0x2, 0x41, 0xee, 0x7d, 0x0, 0xca, 0x36, 0x82, 0xc0, 0x81, 0xa4, 0x55, 0x75, 0xc9, 0x3f, 0xc2, 0x12, 0x53, 0x88, 0x8c, 0x7b, 0x29, 0xd6, 0x5, 0x6, 0x58, 0x71, 0x15, 0x39, 0xdd, 0x8e, 0xf7, 0x8e, 0x86, 0x78, 0xa0, 0x52, 0x5e, 0xc4, 0x3, 0xe0, 0x31, 0x6b, 0x95, 0xa6, 0x33, 0x7b, 0xff, 0xd5, 0x75, 0x2, 0x47, 0x3f, 0x67, 0x7e, 0xc, 0x3a, 0xdc, 0xd5, 0xc8, 0x98, 0x25, 0x2f, 0x7e, 0xb4, 0x27, 0x92, 0x41, 0x75, 0xa9, 0x14, 0x4c, 0x34, 0xb6, 0x37, 0x8b, 0x8c, 0x88, 0x11, 0x8b, 0xd6, 0x7e, 0x66, 0xd0, 0xdc, 0x25, 0x3e, 0x80, 0x3e, 0x8c, 0xe, 0x5e, 0x4a, 0xa2, 0x87, 0xb9, 0xdc, 0xd0, 0xe5, 0x34, 0x23, 0x3, 0x92, 0xae, 0x3b, 0xac, 0x40, 0x9f, 0x3a, 0xf6, 0xe0, 0x34, 0x95, 0xde, 0x63, 0x54, 0xf9, 0x28, 0x63, 0x6b, 0x92, 0xbf, 0x28, 0xa1, 0xb7, 0xf1, 0x64, 0xda, 0x7c, 0xcd, 0x1c, 0x49, 0x35, 0xde, 0x7b, 0xc4, 0x27, 0xec, 0xf1, 0x7e, 0x37, 0x27, 0x6a, 0xa3, 0xf, 0x24, 0x57, 0xa8, 0xc1, 0x1b, 0x62, 0x63, 0x66, 0x13, 0xdc, 0x35, 0x97, 0x68, 0xfb, 0xd4, 0x53, 0x64, 0x3a, 0x7a, 0x9d, 0x31, 0x29, 0xc9, 0x39, 0xa4, 0xf1, 0x80, 0xa0, 0xb, 0xcb, 0xf8, 0x4b, 0x27, 0x18, 0xfc, 0xeb, 0xc5, 0x78, 0x80, 0x66, 0x37, 0xb5, 0xb0, 0xef, 0xd0, 0x1, 0x1e, 0x24, 0x49, 0xd, 0xfb, 0x9c, 0xb0, 0x2a, 0x37, 0x7d, 0xc6, 0xd7, 0x50, 0x68, 0xc9, 0xea, 0x3a, 0xaf, 0x70, 0xe3, 0xb4, 0x66, 0x32, 0xb6, 0xc4, 0xe9, 0xfe, 0xf7, 0xe4, 0x64, 0x56, 0xac, 0xe3, 0xc2, 0xd4, 0xac, 0xb4, 0xbf, 0x8c, 0xb3, 0xce, 0xd2, 0xb, 0x91, 0xf8, 0x6e, 0x72, 0xc0, 0xc9, 0xc, 0xe5, 0x3a, 0x1c, 0xbf, 0x40, 0x7b, 0xd9, 0x69, 0x95, 0x30, 0x15, 0x1b, 0x5a, 0x5a, 0xfd, 0x7f, 0x4b, 0x88, 0x70, 0xcd, 0x14, 0x83, 0xef, 0x6a, 0x89, 0x90, 0x38, 0x93, 0x8c, 0x61, 0xa5, 0x5c, 0x51, 0xe1, 0x58, 0xd1, 0x42, 0xd9, 0x77, 0x2b, 0x43, 0x65, 0xe6, 0xa8, 0x67, 0xf7, 0xb6, 0xbf, 0x81, 0x21, 0xb3, 0x10, 0x41, 0x60, 0x3a, 0xe8, 0x94, 0x37, 0x75, 0xcc, 0xdb, 0xc0, 0xe8, 0x7c, 0xeb, 0xaf, 0x9, 0xa3, 0x73, 0x86, 0x59, 0x13, 0x26, 0xe0, 0x31, 0x0, 0xdb, 0x46, 0x7d, 0x57, 0xe5, 0x98, 0x5d, 0x28, 0x5b, 0x98, 0x9d, 0x8c, 0xfb, 0x21, 0xfc, 0xb, 0x3e, 0x84, 0xb0, 0x16, 0x1, 0x4, 0xc9, 0x31, 0x45, 0xb0, 0x69, 0xa8, 0xb3, 0xb1, 0x53, 0x30, 0xd8, 0xd7, 0x85, 0xf0, 0x49, 0x16, 0xdd, 0xe8, 0x27, 0x74, 0xcb, 0x87, 0xcc, 0x3b, 0xbb, 0x83, 0xce, 0x3d, 0xc9, 0x0, 0x11, 0x26, 0x77, 0x2a, 0x2a, 0x92, 0xa1, 0x61, 0xda, 0x79, 0x7e, 0xe8, 0x9c, 0x14, 0xf3, 0x2, 0x2b, 0x7a, 0x58, 0x83, 0xec, 0x92, 0xde, 0x84, 0x13, 0x7e, 0x14, 0x30, 0x7f, 0x7, 0xaf, 0xd3, 0x83, 0x4c, 0x48, 0x3a, 0xb5, 0x58, 0x6, 0x44, 0xf8, 0x78, 0xea, 0x53, 0xec, 0x7a, 0x2, 0xc2, 0x76, 0x20, 0x91, 0x7d, 0x17, 0xc8, 0x93, 0xe3, 0x14, 0x47, 0xf3, 0x84, 0x6c, 0x37, 0xc2, 0x15, 0x5d, 0xef, 0x37, 0x83, 0xa7, 0x1a, 0x3d, 0x59, 0xb6, 0x15, 0x83, 0x90, 0x2a, 0x85, 0xef, 0x84, 0xc4, 0x75, 0x3a, 0xd4, 0x6b, 0x8, 0x16, 0x8a, 0xc5, 0xa0, 0xb, 0x48, 0x6d, 0x9a, 0x52, 0x7a, 0x8d, 0x68, 0x29, 0x3, 0x92, 0xf1, 0xc2, 0xd, 0x25, 0x7f, 0x9c, 0xf9, 0x2d, 0x2e, 0x68, 0xfb, 0x42, 0x30, 0x12, 0xbc, 0x21, 0x81, 0xad, 0xe7, 0x87, 0x75, 0x2b, 0x65, 0x2a, 0x18, 0xe0, 0x33, 0x2, 0xfc, 0x30, 0x8a, 0x12, 0xe1, 0xe3, 0x87, 0xcf, 0x2e, 0xb8, 0x8f, 0x9, 0xfb, 0x93, 0x61, 0x28, 0x68, 0x71, 0xa7, 0xe6, 0xe9, 0x85, 0xae, 0x21, 0x3e, 0x4, 0xea, 0x34, 0xc8, 0x66, 0xd6, 0x49, 0x5b, 0xab, 0x87, 0x42, 0x41, 0x47, 0x18, 0x3e, 0xe4, 0x3b, 0x47, 0x2a, 0x9a, 0x21, 0x59, 0xb8, 0xf, 0xf4, 0x3c, 0xdf, 0x58, 0xcc, 0xe9, 0x59, 0x65, 0xe, 0xb4, 0x15, 0x66, 0xc, 0x8e, 0xfe, 0x1d, 0xfe, 0x70, 0x9d, 0x45, 0x56, 0xfd, 0xc8, 0xab, 0x14, 0x86, 0x3, 0xde, 0x5, 0x8e, 0xfa, 0xe0, 0x7b, 0x7c, 0x5c, 0x3, 0xe9, 0x68, 0xef, 0x63, 0x8e, 0x91, 0x1e, 0xb3, 0x53, 0xb4, 0x1, 0x64, 0x11, 0xd8, 0xb4, 0x36, 0x44, 0xd4, 0x7a, 0xba, 0xc, 0x66, 0xfd, 0x7a, 0x10, 0xa0, 0xf9, 0x51, 0x91, 0xc4, 0xe4, 0xe, 0x1f, 0xd0, 0xa8, 0xac, 0xaf, 0x1c, 0x76, 0xe9, 0x9e, 0x1d, 0x5c, 0xfe, 0x75, 0x8f, 0x58, 0xc0, 0xf0, 0x6b, 0xa1, 0x97, 0x34, 0x4c, 0x80, 0x4, 0x3, 0xbd, 0xbe, 0xe2, 0x3e, 0xb9, 0x90, 0xc9, 0xc2, 0x60, 0x9a, 0xfb, 0xa8, 0x14, 0x11, 0x25, 0x39, 0xfe, 0x32, 0x4d, 0xd1, 0x66, 0x33, 0xc7, 0xca, 0xbc, 0x25, 0xbf, 0x36, 0x5c, 0x49, 0xa7, 0xdb, 0x66, 0x2c, 0x56, 0xc9, 0x8b, 0x34, 0xad, 0x46, 0x1b, 0x30, 0x4d, 0x32, 0x7e, 0x40, 0x70, 0xd6, 0xc, 0x62, 0x46, 0x9f, 0x1, 0x3a, 0x73, 0xe3, 0xf1, 0xd4, 0xa8, 0xe, 0xe0, 0x24, 0xc3, 0xb0, 0x32, 0xd5, 0x96, 0xd3, 0xcd, 0x17, 0xc3, 0x3, 0xe, 0x1a, 0x21, 0x5b, 0x37, 0x7b, 0xfe, 0x5f, 0x20, 0x7d, 0xd, 0x9, 0xda, 0xd2, 0x47, 0x17, 0xfb, 0x3e, 0x7f, 0x3b, 0x19, 0xc5, 0x4f, 0xb5, 0x5f, 0x52, 0xcb, 0xa2, 0x1e, 0x97, 0x6a, 0xf6, 0x32, 0x9, 0x22, 0x6e, 0x40, 0xd4, 0x86, 0xb4, 0xdf, 0x60, 0xc1, 0xdd, 0x65, 0x34, 0xe1, 0x3f, 0x46, 0xec, 0xcf, 0x7f, 0x51, 0xc1, 0xe4, 0x76, 0x4e, 0x7e, 0xda, 0x83, 0xb5, 0x2, 0xd3, 0xd8, 0xa1, 0x48, 0xfa, 0xd6, 0x88, 0xcd, 0x72, 0x58, 0x26, 0x4f, 0x30, 0xc6, 0xa1, 0x90, 0x8b, 0x27, 0x3c, 0x1d, 0x6c, 0x80, 0x1c, 0xbc, 0xf0, 0xca, 0x25, 0xe7, 0x53, 0x35, 0x5c, 0x8d, 0x9d, 0xbb, 0x3, 0xe6, 0x59, 0xff, 0xdd, 0x85, 0xb, 0x7a, 0x32, 0xf, 0x55, 0xa4, 0x17, 0xc2, 0xec, 0x93, 0xa, 0x72, 0xc5, 0xde, 0x13, 0x22, 0xd6, 0x69, 0x41, 0xb7, 0x88, 0xb, 0x55, 0x59, 0x36, 0x5b, 0x45, 0xf2, 0x12, 0x72, 0x87, 0xe7, 0xca, 0xb5, 0x11, 0x41, 0x76, 0x20, 0x24, 0x31, 0xfd, 0x1d, 0x58, 0x7f, 0xcb, 0x13, 0xfb, 0xae, 0x75, 0x11, 0xda, 0x77, 0xca, 0x2d, 0x75, 0xe7, 0xaa, 0xff, 0x6b, 0x46, 0x75, 0xeb, 0x32, 0xff, 0x6c, 0xdb, 0x3b, 0x6f, 0xd7, 0x74, 0x9a, 0xda, 0xfc, 0x61, 0x7a, 0xf3, 0x40, 0x74, 0x8b, 0x2, 0x25, 0xb5, 0x92, 0xac, 0xb3, 0x1b, 0x29, 0x5f, 0x97, 0xa1, 0xf7, 0xf8, 0xfb, 0x20, 0x7f, 0x9, 0x83, 0xdf, 0xe1, 0x92, 0x26, 0x98, 0x0, 0x8, 0x4b, 0x55, 0x6c, 0x8f, 0x73, 0x28, 0x2f, 0x2f, 0xce, 0xa2, 0x17, 0x37, 0x70, 0xdc, 0x94, 0x41, 0x81, 0x40, 0x3c, 0xb9, 0x13, 0x79, 0x36, 0x96, 0xe8, 0x1f, 0x93, 0x45, 0x92, 0x4, 0xa6, 0x34, 0x88, 0xf7, 0x3f, 0x44, 0x98, 0x7b, 0xa1, 0xa5, 0x14, 0x51, 0x1, 0xab, 0xc6, 0x11, 0x4c, 0x5f, 0xba, 0xff, 0x83, 0xb3, 0xde, 0x60, 0xe6, 0x82, 0xa9, 0x1, 0xc6, 0x54, 0xaa, 0x4c, 0x26, 0xcd, 0x91, 0x34, 0x11, 0x5e, 0xd3, 0x1d, 0x5, 0x6b, 0xbd, 0x7c, 0x5f, 0x31, 0x3c, 0x97, 0x24, 0x47, 0x49, 0x52, 0x75, 0x7, 0xb0, 0xca, 0x5a, 0xe1, 0x65, 0x65, 0x1f, 0x9b, 0x65, 0x4, 0x26, 0xb0, 0x8f, 0x8c, 0x29, 0xf5, 0x30, 0xbf, 0x37, 0xde, 0xa0, 0xa8, 0x1b, 0x64, 0x21, 0xfc, 0x14, 0x51, 0x5e, 0xfa, 0x66, 0xa3, 0xc7, 0xe9, 0xd8, 0x3a, 0xf0, 0x52, 0xa5, 0x9c, 0x84, 0xdb, 0xc0, 0x35, 0x4e, 0x2, 0xe9, 0xdb, 0xe8, 0xc7, 0x89, 0xc7, 0xc3, 0xcf, 0xac, 0xbb, 0xa2, 0xa1, 0x62, 0xf2, 0x26, 0x9c, 0x7d, 0x3e, 0x73, 0xbf, 0x23, 0x48, 0x44, 0xb8, 0xf5, 0xfb, 0x2f, 0x88, 0x3b, 0x48, 0xf8, 0x6b, 0x88, 0x4e, 0x22, 0xb7, 0x40, 0xf6, 0xbe, 0x65, 0x8b, 0x3b, 0x2, 0x53, 0xcd, 0xf8, 0xd5, 0xd4, 0x91, 0xec, 0xbf, 0xaa, 0xbd, 0xa1, 0x9e, 0x7, 0x10, 0x15, 0xe, 0xa4, 0x26, 0x5d, 0x5d, 0xd0, 0xdc, 0xad, 0xd9, 0x1a, 0x4f, 0x8d, 0xe6, 0x13, 0xab, 0x2e, 0x3f, 0xdb, 0x3f, 0x80, 0xf, 0x64, 0xe2, 0x1a, 0xff, 0x1c, 0x17, 0xe1, 0xce, 0xd4, 0x49, 0xb7, 0xe7, 0xe0, 0x9, 0xd9, 0x36, 0x40, 0x5b, 0x27, 0x9f, 0x8e, 0x38, 0x4c, 0x4d, 0x8f, 0x1d, 0xe3, 0x34, 0xce, 0xfc, 0x30, 0x51, 0xd7, 0x69, 0x7f, 0xb3, 0x22, 0x4, 0x46, 0x1, 0xb4, 0xfd, 0xf1, 0xe0, 0x83, 0x78, 0x50, 0x41, 0x89, 0x19, 0x99, 0xce, 0xa8, 0xfe, 0x2e, 0x79, 0x41, 0x75, 0x5b, 0x37, 0x82, 0x5b, 0x51, 0xd4, 0x97, 0x5c, 0xbf, 0x59, 0x4f, 0x7d, 0x27, 0x3a, 0x92, 0x4f, 0x32, 0x4f, 0xac, 0x6, 0x34, 0xf, 0x65, 0x7d, 0x9b, 0xbc, 0xd9, 0x51, 0xbc, 0x39, 0x8a, 0xd1, 0x87, 0xfa, 0xc6, 0x8f, 0x10, 0xcc, 0x5c, 0x30, 0x85, 0x58, 0x82, 0x34, 0xc6, 0xe4, 0x82, 0x9f, 0x3c, 0xed, 0x5c, 0xf8, 0x64, 0x44, 0x3a, 0x14, 0x83, 0xfb, 0x8e, 0x25, 0xca, 0x1d, 0x7a, 0x1b, 0x38, 0x6, 0xe7, 0x2b, 0x41, 0x2a, 0x5a, 0x3c, 0x5a, 0xd1, 0x6c, 0xb5, 0x8f, 0xcd, 0xbf, 0xfd, 0xa8, 0x47, 0x93, 0x22, 0xcd, 0x54, 0x6e, 0xef, 0x2e, 0xdb, 0x31, 0x2f, 0x93, 0xd8, 0xf8, 0x1e, 0xb1, 0xae, 0xc4, 0xaf, 0x11, 0x44, 0x34, 0xed, 0xc1, 0xe7, 0x11} golang-filippo-nistec-0.0.4/p256_test.go000066400000000000000000000020531512422514700177720ustar00rootroot00000000000000// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build (!amd64 && !arm64 && !ppc64le && !s390x) || purego package nistec import ( "bytes" "fmt" "testing" "filippo.io/nistec/internal/fiat" ) func TestP256PrecomputedTable(t *testing.T) { base := NewP256Point().SetGenerator() for i := 0; i < 43; i++ { t.Run(fmt.Sprintf("table[%d]", i), func(t *testing.T) { testP256AffineTable(t, base, &p256GeneratorTables[i]) }) for k := 0; k < 6; k++ { base.Double(base) } } } func testP256AffineTable(t *testing.T, base *P256Point, table *p256AffineTable) { p := NewP256Point() zInv := new(fiat.P256Element) for j := 0; j < 32; j++ { p.Add(p, base) // Convert p to affine coordinates. zInv.Invert(&p.z) p.x.Mul(&p.x, zInv) p.y.Mul(&p.y, zInv) p.z.One() if !bytes.Equal(table[j].x.Bytes(), p.x.Bytes()) || !bytes.Equal(table[j].y.Bytes(), p.y.Bytes()) { t.Fatalf("incorrect table entry at index %d", j) } } } golang-filippo-nistec-0.0.4/p384.go000066400000000000000000000440601512422514700167410ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by generate.go. DO NOT EDIT. package nistec import ( "crypto/subtle" "errors" "sync" "filippo.io/nistec/internal/fiat" ) // p384ElementLength is the length of an element of the base or scalar field, // which have the same bytes length for all NIST P curves. const p384ElementLength = 48 // P384Point is a P384 point. The zero value is NOT valid. type P384Point struct { // The point is represented in projective coordinates (X:Y:Z), // where x = X/Z and y = Y/Z. x, y, z *fiat.P384Element } // NewP384Point returns a new P384Point representing the point at infinity point. func NewP384Point() *P384Point { return &P384Point{ x: new(fiat.P384Element), y: new(fiat.P384Element).One(), z: new(fiat.P384Element), } } // SetGenerator sets p to the canonical generator and returns p. func (p *P384Point) SetGenerator() *P384Point { p.x.SetBytes([]byte{0xaa, 0x87, 0xca, 0x22, 0xbe, 0x8b, 0x5, 0x37, 0x8e, 0xb1, 0xc7, 0x1e, 0xf3, 0x20, 0xad, 0x74, 0x6e, 0x1d, 0x3b, 0x62, 0x8b, 0xa7, 0x9b, 0x98, 0x59, 0xf7, 0x41, 0xe0, 0x82, 0x54, 0x2a, 0x38, 0x55, 0x2, 0xf2, 0x5d, 0xbf, 0x55, 0x29, 0x6c, 0x3a, 0x54, 0x5e, 0x38, 0x72, 0x76, 0xa, 0xb7}) p.y.SetBytes([]byte{0x36, 0x17, 0xde, 0x4a, 0x96, 0x26, 0x2c, 0x6f, 0x5d, 0x9e, 0x98, 0xbf, 0x92, 0x92, 0xdc, 0x29, 0xf8, 0xf4, 0x1d, 0xbd, 0x28, 0x9a, 0x14, 0x7c, 0xe9, 0xda, 0x31, 0x13, 0xb5, 0xf0, 0xb8, 0xc0, 0xa, 0x60, 0xb1, 0xce, 0x1d, 0x7e, 0x81, 0x9d, 0x7a, 0x43, 0x1d, 0x7c, 0x90, 0xea, 0xe, 0x5f}) p.z.One() return p } // Set sets p = q and returns p. func (p *P384Point) Set(q *P384Point) *P384Point { p.x.Set(q.x) p.y.Set(q.y) p.z.Set(q.z) return p } // SetBytes sets p to the compressed, uncompressed, or infinity value encoded in // b, as specified in SEC 1, Version 2.0, Section 2.3.4. If the point is not on // the curve, it returns nil and an error, and the receiver is unchanged. // Otherwise, it returns p. func (p *P384Point) SetBytes(b []byte) (*P384Point, error) { switch { // Point at infinity. case len(b) == 1 && b[0] == 0: return p.Set(NewP384Point()), nil // Uncompressed form. case len(b) == 1+2*p384ElementLength && b[0] == 4: x, err := new(fiat.P384Element).SetBytes(b[1 : 1+p384ElementLength]) if err != nil { return nil, err } y, err := new(fiat.P384Element).SetBytes(b[1+p384ElementLength:]) if err != nil { return nil, err } if err := p384CheckOnCurve(x, y); err != nil { return nil, err } p.x.Set(x) p.y.Set(y) p.z.One() return p, nil // Compressed form. case len(b) == 1+p384ElementLength && (b[0] == 2 || b[0] == 3): x, err := new(fiat.P384Element).SetBytes(b[1:]) if err != nil { return nil, err } // y² = x³ - 3x + b y := p384Polynomial(new(fiat.P384Element), x) if !p384Sqrt(y, y) { return nil, errors.New("invalid P384 compressed point encoding") } // Select the positive or negative root, as indicated by the least // significant bit, based on the encoding type byte. otherRoot := new(fiat.P384Element) otherRoot.Sub(otherRoot, y) cond := y.Bytes()[p384ElementLength-1]&1 ^ b[0]&1 y.Select(otherRoot, y, int(cond)) p.x.Set(x) p.y.Set(y) p.z.One() return p, nil default: return nil, errors.New("invalid P384 point encoding") } } var _p384B *fiat.P384Element var _p384BOnce sync.Once func p384B() *fiat.P384Element { _p384BOnce.Do(func() { _p384B, _ = new(fiat.P384Element).SetBytes([]byte{0xb3, 0x31, 0x2f, 0xa7, 0xe2, 0x3e, 0xe7, 0xe4, 0x98, 0x8e, 0x5, 0x6b, 0xe3, 0xf8, 0x2d, 0x19, 0x18, 0x1d, 0x9c, 0x6e, 0xfe, 0x81, 0x41, 0x12, 0x3, 0x14, 0x8, 0x8f, 0x50, 0x13, 0x87, 0x5a, 0xc6, 0x56, 0x39, 0x8d, 0x8a, 0x2e, 0xd1, 0x9d, 0x2a, 0x85, 0xc8, 0xed, 0xd3, 0xec, 0x2a, 0xef}) }) return _p384B } // p384Polynomial sets y2 to x³ - 3x + b, and returns y2. func p384Polynomial(y2, x *fiat.P384Element) *fiat.P384Element { y2.Square(x) y2.Mul(y2, x) threeX := new(fiat.P384Element).Add(x, x) threeX.Add(threeX, x) y2.Sub(y2, threeX) return y2.Add(y2, p384B()) } func p384CheckOnCurve(x, y *fiat.P384Element) error { // y² = x³ - 3x + b rhs := p384Polynomial(new(fiat.P384Element), x) lhs := new(fiat.P384Element).Square(y) if rhs.Equal(lhs) != 1 { return errors.New("P384 point not on curve") } return nil } // Bytes returns the uncompressed or infinity encoding of p, as specified in // SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the point at // infinity is shorter than all other encodings. func (p *P384Point) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [1 + 2*p384ElementLength]byte return p.bytes(&out) } func (p *P384Point) bytes(out *[1 + 2*p384ElementLength]byte) []byte { if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new(fiat.P384Element).Invert(p.z) x := new(fiat.P384Element).Mul(p.x, zinv) y := new(fiat.P384Element).Mul(p.y, zinv) buf := append(out[:0], 4) buf = append(buf, x.Bytes()...) buf = append(buf, y.Bytes()...) return buf } // BytesX returns the encoding of the x-coordinate of p, as specified in SEC 1, // Version 2.0, Section 2.3.5, or an error if p is the point at infinity. func (p *P384Point) BytesX() ([]byte, error) { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p384ElementLength]byte return p.bytesX(&out) } func (p *P384Point) bytesX(out *[p384ElementLength]byte) ([]byte, error) { if p.z.IsZero() == 1 { return nil, errors.New("P384 point is the point at infinity") } zinv := new(fiat.P384Element).Invert(p.z) x := new(fiat.P384Element).Mul(p.x, zinv) return append(out[:0], x.Bytes()...), nil } // BytesCompressed returns the compressed or infinity encoding of p, as // specified in SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the // point at infinity is shorter than all other encodings. func (p *P384Point) BytesCompressed() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [1 + p384ElementLength]byte return p.bytesCompressed(&out) } func (p *P384Point) bytesCompressed(out *[1 + p384ElementLength]byte) []byte { if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new(fiat.P384Element).Invert(p.z) x := new(fiat.P384Element).Mul(p.x, zinv) y := new(fiat.P384Element).Mul(p.y, zinv) // Encode the sign of the y coordinate (indicated by the least significant // bit) as the encoding type (2 or 3). buf := append(out[:0], 2) buf[0] |= y.Bytes()[p384ElementLength-1] & 1 buf = append(buf, x.Bytes()...) return buf } // Add sets q = p1 + p2, and returns q. The points may overlap. func (q *P384Point) Add(p1, p2 *P384Point) *P384Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new(fiat.P384Element).Mul(p1.x, p2.x) // t0 := X1 * X2 t1 := new(fiat.P384Element).Mul(p1.y, p2.y) // t1 := Y1 * Y2 t2 := new(fiat.P384Element).Mul(p1.z, p2.z) // t2 := Z1 * Z2 t3 := new(fiat.P384Element).Add(p1.x, p1.y) // t3 := X1 + Y1 t4 := new(fiat.P384Element).Add(p2.x, p2.y) // t4 := X2 + Y2 t3.Mul(t3, t4) // t3 := t3 * t4 t4.Add(t0, t1) // t4 := t0 + t1 t3.Sub(t3, t4) // t3 := t3 - t4 t4.Add(p1.y, p1.z) // t4 := Y1 + Z1 x3 := new(fiat.P384Element).Add(p2.y, p2.z) // X3 := Y2 + Z2 t4.Mul(t4, x3) // t4 := t4 * X3 x3.Add(t1, t2) // X3 := t1 + t2 t4.Sub(t4, x3) // t4 := t4 - X3 x3.Add(p1.x, p1.z) // X3 := X1 + Z1 y3 := new(fiat.P384Element).Add(p2.x, p2.z) // Y3 := X2 + Z2 x3.Mul(x3, y3) // X3 := X3 * Y3 y3.Add(t0, t2) // Y3 := t0 + t2 y3.Sub(x3, y3) // Y3 := X3 - Y3 z3 := new(fiat.P384Element).Mul(p384B(), t2) // Z3 := b * t2 x3.Sub(y3, z3) // X3 := Y3 - Z3 z3.Add(x3, x3) // Z3 := X3 + X3 x3.Add(x3, z3) // X3 := X3 + Z3 z3.Sub(t1, x3) // Z3 := t1 - X3 x3.Add(t1, x3) // X3 := t1 + X3 y3.Mul(p384B(), y3) // Y3 := b * Y3 t1.Add(t2, t2) // t1 := t2 + t2 t2.Add(t1, t2) // t2 := t1 + t2 y3.Sub(y3, t2) // Y3 := Y3 - t2 y3.Sub(y3, t0) // Y3 := Y3 - t0 t1.Add(y3, y3) // t1 := Y3 + Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 t1.Add(t0, t0) // t1 := t0 + t0 t0.Add(t1, t0) // t0 := t1 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t1.Mul(t4, y3) // t1 := t4 * Y3 t2.Mul(t0, y3) // t2 := t0 * Y3 y3.Mul(x3, z3) // Y3 := X3 * Z3 y3.Add(y3, t2) // Y3 := Y3 + t2 x3.Mul(t3, x3) // X3 := t3 * X3 x3.Sub(x3, t1) // X3 := X3 - t1 z3.Mul(t4, z3) // Z3 := t4 * Z3 t1.Mul(t3, t0) // t1 := t3 * t0 z3.Add(z3, t1) // Z3 := Z3 + t1 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // Double sets q = p + p, and returns q. The points may overlap. func (q *P384Point) Double(p *P384Point) *P384Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new(fiat.P384Element).Square(p.x) // t0 := X ^ 2 t1 := new(fiat.P384Element).Square(p.y) // t1 := Y ^ 2 t2 := new(fiat.P384Element).Square(p.z) // t2 := Z ^ 2 t3 := new(fiat.P384Element).Mul(p.x, p.y) // t3 := X * Y t3.Add(t3, t3) // t3 := t3 + t3 z3 := new(fiat.P384Element).Mul(p.x, p.z) // Z3 := X * Z z3.Add(z3, z3) // Z3 := Z3 + Z3 y3 := new(fiat.P384Element).Mul(p384B(), t2) // Y3 := b * t2 y3.Sub(y3, z3) // Y3 := Y3 - Z3 x3 := new(fiat.P384Element).Add(y3, y3) // X3 := Y3 + Y3 y3.Add(x3, y3) // Y3 := X3 + Y3 x3.Sub(t1, y3) // X3 := t1 - Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 y3.Mul(x3, y3) // Y3 := X3 * Y3 x3.Mul(x3, t3) // X3 := X3 * t3 t3.Add(t2, t2) // t3 := t2 + t2 t2.Add(t2, t3) // t2 := t2 + t3 z3.Mul(p384B(), z3) // Z3 := b * Z3 z3.Sub(z3, t2) // Z3 := Z3 - t2 z3.Sub(z3, t0) // Z3 := Z3 - t0 t3.Add(z3, z3) // t3 := Z3 + Z3 z3.Add(z3, t3) // Z3 := Z3 + t3 t3.Add(t0, t0) // t3 := t0 + t0 t0.Add(t3, t0) // t0 := t3 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t0.Mul(t0, z3) // t0 := t0 * Z3 y3.Add(y3, t0) // Y3 := Y3 + t0 t0.Mul(p.y, p.z) // t0 := Y * Z t0.Add(t0, t0) // t0 := t0 + t0 z3.Mul(t0, z3) // Z3 := t0 * Z3 x3.Sub(x3, z3) // X3 := X3 - Z3 z3.Mul(t0, t1) // Z3 := t0 * t1 z3.Add(z3, z3) // Z3 := Z3 + Z3 z3.Add(z3, z3) // Z3 := Z3 + Z3 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // Select sets q to p1 if cond == 1, and to p2 if cond == 0. func (q *P384Point) Select(p1, p2 *P384Point, cond int) *P384Point { q.x.Select(p1.x, p2.x, cond) q.y.Select(p1.y, p2.y, cond) q.z.Select(p1.z, p2.z, cond) return q } // A p384Table holds the first 15 multiples of a point at offset -1, so [1]P // is at table[0], [15]P is at table[14], and [0]P is implicitly the identity // point. type p384Table [15]*P384Point // Select selects the n-th multiple of the table base point into p. It works in // constant time by iterating over every entry of the table. n must be in [0, 15]. func (table *p384Table) Select(p *P384Point, n uint8) { if n >= 16 { panic("nistec: internal error: p384Table called with out-of-bounds value") } p.Set(NewP384Point()) for i := uint8(1); i < 16; i++ { cond := subtle.ConstantTimeByteEq(i, n) p.Select(table[i-1], p, cond) } } // ScalarMult sets p = scalar * q, and returns p. func (p *P384Point) ScalarMult(q *P384Point, scalar []byte) (*P384Point, error) { // Compute a p384Table for the base point q. The explicit NewP384Point // calls get inlined, letting the allocations live on the stack. var table = p384Table{NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point(), NewP384Point()} table[0].Set(q) for i := 1; i < 15; i += 2 { table[i].Double(table[i/2]) table[i+1].Add(table[i], q) } // Instead of doing the classic double-and-add chain, we do it with a // four-bit window: we double four times, and then add [0-15]P. t := NewP384Point() p.Set(NewP384Point()) for i, byte := range scalar { // No need to double on the first iteration, as p is the identity at // this point, and [N]∞ = ∞. if i != 0 { p.Double(p) p.Double(p) p.Double(p) p.Double(p) } windowValue := byte >> 4 table.Select(t, windowValue) p.Add(p, t) p.Double(p) p.Double(p) p.Double(p) p.Double(p) windowValue = byte & 0b1111 table.Select(t, windowValue) p.Add(p, t) } return p, nil } var p384GeneratorTable *[p384ElementLength * 2]p384Table var p384GeneratorTableOnce sync.Once // generatorTable returns a sequence of p384Tables. The first table contains // multiples of G. Each successive table is the previous table doubled four // times. func (p *P384Point) generatorTable() *[p384ElementLength * 2]p384Table { p384GeneratorTableOnce.Do(func() { p384GeneratorTable = new([p384ElementLength * 2]p384Table) base := NewP384Point().SetGenerator() for i := 0; i < p384ElementLength*2; i++ { p384GeneratorTable[i][0] = NewP384Point().Set(base) for j := 1; j < 15; j++ { p384GeneratorTable[i][j] = NewP384Point().Add(p384GeneratorTable[i][j-1], base) } base.Double(base) base.Double(base) base.Double(base) base.Double(base) } }) return p384GeneratorTable } // ScalarBaseMult sets p = scalar * B, where B is the canonical generator, and // returns p. func (p *P384Point) ScalarBaseMult(scalar []byte) (*P384Point, error) { if len(scalar) != p384ElementLength { return nil, errors.New("invalid scalar length") } tables := p.generatorTable() // This is also a scalar multiplication with a four-bit window like in // ScalarMult, but in this case the doublings are precomputed. The value // [windowValue]G added at iteration k would normally get doubled // (totIterations-k)×4 times, but with a larger precomputation we can // instead add [2^((totIterations-k)×4)][windowValue]G and avoid the // doublings between iterations. t := NewP384Point() p.Set(NewP384Point()) tableIndex := len(tables) - 1 for _, byte := range scalar { windowValue := byte >> 4 tables[tableIndex].Select(t, windowValue) p.Add(p, t) tableIndex-- windowValue = byte & 0b1111 tables[tableIndex].Select(t, windowValue) p.Add(p, t) tableIndex-- } return p, nil } // p384Sqrt sets e to a square root of x. If x is not a square, p384Sqrt returns // false and e is unchanged. e and x can overlap. func p384Sqrt(e, x *fiat.P384Element) (isSquare bool) { candidate := new(fiat.P384Element) p384SqrtCandidate(candidate, x) square := new(fiat.P384Element).Square(candidate) if square.Equal(x) != 1 { return false } e.Set(candidate) return true } // p384SqrtCandidate sets z to a square root candidate for x. z and x must not overlap. func p384SqrtCandidate(z, x *fiat.P384Element) { // Since p = 3 mod 4, exponentiation by (p + 1) / 4 yields a square root candidate. // // The sequence of 14 multiplications and 381 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain v0.4.0. // // _10 = 2*1 // _11 = 1 + _10 // _110 = 2*_11 // _111 = 1 + _110 // _111000 = _111 << 3 // _111111 = _111 + _111000 // _1111110 = 2*_111111 // _1111111 = 1 + _1111110 // x12 = _1111110 << 5 + _111111 // x24 = x12 << 12 + x12 // x31 = x24 << 7 + _1111111 // x32 = 2*x31 + 1 // x63 = x32 << 31 + x31 // x126 = x63 << 63 + x63 // x252 = x126 << 126 + x126 // x255 = x252 << 3 + _111 // return ((x255 << 33 + x32) << 64 + 1) << 30 // var t0 = new(fiat.P384Element) var t1 = new(fiat.P384Element) var t2 = new(fiat.P384Element) z.Square(x) z.Mul(x, z) z.Square(z) t0.Mul(x, z) z.Square(t0) for s := 1; s < 3; s++ { z.Square(z) } t1.Mul(t0, z) t2.Square(t1) z.Mul(x, t2) for s := 0; s < 5; s++ { t2.Square(t2) } t1.Mul(t1, t2) t2.Square(t1) for s := 1; s < 12; s++ { t2.Square(t2) } t1.Mul(t1, t2) for s := 0; s < 7; s++ { t1.Square(t1) } t1.Mul(z, t1) z.Square(t1) z.Mul(x, z) t2.Square(z) for s := 1; s < 31; s++ { t2.Square(t2) } t1.Mul(t1, t2) t2.Square(t1) for s := 1; s < 63; s++ { t2.Square(t2) } t1.Mul(t1, t2) t2.Square(t1) for s := 1; s < 126; s++ { t2.Square(t2) } t1.Mul(t1, t2) for s := 0; s < 3; s++ { t1.Square(t1) } t0.Mul(t0, t1) for s := 0; s < 33; s++ { t0.Square(t0) } z.Mul(z, t0) for s := 0; s < 64; s++ { z.Square(z) } z.Mul(x, z) for s := 0; s < 30; s++ { z.Square(z) } } golang-filippo-nistec-0.0.4/p521.go000066400000000000000000000420441512422514700167320ustar00rootroot00000000000000// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by generate.go. DO NOT EDIT. package nistec import ( "crypto/subtle" "errors" "sync" "filippo.io/nistec/internal/fiat" ) // p521ElementLength is the length of an element of the base or scalar field, // which have the same bytes length for all NIST P curves. const p521ElementLength = 66 // P521Point is a P521 point. The zero value is NOT valid. type P521Point struct { // The point is represented in projective coordinates (X:Y:Z), // where x = X/Z and y = Y/Z. x, y, z *fiat.P521Element } // NewP521Point returns a new P521Point representing the point at infinity point. func NewP521Point() *P521Point { return &P521Point{ x: new(fiat.P521Element), y: new(fiat.P521Element).One(), z: new(fiat.P521Element), } } // SetGenerator sets p to the canonical generator and returns p. func (p *P521Point) SetGenerator() *P521Point { p.x.SetBytes([]byte{0x0, 0xc6, 0x85, 0x8e, 0x6, 0xb7, 0x4, 0x4, 0xe9, 0xcd, 0x9e, 0x3e, 0xcb, 0x66, 0x23, 0x95, 0xb4, 0x42, 0x9c, 0x64, 0x81, 0x39, 0x5, 0x3f, 0xb5, 0x21, 0xf8, 0x28, 0xaf, 0x60, 0x6b, 0x4d, 0x3d, 0xba, 0xa1, 0x4b, 0x5e, 0x77, 0xef, 0xe7, 0x59, 0x28, 0xfe, 0x1d, 0xc1, 0x27, 0xa2, 0xff, 0xa8, 0xde, 0x33, 0x48, 0xb3, 0xc1, 0x85, 0x6a, 0x42, 0x9b, 0xf9, 0x7e, 0x7e, 0x31, 0xc2, 0xe5, 0xbd, 0x66}) p.y.SetBytes([]byte{0x1, 0x18, 0x39, 0x29, 0x6a, 0x78, 0x9a, 0x3b, 0xc0, 0x4, 0x5c, 0x8a, 0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9, 0x98, 0xf5, 0x44, 0x49, 0x57, 0x9b, 0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17, 0x27, 0x3e, 0x66, 0x2c, 0x97, 0xee, 0x72, 0x99, 0x5e, 0xf4, 0x26, 0x40, 0xc5, 0x50, 0xb9, 0x1, 0x3f, 0xad, 0x7, 0x61, 0x35, 0x3c, 0x70, 0x86, 0xa2, 0x72, 0xc2, 0x40, 0x88, 0xbe, 0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50}) p.z.One() return p } // Set sets p = q and returns p. func (p *P521Point) Set(q *P521Point) *P521Point { p.x.Set(q.x) p.y.Set(q.y) p.z.Set(q.z) return p } // SetBytes sets p to the compressed, uncompressed, or infinity value encoded in // b, as specified in SEC 1, Version 2.0, Section 2.3.4. If the point is not on // the curve, it returns nil and an error, and the receiver is unchanged. // Otherwise, it returns p. func (p *P521Point) SetBytes(b []byte) (*P521Point, error) { switch { // Point at infinity. case len(b) == 1 && b[0] == 0: return p.Set(NewP521Point()), nil // Uncompressed form. case len(b) == 1+2*p521ElementLength && b[0] == 4: x, err := new(fiat.P521Element).SetBytes(b[1 : 1+p521ElementLength]) if err != nil { return nil, err } y, err := new(fiat.P521Element).SetBytes(b[1+p521ElementLength:]) if err != nil { return nil, err } if err := p521CheckOnCurve(x, y); err != nil { return nil, err } p.x.Set(x) p.y.Set(y) p.z.One() return p, nil // Compressed form. case len(b) == 1+p521ElementLength && (b[0] == 2 || b[0] == 3): x, err := new(fiat.P521Element).SetBytes(b[1:]) if err != nil { return nil, err } // y² = x³ - 3x + b y := p521Polynomial(new(fiat.P521Element), x) if !p521Sqrt(y, y) { return nil, errors.New("invalid P521 compressed point encoding") } // Select the positive or negative root, as indicated by the least // significant bit, based on the encoding type byte. otherRoot := new(fiat.P521Element) otherRoot.Sub(otherRoot, y) cond := y.Bytes()[p521ElementLength-1]&1 ^ b[0]&1 y.Select(otherRoot, y, int(cond)) p.x.Set(x) p.y.Set(y) p.z.One() return p, nil default: return nil, errors.New("invalid P521 point encoding") } } var _p521B *fiat.P521Element var _p521BOnce sync.Once func p521B() *fiat.P521Element { _p521BOnce.Do(func() { _p521B, _ = new(fiat.P521Element).SetBytes([]byte{0x0, 0x51, 0x95, 0x3e, 0xb9, 0x61, 0x8e, 0x1c, 0x9a, 0x1f, 0x92, 0x9a, 0x21, 0xa0, 0xb6, 0x85, 0x40, 0xee, 0xa2, 0xda, 0x72, 0x5b, 0x99, 0xb3, 0x15, 0xf3, 0xb8, 0xb4, 0x89, 0x91, 0x8e, 0xf1, 0x9, 0xe1, 0x56, 0x19, 0x39, 0x51, 0xec, 0x7e, 0x93, 0x7b, 0x16, 0x52, 0xc0, 0xbd, 0x3b, 0xb1, 0xbf, 0x7, 0x35, 0x73, 0xdf, 0x88, 0x3d, 0x2c, 0x34, 0xf1, 0xef, 0x45, 0x1f, 0xd4, 0x6b, 0x50, 0x3f, 0x0}) }) return _p521B } // p521Polynomial sets y2 to x³ - 3x + b, and returns y2. func p521Polynomial(y2, x *fiat.P521Element) *fiat.P521Element { y2.Square(x) y2.Mul(y2, x) threeX := new(fiat.P521Element).Add(x, x) threeX.Add(threeX, x) y2.Sub(y2, threeX) return y2.Add(y2, p521B()) } func p521CheckOnCurve(x, y *fiat.P521Element) error { // y² = x³ - 3x + b rhs := p521Polynomial(new(fiat.P521Element), x) lhs := new(fiat.P521Element).Square(y) if rhs.Equal(lhs) != 1 { return errors.New("P521 point not on curve") } return nil } // Bytes returns the uncompressed or infinity encoding of p, as specified in // SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the point at // infinity is shorter than all other encodings. func (p *P521Point) Bytes() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [1 + 2*p521ElementLength]byte return p.bytes(&out) } func (p *P521Point) bytes(out *[1 + 2*p521ElementLength]byte) []byte { if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new(fiat.P521Element).Invert(p.z) x := new(fiat.P521Element).Mul(p.x, zinv) y := new(fiat.P521Element).Mul(p.y, zinv) buf := append(out[:0], 4) buf = append(buf, x.Bytes()...) buf = append(buf, y.Bytes()...) return buf } // BytesX returns the encoding of the x-coordinate of p, as specified in SEC 1, // Version 2.0, Section 2.3.5, or an error if p is the point at infinity. func (p *P521Point) BytesX() ([]byte, error) { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [p521ElementLength]byte return p.bytesX(&out) } func (p *P521Point) bytesX(out *[p521ElementLength]byte) ([]byte, error) { if p.z.IsZero() == 1 { return nil, errors.New("P521 point is the point at infinity") } zinv := new(fiat.P521Element).Invert(p.z) x := new(fiat.P521Element).Mul(p.x, zinv) return append(out[:0], x.Bytes()...), nil } // BytesCompressed returns the compressed or infinity encoding of p, as // specified in SEC 1, Version 2.0, Section 2.3.3. Note that the encoding of the // point at infinity is shorter than all other encodings. func (p *P521Point) BytesCompressed() []byte { // This function is outlined to make the allocations inline in the caller // rather than happen on the heap. var out [1 + p521ElementLength]byte return p.bytesCompressed(&out) } func (p *P521Point) bytesCompressed(out *[1 + p521ElementLength]byte) []byte { if p.z.IsZero() == 1 { return append(out[:0], 0) } zinv := new(fiat.P521Element).Invert(p.z) x := new(fiat.P521Element).Mul(p.x, zinv) y := new(fiat.P521Element).Mul(p.y, zinv) // Encode the sign of the y coordinate (indicated by the least significant // bit) as the encoding type (2 or 3). buf := append(out[:0], 2) buf[0] |= y.Bytes()[p521ElementLength-1] & 1 buf = append(buf, x.Bytes()...) return buf } // Add sets q = p1 + p2, and returns q. The points may overlap. func (q *P521Point) Add(p1, p2 *P521Point) *P521Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new(fiat.P521Element).Mul(p1.x, p2.x) // t0 := X1 * X2 t1 := new(fiat.P521Element).Mul(p1.y, p2.y) // t1 := Y1 * Y2 t2 := new(fiat.P521Element).Mul(p1.z, p2.z) // t2 := Z1 * Z2 t3 := new(fiat.P521Element).Add(p1.x, p1.y) // t3 := X1 + Y1 t4 := new(fiat.P521Element).Add(p2.x, p2.y) // t4 := X2 + Y2 t3.Mul(t3, t4) // t3 := t3 * t4 t4.Add(t0, t1) // t4 := t0 + t1 t3.Sub(t3, t4) // t3 := t3 - t4 t4.Add(p1.y, p1.z) // t4 := Y1 + Z1 x3 := new(fiat.P521Element).Add(p2.y, p2.z) // X3 := Y2 + Z2 t4.Mul(t4, x3) // t4 := t4 * X3 x3.Add(t1, t2) // X3 := t1 + t2 t4.Sub(t4, x3) // t4 := t4 - X3 x3.Add(p1.x, p1.z) // X3 := X1 + Z1 y3 := new(fiat.P521Element).Add(p2.x, p2.z) // Y3 := X2 + Z2 x3.Mul(x3, y3) // X3 := X3 * Y3 y3.Add(t0, t2) // Y3 := t0 + t2 y3.Sub(x3, y3) // Y3 := X3 - Y3 z3 := new(fiat.P521Element).Mul(p521B(), t2) // Z3 := b * t2 x3.Sub(y3, z3) // X3 := Y3 - Z3 z3.Add(x3, x3) // Z3 := X3 + X3 x3.Add(x3, z3) // X3 := X3 + Z3 z3.Sub(t1, x3) // Z3 := t1 - X3 x3.Add(t1, x3) // X3 := t1 + X3 y3.Mul(p521B(), y3) // Y3 := b * Y3 t1.Add(t2, t2) // t1 := t2 + t2 t2.Add(t1, t2) // t2 := t1 + t2 y3.Sub(y3, t2) // Y3 := Y3 - t2 y3.Sub(y3, t0) // Y3 := Y3 - t0 t1.Add(y3, y3) // t1 := Y3 + Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 t1.Add(t0, t0) // t1 := t0 + t0 t0.Add(t1, t0) // t0 := t1 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t1.Mul(t4, y3) // t1 := t4 * Y3 t2.Mul(t0, y3) // t2 := t0 * Y3 y3.Mul(x3, z3) // Y3 := X3 * Z3 y3.Add(y3, t2) // Y3 := Y3 + t2 x3.Mul(t3, x3) // X3 := t3 * X3 x3.Sub(x3, t1) // X3 := X3 - t1 z3.Mul(t4, z3) // Z3 := t4 * Z3 t1.Mul(t3, t0) // t1 := t3 * t0 z3.Add(z3, t1) // Z3 := Z3 + t1 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // Double sets q = p + p, and returns q. The points may overlap. func (q *P521Point) Double(p *P521Point) *P521Point { // Complete addition formula for a = -3 from "Complete addition formulas for // prime order elliptic curves" (https://eprint.iacr.org/2015/1060), §A.2. t0 := new(fiat.P521Element).Square(p.x) // t0 := X ^ 2 t1 := new(fiat.P521Element).Square(p.y) // t1 := Y ^ 2 t2 := new(fiat.P521Element).Square(p.z) // t2 := Z ^ 2 t3 := new(fiat.P521Element).Mul(p.x, p.y) // t3 := X * Y t3.Add(t3, t3) // t3 := t3 + t3 z3 := new(fiat.P521Element).Mul(p.x, p.z) // Z3 := X * Z z3.Add(z3, z3) // Z3 := Z3 + Z3 y3 := new(fiat.P521Element).Mul(p521B(), t2) // Y3 := b * t2 y3.Sub(y3, z3) // Y3 := Y3 - Z3 x3 := new(fiat.P521Element).Add(y3, y3) // X3 := Y3 + Y3 y3.Add(x3, y3) // Y3 := X3 + Y3 x3.Sub(t1, y3) // X3 := t1 - Y3 y3.Add(t1, y3) // Y3 := t1 + Y3 y3.Mul(x3, y3) // Y3 := X3 * Y3 x3.Mul(x3, t3) // X3 := X3 * t3 t3.Add(t2, t2) // t3 := t2 + t2 t2.Add(t2, t3) // t2 := t2 + t3 z3.Mul(p521B(), z3) // Z3 := b * Z3 z3.Sub(z3, t2) // Z3 := Z3 - t2 z3.Sub(z3, t0) // Z3 := Z3 - t0 t3.Add(z3, z3) // t3 := Z3 + Z3 z3.Add(z3, t3) // Z3 := Z3 + t3 t3.Add(t0, t0) // t3 := t0 + t0 t0.Add(t3, t0) // t0 := t3 + t0 t0.Sub(t0, t2) // t0 := t0 - t2 t0.Mul(t0, z3) // t0 := t0 * Z3 y3.Add(y3, t0) // Y3 := Y3 + t0 t0.Mul(p.y, p.z) // t0 := Y * Z t0.Add(t0, t0) // t0 := t0 + t0 z3.Mul(t0, z3) // Z3 := t0 * Z3 x3.Sub(x3, z3) // X3 := X3 - Z3 z3.Mul(t0, t1) // Z3 := t0 * t1 z3.Add(z3, z3) // Z3 := Z3 + Z3 z3.Add(z3, z3) // Z3 := Z3 + Z3 q.x.Set(x3) q.y.Set(y3) q.z.Set(z3) return q } // Select sets q to p1 if cond == 1, and to p2 if cond == 0. func (q *P521Point) Select(p1, p2 *P521Point, cond int) *P521Point { q.x.Select(p1.x, p2.x, cond) q.y.Select(p1.y, p2.y, cond) q.z.Select(p1.z, p2.z, cond) return q } // A p521Table holds the first 15 multiples of a point at offset -1, so [1]P // is at table[0], [15]P is at table[14], and [0]P is implicitly the identity // point. type p521Table [15]*P521Point // Select selects the n-th multiple of the table base point into p. It works in // constant time by iterating over every entry of the table. n must be in [0, 15]. func (table *p521Table) Select(p *P521Point, n uint8) { if n >= 16 { panic("nistec: internal error: p521Table called with out-of-bounds value") } p.Set(NewP521Point()) for i := uint8(1); i < 16; i++ { cond := subtle.ConstantTimeByteEq(i, n) p.Select(table[i-1], p, cond) } } // ScalarMult sets p = scalar * q, and returns p. func (p *P521Point) ScalarMult(q *P521Point, scalar []byte) (*P521Point, error) { // Compute a p521Table for the base point q. The explicit NewP521Point // calls get inlined, letting the allocations live on the stack. var table = p521Table{NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point(), NewP521Point()} table[0].Set(q) for i := 1; i < 15; i += 2 { table[i].Double(table[i/2]) table[i+1].Add(table[i], q) } // Instead of doing the classic double-and-add chain, we do it with a // four-bit window: we double four times, and then add [0-15]P. t := NewP521Point() p.Set(NewP521Point()) for i, byte := range scalar { // No need to double on the first iteration, as p is the identity at // this point, and [N]∞ = ∞. if i != 0 { p.Double(p) p.Double(p) p.Double(p) p.Double(p) } windowValue := byte >> 4 table.Select(t, windowValue) p.Add(p, t) p.Double(p) p.Double(p) p.Double(p) p.Double(p) windowValue = byte & 0b1111 table.Select(t, windowValue) p.Add(p, t) } return p, nil } var p521GeneratorTable *[p521ElementLength * 2]p521Table var p521GeneratorTableOnce sync.Once // generatorTable returns a sequence of p521Tables. The first table contains // multiples of G. Each successive table is the previous table doubled four // times. func (p *P521Point) generatorTable() *[p521ElementLength * 2]p521Table { p521GeneratorTableOnce.Do(func() { p521GeneratorTable = new([p521ElementLength * 2]p521Table) base := NewP521Point().SetGenerator() for i := 0; i < p521ElementLength*2; i++ { p521GeneratorTable[i][0] = NewP521Point().Set(base) for j := 1; j < 15; j++ { p521GeneratorTable[i][j] = NewP521Point().Add(p521GeneratorTable[i][j-1], base) } base.Double(base) base.Double(base) base.Double(base) base.Double(base) } }) return p521GeneratorTable } // ScalarBaseMult sets p = scalar * B, where B is the canonical generator, and // returns p. func (p *P521Point) ScalarBaseMult(scalar []byte) (*P521Point, error) { if len(scalar) != p521ElementLength { return nil, errors.New("invalid scalar length") } tables := p.generatorTable() // This is also a scalar multiplication with a four-bit window like in // ScalarMult, but in this case the doublings are precomputed. The value // [windowValue]G added at iteration k would normally get doubled // (totIterations-k)×4 times, but with a larger precomputation we can // instead add [2^((totIterations-k)×4)][windowValue]G and avoid the // doublings between iterations. t := NewP521Point() p.Set(NewP521Point()) tableIndex := len(tables) - 1 for _, byte := range scalar { windowValue := byte >> 4 tables[tableIndex].Select(t, windowValue) p.Add(p, t) tableIndex-- windowValue = byte & 0b1111 tables[tableIndex].Select(t, windowValue) p.Add(p, t) tableIndex-- } return p, nil } // p521Sqrt sets e to a square root of x. If x is not a square, p521Sqrt returns // false and e is unchanged. e and x can overlap. func p521Sqrt(e, x *fiat.P521Element) (isSquare bool) { candidate := new(fiat.P521Element) p521SqrtCandidate(candidate, x) square := new(fiat.P521Element).Square(candidate) if square.Equal(x) != 1 { return false } e.Set(candidate) return true } // p521SqrtCandidate sets z to a square root candidate for x. z and x must not overlap. func p521SqrtCandidate(z, x *fiat.P521Element) { // Since p = 3 mod 4, exponentiation by (p + 1) / 4 yields a square root candidate. // // The sequence of 0 multiplications and 519 squarings is derived from the // following addition chain generated with github.com/mmcloughlin/addchain v0.4.0. // // return 1 << 519 // z.Square(x) for s := 1; s < 519; s++ { z.Square(z) } }