-
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #39 from decipherhub/symmetric-encryption
Add symmetric encryption docs
- Loading branch information
Showing
21 changed files
with
250 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
## Intro | ||
AES (Advanced Encryption Standard) is the most common [[Symmetric key encryption]] algorithm, which utilizes a block cipher. Unlike [[DES]], the AES algorithm does not use a [[Feistel network]], enabling more parallelization. The length of the key used in AES can be 128 bits, 192 bits, or 256 bits, and can be represented as AES-128, AES-192, and AES-256. Each version also has a different number of rounds, which are 10, 12, and 14 rounds, respectively. In addition, every version of AES uses the same block size, which is 128 bits. AES works on a $4 \times 4$ block array, where each $b_a$ represents 1 byte of the block. | ||
|
||
$$ | ||
\left[ | ||
\begin{matrix} | ||
b_0 & b_1 & b_2 & b_3 \\ | ||
b_4 & b_5 & b_6 & b_7 \\ | ||
b_8 & b_9 & b_{10} & b_{11} \\ | ||
b_{12} & b_{13} & b_{14} & b_{15} \\ | ||
\end{matrix} | ||
\right] | ||
$$ | ||
|
||
## Design | ||
High-level description of AES is as following: | ||
1. KeyExpansion | ||
2. For the initial round | ||
- AddRoundKey | ||
3. For the other rounds(9, 11, 13 rounds) | ||
- SubBytes | ||
- ShiftRows | ||
- MixColumns | ||
- AddRoundKey | ||
4. For the final round | ||
- SubBytes | ||
- ShiftRows | ||
- AddRoundKey | ||
|
||
### KeyExpansion | ||
The KeyExpansion step generates round keys to be used in each round. In the case of AES-128, KeyExpansion takes a 128-bit key as input and expands it into a 44-word array, with each word being 32 bits. Every 4 words(128 bits) are used as a round key in each round, which means that AES-128 uses 11 round keys. AES-192 and AES-256 uses 13 and 15 round keys respectively. Every round keys are also represented as below. | ||
$$ | ||
\left[ | ||
\begin{matrix} | ||
k_0 & k_1 & k_2 & k_3 \\ | ||
k_4 & k_5 & k_6 & k_7 \\ | ||
k_8 & k_9 & k_{10} & k_{11} \\ | ||
k_{12} & k_{13} & k_{14} & k_{15} \\ | ||
\end{matrix} | ||
\right] | ||
$$ | ||
|
||
|
||
### AddRoundKey | ||
The AddRoundKey step is a simple bitwise XOR operation between the state array and a round key. The state array is a $4 \times 4$ plaintext array at the first round, which is manipulated during the encryption process. Each round key is derived from the original encryption key through the KeyExpansion process. This step is important because adding the key to the state provides the security of encryption. | ||
|
||
### SubBytes | ||
The SubBytes step substitutes each byte with another byte according to a 8-bit substitution box(Sbox). The S-box provides non-linearity properties, leveraging multiplicative inverse over [[Finite Field|GF]]($2^8$). | ||
![[Pasted image 20240730214809.png]] | ||
|
||
### ShiftRows | ||
The ShiftRows step is a transposition step where the rows of the state array are shifted in certain offset cyclically to the left. The first row is left unchanged, the second row is shifted one byte to the left, the third row is shifted two bytes to the left, and the fourth row is shifted three bytes to the left. This step helps in **diffusion** by mixing the positions of the bytes in each row. | ||
![[Pasted image 20240730214817.png]] | ||
|
||
### MixColumns | ||
The MixColumns step is a mixing operation that operates on the columns of the state array. Each column is treated as a four-term polynomial and multiplied by a fixed polynomial | ||
$c(z)={03}_{16}\cdot z^{3}+{01}_{16}\cdot z^{2}+{01}_{16}\cdot z+{02}_{16}$ modulo $x^4 + 1$. More generally, this step can be represented as below. | ||
|
||
![[Pasted image 20240730220004.png]] | ||
|
||
This step provides **diffusion** by mixing the bytes within each column, ensuring that the output bytes are influenced by multiple input bytes. | ||
|
||
![[Pasted image 20240730214827.png]] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
## Intro | ||
A block cipher is an encryption algorithm used in symmetric key encryption that encrypts plaintext in fixed-size blocks. The block size depends on the algorithm, but the length of the plaintext can be variable because block ciphers utilize modes of operation, which will be explained below. A block cipher can also be abstracted as a [[Pseudo-random Function]] where the message space is n bits and the key space is k bits. | ||
|
||
![[Pasted image 20240730165247.png]] | ||
|
||
## Design | ||
![[Pasted image 20240730172248.png]] | ||
The basic flow of block cipher encryption is as follows: | ||
|
||
1. Expand the key into $r$ round keys via key expansion. | ||
2. Apply each round key sequentially using the round function. | ||
3. Output the ciphertext $c$. | ||
|
||
The implementation of the round function and key expansion depends on the specific algorithm. Typically, in the round function, building blocks such as substitution, transposition, shift, and swap are used to satisfy [[Confusion and Diffusion]]. | ||
|
||
## Mode of Operation | ||
If the length of the plaintext to be encrypted is longer than the block size, a mode of operation can be used. The mode of operation defines the methods to securely use a single key multiple times. There are two types of modes of operation: | ||
|
||
| Confidentiality only | Authenticated Encryption with Additional Data(AEAD) | | ||
| ------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | ||
| - ECB(Electric Codebook)<br>- CBC(Cipher-block Chaining)<br>- CFB(Cipher Feedback)<br>- OFB(Output Feedback)<br>- CTR(Counter) | - GCM(Galois counter)<br>- CCM(Counter with cipher block chaining message authentication code)<br>- SIV(Synthetic initialization vector)<br>- AES-GCM-SIV | | ||
|
||
## Comparison with [[Stream cipher]] | ||
| | [[Stream Cipher]] | Block Cipher | | ||
| ---------------- | ------------------------------------- | ----------------------------------------------------- | | ||
| Processing Unit | Bit/Byte | Block of data | | ||
| Key type | Generated for each bit/byte | Single key used for multiple rounds | | ||
| Implementation | Simpler, often used in hardware | More complex, often used in software | | ||
| Use Case | Real-time applications, low latency | File encryption, data at rest | | ||
| Speed | Typically faster | Typically slower | | ||
| Padding Required | Not required | Required if data does not fit block size | | ||
| Security | Key reuse can lead to vulnerabilities | More secure with proper padding and mode of operation | | ||
| Example | RC4, Salsa20, ChaCha20 | AES, DES, Blowfish | | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
## Intro | ||
Stream cipher is a method of encrypting data where each bit or byte of the plaintext is encrypted sequentially, one at a time, using a corresponding bit or byte from a key stream. This approach differs from block ciphers, which encrypt fixed-size blocks of data. Stream ciphers are often used in scenarios requiring high-speed encryption and where data is transmitted in a continuous stream. | ||
|
||
## Design | ||
![[Pasted image 20240730173718.png]] | ||
TODO(yuki) | ||
|
||
## Types of stream ciphers | ||
### Synchronous Stream Ciphers | ||
In synchronous stream ciphers, the key stream is generated independently of the plaintext and ciphertext. An internal state to generate the pseudorandom sequence(key stream) is maintained and used to generate new internal states. | ||
To decrypt the plaintext correctly, the sender and receiver must be synchronized to ensure the key streams match during encryption and decryption. If a bit is lost or an erroneous bit is added due to transmission errors, decryption will fail from that point onward and re-synchronization will be needed. | ||
|
||
### Asynchronous Stream Ciphers | ||
In synchronous stream ciphers, the key stream is generated based on the previous ciphertext bits, not on the previous internal state. Thus, if a bit is changed or lost during transmission, only a portion of the decryption will fail. | ||
|
||
|
||
## Comparison with [[Block cipher]] | ||
Refer to [[Block cipher#Comparison with Stream cipher]] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
## Intro | ||
Symmetric encryption is a method of encryption that uses the same key for both encryption and decryption. Since encryption and decryption are performed with a single key, it is crucial that this key is not exposed to anyone outside. For this reason, it is also known as secret key encryption. | ||
An important aspect of symmetric encryption is key management. This includes generating keys securely, distributing them safely, and ensuring they are stored in a manner that prevents unauthorized access. | ||
|
||
## Types | ||
Symmetric encryption can be divided into block cipher and stream cipher. | ||
- [[Block cipher]]: Encrypts plaintext in fixed-size blocks. | ||
- [[Stream cipher]]: Encrypts plaintext bit by bit or byte by byte. | ||
|
||
## Examples | ||
The most well-known example of symmetric encryption is [[AES]](Advanced Encryption Standard). There are also methods like DES(Data Encryption Standard), which has known vulnerabilities. | ||
|
||
## Use cases | ||
Symmetric encryption is used in various real-world applications such as TLS/SSL for secure web communication, file encryption, and database encryption. For example, in TLS 4.0, symmetric encryption schemes such as [[ChaCha20]] or AES256 are used for encryption. | ||
|
||
## Comparison with [[Asymmetric key encryption]] | ||
| | Symmetric key encryption | [[Asymmetric key encryption]] | | ||
| ---------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------- | | ||
| Key type | Single key for both encryption and decryption | Public key for encryption, private key for decryption | | ||
| Speed | Faster | Slower | | ||
| Key distribution | Requires secure channel | No need for secure channel (Public key can be shared openly, secret key remains private) | | ||
| Non-repudiation | X | O | | ||
| Example | [[AES]], DES | [[RSA]], [[ElGamal]], [[ECDSA]] | | ||
| # of keys | $N\choose 2$ for $N$ people | $2N$ for $N$ people | | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
90 changes: 90 additions & 0 deletions
90
content/Basic Cryptography/images/Excalidraw/Block cipher drawing.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
--- | ||
excalidraw-plugin: parsed | ||
tags: | ||
- excalidraw | ||
draft: "true" | ||
--- | ||
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving' | ||
|
||
|
||
# Excalidraw Data | ||
## Text Elements | ||
Plaintext ^mkMzafMa | ||
|
||
Ciphertext ^95yWyj8l | ||
|
||
Key ^CSoABc2j | ||
|
||
Encryption & Decryption | ||
Algorithm ^gcXyAA3t | ||
|
||
## Embedded Files | ||
fc8551656b13d3cdb8f5eee8412edf270a2592b8: $$\{0, 1\}^n | ||
$$ | ||
ead043ca1b10a95228a9dcb2b4b7a6fa28f62d6c: $$\{0, 1\}^n | ||
$$ | ||
28180c1dd2d4cfb3f81e69ce361ccc651b112248: $$\{0, 1\}^k | ||
$$ | ||
%% | ||
## Drawing | ||
```compressed-json | ||
N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiARgBmGjoghH0EDihmbgBtcDBQMBKIEm4IAHEAWQoAJQAOACsASQBFIQA2QnoALQAWZySkzUqYBNSSyFhECsDsKI5lYMnS | ||
zG4hnk7tBqTO4f6eHgaAVgSTzv5SmA2khLiATgB2C7un5IbOp75CyAoSdTcLZJbQJJ5PU6dfr9E53HgnK6QSQIQjKaTcfbaTqdHgABn6uySDwa/SSL0REGsy3EqFxFOYUFIbAA1ggAMJsfBsUgVADECQQAoFq0gmlw2GZyiZQg4xA5XJ5El5ADNldgHuqRRBlYR8PgAMqwFYSQQeLUMpmsgDqAMkQPpjJZCENMGN6FN5Qp0rRHHCuTQCQpbDg4rU | ||
NwDuLpvwgUuEcBaxH9qDyAF0KcryJkE9wOEI9RTCLKsBVcLitdLZb7mEnilNoPAaUlfgBfekIBDEbgJHHfTrnBINCmMFjsLhob5DpisTgAOU4Yi7PA+nyOBeYABF0lAO9xlQQwhTNMJZQBRYKZbJJgpTIq/UozGnQLBQEWlcoSfTM6pGXDK6q4CA71bO9azrd90CtSoAEdCDZNkWgADUwAAxAA1BD6CEdUWjgZVOn1V9pgbEtSCZKggN+NNoyEOB | ||
iFwbdOwDb4eCSeEkhODj3gpIgOGZHM83wbi2AlHc0D3fAwkKYCSlAspGPQT9v1/f8tQfCpt0wF8KXWNBnB4fpcW0fowTJJdcReXETkHaNw1QPSHhBKF+k6cyTlJB4YSSCl/mIQE0AeQzhgeByjlxViHmOBFo2RVF0TQeEKSpN0ozrC0nXlbk+SFQUkEPcVJQrOVOUyiRGWsZgQ0CbItR1PUXTdCAPU7B1LQQG1fLteKWqderHya8thB9P0uyDENs | ||
DDLtIwpWMaITK8qLrDNcCzeTc3zaNC2IYsJFLVCBplYgqyTNbBOjMJRNQBJcQaXF7mMhJ+knEdOG4AknunDg5w4Bd4ssnhwVY7E103YIGN3fcEEPY9iDPDIshyfj1rrGi6LBpijlYk59P6DzLmjHi+LQE6hJE+TxIPaMNJfCQAAV8FwQsqfLSgABVnwqOmGeydn004KB9UIIwaTxXnsmQ5bdVsqK6ypgBBIhlDHdAxG5nknqgcwCHl1ElYgfQSGI | ||
FYKT0bIuaYbMJBqepmnaLoegGIYRjGCYg1IVFCwINnNI5+nGZ56NcCEKA2DqcJBZpRkhEh/HCwQAAJFE0Wpy74hOKSrlktSJHmRZqS1YcPqBAd3tHL6fsu/SzlJAcfjAosdPQXAXY2jctwu8no7A+SIBgE5CBp5woGwChmStZwnhaCgACkZyjgBVAB5ZCat1A0jT6zlPTOx1rVte1t9a3qKn6r1BskI6RujYNQ1gSaUtKJKaXvyAG8dwyDPxJcHv | ||
hCFAxsrsHjaGCrjE4HkWINGOPcbqrIMqKnQPyHKwo8oShmrKWBfJVTqk1N5Pe8V3hAIhDCGEDRiSknJNFROcVUCYmxHiAkQUSRkmlqUc68kcYNAgckLY01pTxkTPkBapQlorURqdOshUL5oFAkRWYaAmxTGkqUI8B1YYXgRmga8UxpEyMfEzREb5u4PBODAK0MAmgNHwIBG8iiZJ3kgOBCAhw574H6FaJI+p1z4HXPobcuJUJWhnAvToAAhQi9ZZ | ||
GN1Imwci1jKIUhRvRC6YIMZsSeBFAy3FCyE1QMTfGwlWRkwhunQoskHFGJMWYixqliKlX9nWV++lth3ASOcZinQLgJX/nIwBwx8QBRaSxfEnQHg4I6pNEEaTgpbBeL/TpdYYpJyBMwyAj9uDP0ajvdkxU4EQAQdlLUYoUGFXQaVcgHAKq4CqlpaMtU16ug3maaBbVcG8CeUfE0m9mrRm9OfYaAZRo31slddZM0+HzXTJmBAFsckCQLPXEsCQ9qnw | ||
OpImFSMWHtnkkSd45x+hPEetGAuo4uyHBLrOecNIHoGSOE8XEq4W4gwQGjVAHcoYqPPPDY6sLqK0USfJZJLFUnpPWQTURJMCngwkp3e87MJBskIHAZEpA9HfNZrK9A8rFVMBVYtPmAshZAnWcqPm4t9b4ClhSOWCtdYq23GrQl2rNb4G1orCo+tiCG1ytGE2URY6kGhT3PuA8h4jzHhPaes8ECL2Xq7d2HBPbqogJqpVOqH5BxDmHA1aBI7SsgDx | ||
eOlDk4JFTsU2xMsanoBzqsslSskj4hrWXSlOI3J0pIQSuuW0G6Uh4FqQgrdQbtwhgWbuuAnjMCeMagAMv0Gchw2RtGEE0CgDwmioU6CvOq69j6fPNJs9qflXkHx6luj5jzvln1RX/Os19xq3wjOs1ZaB1mvysoZWlsIjhbA6csnuGxzhxHaTddi/1dh4i8kemB2ysqIK9XWQ5BVoYnPgbgE4xAGiqi1D5A9yQnjaFYjwAKUIPIPVxDiCkCyqEuSA | ||
WSTouwrpuVo+Q1KmKuygLCkSJIzkeFxjmgIiFy0oWrW5eI6GqLpHhMbC2Nlp4OWXnyCBOxEn1J1JvHJCobJ9RsFlsE7APAmhWIUfo7RamJCaaMAAfStBZpIHIEK4hpvQZgxBJDghPMoMJWdIlkQMyUZscSeWoyScxTGSQVx4sybxMVeTSaSskr5jOG1u4aa0zpvT1SIlPm9tpDYWMGhANJJ8SM+klyhYpLZZwyR+hYhIQkBy3wOKnA8qMg9wxtCT | ||
OJHiFpdxOHkcLUsxKSxkpPKQ7s7KSDozwdQUVBU6kzkXKuRuu5DUT4QeeWMrqq33nuh3cioa1ZL7XrGhNe93HZr8I0YIyAwjBNRY7dtRuKRkWVj+WisRGKLp4meLCCE+Ka3cBJA2ilAClwnAhG24GbdClSukzDWT6jXvxN5cygVmNgT3BFVk27pQuQxbEkOymiaADSCAbhejVd7CQxPSc3L1eHQ1osoCmsltwH9VqdYVFtUwfOjr3Aut1u6z1Wof | ||
Vm39SOsdE62DTtnTwedi7l2rvXbG/wCaKfoCp1qQOwdQ6sCzagHNEWC2xSLSW+LJTEsVAoIHHAQg6hGDYOuOopBCd1CnkSB4uBgzpcfFWwbsG1i3FB9oa6Hk8V0oeiSdt1w/0NFw1jd4LwArDDA81zqqBAYEJbccViYV7g/oo0W9i2gLgkhOLiCKAMCsDbzk+4bUGlRjb96KfKU2Ru8k0DwZUPBNCaEW1txqO3Vv7tT7XFhmy+8rZE34X5+3/lXy | ||
O3ey6U1oygt4xd/jIiibCbfPCna/R9rPZn6gcTnn5Gm+YxdEk+wy+Az+wGfYgPvo0hhKRrYtX1l9sZcy1lE3oaqM5fJm8YzTzTLa5G8exbuZQbABCGAWWWWJIF8ICIzRTBxSCGCOCRCFCdCTCbCXCfCDzCtSkKJGJQzBTMAkzdAJxFxNxDxLxHxBAPxAJIJUJfRHREibzRA0g1TBxMzSzazWzezRzZzVzdzFgpTHaIgnzMAPzKYS7CABJZHYLNiM | ||
LJ4CLbJXJOsHHCVPHKVUtW8LuCoSA6A2A+Ar3ZTLLaMV+OEIyd4dpL4YKO4KEMrP9aENrQ4IxfEIkTyKBaMLDYfMkNrIkCBcBJ4YZWEXrI3FnB9X3NZWvGbevGDA5ZvY5OvZDVDdDZUXvE9bbM9VKPdF5EfAQMfLI/vHI0oH5S9AFW9IFJfOsFfc7ZMWQ67aFdQ7fTtEsE4ffQ6F7FogQFjOROjAjHGdZIlF6O/FQh1Z6T6IHORT7fFYySPexftJ | ||
lQdaHH/dlOGOTTfdFSAeQoLFJWEPYEIq9bHTHLYt7PNfJFYimGWRNE8b6UgeADWTgVAAAMlQE3GwAeLgCeI4AAB0OB5ZlBuQ1BJB9BmYKAvZk4IA7jPjHjRxXj3iEBYTvjRx/jATgT1AwSGd9VhYjUTUJZzUWdLVnw+cOd4Yud1YnVSSPwDYjZvU+YRcA1LchBrdbd7dHdndXdgoPc4AtRgTld8BISKgYSvifiESPjRTUSAT8AgS3ZMSNd01tc6d | ||
s1SAo4DcE4IiAwTcpCEt9CJBUDYJ4IkI0IMIsIHgcI8ICJLUCDLlvNstdJasqtbor8jg3JgpronDdJ9I8s7h2JCR8U6VOMFiIBfC1kg8OIWkLgoRQthkwosZwjFk0BQE2tPgDJ8VaVaU4Qf1H1aRYiSp4EG9EijlEMUjdl29O9u9Mj7lt1SjCjWoh995cjD5iiJ8yiL0XtjjIAb1jtF8QVeFV8Gj18bszi4U2idpFdz0UUXtj8K0eApMzo+jeA6V | ||
iQnhON6U6wRilYoyH9y4rpnh8V4QuMGVIdYtc0IBlEZMNj4cei5Ckc9iWI61ask8f1RURzostCWV8c6w4A2BGYrw7xNEphn4ShcQ7xLswBAKQLwyzhzhsQCtYzgMWDkyIQoRzJQ9Mzc8wL/MNDQgoAOR9B9YZAOwaZfzqo3zcjLkoBglNpCx3MpE7wMA4cA0rZGhWgOhug+hBhhhRhxhXxtRhIhAkxnBDJIwHh7g9giRSNc9aMFjIBlBcBeSAx5y | ||
6wshiBqLZRaLuBxN0g1EmSrdsAbc7cHcncXc3ceS+LjUDKhKRLboGhgVIFDgCQ0kvh9EYwFKuxlLR9KLZYiDkRcAR0JCKRVKfKyI/KAr2Cz89D7wbTAqJjC5xxQcdzKViRzIYzSUNod9G4nhe0liv8vyDEKhKDXF3FPFvFfF/FAkQkqzlsB8mynQGyNs6rWRx9aq2yp8Ki59AU74q8hsLC/0PIgF9JLIHhYycQmsuk7JS8gErJvgcYXgrJQEf00p | ||
IM4iCyEjkEEMDpW9yyu8e8U8wy9zWI0lwRrpoRhg7gEzKNAEjE7KAoxLnKY88Zz9+UjgIFQsCM+yeN6jUwhzmit9IAJFpyGLPM5ySC4Nf84dwUAs+UuxgtHyHIb8Y5ItyLsdLiodrivLlV1LHAlgtKGKdL4Y9KWSDK2TjLOSzLPdXLLLBKwzIwY83cQ8iR9gJLZK3LFLLpPLIBVLsbNL6LVMCbsgA1e5+5B5h5R5x5J4Z554l4LKBLrKg86UrIxK | ||
ApjJzIXg+xoRXL5L2aEhOaIB6YGR8LCKGISLGYsdCjvLfKQhwroktRgqrb/K2DbaKQfy/yACphIKwBgKvawL9FPbDJDr/p9zTrSRhhOyShhlprbqy8wQRrHqsKZDdDSlu4eCrNzMbM2A7MHMnMXMng3NTDxC7S+rdJoRi00kiQHo0kcYlwRkJqKsjgjJjhroP13gCRNafCXkIFBqzgy9PhWI7K5lSh88gRQQRqcQ8UGtQEmEeqn48ydk9kcoizNq | ||
0FSy28O9drqqHkt4mq1sD0CiNlmzqzT1t62q9skxOyIBuyF9gVTswU+MblIU/rtiyhMrKQGhOixNgbZy9bWFYbLI7hgpS9b9qElwkqMQbpw9cYIcB10azyLzYcryuVn7dj+U4bboEb/pVDzb9a0bTyXbSL4dIL/aWDQKbxwLPau6Ioe7iR9hIFB6phEgx79J5rGsmEE6ShZCDa8KDBjbiKCHsGGRKKebca+aVKmKxdx0p0Z050F0hAl0V011ZarK | ||
NgRL2kwoCMTq8VPDbotb3KtSrJThRKQjv09buaaKRGj98bxGLd9LDL2STKuT3dKaGLqb5b/6HIBw7LoR/oQcCi5K9GU5wQHJQcxLboTGwbMaoAQrokwrsH7bQrranbiDFFM4CDCB9BohG8GApxiUAwLgwG5F9g7qAp97Np7tKRZYcrP8rizyHFkIEJCdMB+hJBsBqdFpV4+9JBxQNBAhd16yXkL7lrnQWzWqAb2zD8L6r7qiojq9czi67JjI4hMZ | ||
S98QOE6Gf1ysCNHJQsLhS99g8VbC56+RIwTmywNqW9SyypzlKp4ZMMXlVydg+xbpnIqUIo6VLrk59IsQwN3rVm60vhgzf7/INHPqzsobFpH6hNn7AbD8bz4G/9NjBzoaFD9jUynmsGUaLjcdPzViKKoAaaJBEANLcb0xdRhz0A1RTgzhbDNBkhiAkhsBiBNB0MTh2wEASR7gOxO9aVcB4QIpmXzR3AaRILw7dbE7IrUmMt0nMnudJiuw7KCnLoDJ | ||
aNThwRgyymu1cA2QqmTztCMbwCLcZTKgABNZkSoWWE4WWBeczGA5USdE8OefQfoGNG5Dp4orp7AHprJoZhqy6N5EZ2siAcojsyonsm+gOaImveZ5wYyCZDiULUJiKMkZ4T01AQ4PDIxfpMvIJiEcDHe1vU5yMJei51a6AObG56qfa8cEET4K6B6DW6u95ihTU3gKrHEdjCBP50jX7Bci6WjAjCBq6W+gcn6h+gTJ+84oN0Tbo/688iGxB++5GO81 | ||
B1FgcPsPNk45GhHd8mph0eiAl9AIlnGkQ114IANa2jwvABIWl3EXAIxV6u94gbAdvTQfoTQJ4XAToPcY4PCHgYgTobAQVggYVu8UVyiJOymNJjJ5QLJzcklYMzcxtLsFpLhFiYuDKscxudcHVmBvB83CQdcOOJIQgJ4bAYJbD0lzdI+9AD1r1vp+qgZ/16jkok+sZ9qkNzqqo7qiN2Z59HLFw1KrYMhOMh6VNirEhIPWapPMEeaxw1bAtwt4t5I0 | ||
tq5+bW5qt6hQBSMWlG6cyAe0vC+4evBUEMvdJBw5Vw8tsC6NMpt2o/s76xoyF7BmFpByd+FyGxd0oFB2G1F7ENZjF7djQ3BvVs8wR/FpMCAI9zSyj8liASBG6bABID1P9/obAZUTQJIZUOyhAYZMQPYBIbAQr9pa9gZb0oDt0EV/RMVjhqScABaSkOAOAQ0RJPG+8ZETICoBWdEK4BgQgBACgYJJIks0tlUVUMb1YCAAy0iQm7cfQQ0VqVvQsnrq | ||
bq5FoWbwb4sra1enays5bkQVb2b5CN15j1syb/bmbjIebhj9bQ9UoFbi7ubook71qs76bwW2buocZ8+vbt7qANbjIBeefaZn7g7jIZCfEs1C1QoV70H/QcH7IHE+naH+797jISE6k9AYIZUUAyAFHv72b5r5VaJigWJlGmHh7u44gYn0nrzZ26H5gT4zkfABCf7UkNrByQjZydBs4HrhnpkPUY116EkIvXYUzlDu4djHru3AwVr0oegAgKODyyK8 | ||
n1H/QT7qcw/Kdg6CbqUEgRHsn3X6bfM2SYJTkbuXkNkB4S3y35CF1usUOZQPMS5PkE8dcV31323gzRRFX/mTZQHn41znruAQIMwYQZgSoN2YgfXwLq7SFUOIsN2Cx2SLIXATQYIeSfXb1IgdmzPuseNDrlUtUq+IOfNbgHNXQy+zQJoJEnIfUeNOAaoNgLaO41P9P088AaSbUMlmsPzZsIAA | ||
``` | ||
%% |
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.