From c2af5c577ca7313b62fced7b8bd613ae022ffa6e Mon Sep 17 00:00:00 2001 From: Alberto Centelles Date: Mon, 2 Dec 2019 16:24:10 +0000 Subject: [PATCH] Tex (#17) * Start translating equations * Rendered TeX expressions in 7e61aca3bc783410d4a1d2c5b95dc7fedcfb241b * Display equations * Rendered TeX expressions in e71de0f131a064012fc72f93ead4af1b52b16e2c * Tate pairing * Rendered TeX expressions in d0bd9c8e8d8242cdf4bd5ebcb7775a1c444c2441 * Fix $ in code * Rendered TeX expressions in c020db97f6c3788b34201bcfe90799cf088d9b47 * First paragraph * Rendered TeX expressions in fd29944a0602bd378c7587b2c8df6d5863dbdb0f * Seccond paragraph * Rendered TeX expressions in ce31e0b5b3f75024c70b9f41a22d2ad3944889af * Fix $ typos * Rendered TeX expressions in 96b77b78c69dd69385c702680b6118ef2985d5e1 * Fix $ typo * Rendered TeX expressions in 63d90bccc89651f26de01ea1fe071fac47b4459d * Update readme with tex * Rendered TeX expressions in 1a2e1745caff0ba0a6d099dae07c9d9bbf7dd62c * Update ci dockerfile with latest stack resolver * Update build image version * Update go version * Satisfy vector-algorithms requirements in ci --- README.md | 90 +- README.tex.md | 194 ++ ci/Dockerfile | 12 +- cloudbuild.yaml | 2 +- stack.yaml | 3 +- stack.yaml.lock | 68 +- tex/00f3d44f5d125d1ac151db5a18ec3176.svg | 27 + tex/0582678783a97ba6dff05ad4614486ae.svg | 23 + tex/07556c07e775ab96ece5eeca39d1cc6e.svg | 41 + tex/0bc31dc06fb3dadf20c94db3afdb694a.svg | 9 + tex/0cd4c14307108486c8467c666f1795b9.svg | 37 + tex/0e0fff175b21e36dc5c4cae2cb36897c.svg | 11 + tex/0f3f091e62e5f23978d35d57e9ffa0d7.svg | 23 + tex/1257a6bc550c7d68505b01b9e2b12973.svg | 41 + tex/16550160480e99b79b926819fb336057.svg | 15 + tex/1731829083b505dd9e8bb76ad82713e9.svg | 69 + tex/180a0168ede334d7194e131ce713db21.svg | 19 + tex/18a9f2daec464974aa71a0bf68b65a69.svg | 72 + tex/1afcdb0f704394b16fe85fb40c45ca7a.svg | 9 + tex/2251a9d3343a83c0576a5089480d43eb.svg | 11 + tex/23b4158364c14544d3596342fa90ebd1.svg | 31 + tex/2a22431e7d5584f23ad0310bca6559db.svg | 61 + tex/2ad9d098b937e46f9f58968551adac57.svg | 9 + tex/3093e040c1e57a2bcffbf82b5bbf0ec1.svg | 21 + tex/325959111b8ba6bc4eeca7eebcb4f069.svg | 27 + tex/38cc8ce79b80e8841913faea495c1a49.svg | 192 ++ tex/3cf4fbd05970446973fc3d9fa3fe3c41.svg | 9 + tex/417a5301693b60807fa658e5ef9f9535.svg | 9 + tex/44bc9d542a92714cac84e01cbbb7fd61.svg | 9 + tex/4bdc8d9bcfb35e1c9bfb51fc69687dfc.svg | 9 + tex/4e4e9e48c57d8466e7e08e7c4ebe508d.svg | 15 + tex/5303376aa33129a68bbd6097d8dd83cf.svg | 23 + tex/576e746a0393b22f7cb2b97c31028d75.svg | 48 + tex/57eb5a87bd0a02676d91a2ef9eab143d.svg | 17 + tex/5c5ef5e5fc74e6564ce35724c53f04d3.svg | 64 + tex/607aa17062a31ff61e3cc1c93cc1c54c.svg | 24 + tex/63bb9849783d01d91403bc9a5fea12a2.svg | 9 + tex/67954e1aad57fcf338705441abb00abe.svg | 31 + tex/732ed93a5ff71133677429d72cb7556b.svg | 13 + tex/7389b1fbd05eef717998c1aab5b4a1aa.svg | 13 + tex/75a6f6cc0746242086a7f394fbd9297b.svg | 36 + tex/80b2c95f69ac5dd580383297069098dc.svg | 13 + tex/82fe41333ac19f47e8ab380aef250c84.svg | 27 + tex/8409cecadf19745123272729a965e4d7.svg | 11 + tex/8431cd7e7abbe9867faa9394120816af.svg | 26 + tex/86b1bc83cd4a9811c713ebfaa39926b9.svg | 17 + tex/89f2e0d2d24bcf44db73aab8fc03252c.svg | 9 + tex/8a239a22eaa3b75f31f7ca91114761bf.svg | 15 + tex/8cd34385ed61aca950a6b06d09fb50ac.svg | 9 + tex/9065752c9bc4848759fa7b3ec2b823e6.svg | 17 + tex/91b8920a5e4e5a0c39082fe1326ef121.svg | 13 + tex/934aebfe0542c0b82cd08ffe1c7e4cc9.svg | 63 + tex/93dbbc26f21ac41f18471eb4398429bb.svg | 19 + tex/979bdabe617751b6bd174b74164006bc.svg | 42 + tex/a158a43ace9779e0a6109b3c9f9df93d.svg | 9 + tex/a2fca638511f2569aa770d2f55ddbd38.svg | 48 + tex/a8fa96013baa8aef490c7dd5e656f95c.svg | 29 + tex/aa2189a333b8244a7ff28e979414838d.svg | 25 + tex/aed9ea8527d888f965c132c2b47cfc2f.svg | 22 + tex/b01bf40549686b772ea80e93f43fa41a.svg | 13 + tex/b5618eaa407bf223761d20cc793c9a92.svg | 27 + tex/b753af639cc1277ae30e8a4e3b25343e.svg | 24 + tex/b7707db8fc92965efd729ad2cf48ef19.svg | 20 + tex/baaccbfbf8339cdf5809bac3564ee664.svg | 11 + tex/c0ef67b62c66b541c81467e7b3e3dc2c.svg | 9 + tex/c1ca73cfcd2edc0de684ad0f85b41b79.svg | 11 + tex/caff3f0c7c8d34853f77a22381f40cf2.svg | 11 + tex/cc7ec45cd96d0abf539613b130791bf0.svg | 13 + tex/ceeb1cab27d4d17c8de57054bd6e7d5d.svg | 3366 ++++++++++++++++++++++ tex/d5c18a8ca1894fd3a7d25f242cbe8890.svg | 9 + tex/d72d3ec62eb390272bc7b3516a1cac9a.svg | 29 + tex/db1792343c4e68f6025271b59ac7929a.svg | 28 + tex/dcc4adebc2e1ab07f184a615f1067ff2.svg | 48 + tex/df5a289587a2f0247a5b97c1e8ac58ca.svg | 9 + tex/e7f497036b4c2ae6d2e022a8a456e8bd.svg | 11 + tex/e85e4bd93fd59c6cc6f6459be9b6d02b.svg | 42 + tex/ec2f196eb05ace7dafb92181f3299ab2.svg | 13 + tex/f1fa149eaf21295923f0a8b4c9abed5e.svg | 41 + tex/f525594c8e171d462049b1262d21a0b0.svg | 54 + tex/f54fda966e3f2e98add602c148211f46.svg | 28 + tex/f75236ae06b6ef3048a3da7bcc241f75.svg | 26 + tex/fd4f50056fd1a09fd9fe4a27d0b0a084.svg | 48 + tex/fd92a53167b3c6ae9574071613d555dc.svg | 13 + 83 files changed, 5681 insertions(+), 83 deletions(-) create mode 100644 README.tex.md create mode 100644 tex/00f3d44f5d125d1ac151db5a18ec3176.svg create mode 100644 tex/0582678783a97ba6dff05ad4614486ae.svg create mode 100644 tex/07556c07e775ab96ece5eeca39d1cc6e.svg create mode 100644 tex/0bc31dc06fb3dadf20c94db3afdb694a.svg create mode 100644 tex/0cd4c14307108486c8467c666f1795b9.svg create mode 100644 tex/0e0fff175b21e36dc5c4cae2cb36897c.svg create mode 100644 tex/0f3f091e62e5f23978d35d57e9ffa0d7.svg create mode 100644 tex/1257a6bc550c7d68505b01b9e2b12973.svg create mode 100644 tex/16550160480e99b79b926819fb336057.svg create mode 100644 tex/1731829083b505dd9e8bb76ad82713e9.svg create mode 100644 tex/180a0168ede334d7194e131ce713db21.svg create mode 100644 tex/18a9f2daec464974aa71a0bf68b65a69.svg create mode 100644 tex/1afcdb0f704394b16fe85fb40c45ca7a.svg create mode 100644 tex/2251a9d3343a83c0576a5089480d43eb.svg create mode 100644 tex/23b4158364c14544d3596342fa90ebd1.svg create mode 100644 tex/2a22431e7d5584f23ad0310bca6559db.svg create mode 100644 tex/2ad9d098b937e46f9f58968551adac57.svg create mode 100644 tex/3093e040c1e57a2bcffbf82b5bbf0ec1.svg create mode 100644 tex/325959111b8ba6bc4eeca7eebcb4f069.svg create mode 100644 tex/38cc8ce79b80e8841913faea495c1a49.svg create mode 100644 tex/3cf4fbd05970446973fc3d9fa3fe3c41.svg create mode 100644 tex/417a5301693b60807fa658e5ef9f9535.svg create mode 100644 tex/44bc9d542a92714cac84e01cbbb7fd61.svg create mode 100644 tex/4bdc8d9bcfb35e1c9bfb51fc69687dfc.svg create mode 100644 tex/4e4e9e48c57d8466e7e08e7c4ebe508d.svg create mode 100644 tex/5303376aa33129a68bbd6097d8dd83cf.svg create mode 100644 tex/576e746a0393b22f7cb2b97c31028d75.svg create mode 100644 tex/57eb5a87bd0a02676d91a2ef9eab143d.svg create mode 100644 tex/5c5ef5e5fc74e6564ce35724c53f04d3.svg create mode 100644 tex/607aa17062a31ff61e3cc1c93cc1c54c.svg create mode 100644 tex/63bb9849783d01d91403bc9a5fea12a2.svg create mode 100644 tex/67954e1aad57fcf338705441abb00abe.svg create mode 100644 tex/732ed93a5ff71133677429d72cb7556b.svg create mode 100644 tex/7389b1fbd05eef717998c1aab5b4a1aa.svg create mode 100644 tex/75a6f6cc0746242086a7f394fbd9297b.svg create mode 100644 tex/80b2c95f69ac5dd580383297069098dc.svg create mode 100644 tex/82fe41333ac19f47e8ab380aef250c84.svg create mode 100644 tex/8409cecadf19745123272729a965e4d7.svg create mode 100644 tex/8431cd7e7abbe9867faa9394120816af.svg create mode 100644 tex/86b1bc83cd4a9811c713ebfaa39926b9.svg create mode 100644 tex/89f2e0d2d24bcf44db73aab8fc03252c.svg create mode 100644 tex/8a239a22eaa3b75f31f7ca91114761bf.svg create mode 100644 tex/8cd34385ed61aca950a6b06d09fb50ac.svg create mode 100644 tex/9065752c9bc4848759fa7b3ec2b823e6.svg create mode 100644 tex/91b8920a5e4e5a0c39082fe1326ef121.svg create mode 100644 tex/934aebfe0542c0b82cd08ffe1c7e4cc9.svg create mode 100644 tex/93dbbc26f21ac41f18471eb4398429bb.svg create mode 100644 tex/979bdabe617751b6bd174b74164006bc.svg create mode 100644 tex/a158a43ace9779e0a6109b3c9f9df93d.svg create mode 100644 tex/a2fca638511f2569aa770d2f55ddbd38.svg create mode 100644 tex/a8fa96013baa8aef490c7dd5e656f95c.svg create mode 100644 tex/aa2189a333b8244a7ff28e979414838d.svg create mode 100644 tex/aed9ea8527d888f965c132c2b47cfc2f.svg create mode 100644 tex/b01bf40549686b772ea80e93f43fa41a.svg create mode 100644 tex/b5618eaa407bf223761d20cc793c9a92.svg create mode 100644 tex/b753af639cc1277ae30e8a4e3b25343e.svg create mode 100644 tex/b7707db8fc92965efd729ad2cf48ef19.svg create mode 100644 tex/baaccbfbf8339cdf5809bac3564ee664.svg create mode 100644 tex/c0ef67b62c66b541c81467e7b3e3dc2c.svg create mode 100644 tex/c1ca73cfcd2edc0de684ad0f85b41b79.svg create mode 100644 tex/caff3f0c7c8d34853f77a22381f40cf2.svg create mode 100644 tex/cc7ec45cd96d0abf539613b130791bf0.svg create mode 100644 tex/ceeb1cab27d4d17c8de57054bd6e7d5d.svg create mode 100644 tex/d5c18a8ca1894fd3a7d25f242cbe8890.svg create mode 100644 tex/d72d3ec62eb390272bc7b3516a1cac9a.svg create mode 100644 tex/db1792343c4e68f6025271b59ac7929a.svg create mode 100644 tex/dcc4adebc2e1ab07f184a615f1067ff2.svg create mode 100644 tex/df5a289587a2f0247a5b97c1e8ac58ca.svg create mode 100644 tex/e7f497036b4c2ae6d2e022a8a456e8bd.svg create mode 100644 tex/e85e4bd93fd59c6cc6f6459be9b6d02b.svg create mode 100644 tex/ec2f196eb05ace7dafb92181f3299ab2.svg create mode 100644 tex/f1fa149eaf21295923f0a8b4c9abed5e.svg create mode 100644 tex/f525594c8e171d462049b1262d21a0b0.svg create mode 100644 tex/f54fda966e3f2e98add602c148211f46.svg create mode 100644 tex/f75236ae06b6ef3048a3da7bcc241f75.svg create mode 100644 tex/fd4f50056fd1a09fd9fe4a27d0b0a084.svg create mode 100644 tex/fd92a53167b3c6ae9574071613d555dc.svg diff --git a/README.md b/README.md index 4443afc..2acc937 100644 --- a/README.md +++ b/README.md @@ -8,28 +8,30 @@ Implementation of the Barreto-Naehrig (BN) curve construction from [[BCTV2015]](https://eprint.iacr.org/2013/879.pdf) to provide two cyclic groups -**G1** and **G2**, with an efficient bilinear pairing: + and , with an efficient bilinear pairing: -*e: G1 × G2 → GT* +

# Pairing -Let G1, G2 and GT be abelian groups of prime order `q` and let `g` and `h` elements of G1 and G2 respectively . A pairing is a non-degenerate bilinear map e: G1 × G2 → GT. +Let , and be abelian groups of prime order and let and elements of and respectively . +A pairing is a non-degenerate bilinear map . This bilinearity property is what makes pairings such a powerful primitive in cryptography. It satisfies: -- e(g1 + g2, h) = e(g1, h) e(g2, h) -- e(g, h1 + h2) = e(g, h1) e(g, h2) +* +* The non-degeneracy property guarantees non-trivial pairings for non-trivial arguments. In other words, being non-degenerate means that: -- ∀ g ≠ 1, ∃ hi ∈ G2 such that e(g, hi) ≠ 1 -- ∀ h ≠ 1, ∃ gi ∈ G1 such that e(gi, h) ≠ 1 -An example of a pairing would be the scalar product on euclidean space <.> : Rn × Rn → R +* such that +* such that + +An example of a pairing would be the scalar product on euclidean space . ## Example Usage -A simple example of calculating the optimal ate pairing given two points in G1 and G2. +A simple example of calculating the optimal ate pairing given two points in and . ```haskell import Protolude @@ -57,13 +59,13 @@ q = A main :: IO () main = do putText "P:" - print $ p + print p putText "Q:" - print $ q + print q putText "e(P, Q):" - print $ pairing p q + print (pairing p q) putText "e(P, Q) is bilinear:" - print $ pairing (mul' p a) (mul' q b) == pow (pairing p q) (a * b) + print (pairing (mul' p a) (mul' q b) == pow (pairing p q) (a * b)) where a = 2 :: Int b = 3 :: Int @@ -75,32 +77,38 @@ Pairings are used in encryption algorithms, such as identity-based encryption (I ## Admissible Pairings -A pairing `e` is called admissible pairing if it is efficiently computable. The only admissible pairings that are suitable for cryptography are the Weil and Tate pairings on algebraic curves and their variants. Let `r` be the order of a group and E[r] be the entire group of points of order `r` on E(Fq). E[r] is called the r-torsion and is defined as E[r] = { P ∈ E(Fq) | rP = O }. Both Weil and Tate pairings require that `P` and `Q` come from disjoint cyclic subgroups of the same prime order `r`. Lagrange's theorem states that for any finite group `G`, the order (number of elements) of every subgroup `H` of `G` divides the order of `G`. Therefore, r | #E(Fq). +A pairing is called admissible pairing if it is efficiently computable. The only admissible pairings that are suitable for cryptography are the Weil and Tate pairings on algebraic curves and their variants. Let be the order of a group and be the entire group of points of order on . is called the r-torsion and is defined as . Both Weil and Tate pairings require that and come from disjoint cyclic subgroups of the same prime order . Lagrange's theorem states that for any finite group , the order (number of elements) of every subgroup of divides the order of . Therefore, . + + and are subgroups of a group defined in an elliptic curve over an extension of a finite field , namely , where is the characteristic of the field and is a positive integer called embedding degree. -G1 and G2 are subgroups of a group defined in an elliptic curve over an extension of a finite field Fq, namely E(Fqk), where `q` is the characteristic of the field and `k` is a positive integer called embedding degree. +The embedding degree plays a crucial role in pairing cryptography: -The embedding degree `k` plays a crucial role in pairing cryptography: -- It's the value that makes Fqk be the smallest extension of Fq such that E(Fqk) captures more points of order `r`. -- It's the minimal value that holds r | (qk - 1). -- It's the smallest positive integer such that E[r] ⊂ E(Fqk) +- It's the value that makes be the smallest extension of such that captures more points of order . +- It's the minimal value that holds . +- It's the smallest positive integer such that . -There are subtle but relevant differences in G1 and G2 subgroups depending on the type of pairing. Nowadays, all of the state-of-the-art implementations of pairings take place on ordinary curves and assume a type of pairing (Type 3) where G1 = E[r] ∩ Ker(π - [1]) and G2 = E[r] ∩ Ker(π - [q]) and there is no non-trivial map φ: G2 → G1. +There are subtle but relevant differences in and subgroups depending on the type of pairing. Nowadays, all of the state-of-the-art implementations of pairings take place on ordinary curves and assume a type of pairing (Type 3) where and and there is no non-trivial map . ## Tate Pairing The Tate pairing is a map: -tr : E(Fqk)[r] × E(Fqk) / rE(Fqk) → F*qk / (F*qk)r +

defined as: -tr(P, Q) = f(Q) +

-where P ∈ E(Fqk)[r], Q is any representative in a equivalence class in E(Fqk) / rE(Fqk) and F*qk / (F*qk)r is the set of equivalence classes of F*qk under the equivalence relation a ≡ b iff a / b ∈ (F*qk)r. The equivalence relation in the output of the Tate pairing is unfortunate. In cryptography, different parties must compute the same value under the bilinearity property. +where , is any representative in a equivalence +class in and is the set of +equivalence classes of under the +equivalence relation . The equivalence +relation in the output of the Tate pairing is unfortunate. In cryptography, +different parties must compute the same value under the bilinearity property. -The reduced Tate pairing solves this undesirable property by exponentiating elements in F*qk / (F*qk)r to the power of (qk - 1) / r. It maps all elements in an equivalence class to the same value. It is defined as: +The reduced Tate pairing solves this undesirable property by exponentiating elements in to the power of . It maps all elements in an equivalence class to the same value. It is defined as: -Tr(P, Q) = tr(P, Q)#Fqk / r = fr,P(Q)(qk - 1) / r. +. When we say Tate pairing, we normally mean the reduced Tate pairing. @@ -108,15 +116,29 @@ When we say Tate pairing, we normally mean the reduced Tate pairing. Tate pairings use Miller's algorithm, which is essentially the double-and-add algorithm for elliptic curve point multiplication combined with evaluation of the functions used in the addition process. Miller's algorithm remains the fastest algorithm for computing pairings to date. -Both G1 and G2 are elliptic curve groups. GT is a multiplicative subgroup of a finite field. The security an elliptic curve group offers per bit is considerably greater than the security a finite field does. In order to achieve security comparable to 128-bit security (AES-128), an elliptic curve of 256 bits will suffice, while we need a finite field of 3248 bits. The aim of a cryptographic protocol is to achieve the highest security degree with the smallest signature size, which normally leads to a more efficient computation. In pairing cryptography, significant improvements can be made by keeping all three group sizes the same. It is possible to find elliptic curves over a field Fq whose largest prime order subgroup `r` has the same bit-size as the characteristic of the field `q`. The ratio between the field size `q` and the large prime group order `r` is called the φ-value. It is an important value that indicates how much (ECDLP) security a curve offers for its field size. φ=1 is the optimal value. The Barreto-Naehrig (BN) family of curves all have φ=1 and k=12. They are perfectly suited to the 128-bit security level. - -Most operations in pairings happen in the extension field Fqk. The larger k gets, the more complex Fqk becomes and the more computationally expensive the pairing becomes. The complexity of Miller's algorithm heavily depends on the complexity of the associated Fqk-arithmetic. Therefore, the aim is to minimize the cost of arithmetic in Fqk. - -It is possible to construct an extension of a field Fqk by successively towering up intermediate fields Fqa and Fqb such that k = a^i b^j, where a and b are usually 2 and 3. One of the reasons tower extensions work is that quadratic and cubic extensions (Fq2 and Fq3) offer methods of performing arithmetic more efficiently. - -Miller's algorithm in the Tate pairing iterates as far as the prime group order `r`, which is a large number in cryptography. The ate pairing comes up as an optimization of the Tate pairing by shortening Miller's loop. It achieves a much shorter loop of length T = t - 1 on an ordinary curve, where t is the trace of the Frobenius endomorphism. The ate pairing is defined as: - -at(Q,P) = fr,Q(P)(qk - 1) / r +Both and are elliptic curve groups. +is a multiplicative subgroup of a finite field. The security an elliptic curve +group offers per bit is considerably greater than the security a finite field +does. In order to achieve security comparable to 128-bit security (AES-128), an +elliptic curve of 256 bits will suffice, while we need a finite field of 3248 +bits. The aim of a cryptographic protocol is to achieve the highest security +degree with the smallest signature size, which normally leads to a more +efficient computation. In pairing cryptography, significant improvements can be +made by keeping all three group sizes the same. It is possible to find elliptic +curves over a field whose largest prime order subgroup has the +same bit-size as the characteristic of the field . The ratio between the +field size and the large prime group order is called the -value. It is an important value that indicates how much (ECDLP) security a +curve offers for its field size. is the optimal value. The Barreto-Naehrig +(BN) family of curves all have and . They are perfectly suited to the +128-bit security level. + +Most operations in pairings happen in the extension field . The larger gets, the more complex becomes and the more computationally expensive the pairing becomes. The complexity of Miller's algorithm heavily depends on the complexity of the associated -arithmetic. Therefore, the aim is to minimize the cost of arithmetic in . + +It is possible to construct an extension of a field by successively towering up intermediate fields and such that , where and are usually 2 and 3. One of the reasons tower extensions work is that quadratic and cubic extensions ( and ) offer methods of performing arithmetic more efficiently. + +Miller's algorithm in the Tate pairing iterates as far as the prime group order , which is a large number in cryptography. The ate pairing comes up as an optimization of the Tate pairing by shortening Miller's loop. It achieves a much shorter loop of length on an ordinary curve, where t is the trace of the Frobenius endomorphism. The ate pairing is defined as: + +

## Implementation diff --git a/README.tex.md b/README.tex.md new file mode 100644 index 0000000..687ffd3 --- /dev/null +++ b/README.tex.md @@ -0,0 +1,194 @@ +

+ + Adjoint Logo + +

+ +[![Hackage](https://img.shields.io/hackage/v/pairing.svg)](https://hackage.haskell.org/package/pairing) + +Implementation of the Barreto-Naehrig (BN) curve construction from +[[BCTV2015]](https://eprint.iacr.org/2013/879.pdf) to provide two cyclic groups +$\mathbb{G}_1$ and $\mathbb{G}_2$, with an efficient bilinear pairing: + +$$ +e: \mathbb{G}_1 \times \mathbb{G}_2 \rightarrow \mathbb{G}_T +$$ + +# Pairing + +Let $\mathbb{G}_1$, $\mathbb{G}_2$ and $\mathbb{G}_T$ be abelian groups of prime order $q$ and let $g$ and $h$ elements of $\mathbb{G}_1$ and $\mathbb{G}_2$ respectively . +A pairing is a non-degenerate bilinear map $e: \mathbb{G}_1 \times \mathbb{G}_2 \rightarrow \mathbb{G}_T$. + +This bilinearity property is what makes pairings such a powerful primitive in cryptography. It satisfies: + +* $e(g_1+g_2,h) = e(g_1,h) e(g_2, h)$ +* $e(g,h_1+h_2) = e(g, h_1) e(g, h_2)$ + +The non-degeneracy property guarantees non-trivial pairings for non-trivial arguments. In other words, being non-degenerate means that: + +* $\forall g \neq 1, \exists h_i \in \mathbb{G}_2$ such that $e(g,h_i) \neq 1$ +* $\forall h \neq 1, \exists g_i \in \mathbb{G}_1$ such that $e(g_i,h) \neq 1$ + +An example of a pairing would be the scalar product on euclidean space $\langle . \rangle : \mathbb{R}^n \times \mathbb{R}^n \rightarrow \mathbb{R}$. + +## Example Usage + +A simple example of calculating the optimal ate pairing given two points in $\mathbb{G}_1$ and $\mathbb{G}_2$. + +```haskell +import Protolude + +import Data.Group (pow) +import Data.Curve.Weierstrass (Point(A), mul') + +import Data.Pairing.BN254 (BN254, G1, G2, pairing) + +p :: G1 BN254 +p = A + 1368015179489954701390400359078579693043519447331113978918064868415326638035 + 9918110051302171585080402603319702774565515993150576347155970296011118125764 + + +q :: G2 BN254 +q = A + [2725019753478801796453339367788033689375851816420509565303521482350756874229 + ,7273165102799931111715871471550377909735733521218303035754523677688038059653 + ] + [2512659008974376214222774206987427162027254181373325676825515531566330959255 + ,957874124722006818841961785324909313781880061366718538693995380805373202866 + ] + +main :: IO () +main = do + putText "P:" + print p + putText "Q:" + print q + putText "e(P, Q):" + print (pairing p q) + putText "e(P, Q) is bilinear:" + print (pairing (mul' p a) (mul' q b) == pow (pairing p q) (a * b)) + where + a = 2 :: Int + b = 3 :: Int +``` + +## Pairings in cryptography + +Pairings are used in encryption algorithms, such as identity-based encryption (IBE), attribute-based encryption (ABE), (inner-product) predicate encryption, short broadcast encryption and searchable encryption, among others. It allows strong encryption with small signature sizes. + +## Admissible Pairings + +A pairing $e$ is called admissible pairing if it is efficiently computable. The only admissible pairings that are suitable for cryptography are the Weil and Tate pairings on algebraic curves and their variants. Let $r$ be the order of a group and $E[r]$ be the entire group of points of order $r$ on $E(\mathbb{F}_q)$. $E[r]$ is called the r-torsion and is defined as $E[r] = \{ P \in E(\mathbb{F}_q) | rP = O \}$. Both Weil and Tate pairings require that $P$ and $Q$ come from disjoint cyclic subgroups of the same prime order $r$. Lagrange's theorem states that for any finite group $\mathbb{G}$, the order (number of elements) of every subgroup $\mathbb{H}$ of $\mathbb{G}$ divides the order of $\mathbb{G}$. Therefore, $r | \#E(\mathbb{F}_q)$. + +$\mathbb{G}_1$ and $\mathbb{G}_2$ are subgroups of a group defined in an elliptic curve over an extension of a finite field $\mathbb{F}_q$, namely $E(\mathbb{F}_{q^k})$, where $q$ is the characteristic of the field and $k$ is a positive integer called embedding degree. + +The embedding degree $k$ plays a crucial role in pairing cryptography: + +- It's the value that makes $\mathbb{F}_{q^k}$ be the smallest extension of $\mathbb{F}_q$ such that $E(\mathbb{F}_{q^k})$ captures more points of order $r$. +- It's the minimal value that holds $r | (q^k - 1)$. +- It's the smallest positive integer such that $E[r] \subset E(\mathbb{F}_{q^k})$. + +There are subtle but relevant differences in $\mathbb{G}_1$ and $\mathbb{G}_2$ subgroups depending on the type of pairing. Nowadays, all of the state-of-the-art implementations of pairings take place on ordinary curves and assume a type of pairing (Type 3) where $\mathbb{G}_1 = E[r] \cap \text{Ker}(\pi - [1])$ and $\mathbb{G}_2 = E[r] \cap \text{Ker}(\pi - [q])$ and there is no non-trivial map $\Phi: \mathbb{G}_2 \rightarrow \mathbb{G}_1$. + +## Tate Pairing + +The Tate pairing is a map: + +$$ +\text{tr} : E(\mathbb{F}_{q^k})[r] \times E(\mathbb{F}_{q^k}) / r E(\mathbb{F}_{q^k}) \rightarrow \mathbb{F}^{\star}_{q^k} / (\mathbb{F}^{\star}_{q^k})^r +$$ + +defined as: + +$$ +\text{tr}(P, Q) = f(Q) +$$ + +where $P \in E(\mathbb{F}_{q^k})[r]$, $Q$ is any representative in a equivalence +class in $E(\mathbb{F}_{q^k}) / rE(\mathbb{F}_{q^k})$ and $\mathbb{F}_{q^k}^{\ast} / (\mathbb{F}_{q^k}^{\ast})^r$ is the set of +equivalence classes of $\mathbb{F}_{q^k}^{\ast}$ under the +equivalence relation $a \equiv b \iff a / b \in (\mathbb{F}_{q^k}^{\ast})^r$. The equivalence +relation in the output of the Tate pairing is unfortunate. In cryptography, +different parties must compute the same value under the bilinearity property. + +The reduced Tate pairing solves this undesirable property by exponentiating elements in $\mathbb{F}_{q^k}^{\ast} / (\mathbb{F}_{q^k}^{\ast})^r$ to the power of $(q^k - 1) / r$. It maps all elements in an equivalence class to the same value. It is defined as: + +$\text{Tr}(P, Q) = \text{tr}(P, Q)^{\#\mathbb{F}_{q^k / r}} = f_{r,P}(D_Q)^{(q^k - 1) / r}$. + +When we say Tate pairing, we normally mean the reduced Tate pairing. + +## Pairing optimization + +Tate pairings use Miller's algorithm, which is essentially the double-and-add algorithm for elliptic curve point multiplication combined with evaluation of the functions used in the addition process. Miller's algorithm remains the fastest algorithm for computing pairings to date. + +Both $\mathbb{G}_1$ and $\mathbb{G}_2$ are elliptic curve groups. $\mathbb{G}_T$ +is a multiplicative subgroup of a finite field. The security an elliptic curve +group offers per bit is considerably greater than the security a finite field +does. In order to achieve security comparable to 128-bit security (AES-128), an +elliptic curve of 256 bits will suffice, while we need a finite field of 3248 +bits. The aim of a cryptographic protocol is to achieve the highest security +degree with the smallest signature size, which normally leads to a more +efficient computation. In pairing cryptography, significant improvements can be +made by keeping all three group sizes the same. It is possible to find elliptic +curves over a field $\mathbb{F}_q$ whose largest prime order subgroup $r$ has the +same bit-size as the characteristic of the field $q$. The ratio between the +field size $q$ and the large prime group order $r$ is called the $\varphi$-value. It is an important value that indicates how much (ECDLP) security a +curve offers for its field size. $\varphi=1$ is the optimal value. The Barreto-Naehrig +(BN) family of curves all have $\varphi=1$ and $k=12$. They are perfectly suited to the +128-bit security level. + +Most operations in pairings happen in the extension field $\mathbb{F}_{q^k}$. The larger $k$ gets, the more complex $\mathbb{F}_{q^k}$ becomes and the more computationally expensive the pairing becomes. The complexity of Miller's algorithm heavily depends on the complexity of the associated $\mathbb{F}_{q^k}$-arithmetic. Therefore, the aim is to minimize the cost of arithmetic in $\mathbb{F}_{q^k}$. + +It is possible to construct an extension of a field $\mathbb{F}_{q^k}$ by successively towering up intermediate fields $\mathbb{F}_{q^a}$ and $\mathbb{F}_{q^b}$ such that $k = a^i b^j$, where $a$ and $b$ are usually 2 and 3. One of the reasons tower extensions work is that quadratic and cubic extensions ($\mathbb{F}_{q^2}$ and $\mathbb{F}_{q^3}$) offer methods of performing arithmetic more efficiently. + +Miller's algorithm in the Tate pairing iterates as far as the prime group order $r$, which is a large number in cryptography. The ate pairing comes up as an optimization of the Tate pairing by shortening Miller's loop. It achieves a much shorter loop of length $T = t - 1$ on an ordinary curve, where t is the trace of the Frobenius endomorphism. The ate pairing is defined as: + +$$ +\text{at}(Q,P) = f_{r,Q}(P)^{(q^k-1)/r} +$$ + +## Implementation + +We have implemented a polymorphic optimal ate pairing over the following pairing-friendly elliptic curves: + +* Barreto-Lynn-Scott degree 12 curves + * [BLS12381](src/Data/Pairing/BLS12381.hs) +* Barreto-Naehrig curves + * [BN254](src/Data/Pairing/BN254.hs) + * [BN254A](src/Data/Pairing/BN254A.hs) + * [BN254B](src/Data/Pairing/BN254B.hs) + * [BN254C](src/Data/Pairing/BN254C.hs) + * [BN254D](src/Data/Pairing/BN254D.hs) + * [BN462](src/Data/Pairing/BN462.hs) + +A more detailed documentation on their domain parameters can be found in our [elliptic curve library](https://github.com/adjoint-io/elliptic-curve). + +## Disclaimer + +This is experimental code meant for research-grade projects only. Please do not +use this code in production until it has matured significantly. + +## License + +``` +Copyright (c) 2018-2019 Adjoint Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. +``` diff --git a/ci/Dockerfile b/ci/Dockerfile index f0f823c..03478e8 100644 --- a/ci/Dockerfile +++ b/ci/Dockerfile @@ -1,6 +1,6 @@ # Base image for Google Cloud Build build steps. -FROM fpco/stack-build:lts-13.19 +FROM fpco/stack-build:lts-14.16 ENTRYPOINT [] @@ -8,13 +8,13 @@ ENTRYPOINT [] ADD https://packages.cloud.google.com/apt/doc/apt-key.gpg google-apt-key.gpg RUN \ echo "deb http://packages.cloud.google.com/apt cloud-sdk-stretch main" \ - > /etc/apt/sources.list.d/google-cloud-sdk.list && \ + > /etc/apt/sources.list.d/google-cloud-sdk.list && \ apt-key add google-apt-key.gpg && \ apt-get update -yqq && \ apt-get -yq --no-install-recommends install \ - build-essential zip unzip rpm \ - openssh-client expat libexpat1-dev xz-utils \ - google-cloud-sdk && \ + build-essential zip unzip rpm \ + openssh-client expat libexpat1-dev xz-utils \ + google-cloud-sdk && \ rm -rf /var/lib/apt/lists/* RUN stack upgrade @@ -26,7 +26,7 @@ RUN \ rm docker.tgz # Install go set GOPATH etc -ADD https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz go.tar.gz +ADD https://storage.googleapis.com/golang/go1.13.linux-amd64.tar.gz go.tar.gz RUN \ tar -xvf go.tar.gz && \ mv go /usr/local/ && \ diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 63b5af1..762092f 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,7 +1,7 @@ timeout: 3600s # Cache misses are slow to rebuild substitutions: # Bump the version if you make changes to `ci/Dockerfile - _BUILD_IMAGE: gcr.io/uplink-test-cluster-174313/pairing-ci:v1 + _BUILD_IMAGE: gcr.io/uplink-test-cluster-174313/pairing-ci:v2 options: machineType: N1_HIGHCPU_8 steps: diff --git a/stack.yaml b/stack.yaml index 0b493a2..df0dca4 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,6 +1,7 @@ -resolver: lts-14.7 +resolver: lts-14.16 extra-deps: - elliptic-curve-0.3.0 - galois-field-1.0.0 - poly-0.3.2.0 - semirings-0.5.1 + - vector-algorithms-0.8.0.3 diff --git a/stack.yaml.lock b/stack.yaml.lock index ce6fae9..b30e51e 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -5,57 +5,43 @@ packages: - completed: - hackage: semirings-0.5@sha256:d5f0420c38341675621c5c97882fbe9a22f19a01a4193ac31ff3ee186846527f,3882 + hackage: elliptic-curve-0.3.0@sha256:7d314ff56011de62370bdd1b840866d1e5ce061972e54be673f5768cbf8d3d42,7072 pantry-tree: - size: 610 - sha256: dcca3edd1d0215c68acc7c6d1a0bcb66ee260fce6300d3150949fc807890694d + size: 9500 + sha256: 650191792bfc8b119e8a0ab1103383ddfa395ed692573519c27cc3d198089cb5 original: - hackage: semirings-0.5 + hackage: elliptic-curve-0.3.0 - completed: - cabal-file: - size: 7082 - sha256: 70a766071eceb43801071f09dbfaf75d41e1786ff715587dac97e1797352985b - name: elliptic-curve - version: 0.2.2 - git: https://github.com/adjoint-io/elliptic-curve.git + hackage: galois-field-1.0.0@sha256:d44007898c07a6c913a38f78e7246c7785ae3052ca55ad713783345d06a28419,3470 pantry-tree: - size: 9817 - sha256: c2c64c8fca48ab690fbb9af3d607ed06e2cb32877bc57d62d988c03af93a9725 - commit: ac65f0d52272bd77213329702b85f2917b7e9cf4 + size: 1444 + sha256: 1b265e1c3062a06a48a535c1681a954c26bee5959a42e97fc0e4fd8b5a90849f original: - git: https://github.com/adjoint-io/elliptic-curve.git - commit: ac65f0d52272bd77213329702b85f2917b7e9cf4 + hackage: galois-field-1.0.0 - completed: - cabal-file: - size: 3428 - sha256: 88c551c06eb708578e96eb7eb919527897aa466daa389674ce376779d8b1a147 - name: galois-field - version: 0.4.1 - git: https://github.com/adjoint-io/galois-field.git + hackage: poly-0.3.2.0@sha256:58492507d2bfb74c2d45c34a61438153f3a5cfb658154a7a504cf4397eb39d6d,2028 pantry-tree: - size: 1784 - sha256: a30b67ed2ad051814fe7f651c8bf41ed18b56135515b67850cfddc74d55ec505 - commit: 84cccaaae8e30de2d29a8d5c2fdc208ced80391c + size: 1451 + sha256: fbd14e37c925471ae2eebf81b44f007a629f092e2754c2b3fe1045df6d4c4844 + original: + hackage: poly-0.3.2.0 +- completed: + hackage: semirings-0.5.1@sha256:597e4070dcb75c3e347566114e140ba343843f80f3e16a456bb2e9e9d1d09430,3743 + pantry-tree: + size: 610 + sha256: cc4e01176f1a56c97dc923416a6939dcdc004584cccf8a2b1c67bd156b31179a original: - git: https://github.com/adjoint-io/galois-field.git - commit: 84cccaaae8e30de2d29a8d5c2fdc208ced80391c + hackage: semirings-0.5.1 - completed: - cabal-file: - size: 1904 - sha256: 2da3870a31104d57a7103fa2abbc2c3b89204534f056cce8de113c67ad233378 - name: poly - version: 0.3.1.0 - git: https://github.com/adjoint-io/poly.git + hackage: vector-algorithms-0.8.0.3@sha256:477ef5ac82fdd28a39536ed0a767faec3425802827abee485be31db5bc6f5e90,3488 pantry-tree: - size: 1574 - sha256: 5dc4908d015e5527f22cf8f0f0620c87ef73a19def82d512890fc1888f45dcb0 - commit: 1eb5b7a820a685de7c07576e028dee332e3382f8 + size: 1439 + sha256: 9f04ef44c2459a122f2d5c093b4a9ebc47aaa00284a7bff9793fee7c6783f979 original: - git: https://github.com/adjoint-io/poly.git - commit: 1eb5b7a820a685de7c07576e028dee332e3382f8 + hackage: vector-algorithms-0.8.0.3 snapshots: - completed: - size: 498155 - url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/13/19.yaml - sha256: b9367a80d4393d02e58a46b8a9fdfbd7bc19f59c0c2bbf90034ba15cf52cf213 - original: lts-13.19 + size: 524804 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/14/16.yaml + sha256: 4d1519a4372d051d47a5eae2241cf3fb54e113d7475f89707ddb6ec06add2888 + original: lts-14.16 diff --git a/tex/00f3d44f5d125d1ac151db5a18ec3176.svg b/tex/00f3d44f5d125d1ac151db5a18ec3176.svg new file mode 100644 index 0000000..2a66f4f --- /dev/null +++ b/tex/00f3d44f5d125d1ac151db5a18ec3176.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/0582678783a97ba6dff05ad4614486ae.svg b/tex/0582678783a97ba6dff05ad4614486ae.svg new file mode 100644 index 0000000..51b519f --- /dev/null +++ b/tex/0582678783a97ba6dff05ad4614486ae.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/07556c07e775ab96ece5eeca39d1cc6e.svg b/tex/07556c07e775ab96ece5eeca39d1cc6e.svg new file mode 100644 index 0000000..eaa2a43 --- /dev/null +++ b/tex/07556c07e775ab96ece5eeca39d1cc6e.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/0bc31dc06fb3dadf20c94db3afdb694a.svg b/tex/0bc31dc06fb3dadf20c94db3afdb694a.svg new file mode 100644 index 0000000..51d4621 --- /dev/null +++ b/tex/0bc31dc06fb3dadf20c94db3afdb694a.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/0cd4c14307108486c8467c666f1795b9.svg b/tex/0cd4c14307108486c8467c666f1795b9.svg new file mode 100644 index 0000000..2422da5 --- /dev/null +++ b/tex/0cd4c14307108486c8467c666f1795b9.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/0e0fff175b21e36dc5c4cae2cb36897c.svg b/tex/0e0fff175b21e36dc5c4cae2cb36897c.svg new file mode 100644 index 0000000..bb9583b --- /dev/null +++ b/tex/0e0fff175b21e36dc5c4cae2cb36897c.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tex/0f3f091e62e5f23978d35d57e9ffa0d7.svg b/tex/0f3f091e62e5f23978d35d57e9ffa0d7.svg new file mode 100644 index 0000000..aa86ba8 --- /dev/null +++ b/tex/0f3f091e62e5f23978d35d57e9ffa0d7.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/1257a6bc550c7d68505b01b9e2b12973.svg b/tex/1257a6bc550c7d68505b01b9e2b12973.svg new file mode 100644 index 0000000..a531a87 --- /dev/null +++ b/tex/1257a6bc550c7d68505b01b9e2b12973.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/16550160480e99b79b926819fb336057.svg b/tex/16550160480e99b79b926819fb336057.svg new file mode 100644 index 0000000..be4a06b --- /dev/null +++ b/tex/16550160480e99b79b926819fb336057.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/1731829083b505dd9e8bb76ad82713e9.svg b/tex/1731829083b505dd9e8bb76ad82713e9.svg new file mode 100644 index 0000000..72a8a39 --- /dev/null +++ b/tex/1731829083b505dd9e8bb76ad82713e9.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/180a0168ede334d7194e131ce713db21.svg b/tex/180a0168ede334d7194e131ce713db21.svg new file mode 100644 index 0000000..962198d --- /dev/null +++ b/tex/180a0168ede334d7194e131ce713db21.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/18a9f2daec464974aa71a0bf68b65a69.svg b/tex/18a9f2daec464974aa71a0bf68b65a69.svg new file mode 100644 index 0000000..2db591b --- /dev/null +++ b/tex/18a9f2daec464974aa71a0bf68b65a69.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/1afcdb0f704394b16fe85fb40c45ca7a.svg b/tex/1afcdb0f704394b16fe85fb40c45ca7a.svg new file mode 100644 index 0000000..e383803 --- /dev/null +++ b/tex/1afcdb0f704394b16fe85fb40c45ca7a.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/2251a9d3343a83c0576a5089480d43eb.svg b/tex/2251a9d3343a83c0576a5089480d43eb.svg new file mode 100644 index 0000000..629e724 --- /dev/null +++ b/tex/2251a9d3343a83c0576a5089480d43eb.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tex/23b4158364c14544d3596342fa90ebd1.svg b/tex/23b4158364c14544d3596342fa90ebd1.svg new file mode 100644 index 0000000..2bf42bb --- /dev/null +++ b/tex/23b4158364c14544d3596342fa90ebd1.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/2a22431e7d5584f23ad0310bca6559db.svg b/tex/2a22431e7d5584f23ad0310bca6559db.svg new file mode 100644 index 0000000..60bd77b --- /dev/null +++ b/tex/2a22431e7d5584f23ad0310bca6559db.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/2ad9d098b937e46f9f58968551adac57.svg b/tex/2ad9d098b937e46f9f58968551adac57.svg new file mode 100644 index 0000000..ced4f2b --- /dev/null +++ b/tex/2ad9d098b937e46f9f58968551adac57.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/3093e040c1e57a2bcffbf82b5bbf0ec1.svg b/tex/3093e040c1e57a2bcffbf82b5bbf0ec1.svg new file mode 100644 index 0000000..9ff86a9 --- /dev/null +++ b/tex/3093e040c1e57a2bcffbf82b5bbf0ec1.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/325959111b8ba6bc4eeca7eebcb4f069.svg b/tex/325959111b8ba6bc4eeca7eebcb4f069.svg new file mode 100644 index 0000000..8c43ca7 --- /dev/null +++ b/tex/325959111b8ba6bc4eeca7eebcb4f069.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/38cc8ce79b80e8841913faea495c1a49.svg b/tex/38cc8ce79b80e8841913faea495c1a49.svg new file mode 100644 index 0000000..1ee5dc6 --- /dev/null +++ b/tex/38cc8ce79b80e8841913faea495c1a49.svg @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/3cf4fbd05970446973fc3d9fa3fe3c41.svg b/tex/3cf4fbd05970446973fc3d9fa3fe3c41.svg new file mode 100644 index 0000000..274e31a --- /dev/null +++ b/tex/3cf4fbd05970446973fc3d9fa3fe3c41.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/417a5301693b60807fa658e5ef9f9535.svg b/tex/417a5301693b60807fa658e5ef9f9535.svg new file mode 100644 index 0000000..c759e74 --- /dev/null +++ b/tex/417a5301693b60807fa658e5ef9f9535.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/44bc9d542a92714cac84e01cbbb7fd61.svg b/tex/44bc9d542a92714cac84e01cbbb7fd61.svg new file mode 100644 index 0000000..2753800 --- /dev/null +++ b/tex/44bc9d542a92714cac84e01cbbb7fd61.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/4bdc8d9bcfb35e1c9bfb51fc69687dfc.svg b/tex/4bdc8d9bcfb35e1c9bfb51fc69687dfc.svg new file mode 100644 index 0000000..8b2394c --- /dev/null +++ b/tex/4bdc8d9bcfb35e1c9bfb51fc69687dfc.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/4e4e9e48c57d8466e7e08e7c4ebe508d.svg b/tex/4e4e9e48c57d8466e7e08e7c4ebe508d.svg new file mode 100644 index 0000000..16984e9 --- /dev/null +++ b/tex/4e4e9e48c57d8466e7e08e7c4ebe508d.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/5303376aa33129a68bbd6097d8dd83cf.svg b/tex/5303376aa33129a68bbd6097d8dd83cf.svg new file mode 100644 index 0000000..ba86fc7 --- /dev/null +++ b/tex/5303376aa33129a68bbd6097d8dd83cf.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/576e746a0393b22f7cb2b97c31028d75.svg b/tex/576e746a0393b22f7cb2b97c31028d75.svg new file mode 100644 index 0000000..3e1eeba --- /dev/null +++ b/tex/576e746a0393b22f7cb2b97c31028d75.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/57eb5a87bd0a02676d91a2ef9eab143d.svg b/tex/57eb5a87bd0a02676d91a2ef9eab143d.svg new file mode 100644 index 0000000..b7a80b4 --- /dev/null +++ b/tex/57eb5a87bd0a02676d91a2ef9eab143d.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/5c5ef5e5fc74e6564ce35724c53f04d3.svg b/tex/5c5ef5e5fc74e6564ce35724c53f04d3.svg new file mode 100644 index 0000000..568a6b9 --- /dev/null +++ b/tex/5c5ef5e5fc74e6564ce35724c53f04d3.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/607aa17062a31ff61e3cc1c93cc1c54c.svg b/tex/607aa17062a31ff61e3cc1c93cc1c54c.svg new file mode 100644 index 0000000..6952897 --- /dev/null +++ b/tex/607aa17062a31ff61e3cc1c93cc1c54c.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/63bb9849783d01d91403bc9a5fea12a2.svg b/tex/63bb9849783d01d91403bc9a5fea12a2.svg new file mode 100644 index 0000000..af0a938 --- /dev/null +++ b/tex/63bb9849783d01d91403bc9a5fea12a2.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/67954e1aad57fcf338705441abb00abe.svg b/tex/67954e1aad57fcf338705441abb00abe.svg new file mode 100644 index 0000000..785f2a6 --- /dev/null +++ b/tex/67954e1aad57fcf338705441abb00abe.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/732ed93a5ff71133677429d72cb7556b.svg b/tex/732ed93a5ff71133677429d72cb7556b.svg new file mode 100644 index 0000000..d309a79 --- /dev/null +++ b/tex/732ed93a5ff71133677429d72cb7556b.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/7389b1fbd05eef717998c1aab5b4a1aa.svg b/tex/7389b1fbd05eef717998c1aab5b4a1aa.svg new file mode 100644 index 0000000..89083c3 --- /dev/null +++ b/tex/7389b1fbd05eef717998c1aab5b4a1aa.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/75a6f6cc0746242086a7f394fbd9297b.svg b/tex/75a6f6cc0746242086a7f394fbd9297b.svg new file mode 100644 index 0000000..a6c7e5a --- /dev/null +++ b/tex/75a6f6cc0746242086a7f394fbd9297b.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/80b2c95f69ac5dd580383297069098dc.svg b/tex/80b2c95f69ac5dd580383297069098dc.svg new file mode 100644 index 0000000..253d7a0 --- /dev/null +++ b/tex/80b2c95f69ac5dd580383297069098dc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/82fe41333ac19f47e8ab380aef250c84.svg b/tex/82fe41333ac19f47e8ab380aef250c84.svg new file mode 100644 index 0000000..6ece843 --- /dev/null +++ b/tex/82fe41333ac19f47e8ab380aef250c84.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/8409cecadf19745123272729a965e4d7.svg b/tex/8409cecadf19745123272729a965e4d7.svg new file mode 100644 index 0000000..5268ae7 --- /dev/null +++ b/tex/8409cecadf19745123272729a965e4d7.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tex/8431cd7e7abbe9867faa9394120816af.svg b/tex/8431cd7e7abbe9867faa9394120816af.svg new file mode 100644 index 0000000..76ee691 --- /dev/null +++ b/tex/8431cd7e7abbe9867faa9394120816af.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/86b1bc83cd4a9811c713ebfaa39926b9.svg b/tex/86b1bc83cd4a9811c713ebfaa39926b9.svg new file mode 100644 index 0000000..b7d52e1 --- /dev/null +++ b/tex/86b1bc83cd4a9811c713ebfaa39926b9.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/89f2e0d2d24bcf44db73aab8fc03252c.svg b/tex/89f2e0d2d24bcf44db73aab8fc03252c.svg new file mode 100644 index 0000000..e4073da --- /dev/null +++ b/tex/89f2e0d2d24bcf44db73aab8fc03252c.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/8a239a22eaa3b75f31f7ca91114761bf.svg b/tex/8a239a22eaa3b75f31f7ca91114761bf.svg new file mode 100644 index 0000000..deb26ac --- /dev/null +++ b/tex/8a239a22eaa3b75f31f7ca91114761bf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/8cd34385ed61aca950a6b06d09fb50ac.svg b/tex/8cd34385ed61aca950a6b06d09fb50ac.svg new file mode 100644 index 0000000..d40528b --- /dev/null +++ b/tex/8cd34385ed61aca950a6b06d09fb50ac.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/9065752c9bc4848759fa7b3ec2b823e6.svg b/tex/9065752c9bc4848759fa7b3ec2b823e6.svg new file mode 100644 index 0000000..3e08423 --- /dev/null +++ b/tex/9065752c9bc4848759fa7b3ec2b823e6.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/91b8920a5e4e5a0c39082fe1326ef121.svg b/tex/91b8920a5e4e5a0c39082fe1326ef121.svg new file mode 100644 index 0000000..8f339af --- /dev/null +++ b/tex/91b8920a5e4e5a0c39082fe1326ef121.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/934aebfe0542c0b82cd08ffe1c7e4cc9.svg b/tex/934aebfe0542c0b82cd08ffe1c7e4cc9.svg new file mode 100644 index 0000000..3aaf23c --- /dev/null +++ b/tex/934aebfe0542c0b82cd08ffe1c7e4cc9.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/93dbbc26f21ac41f18471eb4398429bb.svg b/tex/93dbbc26f21ac41f18471eb4398429bb.svg new file mode 100644 index 0000000..25c243f --- /dev/null +++ b/tex/93dbbc26f21ac41f18471eb4398429bb.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/979bdabe617751b6bd174b74164006bc.svg b/tex/979bdabe617751b6bd174b74164006bc.svg new file mode 100644 index 0000000..ddb40ed --- /dev/null +++ b/tex/979bdabe617751b6bd174b74164006bc.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/a158a43ace9779e0a6109b3c9f9df93d.svg b/tex/a158a43ace9779e0a6109b3c9f9df93d.svg new file mode 100644 index 0000000..a868e60 --- /dev/null +++ b/tex/a158a43ace9779e0a6109b3c9f9df93d.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/a2fca638511f2569aa770d2f55ddbd38.svg b/tex/a2fca638511f2569aa770d2f55ddbd38.svg new file mode 100644 index 0000000..adc2384 --- /dev/null +++ b/tex/a2fca638511f2569aa770d2f55ddbd38.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/a8fa96013baa8aef490c7dd5e656f95c.svg b/tex/a8fa96013baa8aef490c7dd5e656f95c.svg new file mode 100644 index 0000000..4ca2880 --- /dev/null +++ b/tex/a8fa96013baa8aef490c7dd5e656f95c.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/aa2189a333b8244a7ff28e979414838d.svg b/tex/aa2189a333b8244a7ff28e979414838d.svg new file mode 100644 index 0000000..b93b9a5 --- /dev/null +++ b/tex/aa2189a333b8244a7ff28e979414838d.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/aed9ea8527d888f965c132c2b47cfc2f.svg b/tex/aed9ea8527d888f965c132c2b47cfc2f.svg new file mode 100644 index 0000000..e0d13e9 --- /dev/null +++ b/tex/aed9ea8527d888f965c132c2b47cfc2f.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/b01bf40549686b772ea80e93f43fa41a.svg b/tex/b01bf40549686b772ea80e93f43fa41a.svg new file mode 100644 index 0000000..53e2dfe --- /dev/null +++ b/tex/b01bf40549686b772ea80e93f43fa41a.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/b5618eaa407bf223761d20cc793c9a92.svg b/tex/b5618eaa407bf223761d20cc793c9a92.svg new file mode 100644 index 0000000..950ee04 --- /dev/null +++ b/tex/b5618eaa407bf223761d20cc793c9a92.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/b753af639cc1277ae30e8a4e3b25343e.svg b/tex/b753af639cc1277ae30e8a4e3b25343e.svg new file mode 100644 index 0000000..171f15a --- /dev/null +++ b/tex/b753af639cc1277ae30e8a4e3b25343e.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/b7707db8fc92965efd729ad2cf48ef19.svg b/tex/b7707db8fc92965efd729ad2cf48ef19.svg new file mode 100644 index 0000000..9486bb3 --- /dev/null +++ b/tex/b7707db8fc92965efd729ad2cf48ef19.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/baaccbfbf8339cdf5809bac3564ee664.svg b/tex/baaccbfbf8339cdf5809bac3564ee664.svg new file mode 100644 index 0000000..415ef07 --- /dev/null +++ b/tex/baaccbfbf8339cdf5809bac3564ee664.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tex/c0ef67b62c66b541c81467e7b3e3dc2c.svg b/tex/c0ef67b62c66b541c81467e7b3e3dc2c.svg new file mode 100644 index 0000000..73a093e --- /dev/null +++ b/tex/c0ef67b62c66b541c81467e7b3e3dc2c.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/c1ca73cfcd2edc0de684ad0f85b41b79.svg b/tex/c1ca73cfcd2edc0de684ad0f85b41b79.svg new file mode 100644 index 0000000..a41446f --- /dev/null +++ b/tex/c1ca73cfcd2edc0de684ad0f85b41b79.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tex/caff3f0c7c8d34853f77a22381f40cf2.svg b/tex/caff3f0c7c8d34853f77a22381f40cf2.svg new file mode 100644 index 0000000..331a61c --- /dev/null +++ b/tex/caff3f0c7c8d34853f77a22381f40cf2.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tex/cc7ec45cd96d0abf539613b130791bf0.svg b/tex/cc7ec45cd96d0abf539613b130791bf0.svg new file mode 100644 index 0000000..d5873fa --- /dev/null +++ b/tex/cc7ec45cd96d0abf539613b130791bf0.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/ceeb1cab27d4d17c8de57054bd6e7d5d.svg b/tex/ceeb1cab27d4d17c8de57054bd6e7d5d.svg new file mode 100644 index 0000000..d399958 --- /dev/null +++ b/tex/ceeb1cab27d4d17c8de57054bd6e7d5d.svg @@ -0,0 +1,3366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/d5c18a8ca1894fd3a7d25f242cbe8890.svg b/tex/d5c18a8ca1894fd3a7d25f242cbe8890.svg new file mode 100644 index 0000000..9cec97b --- /dev/null +++ b/tex/d5c18a8ca1894fd3a7d25f242cbe8890.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/d72d3ec62eb390272bc7b3516a1cac9a.svg b/tex/d72d3ec62eb390272bc7b3516a1cac9a.svg new file mode 100644 index 0000000..3684f05 --- /dev/null +++ b/tex/d72d3ec62eb390272bc7b3516a1cac9a.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/db1792343c4e68f6025271b59ac7929a.svg b/tex/db1792343c4e68f6025271b59ac7929a.svg new file mode 100644 index 0000000..99ff1d3 --- /dev/null +++ b/tex/db1792343c4e68f6025271b59ac7929a.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/dcc4adebc2e1ab07f184a615f1067ff2.svg b/tex/dcc4adebc2e1ab07f184a615f1067ff2.svg new file mode 100644 index 0000000..adc2384 --- /dev/null +++ b/tex/dcc4adebc2e1ab07f184a615f1067ff2.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/df5a289587a2f0247a5b97c1e8ac58ca.svg b/tex/df5a289587a2f0247a5b97c1e8ac58ca.svg new file mode 100644 index 0000000..c5e0f41 --- /dev/null +++ b/tex/df5a289587a2f0247a5b97c1e8ac58ca.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tex/e7f497036b4c2ae6d2e022a8a456e8bd.svg b/tex/e7f497036b4c2ae6d2e022a8a456e8bd.svg new file mode 100644 index 0000000..0ff676a --- /dev/null +++ b/tex/e7f497036b4c2ae6d2e022a8a456e8bd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tex/e85e4bd93fd59c6cc6f6459be9b6d02b.svg b/tex/e85e4bd93fd59c6cc6f6459be9b6d02b.svg new file mode 100644 index 0000000..d2b3e85 --- /dev/null +++ b/tex/e85e4bd93fd59c6cc6f6459be9b6d02b.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/ec2f196eb05ace7dafb92181f3299ab2.svg b/tex/ec2f196eb05ace7dafb92181f3299ab2.svg new file mode 100644 index 0000000..8a0cc4a --- /dev/null +++ b/tex/ec2f196eb05ace7dafb92181f3299ab2.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/f1fa149eaf21295923f0a8b4c9abed5e.svg b/tex/f1fa149eaf21295923f0a8b4c9abed5e.svg new file mode 100644 index 0000000..6a9e504 --- /dev/null +++ b/tex/f1fa149eaf21295923f0a8b4c9abed5e.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/f525594c8e171d462049b1262d21a0b0.svg b/tex/f525594c8e171d462049b1262d21a0b0.svg new file mode 100644 index 0000000..0c70c79 --- /dev/null +++ b/tex/f525594c8e171d462049b1262d21a0b0.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/f54fda966e3f2e98add602c148211f46.svg b/tex/f54fda966e3f2e98add602c148211f46.svg new file mode 100644 index 0000000..04e649f --- /dev/null +++ b/tex/f54fda966e3f2e98add602c148211f46.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/f75236ae06b6ef3048a3da7bcc241f75.svg b/tex/f75236ae06b6ef3048a3da7bcc241f75.svg new file mode 100644 index 0000000..4c07fa0 --- /dev/null +++ b/tex/f75236ae06b6ef3048a3da7bcc241f75.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/fd4f50056fd1a09fd9fe4a27d0b0a084.svg b/tex/fd4f50056fd1a09fd9fe4a27d0b0a084.svg new file mode 100644 index 0000000..bfff202 --- /dev/null +++ b/tex/fd4f50056fd1a09fd9fe4a27d0b0a084.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tex/fd92a53167b3c6ae9574071613d555dc.svg b/tex/fd92a53167b3c6ae9574071613d555dc.svg new file mode 100644 index 0000000..8f339af --- /dev/null +++ b/tex/fd92a53167b3c6ae9574071613d555dc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file