Category: Expert Guide

How does Base64 decoding work?

The Ultimate Authoritative Guide to Base64 Decoding with base64-codec

The Ultimate Authoritative Guide to Base64 Decoding: Unraveling the Secrets with base64-codec

In the dynamic world of digital communication and data storage, the ability to reliably and efficiently encode and decode data is paramount. Base64 encoding, a ubiquitous method for transforming binary data into an ASCII string format, plays a crucial role in various internet protocols and applications. This comprehensive guide delves deep into the intricate workings of Base64 decoding, with a specific focus on the powerful and versatile base64-codec library. We will explore its technical underpinnings, demonstrate its practical applications across diverse scenarios, examine its adherence to global standards, and provide a multi-language code vault for developers. Join us as we unravel the complexities of Base64 decoding, empowering you with the knowledge to master this essential technology.

Executive Summary

Base64 encoding is a binary-to-text encoding scheme that represents binary data in an ASCII string format by translating it into a radix-64 representation. This process is essential for transmitting binary data over mediums that are designed to handle text, such as email (MIME) or for embedding binary data within XML or JSON documents. Decoding Base64, conversely, is the process of reversing this transformation, converting the ASCII string back into its original binary form.

At its core, Base64 decoding involves mapping each Base64 character back to its corresponding 6-bit value, grouping these 6-bit values into 8-bit bytes, and reconstructing the original binary data. The process handles padding characters (typically '=') that are used to ensure the encoded string is a multiple of 4 characters.

The base64-codec library, a robust and widely adopted tool, provides an efficient and reliable implementation of both Base64 encoding and decoding. It abstracts away the complexities of the underlying algorithms, offering a clean API for developers to integrate Base64 functionality into their applications. This guide will meticulously dissect how base64-codec achieves this, covering its internal mechanisms, practical use cases, and its place within the broader technological landscape.

Deep Technical Analysis: How Base64 Decoding Works with base64-codec

To truly understand Base64 decoding, we must first grasp the fundamental principles of Base64 encoding. Base64 encoding works by taking groups of 3 bytes (24 bits) from the input binary data and dividing them into four 6-bit chunks. Each 6-bit chunk is then mapped to a specific character from a 64-character alphabet. This alphabet typically consists of uppercase letters ('A'-'Z'), lowercase letters ('a'-'z'), numbers ('0'-'9'), and two special characters ('+' and '/').

The Base64 Alphabet and Mapping

The standard Base64 alphabet is defined as follows:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Each character in this alphabet corresponds to a 6-bit value, ranging from 0 to 63. For example:

Character 6-bit Value (Decimal) 6-bit Value (Binary)
A 0 000000
B 1 000001
... ... ...
z 51 110011
0 52 110100
... ... ...
/ 63 111111

The Decoding Process: Reversing the Transformation

Base64 decoding is the inverse operation of encoding. The process can be broken down into the following steps, as implemented by libraries like base64-codec:

1. Input Validation and Character Mapping:

The decoder first iterates through the input Base64 string. For each character, it looks up its corresponding 6-bit value using the Base64 alphabet. Any characters not found in the alphabet (excluding padding) are considered invalid and typically result in an error.

The base64-codec library employs efficient lookup mechanisms, often using pre-computed arrays or hash tables, to quickly determine the 6-bit value for each character. This is crucial for performance in high-throughput applications.

2. Handling Padding:

Base64 encoding ensures that the output string length is always a multiple of 4. If the original binary data is not a multiple of 3 bytes, padding characters ('=') are appended to the end of the encoded string.

  • One '=' indicates that the last group of encoded characters represents only 2 bytes of original data.
  • Two '==' indicate that the last group represents only 1 byte of original data.

During decoding, the presence of padding characters is essential for determining the exact number of bytes in the original data. The decoder discards these padding characters after identifying them. base64-codec handles this gracefully, ensuring that the reconstructed data is accurate.

3. Grouping 6-bit Chunks into 8-bit Bytes:

The decoder collects the 6-bit values obtained from the Base64 characters. These 6-bit values are then reassembled into 8-bit bytes. This is achieved by taking four consecutive 6-bit values and concatenating them to form a 24-bit sequence. This 24-bit sequence is then split into three 8-bit bytes.

Let's illustrate with an example. Suppose we have four 6-bit values:

  • Value 1: v1 (6 bits)
  • Value 2: v2 (6 bits)
  • Value 3: v3 (6 bits)
  • Value 4: v4 (6 bits)
These are combined into a 24-bit number: (v1 << 18) | (v2 << 12) | (v3 << 6) | v4. This 24-bit number is then unpacked into three 8-bit bytes:
  • Byte 1: (v1 << 18) >> 16 (the most significant 8 bits of the 24-bit number)
  • Byte 2: (v1 << 18) >> 8 & 0xFF (the middle 8 bits)
  • Byte 3: (v1 << 18) & 0xFF (the least significant 8 bits)

The base64-codec library performs these bitwise operations efficiently and correctly, accounting for the order of bits and bytes.

4. Handling Incomplete Groups (Padding Reversal):

When padding characters are present, the last group of characters will not fully contribute 3 original bytes.

  • If there is one '=' padding character, the last group of 4 Base64 characters will yield two 6-bit values. These two 6-bit values are combined to form a 12-bit number, which is then unpacked into two 8-bit bytes. The remaining 8 bits are discarded.
  • If there are two '==' padding characters, the last group of 4 Base64 characters will yield one 6-bit value. This single 6-bit value is unpacked into one 8-bit byte. The remaining 16 bits are discarded.

The base64-codec library accurately calculates how many original bytes to reconstruct based on the number of padding characters, ensuring no extraneous data is generated.

Implementation Details within base64-codec

While the core logic remains consistent, base64-codec optimizes the process through various techniques:

  • Optimized Lookup Tables: Pre-computed tables for character-to-value mapping significantly speed up the decoding process compared to iterative searches.
  • Bitwise Operations: Efficient use of bitwise operators (left shifts, right shifts, AND masks) is fundamental to manipulating the 6-bit and 8-bit chunks.
  • Buffer Management: The library carefully manages input and output buffers to handle data efficiently, especially for large inputs.
  • Error Handling: Robust error handling is implemented to detect invalid characters, incorrect padding, and other malformed input, providing informative error messages to the developer.
  • Platform Agnosticism: Designed to be compatible across various operating systems and architectures, ensuring consistent behavior.

Consider the following pseudocode illustrating the core decoding logic:


function decode_base64(encoded_string):
    decoded_bytes = empty byte array
    padding_count = 0
    if encoded_string ends with "==":
        padding_count = 2
    else if encoded_string ends with "=":
        padding_count = 1

    // Remove padding for processing
    processed_string = encoded_string.substring(0, encoded_string.length - padding_count)

    // Create a mapping from character to 6-bit value
    base64_char_to_value = create_base64_lookup_map()

    // Process the string in chunks of 4 characters
    for i = 0 to processed_string.length step 4:
        char1 = processed_string[i]
        char2 = processed_string[i+1]
        char3 = (i+2 < processed_string.length) ? processed_string[i+2] : null
        char4 = (i+3 < processed_string.length) ? processed_string[i+3] : null

        value1 = base64_char_to_value[char1]
        value2 = base64_char_to_value[char2]
        value3 = (char3 != null) ? base64_char_to_value[char3] : 0
        value4 = (char4 != null) ? base64_char_to_value[char4] : 0

        // Combine 6-bit values into a 24-bit integer
        twenty_four_bit_data = (value1 << 18) | (value2 << 12) | (value3 << 6) | value4

        // Extract 8-bit bytes
        byte1 = (twenty_four_bit_data >> 16) & 0xFF
        byte2 = (twenty_four_bit_data >> 8) & 0xFF
        byte3 = twenty_four_bit_data & 0xFF

        decoded_bytes.append(byte1)
        if char3 != null:
            decoded_bytes.append(byte2)
        if char4 != null and padding_count < 2: // Avoid appending extra byte if it was padding
            decoded_bytes.append(byte3)

    // Handle the last few bytes based on padding
    if padding_count == 2:
        // The last group only contributed one byte
        // The logic above already handles this by not appending byte2 and byte3 if char3/char4 are null effectively.
        // For correctness, one might need to adjust the loop termination or post-processing based on precise padding handling.
        // A more explicit way is to reconstruct the last byte from value1 and value2, then discard the rest.
        // Example: byte1 = (value1 << 2) | (value2 >> 4)
        pass // The existing loop structure handles this by conditional appends.

    else if padding_count == 1:
        // The last group contributed two bytes
        // Example: byte1 = (value1 << 2) | (value2 >> 4)
        //          byte2 = ((value2 & 0x0F) << 4) | (value3 >> 2)
        pass // The existing loop structure handles this by conditional appends.

    return decoded_bytes

function create_base64_lookup_map():
    // Returns a map like {'A': 0, 'B': 1, ..., '/': 63}
    pass
            

The base64-codec library abstracts this low-level bit manipulation, providing a developer-friendly interface while maintaining high performance and accuracy.

5+ Practical Scenarios for Base64 Decoding

Base64 decoding is not merely an academic exercise; it's a vital operation in numerous real-world applications. The base64-codec library empowers developers to implement these scenarios with ease.

1. Decoding Email Attachments (MIME)

Email, particularly through the Multipurpose Internet Mail Extensions (MIME) standard, frequently uses Base64 to encode binary attachments like images, documents, and executables. When an email client receives such an attachment, it needs to decode the Base64 string to reconstruct the original file.

Scenario: A user receives an email with a PDF attachment. The email body contains the Base64 encoded representation of the PDF. The email client uses base64-codec to decode this string and present the PDF as a downloadable file.


import base64

# Assume 'encoded_pdf_data' is the Base64 string from the email body
encoded_pdf_data = "JVBERi0xLjQKJcKl..." # Truncated for brevity

try:
    decoded_pdf_bytes = base64.b64decode(encoded_pdf_data)
    with open("attachment.pdf", "wb") as pdf_file:
        pdf_file.write(decoded_pdf_bytes)
    print("PDF attachment decoded and saved successfully.")
except base64.Error as e:
    print(f"Error decoding PDF attachment: {e}")
            

2. Embedding Binary Data in JSON/XML

JSON and XML are text-based data formats and cannot directly represent raw binary data. Base64 encoding provides a way to embed binary data, such as images or cryptographic keys, within these structures. The receiving application then decodes the Base64 string to retrieve the original binary.

Scenario: A web application stores user profile images. Instead of storing file paths, it embeds the image data directly into a JSON object as a Base64 encoded string. When the web page loads, the JavaScript on the client-side decodes this string to display the image.


// Assume 'userData' is a JSON object with an 'image' property
const userData = {
    "userId": 123,
    "username": "johndoe",
    "image": "iVBORw0KGgoAAAANSUhEUgAA..." // Base64 encoded image data
};

try {
    const decodedImageBytes = Uint8Array.from(atob(userData.image), c => c.charCodeAt(0));
    const imageUrl = URL.createObjectURL(new Blob([decodedImageBytes], { type: "image/png" }));
    // Now you can set this imageUrl to an  tag's src attribute
    console.log("Image data decoded and ready to be displayed.");
} catch (e) {
    console.error("Error decoding image data:", e);
}
            

*Note: In JavaScript, `atob()` is the built-in function for Base64 decoding. For Node.js environments, you would use the `Buffer` class: `Buffer.from(userData.image, 'base64').toString('binary')`.*

3. API Authentication (Basic Authentication)

HTTP Basic Authentication uses Base64 to encode the username and password. The client sends a request with an `Authorization` header in the format: `Authorization: Basic `. The server then decodes this string to authenticate the user.

Scenario: A Python script needs to access a protected API. It constructs the username and password string, Base64 encodes it, and includes it in the `Authorization` header.


import base64
import requests

username = "api_user"
password = "api_password"

credentials = f"{username}:{password}"
encoded_credentials = base64.b64encode(credentials.encode()).decode() # Encode to bytes, then decode to string

headers = {
    "Authorization": f"Basic {encoded_credentials}"
}

api_url = "https://api.example.com/data"

try:
    response = requests.get(api_url, headers=headers)
    response.raise_for_status() # Raise an exception for bad status codes
    print("API accessed successfully. Response:", response.json())
except requests.exceptions.RequestException as e:
    print(f"Error accessing API: {e}")
            

4. Data Masking and Obfuscation

While not a cryptographic security measure, Base64 encoding can be used to "mask" or "obfuscate" data to make it less immediately readable by a casual observer. It's often used in conjunction with other methods for basic presentation.

Scenario: A web application displays a sensitive but non-critical piece of information (e.g., a coupon code) in a URL parameter. To make it slightly less obvious to someone just glancing at the URL, the coupon code is Base64 encoded. The server-side script decodes it before processing.


<?php
// Assume $_GET['coupon'] contains a Base64 encoded coupon code
$encodedCoupon = $_GET['coupon'] ?? '';

if (!empty($encodedCoupon)) {
    // Decode the Base64 string
    $decodedCoupon = base64_decode($encodedCoupon);

    if ($decodedCoupon !== false) {
        echo "Your decoded coupon code is: " . htmlspecialchars($decodedCoupon);
        // Further processing of the coupon code...
    } else {
        echo "Invalid coupon code format.";
    }
} else {
    echo "No coupon code provided.";
}
?>
            

5. Storing Binary Data in Plain Text Files

Sometimes, you might need to store small binary assets (like icons or short audio clips) directly within a configuration file or a plain text database entry. Base64 encoding allows this.

Scenario: A desktop application has a configuration file that includes small custom icons used in its UI. These icons are stored as Base64 encoded strings within the configuration file. When the application starts, it reads these strings and decodes them to display the icons.


import java.util.Base64;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;

public class IconDecoder {
    public static void main(String[] args) {
        // Assume 'encodedIconData' is a String read from a config file
        String encodedIconData = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnEAA0EA30f76AAAABlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAzAAAAAEaAAQAAAABAAAALAAAAABoAQAAQAAADwAAAAQAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAAAQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAAAQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAAAgAAAA AQAAAEAAQAAAEAAAAIAAAACAAAA AQAEAAEAABAAAA