diff --git a/404.html b/404.html index ca602d13..72918772 100644 --- a/404.html +++ b/404.html @@ -13,11 +13,11 @@ - +

404s suck! And we're sorry for this one.

Good thing the permaweb has no more 404s

- + diff --git a/arcss/index.html b/arcss/index.html index 6e27fe55..931765e2 100644 --- a/arcss/index.html +++ b/arcss/index.html @@ -13,13 +13,13 @@ - + -

# ARCSS

# Overview

The ARCSS protocol is a URI scheme (opens new window) designed to translate requests for Arweave content into an https:// request. Essentially, ARCSS allows for transforming traditional Arweave URLs like https://arweave.net/long-txid into more concise and user-friendly forms such as ar://txid or ar://arns-name. When combined with the AR.IO WayFinder browser extension (opens new window), the request can be directed to any number of functional AR.IO Gateways to serve the content.

An early technical breakdown of ARCSS, created by Arweave community member DMac, can be found here (opens new window).

# Browser Integration

ARCSS is currently facilitated via the WayFinder browser extension or internal application integration. The intention is to lead popular web browsers like Chrome and Brave towards a direct integration of ARCSS, similar to recent integrations of the ipfs:// protocol. Such integration would remove the need for a client-side extension and boost developers' confidence in embedding ARCSS in their websites.

# Internal Application Integration

Certain websites or apps may want to resolve Arweave Transaction ID's (TxId) internally. In these scenarios, they can process ARCSS internally without depending on browser support or WayFinder. A prime example is opensea.io (opens new window). Opensea, an NFT marketplace, frequently imports NFT metadata from external sources. If metadata employs ARCSS, Opensea internally resolves these, presenting content without redirecting users through an https:// link.

There are two main approaches to resolving ARCSS:

  1. Convert ARCSS into a request directed at a predefined Arweave gateway.
  2. Retrieve a list of active AR.IO Gateways from the GAR by reading the contract state, or other available resources, and then fetch content from a gateway on the list.

Each strategy has its benefits and challenges, necessitating careful evaluation based on specific use cases.

Using ARCSS offers several advantages over hardcoded links to a specific gateway:

  1. Flexibility: ARCSS can be routed through any available AR.IO Gateway, ensuring content remains accessible even if a specific gateway is down or congested.
  2. Decentralization: By not being tied to a single gateway, ARCSS embodies the decentralized spirit of the web, reducing potential censorship points.
  3. Ease of Maintenance: Developers and content creators don't need to modify links if a gateway changes its URL or becomes unavailable. The WayFinder extension handles routing to an active gateway.
  4. Consistency: Users always receive the same content, regardless of the gateway used, ensuring a consistent user experience.

# Use Cases

# Decentralized Web Hosting with Flexible Access

With ARCSS, not only can websites be hosted on the Arweave network, but their accessibility is also enhanced. By using ARCSS, web developers can ensure that if a specific AR.IO Gateway is down, the content can still be accessed through another gateway, offering a more reliable and resilient user experience.

# Digital Archives and Preservation with Enhanced Sharing

Digitally archiving public domain works, especially in light of events like "banned books week" (opens new window), becomes more efficient with ARCSS. Historical institutions or enthusiasts can easily share specific ARCSS links to documents or media. Unlike hardcoded links which might break if a specific gateway goes offline, ARCSS ensures that the content remains consistently accessible.

# Media Sharing Platforms with Consistent Content Delivery

For platforms hosting user-generated content, ARCSS provides not just decentralized hosting but also a guarantee of content delivery. Even if a content piece becomes viral and one gateway gets congested, ARCSS ensures that users can still access the content through another gateway, providing a seamless experience.

# Decentralized Applications (DApps) with Reliable Front-End Accessibility

DApps, while benefiting from Arweave's permanent hosting, can further ensure their front-end remains consistently accessible to users by using ARCSS. If a DApp's front-end is accessed frequently, causing strain on one gateway, ARCSS can help ensure the load is distributed, and the DApp remains online and functional.

# How it Works

# Transaction ID

To access content tied to an Arweave Transaction ID (TxId), simply append the TxId to ar://:

ar://qI19W6spw-kzOGl4qUMNp2gwFH2EBfDXOFsjkcNyK9A
+    

# ARCSS

# Overview

The ARCSS protocol is a URI scheme (opens new window) designed to translate requests for Arweave content into an https:// request. Essentially, ARCSS allows for transforming traditional Arweave URLs like https://arweave.net/long-txid into more concise and user-friendly forms such as ar://txid or ar://arns-name. When combined with the AR.IO WayFinder browser extension (opens new window), the request can be directed to any number of functional AR.IO Gateways to serve the content.

An early technical breakdown of ARCSS, created by Arweave community member DMac, can be found here (opens new window).

# Browser Integration

ARCSS is currently facilitated via the WayFinder browser extension or internal application integration. The intention is to lead popular web browsers like Chrome and Brave towards a direct integration of ARCSS, similar to recent integrations of the ipfs:// protocol. Such integration would remove the need for a client-side extension and boost developers' confidence in embedding ARCSS in their websites.

# Internal Application Integration

Certain websites or apps may want to resolve Arweave Transaction ID's (TxId) internally. In these scenarios, they can process ARCSS internally without depending on browser support or WayFinder. A prime example is opensea.io (opens new window). Opensea, an NFT marketplace, frequently imports NFT metadata from external sources. If metadata employs ARCSS, Opensea internally resolves these, presenting content without redirecting users through an https:// link.

There are two main approaches to resolving ARCSS:

  1. Convert ARCSS into a request directed at a predefined Arweave gateway.
  2. Retrieve a list of active AR.IO Gateways from the GAR by reading the contract state, or other available resources, and then fetch content from a gateway on the list.

Each strategy has its benefits and challenges, necessitating careful evaluation based on specific use cases.

Using ARCSS offers several advantages over hardcoded links to a specific gateway:

  1. Flexibility: ARCSS can be routed through any available AR.IO Gateway, ensuring content remains accessible even if a specific gateway is down or congested.
  2. Decentralization: By not being tied to a single gateway, ARCSS embodies the decentralized spirit of the web, reducing potential censorship points.
  3. Ease of Maintenance: Developers and content creators don't need to modify links if a gateway changes its URL or becomes unavailable. The WayFinder extension handles routing to an active gateway.
  4. Consistency: Users always receive the same content, regardless of the gateway used, ensuring a consistent user experience.

# Use Cases

# Decentralized Web Hosting with Flexible Access

With ARCSS, not only can websites be hosted on the Arweave network, but their accessibility is also enhanced. By using ARCSS, web developers can ensure that if a specific AR.IO Gateway is down, the content can still be accessed through another gateway, offering a more reliable and resilient user experience.

# Digital Archives and Preservation with Enhanced Sharing

Digitally archiving public domain works, especially in light of events like "banned books week" (opens new window), becomes more efficient with ARCSS. Historical institutions or enthusiasts can easily share specific ARCSS links to documents or media. Unlike hardcoded links which might break if a specific gateway goes offline, ARCSS ensures that the content remains consistently accessible.

# Media Sharing Platforms with Consistent Content Delivery

For platforms hosting user-generated content, ARCSS provides not just decentralized hosting but also a guarantee of content delivery. Even if a content piece becomes viral and one gateway gets congested, ARCSS ensures that users can still access the content through another gateway, providing a seamless experience.

# Decentralized Applications (DApps) with Reliable Front-End Accessibility

DApps, while benefiting from Arweave's permanent hosting, can further ensure their front-end remains consistently accessible to users by using ARCSS. If a DApp's front-end is accessed frequently, causing strain on one gateway, ARCSS can help ensure the load is distributed, and the DApp remains online and functional.

# How it Works

# Transaction ID

To access content tied to an Arweave Transaction ID (TxId), simply append the TxId to ar://:

ar://qI19W6spw-kzOGl4qUMNp2gwFH2EBfDXOFsjkcNyK9A
 

Inputting this into a WayFinder-equipped browser will route your request through the right AR.IO Gateway, translating it as per your Routing Method settings.

# ArNS

Fetching content via an Arweave Name Service (ArNS) name is straightforward. Attach the ArNS name to ar://:

ar://good-morning
 

The ARCSS protocol, along with the WayFinder extension, discerns between TxIds and ArNS names. Once the suitable https:// request is formulated, the chosen gateway translates the ArNS name based on the ArNS smartweave contract.

# Wayfinder

The AR.IO WayFinder browser extension (opens new window) is a browser extension designed to facilitate the resolving of ar:// urls.

# v0.0.10

As of v0.0.10, Wayfinder supports the resolution of TXT records to Arwevae content on top level domains. This innovative feature leverages DNS TXT records to associate Arweave transaction IDs with human-readable domain names, facilitating intuitive and memorable access to permaweb content. By simply entering an AR:// URL with a domain name, Wayfinder resolves the corresponding Arweave transaction ID through DNS TXT records, redirecting users directly to the content hosted on the Arweave network.

Setup: Owners of a domain can set a TXT record for that domain following the format ARTX <Arweave TXID>.

AR:// Redirection: With a TXT record set properly, whenever a user (who has Wayfinder installed) enters an AR:// URL containing a domain name (e.g., ar://example.com), Wayfinder performs a DNS lookup for that TXT record in order to redirect to the Arweave content. The lookup is completed through a secure DNS-over-HTTPS query to ensure privacy and integrity.

Dynamic Content Resolution: After retrieving the TXT record, Wayfinder extracts that Arweave transaction ID and dynamically redirects the user to the content on the permaweb. This process is transparent to the user, providing a seamless experience as if accessing a traditional website.

# Key Features

  • Gasless: TXT records can be set without any onchain transactions that would require gas fees.
  • Easy Integration: Domain owners can easily link their permaweb content to their domains, making it accessible through a simple AR:// URL.
  • Dyncamic Content Access: Content links can be updated in real-time through DNS TXT records, without requiring any changes to the AR:// URL itself.
  • Enhanced User Experience: Offers users a familiar and easy-to-remember way to access permaweb content, leveraging standard web domain names.
  • Security and Privacy: Secure DNS-over-HTTPS queries for DNS lookups protect user privacy and enhances security.

# Use Cases

  • Branded Content Access: Companies and individuals can brand their permaweb content, making it accessible through their domain, enhancing brand visibility and user trust.
  • Dynamic Content Updates: Domain owners can easily update what Permaweb content their AR:// URL resolves to, which is ideal for frequently updated resources like documents, blogs, and application interfaces.
  • Educational and Informational Resources: Educational institutions and information providers can make their resources permanently available on the permaweb, accessible through simple, memorable URLs.

This feature marks a significant advancement in making decentralized content more accessible and user-friendly, bridging the gap between traditional internet usability and the permaweb’s permanence and censorship-resistant nature.

- + diff --git a/arns/index.html b/arns/index.html index 6078f267..e20345a4 100644 --- a/arns/index.html +++ b/arns/index.html @@ -13,11 +13,11 @@ - + -

# Arweave Name System (ArNS)

# Overview

Arweave URLs and Transaction IDs are long, difficult to remember, and occasionally miscategorized as spam. The Arweave Name System (ArNS) aims to resolve these problems in a decentralized manner. ArNS is a censorship-resistant naming system stored on Arweave, purchased with IO tokens, enabled through AR.IO gateway domains, and used to connect friendly domain names to permaweb dApps, web pages, data, and identities.

It's like an open, permissionless address book for anything on the permaweb, powered by SmartWeave.

This system works similarly to traditional DNS services, where users can purchase a name in a registry and DNS Name servers resolve these names to IP addresses. The system shall be flexible and allow users to purchase names permanently or lease them for a defined period based on their use case. With ArNS, the registry is decentralized, permanent, and stored on Arweave (with SmartWeave). This means that apps and infrastructure cannot just read the latest state of the registry but can also check any point in time in the past, creating a “Wayback Machine” of permanent data.

Users can register a name, like ardrive, within the ArNS Registry. Before owning a name, they must create an Arweave Name Token (ANT), a SmartWeave Token and open-source protocol used by ArNS to track the ownership and control over the name. ANTs allow the owner to set a pointer to any type of permaweb data, like a page, dApp or file, via its Arweave Transaction ID.

Each AR.IO gateway acts as both a SmartWeave cache and an ArNS Name resolver. They will generate the latest state of both the ArNS Registry and its related ANTs and serve this information rapidly for apps and users. AR.IO gateways will also resolve that name as one of their own subdomains, e.g., https://ardrive.arweave.net and proxy all requests to the associated Arweave Transaction ID. This means that ANTs work across all AR.IO gateways that support them: https://ardrive.ar-io.dev, https://ardrive.g8way.io/, etc.

Users can easily reference these friendly names in their browsers, and other applications and infrastructure can build rich solutions on top of these ArNS primitives.

Arweave Name System Interactions

# Name Registry

The ArNS Registry is a list of all the registered names and their associated ANT smart contract addresses. Registering a name requires spending IO tokens based upon the name length and purchase type. The system shall allow users to either lease a name on a yearly basis (maximum up to 5 years) or purchase that name permanently.

The registry uses the following key rules, embedded within the SmartWeave Contract:

  • The genesis prices of names are set within the contract itself; these are the starting conditions.
  • Name prices vary based on name length, purchase type (lease vs buy), lease duration, and the current Demand Factor. See the Dynamic Pricing section for more details.
  • Name records in the registry each include a pointer to its Arweave Name Token Smart Contract address, its lease end time, and undername allocation.
  • Anyone with available IO Tokens can extend any name’s active lease.
  • Anyone with available IO Tokens can purchase undername space for any name.
  • When a lease expires, there is a grace period where it can still be extended before anyone else can repurchase the name with a new ANT.

Once added, name records cannot be removed from the registry. A leased name’s associated ANT smart contract address cannot be changed until the lease has expired and a new one is purchased. Care must be taken by the owners of permanent name purchases to ensure that their ANT supports an evolve ability should it be desired to add or modify functionality in the future as these name purchases are permanently tied to the associated ANT. Owners of permanently purchased names must understand the consequences of private key loss, which results in not being able to update any data pointers for this name.

# Name Validation Rules

All names registered shall meet the following criteria:

  1. Valid names include only numbers 0-9, characters a-z and dashes.
  2. Dashes cannot be leading or trailing characters.
  3. Dashes cannot be used in single character domains.
  4. 1 character minimum, 51 characters maximum.
  5. Shall not be an invalid name predesignated to prevent unintentional use/abuse such as www.

# Arweave Name Token (ANT)

To establish ownership of a record in the ArNS Registry, each record contains both a friendly name and a reference to an Arweave Name Token, ANT. Name Tokens are unique SmartWeave tokens that give their owners the ability to update the Arweave Transaction IDs that their associated friendly names point to.

The ANT SmartWeave Contract is a standardized contract that contains the specific ArNS Record specification required by AR.IO gateways who resolve ArNS names and their Arweave Transaction IDs. It also contains other basic functionality to establish ownership and the ability to transfer ownership and update the Arweave Transaction ID.

Name Tokens have an owner, who can transfer the token and control all of its modifiable settings. These settings include modifying the time to live (ttl) for each name contained in the ANT, and other settings like the ANT Name, Ticker, and an ANT Controller. The controller can only manage the ANT and set and update records, name, and the ticker, but cannot transfer the ANT. Note that ANTs are initially created by an end user, in accordance with network standards, who then has to ability to transfer its ownership or assign a controller as they see fit.

Secondary markets could be created by ecosystem partners that facilitate the trade of Name Tokens. Additionally, tertiary markets could be created that support the leasing of these friendly names to other users. Such markets, if any, would be created by third parties unrelated to and outside of the scope of this paper or control of the Foundation.

The table below indicates some of the possible interactions with an ANT and who can perform them:

ANT Interactions
Type ANT Owner ANT Controller Any IO Token Holder
Transfer ANT
Add / remove controllers
Set records (pointers)
Update records, name, ticker
Extend / renew lease
Increase undernames
ANT Interactions

# Under_Names

ANT owners and controllers can configure multiple subdomains for their registered ArNS name known as “under_names” or more easily written “undernames”. These undernames are assigned individually at the time of registration or can be added on to any registered name at any time.

Undernames use an underscore “_” in place of a more typically used dot “.“ to separate the subdomain from the main ArNS domain.

This means users can trust dapp_ardrive just like you would trust ardrive since the owner of ardrive is the only one who can configure dapp_ardrive.

Some other features that undernames allow include:

  • Undernames are configured in the ANT that is referenced for a given name. ANT owners can add more undernames as subDomains in the ANT’s records object, each of which can point to a different Arweave Transaction ID.
  • Each registered name is provided with an allocation of 10 undernames by default. Additional undername space can be purchased individually and as needed.
  • Other users could never register a name that resembles an undername on ardrive since “_” is not allowed to be registered in the ArNS registry.
  • Another user can register dapp-ardrive but this is a separate ArNS domain altogether. In traditional DNS, it’s like the difference in trusting dapp-ardrive.io(suspicious!) over the legitimate dapp.ardrive.io
  • Undernames can go multiple levels deep, like version_dapp_ardrive but must not be longer than the total MAX_NAME_LENGTH of an ArNS name. The total amount of characters for a name string consisting of undernames and underscore separators is 63 characters.

Undernames give more versatility and utility to owning an ArNS name.

# Addressing Variable Market Conditions

The future market landscape is unpredictable, and the AR.IO Network smart contract is designed to be immutable, operating without governance or mechanisms for manual intervention. In addition, the traditional method of employing a pricing oracle to fix prices relative to a stable currency is not viable due to the infancy of the network as well as the inherent reliance on outside dependencies. Considering this, ArNS is designed to be self-contained and adaptive, ensuring that name prices always mirror network activity and market conditions.

To achieve this, ArNS incorporates:

  1. A dynamic pricing model that utilizes a “Demand Factor” to adjust fees in line with ArNS purchase activity.
  2. An auction system intended to seek fair market value for premium names, allowing initial prices to adapt based on actual user interest and bids. In this context, “premium names” are defined by their character count and purchase type (lease or permanent).

ArNS is designed to ensure that name valuations are always in sync with their true market worth, despite the unchangeable nature of the smart contract it operates on.

# Dynamic Pricing Model

The Arweave Name System (ArNS) introduces an adaptive pricing model for registering names within the AR.IO Network. The core objective is to strike a balance between market demand and pricing fairness, leveraging both static and dynamic pricing elements. The system differentiates prices based on character lengths of names and offers varied purchasing options such as leasing, permanent acquisition, and undernames.

A unique feature of the ArNS pricing mechanism is the integration of a Demand Factor (DF), a dynamic multiplier that adjusts name prices in response to market demand. The DF is determined by comparing the total revenue in IO tokens from the current period to a moving average of revenues from the preceding period window. Depending on whether revenue is above, below, or equal to this average, the DF can increase or decrease. These adjustments are contained within boundaries to prevent extreme pricing variations.

This comprehensive approach ensures that ArNS names are accessible and reasonably priced, adapting to market trends while maintaining an equitable and maintenance-free registration environment.

# Pricing Scenarios

There are several pricing models for leasing and purchasing names:

  • Leased Name, Instant Purchase: Allows a user to lease a name for a certain duration and have it available for use immediately by the lessee.

  • Permanent Name, Instant Purchase: Allows a user to purchase a name permanently and have it available for use immediately by the owner.

  • Leased Name, Auctioned: Allows a user to lease a name for a duration but as the name is considered premium, it must go through an auction process before it can be acquired and used by the lessee.

  • Permanent Name, Auctioned: Allows a user to purchase a name permanently but as the name is considered premium, it must go through an auction process before it can be acquired and used by the owner.

The table below summarizes the available purchase options for the name space:

Name Purchase Options
Type Lease Permanent
1-4 Characters Auction Auction
5-12 Characters Instant Auction
13-51 Characters Instant Instant
Name Purchase Options

# Dynamic Pricing Mechanics

Names are initially priced according to the Genesis Registration Fee (GRF), as set in the SmartWeave contract, with prices varying based on the length of the name. As the network's activity progresses, these fees give way to Base Registration Fees (BRF), which are modified by periodic step adjustments. The Demand Factor (DF) is a crucial component that dynamically scales prices, fluctuating with the network’s revenue trends.

Revenue in the network accumulates within the Protocol Balance through various streams, such as instant name leases or purchases, auction completions, lease extensions, and under_name transactions. This cumulative revenue impacts the Demand Factor, which in turn influences the current name prices.

The DF is adjusted by comparing the recent period’s revenue against a Revenue Moving Average (RMA) from the preceding seven periods. Based on this comparison, the DF can either increase, to reflect greater demand, or decrease, in response to diminished revenue, all within predetermined limits to prevent drastic fluctuations in pricing

The pricing system articulates various fees:

  • The Adjusted Registration Fee (ARF) is the BRF modified by the DF.

  • The Annual Fee is set as a proportion of the ARF.

  • Instant Lease Registration and Permabuy prices are derived from the ARF, adding the calculated annual fees over the desired years.

  • Auction parameters, including floor and ceiling prices for leases and permabuys, are directly influenced by the ARF.

The distinction between instant buy and auction for a name is determined based on its character length and whether it is a lease or permabuy. The auction process itself begins at a ceiling price – substantially higher than the floor – calculated as a multiple of the floor price which includes the ARF and relevant annual fees. As the auction progresses, the price decreases until a bid is placed or the floor is reached, determining the sale price.

The DF’s modifications are controlled by the network's recent performance against the RMA. An increase in revenue leads to a DF rise, signifying a thriving market demand, while a decrease indicates the opposite. This responsive adjustment mechanism ensures that the pricing model remains aligned with actual market activity.

Under_names are bundled with name registrations with additional ones available for purchase. The cost for extra under_names is a percentage of the current BRF, altered by the DF.

# Step Pricing Mechanics

The dynamic model shall utilize a “Step Pricing” concept that acts as a stabilizing mechanism to counteract swift and dramatic market shifts, ensuring registration costs remain aligned and predictable. Step pricing adjusts the Base Registration Fees when the Demand Factor reaches its minimum value for an extended period, updating the BRF to align with the current ARF, and resetting the DF to a neutral value. This allows for base prices to lower in extended droughts of low demand or high token value resulting in lower revenue generated to the protocol balance.

The below chart represents Step Pricing in action:

Step Pricing Action - Declining Demand

# Bid Initiated Dutch Auctions (BIDA)

Auctions within ArNS serve a pivotal role, particularly for names considered premium by the community where market value can be highly variable. The auction format enables true market price discovery, ensuring that names reflect their real-time worth as determined by actual demand. As such, certain names must go to public auction based on their character length and purchase type. These auctions shall follow a Dutch Auction model whereby the first user interested in a name must initiate the process by placing the first bid.

Dutch auctions work as follows: the first bid must be greater than or equal to the assigned floor price for the name. Once the first bid is placed, the timer for the auction begins. The auction begins at a price much higher than the floor price. As time passes, the purchase price progressively decreases until someone purchases it, or it hits the floor price, and the initial bidder receives the name.

This does not mean that the initial bidder must wait until the auction concludes. At any time, the initial bidder can place a second bid to purchase the name for the current purchase price, or a second bidder can discover this auction and do the same. The benefit of this system, versus an English Auction system, is that there will only ever be 2 bids, the bid to initiate the auction, and the final bid to purchase. This makes for a more compact and scalable SmartWeave Contract state.

Auction end dates are denoted by Arweave block height and established at the start of the auction. For example, the duration for an auction could be 14 days or 10,100 blocks.

# Auction Price Curve

For auctioned names, the progressively declining price of the name shall follow a power-law decay function:

P(t) = max(P0 * (1 – (k * t))^p, Pfloor)

where:

  • P(t), nameAuctionPrice is the amount of IO tokens required to win a purchase name in an auction.

  • P0, nameAuctionStartPrice is the starting price of this auction.

  • t, elapsedAuctionTime is the number of blocks that have elapsed since the start of the auction.

  • k, decayRate determines how quickly the price decreases over time.

  • p, exponentVariable determines the “shape” of the declining cost curve.

  • Pfloor, nameAuctionFloorPrice is the amount of IO used as the floor price and minimum bid to start this name purchase auction.

The values of k and p shall be optimized so that the name price approaches the floor price (Pfloor) by the end of the auction period.

Below is a representative auction curve resulting from this formula:

Example Auction Price Curve
- +

# Arweave Name System (ArNS)

# Overview

Arweave URLs and Transaction IDs are long, difficult to remember, and occasionally miscategorized as spam. The Arweave Name System (ArNS) aims to resolve these problems in a decentralized manner. ArNS is a censorship-resistant naming system stored on Arweave, purchased with IO tokens, enabled through AR.IO gateway domains, and used to connect friendly domain names to permaweb dApps, web pages, data, and identities.

It's like an open, permissionless address book for anything on the permaweb, powered by SmartWeave.

This system works similarly to traditional DNS services, where users can purchase a name in a registry and DNS Name servers resolve these names to IP addresses. The system shall be flexible and allow users to purchase names permanently or lease them for a defined period based on their use case. With ArNS, the registry is decentralized, permanent, and stored on Arweave (with SmartWeave). This means that apps and infrastructure cannot just read the latest state of the registry but can also check any point in time in the past, creating a “Wayback Machine” of permanent data.

Users can register a name, like ardrive, within the ArNS Registry. Before owning a name, they must create an Arweave Name Token (ANT), a SmartWeave Token and open-source protocol used by ArNS to track the ownership and control over the name. ANTs allow the owner to set a pointer to any type of permaweb data, like a page, dApp or file, via its Arweave Transaction ID.

Each AR.IO gateway acts as both a SmartWeave cache and an ArNS Name resolver. They will generate the latest state of both the ArNS Registry and its related ANTs and serve this information rapidly for apps and users. AR.IO gateways will also resolve that name as one of their own subdomains, e.g., https://ardrive.arweave.net and proxy all requests to the associated Arweave Transaction ID. This means that ANTs work across all AR.IO gateways that support them: https://ardrive.ar-io.dev, https://ardrive.g8way.io/, etc.

Users can easily reference these friendly names in their browsers, and other applications and infrastructure can build rich solutions on top of these ArNS primitives.

Arweave Name System Interactions

# Name Registry

The ArNS Registry is a list of all the registered names and their associated ANT smart contract addresses. Registering a name requires spending IO tokens based upon the name length and purchase type. The system shall allow users to either lease a name on a yearly basis (maximum up to 5 years) or purchase that name permanently.

The registry uses the following key rules, embedded within the SmartWeave Contract:

  • The genesis prices of names are set within the contract itself; these are the starting conditions.
  • Name prices vary based on name length, purchase type (lease vs buy), lease duration, and the current Demand Factor. See the Dynamic Pricing section for more details.
  • Name records in the registry each include a pointer to its Arweave Name Token Smart Contract address, its lease end time, and undername allocation.
  • Anyone with available IO Tokens can extend any name’s active lease.
  • Anyone with available IO Tokens can purchase undername space for any name.
  • When a lease expires, there is a grace period where it can still be extended before anyone else can repurchase the name with a new ANT.

Once added, name records cannot be removed from the registry. A leased name’s associated ANT smart contract address cannot be changed until the lease has expired and a new one is purchased. Care must be taken by the owners of permanent name purchases to ensure that their ANT supports an evolve ability should it be desired to add or modify functionality in the future as these name purchases are permanently tied to the associated ANT. Owners of permanently purchased names must understand the consequences of private key loss, which results in not being able to update any data pointers for this name.

# Name Validation Rules

All names registered shall meet the following criteria:

  1. Valid names include only numbers 0-9, characters a-z and dashes.
  2. Dashes cannot be leading or trailing characters.
  3. Dashes cannot be used in single character domains.
  4. 1 character minimum, 51 characters maximum.
  5. Shall not be an invalid name predesignated to prevent unintentional use/abuse such as www.

# Arweave Name Token (ANT)

To establish ownership of a record in the ArNS Registry, each record contains both a friendly name and a reference to an Arweave Name Token, ANT. Name Tokens are unique SmartWeave tokens that give their owners the ability to update the Arweave Transaction IDs that their associated friendly names point to.

The ANT SmartWeave Contract is a standardized contract that contains the specific ArNS Record specification required by AR.IO gateways who resolve ArNS names and their Arweave Transaction IDs. It also contains other basic functionality to establish ownership and the ability to transfer ownership and update the Arweave Transaction ID.

Name Tokens have an owner, who can transfer the token and control all of its modifiable settings. These settings include modifying the time to live (ttl) for each name contained in the ANT, and other settings like the ANT Name, Ticker, and an ANT Controller. The controller can only manage the ANT and set and update records, name, and the ticker, but cannot transfer the ANT. Note that ANTs are initially created by an end user, in accordance with network standards, who then has to ability to transfer its ownership or assign a controller as they see fit.

Secondary markets could be created by ecosystem partners that facilitate the trade of Name Tokens. Additionally, tertiary markets could be created that support the leasing of these friendly names to other users. Such markets, if any, would be created by third parties unrelated to and outside of the scope of this paper or control of the Foundation.

The table below indicates some of the possible interactions with an ANT and who can perform them:

ANT Interactions
Type ANT Owner ANT Controller Any IO Token Holder
Transfer ANT
Add / remove controllers
Set records (pointers)
Update records, name, ticker
Extend / renew lease
Increase undernames
ANT Interactions

# Under_Names

ANT owners and controllers can configure multiple subdomains for their registered ArNS name known as “under_names” or more easily written “undernames”. These undernames are assigned individually at the time of registration or can be added on to any registered name at any time.

Undernames use an underscore “_” in place of a more typically used dot “.“ to separate the subdomain from the main ArNS domain.

This means users can trust dapp_ardrive just like you would trust ardrive since the owner of ardrive is the only one who can configure dapp_ardrive.

Some other features that undernames allow include:

  • Undernames are configured in the ANT that is referenced for a given name. ANT owners can add more undernames as subDomains in the ANT’s records object, each of which can point to a different Arweave Transaction ID.
  • Each registered name is provided with an allocation of 10 undernames by default. Additional undername space can be purchased individually and as needed.
  • Other users could never register a name that resembles an undername on ardrive since “_” is not allowed to be registered in the ArNS registry.
  • Another user can register dapp-ardrive but this is a separate ArNS domain altogether. In traditional DNS, it’s like the difference in trusting dapp-ardrive.io(suspicious!) over the legitimate dapp.ardrive.io
  • Undernames can go multiple levels deep, like version_dapp_ardrive but must not be longer than the total MAX_NAME_LENGTH of an ArNS name. The total amount of characters for a name string consisting of undernames and underscore separators is 63 characters.

Undernames give more versatility and utility to owning an ArNS name.

# Addressing Variable Market Conditions

The future market landscape is unpredictable, and the AR.IO Network smart contract is designed to be immutable, operating without governance or mechanisms for manual intervention. In addition, the traditional method of employing a pricing oracle to fix prices relative to a stable currency is not viable due to the infancy of the network as well as the inherent reliance on outside dependencies. Considering this, ArNS is designed to be self-contained and adaptive, ensuring that name prices always mirror network activity and market conditions.

To achieve this, ArNS incorporates:

  1. A dynamic pricing model that utilizes a “Demand Factor” to adjust fees in line with ArNS purchase activity.
  2. An auction system intended to seek fair market value for premium names, allowing initial prices to adapt based on actual user interest and bids. In this context, “premium names” are defined by their character count and purchase type (lease or permanent).

ArNS is designed to ensure that name valuations are always in sync with their true market worth, despite the unchangeable nature of the smart contract it operates on.

# Dynamic Pricing Model

The Arweave Name System (ArNS) introduces an adaptive pricing model for registering names within the AR.IO Network. The core objective is to strike a balance between market demand and pricing fairness, leveraging both static and dynamic pricing elements. The system differentiates prices based on character lengths of names and offers varied purchasing options such as leasing, permanent acquisition, and undernames.

A unique feature of the ArNS pricing mechanism is the integration of a Demand Factor (DF), a dynamic multiplier that adjusts name prices in response to market demand. The DF is determined by comparing the total revenue in IO tokens from the current period to a moving average of revenues from the preceding period window. Depending on whether revenue is above, below, or equal to this average, the DF can increase or decrease. These adjustments are contained within boundaries to prevent extreme pricing variations.

This comprehensive approach ensures that ArNS names are accessible and reasonably priced, adapting to market trends while maintaining an equitable and maintenance-free registration environment.

# Pricing Scenarios

There are several pricing models for leasing and purchasing names:

  • Leased Name, Instant Purchase: Allows a user to lease a name for a certain duration and have it available for use immediately by the lessee.

  • Permanent Name, Instant Purchase: Allows a user to purchase a name permanently and have it available for use immediately by the owner.

  • Leased Name, Auctioned: Allows a user to lease a name for a duration but as the name is considered premium, it must go through an auction process before it can be acquired and used by the lessee.

  • Permanent Name, Auctioned: Allows a user to purchase a name permanently but as the name is considered premium, it must go through an auction process before it can be acquired and used by the owner.

The table below summarizes the available purchase options for the name space:

Name Purchase Options
Type Lease Permanent
1-4 Characters Auction Auction
5-12 Characters Instant Auction
13-51 Characters Instant Instant
Name Purchase Options

# Dynamic Pricing Mechanics

Names are initially priced according to the Genesis Registration Fee (GRF), as set in the SmartWeave contract, with prices varying based on the length of the name. As the network's activity progresses, these fees give way to Base Registration Fees (BRF), which are modified by periodic step adjustments. The Demand Factor (DF) is a crucial component that dynamically scales prices, fluctuating with the network’s revenue trends.

Revenue in the network accumulates within the Protocol Balance through various streams, such as instant name leases or purchases, auction completions, lease extensions, and under_name transactions. This cumulative revenue impacts the Demand Factor, which in turn influences the current name prices.

The DF is adjusted by comparing the recent period’s revenue against a Revenue Moving Average (RMA) from the preceding seven periods. Based on this comparison, the DF can either increase, to reflect greater demand, or decrease, in response to diminished revenue, all within predetermined limits to prevent drastic fluctuations in pricing

The pricing system articulates various fees:

  • The Adjusted Registration Fee (ARF) is the BRF modified by the DF.

  • The Annual Fee is set as a proportion of the ARF.

  • Instant Lease Registration and Permabuy prices are derived from the ARF, adding the calculated annual fees over the desired years.

  • Auction parameters, including floor and ceiling prices for leases and permabuys, are directly influenced by the ARF.

The distinction between instant buy and auction for a name is determined based on its character length and whether it is a lease or permabuy. The auction process itself begins at a ceiling price – substantially higher than the floor – calculated as a multiple of the floor price which includes the ARF and relevant annual fees. As the auction progresses, the price decreases until a bid is placed or the floor is reached, determining the sale price.

The DF’s modifications are controlled by the network's recent performance against the RMA. An increase in revenue leads to a DF rise, signifying a thriving market demand, while a decrease indicates the opposite. This responsive adjustment mechanism ensures that the pricing model remains aligned with actual market activity.

Under_names are bundled with name registrations with additional ones available for purchase. The cost for extra under_names is a percentage of the current BRF, altered by the DF.

# Step Pricing Mechanics

The dynamic model shall utilize a “Step Pricing” concept that acts as a stabilizing mechanism to counteract swift and dramatic market shifts, ensuring registration costs remain aligned and predictable. Step pricing adjusts the Base Registration Fees when the Demand Factor reaches its minimum value for an extended period, updating the BRF to align with the current ARF, and resetting the DF to a neutral value. This allows for base prices to lower in extended droughts of low demand or high token value resulting in lower revenue generated to the protocol balance.

The below chart represents Step Pricing in action:

Step Pricing Action - Declining Demand

# Bid Initiated Dutch Auctions (BIDA)

Auctions within ArNS serve a pivotal role, particularly for names considered premium by the community where market value can be highly variable. The auction format enables true market price discovery, ensuring that names reflect their real-time worth as determined by actual demand. As such, certain names must go to public auction based on their character length and purchase type. These auctions shall follow a Dutch Auction model whereby the first user interested in a name must initiate the process by placing the first bid.

Dutch auctions work as follows: the first bid must be greater than or equal to the assigned floor price for the name. Once the first bid is placed, the timer for the auction begins. The auction begins at a price much higher than the floor price. As time passes, the purchase price progressively decreases until someone purchases it, or it hits the floor price, and the initial bidder receives the name.

This does not mean that the initial bidder must wait until the auction concludes. At any time, the initial bidder can place a second bid to purchase the name for the current purchase price, or a second bidder can discover this auction and do the same. The benefit of this system, versus an English Auction system, is that there will only ever be 2 bids, the bid to initiate the auction, and the final bid to purchase. This makes for a more compact and scalable SmartWeave Contract state.

Auction end dates are denoted by Arweave block height and established at the start of the auction. For example, the duration for an auction could be 14 days or 10,100 blocks.

# Auction Price Curve

For auctioned names, the progressively declining price of the name shall follow a power-law decay function:

P(t) = max(P0 * (1 – (k * t))^p, Pfloor)

where:

  • P(t), nameAuctionPrice is the amount of IO tokens required to win a purchase name in an auction.

  • P0, nameAuctionStartPrice is the starting price of this auction.

  • t, elapsedAuctionTime is the number of blocks that have elapsed since the start of the auction.

  • k, decayRate determines how quickly the price decreases over time.

  • p, exponentVariable determines the “shape” of the declining cost curve.

  • Pfloor, nameAuctionFloorPrice is the amount of IO used as the floor price and minimum bid to start this name purchase auction.

The values of k and p shall be optimized so that the name price approaches the floor price (Pfloor) by the end of the auction period.

Below is a representative auction curve resulting from this formula:

Example Auction Price Curve
+ diff --git a/arweave/index.html b/arweave/index.html index 7d5f0cb8..4ca3312b 100644 --- a/arweave/index.html +++ b/arweave/index.html @@ -13,11 +13,11 @@ - + -

# Arweave

# The Permanence Pie

The permanent data storage ecosystem can be thought of as a three-tiered arrangement of protocols, services, and applications – dubbed here as “The Permanence Pie”.

Diagram 1: The Shell of Permanence Pie

The base layer of that pie is the Arweave protocol and network, which is the backbone of the permanent data storage ecosystem. It provides the infrastructure for data to be stored on the network in a decentralized manner and incentivizes nodes to keep the data stored for long periods of time.

The second layer is made up of services that sit on top of the Arweave protocol and network. These services include gateways, data retrieval services, and smart contracts that help to provide a seamless and functional experience for users, creators, and developers.

Finally, the top layer of the pie consists of applications that utilize the data stored on the Arweave network. This includes everything from simple applications that allow users to access and view their data to complex, decentralized applications that use the Arweave network as their backbone.

Each layer of the Permanence Pie is crucial to the overall success and growth of the permanent data storage ecosystem. The Arweave protocol and network provide the foundation for data storage, the services layer helps to facilitate data retrieval and usage, and the application layer brings the benefits of the ecosystem to users and developers alike.

# What Is Arweave

Arweave is a decentralized Layer 1 data storage protocol optimized for long-term permanent storage through its unique proof of access mechanism and tokenomic endowment model.

The information stored on Arweave is immutable and globally replicated by miner nodes. Instead of a traditional blockchain ledger which links blocks of transactions together in linear sequence, Arweave arranges blocks in a web known as the blockweave. These miner nodes secure the blockweave by operating the Succinct Proof of Random Access (SPoRA) algorithm. SPoRA requires miners to prove that they have access to recall randomly selected bits of weave data in order to produce and share a block. If successful, miners are rewarded in Arweave’s native AR token. These token rewards are derived from transaction fees as well as the network’s storage endowment. The endowment is a protocol-controlled pool of tokens designed to fund the projected cost of storage for 200+ years.

Diagram 2: Arweave - The Base Storage Layer

Arweave is file type agnostic – any type of file ranging from simple text files to family photos to complex web applications and archival databases can be stored on the network. To upload data, users must pay an amount of AR proportional to the size of the files being uploaded. Arweave is unique when compared with other decentralized storage solutions in that users only pay once to upload their files, then that is it – the files will be stored in perpetuity without any additional upkeep or subscription fees paid by the user.

The Arweave protocol is designed to handle 1,000 base layer transactions per block with new blocks being mined roughly every two minutes. Each transaction may also store an unbounded number of signed, non-AR-transacting data items assembled into a bundle (i.e., a bundled data item). Since its launch in 2018, this scalable architecture has allowed the network's weave size (total data stored on the network) to grow to 140.8 TB with approximately 1.5 billion base layer transactions and bundled data items submitted from over 181k unique wallets. The Arweave protocol endowment has received 60.7k AR to cover the projected storage costs with a cost of storage 0.858 AR/GiB. *

* data as of November 20, 2023

# Gateways

Gateways act as the front door to the permaweb. They are infrastructure utilities that sit above the base storage layer and allow users to access and query the information stored on Arweave. Gateways are specialized nodes responsible for data retrieval, caching, and serving as well as indexing transactions into a database that can be easily queried at scale. These functions are not performed by the Arweave mining nodes which are optimized for securing the Layer 1 blockweave and replicating information throughout the network through a mechanism known as Wildfire.

Diagram 3: Gateways - The Access Component

By taking on these responsibilities, gateways allow low cost and maintenance free hosting of static and dynamic content for users, creators, and developers. But there are costs associated with operating a gateway and Arweave does not offer any tokenomic incentives to offset these expenses. As the permaweb grows, these costs can become very significant.

Arweave.net, the primary community gateway, has scaled to meet the needs of the entire Arweave ecosystem and stored the entire weave. Over the last 6 months, this gateway indexed and cached approximately 3.4 million base layer transactions and bundled data items per day, served 233 million requests for data and node information per day, and responded to 3.2 million GQL queries per day. *

Gateway use cases, and the types of administrators who operate them, can range from at-home projects hosted by hobbyists to larger decentralized platforms and dApps run by small teams, all the way up to scaled out environments capable of supporting enterprise offerings.

* data as of November 20, 2023

# SmartWeave

SmartWeave is the smart contract protocol built for Arweave. This standard utilizes ‘lazy evaluation’ which performs computation on the client side as opposed to other smart contract protocols that compute at the node level. This strategy eliminates associated computation fees as well as unburdens developers from file size limitations and programming language requirements.

Diagram 4: SmartWeave - The Smart Contract Protocol

With SmartWeave, developers can create SmartWeave Tokens (SWT) and incorporate incentive structures into their applications and infrastructure. The AR.IO Network leverages the Warp SDK implementation of this technology for development of its network protocol and IO token.

# The Permaweb

The permaweb is the third and final layer of the permanence pie. The permaweb stands for the permanent web, a collection of all the webpages, apps, and files stored on top of the Arweave network and enlivened with the functionality of the AR.IO Network. For users and builders, the permaweb offers low-cost, zero maintenance, permanent hosting of their web apps, files, and web pages.

Diagram 5: The Permanence Pie

AR.IO is a global network, protocol, and currency built on top of Arweave that enables the permaweb.

# References and Further Reading

The following resources were used as reference material for this section and can provide the interested reader with additional information:

- +

# Arweave

# The Permanence Pie

The permanent data storage ecosystem can be thought of as a three-tiered arrangement of protocols, services, and applications – dubbed here as “The Permanence Pie”.

Diagram 1: The Shell of Permanence Pie

The base layer of that pie is the Arweave protocol and network, which is the backbone of the permanent data storage ecosystem. It provides the infrastructure for data to be stored on the network in a decentralized manner and incentivizes nodes to keep the data stored for long periods of time.

The second layer is made up of services that sit on top of the Arweave protocol and network. These services include gateways, data retrieval services, and smart contracts that help to provide a seamless and functional experience for users, creators, and developers.

Finally, the top layer of the pie consists of applications that utilize the data stored on the Arweave network. This includes everything from simple applications that allow users to access and view their data to complex, decentralized applications that use the Arweave network as their backbone.

Each layer of the Permanence Pie is crucial to the overall success and growth of the permanent data storage ecosystem. The Arweave protocol and network provide the foundation for data storage, the services layer helps to facilitate data retrieval and usage, and the application layer brings the benefits of the ecosystem to users and developers alike.

# What Is Arweave

Arweave is a decentralized Layer 1 data storage protocol optimized for long-term permanent storage through its unique proof of access mechanism and tokenomic endowment model.

The information stored on Arweave is immutable and globally replicated by miner nodes. Instead of a traditional blockchain ledger which links blocks of transactions together in linear sequence, Arweave arranges blocks in a web known as the blockweave. These miner nodes secure the blockweave by operating the Succinct Proof of Random Access (SPoRA) algorithm. SPoRA requires miners to prove that they have access to recall randomly selected bits of weave data in order to produce and share a block. If successful, miners are rewarded in Arweave’s native AR token. These token rewards are derived from transaction fees as well as the network’s storage endowment. The endowment is a protocol-controlled pool of tokens designed to fund the projected cost of storage for 200+ years.

Diagram 2: Arweave - The Base Storage Layer

Arweave is file type agnostic – any type of file ranging from simple text files to family photos to complex web applications and archival databases can be stored on the network. To upload data, users must pay an amount of AR proportional to the size of the files being uploaded. Arweave is unique when compared with other decentralized storage solutions in that users only pay once to upload their files, then that is it – the files will be stored in perpetuity without any additional upkeep or subscription fees paid by the user.

The Arweave protocol is designed to handle 1,000 base layer transactions per block with new blocks being mined roughly every two minutes. Each transaction may also store an unbounded number of signed, non-AR-transacting data items assembled into a bundle (i.e., a bundled data item). Since its launch in 2018, this scalable architecture has allowed the network's weave size (total data stored on the network) to grow to 140.8 TB with approximately 1.5 billion base layer transactions and bundled data items submitted from over 181k unique wallets. The Arweave protocol endowment has received 60.7k AR to cover the projected storage costs with a cost of storage 0.858 AR/GiB. *

* data as of November 20, 2023

# Gateways

Gateways act as the front door to the permaweb. They are infrastructure utilities that sit above the base storage layer and allow users to access and query the information stored on Arweave. Gateways are specialized nodes responsible for data retrieval, caching, and serving as well as indexing transactions into a database that can be easily queried at scale. These functions are not performed by the Arweave mining nodes which are optimized for securing the Layer 1 blockweave and replicating information throughout the network through a mechanism known as Wildfire.

Diagram 3: Gateways - The Access Component

By taking on these responsibilities, gateways allow low cost and maintenance free hosting of static and dynamic content for users, creators, and developers. But there are costs associated with operating a gateway and Arweave does not offer any tokenomic incentives to offset these expenses. As the permaweb grows, these costs can become very significant.

Arweave.net, the primary community gateway, has scaled to meet the needs of the entire Arweave ecosystem and stored the entire weave. Over the last 6 months, this gateway indexed and cached approximately 3.4 million base layer transactions and bundled data items per day, served 233 million requests for data and node information per day, and responded to 3.2 million GQL queries per day. *

Gateway use cases, and the types of administrators who operate them, can range from at-home projects hosted by hobbyists to larger decentralized platforms and dApps run by small teams, all the way up to scaled out environments capable of supporting enterprise offerings.

* data as of November 20, 2023

# SmartWeave

SmartWeave is the smart contract protocol built for Arweave. This standard utilizes ‘lazy evaluation’ which performs computation on the client side as opposed to other smart contract protocols that compute at the node level. This strategy eliminates associated computation fees as well as unburdens developers from file size limitations and programming language requirements.

Diagram 4: SmartWeave - The Smart Contract Protocol

With SmartWeave, developers can create SmartWeave Tokens (SWT) and incorporate incentive structures into their applications and infrastructure. The AR.IO Network leverages the Warp SDK implementation of this technology for development of its network protocol and IO token.

# The Permaweb

The permaweb is the third and final layer of the permanence pie. The permaweb stands for the permanent web, a collection of all the webpages, apps, and files stored on top of the Arweave network and enlivened with the functionality of the AR.IO Network. For users and builders, the permaweb offers low-cost, zero maintenance, permanent hosting of their web apps, files, and web pages.

Diagram 5: The Permanence Pie

AR.IO is a global network, protocol, and currency built on top of Arweave that enables the permaweb.

# References and Further Reading

The following resources were used as reference material for this section and can provide the interested reader with additional information:

+ diff --git a/assets/js/26.91899f09.js b/assets/js/26.97952e3d.js similarity index 99% rename from assets/js/26.91899f09.js rename to assets/js/26.97952e3d.js index 628dd8aa..e24b92fc 100644 --- a/assets/js/26.91899f09.js +++ b/assets/js/26.97952e3d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{317:function(e,a,t){"use strict";t.r(a);var n=t(10),r=Object(n.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"arweave-name-system-arns"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arweave-name-system-arns"}},[e._v("#")]),e._v(" Arweave Name System (ArNS)")]),e._v(" "),a("h2",{attrs:{id:"overview"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),a("p",[e._v("Arweave URLs and Transaction IDs are long, difficult to remember, and occasionally miscategorized as spam. The Arweave Name System (ArNS) aims to resolve these problems in a decentralized manner. ArNS is a censorship-resistant naming system stored on Arweave, purchased with IO tokens, enabled through AR.IO gateway domains, and used to connect friendly domain names to permaweb dApps, web pages, data, and identities.")]),e._v(" "),a("p",[e._v("It's like an open, permissionless address book for anything on the permaweb, powered by SmartWeave.")]),e._v(" "),a("p",[e._v("This system works similarly to traditional DNS services, where users can purchase a name in a registry and DNS Name servers resolve these names to IP addresses. The system shall be flexible and allow users to purchase names permanently or lease them for a defined period based on their use case. With ArNS, the registry is decentralized, permanent, and stored on Arweave (with SmartWeave). This means that apps and infrastructure cannot just read the latest state of the registry but can also check any point in time in the past, creating a “Wayback Machine” of permanent data.")]),e._v(" "),a("p",[e._v("Users can register a name, like "),a("em",[e._v("ardrive")]),e._v(", within the ArNS Registry. Before owning a name, they must create an Arweave Name Token (ANT), a SmartWeave Token and open-source protocol used by ArNS to track the ownership and control over the name. ANTs allow the owner to set a pointer to any type of permaweb data, like a page, dApp or file, via its Arweave Transaction ID.")]),e._v(" "),a("p",[e._v("Each AR.IO gateway acts as both a SmartWeave cache and an ArNS Name resolver. They will generate the latest state of both the ArNS Registry and its related ANTs and serve this information rapidly for apps and users. AR.IO gateways will also resolve that name as one of their own subdomains, e.g., "),a("em",[e._v("https://ardrive.arweave.net")]),e._v(" and proxy all requests to the associated Arweave Transaction ID. This means that ANTs work across all AR.IO gateways that support them: "),a("em",[e._v("https://ardrive.ar-io.dev")]),e._v(", "),a("em",[e._v("https://ardrive.g8way.io/")]),e._v(", etc.")]),e._v(" "),a("p",[e._v("Users can easily reference these friendly names in their browsers, and other applications and infrastructure can build rich solutions on top of these ArNS primitives.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/aa-diagram-1.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Arweave Name System Interactions")]),e._v(" "),a("h2",{attrs:{id:"name-registry"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#name-registry"}},[e._v("#")]),e._v(" Name Registry")]),e._v(" "),a("p",[e._v("The ArNS Registry is a list of all the registered names and their associated ANT smart contract addresses. Registering a name requires spending IO tokens based upon the name length and purchase type. The system shall allow users to either lease a name on a yearly basis (maximum up to 5 years) or purchase that name permanently.")]),e._v(" "),a("p",[e._v("The registry uses the following key rules, embedded within the SmartWeave Contract:")]),e._v(" "),a("ul",[a("li",[e._v("The genesis prices of names are set within the contract itself; these are the starting conditions.")]),e._v(" "),a("li",[e._v("Name prices vary based on name length, purchase type (lease vs buy), lease duration, and the current Demand Factor. See the Dynamic Pricing section for more details.")]),e._v(" "),a("li",[e._v("Name records in the registry each include a pointer to its Arweave Name Token Smart Contract address, its lease end time, and undername allocation.")]),e._v(" "),a("li",[e._v("Anyone with available IO Tokens can extend any name’s active lease.")]),e._v(" "),a("li",[e._v("Anyone with available IO Tokens can purchase undername space for any name.")]),e._v(" "),a("li",[e._v("When a lease expires, there is a grace period where it can still be extended before anyone else can repurchase the name with a new ANT.")])]),e._v(" "),a("p",[e._v("Once added, name records cannot be removed from the registry. A leased name’s associated ANT smart contract address cannot be changed until the lease has expired and a new one is purchased. Care must be taken by the owners of permanent name purchases to ensure that their ANT supports an "),a("code",[e._v("evolve")]),e._v(" ability should it be desired to add or modify functionality in the future as these name purchases are permanently tied to the associated ANT. Owners of permanently purchased names must understand the consequences of private key loss, which results in not being able to update any data pointers for this name.")]),e._v(" "),a("h3",{attrs:{id:"name-validation-rules"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#name-validation-rules"}},[e._v("#")]),e._v(" Name Validation Rules")]),e._v(" "),a("p",[e._v("All names registered shall meet the following criteria:")]),e._v(" "),a("ol",[a("li",[e._v("Valid names include only numbers 0-9, characters a-z and dashes.")]),e._v(" "),a("li",[e._v("Dashes cannot be leading or trailing characters.")]),e._v(" "),a("li",[e._v("Dashes cannot be used in single character domains.")]),e._v(" "),a("li",[e._v("1 character minimum, 51 characters maximum.")]),e._v(" "),a("li",[e._v("Shall not be an invalid name predesignated to prevent unintentional use/abuse such as www.")])]),e._v(" "),a("h2",{attrs:{id:"arweave-name-token-ant"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arweave-name-token-ant"}},[e._v("#")]),e._v(" Arweave Name Token (ANT)")]),e._v(" "),a("p",[e._v("To establish ownership of a record in the ArNS Registry, each record contains both a friendly name and a reference to an Arweave Name Token, ANT. Name Tokens are unique SmartWeave tokens that give their owners the ability to update the Arweave Transaction IDs that their associated friendly names point to.")]),e._v(" "),a("p",[e._v("The ANT SmartWeave Contract is a standardized contract that contains the specific ArNS Record specification required by AR.IO gateways who resolve ArNS names and their Arweave Transaction IDs. It also contains other basic functionality to establish ownership and the ability to transfer ownership and update the Arweave Transaction ID.")]),e._v(" "),a("p",[e._v("Name Tokens have an owner, who can transfer the token and control all of its modifiable settings. These settings include modifying the time to live ("),a("em",[e._v("ttl")]),e._v(") for each name contained in the ANT, and other settings like the ANT Name, Ticker, and an ANT Controller. The controller can only manage the ANT and set and update records, name, and the ticker, but cannot transfer the ANT. Note that ANTs are initially created by an end user, in accordance with network standards, who then has to ability to transfer its ownership or assign a controller as they see fit.")]),e._v(" "),a("p",[e._v("Secondary markets could be created by ecosystem partners that facilitate the trade of Name Tokens. Additionally, tertiary markets could be created that support the leasing of these friendly names to other users. Such markets, if any, would be created by third parties unrelated to and outside of the scope of this paper or control of the Foundation.")]),e._v(" "),a("p",[e._v("The table below indicates some of the possible interactions with an ANT and who can perform them:")]),e._v(" "),a("center",[a("table",{staticClass:"inline-table"},[a("tr",[a("th",{staticStyle:{"text-align":"center"},attrs:{colspan:"4"}},[e._v("ANT Interactions")])]),e._v(" "),a("tr",[a("th",[e._v("Type")]),e._v(" "),a("th",[e._v("ANT Owner")]),e._v(" "),a("th",[e._v("ANT Controller")]),e._v(" "),a("th",[e._v("Any IO Token Holder")])]),e._v(" "),a("tr",[a("td",[e._v("Transfer ANT")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td"),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[e._v("Add / remove controllers")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td"),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[e._v("Set records (pointers)")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[e._v("Update records, name, ticker")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[e._v("Extend / renew lease")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")])]),e._v(" "),a("tr",[a("td",[e._v("Increase undernames")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")])])])]),e._v(" "),a("div",{staticClass:"caption"},[e._v("ANT Interactions")]),e._v(" "),a("h3",{attrs:{id:"under-names"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#under-names"}},[e._v("#")]),e._v(" Under_Names")]),e._v(" "),a("p",[e._v("ANT owners and controllers can configure multiple subdomains for their registered ArNS name known as “under_names” or more easily written “undernames”. These undernames are assigned individually at the time of registration or can be added on to any registered name at any time.")]),e._v(" "),a("p",[e._v("Undernames use an underscore “"),a("code",[e._v("_")]),e._v("” in place of a more typically used dot “"),a("code",[e._v(".")]),e._v("“ to separate the subdomain from the main ArNS domain.")]),e._v(" "),a("p",[e._v("This means users can trust "),a("em",[e._v("dapp_ardrive")]),e._v(" just like you would trust ardrive since the owner of "),a("em",[e._v("ardrive")]),e._v(" is the only one who can configure "),a("em",[e._v("dapp_ardrive")]),e._v(".")]),e._v(" "),a("p",[e._v("Some other features that undernames allow include:")]),e._v(" "),a("ul",[a("li",[e._v("Undernames are configured in the ANT that is referenced for a given name. ANT owners can add more undernames as "),a("em",[e._v("subDomains")]),e._v(" in the ANT’s records object, each of which can point to a different Arweave Transaction ID.")]),e._v(" "),a("li",[e._v("Each registered name is provided with an allocation of 10 undernames by default. Additional undername space can be purchased individually and as needed.")]),e._v(" "),a("li",[e._v("Other users could never register a name that resembles an undername on ardrive since “_” is not allowed to be registered in the ArNS registry.")]),e._v(" "),a("li",[e._v("Another user can register "),a("em",[e._v("dapp-ardrive")]),e._v(" but this is a separate ArNS domain altogether. In traditional DNS, it’s like the difference in trusting "),a("em",[e._v("dapp-ardrive.io")]),e._v("(suspicious!) over the legitimate dapp.ardrive.io")]),e._v(" "),a("li",[e._v("Undernames can go multiple levels deep, like "),a("em",[e._v("version_dapp_ardrive")]),e._v(" but must not be longer than the total "),a("em",[e._v("MAX_NAME_LENGTH")]),e._v(" of an ArNS name. The total amount of characters for a name string consisting of undernames and underscore separators is 63 characters.")])]),e._v(" "),a("p",[e._v("Undernames give more versatility and utility to owning an ArNS name.")]),e._v(" "),a("h2",{attrs:{id:"addressing-variable-market-conditions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#addressing-variable-market-conditions"}},[e._v("#")]),e._v(" Addressing Variable Market Conditions")]),e._v(" "),a("p",[e._v("The future market landscape is unpredictable, and the AR.IO Network smart contract is designed to be immutable, operating without governance or mechanisms for manual intervention. In addition, the traditional method of employing a pricing oracle to fix prices relative to a stable currency is not viable due to the infancy of the network as well as the inherent reliance on outside dependencies. Considering this, ArNS is designed to be self-contained and adaptive, ensuring that name prices always mirror network activity and market conditions.")]),e._v(" "),a("p",[e._v("To achieve this, ArNS incorporates:")]),e._v(" "),a("ol",[a("li",[e._v("A dynamic pricing model that utilizes a “Demand Factor” to adjust fees in line with ArNS purchase activity.")]),e._v(" "),a("li",[e._v("An auction system intended to seek fair market value for premium names, allowing initial prices to adapt based on actual user interest and bids. In this context, “premium names” are defined by their character count and purchase type (lease or permanent).")])]),e._v(" "),a("p",[e._v("ArNS is designed to ensure that name valuations are always in sync with their true market worth, despite the unchangeable nature of the smart contract it operates on.")]),e._v(" "),a("h2",{attrs:{id:"dynamic-pricing-model"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-pricing-model"}},[e._v("#")]),e._v(" Dynamic Pricing Model")]),e._v(" "),a("p",[e._v("The Arweave Name System (ArNS) introduces an adaptive pricing model for registering names within the AR.IO Network. The core objective is to strike a balance between market demand and pricing fairness, leveraging both static and dynamic pricing elements. The system differentiates prices based on character lengths of names and offers varied purchasing options such as leasing, permanent acquisition, and undernames.")]),e._v(" "),a("p",[e._v("A unique feature of the ArNS pricing mechanism is the integration of a Demand Factor (DF), a dynamic multiplier that adjusts name prices in response to market demand. The DF is determined by comparing the total revenue in IO tokens from the current period to a moving average of revenues from the preceding period window. Depending on whether revenue is above, below, or equal to this average, the DF can increase or decrease. These adjustments are contained within boundaries to prevent extreme pricing variations.")]),e._v(" "),a("p",[e._v("This comprehensive approach ensures that ArNS names are accessible and reasonably priced, adapting to market trends while maintaining an equitable and maintenance-free registration environment.")]),e._v(" "),a("h3",{attrs:{id:"pricing-scenarios"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pricing-scenarios"}},[e._v("#")]),e._v(" Pricing Scenarios")]),e._v(" "),a("p",[e._v("There are several pricing models for leasing and purchasing names:")]),e._v(" "),a("ul",[a("li",[a("p",[a("strong",[e._v("Leased Name, Instant Purchase")]),e._v(": Allows a user to lease a name for a certain duration and have it available for use immediately by the lessee.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Permanent Name, Instant Purchase")]),e._v(": Allows a user to purchase a name permanently and have it available for use immediately by the owner.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Leased Name, Auctioned")]),e._v(": Allows a user to lease a name for a duration but as the name is considered premium, it must go through an auction process before it can be acquired and used by the lessee.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Permanent Name, Auctioned")]),e._v(": Allows a user to purchase a name permanently but as the name is considered premium, it must go through an auction process before it can be acquired and used by the owner.")])])]),e._v(" "),a("p",[e._v("The table below summarizes the available purchase options for the name space:")]),e._v(" "),a("center",[a("table",{staticClass:"inline-table"},[a("tr",[a("th",{staticStyle:{"text-align":"center"},attrs:{colspan:"3"}},[e._v("Name Purchase Options")])]),e._v(" "),a("tr",[a("th",[e._v("Type")]),e._v(" "),a("th",[e._v("Lease")]),e._v(" "),a("th",[e._v("Permanent")])]),e._v(" "),a("tr",[a("td",[e._v("1-4 Characters")]),e._v(" "),a("td",[e._v("Auction")]),e._v(" "),a("td",[e._v("Auction")])]),e._v(" "),a("tr",[a("td",[e._v("5-12 Characters")]),e._v(" "),a("td",[e._v("Instant")]),e._v(" "),a("td",[e._v("Auction")])]),e._v(" "),a("tr",[a("td",[e._v("13-51 Characters")]),e._v(" "),a("td",[e._v("Instant")]),e._v(" "),a("td",[e._v("Instant")])])])]),e._v(" "),a("div",{staticClass:"caption"},[e._v("Name Purchase Options")]),e._v(" "),a("h3",{attrs:{id:"dynamic-pricing-mechanics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-pricing-mechanics"}},[e._v("#")]),e._v(" Dynamic Pricing Mechanics")]),e._v(" "),a("p",[e._v("Names are initially priced according to the Genesis Registration Fee (GRF), as set in the SmartWeave contract, with prices varying based on the length of the name. As the network's activity progresses, these fees give way to Base Registration Fees (BRF), which are modified by periodic step adjustments. The Demand Factor (DF) is a crucial component that dynamically scales prices, fluctuating with the network’s revenue trends.")]),e._v(" "),a("p",[e._v("Revenue in the network accumulates within the Protocol Balance through various streams, such as instant name leases or purchases, auction completions, lease extensions, and under_name transactions. This cumulative revenue impacts the Demand Factor, which in turn influences the current name prices.")]),e._v(" "),a("p",[e._v("The DF is adjusted by comparing the recent period’s revenue against a Revenue Moving Average (RMA) from the preceding seven periods. Based on this comparison, the DF can either increase, to reflect greater demand, or decrease, in response to diminished revenue, all within predetermined limits to prevent drastic fluctuations in pricing")]),e._v(" "),a("p",[e._v("The pricing system articulates various fees:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("The Adjusted Registration Fee (ARF) is the BRF modified by the DF.")])]),e._v(" "),a("li",[a("p",[e._v("The Annual Fee is set as a proportion of the ARF.")])]),e._v(" "),a("li",[a("p",[e._v("Instant Lease Registration and Permabuy prices are derived from the ARF, adding the calculated annual fees over the desired years.")])]),e._v(" "),a("li",[a("p",[e._v("Auction parameters, including floor and ceiling prices for leases and permabuys, are directly influenced by the ARF.")])])]),e._v(" "),a("p",[e._v("The distinction between instant buy and auction for a name is determined based on its character length and whether it is a lease or permabuy. The auction process itself begins at a ceiling price – substantially higher than the floor – calculated as a multiple of the floor price which includes the ARF and relevant annual fees. As the auction progresses, the price decreases until a bid is placed or the floor is reached, determining the sale price.")]),e._v(" "),a("p",[e._v("The DF’s modifications are controlled by the network's recent performance against the RMA. An increase in revenue leads to a DF rise, signifying a thriving market demand, while a decrease indicates the opposite. This responsive adjustment mechanism ensures that the pricing model remains aligned with actual market activity.")]),e._v(" "),a("p",[e._v("Under_names are bundled with name registrations with additional ones available for purchase. The cost for extra under_names is a percentage of the current BRF, altered by the DF.")]),e._v(" "),a("h3",{attrs:{id:"step-pricing-mechanics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#step-pricing-mechanics"}},[e._v("#")]),e._v(" Step Pricing Mechanics")]),e._v(" "),a("p",[e._v("The dynamic model shall utilize a “Step Pricing” concept that acts as a stabilizing mechanism to counteract swift and dramatic market shifts, ensuring registration costs remain aligned and predictable. Step pricing adjusts the Base Registration Fees when the Demand Factor reaches its minimum value for an extended period, updating the BRF to align with the current ARF, and resetting the DF to a neutral value. This allows for base prices to lower in extended droughts of low demand or high token value resulting in lower revenue generated to the protocol balance.")]),e._v(" "),a("p",[e._v("The below chart represents Step Pricing in action:")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/aa-diagram-2.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Step Pricing Action - Declining Demand")]),e._v(" "),a("h2",{attrs:{id:"bid-initiated-dutch-auctions-bida"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bid-initiated-dutch-auctions-bida"}},[e._v("#")]),e._v(" Bid Initiated Dutch Auctions (BIDA)")]),e._v(" "),a("p",[e._v("Auctions within ArNS serve a pivotal role, particularly for names considered premium by the community where market value can be highly variable. The auction format enables true market price discovery, ensuring that names reflect their real-time worth as determined by actual demand. As such, certain names must go to public auction based on their character length and purchase type. These auctions shall follow a Dutch Auction model whereby the first user interested in a name must initiate the process by placing the first bid.")]),e._v(" "),a("p",[e._v("Dutch auctions work as follows: the first bid must be greater than or equal to the assigned floor price for the name. Once the first bid is placed, the timer for the auction begins. The auction begins at a price much higher than the floor price. As time passes, the purchase price progressively decreases until someone purchases it, or it hits the floor price, and the initial bidder receives the name.")]),e._v(" "),a("p",[e._v("This does not mean that the initial bidder must wait until the auction concludes. At any time, the initial bidder can place a second bid to purchase the name for the current purchase price, or a second bidder can discover this auction and do the same. The benefit of this system, versus an English Auction system, is that there will only ever be 2 bids, the bid to initiate the auction, and the final bid to purchase. This makes for a more compact and scalable SmartWeave Contract state.")]),e._v(" "),a("p",[e._v("Auction end dates are denoted by Arweave block height and established at the start of the auction. For example, the duration for an auction could be 14 days or 10,100 blocks.")]),e._v(" "),a("h3",{attrs:{id:"auction-price-curve"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auction-price-curve"}},[e._v("#")]),e._v(" Auction Price Curve")]),e._v(" "),a("p",[e._v("For auctioned names, the progressively declining price of the name shall follow a power-law decay function:")]),e._v(" "),a("center",[e._v("P(t) = max(P0 * (1 – (k * t))^p, Pfloor)")]),e._v(" "),a("p",[e._v("where:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("P(t), "),a("em",[e._v("nameAuctionPrice")]),e._v(" is the amount of IO tokens required to win a purchase name in an auction.")])]),e._v(" "),a("li",[a("p",[e._v("P0, "),a("em",[e._v("nameAuctionStartPrice")]),e._v(" is the starting price of this auction.")])]),e._v(" "),a("li",[a("p",[e._v("t, "),a("em",[e._v("elapsedAuctionTime")]),e._v(" is the number of blocks that have elapsed since the start of the auction.")])]),e._v(" "),a("li",[a("p",[e._v("k, "),a("em",[e._v("decayRate")]),e._v(" determines how quickly the price decreases over time.")])]),e._v(" "),a("li",[a("p",[e._v("p, "),a("em",[e._v("exponentVariable")]),e._v(" determines the “shape” of the declining cost curve.")])]),e._v(" "),a("li",[a("p",[e._v("Pfloor, "),a("em",[e._v("nameAuctionFloorPrice")]),e._v(" is the amount of IO used as the floor price and minimum bid to start this name purchase auction.")])])]),e._v(" "),a("p",[e._v("The values of k and p shall be optimized so that the name price approaches the floor price (Pfloor) by the end of the auction period.")]),e._v(" "),a("p",[e._v("Below is a representative auction curve resulting from this formula:")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/aa-diagram-3.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Example Auction Price Curve")])],1)}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{318:function(e,a,t){"use strict";t.r(a);var n=t(10),r=Object(n.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"arweave-name-system-arns"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arweave-name-system-arns"}},[e._v("#")]),e._v(" Arweave Name System (ArNS)")]),e._v(" "),a("h2",{attrs:{id:"overview"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),a("p",[e._v("Arweave URLs and Transaction IDs are long, difficult to remember, and occasionally miscategorized as spam. The Arweave Name System (ArNS) aims to resolve these problems in a decentralized manner. ArNS is a censorship-resistant naming system stored on Arweave, purchased with IO tokens, enabled through AR.IO gateway domains, and used to connect friendly domain names to permaweb dApps, web pages, data, and identities.")]),e._v(" "),a("p",[e._v("It's like an open, permissionless address book for anything on the permaweb, powered by SmartWeave.")]),e._v(" "),a("p",[e._v("This system works similarly to traditional DNS services, where users can purchase a name in a registry and DNS Name servers resolve these names to IP addresses. The system shall be flexible and allow users to purchase names permanently or lease them for a defined period based on their use case. With ArNS, the registry is decentralized, permanent, and stored on Arweave (with SmartWeave). This means that apps and infrastructure cannot just read the latest state of the registry but can also check any point in time in the past, creating a “Wayback Machine” of permanent data.")]),e._v(" "),a("p",[e._v("Users can register a name, like "),a("em",[e._v("ardrive")]),e._v(", within the ArNS Registry. Before owning a name, they must create an Arweave Name Token (ANT), a SmartWeave Token and open-source protocol used by ArNS to track the ownership and control over the name. ANTs allow the owner to set a pointer to any type of permaweb data, like a page, dApp or file, via its Arweave Transaction ID.")]),e._v(" "),a("p",[e._v("Each AR.IO gateway acts as both a SmartWeave cache and an ArNS Name resolver. They will generate the latest state of both the ArNS Registry and its related ANTs and serve this information rapidly for apps and users. AR.IO gateways will also resolve that name as one of their own subdomains, e.g., "),a("em",[e._v("https://ardrive.arweave.net")]),e._v(" and proxy all requests to the associated Arweave Transaction ID. This means that ANTs work across all AR.IO gateways that support them: "),a("em",[e._v("https://ardrive.ar-io.dev")]),e._v(", "),a("em",[e._v("https://ardrive.g8way.io/")]),e._v(", etc.")]),e._v(" "),a("p",[e._v("Users can easily reference these friendly names in their browsers, and other applications and infrastructure can build rich solutions on top of these ArNS primitives.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/aa-diagram-1.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Arweave Name System Interactions")]),e._v(" "),a("h2",{attrs:{id:"name-registry"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#name-registry"}},[e._v("#")]),e._v(" Name Registry")]),e._v(" "),a("p",[e._v("The ArNS Registry is a list of all the registered names and their associated ANT smart contract addresses. Registering a name requires spending IO tokens based upon the name length and purchase type. The system shall allow users to either lease a name on a yearly basis (maximum up to 5 years) or purchase that name permanently.")]),e._v(" "),a("p",[e._v("The registry uses the following key rules, embedded within the SmartWeave Contract:")]),e._v(" "),a("ul",[a("li",[e._v("The genesis prices of names are set within the contract itself; these are the starting conditions.")]),e._v(" "),a("li",[e._v("Name prices vary based on name length, purchase type (lease vs buy), lease duration, and the current Demand Factor. See the Dynamic Pricing section for more details.")]),e._v(" "),a("li",[e._v("Name records in the registry each include a pointer to its Arweave Name Token Smart Contract address, its lease end time, and undername allocation.")]),e._v(" "),a("li",[e._v("Anyone with available IO Tokens can extend any name’s active lease.")]),e._v(" "),a("li",[e._v("Anyone with available IO Tokens can purchase undername space for any name.")]),e._v(" "),a("li",[e._v("When a lease expires, there is a grace period where it can still be extended before anyone else can repurchase the name with a new ANT.")])]),e._v(" "),a("p",[e._v("Once added, name records cannot be removed from the registry. A leased name’s associated ANT smart contract address cannot be changed until the lease has expired and a new one is purchased. Care must be taken by the owners of permanent name purchases to ensure that their ANT supports an "),a("code",[e._v("evolve")]),e._v(" ability should it be desired to add or modify functionality in the future as these name purchases are permanently tied to the associated ANT. Owners of permanently purchased names must understand the consequences of private key loss, which results in not being able to update any data pointers for this name.")]),e._v(" "),a("h3",{attrs:{id:"name-validation-rules"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#name-validation-rules"}},[e._v("#")]),e._v(" Name Validation Rules")]),e._v(" "),a("p",[e._v("All names registered shall meet the following criteria:")]),e._v(" "),a("ol",[a("li",[e._v("Valid names include only numbers 0-9, characters a-z and dashes.")]),e._v(" "),a("li",[e._v("Dashes cannot be leading or trailing characters.")]),e._v(" "),a("li",[e._v("Dashes cannot be used in single character domains.")]),e._v(" "),a("li",[e._v("1 character minimum, 51 characters maximum.")]),e._v(" "),a("li",[e._v("Shall not be an invalid name predesignated to prevent unintentional use/abuse such as www.")])]),e._v(" "),a("h2",{attrs:{id:"arweave-name-token-ant"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arweave-name-token-ant"}},[e._v("#")]),e._v(" Arweave Name Token (ANT)")]),e._v(" "),a("p",[e._v("To establish ownership of a record in the ArNS Registry, each record contains both a friendly name and a reference to an Arweave Name Token, ANT. Name Tokens are unique SmartWeave tokens that give their owners the ability to update the Arweave Transaction IDs that their associated friendly names point to.")]),e._v(" "),a("p",[e._v("The ANT SmartWeave Contract is a standardized contract that contains the specific ArNS Record specification required by AR.IO gateways who resolve ArNS names and their Arweave Transaction IDs. It also contains other basic functionality to establish ownership and the ability to transfer ownership and update the Arweave Transaction ID.")]),e._v(" "),a("p",[e._v("Name Tokens have an owner, who can transfer the token and control all of its modifiable settings. These settings include modifying the time to live ("),a("em",[e._v("ttl")]),e._v(") for each name contained in the ANT, and other settings like the ANT Name, Ticker, and an ANT Controller. The controller can only manage the ANT and set and update records, name, and the ticker, but cannot transfer the ANT. Note that ANTs are initially created by an end user, in accordance with network standards, who then has to ability to transfer its ownership or assign a controller as they see fit.")]),e._v(" "),a("p",[e._v("Secondary markets could be created by ecosystem partners that facilitate the trade of Name Tokens. Additionally, tertiary markets could be created that support the leasing of these friendly names to other users. Such markets, if any, would be created by third parties unrelated to and outside of the scope of this paper or control of the Foundation.")]),e._v(" "),a("p",[e._v("The table below indicates some of the possible interactions with an ANT and who can perform them:")]),e._v(" "),a("center",[a("table",{staticClass:"inline-table"},[a("tr",[a("th",{staticStyle:{"text-align":"center"},attrs:{colspan:"4"}},[e._v("ANT Interactions")])]),e._v(" "),a("tr",[a("th",[e._v("Type")]),e._v(" "),a("th",[e._v("ANT Owner")]),e._v(" "),a("th",[e._v("ANT Controller")]),e._v(" "),a("th",[e._v("Any IO Token Holder")])]),e._v(" "),a("tr",[a("td",[e._v("Transfer ANT")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td"),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[e._v("Add / remove controllers")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td"),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[e._v("Set records (pointers)")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[e._v("Update records, name, ticker")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[e._v("Extend / renew lease")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")])]),e._v(" "),a("tr",[a("td",[e._v("Increase undernames")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")]),e._v(" "),a("td",[e._v("✔")])])])]),e._v(" "),a("div",{staticClass:"caption"},[e._v("ANT Interactions")]),e._v(" "),a("h3",{attrs:{id:"under-names"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#under-names"}},[e._v("#")]),e._v(" Under_Names")]),e._v(" "),a("p",[e._v("ANT owners and controllers can configure multiple subdomains for their registered ArNS name known as “under_names” or more easily written “undernames”. These undernames are assigned individually at the time of registration or can be added on to any registered name at any time.")]),e._v(" "),a("p",[e._v("Undernames use an underscore “"),a("code",[e._v("_")]),e._v("” in place of a more typically used dot “"),a("code",[e._v(".")]),e._v("“ to separate the subdomain from the main ArNS domain.")]),e._v(" "),a("p",[e._v("This means users can trust "),a("em",[e._v("dapp_ardrive")]),e._v(" just like you would trust ardrive since the owner of "),a("em",[e._v("ardrive")]),e._v(" is the only one who can configure "),a("em",[e._v("dapp_ardrive")]),e._v(".")]),e._v(" "),a("p",[e._v("Some other features that undernames allow include:")]),e._v(" "),a("ul",[a("li",[e._v("Undernames are configured in the ANT that is referenced for a given name. ANT owners can add more undernames as "),a("em",[e._v("subDomains")]),e._v(" in the ANT’s records object, each of which can point to a different Arweave Transaction ID.")]),e._v(" "),a("li",[e._v("Each registered name is provided with an allocation of 10 undernames by default. Additional undername space can be purchased individually and as needed.")]),e._v(" "),a("li",[e._v("Other users could never register a name that resembles an undername on ardrive since “_” is not allowed to be registered in the ArNS registry.")]),e._v(" "),a("li",[e._v("Another user can register "),a("em",[e._v("dapp-ardrive")]),e._v(" but this is a separate ArNS domain altogether. In traditional DNS, it’s like the difference in trusting "),a("em",[e._v("dapp-ardrive.io")]),e._v("(suspicious!) over the legitimate dapp.ardrive.io")]),e._v(" "),a("li",[e._v("Undernames can go multiple levels deep, like "),a("em",[e._v("version_dapp_ardrive")]),e._v(" but must not be longer than the total "),a("em",[e._v("MAX_NAME_LENGTH")]),e._v(" of an ArNS name. The total amount of characters for a name string consisting of undernames and underscore separators is 63 characters.")])]),e._v(" "),a("p",[e._v("Undernames give more versatility and utility to owning an ArNS name.")]),e._v(" "),a("h2",{attrs:{id:"addressing-variable-market-conditions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#addressing-variable-market-conditions"}},[e._v("#")]),e._v(" Addressing Variable Market Conditions")]),e._v(" "),a("p",[e._v("The future market landscape is unpredictable, and the AR.IO Network smart contract is designed to be immutable, operating without governance or mechanisms for manual intervention. In addition, the traditional method of employing a pricing oracle to fix prices relative to a stable currency is not viable due to the infancy of the network as well as the inherent reliance on outside dependencies. Considering this, ArNS is designed to be self-contained and adaptive, ensuring that name prices always mirror network activity and market conditions.")]),e._v(" "),a("p",[e._v("To achieve this, ArNS incorporates:")]),e._v(" "),a("ol",[a("li",[e._v("A dynamic pricing model that utilizes a “Demand Factor” to adjust fees in line with ArNS purchase activity.")]),e._v(" "),a("li",[e._v("An auction system intended to seek fair market value for premium names, allowing initial prices to adapt based on actual user interest and bids. In this context, “premium names” are defined by their character count and purchase type (lease or permanent).")])]),e._v(" "),a("p",[e._v("ArNS is designed to ensure that name valuations are always in sync with their true market worth, despite the unchangeable nature of the smart contract it operates on.")]),e._v(" "),a("h2",{attrs:{id:"dynamic-pricing-model"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-pricing-model"}},[e._v("#")]),e._v(" Dynamic Pricing Model")]),e._v(" "),a("p",[e._v("The Arweave Name System (ArNS) introduces an adaptive pricing model for registering names within the AR.IO Network. The core objective is to strike a balance between market demand and pricing fairness, leveraging both static and dynamic pricing elements. The system differentiates prices based on character lengths of names and offers varied purchasing options such as leasing, permanent acquisition, and undernames.")]),e._v(" "),a("p",[e._v("A unique feature of the ArNS pricing mechanism is the integration of a Demand Factor (DF), a dynamic multiplier that adjusts name prices in response to market demand. The DF is determined by comparing the total revenue in IO tokens from the current period to a moving average of revenues from the preceding period window. Depending on whether revenue is above, below, or equal to this average, the DF can increase or decrease. These adjustments are contained within boundaries to prevent extreme pricing variations.")]),e._v(" "),a("p",[e._v("This comprehensive approach ensures that ArNS names are accessible and reasonably priced, adapting to market trends while maintaining an equitable and maintenance-free registration environment.")]),e._v(" "),a("h3",{attrs:{id:"pricing-scenarios"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pricing-scenarios"}},[e._v("#")]),e._v(" Pricing Scenarios")]),e._v(" "),a("p",[e._v("There are several pricing models for leasing and purchasing names:")]),e._v(" "),a("ul",[a("li",[a("p",[a("strong",[e._v("Leased Name, Instant Purchase")]),e._v(": Allows a user to lease a name for a certain duration and have it available for use immediately by the lessee.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Permanent Name, Instant Purchase")]),e._v(": Allows a user to purchase a name permanently and have it available for use immediately by the owner.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Leased Name, Auctioned")]),e._v(": Allows a user to lease a name for a duration but as the name is considered premium, it must go through an auction process before it can be acquired and used by the lessee.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Permanent Name, Auctioned")]),e._v(": Allows a user to purchase a name permanently but as the name is considered premium, it must go through an auction process before it can be acquired and used by the owner.")])])]),e._v(" "),a("p",[e._v("The table below summarizes the available purchase options for the name space:")]),e._v(" "),a("center",[a("table",{staticClass:"inline-table"},[a("tr",[a("th",{staticStyle:{"text-align":"center"},attrs:{colspan:"3"}},[e._v("Name Purchase Options")])]),e._v(" "),a("tr",[a("th",[e._v("Type")]),e._v(" "),a("th",[e._v("Lease")]),e._v(" "),a("th",[e._v("Permanent")])]),e._v(" "),a("tr",[a("td",[e._v("1-4 Characters")]),e._v(" "),a("td",[e._v("Auction")]),e._v(" "),a("td",[e._v("Auction")])]),e._v(" "),a("tr",[a("td",[e._v("5-12 Characters")]),e._v(" "),a("td",[e._v("Instant")]),e._v(" "),a("td",[e._v("Auction")])]),e._v(" "),a("tr",[a("td",[e._v("13-51 Characters")]),e._v(" "),a("td",[e._v("Instant")]),e._v(" "),a("td",[e._v("Instant")])])])]),e._v(" "),a("div",{staticClass:"caption"},[e._v("Name Purchase Options")]),e._v(" "),a("h3",{attrs:{id:"dynamic-pricing-mechanics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-pricing-mechanics"}},[e._v("#")]),e._v(" Dynamic Pricing Mechanics")]),e._v(" "),a("p",[e._v("Names are initially priced according to the Genesis Registration Fee (GRF), as set in the SmartWeave contract, with prices varying based on the length of the name. As the network's activity progresses, these fees give way to Base Registration Fees (BRF), which are modified by periodic step adjustments. The Demand Factor (DF) is a crucial component that dynamically scales prices, fluctuating with the network’s revenue trends.")]),e._v(" "),a("p",[e._v("Revenue in the network accumulates within the Protocol Balance through various streams, such as instant name leases or purchases, auction completions, lease extensions, and under_name transactions. This cumulative revenue impacts the Demand Factor, which in turn influences the current name prices.")]),e._v(" "),a("p",[e._v("The DF is adjusted by comparing the recent period’s revenue against a Revenue Moving Average (RMA) from the preceding seven periods. Based on this comparison, the DF can either increase, to reflect greater demand, or decrease, in response to diminished revenue, all within predetermined limits to prevent drastic fluctuations in pricing")]),e._v(" "),a("p",[e._v("The pricing system articulates various fees:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("The Adjusted Registration Fee (ARF) is the BRF modified by the DF.")])]),e._v(" "),a("li",[a("p",[e._v("The Annual Fee is set as a proportion of the ARF.")])]),e._v(" "),a("li",[a("p",[e._v("Instant Lease Registration and Permabuy prices are derived from the ARF, adding the calculated annual fees over the desired years.")])]),e._v(" "),a("li",[a("p",[e._v("Auction parameters, including floor and ceiling prices for leases and permabuys, are directly influenced by the ARF.")])])]),e._v(" "),a("p",[e._v("The distinction between instant buy and auction for a name is determined based on its character length and whether it is a lease or permabuy. The auction process itself begins at a ceiling price – substantially higher than the floor – calculated as a multiple of the floor price which includes the ARF and relevant annual fees. As the auction progresses, the price decreases until a bid is placed or the floor is reached, determining the sale price.")]),e._v(" "),a("p",[e._v("The DF’s modifications are controlled by the network's recent performance against the RMA. An increase in revenue leads to a DF rise, signifying a thriving market demand, while a decrease indicates the opposite. This responsive adjustment mechanism ensures that the pricing model remains aligned with actual market activity.")]),e._v(" "),a("p",[e._v("Under_names are bundled with name registrations with additional ones available for purchase. The cost for extra under_names is a percentage of the current BRF, altered by the DF.")]),e._v(" "),a("h3",{attrs:{id:"step-pricing-mechanics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#step-pricing-mechanics"}},[e._v("#")]),e._v(" Step Pricing Mechanics")]),e._v(" "),a("p",[e._v("The dynamic model shall utilize a “Step Pricing” concept that acts as a stabilizing mechanism to counteract swift and dramatic market shifts, ensuring registration costs remain aligned and predictable. Step pricing adjusts the Base Registration Fees when the Demand Factor reaches its minimum value for an extended period, updating the BRF to align with the current ARF, and resetting the DF to a neutral value. This allows for base prices to lower in extended droughts of low demand or high token value resulting in lower revenue generated to the protocol balance.")]),e._v(" "),a("p",[e._v("The below chart represents Step Pricing in action:")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/aa-diagram-2.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Step Pricing Action - Declining Demand")]),e._v(" "),a("h2",{attrs:{id:"bid-initiated-dutch-auctions-bida"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bid-initiated-dutch-auctions-bida"}},[e._v("#")]),e._v(" Bid Initiated Dutch Auctions (BIDA)")]),e._v(" "),a("p",[e._v("Auctions within ArNS serve a pivotal role, particularly for names considered premium by the community where market value can be highly variable. The auction format enables true market price discovery, ensuring that names reflect their real-time worth as determined by actual demand. As such, certain names must go to public auction based on their character length and purchase type. These auctions shall follow a Dutch Auction model whereby the first user interested in a name must initiate the process by placing the first bid.")]),e._v(" "),a("p",[e._v("Dutch auctions work as follows: the first bid must be greater than or equal to the assigned floor price for the name. Once the first bid is placed, the timer for the auction begins. The auction begins at a price much higher than the floor price. As time passes, the purchase price progressively decreases until someone purchases it, or it hits the floor price, and the initial bidder receives the name.")]),e._v(" "),a("p",[e._v("This does not mean that the initial bidder must wait until the auction concludes. At any time, the initial bidder can place a second bid to purchase the name for the current purchase price, or a second bidder can discover this auction and do the same. The benefit of this system, versus an English Auction system, is that there will only ever be 2 bids, the bid to initiate the auction, and the final bid to purchase. This makes for a more compact and scalable SmartWeave Contract state.")]),e._v(" "),a("p",[e._v("Auction end dates are denoted by Arweave block height and established at the start of the auction. For example, the duration for an auction could be 14 days or 10,100 blocks.")]),e._v(" "),a("h3",{attrs:{id:"auction-price-curve"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auction-price-curve"}},[e._v("#")]),e._v(" Auction Price Curve")]),e._v(" "),a("p",[e._v("For auctioned names, the progressively declining price of the name shall follow a power-law decay function:")]),e._v(" "),a("center",[e._v("P(t) = max(P0 * (1 – (k * t))^p, Pfloor)")]),e._v(" "),a("p",[e._v("where:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("P(t), "),a("em",[e._v("nameAuctionPrice")]),e._v(" is the amount of IO tokens required to win a purchase name in an auction.")])]),e._v(" "),a("li",[a("p",[e._v("P0, "),a("em",[e._v("nameAuctionStartPrice")]),e._v(" is the starting price of this auction.")])]),e._v(" "),a("li",[a("p",[e._v("t, "),a("em",[e._v("elapsedAuctionTime")]),e._v(" is the number of blocks that have elapsed since the start of the auction.")])]),e._v(" "),a("li",[a("p",[e._v("k, "),a("em",[e._v("decayRate")]),e._v(" determines how quickly the price decreases over time.")])]),e._v(" "),a("li",[a("p",[e._v("p, "),a("em",[e._v("exponentVariable")]),e._v(" determines the “shape” of the declining cost curve.")])]),e._v(" "),a("li",[a("p",[e._v("Pfloor, "),a("em",[e._v("nameAuctionFloorPrice")]),e._v(" is the amount of IO used as the floor price and minimum bid to start this name purchase auction.")])])]),e._v(" "),a("p",[e._v("The values of k and p shall be optimized so that the name price approaches the floor price (Pfloor) by the end of the auction period.")]),e._v(" "),a("p",[e._v("Below is a representative auction curve resulting from this formula:")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/aa-diagram-3.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Example Auction Price Curve")])],1)}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/27.451189dd.js b/assets/js/27.9d255ee0.js similarity index 99% rename from assets/js/27.451189dd.js rename to assets/js/27.9d255ee0.js index c4b86e06..928d13f1 100644 --- a/assets/js/27.451189dd.js +++ b/assets/js/27.9d255ee0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{318:function(e,a,t){"use strict";t.r(a);var r=t(10),s=Object(r.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"arweave"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arweave"}},[e._v("#")]),e._v(" Arweave")]),e._v(" "),a("h2",{attrs:{id:"the-permanence-pie"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-permanence-pie"}},[e._v("#")]),e._v(" The Permanence Pie")]),e._v(" "),a("p",[e._v("The permanent data storage ecosystem can be thought of as a three-tiered arrangement of protocols, services, and applications – dubbed here as “The Permanence Pie”.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-1.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 1: The Shell of Permanence Pie")]),e._v(" "),a("p",[e._v("The base layer of that pie is the Arweave protocol and network, which is the backbone of the permanent data storage ecosystem. It provides the infrastructure for data to be stored on the network in a decentralized manner and incentivizes nodes to keep the data stored for long periods of time.")]),e._v(" "),a("p",[e._v("The second layer is made up of services that sit on top of the Arweave protocol and network. These services include gateways, data retrieval services, and smart contracts that help to provide a seamless and functional experience for users, creators, and developers.")]),e._v(" "),a("p",[e._v("Finally, the top layer of the pie consists of applications that utilize the data stored on the Arweave network. This includes everything from simple applications that allow users to access and view their data to complex, decentralized applications that use the Arweave network as their backbone.")]),e._v(" "),a("p",[e._v("Each layer of the Permanence Pie is crucial to the overall success and growth of the permanent data storage ecosystem. The Arweave protocol and network provide the foundation for data storage, the services layer helps to facilitate data retrieval and usage, and the application layer brings the benefits of the ecosystem to users and developers alike.")]),e._v(" "),a("h2",{attrs:{id:"what-is-arweave"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#what-is-arweave"}},[e._v("#")]),e._v(" What Is Arweave")]),e._v(" "),a("p",[e._v("Arweave is a decentralized Layer 1 data storage protocol optimized for long-term permanent storage through its unique proof of access mechanism and tokenomic endowment model.")]),e._v(" "),a("p",[e._v("The information stored on Arweave is immutable and globally replicated by miner nodes. Instead of a traditional blockchain ledger which links blocks of transactions together in linear sequence, Arweave arranges blocks in a web known as the blockweave. These miner nodes secure the blockweave by operating the Succinct Proof of Random Access (SPoRA) algorithm. SPoRA requires miners to prove that they have access to recall randomly selected bits of weave data in order to produce and share a block. If successful, miners are rewarded in Arweave’s native AR token. These token rewards are derived from transaction fees as well as the network’s storage endowment. The endowment is a protocol-controlled pool of tokens designed to fund the projected cost of storage for 200+ years.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-2.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 2: Arweave - The Base Storage Layer")]),e._v(" "),a("p",[e._v("Arweave is file type agnostic – any type of file ranging from simple text files to family photos to complex web applications and archival databases can be stored on the network. To upload data, users must pay an amount of AR proportional to the size of the files being uploaded. Arweave is unique when compared with other decentralized storage solutions in that users only pay once to upload their files, then that is it – the files will be stored in perpetuity without any additional upkeep or subscription fees paid by the user.")]),e._v(" "),a("p",[e._v("The Arweave protocol is designed to handle 1,000 base layer transactions per block with new blocks being mined roughly every two minutes. Each transaction may also store an unbounded number of signed, non-AR-transacting data items assembled into a bundle (i.e., a bundled data item). Since its launch in 2018, this scalable architecture has allowed the network's weave size (total data stored on the network) to grow to 140.8 TB with approximately 1.5 billion base layer transactions and bundled data items submitted from over 181k unique wallets. The Arweave protocol endowment has received 60.7k AR to cover the projected storage costs with a cost of storage 0.858 AR/GiB. *")]),e._v(" "),a("p",[e._v("* data as of November 20, 2023")]),e._v(" "),a("h2",{attrs:{id:"gateways"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gateways"}},[e._v("#")]),e._v(" Gateways")]),e._v(" "),a("p",[e._v("Gateways act as the front door to the permaweb. They are infrastructure utilities that sit above the base storage layer and allow users to access and query the information stored on Arweave. Gateways are specialized nodes responsible for data retrieval, caching, and serving as well as indexing transactions into a database that can be easily queried at scale. These functions are not performed by the Arweave mining nodes which are optimized for securing the Layer 1 blockweave and replicating information throughout the network through a mechanism known as Wildfire.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-3.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 3: Gateways - The Access Component")]),e._v(" "),a("p",[e._v("By taking on these responsibilities, gateways allow low cost and maintenance free hosting of static and dynamic content for users, creators, and developers. But there are costs associated with operating a gateway and Arweave does not offer any tokenomic incentives to offset these expenses. As the permaweb grows, these costs can become very significant.")]),e._v(" "),a("p",[e._v("Arweave.net, the primary community gateway, has scaled to meet the needs of the entire Arweave ecosystem and stored the entire weave. Over the last 6 months, this gateway indexed and cached approximately 3.4 million base layer transactions and bundled data items per day, served 233 million requests for data and node information per day, and responded to 3.2 million GQL queries per day. *")]),e._v(" "),a("p",[e._v("Gateway use cases, and the types of administrators who operate them, can range from at-home projects hosted by hobbyists to larger decentralized platforms and dApps run by small teams, all the way up to scaled out environments capable of supporting enterprise offerings.")]),e._v(" "),a("p",[e._v("* data as of November 20, 2023")]),e._v(" "),a("h2",{attrs:{id:"smartweave"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#smartweave"}},[e._v("#")]),e._v(" SmartWeave")]),e._v(" "),a("p",[e._v("SmartWeave is the smart contract protocol built for Arweave. This standard utilizes ‘lazy evaluation’ which performs computation on the client side as opposed to other smart contract protocols that compute at the node level. This strategy eliminates associated computation fees as well as unburdens developers from file size limitations and programming language requirements.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-4.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 4: SmartWeave - The Smart Contract Protocol")]),e._v(" "),a("p",[e._v("With SmartWeave, developers can create SmartWeave Tokens (SWT) and incorporate incentive structures into their applications and infrastructure. The AR.IO Network leverages the Warp SDK implementation of this technology for development of its network protocol and IO token.")]),e._v(" "),a("h2",{attrs:{id:"the-permaweb"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-permaweb"}},[e._v("#")]),e._v(" The Permaweb")]),e._v(" "),a("p",[e._v("The permaweb is the third and final layer of the permanence pie. The permaweb stands for the permanent web, a collection of all the webpages, apps, and files stored on top of the Arweave network and enlivened with the functionality of the AR.IO Network. For users and builders, the permaweb offers low-cost, zero maintenance, permanent hosting of their web apps, files, and web pages.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-5.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 5: The Permanence Pie")]),e._v(" "),a("p",[e._v("AR.IO is a global network, protocol, and currency built on top of Arweave that enables the permaweb.")]),e._v(" "),a("h2",{attrs:{id:"references-and-further-reading"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references-and-further-reading"}},[e._v("#")]),e._v(" References and Further Reading")]),e._v(" "),a("p",[e._v("The following resources were used as reference material for this section and can provide the interested reader with additional information:")]),e._v(" "),a("ul",[a("li",[a("p",[a("a",{attrs:{href:"https://arwiki.wiki/",target:"_blank",rel:"noopener noreferrer"}},[e._v("The ArWiki"),a("OutboundLink")],1)])]),e._v(" "),a("li",[a("p",[a("a",{attrs:{href:"https://github.com/ArweaveTeam",target:"_blank",rel:"noopener noreferrer"}},[e._v("Arweave GitHub repository"),a("OutboundLink")],1)])]),e._v(" "),a("li",[a("p",[a("a",{attrs:{href:"https://academy.warp.cc/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Warp Academy"),a("OutboundLink")],1)])])])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{317:function(e,a,t){"use strict";t.r(a);var r=t(10),s=Object(r.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"arweave"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arweave"}},[e._v("#")]),e._v(" Arweave")]),e._v(" "),a("h2",{attrs:{id:"the-permanence-pie"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-permanence-pie"}},[e._v("#")]),e._v(" The Permanence Pie")]),e._v(" "),a("p",[e._v("The permanent data storage ecosystem can be thought of as a three-tiered arrangement of protocols, services, and applications – dubbed here as “The Permanence Pie”.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-1.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 1: The Shell of Permanence Pie")]),e._v(" "),a("p",[e._v("The base layer of that pie is the Arweave protocol and network, which is the backbone of the permanent data storage ecosystem. It provides the infrastructure for data to be stored on the network in a decentralized manner and incentivizes nodes to keep the data stored for long periods of time.")]),e._v(" "),a("p",[e._v("The second layer is made up of services that sit on top of the Arweave protocol and network. These services include gateways, data retrieval services, and smart contracts that help to provide a seamless and functional experience for users, creators, and developers.")]),e._v(" "),a("p",[e._v("Finally, the top layer of the pie consists of applications that utilize the data stored on the Arweave network. This includes everything from simple applications that allow users to access and view their data to complex, decentralized applications that use the Arweave network as their backbone.")]),e._v(" "),a("p",[e._v("Each layer of the Permanence Pie is crucial to the overall success and growth of the permanent data storage ecosystem. The Arweave protocol and network provide the foundation for data storage, the services layer helps to facilitate data retrieval and usage, and the application layer brings the benefits of the ecosystem to users and developers alike.")]),e._v(" "),a("h2",{attrs:{id:"what-is-arweave"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#what-is-arweave"}},[e._v("#")]),e._v(" What Is Arweave")]),e._v(" "),a("p",[e._v("Arweave is a decentralized Layer 1 data storage protocol optimized for long-term permanent storage through its unique proof of access mechanism and tokenomic endowment model.")]),e._v(" "),a("p",[e._v("The information stored on Arweave is immutable and globally replicated by miner nodes. Instead of a traditional blockchain ledger which links blocks of transactions together in linear sequence, Arweave arranges blocks in a web known as the blockweave. These miner nodes secure the blockweave by operating the Succinct Proof of Random Access (SPoRA) algorithm. SPoRA requires miners to prove that they have access to recall randomly selected bits of weave data in order to produce and share a block. If successful, miners are rewarded in Arweave’s native AR token. These token rewards are derived from transaction fees as well as the network’s storage endowment. The endowment is a protocol-controlled pool of tokens designed to fund the projected cost of storage for 200+ years.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-2.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 2: Arweave - The Base Storage Layer")]),e._v(" "),a("p",[e._v("Arweave is file type agnostic – any type of file ranging from simple text files to family photos to complex web applications and archival databases can be stored on the network. To upload data, users must pay an amount of AR proportional to the size of the files being uploaded. Arweave is unique when compared with other decentralized storage solutions in that users only pay once to upload their files, then that is it – the files will be stored in perpetuity without any additional upkeep or subscription fees paid by the user.")]),e._v(" "),a("p",[e._v("The Arweave protocol is designed to handle 1,000 base layer transactions per block with new blocks being mined roughly every two minutes. Each transaction may also store an unbounded number of signed, non-AR-transacting data items assembled into a bundle (i.e., a bundled data item). Since its launch in 2018, this scalable architecture has allowed the network's weave size (total data stored on the network) to grow to 140.8 TB with approximately 1.5 billion base layer transactions and bundled data items submitted from over 181k unique wallets. The Arweave protocol endowment has received 60.7k AR to cover the projected storage costs with a cost of storage 0.858 AR/GiB. *")]),e._v(" "),a("p",[e._v("* data as of November 20, 2023")]),e._v(" "),a("h2",{attrs:{id:"gateways"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gateways"}},[e._v("#")]),e._v(" Gateways")]),e._v(" "),a("p",[e._v("Gateways act as the front door to the permaweb. They are infrastructure utilities that sit above the base storage layer and allow users to access and query the information stored on Arweave. Gateways are specialized nodes responsible for data retrieval, caching, and serving as well as indexing transactions into a database that can be easily queried at scale. These functions are not performed by the Arweave mining nodes which are optimized for securing the Layer 1 blockweave and replicating information throughout the network through a mechanism known as Wildfire.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-3.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 3: Gateways - The Access Component")]),e._v(" "),a("p",[e._v("By taking on these responsibilities, gateways allow low cost and maintenance free hosting of static and dynamic content for users, creators, and developers. But there are costs associated with operating a gateway and Arweave does not offer any tokenomic incentives to offset these expenses. As the permaweb grows, these costs can become very significant.")]),e._v(" "),a("p",[e._v("Arweave.net, the primary community gateway, has scaled to meet the needs of the entire Arweave ecosystem and stored the entire weave. Over the last 6 months, this gateway indexed and cached approximately 3.4 million base layer transactions and bundled data items per day, served 233 million requests for data and node information per day, and responded to 3.2 million GQL queries per day. *")]),e._v(" "),a("p",[e._v("Gateway use cases, and the types of administrators who operate them, can range from at-home projects hosted by hobbyists to larger decentralized platforms and dApps run by small teams, all the way up to scaled out environments capable of supporting enterprise offerings.")]),e._v(" "),a("p",[e._v("* data as of November 20, 2023")]),e._v(" "),a("h2",{attrs:{id:"smartweave"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#smartweave"}},[e._v("#")]),e._v(" SmartWeave")]),e._v(" "),a("p",[e._v("SmartWeave is the smart contract protocol built for Arweave. This standard utilizes ‘lazy evaluation’ which performs computation on the client side as opposed to other smart contract protocols that compute at the node level. This strategy eliminates associated computation fees as well as unburdens developers from file size limitations and programming language requirements.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-4.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 4: SmartWeave - The Smart Contract Protocol")]),e._v(" "),a("p",[e._v("With SmartWeave, developers can create SmartWeave Tokens (SWT) and incorporate incentive structures into their applications and infrastructure. The AR.IO Network leverages the Warp SDK implementation of this technology for development of its network protocol and IO token.")]),e._v(" "),a("h2",{attrs:{id:"the-permaweb"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-permaweb"}},[e._v("#")]),e._v(" The Permaweb")]),e._v(" "),a("p",[e._v("The permaweb is the third and final layer of the permanence pie. The permaweb stands for the permanent web, a collection of all the webpages, apps, and files stored on top of the Arweave network and enlivened with the functionality of the AR.IO Network. For users and builders, the permaweb offers low-cost, zero maintenance, permanent hosting of their web apps, files, and web pages.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/permanence-pie-5.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Diagram 5: The Permanence Pie")]),e._v(" "),a("p",[e._v("AR.IO is a global network, protocol, and currency built on top of Arweave that enables the permaweb.")]),e._v(" "),a("h2",{attrs:{id:"references-and-further-reading"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references-and-further-reading"}},[e._v("#")]),e._v(" References and Further Reading")]),e._v(" "),a("p",[e._v("The following resources were used as reference material for this section and can provide the interested reader with additional information:")]),e._v(" "),a("ul",[a("li",[a("p",[a("a",{attrs:{href:"https://arwiki.wiki/",target:"_blank",rel:"noopener noreferrer"}},[e._v("The ArWiki"),a("OutboundLink")],1)])]),e._v(" "),a("li",[a("p",[a("a",{attrs:{href:"https://github.com/ArweaveTeam",target:"_blank",rel:"noopener noreferrer"}},[e._v("Arweave GitHub repository"),a("OutboundLink")],1)])]),e._v(" "),a("li",[a("p",[a("a",{attrs:{href:"https://academy.warp.cc/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Warp Academy"),a("OutboundLink")],1)])])])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/28.f3fec4e0.js b/assets/js/28.70c55642.js similarity index 68% rename from assets/js/28.f3fec4e0.js rename to assets/js/28.70c55642.js index 9348e2bf..2040c834 100644 --- a/assets/js/28.f3fec4e0.js +++ b/assets/js/28.70c55642.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{319:function(t,r,e){"use strict";e.r(r);var o=e(10),n=Object(o.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"community-resources"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#community-resources"}},[t._v("#")]),t._v(" Community Resources")]),t._v(" "),r("p",[r("a",{attrs:{href:"https://github.com/ar-io",target:"_blank",rel:"noopener noreferrer"}},[t._v("AR.IO Github"),r("OutboundLink")],1)]),t._v(" "),r("p",[r("a",{attrs:{href:"https://twitter.com/ar_io_network",target:"_blank",rel:"noopener noreferrer"}},[t._v("AR.IO Twitter"),r("OutboundLink")],1)]),t._v(" "),r("p",[r("a",{attrs:{href:"https://discord.gg/7zUPfN4D6g",target:"_blank",rel:"noopener noreferrer"}},[t._v("AR.IO Discord"),r("OutboundLink")],1)]),t._v(" "),r("p",[r("a",{attrs:{href:"mailto:info@ar.io"}},[t._v("Contact Us Directly")])])])}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{320:function(t,r,e){"use strict";e.r(r);var o=e(10),n=Object(o.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"community-resources"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#community-resources"}},[t._v("#")]),t._v(" Community Resources")]),t._v(" "),r("p",[r("a",{attrs:{href:"https://github.com/ar-io",target:"_blank",rel:"noopener noreferrer"}},[t._v("ar.io Github"),r("OutboundLink")],1)]),t._v(" "),r("p",[r("a",{attrs:{href:"https://twitter.com/ar_io_network",target:"_blank",rel:"noopener noreferrer"}},[t._v("ar.io Twitter"),r("OutboundLink")],1)]),t._v(" "),r("p",[r("a",{attrs:{href:"https://discord.gg/7zUPfN4D6g",target:"_blank",rel:"noopener noreferrer"}},[t._v("ar.io Discord"),r("OutboundLink")],1)]),t._v(" "),r("p",[r("a",{attrs:{href:"mailto:info@ar.io"}},[t._v("Contact Us Directly")])])])}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/29.58ef39fd.js b/assets/js/29.047c11e4.js similarity index 99% rename from assets/js/29.58ef39fd.js rename to assets/js/29.047c11e4.js index 1b7e340f..de5b2d32 100644 --- a/assets/js/29.58ef39fd.js +++ b/assets/js/29.047c11e4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{320:function(e,t,a){"use strict";a.r(t);var n=a(10),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"arcss"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#arcss"}},[e._v("#")]),e._v(" ARCSS")]),e._v(" "),t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),t("p",[e._v("The ARCSS protocol is a "),t("a",{attrs:{href:"https://wikipedia.org/wiki/Uniform_Resource_Identifier",target:"_blank",rel:"noopener noreferrer"}},[e._v("URI scheme"),t("OutboundLink")],1),e._v(" designed to translate requests for Arweave content into an "),t("code",[e._v("https://")]),e._v(" request. Essentially, ARCSS allows for transforming traditional Arweave URLs like "),t("code",[e._v("https://arweave.net/long-txid")]),e._v(" into more concise and user-friendly forms such as "),t("code",[e._v("ar://txid")]),e._v(" or "),t("code",[e._v("ar://arns-name")]),e._v(". When combined with the "),t("a",{attrs:{href:"https://chrome.google.com/webstore/detail/ario-WayFinder/hnhmeknhajanolcoihhkkaaimapnmgil",target:"_blank",rel:"noopener noreferrer"}},[e._v("AR.IO WayFinder browser extension"),t("OutboundLink")],1),e._v(", the request can be directed to any number of functional "),t("RouterLink",{attrs:{to:"/concepts/gateways/"}},[e._v("AR.IO Gateways")]),e._v(" to serve the content.")],1),e._v(" "),t("p",[e._v("An early technical breakdown of ARCSS, created by Arweave community member DMac, can be found "),t("a",{attrs:{href:"https://hackmd.io/@DMac/r1iyjzxPs",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"browser-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#browser-integration"}},[e._v("#")]),e._v(" Browser Integration")]),e._v(" "),t("p",[e._v("ARCSS is currently facilitated via the WayFinder browser extension or internal application integration. The intention is to lead popular web browsers like Chrome and Brave towards a direct integration of ARCSS, similar to recent integrations of the "),t("code",[e._v("ipfs://")]),e._v(" protocol. Such integration would remove the need for a client-side extension and boost developers' confidence in embedding ARCSS in their websites.")]),e._v(" "),t("h2",{attrs:{id:"internal-application-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#internal-application-integration"}},[e._v("#")]),e._v(" Internal Application Integration")]),e._v(" "),t("p",[e._v("Certain websites or apps may want to resolve Arweave Transaction ID's (TxId) internally. In these scenarios, they can process ARCSS internally without depending on browser support or WayFinder. A prime example is "),t("a",{attrs:{href:"https://opensea.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("opensea.io"),t("OutboundLink")],1),e._v(". Opensea, an NFT marketplace, frequently imports NFT metadata from external sources. If metadata employs ARCSS, Opensea internally resolves these, presenting content without redirecting users through an "),t("code",[e._v("https://")]),e._v(" link.")]),e._v(" "),t("p",[e._v("There are two main approaches to resolving ARCSS:")]),e._v(" "),t("ol",[t("li",[e._v("Convert ARCSS into a request directed at a predefined Arweave gateway.")]),e._v(" "),t("li",[e._v("Retrieve a list of active AR.IO Gateways from the "),t("RouterLink",{attrs:{to:"/concepts/gateway-network.html#gateway-address-registry-gar"}},[e._v("GAR")]),e._v(" by reading the contract state, or other available resources, and then fetch content from a gateway on the list.")],1)]),e._v(" "),t("p",[e._v("Each strategy has its benefits and challenges, necessitating careful evaluation based on specific use cases.")]),e._v(" "),t("h2",{attrs:{id:"benefits-of-arcss-over-hardcoded-gateway-links"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#benefits-of-arcss-over-hardcoded-gateway-links"}},[e._v("#")]),e._v(" Benefits of ARCSS Over Hardcoded Gateway Links")]),e._v(" "),t("p",[e._v("Using ARCSS offers several advantages over hardcoded links to a specific gateway:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Flexibility")]),e._v(": ARCSS can be routed through any available AR.IO Gateway, ensuring content remains accessible even if a specific gateway is down or congested.")]),e._v(" "),t("li",[t("strong",[e._v("Decentralization")]),e._v(": By not being tied to a single gateway, ARCSS embodies the decentralized spirit of the web, reducing potential censorship points.")]),e._v(" "),t("li",[t("strong",[e._v("Ease of Maintenance")]),e._v(": Developers and content creators don't need to modify links if a gateway changes its URL or becomes unavailable. The WayFinder extension handles routing to an active gateway.")]),e._v(" "),t("li",[t("strong",[e._v("Consistency")]),e._v(": Users always receive the same content, regardless of the gateway used, ensuring a consistent user experience.")])]),e._v(" "),t("h2",{attrs:{id:"use-cases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases"}},[e._v("#")]),e._v(" Use Cases")]),e._v(" "),t("h3",{attrs:{id:"decentralized-web-hosting-with-flexible-access"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#decentralized-web-hosting-with-flexible-access"}},[e._v("#")]),e._v(" Decentralized Web Hosting with Flexible Access")]),e._v(" "),t("p",[e._v("With ARCSS, not only can websites be hosted on the Arweave network, but their accessibility is also enhanced. By using ARCSS, web developers can ensure that if a specific AR.IO Gateway is down, the content can still be accessed through another gateway, offering a more reliable and resilient user experience.")]),e._v(" "),t("h3",{attrs:{id:"digital-archives-and-preservation-with-enhanced-sharing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#digital-archives-and-preservation-with-enhanced-sharing"}},[e._v("#")]),e._v(" Digital Archives and Preservation with Enhanced Sharing")]),e._v(" "),t("p",[e._v("Digitally archiving public domain works, especially in light of events like "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=eMSCHXklULQ",target:"_blank",rel:"noopener noreferrer"}},[e._v('"banned books week"'),t("OutboundLink")],1),e._v(", becomes more efficient with ARCSS. Historical institutions or enthusiasts can easily share specific ARCSS links to documents or media. Unlike hardcoded links which might break if a specific gateway goes offline, ARCSS ensures that the content remains consistently accessible.")]),e._v(" "),t("h3",{attrs:{id:"media-sharing-platforms-with-consistent-content-delivery"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#media-sharing-platforms-with-consistent-content-delivery"}},[e._v("#")]),e._v(" Media Sharing Platforms with Consistent Content Delivery")]),e._v(" "),t("p",[e._v("For platforms hosting user-generated content, ARCSS provides not just decentralized hosting but also a guarantee of content delivery. Even if a content piece becomes viral and one gateway gets congested, ARCSS ensures that users can still access the content through another gateway, providing a seamless experience.")]),e._v(" "),t("h3",{attrs:{id:"decentralized-applications-dapps-with-reliable-front-end-accessibility"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#decentralized-applications-dapps-with-reliable-front-end-accessibility"}},[e._v("#")]),e._v(" Decentralized Applications (DApps) with Reliable Front-End Accessibility")]),e._v(" "),t("p",[e._v("DApps, while benefiting from Arweave's permanent hosting, can further ensure their front-end remains consistently accessible to users by using ARCSS. If a DApp's front-end is accessed frequently, causing strain on one gateway, ARCSS can help ensure the load is distributed, and the DApp remains online and functional.")]),e._v(" "),t("h2",{attrs:{id:"how-it-works"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-it-works"}},[e._v("#")]),e._v(" How it Works")]),e._v(" "),t("h3",{attrs:{id:"transaction-id"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#transaction-id"}},[e._v("#")]),e._v(" Transaction ID")]),e._v(" "),t("p",[e._v("To access content tied to an Arweave Transaction ID (TxId), simply append the TxId to "),t("code",[e._v("ar://")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ar://qI19W6spw-kzOGl4qUMNp2gwFH2EBfDXOFsjkcNyK9A\n")])])]),t("p",[e._v("Inputting this into a WayFinder-equipped browser will route your request through the right AR.IO Gateway, translating it as per your "),t("code",[e._v("Routing Method")]),e._v(" settings.")]),e._v(" "),t("h3",{attrs:{id:"arns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#arns"}},[e._v("#")]),e._v(" ArNS")]),e._v(" "),t("p",[e._v("Fetching content via an Arweave Name Service (ArNS) name is straightforward. Attach the ArNS name to "),t("code",[e._v("ar://")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ar://good-morning\n")])])]),t("p",[e._v("The ARCSS protocol, along with the WayFinder extension, discerns between TxIds and ArNS names. Once the suitable "),t("code",[e._v("https://")]),e._v(" request is formulated, the chosen gateway translates the ArNS name based on the ArNS smartweave contract.")]),e._v(" "),t("h2",{attrs:{id:"wayfinder"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wayfinder"}},[e._v("#")]),e._v(" Wayfinder")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://chrome.google.com/webstore/detail/ario-WayFinder/hnhmeknhajanolcoihhkkaaimapnmgil",target:"_blank",rel:"noopener noreferrer"}},[e._v("AR.IO WayFinder browser extension"),t("OutboundLink")],1),e._v(" is a browser extension designed to facilitate the resolving of "),t("code",[e._v("ar://")]),e._v(" urls.")]),e._v(" "),t("h3",{attrs:{id:"v0-0-10"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#v0-0-10"}},[e._v("#")]),e._v(" v0.0.10")]),e._v(" "),t("p",[e._v("As of v0.0.10, Wayfinder supports the resolution of TXT records to Arwevae content on top level domains. This innovative feature leverages DNS TXT records to associate Arweave transaction IDs with human-readable domain names, facilitating intuitive and memorable access to permaweb content. By simply entering an AR:// URL with a domain name, Wayfinder resolves the corresponding Arweave transaction ID through DNS TXT records, redirecting users directly to the content hosted on the Arweave network.")]),e._v(" "),t("p",[t("strong",[e._v("Setup")]),e._v(": Owners of a domain can set a TXT record for that domain following the format "),t("code",[e._v("ARTX ")]),e._v(".")]),e._v(" "),t("center",[t("img",{attrs:{src:e.$withBase("/images/arcss-txt.png")}})]),e._v(" "),t("p",[t("strong",[e._v("AR:// Redirection")]),e._v(": With a TXT record set properly, whenever a user (who has Wayfinder installed) enters an AR:// URL containing a domain name (e.g., "),t("code",[e._v("ar://example.com")]),e._v("), Wayfinder performs a DNS lookup for that TXT record in order to redirect to the Arweave content. The lookup is completed through a secure DNS-over-HTTPS query to ensure privacy and integrity.")]),e._v(" "),t("p",[t("strong",[e._v("Dynamic Content Resolution")]),e._v(": After retrieving the TXT record, Wayfinder extracts that Arweave transaction ID and dynamically redirects the user to the content on the permaweb. This process is transparent to the user, providing a seamless experience as if accessing a traditional website.")]),e._v(" "),t("h3",{attrs:{id:"key-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#key-features"}},[e._v("#")]),e._v(" Key Features")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Gasless")]),e._v(": TXT records can be set without any onchain transactions that would require gas fees.")]),e._v(" "),t("li",[t("strong",[e._v("Easy Integration")]),e._v(": Domain owners can easily link their permaweb content to their domains, making it accessible through a simple AR:// URL.")]),e._v(" "),t("li",[t("strong",[e._v("Dyncamic Content Access")]),e._v(": Content links can be updated in real-time through DNS TXT records, without requiring any changes to the AR:// URL itself.")]),e._v(" "),t("li",[t("strong",[e._v("Enhanced User Experience")]),e._v(": Offers users a familiar and easy-to-remember way to access permaweb content, leveraging standard web domain names.")]),e._v(" "),t("li",[t("strong",[e._v("Security and Privacy")]),e._v(": Secure DNS-over-HTTPS queries for DNS lookups protect user privacy and enhances security.")])]),e._v(" "),t("h3",{attrs:{id:"use-cases-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases-2"}},[e._v("#")]),e._v(" Use Cases")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Branded Content Access")]),e._v(": Companies and individuals can brand their permaweb content, making it accessible through their domain, enhancing brand visibility and user trust.")]),e._v(" "),t("li",[t("strong",[e._v("Dynamic Content Updates")]),e._v(": Domain owners can easily update what Permaweb content their AR:// URL resolves to, which is ideal for frequently updated resources like documents, blogs, and application interfaces.")]),e._v(" "),t("li",[t("strong",[e._v("Educational and Informational Resources")]),e._v(": Educational institutions and information providers can make their resources permanently available on the permaweb, accessible through simple, memorable URLs.")])]),e._v(" "),t("p",[e._v("This feature marks a significant advancement in making decentralized content more accessible and user-friendly, bridging the gap between traditional internet usability and the permaweb’s permanence and censorship-resistant nature.")])],1)}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{319:function(e,t,a){"use strict";a.r(t);var n=a(10),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"arcss"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#arcss"}},[e._v("#")]),e._v(" ARCSS")]),e._v(" "),t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),t("p",[e._v("The ARCSS protocol is a "),t("a",{attrs:{href:"https://wikipedia.org/wiki/Uniform_Resource_Identifier",target:"_blank",rel:"noopener noreferrer"}},[e._v("URI scheme"),t("OutboundLink")],1),e._v(" designed to translate requests for Arweave content into an "),t("code",[e._v("https://")]),e._v(" request. Essentially, ARCSS allows for transforming traditional Arweave URLs like "),t("code",[e._v("https://arweave.net/long-txid")]),e._v(" into more concise and user-friendly forms such as "),t("code",[e._v("ar://txid")]),e._v(" or "),t("code",[e._v("ar://arns-name")]),e._v(". When combined with the "),t("a",{attrs:{href:"https://chrome.google.com/webstore/detail/ario-WayFinder/hnhmeknhajanolcoihhkkaaimapnmgil",target:"_blank",rel:"noopener noreferrer"}},[e._v("AR.IO WayFinder browser extension"),t("OutboundLink")],1),e._v(", the request can be directed to any number of functional "),t("RouterLink",{attrs:{to:"/concepts/gateways/"}},[e._v("AR.IO Gateways")]),e._v(" to serve the content.")],1),e._v(" "),t("p",[e._v("An early technical breakdown of ARCSS, created by Arweave community member DMac, can be found "),t("a",{attrs:{href:"https://hackmd.io/@DMac/r1iyjzxPs",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"browser-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#browser-integration"}},[e._v("#")]),e._v(" Browser Integration")]),e._v(" "),t("p",[e._v("ARCSS is currently facilitated via the WayFinder browser extension or internal application integration. The intention is to lead popular web browsers like Chrome and Brave towards a direct integration of ARCSS, similar to recent integrations of the "),t("code",[e._v("ipfs://")]),e._v(" protocol. Such integration would remove the need for a client-side extension and boost developers' confidence in embedding ARCSS in their websites.")]),e._v(" "),t("h2",{attrs:{id:"internal-application-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#internal-application-integration"}},[e._v("#")]),e._v(" Internal Application Integration")]),e._v(" "),t("p",[e._v("Certain websites or apps may want to resolve Arweave Transaction ID's (TxId) internally. In these scenarios, they can process ARCSS internally without depending on browser support or WayFinder. A prime example is "),t("a",{attrs:{href:"https://opensea.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("opensea.io"),t("OutboundLink")],1),e._v(". Opensea, an NFT marketplace, frequently imports NFT metadata from external sources. If metadata employs ARCSS, Opensea internally resolves these, presenting content without redirecting users through an "),t("code",[e._v("https://")]),e._v(" link.")]),e._v(" "),t("p",[e._v("There are two main approaches to resolving ARCSS:")]),e._v(" "),t("ol",[t("li",[e._v("Convert ARCSS into a request directed at a predefined Arweave gateway.")]),e._v(" "),t("li",[e._v("Retrieve a list of active AR.IO Gateways from the "),t("RouterLink",{attrs:{to:"/concepts/gateway-network.html#gateway-address-registry-gar"}},[e._v("GAR")]),e._v(" by reading the contract state, or other available resources, and then fetch content from a gateway on the list.")],1)]),e._v(" "),t("p",[e._v("Each strategy has its benefits and challenges, necessitating careful evaluation based on specific use cases.")]),e._v(" "),t("h2",{attrs:{id:"benefits-of-arcss-over-hardcoded-gateway-links"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#benefits-of-arcss-over-hardcoded-gateway-links"}},[e._v("#")]),e._v(" Benefits of ARCSS Over Hardcoded Gateway Links")]),e._v(" "),t("p",[e._v("Using ARCSS offers several advantages over hardcoded links to a specific gateway:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Flexibility")]),e._v(": ARCSS can be routed through any available AR.IO Gateway, ensuring content remains accessible even if a specific gateway is down or congested.")]),e._v(" "),t("li",[t("strong",[e._v("Decentralization")]),e._v(": By not being tied to a single gateway, ARCSS embodies the decentralized spirit of the web, reducing potential censorship points.")]),e._v(" "),t("li",[t("strong",[e._v("Ease of Maintenance")]),e._v(": Developers and content creators don't need to modify links if a gateway changes its URL or becomes unavailable. The WayFinder extension handles routing to an active gateway.")]),e._v(" "),t("li",[t("strong",[e._v("Consistency")]),e._v(": Users always receive the same content, regardless of the gateway used, ensuring a consistent user experience.")])]),e._v(" "),t("h2",{attrs:{id:"use-cases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases"}},[e._v("#")]),e._v(" Use Cases")]),e._v(" "),t("h3",{attrs:{id:"decentralized-web-hosting-with-flexible-access"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#decentralized-web-hosting-with-flexible-access"}},[e._v("#")]),e._v(" Decentralized Web Hosting with Flexible Access")]),e._v(" "),t("p",[e._v("With ARCSS, not only can websites be hosted on the Arweave network, but their accessibility is also enhanced. By using ARCSS, web developers can ensure that if a specific AR.IO Gateway is down, the content can still be accessed through another gateway, offering a more reliable and resilient user experience.")]),e._v(" "),t("h3",{attrs:{id:"digital-archives-and-preservation-with-enhanced-sharing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#digital-archives-and-preservation-with-enhanced-sharing"}},[e._v("#")]),e._v(" Digital Archives and Preservation with Enhanced Sharing")]),e._v(" "),t("p",[e._v("Digitally archiving public domain works, especially in light of events like "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=eMSCHXklULQ",target:"_blank",rel:"noopener noreferrer"}},[e._v('"banned books week"'),t("OutboundLink")],1),e._v(", becomes more efficient with ARCSS. Historical institutions or enthusiasts can easily share specific ARCSS links to documents or media. Unlike hardcoded links which might break if a specific gateway goes offline, ARCSS ensures that the content remains consistently accessible.")]),e._v(" "),t("h3",{attrs:{id:"media-sharing-platforms-with-consistent-content-delivery"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#media-sharing-platforms-with-consistent-content-delivery"}},[e._v("#")]),e._v(" Media Sharing Platforms with Consistent Content Delivery")]),e._v(" "),t("p",[e._v("For platforms hosting user-generated content, ARCSS provides not just decentralized hosting but also a guarantee of content delivery. Even if a content piece becomes viral and one gateway gets congested, ARCSS ensures that users can still access the content through another gateway, providing a seamless experience.")]),e._v(" "),t("h3",{attrs:{id:"decentralized-applications-dapps-with-reliable-front-end-accessibility"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#decentralized-applications-dapps-with-reliable-front-end-accessibility"}},[e._v("#")]),e._v(" Decentralized Applications (DApps) with Reliable Front-End Accessibility")]),e._v(" "),t("p",[e._v("DApps, while benefiting from Arweave's permanent hosting, can further ensure their front-end remains consistently accessible to users by using ARCSS. If a DApp's front-end is accessed frequently, causing strain on one gateway, ARCSS can help ensure the load is distributed, and the DApp remains online and functional.")]),e._v(" "),t("h2",{attrs:{id:"how-it-works"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-it-works"}},[e._v("#")]),e._v(" How it Works")]),e._v(" "),t("h3",{attrs:{id:"transaction-id"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#transaction-id"}},[e._v("#")]),e._v(" Transaction ID")]),e._v(" "),t("p",[e._v("To access content tied to an Arweave Transaction ID (TxId), simply append the TxId to "),t("code",[e._v("ar://")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ar://qI19W6spw-kzOGl4qUMNp2gwFH2EBfDXOFsjkcNyK9A\n")])])]),t("p",[e._v("Inputting this into a WayFinder-equipped browser will route your request through the right AR.IO Gateway, translating it as per your "),t("code",[e._v("Routing Method")]),e._v(" settings.")]),e._v(" "),t("h3",{attrs:{id:"arns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#arns"}},[e._v("#")]),e._v(" ArNS")]),e._v(" "),t("p",[e._v("Fetching content via an Arweave Name Service (ArNS) name is straightforward. Attach the ArNS name to "),t("code",[e._v("ar://")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ar://good-morning\n")])])]),t("p",[e._v("The ARCSS protocol, along with the WayFinder extension, discerns between TxIds and ArNS names. Once the suitable "),t("code",[e._v("https://")]),e._v(" request is formulated, the chosen gateway translates the ArNS name based on the ArNS smartweave contract.")]),e._v(" "),t("h2",{attrs:{id:"wayfinder"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wayfinder"}},[e._v("#")]),e._v(" Wayfinder")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://chrome.google.com/webstore/detail/ario-WayFinder/hnhmeknhajanolcoihhkkaaimapnmgil",target:"_blank",rel:"noopener noreferrer"}},[e._v("AR.IO WayFinder browser extension"),t("OutboundLink")],1),e._v(" is a browser extension designed to facilitate the resolving of "),t("code",[e._v("ar://")]),e._v(" urls.")]),e._v(" "),t("h3",{attrs:{id:"v0-0-10"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#v0-0-10"}},[e._v("#")]),e._v(" v0.0.10")]),e._v(" "),t("p",[e._v("As of v0.0.10, Wayfinder supports the resolution of TXT records to Arwevae content on top level domains. This innovative feature leverages DNS TXT records to associate Arweave transaction IDs with human-readable domain names, facilitating intuitive and memorable access to permaweb content. By simply entering an AR:// URL with a domain name, Wayfinder resolves the corresponding Arweave transaction ID through DNS TXT records, redirecting users directly to the content hosted on the Arweave network.")]),e._v(" "),t("p",[t("strong",[e._v("Setup")]),e._v(": Owners of a domain can set a TXT record for that domain following the format "),t("code",[e._v("ARTX ")]),e._v(".")]),e._v(" "),t("center",[t("img",{attrs:{src:e.$withBase("/images/arcss-txt.png")}})]),e._v(" "),t("p",[t("strong",[e._v("AR:// Redirection")]),e._v(": With a TXT record set properly, whenever a user (who has Wayfinder installed) enters an AR:// URL containing a domain name (e.g., "),t("code",[e._v("ar://example.com")]),e._v("), Wayfinder performs a DNS lookup for that TXT record in order to redirect to the Arweave content. The lookup is completed through a secure DNS-over-HTTPS query to ensure privacy and integrity.")]),e._v(" "),t("p",[t("strong",[e._v("Dynamic Content Resolution")]),e._v(": After retrieving the TXT record, Wayfinder extracts that Arweave transaction ID and dynamically redirects the user to the content on the permaweb. This process is transparent to the user, providing a seamless experience as if accessing a traditional website.")]),e._v(" "),t("h3",{attrs:{id:"key-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#key-features"}},[e._v("#")]),e._v(" Key Features")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Gasless")]),e._v(": TXT records can be set without any onchain transactions that would require gas fees.")]),e._v(" "),t("li",[t("strong",[e._v("Easy Integration")]),e._v(": Domain owners can easily link their permaweb content to their domains, making it accessible through a simple AR:// URL.")]),e._v(" "),t("li",[t("strong",[e._v("Dyncamic Content Access")]),e._v(": Content links can be updated in real-time through DNS TXT records, without requiring any changes to the AR:// URL itself.")]),e._v(" "),t("li",[t("strong",[e._v("Enhanced User Experience")]),e._v(": Offers users a familiar and easy-to-remember way to access permaweb content, leveraging standard web domain names.")]),e._v(" "),t("li",[t("strong",[e._v("Security and Privacy")]),e._v(": Secure DNS-over-HTTPS queries for DNS lookups protect user privacy and enhances security.")])]),e._v(" "),t("h3",{attrs:{id:"use-cases-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases-2"}},[e._v("#")]),e._v(" Use Cases")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Branded Content Access")]),e._v(": Companies and individuals can brand their permaweb content, making it accessible through their domain, enhancing brand visibility and user trust.")]),e._v(" "),t("li",[t("strong",[e._v("Dynamic Content Updates")]),e._v(": Domain owners can easily update what Permaweb content their AR:// URL resolves to, which is ideal for frequently updated resources like documents, blogs, and application interfaces.")]),e._v(" "),t("li",[t("strong",[e._v("Educational and Informational Resources")]),e._v(": Educational institutions and information providers can make their resources permanently available on the permaweb, accessible through simple, memorable URLs.")])]),e._v(" "),t("p",[e._v("This feature marks a significant advancement in making decentralized content more accessible and user-friendly, bridging the gap between traditional internet usability and the permaweb’s permanence and censorship-resistant nature.")])],1)}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/33.cbb5ce31.js b/assets/js/33.e9eeaf3d.js similarity index 99% rename from assets/js/33.cbb5ce31.js rename to assets/js/33.e9eeaf3d.js index 0b388435..19b28b49 100644 --- a/assets/js/33.cbb5ce31.js +++ b/assets/js/33.e9eeaf3d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{324:function(t,e,a){"use strict";a.r(e);var s=a(10),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"gateway-network"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gateway-network"}},[t._v("#")]),t._v(" Gateway network")]),t._v(" "),e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[t._v("#")]),t._v(" Overview")]),t._v(" "),e("p",[t._v("The AR.IO Network consists of AR.IO Gateway nodes, which are identified by their registered Arweave wallet addresses and either their IP addresses or hostnames, as stored in the network's smart contract Gateway Address Registry (GAR).")]),t._v(" "),e("p",[t._v("These nodes adhere to the AR.IO Network Protocols, creating a collaborative environment of Gateway nodes that vary in scale and specialization. The network ensures a fundamental level of service quality and trust minimization among its participants.")]),t._v(" "),e("p",[t._v("Being part of the network grants AR.IO Gateways an array of advantages, such as:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("Simplified advertising of services and end user discovery via the Gateway Address Registry.")])]),t._v(" "),e("li",[e("p",[t._v("More rapid bootstrapping of key Gateway operational data due to prioritized data request fulfillment among Gateways joined to the network.")])]),t._v(" "),e("li",[e("p",[t._v("Sharing of data processing results.")])]),t._v(" "),e("li",[e("p",[t._v("Access to support channels tailored for operators.")])]),t._v(" "),e("li",[e("p",[t._v("Enhanced trust and transparency through the use of AGPL-3 licenses, which mandate public disclosure of any software changes, thereby reinforcing the network's integrity and reliability.")])]),t._v(" "),e("li",[e("p",[t._v("Improved network reliability and performance through an incentive protocol, which uses a system of rewards and evaluations to encourage high-quality service from Gateways.")])])]),t._v(" "),e("h2",{attrs:{id:"gateway-address-registry-gar"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gateway-address-registry-gar"}},[t._v("#")]),t._v(" Gateway Address Registry (GAR)")]),t._v(" "),e("p",[t._v('Any Gateway operator that whishes to join the AR.IO Network must register their node in the AR.IO SmartWeave Contract\'s "Gateway Address Registry", known as the GAR. Registration involves staking a minimum amount of IO tokens and providing additional metadata describing the Gateway service offered.')]),t._v(" "),e("p",[t._v("After joining the network, the operator's Gateway can be easily discovered by permaweb apps, its health can be observed, and it can participate in the AR.IO data sharing protocol.")]),t._v(" "),e("p",[t._v("The Gateway operator can modify their Gateway's GAR configuration as needed, which includes adding more tokens to their stake or removing them. Operators can completely remove their stake and leave the AR.IO Network following a minimum network exit wait time. This exit time ensures that Gateways cannot quickly escape from an anticipated penalty.")]),t._v(" "),e("p",[t._v("The GAR advertises the specific attributes of each Gateway including its stake and settings. This enables permaweb apps and users to discover which Gateways are currently available and meet their needs. Apps that read the GAR can sort and filter it using the Gateway metadata, for example, ranking Gateways with the highest stake at the top of the list. This would allow users to prefer the lower-trust, higher staked Gateways before settling on a higher-trust, lower staked Gateway.")]),t._v(" "),e("h2",{attrs:{id:"staking"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#staking"}},[t._v("#")]),t._v(" Staking")]),t._v(" "),e("p",[t._v("Staking tokens serves a dual purpose in the AR.IO Network:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("It acts as a method of public commitment, and")])]),t._v(" "),e("li",[e("p",[t._v("It qualifies participants for reward distribution.")])])]),t._v(" "),e("p",[t._v('In the AR.IO Network, "staking" designates the act of locking a specified amount of IO tokens into a protocol-controlled vault. These tokens act as a form of collateral and public commitment, encouraging network participants to act in the network\'s best interests. Once tokens are deposited in the vault, they remain locked until either the participant triggers the "unstake" function or the vault\'s predetermined lock period expires.')]),t._v(" "),e("p",[t._v("It is important to note that unlike other protocols, the IO token is non-inflationary. Therefore, the staking mechanism in the AR.IO Network is not designed to function as a yield-generation tool. By staking their tokens, participants become eligible for potential rewards, fostering an atmosphere of mutual trust within the network. Specifically, Gateway operators stake tokens to facilitate their Gateway integration and establish public trust. Once connected, they become eligible for rewards driven by the protocol and gain access to the network's shared resources.")]),t._v(" "),e("h2",{attrs:{id:"schema"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#schema"}},[t._v("#")]),t._v(" Schema")]),t._v(" "),e("h3",{attrs:{id:"gateway-schema"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gateway-schema"}},[t._v("#")]),t._v(" Gateway Schema")]),t._v(" "),e("div",{staticStyle:{"text-align":"center"}},[e("table",{staticClass:"inline-table",attrs:{id:"gateway-table"}},[e("tr",[e("th",{staticStyle:{"font-weight":"bold","text-decoration":"underline"},attrs:{colspan:"3"}},[t._v("Gateway")])]),t._v(" "),e("tr",[e("th",[t._v("Name")]),t._v(" "),e("th",[t._v("Type")]),t._v(" "),e("th",[t._v("Description")])]),t._v(" "),e("tr",[e("th",[t._v("operatorStake")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The total stake of the Gateway's operator.")])]),t._v(" "),e("tr",[e("th",[t._v("start")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Block number in which the Gateway joined the network.")])]),t._v(" "),e("tr",[e("th",[t._v("end")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Block number in which the Gateway can leave the network, setting to 0 means no end date.")])]),t._v(" "),e("tr",[e("th",[t._v("status")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v('Participation status of the Gateway, "joined" - participating in the network, "hidden" - not leaving, but not participating, "leaving" - in the process of withdrawing from the network.')])]),t._v(" "),e("tr",[e("th",[t._v("vaults")]),t._v(" "),e("td",[t._v("array of objects")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The locked tokens staked by the Gateway operator, "),e("a",{attrs:{href:"#token-vault"}},[t._v("view schema")]),t._v(".")])]),t._v(" "),e("tr",[e("th",[t._v("settings")]),t._v(" "),e("td",[t._v("object")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Additional configuration settings for the Gateway, "),e("a",{attrs:{href:"#gateway-settings"}},[t._v("view schema")]),t._v(".")])])])]),t._v(" "),e("h3",{attrs:{id:"token-vault"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#token-vault"}},[t._v("#")]),t._v(" Token Vault")]),t._v(" "),e("div",{staticStyle:{"text-align":"center"}},[e("table",{staticClass:"inline-table",attrs:{id:"token-vault-table"}},[e("tr",[e("th",{staticStyle:{"font-weight":"bold","text-decoration":"underline"},attrs:{colspan:"3"}},[t._v("Token Vault")])]),t._v(" "),e("tr",[e("th",[t._v("Name")]),t._v(" "),e("th",[t._v("Type")]),t._v(" "),e("th",[t._v("Description")])]),t._v(" "),e("tr",[e("th",[t._v("balance")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Positive integer, the number of IO tokens locked.")])]),t._v(" "),e("tr",[e("th",[t._v("start")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Block number in which locking starts.")])]),t._v(" "),e("tr",[e("th",[t._v("end")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Block number in which locking ends. Setting to 0 means no end date.")])])])]),t._v(" "),e("h3",{attrs:{id:"gateway-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gateway-settings"}},[t._v("#")]),t._v(" Gateway Settings")]),t._v(" "),e("div",{staticStyle:{"text-align":"center"}},[e("table",{staticClass:"inline-table",attrs:{id:"gateway-settings-table"}},[e("tr",[e("th",{staticStyle:{"font-weight":"bold","text-decoration":"underline"},attrs:{colspan:"4"}},[t._v("Gateway Settings")])]),t._v(" "),e("tr",[e("th",[t._v("Name")]),t._v(" "),e("th",[t._v("Type")]),t._v(" "),e("th",[t._v("Required")]),t._v(" "),e("th",[t._v("Description")])]),t._v(" "),e("tr",[e("th",[t._v("label")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The friendly name used to label the Gateway.")])]),t._v(" "),e("tr",[e("th",[t._v("fqdn")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The fully qualified domain name at which the Gateway can be reached. e.g. arweave.net")])]),t._v(" "),e("tr",[e("th",[t._v("port")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The port used by the Gateway. e.g. 443")])]),t._v(" "),e("tr",[e("th",[t._v("protocol")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Web protocol used by this Gateway "),e("code",[t._v('"https"')]),t._v(", or "),e("code",[t._v('"http"')])])]),t._v(" "),e("tr",[e("th",[t._v("properties")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("no")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("An Arweave transaction ID containing additional properties of the Gateway.")])]),t._v(" "),e("tr",[e("th",[t._v("note")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("no")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("An Arweave transaction ID containing additional notes the Gateway operator can set to include things like announcements, maintenance, or other operational updates.")])]),t._v(" "),e("tr",[e("th",[t._v("observerWallet")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",[t._v("The public address for the wallet being used to sign and upload Observer reports")])])])])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{328:function(t,e,a){"use strict";a.r(e);var s=a(10),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"gateway-network"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gateway-network"}},[t._v("#")]),t._v(" Gateway network")]),t._v(" "),e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[t._v("#")]),t._v(" Overview")]),t._v(" "),e("p",[t._v("The AR.IO Network consists of AR.IO Gateway nodes, which are identified by their registered Arweave wallet addresses and either their IP addresses or hostnames, as stored in the network's smart contract Gateway Address Registry (GAR).")]),t._v(" "),e("p",[t._v("These nodes adhere to the AR.IO Network Protocols, creating a collaborative environment of Gateway nodes that vary in scale and specialization. The network ensures a fundamental level of service quality and trust minimization among its participants.")]),t._v(" "),e("p",[t._v("Being part of the network grants AR.IO Gateways an array of advantages, such as:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("Simplified advertising of services and end user discovery via the Gateway Address Registry.")])]),t._v(" "),e("li",[e("p",[t._v("More rapid bootstrapping of key Gateway operational data due to prioritized data request fulfillment among Gateways joined to the network.")])]),t._v(" "),e("li",[e("p",[t._v("Sharing of data processing results.")])]),t._v(" "),e("li",[e("p",[t._v("Access to support channels tailored for operators.")])]),t._v(" "),e("li",[e("p",[t._v("Enhanced trust and transparency through the use of AGPL-3 licenses, which mandate public disclosure of any software changes, thereby reinforcing the network's integrity and reliability.")])]),t._v(" "),e("li",[e("p",[t._v("Improved network reliability and performance through an incentive protocol, which uses a system of rewards and evaluations to encourage high-quality service from Gateways.")])])]),t._v(" "),e("h2",{attrs:{id:"gateway-address-registry-gar"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gateway-address-registry-gar"}},[t._v("#")]),t._v(" Gateway Address Registry (GAR)")]),t._v(" "),e("p",[t._v('Any Gateway operator that whishes to join the AR.IO Network must register their node in the AR.IO SmartWeave Contract\'s "Gateway Address Registry", known as the GAR. Registration involves staking a minimum amount of IO tokens and providing additional metadata describing the Gateway service offered.')]),t._v(" "),e("p",[t._v("After joining the network, the operator's Gateway can be easily discovered by permaweb apps, its health can be observed, and it can participate in the AR.IO data sharing protocol.")]),t._v(" "),e("p",[t._v("The Gateway operator can modify their Gateway's GAR configuration as needed, which includes adding more tokens to their stake or removing them. Operators can completely remove their stake and leave the AR.IO Network following a minimum network exit wait time. This exit time ensures that Gateways cannot quickly escape from an anticipated penalty.")]),t._v(" "),e("p",[t._v("The GAR advertises the specific attributes of each Gateway including its stake and settings. This enables permaweb apps and users to discover which Gateways are currently available and meet their needs. Apps that read the GAR can sort and filter it using the Gateway metadata, for example, ranking Gateways with the highest stake at the top of the list. This would allow users to prefer the lower-trust, higher staked Gateways before settling on a higher-trust, lower staked Gateway.")]),t._v(" "),e("h2",{attrs:{id:"staking"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#staking"}},[t._v("#")]),t._v(" Staking")]),t._v(" "),e("p",[t._v("Staking tokens serves a dual purpose in the AR.IO Network:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("It acts as a method of public commitment, and")])]),t._v(" "),e("li",[e("p",[t._v("It qualifies participants for reward distribution.")])])]),t._v(" "),e("p",[t._v('In the AR.IO Network, "staking" designates the act of locking a specified amount of IO tokens into a protocol-controlled vault. These tokens act as a form of collateral and public commitment, encouraging network participants to act in the network\'s best interests. Once tokens are deposited in the vault, they remain locked until either the participant triggers the "unstake" function or the vault\'s predetermined lock period expires.')]),t._v(" "),e("p",[t._v("It is important to note that unlike other protocols, the IO token is non-inflationary. Therefore, the staking mechanism in the AR.IO Network is not designed to function as a yield-generation tool. By staking their tokens, participants become eligible for potential rewards, fostering an atmosphere of mutual trust within the network. Specifically, Gateway operators stake tokens to facilitate their Gateway integration and establish public trust. Once connected, they become eligible for rewards driven by the protocol and gain access to the network's shared resources.")]),t._v(" "),e("h2",{attrs:{id:"schema"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#schema"}},[t._v("#")]),t._v(" Schema")]),t._v(" "),e("h3",{attrs:{id:"gateway-schema"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gateway-schema"}},[t._v("#")]),t._v(" Gateway Schema")]),t._v(" "),e("div",{staticStyle:{"text-align":"center"}},[e("table",{staticClass:"inline-table",attrs:{id:"gateway-table"}},[e("tr",[e("th",{staticStyle:{"font-weight":"bold","text-decoration":"underline"},attrs:{colspan:"3"}},[t._v("Gateway")])]),t._v(" "),e("tr",[e("th",[t._v("Name")]),t._v(" "),e("th",[t._v("Type")]),t._v(" "),e("th",[t._v("Description")])]),t._v(" "),e("tr",[e("th",[t._v("operatorStake")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The total stake of the Gateway's operator.")])]),t._v(" "),e("tr",[e("th",[t._v("start")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Block number in which the Gateway joined the network.")])]),t._v(" "),e("tr",[e("th",[t._v("end")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Block number in which the Gateway can leave the network, setting to 0 means no end date.")])]),t._v(" "),e("tr",[e("th",[t._v("status")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v('Participation status of the Gateway, "joined" - participating in the network, "hidden" - not leaving, but not participating, "leaving" - in the process of withdrawing from the network.')])]),t._v(" "),e("tr",[e("th",[t._v("vaults")]),t._v(" "),e("td",[t._v("array of objects")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The locked tokens staked by the Gateway operator, "),e("a",{attrs:{href:"#token-vault"}},[t._v("view schema")]),t._v(".")])]),t._v(" "),e("tr",[e("th",[t._v("settings")]),t._v(" "),e("td",[t._v("object")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Additional configuration settings for the Gateway, "),e("a",{attrs:{href:"#gateway-settings"}},[t._v("view schema")]),t._v(".")])])])]),t._v(" "),e("h3",{attrs:{id:"token-vault"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#token-vault"}},[t._v("#")]),t._v(" Token Vault")]),t._v(" "),e("div",{staticStyle:{"text-align":"center"}},[e("table",{staticClass:"inline-table",attrs:{id:"token-vault-table"}},[e("tr",[e("th",{staticStyle:{"font-weight":"bold","text-decoration":"underline"},attrs:{colspan:"3"}},[t._v("Token Vault")])]),t._v(" "),e("tr",[e("th",[t._v("Name")]),t._v(" "),e("th",[t._v("Type")]),t._v(" "),e("th",[t._v("Description")])]),t._v(" "),e("tr",[e("th",[t._v("balance")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Positive integer, the number of IO tokens locked.")])]),t._v(" "),e("tr",[e("th",[t._v("start")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Block number in which locking starts.")])]),t._v(" "),e("tr",[e("th",[t._v("end")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Block number in which locking ends. Setting to 0 means no end date.")])])])]),t._v(" "),e("h3",{attrs:{id:"gateway-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gateway-settings"}},[t._v("#")]),t._v(" Gateway Settings")]),t._v(" "),e("div",{staticStyle:{"text-align":"center"}},[e("table",{staticClass:"inline-table",attrs:{id:"gateway-settings-table"}},[e("tr",[e("th",{staticStyle:{"font-weight":"bold","text-decoration":"underline"},attrs:{colspan:"4"}},[t._v("Gateway Settings")])]),t._v(" "),e("tr",[e("th",[t._v("Name")]),t._v(" "),e("th",[t._v("Type")]),t._v(" "),e("th",[t._v("Required")]),t._v(" "),e("th",[t._v("Description")])]),t._v(" "),e("tr",[e("th",[t._v("label")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The friendly name used to label the Gateway.")])]),t._v(" "),e("tr",[e("th",[t._v("fqdn")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The fully qualified domain name at which the Gateway can be reached. e.g. arweave.net")])]),t._v(" "),e("tr",[e("th",[t._v("port")]),t._v(" "),e("td",[t._v("number")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("The port used by the Gateway. e.g. 443")])]),t._v(" "),e("tr",[e("th",[t._v("protocol")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("Web protocol used by this Gateway "),e("code",[t._v('"https"')]),t._v(", or "),e("code",[t._v('"http"')])])]),t._v(" "),e("tr",[e("th",[t._v("properties")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("no")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("An Arweave transaction ID containing additional properties of the Gateway.")])]),t._v(" "),e("tr",[e("th",[t._v("note")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("no")]),t._v(" "),e("td",{staticClass:"align-left"},[t._v("An Arweave transaction ID containing additional notes the Gateway operator can set to include things like announcements, maintenance, or other operational updates.")])]),t._v(" "),e("tr",[e("th",[t._v("observerWallet")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v("yes")]),t._v(" "),e("td",[t._v("The public address for the wallet being used to sign and upload Observer reports")])])])])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/34.c77ff485.js b/assets/js/34.c074bc2e.js similarity index 98% rename from assets/js/34.c77ff485.js rename to assets/js/34.c074bc2e.js index 418eba05..c6eb9188 100644 --- a/assets/js/34.c77ff485.js +++ b/assets/js/34.c074bc2e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{325:function(e,t,a){"use strict";a.r(t);var n=a(10),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"ar-io-http-api-admin-endpoints"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ar-io-http-api-admin-endpoints"}},[e._v("#")]),e._v(" AR.IO HTTP API Admin Endpoints")]),e._v(" "),t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),t("p",[e._v("The AR.IO HTTP API offers several endpoints that allow access to internal information and the ability to make adjustments without restarting your Gateway. Each of these endpoints behind "),t("code",[e._v("/ar-io/admin/")]),e._v(" have access restricted, so you will need to have set up your "),t("code",[e._v("ADMIN_API_KEY")]),e._v(" variable and include "),t("code",[e._v('"Authorization: "Bearer ${ADMIN_API_KEY}"')]),e._v(" in the header of your request.")]),e._v(" "),t("p",[e._v("When testing endpoints at "),t("code",[e._v("/api-docs")]),e._v(", you can enter your "),t("code",[e._v("ADMIN_API_KEY")]),e._v(' using the green "Authorize" button near the top of the page, or by clicking any of the open lock icons next to a password protected end point.')]),e._v(" "),t("h2",{attrs:{id:"debug"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#debug"}},[e._v("#")]),e._v(" Debug")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("ar-io/admin/debug")]),e._v(" endpoint provides a comprehensive view of the current state of your Gateway. This endpoint has been designed to offer developers and administrators insights into the operational status of the gateway, including any errors or warnings that have occurred since the last startup.")]),e._v(" "),t("details",[t("summary",[e._v("Example response")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("{\n db: {\n counts: {\n wallets: 137,\n tagNames: 61,\n tagValues: 892,\n stableTxs: 0,\n stableBlocks: 0,\n stableBlockTxs: 0,\n missingStableBlocks: 0,\n missingStableTxs: 0,\n missingTxs: 0,\n newBlocks: 32,\n newTxs: 4436,\n bundleCount: 159,\n bundleDataItems: 0,\n matcheDataItems: 0,\n dataItems: 0,\n nestedDataItems: null\n },\n heights: { minStable: -1, maxStable: -1, minNew: 1000000, maxNew: 1000031 },\n timestamps: {\n now: 1692230403,\n maxBundleQueuedAt: -1,\n maxBundleSkippedAt: 1692230390,\n maxBundleUnbundledAt: -1,\n maxBundleFullyIndexedAt: -1,\n maxNewDataItemIndexedAt: -1,\n maxStableDataItemIndexedAt: -1\n },\n errors: [],\n warnings: []\n }\n}\n")])])])]),e._v(" "),t("h2",{attrs:{id:"queue-transaction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#queue-transaction"}},[e._v("#")]),e._v(" Queue Transaction")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("ar-io/admin/queue-tx")]),e._v(" endpoint allows you to prioritize processing of a specific transaction, based on that transaction's ID. The "),t("code",[e._v("id")]),e._v(" key must be set in the body of your request, and a POST request should be used.")]),e._v(" "),t("p",[e._v("This endpoint will also enable you to prioritize opening and indexing bundles by providing the L1 TX ID for the bundle, but only if your Gateway is operating with the "),t("code",[e._v("ANS104_UNBUNDLE_FILTER")]),e._v(" and "),t("code",[e._v("ANS104_INDEX_FILTER")]),e._v(" keys set.")]),e._v(" "),t("p",[e._v("Your Gateway will either respond with an error, or "),t("code",[e._v("{ message: 'TX queued' }")])]),e._v(" "),t("h2",{attrs:{id:"block-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#block-data"}},[e._v("#")]),e._v(" Block Data")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("ar-io/admin/block-data")]),e._v(" endpoint allows you to tell your Gateway to refuse to serve certain data. In order to add to this block list, make a PUT request to this endpoint with the following in the body:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('{\n "id": "",\n "notes": "Example notes",\n "source": "Example source"\n}\n')])])]),t("ul",[t("li",[t("strong",[e._v("id")]),e._v(": This should be the transaction id of the content you want to block.")]),e._v(" "),t("li",[t("strong",[e._v("notes")]),e._v(": Notes regarding the reason this content was blocked. For documentation purposes only.")]),e._v(" "),t("li",[t("strong",[e._v("source")]),e._v(": Identifier for the source of TX IDs you are blocking. For example, the name of a public block list. For documentation purposes only.")])]),e._v(" "),t("p",[e._v("Your Gateway will either respond with an error, or "),t("code",[e._v("{ message: 'Content blocked' }")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{324:function(e,t,a){"use strict";a.r(t);var n=a(10),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"ar-io-http-api-admin-endpoints"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ar-io-http-api-admin-endpoints"}},[e._v("#")]),e._v(" AR.IO HTTP API Admin Endpoints")]),e._v(" "),t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),t("p",[e._v("The AR.IO HTTP API offers several endpoints that allow access to internal information and the ability to make adjustments without restarting your Gateway. Each of these endpoints behind "),t("code",[e._v("/ar-io/admin/")]),e._v(" have access restricted, so you will need to have set up your "),t("code",[e._v("ADMIN_API_KEY")]),e._v(" variable and include "),t("code",[e._v('"Authorization: "Bearer ${ADMIN_API_KEY}"')]),e._v(" in the header of your request.")]),e._v(" "),t("p",[e._v("When testing endpoints at "),t("code",[e._v("/api-docs")]),e._v(", you can enter your "),t("code",[e._v("ADMIN_API_KEY")]),e._v(' using the green "Authorize" button near the top of the page, or by clicking any of the open lock icons next to a password protected end point.')]),e._v(" "),t("h2",{attrs:{id:"debug"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#debug"}},[e._v("#")]),e._v(" Debug")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("ar-io/admin/debug")]),e._v(" endpoint provides a comprehensive view of the current state of your Gateway. This endpoint has been designed to offer developers and administrators insights into the operational status of the gateway, including any errors or warnings that have occurred since the last startup.")]),e._v(" "),t("details",[t("summary",[e._v("Example response")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("{\n db: {\n counts: {\n wallets: 137,\n tagNames: 61,\n tagValues: 892,\n stableTxs: 0,\n stableBlocks: 0,\n stableBlockTxs: 0,\n missingStableBlocks: 0,\n missingStableTxs: 0,\n missingTxs: 0,\n newBlocks: 32,\n newTxs: 4436,\n bundleCount: 159,\n bundleDataItems: 0,\n matcheDataItems: 0,\n dataItems: 0,\n nestedDataItems: null\n },\n heights: { minStable: -1, maxStable: -1, minNew: 1000000, maxNew: 1000031 },\n timestamps: {\n now: 1692230403,\n maxBundleQueuedAt: -1,\n maxBundleSkippedAt: 1692230390,\n maxBundleUnbundledAt: -1,\n maxBundleFullyIndexedAt: -1,\n maxNewDataItemIndexedAt: -1,\n maxStableDataItemIndexedAt: -1\n },\n errors: [],\n warnings: []\n }\n}\n")])])])]),e._v(" "),t("h2",{attrs:{id:"queue-transaction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#queue-transaction"}},[e._v("#")]),e._v(" Queue Transaction")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("ar-io/admin/queue-tx")]),e._v(" endpoint allows you to prioritize processing of a specific transaction, based on that transaction's ID. The "),t("code",[e._v("id")]),e._v(" key must be set in the body of your request, and a POST request should be used.")]),e._v(" "),t("p",[e._v("This endpoint will also enable you to prioritize opening and indexing bundles by providing the L1 TX ID for the bundle, but only if your Gateway is operating with the "),t("code",[e._v("ANS104_UNBUNDLE_FILTER")]),e._v(" and "),t("code",[e._v("ANS104_INDEX_FILTER")]),e._v(" keys set.")]),e._v(" "),t("p",[e._v("Your Gateway will either respond with an error, or "),t("code",[e._v("{ message: 'TX queued' }")])]),e._v(" "),t("h2",{attrs:{id:"block-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#block-data"}},[e._v("#")]),e._v(" Block Data")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("ar-io/admin/block-data")]),e._v(" endpoint allows you to tell your Gateway to refuse to serve certain data. In order to add to this block list, make a PUT request to this endpoint with the following in the body:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('{\n "id": "",\n "notes": "Example notes",\n "source": "Example source"\n}\n')])])]),t("ul",[t("li",[t("strong",[e._v("id")]),e._v(": This should be the transaction id of the content you want to block.")]),e._v(" "),t("li",[t("strong",[e._v("notes")]),e._v(": Notes regarding the reason this content was blocked. For documentation purposes only.")]),e._v(" "),t("li",[t("strong",[e._v("source")]),e._v(": Identifier for the source of TX IDs you are blocking. For example, the name of a public block list. For documentation purposes only.")])]),e._v(" "),t("p",[e._v("Your Gateway will either respond with an error, or "),t("code",[e._v("{ message: 'Content blocked' }")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/35.166b40e4.js b/assets/js/35.31f5b4a8.js similarity index 99% rename from assets/js/35.166b40e4.js rename to assets/js/35.31f5b4a8.js index 69148718..794a236b 100644 --- a/assets/js/35.166b40e4.js +++ b/assets/js/35.31f5b4a8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{326:function(e,t,a){"use strict";a.r(t);var o=a(10),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"advanced-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-configuration"}},[e._v("#")]),e._v(" Advanced Configuration")]),e._v(" "),t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),t("p",[e._v("The Getting Started guides for "),t("RouterLink",{attrs:{to:"/gateways/ar-io-node/windows-setup.html"}},[e._v("windows")]),e._v(" and "),t("RouterLink",{attrs:{to:"/gateways/ar-io-node/linux-setup.html"}},[e._v("linux")]),e._v(" contain all the information needed to start your ar.io Gateway node successfully with basic configurations. There are also ever expanding advanced configuration options that allow you to run your node in a way that is customized to your specific use case.")],1),e._v(" "),t("p",[e._v("Most of the below options can be added to your "),t("code",[e._v(".env")]),e._v(" file in order to customize its operation. Any changes made to your "),t("code",[e._v(".env")]),e._v(" require you to stop the docker containers running your node, and restarting them with the "),t("code",[e._v("--build")]),e._v(" flag in order for the changes to take effect. See "),t("RouterLink",{attrs:{to:"/gateways/ar-io-node/env.html"}},[e._v("ENV")]),e._v(" for a complete list of environmental variables you can set.")],1),e._v(" "),t("h2",{attrs:{id:"data-storage-location"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-storage-location"}},[e._v("#")]),e._v(" Data Storage Location")]),e._v(" "),t("p",[e._v('You can set a custom location for your AR.IO Gateway to save the data it pulls from the Arweave network. There are three primary types of data stored, and you can set a unique storage location for each of these independently. These are "chunks data", "contiguous data", and "headers data". The custom location for each of these can be set in your .env file like this:')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("CHUNKS_DATA_PATH=\nCONTIGUOUS_DATA_PATH=\nHEADERS_DATA_PATH=\n")])])]),t("p",[e._v('Be sure to replace "" with the path to the location where you would like the data stored. If these values are omitted, the data will be stored in the "data" directory inside your Gateway code repository.')]),e._v(" "),t("h2",{attrs:{id:"admin-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#admin-api-key"}},[e._v("#")]),e._v(" Admin API Key")]),e._v(" "),t("p",[e._v('HTTP endpoints under "/ar-io/admin" are protected by an admin API key. These endpoints allow you to get certain analytics data or make adjustments to your node as it\'s running. When your node starts, it reads your environmental variables to see if a key is set. If not, a random key is generated. The key name is '),t("code",[e._v("ADMIN_API_KEY")]),e._v(" and it should be set in your "),t("code",[e._v(".env")]),e._v(" file like this:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ADMIN_API_KEY=SUPER_SECRET_PASSWORD\n")])])]),t("p",[e._v("View examples of the admin endpoints "),t("RouterLink",{attrs:{to:"/gateways/ar-io-node/admin/admin-api.html"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"wallet-association"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wallet-association"}},[e._v("#")]),e._v(" Wallet Association")]),e._v(" "),t("p",[e._v("In order to participate in the greater "),t("a",{attrs:{href:"https://ar.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("ar.io network"),t("OutboundLink")],1),e._v(", Gateway nodes need to associate themselves with an Arweave wallet. This can be configured by setting the "),t("code",[e._v("AR_IO_WALLET")]),e._v(" key value in your "),t("code",[e._v(".env")]),e._v(" file.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("AR_IO_WALLET=1seRanklLU_1VTGowDZdD7s_-7k1qowT6oeFZHUZiZo\n")])])]),t("h2",{attrs:{id:"unbundling"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#unbundling"}},[e._v("#")]),e._v(" Unbundling")]),e._v(" "),t("p",[e._v("AR.IO Gateway nodes support unbundling and indexing "),t("a",{attrs:{href:"https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-104.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ANS-104"),t("OutboundLink")],1),e._v(" bundle data. This is disabled by default, but can be turned on with several different configuration options. You can set these configurations with the "),t("code",[e._v("ANS104_UNBUNDLE_FILTER")]),e._v(" and "),t("code",[e._v("ANS104_INDEX_FILTER")]),e._v(" keys in your .env:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('ANS104_UNBUNDLE_FILTER=""\nANS104_INDEX_FILTER=""\n')])])]),t("p",[e._v("The following types of filters are supported:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('{ "never": true } # the default\n{ "always": true }\n{ "attributes": { "owner": , ... }}\n{ "tags": [{ "name": , "value": }, ...]}\n{ "and": [ , ... ]}\n{ "or": [ , ... ]}\n')])])]),t("h2",{attrs:{id:"content-moderation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#content-moderation"}},[e._v("#")]),e._v(" Content Moderation")]),e._v(" "),t("p",[e._v("You are able to set your Gateway to block specific transactions or data-items you don't want to serve. Unlike previous configuration options in this list, blocking content can be achieved without the need to add to your .env file and rebuild your Gateway. Instead, make a "),t("code",[e._v("PUT")]),e._v(" request to your Gateway at "),t("code",[e._v("/ar-io/admin/block-data")]),e._v(". As this is an admin endpoint, you will need to have configured your "),t("code",[e._v("ADMIN_API_KEY")]),e._v(". Using curl as an example, the request should be formatted as follows:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -X PUT -H "Authorization: Bearer " \\\n -H "Content-Type: application/json" \\\n "http://:/ar-io/admin/block-data" \\\n -d \'{ "id": "", "notes": "Example notes", "source": "Example source" }\'\n')])])]),t("ul",[t("li",[t("strong",[e._v("id")]),e._v(" (string): This will be the transaction ID of the content you want to add to your block list.")]),e._v(" "),t("li",[t("strong",[e._v("notes")]),e._v(" (string): Internal notes regarding why a particular ID is blocked.")]),e._v(" "),t("li",[t("strong",[e._v("source")]),e._v(" (string): Identifier of a particular source of IDs to block. (e.g. the name of a block list)")])]),e._v(" "),t("p",[t("code",[e._v("notes")]),e._v(" and "),t("code",[e._v("source")]),e._v(" are used for documentation only, and have no effect on your block list itself.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{325:function(e,t,a){"use strict";a.r(t);var o=a(10),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"advanced-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-configuration"}},[e._v("#")]),e._v(" Advanced Configuration")]),e._v(" "),t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),t("p",[e._v("The Getting Started guides for "),t("RouterLink",{attrs:{to:"/gateways/ar-io-node/windows-setup.html"}},[e._v("windows")]),e._v(" and "),t("RouterLink",{attrs:{to:"/gateways/ar-io-node/linux-setup.html"}},[e._v("linux")]),e._v(" contain all the information needed to start your ar.io Gateway node successfully with basic configurations. There are also ever expanding advanced configuration options that allow you to run your node in a way that is customized to your specific use case.")],1),e._v(" "),t("p",[e._v("Most of the below options can be added to your "),t("code",[e._v(".env")]),e._v(" file in order to customize its operation. Any changes made to your "),t("code",[e._v(".env")]),e._v(" require you to stop the docker containers running your node, and restarting them with the "),t("code",[e._v("--build")]),e._v(" flag in order for the changes to take effect. See "),t("RouterLink",{attrs:{to:"/gateways/ar-io-node/env.html"}},[e._v("ENV")]),e._v(" for a complete list of environmental variables you can set.")],1),e._v(" "),t("h2",{attrs:{id:"data-storage-location"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-storage-location"}},[e._v("#")]),e._v(" Data Storage Location")]),e._v(" "),t("p",[e._v('You can set a custom location for your AR.IO Gateway to save the data it pulls from the Arweave network. There are three primary types of data stored, and you can set a unique storage location for each of these independently. These are "chunks data", "contiguous data", and "headers data". The custom location for each of these can be set in your .env file like this:')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("CHUNKS_DATA_PATH=\nCONTIGUOUS_DATA_PATH=\nHEADERS_DATA_PATH=\n")])])]),t("p",[e._v('Be sure to replace "" with the path to the location where you would like the data stored. If these values are omitted, the data will be stored in the "data" directory inside your Gateway code repository.')]),e._v(" "),t("h2",{attrs:{id:"admin-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#admin-api-key"}},[e._v("#")]),e._v(" Admin API Key")]),e._v(" "),t("p",[e._v('HTTP endpoints under "/ar-io/admin" are protected by an admin API key. These endpoints allow you to get certain analytics data or make adjustments to your node as it\'s running. When your node starts, it reads your environmental variables to see if a key is set. If not, a random key is generated. The key name is '),t("code",[e._v("ADMIN_API_KEY")]),e._v(" and it should be set in your "),t("code",[e._v(".env")]),e._v(" file like this:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ADMIN_API_KEY=SUPER_SECRET_PASSWORD\n")])])]),t("p",[e._v("View examples of the admin endpoints "),t("RouterLink",{attrs:{to:"/gateways/ar-io-node/admin/admin-api.html"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"wallet-association"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wallet-association"}},[e._v("#")]),e._v(" Wallet Association")]),e._v(" "),t("p",[e._v("In order to participate in the greater "),t("a",{attrs:{href:"https://ar.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("ar.io network"),t("OutboundLink")],1),e._v(", Gateway nodes need to associate themselves with an Arweave wallet. This can be configured by setting the "),t("code",[e._v("AR_IO_WALLET")]),e._v(" key value in your "),t("code",[e._v(".env")]),e._v(" file.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("AR_IO_WALLET=1seRanklLU_1VTGowDZdD7s_-7k1qowT6oeFZHUZiZo\n")])])]),t("h2",{attrs:{id:"unbundling"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#unbundling"}},[e._v("#")]),e._v(" Unbundling")]),e._v(" "),t("p",[e._v("AR.IO Gateway nodes support unbundling and indexing "),t("a",{attrs:{href:"https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-104.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ANS-104"),t("OutboundLink")],1),e._v(" bundle data. This is disabled by default, but can be turned on with several different configuration options. You can set these configurations with the "),t("code",[e._v("ANS104_UNBUNDLE_FILTER")]),e._v(" and "),t("code",[e._v("ANS104_INDEX_FILTER")]),e._v(" keys in your .env:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('ANS104_UNBUNDLE_FILTER=""\nANS104_INDEX_FILTER=""\n')])])]),t("p",[e._v("The following types of filters are supported:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('{ "never": true } # the default\n{ "always": true }\n{ "attributes": { "owner": , ... }}\n{ "tags": [{ "name": , "value": }, ...]}\n{ "and": [ , ... ]}\n{ "or": [ , ... ]}\n')])])]),t("h2",{attrs:{id:"content-moderation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#content-moderation"}},[e._v("#")]),e._v(" Content Moderation")]),e._v(" "),t("p",[e._v("You are able to set your Gateway to block specific transactions or data-items you don't want to serve. Unlike previous configuration options in this list, blocking content can be achieved without the need to add to your .env file and rebuild your Gateway. Instead, make a "),t("code",[e._v("PUT")]),e._v(" request to your Gateway at "),t("code",[e._v("/ar-io/admin/block-data")]),e._v(". As this is an admin endpoint, you will need to have configured your "),t("code",[e._v("ADMIN_API_KEY")]),e._v(". Using curl as an example, the request should be formatted as follows:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -X PUT -H "Authorization: Bearer " \\\n -H "Content-Type: application/json" \\\n "http://:/ar-io/admin/block-data" \\\n -d \'{ "id": "", "notes": "Example notes", "source": "Example source" }\'\n')])])]),t("ul",[t("li",[t("strong",[e._v("id")]),e._v(" (string): This will be the transaction ID of the content you want to add to your block list.")]),e._v(" "),t("li",[t("strong",[e._v("notes")]),e._v(" (string): Internal notes regarding why a particular ID is blocked.")]),e._v(" "),t("li",[t("strong",[e._v("source")]),e._v(" (string): Identifier of a particular source of IDs to block. (e.g. the name of a block list)")])]),e._v(" "),t("p",[t("code",[e._v("notes")]),e._v(" and "),t("code",[e._v("source")]),e._v(" are used for documentation only, and have no effect on your block list itself.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/36.e629e264.js b/assets/js/36.7ceaefdf.js similarity index 92% rename from assets/js/36.e629e264.js rename to assets/js/36.7ceaefdf.js index 87332d2b..776f9333 100644 --- a/assets/js/36.e629e264.js +++ b/assets/js/36.7ceaefdf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{327:function(t,e,o){"use strict";o.r(e);var a=o(10),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ar-io-http-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ar-io-http-api"}},[t._v("#")]),t._v(" AR.IO HTTP API")]),t._v(" "),e("p",[t._v("Up to date documentation of endpoints for the AR.IO HTTP API used to access your Gateway can be found "),e("a",{attrs:{href:"https://ar-io.dev/api-docs/",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("You can also view endpoint documentation and test the endpoints against your own Gateway by going to "),e("code",[t._v("/api-docs")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{326:function(t,e,o){"use strict";o.r(e);var a=o(10),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ar-io-http-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ar-io-http-api"}},[t._v("#")]),t._v(" AR.IO HTTP API")]),t._v(" "),e("p",[t._v("Up to date documentation of endpoints for the AR.IO HTTP API used to access your Gateway can be found "),e("a",{attrs:{href:"https://ar-io.dev/api-docs/",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("You can also view endpoint documentation and test the endpoints against your own Gateway by going to "),e("code",[t._v("/api-docs")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/37.2ec5e73e.js b/assets/js/37.0249a453.js similarity index 99% rename from assets/js/37.2ec5e73e.js rename to assets/js/37.0249a453.js index 481bb029..f4602ce1 100644 --- a/assets/js/37.2ec5e73e.js +++ b/assets/js/37.0249a453.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{328:function(e,a,t){"use strict";t.r(a);var r=t(10),s=Object(r.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"observation-and-incentives"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#observation-and-incentives"}},[e._v("#")]),e._v(" Observation and Incentives")]),e._v(" "),a("h2",{attrs:{id:"overview"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),a("p",[e._v('The Observation and Incentive Protocol is designed to maintain and enhance the operational integrity of gateways on the AR.IO Network. It achieves this through a combination of incentivizing gateways for good performance and tasking those gateways to fulfill the role of "observers". The protocol is intentionally simple and adaptable, employing a smart contract-based method for onchain “voting” to assess peer performance while being flexible on how that performance is measured. This setup permits gateway and observer nodes to experiment and evolve best practices for performance evaluation, all while operating within the bounds of the network\'s immutable smart contract, thus eliminating the need for frequent contract updates (forks).')]),e._v(" "),a("p",[e._v("In this protocol, observers evaluate their gateway peers' performance to resolve ArNS names. Their aim is to ensure each gateway in the network accurately resolves a subset of names and assigning a pass / fail score based on their findings.")]),e._v(" "),a("p",[e._v('A key component of the protocol is its reward mechanism. This system is predicated on gateway performance and compliance with observation duties. Gateways that excel are tagged as "Functional Gateways" and earn rewards, while those that do not meet the criteria, “Deficient Gateways” risk facing penalties – namely, the lack of rewards.')]),e._v(" "),a("p",[e._v("Funds for incentive rewards are derived from the protocol balance, which consists of IO tokens collected from ArNS asset purchases. Every epoch, this balance is utilized to distribute rewards to qualifying gateways and observers based on certain performance metrics.")]),e._v(" "),a("h2",{attrs:{id:"observation-protocol"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#observation-protocol"}},[e._v("#")]),e._v(" Observation Protocol")]),e._v(" "),a("p",[e._v("The Observation protocol is organized around epochs, periods of time that are broken into an observation reporting and tallying phase. The protocol is followed across each epoch, promoting consistent healthy network activity that can form pro-social behaviors and react to malicious circumstances.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/observer-1.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Observation and Incentive Protocol")]),e._v(" "),a("ul",[a("li",[e._v("To participate in the epoch, a gateway must have already staked IO tokens and joined the network before it starts.")]),e._v(" "),a("li",[e._v("Each epoch (approximately 7 block-days), a random pool of active gateways will be selected (prescribed) to perform observation duties.")]),e._v(" "),a("li",[e._v("Within the epoch, observers are tasked with evaluating a subset of ArNS names for each gateway in the network.")]),e._v(" "),a("li",[e._v("By the end of the epoch’s observation reporting period, the observer must upload its standardized health observation report to Arweave.")]),e._v(" "),a("li",[e._v("The observer must also submit a SmartWeave interaction to the AR.IO contract to save its report transaction ID and a summary of all failed gateways for tallying by the incentive protocol.")]),e._v(" "),a("li",[e._v("After the observation reporting period and tallying periods have closed, the payout is performed on the next contract state tick.\n"),a("ul",[a("li",[e._v("This payout rewards gateways and observers who have performed their duties.")]),e._v(" "),a("li",[e._v("Gateways that did not meet the performance threshold will not receive rewards.")]),e._v(" "),a("li",[e._v("Observers that did not perform their duties are not rewarded and in addition, are penalized on any gateway rewards received.")])])]),e._v(" "),a("li",[e._v("Community builders and application users can verify and leverage the report and distribution information to make more informed decisions on which gateway to use.")])]),e._v(" "),a("h2",{attrs:{id:"onchain-reports"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#onchain-reports"}},[e._v("#")]),e._v(" Onchain Reports")]),e._v(" "),a("p",[e._v("The to-be-evaluated ArNS names include a set of names randomly determined by the protocol, known as “prescribed names”, which are common across all observers within the epoch, as well as a set of “chosen names” picked at the discretion of each individual observer. “Prescribed names” are assigned to act as a common denominator / baseline while “chosen names” allow each observer to evaluate names that may be important to their operation.")]),e._v(" "),a("p",[e._v("Each observer shall assess the performance of the selected ArNS names (across all gateways) and summarize those findings in a report which details the following:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("General Information: Observer's Arweave address, starting and concluding block heights for the epoch.")])]),e._v(" "),a("li",[a("p",[e._v("Gateway Operator Assessment: The expected and actual Arweave addresses of observed gateways, along with a summary verdict (pass or fail), and accompanying reasons for failure.")])]),e._v(" "),a("li",[a("p",[e._v('Detailed ArNS Evaluations: For each gateway, it includes the domain name, evaluated ArNS names, the associated block height, transaction IDs, data hashes, a "pass or fail" score, reasons for failure (if any), and performance metrics like time to the first byte.')])])]),e._v(" "),a("p",[e._v("A comprehensive list of report criteria can be found in the Appendix.")]),e._v(" "),a("p",[e._v("Observers shall upload their completed reports (in JSON format) to the Arweave network as an onchain audit trail. In addition, observers shall submit an interaction to the AR.IO SmartWeave contact detailing each gateway that they observed to have “failed” their assessments. This is tallied and used to determine the reward distribution.")]),e._v(" "),a("h2",{attrs:{id:"selection-of-observers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#selection-of-observers"}},[e._v("#")]),e._v(" Selection of Observers")]),e._v(" "),a("p",[e._v("The observer selection process employs a random-weighted selection method. By combining random selection with weighted criteria like stake, tenure, and past rewards, the process aims to ensure both fairness and acknowledgment of consistent performance. This method allows for a systematic yet randomized approach to selecting gateways for observation tasks.")]),e._v(" "),a("h3",{attrs:{id:"criteria-for-selection"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#criteria-for-selection"}},[e._v("#")]),e._v(" Criteria for Selection")]),e._v(" "),a("p",[e._v("Up to 50 gateways can be chosen as observers per epoch. If the GAR contains 50 or fewer gateways, then every gateway is designated as an observer for that epoch. If there are greater than 50, then randomized selection shall be utilized.")]),e._v(" "),a("p",[e._v("The weighted selection criteria will consider the following for each gateway:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("Stake Weight (SW): This factor considers how financially committed a gateway is to the network. It is the ratio of the amount of IO tokens staked by the gateway relative to the network minimum and is expressed as SW = Gateway Stake / Minimum Stake.")])]),e._v(" "),a("li",[a("p",[e._v("Tenure Weight (TW): This factor considers how long a gateway has been part of the network, with a maximum value capped at 4. It is calculated as TW = Gateway Network Tenure / 6 block-months. This means that the maximum value is achieved after 2 block-years of participation in the network.")])]),e._v(" "),a("li",[a("p",[e._v("Gateway Reward Ratio Weight (GRRW): This factor is a proxy for a gateway’s performance at resolving ArNS names. The weight represents the ratio of epochs in which a gateway received rewards for correctly resolving names relative to their total time on the network.")])]),e._v(" "),a("li",[a("p",[e._v("Observer Reward Ratio Weight (ORRW): This factor is a proxy for a gateway’s performance at fulfilling observation duties. The weight reflects the ratio of epochs in which a gateway, as an observer, successfully submitted observation reports relative to their total periods of service as an observer.")])])]),e._v(" "),a("h3",{attrs:{id:"weight-calculation-and-normalization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#weight-calculation-and-normalization"}},[e._v("#")]),e._v(" Weight Calculation and Normalization")]),e._v(" "),a("p",[e._v("For each gateway, a composite weight (CW) is computed, combining the Stake Weight, Tenure Weight, Gateway Reward Ratio Weight, and Observer Reward Ratio Weight.")]),e._v(" "),a("p",[e._v("The formula used is: "),a("code",[e._v("CW = SW x TW x GRRW x ORRW")]),e._v(".")]),e._v(" "),a("p",[e._v("These weights are then normalized across the network to create a continuous range, allowing for proportional random selection based on the weighted scores. The normalized composite weight (N_CW) for each gateway indicates its likelihood of being chosen as an observer and is calculated by dividing the gateway's CW by the sum of all CWs.")]),e._v(" "),a("h3",{attrs:{id:"random-selection-process"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#random-selection-process"}},[e._v("#")]),e._v(" Random Selection Process")]),e._v(" "),a("p",[e._v("The selection of observers is randomized within the framework of these weights. A set of unique random numbers is generated within the total range of normalized weights. For each random number, the gateway whose normalized weight range encompasses this number is selected. This system ensures that while gateways with higher weights are more likely to be chosen, all gateways maintain a non-zero chance of selection, preserving both fairness and meritocracy in the observer assignment process.")]),e._v(" "),a("h2",{attrs:{id:"performance-evaluation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#performance-evaluation"}},[e._v("#")]),e._v(" Performance Evaluation")]),e._v(" "),a("p",[e._v("Consider the following classifications:")]),e._v(" "),a("ul",[a("li",[a("p",[a("strong",[e._v("Functional or Passed Gateways")]),e._v(": are gateways that meet or surpass the network’s performance and quality standards.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Deficient or Failed Gateways")]),e._v(": are gateways that fall short of the network's performance expectations.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Functional or Submitted Observers")]),e._v(": are selected observers who diligently perform their duties and submit observation reports and contract interactions.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Deficient or Failed Observers")]),e._v(": are selected observers who do not fulfill their duty of submitting observation reports and contract interactions.")])])]),e._v(" "),a("p",[e._v("At the end of an epoch, the smart contract will assess the results from the observers during a “tallying period” and determine a pass / fail score for each gateway:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("If greater than or equal to 50% of submitted observer contract interactions indicate a PASS score, then that gateway is considered Functional and eligible for gateway rewards.")])]),e._v(" "),a("li",[a("p",[e._v("Else, if greater than 50% of submitted observer contract interactions indicate a FAIL score, then that gateway is considered Deficient and ineligible for gateway rewards.")])])]),e._v(" "),a("p",[e._v("These results will determine how reward distributions are made for that epoch. Rewards shall be distributed after the epoch’s tallying period is complete.")]),e._v(" "),a("h2",{attrs:{id:"reward-distribution"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reward-distribution"}},[e._v("#")]),e._v(" Reward Distribution")]),e._v(" "),a("p",[e._v("Each epoch, a defined portion of the protocol balance (e.g., 0.25%) is earmarked for distribution as rewards. From this allocation, two distinct reward categories are derived:")]),e._v(" "),a("ol",[a("li",[a("p",[e._v("Base Gateway Reward: This is the portion of the reward allocated to each Functional Gateway within the network and is calculated as:")]),e._v(" "),a("p",[a("code",[e._v("[Epoch Reward Allocation x 95% / Total Gateways in the Network]")])])]),e._v(" "),a("li",[a("p",[e._v("Base Observer Reward: Observers, due to their additional responsibilities, have a separate reward calculated as:")]),e._v(" "),a("p",[a("code",[e._v("[Epoch Reward Allocation x 5% / Total Selected Observers for the Epoch]")])])])]),e._v(" "),a("h3",{attrs:{id:"distribution-based-on-performance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#distribution-based-on-performance"}},[e._v("#")]),e._v(" Distribution Based on Performance")]),e._v(" "),a("p",[e._v("The reward distribution is contingent on the performance classifications derived from the Performance Evaluation:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("Functional Gateways: Gateways that meet the performance criteria receive the Base Gateway Reward.")])]),e._v(" "),a("li",[a("p",[e._v("Deficient Gateways: Gateways falling short in performance do not receive any gateway rewards.")])]),e._v(" "),a("li",[a("p",[e._v("Functional Observers: Observers that fulfilled their duty receive the Base Observer Reward.")])]),e._v(" "),a("li",[a("p",[e._v("Deficient Observers: Observers failing to meet their responsibilities do not receive observer rewards. Furthermore, if they are also Functional Gateways, their gateway reward is reduced by 25% for that epoch as a consequence for not performing their observation duty.")])])]),e._v(" "),a("h3",{attrs:{id:"undistributed-rewards"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#undistributed-rewards"}},[e._v("#")]),e._v(" Undistributed Rewards")]),e._v(" "),a("p",[e._v("In cases where rewards are not distributed, either due to the inactivity or deficiency of gateways or observers, the allocated tokens shall remain in the protocol balance and carry forward to the next epoch. This mechanism is in place to discourage observers from frivolously marking their peers as offline in hopes of attaining a higher portion of the reward pool.")]),e._v(" "),a("h2",{attrs:{id:"handling-inactive-gateways"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#handling-inactive-gateways"}},[e._v("#")]),e._v(" Handling Inactive Gateways")]),e._v(" "),a("p",[e._v("To maintain network efficiency and reduce contract state bloat, gateways that are consistently offline, specifically for six (6) consecutive epochs, and thus fail to receive rewards, will be automatically removed from the Gateway Active Registry (GAR) as well as have their staked IO tokens unlocked and returned to the gateway operator.")]),e._v(" "),a("h2",{attrs:{id:"observer-report-details"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#observer-report-details"}},[e._v("#")]),e._v(" Observer Report Details")]),e._v(" "),a("p",[e._v("Each observer shall assess the performance of the selected ArNS names (across all AR.IO gateways) and summarize those findings in a report which details the following:")]),e._v(" "),a("h2",{attrs:{id:"general-information"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#general-information"}},[e._v("#")]),e._v(" General Information")]),e._v(" "),a("ul",[a("li",[e._v("The observer's Arweave address.")]),e._v(" "),a("li",[e._v("The starting block height of the epoch.")]),e._v(" "),a("li",[e._v("The block height at which the report was generated.")])]),e._v(" "),a("h2",{attrs:{id:"overall-gateway-operator-assessment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#overall-gateway-operator-assessment"}},[e._v("#")]),e._v(" Overall Gateway Operator Assessment")]),e._v(" "),a("ul",[a("li",[e._v("Gateway FQDN.")]),e._v(" "),a("li",[e._v("The Arweave address that the observer expects to be the owner / operator of the gateway.")]),e._v(" "),a("li",[e._v("The Arweave address that the observed gateway actually reports.")]),e._v(" "),a("li",[e._v("A final “pass or fail” rollup determination for each observed gateway.")]),e._v(" "),a("li",[e._v("Failure reason (if applicable).")])]),e._v(" "),a("h2",{attrs:{id:"arns-assessments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arns-assessments"}},[e._v("#")]),e._v(" ArNS Assessments")]),e._v(" "),a("ul",[a("li",[e._v("Observed ArNS name (for all prescribed and chosen names).")]),e._v(" "),a("li",[e._v("The block height at which the name was assessed.")]),e._v(" "),a("li",[e._v("The expected status code.")]),e._v(" "),a("li",[e._v("The resolved status code.")]),e._v(" "),a("li",[e._v("The transaction ID that the observer expects the associated name to resolve to.")]),e._v(" "),a("li",[e._v("The transaction ID that the gateway actually resolves to.")]),e._v(" "),a("li",[e._v("The data hash that the observer expects the associated name to resolve to.")]),e._v(" "),a("li",[e._v("The data hash that the gateway actually resolves to.")]),e._v(" "),a("li",[e._v("The “pass or fail” score associated with the observed name, at the observer’s discretion.")]),e._v(" "),a("li",[e._v("Failure reason (if applicable).")]),e._v(" "),a("li",[e._v("Timing / performance information associated with the name resolution such as time to first byte and total duration.")])]),e._v(" "),a("p",[e._v("The above is repeated for the entire name pool and across each gateway in the GAR.")]),e._v(" "),a("h2",{attrs:{id:"example-observation-report"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-observation-report"}},[e._v("#")]),e._v(" Example Observation Report")]),e._v(" "),a("p",[a("a",{attrs:{href:"https://arweave.net/GG1YCFc7wQxKvQ1qD1lTEp2OAMBs4VzrpfdmeeLyjDI",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://arweave.net/GG1YCFc7wQxKvQ1qD1lTEp2OAMBs4VzrpfdmeeLyjDI "),a("OutboundLink")],1)]),e._v(" "),a("h2",{attrs:{id:"viewing-observation-reports"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#viewing-observation-reports"}},[e._v("#")]),e._v(" Viewing Observation Reports")]),e._v(" "),a("p",[e._v("You can easily view an observation report in a human readable format through your terminal with the following command:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-L")]),e._v(" https://arweave.net/"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("txId"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" zcat "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n")])])]),a("p",[e._v("Be sure to replace "),a("code",[e._v("")]),e._v(" with the txId of the report you want to view.")]),e._v(" "),a("h3",{attrs:{id:"example"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example"}},[e._v("#")]),e._v(" example")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-L")]),e._v(" https://arweave.net/H3zDmoDkpOg0U95rejBEq6gUnww_CEVscTuQVqfSbxk "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" zcat "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n")])])])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{327:function(e,a,t){"use strict";t.r(a);var r=t(10),s=Object(r.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"observation-and-incentives"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#observation-and-incentives"}},[e._v("#")]),e._v(" Observation and Incentives")]),e._v(" "),a("h2",{attrs:{id:"overview"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),a("p",[e._v('The Observation and Incentive Protocol is designed to maintain and enhance the operational integrity of gateways on the AR.IO Network. It achieves this through a combination of incentivizing gateways for good performance and tasking those gateways to fulfill the role of "observers". The protocol is intentionally simple and adaptable, employing a smart contract-based method for onchain “voting” to assess peer performance while being flexible on how that performance is measured. This setup permits gateway and observer nodes to experiment and evolve best practices for performance evaluation, all while operating within the bounds of the network\'s immutable smart contract, thus eliminating the need for frequent contract updates (forks).')]),e._v(" "),a("p",[e._v("In this protocol, observers evaluate their gateway peers' performance to resolve ArNS names. Their aim is to ensure each gateway in the network accurately resolves a subset of names and assigning a pass / fail score based on their findings.")]),e._v(" "),a("p",[e._v('A key component of the protocol is its reward mechanism. This system is predicated on gateway performance and compliance with observation duties. Gateways that excel are tagged as "Functional Gateways" and earn rewards, while those that do not meet the criteria, “Deficient Gateways” risk facing penalties – namely, the lack of rewards.')]),e._v(" "),a("p",[e._v("Funds for incentive rewards are derived from the protocol balance, which consists of IO tokens collected from ArNS asset purchases. Every epoch, this balance is utilized to distribute rewards to qualifying gateways and observers based on certain performance metrics.")]),e._v(" "),a("h2",{attrs:{id:"observation-protocol"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#observation-protocol"}},[e._v("#")]),e._v(" Observation Protocol")]),e._v(" "),a("p",[e._v("The Observation protocol is organized around epochs, periods of time that are broken into an observation reporting and tallying phase. The protocol is followed across each epoch, promoting consistent healthy network activity that can form pro-social behaviors and react to malicious circumstances.")]),e._v(" "),a("img",{staticClass:"amazingdiagram",attrs:{src:e.$withBase("/images/observer-1.png")}}),e._v(" "),a("div",{staticClass:"caption"},[e._v("Observation and Incentive Protocol")]),e._v(" "),a("ul",[a("li",[e._v("To participate in the epoch, a gateway must have already staked IO tokens and joined the network before it starts.")]),e._v(" "),a("li",[e._v("Each epoch (approximately 7 block-days), a random pool of active gateways will be selected (prescribed) to perform observation duties.")]),e._v(" "),a("li",[e._v("Within the epoch, observers are tasked with evaluating a subset of ArNS names for each gateway in the network.")]),e._v(" "),a("li",[e._v("By the end of the epoch’s observation reporting period, the observer must upload its standardized health observation report to Arweave.")]),e._v(" "),a("li",[e._v("The observer must also submit a SmartWeave interaction to the AR.IO contract to save its report transaction ID and a summary of all failed gateways for tallying by the incentive protocol.")]),e._v(" "),a("li",[e._v("After the observation reporting period and tallying periods have closed, the payout is performed on the next contract state tick.\n"),a("ul",[a("li",[e._v("This payout rewards gateways and observers who have performed their duties.")]),e._v(" "),a("li",[e._v("Gateways that did not meet the performance threshold will not receive rewards.")]),e._v(" "),a("li",[e._v("Observers that did not perform their duties are not rewarded and in addition, are penalized on any gateway rewards received.")])])]),e._v(" "),a("li",[e._v("Community builders and application users can verify and leverage the report and distribution information to make more informed decisions on which gateway to use.")])]),e._v(" "),a("h2",{attrs:{id:"onchain-reports"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#onchain-reports"}},[e._v("#")]),e._v(" Onchain Reports")]),e._v(" "),a("p",[e._v("The to-be-evaluated ArNS names include a set of names randomly determined by the protocol, known as “prescribed names”, which are common across all observers within the epoch, as well as a set of “chosen names” picked at the discretion of each individual observer. “Prescribed names” are assigned to act as a common denominator / baseline while “chosen names” allow each observer to evaluate names that may be important to their operation.")]),e._v(" "),a("p",[e._v("Each observer shall assess the performance of the selected ArNS names (across all gateways) and summarize those findings in a report which details the following:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("General Information: Observer's Arweave address, starting and concluding block heights for the epoch.")])]),e._v(" "),a("li",[a("p",[e._v("Gateway Operator Assessment: The expected and actual Arweave addresses of observed gateways, along with a summary verdict (pass or fail), and accompanying reasons for failure.")])]),e._v(" "),a("li",[a("p",[e._v('Detailed ArNS Evaluations: For each gateway, it includes the domain name, evaluated ArNS names, the associated block height, transaction IDs, data hashes, a "pass or fail" score, reasons for failure (if any), and performance metrics like time to the first byte.')])])]),e._v(" "),a("p",[e._v("A comprehensive list of report criteria can be found in the Appendix.")]),e._v(" "),a("p",[e._v("Observers shall upload their completed reports (in JSON format) to the Arweave network as an onchain audit trail. In addition, observers shall submit an interaction to the AR.IO SmartWeave contact detailing each gateway that they observed to have “failed” their assessments. This is tallied and used to determine the reward distribution.")]),e._v(" "),a("h2",{attrs:{id:"selection-of-observers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#selection-of-observers"}},[e._v("#")]),e._v(" Selection of Observers")]),e._v(" "),a("p",[e._v("The observer selection process employs a random-weighted selection method. By combining random selection with weighted criteria like stake, tenure, and past rewards, the process aims to ensure both fairness and acknowledgment of consistent performance. This method allows for a systematic yet randomized approach to selecting gateways for observation tasks.")]),e._v(" "),a("h3",{attrs:{id:"criteria-for-selection"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#criteria-for-selection"}},[e._v("#")]),e._v(" Criteria for Selection")]),e._v(" "),a("p",[e._v("Up to 50 gateways can be chosen as observers per epoch. If the GAR contains 50 or fewer gateways, then every gateway is designated as an observer for that epoch. If there are greater than 50, then randomized selection shall be utilized.")]),e._v(" "),a("p",[e._v("The weighted selection criteria will consider the following for each gateway:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("Stake Weight (SW): This factor considers how financially committed a gateway is to the network. It is the ratio of the amount of IO tokens staked by the gateway relative to the network minimum and is expressed as SW = Gateway Stake / Minimum Stake.")])]),e._v(" "),a("li",[a("p",[e._v("Tenure Weight (TW): This factor considers how long a gateway has been part of the network, with a maximum value capped at 4. It is calculated as TW = Gateway Network Tenure / 6 block-months. This means that the maximum value is achieved after 2 block-years of participation in the network.")])]),e._v(" "),a("li",[a("p",[e._v("Gateway Reward Ratio Weight (GRRW): This factor is a proxy for a gateway’s performance at resolving ArNS names. The weight represents the ratio of epochs in which a gateway received rewards for correctly resolving names relative to their total time on the network.")])]),e._v(" "),a("li",[a("p",[e._v("Observer Reward Ratio Weight (ORRW): This factor is a proxy for a gateway’s performance at fulfilling observation duties. The weight reflects the ratio of epochs in which a gateway, as an observer, successfully submitted observation reports relative to their total periods of service as an observer.")])])]),e._v(" "),a("h3",{attrs:{id:"weight-calculation-and-normalization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#weight-calculation-and-normalization"}},[e._v("#")]),e._v(" Weight Calculation and Normalization")]),e._v(" "),a("p",[e._v("For each gateway, a composite weight (CW) is computed, combining the Stake Weight, Tenure Weight, Gateway Reward Ratio Weight, and Observer Reward Ratio Weight.")]),e._v(" "),a("p",[e._v("The formula used is: "),a("code",[e._v("CW = SW x TW x GRRW x ORRW")]),e._v(".")]),e._v(" "),a("p",[e._v("These weights are then normalized across the network to create a continuous range, allowing for proportional random selection based on the weighted scores. The normalized composite weight (N_CW) for each gateway indicates its likelihood of being chosen as an observer and is calculated by dividing the gateway's CW by the sum of all CWs.")]),e._v(" "),a("h3",{attrs:{id:"random-selection-process"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#random-selection-process"}},[e._v("#")]),e._v(" Random Selection Process")]),e._v(" "),a("p",[e._v("The selection of observers is randomized within the framework of these weights. A set of unique random numbers is generated within the total range of normalized weights. For each random number, the gateway whose normalized weight range encompasses this number is selected. This system ensures that while gateways with higher weights are more likely to be chosen, all gateways maintain a non-zero chance of selection, preserving both fairness and meritocracy in the observer assignment process.")]),e._v(" "),a("h2",{attrs:{id:"performance-evaluation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#performance-evaluation"}},[e._v("#")]),e._v(" Performance Evaluation")]),e._v(" "),a("p",[e._v("Consider the following classifications:")]),e._v(" "),a("ul",[a("li",[a("p",[a("strong",[e._v("Functional or Passed Gateways")]),e._v(": are gateways that meet or surpass the network’s performance and quality standards.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Deficient or Failed Gateways")]),e._v(": are gateways that fall short of the network's performance expectations.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Functional or Submitted Observers")]),e._v(": are selected observers who diligently perform their duties and submit observation reports and contract interactions.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("Deficient or Failed Observers")]),e._v(": are selected observers who do not fulfill their duty of submitting observation reports and contract interactions.")])])]),e._v(" "),a("p",[e._v("At the end of an epoch, the smart contract will assess the results from the observers during a “tallying period” and determine a pass / fail score for each gateway:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("If greater than or equal to 50% of submitted observer contract interactions indicate a PASS score, then that gateway is considered Functional and eligible for gateway rewards.")])]),e._v(" "),a("li",[a("p",[e._v("Else, if greater than 50% of submitted observer contract interactions indicate a FAIL score, then that gateway is considered Deficient and ineligible for gateway rewards.")])])]),e._v(" "),a("p",[e._v("These results will determine how reward distributions are made for that epoch. Rewards shall be distributed after the epoch’s tallying period is complete.")]),e._v(" "),a("h2",{attrs:{id:"reward-distribution"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reward-distribution"}},[e._v("#")]),e._v(" Reward Distribution")]),e._v(" "),a("p",[e._v("Each epoch, a defined portion of the protocol balance (e.g., 0.25%) is earmarked for distribution as rewards. From this allocation, two distinct reward categories are derived:")]),e._v(" "),a("ol",[a("li",[a("p",[e._v("Base Gateway Reward: This is the portion of the reward allocated to each Functional Gateway within the network and is calculated as:")]),e._v(" "),a("p",[a("code",[e._v("[Epoch Reward Allocation x 95% / Total Gateways in the Network]")])])]),e._v(" "),a("li",[a("p",[e._v("Base Observer Reward: Observers, due to their additional responsibilities, have a separate reward calculated as:")]),e._v(" "),a("p",[a("code",[e._v("[Epoch Reward Allocation x 5% / Total Selected Observers for the Epoch]")])])])]),e._v(" "),a("h3",{attrs:{id:"distribution-based-on-performance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#distribution-based-on-performance"}},[e._v("#")]),e._v(" Distribution Based on Performance")]),e._v(" "),a("p",[e._v("The reward distribution is contingent on the performance classifications derived from the Performance Evaluation:")]),e._v(" "),a("ul",[a("li",[a("p",[e._v("Functional Gateways: Gateways that meet the performance criteria receive the Base Gateway Reward.")])]),e._v(" "),a("li",[a("p",[e._v("Deficient Gateways: Gateways falling short in performance do not receive any gateway rewards.")])]),e._v(" "),a("li",[a("p",[e._v("Functional Observers: Observers that fulfilled their duty receive the Base Observer Reward.")])]),e._v(" "),a("li",[a("p",[e._v("Deficient Observers: Observers failing to meet their responsibilities do not receive observer rewards. Furthermore, if they are also Functional Gateways, their gateway reward is reduced by 25% for that epoch as a consequence for not performing their observation duty.")])])]),e._v(" "),a("h3",{attrs:{id:"undistributed-rewards"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#undistributed-rewards"}},[e._v("#")]),e._v(" Undistributed Rewards")]),e._v(" "),a("p",[e._v("In cases where rewards are not distributed, either due to the inactivity or deficiency of gateways or observers, the allocated tokens shall remain in the protocol balance and carry forward to the next epoch. This mechanism is in place to discourage observers from frivolously marking their peers as offline in hopes of attaining a higher portion of the reward pool.")]),e._v(" "),a("h2",{attrs:{id:"handling-inactive-gateways"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#handling-inactive-gateways"}},[e._v("#")]),e._v(" Handling Inactive Gateways")]),e._v(" "),a("p",[e._v("To maintain network efficiency and reduce contract state bloat, gateways that are consistently offline, specifically for six (6) consecutive epochs, and thus fail to receive rewards, will be automatically removed from the Gateway Active Registry (GAR) as well as have their staked IO tokens unlocked and returned to the gateway operator.")]),e._v(" "),a("h2",{attrs:{id:"observer-report-details"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#observer-report-details"}},[e._v("#")]),e._v(" Observer Report Details")]),e._v(" "),a("p",[e._v("Each observer shall assess the performance of the selected ArNS names (across all AR.IO gateways) and summarize those findings in a report which details the following:")]),e._v(" "),a("h2",{attrs:{id:"general-information"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#general-information"}},[e._v("#")]),e._v(" General Information")]),e._v(" "),a("ul",[a("li",[e._v("The observer's Arweave address.")]),e._v(" "),a("li",[e._v("The starting block height of the epoch.")]),e._v(" "),a("li",[e._v("The block height at which the report was generated.")])]),e._v(" "),a("h2",{attrs:{id:"overall-gateway-operator-assessment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#overall-gateway-operator-assessment"}},[e._v("#")]),e._v(" Overall Gateway Operator Assessment")]),e._v(" "),a("ul",[a("li",[e._v("Gateway FQDN.")]),e._v(" "),a("li",[e._v("The Arweave address that the observer expects to be the owner / operator of the gateway.")]),e._v(" "),a("li",[e._v("The Arweave address that the observed gateway actually reports.")]),e._v(" "),a("li",[e._v("A final “pass or fail” rollup determination for each observed gateway.")]),e._v(" "),a("li",[e._v("Failure reason (if applicable).")])]),e._v(" "),a("h2",{attrs:{id:"arns-assessments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arns-assessments"}},[e._v("#")]),e._v(" ArNS Assessments")]),e._v(" "),a("ul",[a("li",[e._v("Observed ArNS name (for all prescribed and chosen names).")]),e._v(" "),a("li",[e._v("The block height at which the name was assessed.")]),e._v(" "),a("li",[e._v("The expected status code.")]),e._v(" "),a("li",[e._v("The resolved status code.")]),e._v(" "),a("li",[e._v("The transaction ID that the observer expects the associated name to resolve to.")]),e._v(" "),a("li",[e._v("The transaction ID that the gateway actually resolves to.")]),e._v(" "),a("li",[e._v("The data hash that the observer expects the associated name to resolve to.")]),e._v(" "),a("li",[e._v("The data hash that the gateway actually resolves to.")]),e._v(" "),a("li",[e._v("The “pass or fail” score associated with the observed name, at the observer’s discretion.")]),e._v(" "),a("li",[e._v("Failure reason (if applicable).")]),e._v(" "),a("li",[e._v("Timing / performance information associated with the name resolution such as time to first byte and total duration.")])]),e._v(" "),a("p",[e._v("The above is repeated for the entire name pool and across each gateway in the GAR.")]),e._v(" "),a("h2",{attrs:{id:"example-observation-report"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-observation-report"}},[e._v("#")]),e._v(" Example Observation Report")]),e._v(" "),a("p",[a("a",{attrs:{href:"https://arweave.net/GG1YCFc7wQxKvQ1qD1lTEp2OAMBs4VzrpfdmeeLyjDI",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://arweave.net/GG1YCFc7wQxKvQ1qD1lTEp2OAMBs4VzrpfdmeeLyjDI "),a("OutboundLink")],1)]),e._v(" "),a("h2",{attrs:{id:"viewing-observation-reports"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#viewing-observation-reports"}},[e._v("#")]),e._v(" Viewing Observation Reports")]),e._v(" "),a("p",[e._v("You can easily view an observation report in a human readable format through your terminal with the following command:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-L")]),e._v(" https://arweave.net/"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("txId"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" zcat "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n")])])]),a("p",[e._v("Be sure to replace "),a("code",[e._v("")]),e._v(" with the txId of the report you want to view.")]),e._v(" "),a("h3",{attrs:{id:"example"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example"}},[e._v("#")]),e._v(" example")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-L")]),e._v(" https://arweave.net/H3zDmoDkpOg0U95rejBEq6gUnww_CEVscTuQVqfSbxk "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" zcat "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n")])])])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/38.27518968.js b/assets/js/38.62823bdf.js similarity index 99% rename from assets/js/38.27518968.js rename to assets/js/38.62823bdf.js index 27d456de..6587eb85 100644 --- a/assets/js/38.27518968.js +++ b/assets/js/38.62823bdf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{330:function(t,e,_){"use strict";_.r(e);var v=_(10),a=Object(v.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"environmental-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#environmental-variables"}},[t._v("#")]),t._v(" Environmental Variables")]),t._v(" "),e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[t._v("#")]),t._v(" Overview")]),t._v(" "),e("p",[t._v("The AR.IO Gateway allows configuration customization through environmental variables. These variables dictate the gateway's behavior, from block synchronization settings to log formatting. Detailed below is a table enumerating all available environmental variables, their respective types, default values, and a brief description. Note that certain variables, such as "),e("code",[t._v("SANDBOX_PROTOCOL")]),t._v(", rely on others (e.g., "),e("code",[t._v("ARNS_ROOT_HOST")]),t._v(") to function effectively. Ensure proper understanding of these dependencies when configuring.")]),t._v(" "),e("h2",{attrs:{id:"variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#variables"}},[t._v("#")]),t._v(" Variables")]),t._v(" "),e("div",{staticStyle:{"text-align":"center"}},[e("table",{staticClass:"inline-table",attrs:{id:"gateway-table"}},[e("tr",[e("th",[t._v("ENV Name")]),t._v(" "),e("th",[t._v("Type")]),t._v(" "),e("th",[t._v("Default Value")]),t._v(" "),e("th",[t._v("Description")])]),t._v(" "),e("tr",[e("th",[t._v("START_HEIGHT")]),t._v(" "),e("td",[t._v('Number or "Infinity"')]),t._v(" "),e("td",[t._v("0")]),t._v(" "),e("td",[t._v("Starting block height for node synchronization (0 = start from genesis block)")])]),t._v(" "),e("tr",[e("th",[t._v("STOP_HEIGHT")]),t._v(" "),e("td",[t._v('Number or "Infinity"')]),t._v(" "),e("td",[t._v('"Infinity"')]),t._v(" "),e("td",[t._v("Stop block height for node synchronization (Infinity = keep syncing until stopped)")])]),t._v(" "),e("tr",[e("th",[t._v("TRUSTED_NODE_URL")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('"https://arweave.net"')]),t._v(" "),e("td",[t._v("Arweave node to use for fetching data")])]),t._v(" "),e("tr",[e("th",[t._v("TRUSTED_GATEWAY_URL")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('"https://arweave.net"')]),t._v(" "),e("td",[t._v("Arweave node to use for proxying reqeusts")])]),t._v(" "),e("tr",[e("th",[t._v("TRUSTED_ARNS_GATEWAY_URL")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("https://NAME.arweave.dev")]),t._v(" "),e("td",[t._v("ArNS gateway")])]),t._v(" "),e("tr",[e("th",[t._v("INSTANCE_ID")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('""')]),t._v(" "),e("td",[t._v('Adds an "INSTANCE_ID" field to output logs')])]),t._v(" "),e("tr",[e("th",[t._v("LOG_FORMAT")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('"simple"')]),t._v(" "),e("td",[t._v('Sets the format of output logs, accepts "simple" and "json"')])]),t._v(" "),e("tr",[e("th",[t._v("SKIP_CACHE")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("false")]),t._v(" "),e("td",[t._v("If true, skips the local cache and always fetches headers from the node")])]),t._v(" "),e("tr",[e("th",[t._v("PORT")]),t._v(" "),e("td",[t._v("Number")]),t._v(" "),e("td",[t._v("4000")]),t._v(" "),e("td",[t._v("AR.IO node exposed port number")])]),t._v(" "),e("tr",[e("th",[t._v("SIMULATED_REQUEST_FAILURE_RATE")]),t._v(" "),e("td",[t._v("Number")]),t._v(" "),e("td",[t._v("0")]),t._v(" "),e("td",[t._v("Number from 0 to 1, representing the probability of a request failing")])]),t._v(" "),e("tr",[e("th",[t._v("AR_IO_WALLET")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('""')]),t._v(" "),e("td",[t._v("Arweave wallet address used for staking and rewards")])]),t._v(" "),e("tr",[e("th",[t._v("ADMIN_API_KEY")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("Generated")]),t._v(" "),e("td",[t._v("API key used for admin API requests (if not set, it is generated and logged into the console)")])]),t._v(" "),e("tr",[e("th",[t._v("BACKFILL_BUNDLE_RECORDS")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("false")]),t._v(" "),e("td",[t._v("If true, AR.IO node will start indexing missing bundles")])]),t._v(" "),e("tr",[e("th",[t._v("FILTER_CHANGE_REPROCESS")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("false")]),t._v(" "),e("td",[t._v("If true, all indexed bundles will be reprocessed with the new filters (you can use this when you change the filters)")])]),t._v(" "),e("tr",[e("th",[t._v("ANS104_UNBUNDLE_FILTER")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('{"never": true}')]),t._v(" "),e("td",[t._v("Only bundles compliant with this filter will be unbundled")])]),t._v(" "),e("tr",[e("th",[t._v("ANS104_INDEX_FILTER")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('{"never": true}')]),t._v(" "),e("td",[t._v("Only bundles compliant with this filter will be indexed")])]),t._v(" "),e("tr",[e("th",[t._v("ARNS_ROOT_HOST")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("undefined")]),t._v(" "),e("td",[t._v("Domain name for ArNS host")])]),t._v(" "),e("tr",[e("th",[t._v("SANDBOX_PROTOCOL")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("undefined")]),t._v(" "),e("td",[t._v('Protocol setting in process of creating sandbox domains in ArNS (ARNS_ROOT_HOST needs to be set for this env to have any effect) accepts "http" or "https"')])]),t._v(" "),e("tr",[e("th",[t._v("START_WRITERS")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("true")]),t._v(" "),e("td",[t._v("If true, start indexing blocks, tx, ANS104 bundles")])]),t._v(" "),e("tr",[e("th",[t._v("RUN_OBSERVER")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("true")]),t._v(" "),e("td",[t._v("If true, runs the Observer alongside the gateway to generate Network compliance reports")])]),t._v(" "),e("tr",[e("th",[t._v("OBSERVER_WALLET")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("undefined")]),t._v(" "),e("td",[t._v("The public wallet address of the wallet being used to sign report upload transactions for Observer")])]),t._v(" "),e("tr",[e("td",[t._v("CHUNKS_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/chunks"')]),t._v(" "),t._v("Sets the location for chunked data to be saved. If omitted, chunked data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("CONTIGUOUS_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/contiguous"')]),t._v(" "),t._v("Sets the location for contiguous data to be saved. If omitted, contiguous data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("HEADERS_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/headers"')]),t._v(" "),t._v("Sets the location for header data to be saved. If omitted, header data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("SQLITE_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/sqlite"')]),t._v(" "),t._v("Sets the location for sqlite indexed data to be saved. If omitted, sqlite data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("TEMP_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/tmp"')]),t._v(" "),t._v("Sets the location for temporary data to be saved. If omitted, temporary data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("LMDB_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/LMDB"')]),t._v(" "),t._v("Sets the location for LMDB data to be saved. If omitted, LMDB data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("th",[t._v("CHAIN_CACHE_TYPE")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('"redis"')]),t._v(" "),e("td",[t._v("Sets the method for caching chain data, defaults to redis if gateway is started with docker-compose, otherwise defaults to LMDB")])]),t._v(" "),e("tr",[e("th",[t._v("REDIS_CACHE_URL")]),t._v(" "),e("td",[t._v("String (URL)")]),t._v(" "),e("td",[t._v('"redis://localhost:6379"')]),t._v(" "),e("td",[t._v("URL of Redis database to be used for caching")])]),t._v(" "),e("tr",[e("th",[t._v("REDIS_CACHE_TTL_SECONDS")]),t._v(" "),e("td",[t._v("Number")]),t._v(" "),e("td",[t._v("28800")]),t._v(" "),e("td",[t._v("TTL value for Redis cache, defaults to 8 hours (28800 seconds)")])]),t._v(" "),e("tr",[e("th",[t._v("ENABLE_FS_HEADER_CACHE_CLEANUP")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("false")]),t._v(" "),e("td",[t._v("If true, periodically deletes cached header data")])]),t._v(" "),e("tr",[e("th",[t._v("NODE_JS_MAX_OLD_SPACE_SIZE")]),t._v(" "),e("td",[t._v("Number")]),t._v(" "),e("td",[t._v("system default")]),t._v(" "),e("td",[t._v("Sets the memory limit, in Megabytes, for NodeJs. Default value depends on hardware")])]),t._v(" "),e("tr",[e("th",[t._v("SUBMIT_CONTRACT_INTERACTIONS")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("true")]),t._v(" "),e("td",[t._v("If true, Observer will submit its generated reports to the ar.io Network. If false, reports will be generated but not submitted")])])])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{329:function(t,e,_){"use strict";_.r(e);var v=_(10),a=Object(v.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"environmental-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#environmental-variables"}},[t._v("#")]),t._v(" Environmental Variables")]),t._v(" "),e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[t._v("#")]),t._v(" Overview")]),t._v(" "),e("p",[t._v("The AR.IO Gateway allows configuration customization through environmental variables. These variables dictate the gateway's behavior, from block synchronization settings to log formatting. Detailed below is a table enumerating all available environmental variables, their respective types, default values, and a brief description. Note that certain variables, such as "),e("code",[t._v("SANDBOX_PROTOCOL")]),t._v(", rely on others (e.g., "),e("code",[t._v("ARNS_ROOT_HOST")]),t._v(") to function effectively. Ensure proper understanding of these dependencies when configuring.")]),t._v(" "),e("h2",{attrs:{id:"variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#variables"}},[t._v("#")]),t._v(" Variables")]),t._v(" "),e("div",{staticStyle:{"text-align":"center"}},[e("table",{staticClass:"inline-table",attrs:{id:"gateway-table"}},[e("tr",[e("th",[t._v("ENV Name")]),t._v(" "),e("th",[t._v("Type")]),t._v(" "),e("th",[t._v("Default Value")]),t._v(" "),e("th",[t._v("Description")])]),t._v(" "),e("tr",[e("th",[t._v("START_HEIGHT")]),t._v(" "),e("td",[t._v('Number or "Infinity"')]),t._v(" "),e("td",[t._v("0")]),t._v(" "),e("td",[t._v("Starting block height for node synchronization (0 = start from genesis block)")])]),t._v(" "),e("tr",[e("th",[t._v("STOP_HEIGHT")]),t._v(" "),e("td",[t._v('Number or "Infinity"')]),t._v(" "),e("td",[t._v('"Infinity"')]),t._v(" "),e("td",[t._v("Stop block height for node synchronization (Infinity = keep syncing until stopped)")])]),t._v(" "),e("tr",[e("th",[t._v("TRUSTED_NODE_URL")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('"https://arweave.net"')]),t._v(" "),e("td",[t._v("Arweave node to use for fetching data")])]),t._v(" "),e("tr",[e("th",[t._v("TRUSTED_GATEWAY_URL")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('"https://arweave.net"')]),t._v(" "),e("td",[t._v("Arweave node to use for proxying reqeusts")])]),t._v(" "),e("tr",[e("th",[t._v("TRUSTED_ARNS_GATEWAY_URL")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("https://NAME.arweave.dev")]),t._v(" "),e("td",[t._v("ArNS gateway")])]),t._v(" "),e("tr",[e("th",[t._v("INSTANCE_ID")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('""')]),t._v(" "),e("td",[t._v('Adds an "INSTANCE_ID" field to output logs')])]),t._v(" "),e("tr",[e("th",[t._v("LOG_FORMAT")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('"simple"')]),t._v(" "),e("td",[t._v('Sets the format of output logs, accepts "simple" and "json"')])]),t._v(" "),e("tr",[e("th",[t._v("SKIP_CACHE")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("false")]),t._v(" "),e("td",[t._v("If true, skips the local cache and always fetches headers from the node")])]),t._v(" "),e("tr",[e("th",[t._v("PORT")]),t._v(" "),e("td",[t._v("Number")]),t._v(" "),e("td",[t._v("4000")]),t._v(" "),e("td",[t._v("AR.IO node exposed port number")])]),t._v(" "),e("tr",[e("th",[t._v("SIMULATED_REQUEST_FAILURE_RATE")]),t._v(" "),e("td",[t._v("Number")]),t._v(" "),e("td",[t._v("0")]),t._v(" "),e("td",[t._v("Number from 0 to 1, representing the probability of a request failing")])]),t._v(" "),e("tr",[e("th",[t._v("AR_IO_WALLET")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('""')]),t._v(" "),e("td",[t._v("Arweave wallet address used for staking and rewards")])]),t._v(" "),e("tr",[e("th",[t._v("ADMIN_API_KEY")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("Generated")]),t._v(" "),e("td",[t._v("API key used for admin API requests (if not set, it is generated and logged into the console)")])]),t._v(" "),e("tr",[e("th",[t._v("BACKFILL_BUNDLE_RECORDS")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("false")]),t._v(" "),e("td",[t._v("If true, AR.IO node will start indexing missing bundles")])]),t._v(" "),e("tr",[e("th",[t._v("FILTER_CHANGE_REPROCESS")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("false")]),t._v(" "),e("td",[t._v("If true, all indexed bundles will be reprocessed with the new filters (you can use this when you change the filters)")])]),t._v(" "),e("tr",[e("th",[t._v("ANS104_UNBUNDLE_FILTER")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('{"never": true}')]),t._v(" "),e("td",[t._v("Only bundles compliant with this filter will be unbundled")])]),t._v(" "),e("tr",[e("th",[t._v("ANS104_INDEX_FILTER")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('{"never": true}')]),t._v(" "),e("td",[t._v("Only bundles compliant with this filter will be indexed")])]),t._v(" "),e("tr",[e("th",[t._v("ARNS_ROOT_HOST")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("undefined")]),t._v(" "),e("td",[t._v("Domain name for ArNS host")])]),t._v(" "),e("tr",[e("th",[t._v("SANDBOX_PROTOCOL")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("undefined")]),t._v(" "),e("td",[t._v('Protocol setting in process of creating sandbox domains in ArNS (ARNS_ROOT_HOST needs to be set for this env to have any effect) accepts "http" or "https"')])]),t._v(" "),e("tr",[e("th",[t._v("START_WRITERS")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("true")]),t._v(" "),e("td",[t._v("If true, start indexing blocks, tx, ANS104 bundles")])]),t._v(" "),e("tr",[e("th",[t._v("RUN_OBSERVER")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("true")]),t._v(" "),e("td",[t._v("If true, runs the Observer alongside the gateway to generate Network compliance reports")])]),t._v(" "),e("tr",[e("th",[t._v("OBSERVER_WALLET")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v("undefined")]),t._v(" "),e("td",[t._v("The public wallet address of the wallet being used to sign report upload transactions for Observer")])]),t._v(" "),e("tr",[e("td",[t._v("CHUNKS_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/chunks"')]),t._v(" "),t._v("Sets the location for chunked data to be saved. If omitted, chunked data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("CONTIGUOUS_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/contiguous"')]),t._v(" "),t._v("Sets the location for contiguous data to be saved. If omitted, contiguous data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("HEADERS_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/headers"')]),t._v(" "),t._v("Sets the location for header data to be saved. If omitted, header data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("SQLITE_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/sqlite"')]),t._v(" "),t._v("Sets the location for sqlite indexed data to be saved. If omitted, sqlite data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("TEMP_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/tmp"')]),t._v(" "),t._v("Sets the location for temporary data to be saved. If omitted, temporary data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("td",[t._v("LMDB_DATA_PATH")]),t._v(" "),e("td",[t._v("string")]),t._v(" "),e("td",[t._v('"data/LMDB"')]),t._v(" "),t._v("Sets the location for LMDB data to be saved. If omitted, LMDB data will be stored in the `data` directory")]),t._v(" "),e("tr",[e("th",[t._v("CHAIN_CACHE_TYPE")]),t._v(" "),e("td",[t._v("String")]),t._v(" "),e("td",[t._v('"redis"')]),t._v(" "),e("td",[t._v("Sets the method for caching chain data, defaults to redis if gateway is started with docker-compose, otherwise defaults to LMDB")])]),t._v(" "),e("tr",[e("th",[t._v("REDIS_CACHE_URL")]),t._v(" "),e("td",[t._v("String (URL)")]),t._v(" "),e("td",[t._v('"redis://localhost:6379"')]),t._v(" "),e("td",[t._v("URL of Redis database to be used for caching")])]),t._v(" "),e("tr",[e("th",[t._v("REDIS_CACHE_TTL_SECONDS")]),t._v(" "),e("td",[t._v("Number")]),t._v(" "),e("td",[t._v("28800")]),t._v(" "),e("td",[t._v("TTL value for Redis cache, defaults to 8 hours (28800 seconds)")])]),t._v(" "),e("tr",[e("th",[t._v("ENABLE_FS_HEADER_CACHE_CLEANUP")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("false")]),t._v(" "),e("td",[t._v("If true, periodically deletes cached header data")])]),t._v(" "),e("tr",[e("th",[t._v("NODE_JS_MAX_OLD_SPACE_SIZE")]),t._v(" "),e("td",[t._v("Number")]),t._v(" "),e("td",[t._v("system default")]),t._v(" "),e("td",[t._v("Sets the memory limit, in Megabytes, for NodeJs. Default value depends on hardware")])]),t._v(" "),e("tr",[e("th",[t._v("SUBMIT_CONTRACT_INTERACTIONS")]),t._v(" "),e("td",[t._v("Boolean")]),t._v(" "),e("td",[t._v("true")]),t._v(" "),e("td",[t._v("If true, Observer will submit its generated reports to the ar.io Network. If false, reports will be generated but not submitted")])])])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/39.3acc4b47.js b/assets/js/39.e1847624.js similarity index 99% rename from assets/js/39.3acc4b47.js rename to assets/js/39.e1847624.js index f56fd031..2bb503c0 100644 --- a/assets/js/39.3acc4b47.js +++ b/assets/js/39.e1847624.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{329:function(e,t,a){"use strict";a.r(t);var s=a(10),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"linux-installation-instructions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#linux-installation-instructions"}},[e._v("#")]),e._v(" Linux Installation Instructions")]),e._v(" "),t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),t("p",[e._v("The following instructions will guide you through the process of installing the AR.IO node on a Linux machine, specifically Ubuntu 22.04.3 desktop on a home computer. Actual steps may differ slightly on different versions or distributions. This guide will cover how to set up your node, point a domain name to your home network, and create an nginx server for routing traffic to your node. No prior coding experience is required.")]),e._v(" "),t("h2",{attrs:{id:"system-requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#system-requirements"}},[e._v("#")]),e._v(" System Requirements")]),e._v(" "),t("p",[e._v("Please note, The AR.IO Node software is still in development and testing, all system requirements are subject to change.")]),e._v(" "),t("p",[e._v("External storage devices should be formatted as ext4.")]),e._v(" "),t("h3",{attrs:{id:"minimum-requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#minimum-requirements"}},[e._v("#")]),e._v(" Minimum requirements")]),e._v(" "),t("p",[e._v("The hardware specifications listed below represent the minimum system requirements at which the AR.IO Node has been tested. While your Node may still operate on systems with lesser specifications, please note that AR.IO cannot guarantee performance or functionality under those conditions. Use below-minimum hardware at your own risk.")]),e._v(" "),t("ul",[t("li",[e._v("4 core CPU")]),e._v(" "),t("li",[e._v("4 GB Ram")]),e._v(" "),t("li",[e._v("500 GB storage (SSD recommended)")]),e._v(" "),t("li",[e._v("Stable 50 Mbps internet connection")])]),e._v(" "),t("h3",{attrs:{id:"recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recommended"}},[e._v("#")]),e._v(" Recommended")]),e._v(" "),t("ul",[t("li",[e._v("12 core CPU")]),e._v(" "),t("li",[e._v("32 GB Ram")]),e._v(" "),t("li",[e._v("2 TB SSD storage")]),e._v(" "),t("li",[e._v("Stable 1 Gbps internet connection")])]),e._v(" "),t("h2",{attrs:{id:"install-packages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-packages"}},[e._v("#")]),e._v(" Install Packages")]),e._v(" "),t("p",[e._v("If you would like to quickly install all required and suggested packages, you can run the following 2 commands in your terminal, and skip to "),t("a",{attrs:{href:"#install-the-node"}},[e._v("installing the Node")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('sudo apt update -y && sudo apt upgrade -y && sudo apt install -y curl openssh-server docker-compose git certbot nginx sqlite3 build-essential && sudo systemctl enable ssh && curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && sudo apt-get update -y && sudo apt-get install -y yarn && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash && source ~/.bashrc && sudo ufw allow 22 80 443 && sudo ufw enable\n')])])]),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("nvm install 18.8.0 && nvm use 18.8.0\n")])])]),t("h3",{attrs:{id:"required-packages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#required-packages"}},[e._v("#")]),e._v(" Required packages")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Update your software:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt update\nsudo apt upgrade\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Enable your firewall and open necessary ports:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo ufw enable\n\n# Optional: If using SSH, allow port 22\nsudo ufw allow 22\n\n# Allow ports 80 and 443 for HTTP and HTTPS\nsudo ufw allow 80\nsudo ufw allow 443\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install nginx:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install nginx -y\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install git:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install git -y\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install Docker:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install docker-compose -y\n")])])]),t("ul",[t("li",[e._v("Test Docker installation:"),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo docker run hello-world\n")])])])])])]),e._v(" "),t("li",[t("p",[e._v("Install Certbot:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install certbot -y\n")])])])])]),e._v(" "),t("h3",{attrs:{id:"suggested-packages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#suggested-packages"}},[e._v("#")]),e._v(" Suggested packages")]),e._v(" "),t("p",[e._v("These packages are not required to run a node in its basic form. However, they will become necessary for more advanced usage or customization.")]),e._v(" "),t("ol",{attrs:{start:"7"}},[t("li",[t("p",[e._v("Install ssh (optional, for remote access to your Linux machine):")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install openssh-server -y\nsudo systemctl enable ssh\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install Yarn:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -\n\necho "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list\n\nsudo apt-get update -y\n\nsudo apt-get install yarn -y\n')])])])]),e._v(" "),t("li",[t("p",[e._v("Install NVM (Node Version Manager):")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash\nsource ~/.bashrc\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install Node.js:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("nvm install 18.8.0\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install build tools")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install build-essential\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install SQLite:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install sqlite3 -y\n")])])])])]),e._v(" "),t("h2",{attrs:{id:"install-the-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-the-node"}},[e._v("#")]),e._v(" Install the Node")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Navigate to the desired installation location:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("NOTE")]),e._v(": Your database of Arweave Transaction Headers will be created in the project directory, not Docker. So, if you are using an external hard drive to turn an old machine into a node, install the node directly to that external drive.")])])]),e._v(" "),t("li",[t("p",[e._v("Clone the ar-io-node repository and navigate into it:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("git clone -b main https://github.com/ar-io/ar-io-node\ncd ar-io-node\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Create an environmental variables file:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("nano .env\n")])])]),t("p",[e._v("Paste the following content into the new file, replacing with the domain address you are using to access the node, and with the public address of your Arweave wallet, save, and exit:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("\nGRAPHQL_HOST=arweave.net\nGRAPHQL_PORT=443\nSTART_HEIGHT=0\nRUN_OBSERVER=true\nARNS_ROOT_HOST=\nAR_IO_WALLET=\nOBSERVER_WALLET=\n")])])]),t("ul",[t("li",[e._v("The GRAPHQL values set the proxy for GQL queries to arweave.net, You may use any available gateway that supports GQL queries. If omitted, your node can support GQL queries on locally indexed transactions, but only L1 transactions are indexed by default.")]),e._v(" "),t("li",[t("code",[e._v("START_HEIGHT")]),e._v(" is an optional line. It sets the block number where your node will start downloading and indexing transactions headers. Omitting this line will begin indexing at block 0.")]),e._v(" "),t("li",[t("code",[e._v("RUN_OBSERVER")]),e._v(" turns on the Observer to generate Network Compliance Reports. This is required for full participation in the AR.IO Network. Set to "),t("code",[e._v("false")]),e._v(" to run your gateway without Observer.")]),e._v(" "),t("li",[t("code",[e._v("ARNS_ROOT_HOST")]),e._v(" sets the starting point for resolving ARNS names, which are accessed as a subdomain of a gateway. It should be set to the url you are pointing to your node, excluding any protocol prefix. For example, use "),t("code",[e._v("node-ar.io")]),e._v(" and not "),t("code",[e._v("https://node-ar.io")]),e._v(". If you are using a subdomain to access your node and do not set this value, the node will not understand incoming requests.")]),e._v(" "),t("li",[t("code",[e._v("AR_IO_WALLET")]),e._v(" is optional, and sets the wallet you want associated with your Gateway. An associated wallet is required to join the AR.IO network.")]),e._v(" "),t("li",[t("code",[e._v("OBSERVER_WALLET")]),e._v(" is the public address of the wallet used to sign Observer transactions. This is required for Observer to run, but may be omitted if you are running a gateway outside of the AR.IO network and do not plan to run Observer. You will need to supply the keyfile to this wallet in the next step.")])]),e._v(" "),t("p",[e._v("Advanced configuration options can be found at "),t("a",{attrs:{href:"https://docs.ar.io/gateways/ar-io-node/advanced-config.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("docs.ar.io"),t("OutboundLink")],1)])]),e._v(" "),t("li",[t("p",[e._v("Supply Your Observer Wallet Keyfile:")]),e._v(" "),t("p",[e._v("If you are running Observer, you need to provide a wallet keyfile in order to sign report upload transactions. The keyfile must be saved in the "),t("code",[e._v("wallets")]),e._v(" directory in the root of the repository. Name the file "),t("code",[e._v(".json")]),e._v(', replacing "" with the public address of the wallet. This should match your '),t("code",[e._v("OBSERVER_WALLET")]),e._v(" environmental variable.")]),e._v(" "),t("p",[e._v("Learn more about creating Arweave wallets and obtaining keyfiles "),t("a",{attrs:{href:"https://ar.io/wallet/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)])]),e._v(" "),t("li",[t("p",[e._v("Start the Docker container:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo docker-compose up -d\n")])])]),t("ul",[t("li",[e._v("Explanation of flags:\n"),t("ul",[t("li",[t("code",[e._v("up")]),e._v(": Start the Docker containers.")]),e._v(" "),t("li",[t("code",[e._v("-d")]),e._v(": Run the containers as background processes (detached mode).")])])])]),e._v(" "),t("p",[t("strong",[e._v("NOTE")]),e._v(": Effective with Release #3, it is no longer required to include the "),t("code",[e._v("--build")]),e._v(" flag when starting your gateway. Docker will automatically build using the image specified in the "),t("code",[e._v("docker-commpose.yaml")]),e._v(" file.")])])]),e._v(" "),t("p",[e._v("To ensure your node is running correctly, follow the next two steps.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Check the logs for errors:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo docker-compose logs -f --tail=0\n")])])]),t("ul",[t("li",[e._v("Explanation of flags:\n"),t("ul",[t("li",[t("code",[e._v("-f")]),e._v(": Follow the logs in real time.")]),e._v(" "),t("li",[t("code",[e._v("--tail=0")]),e._v(": Ignore all logs from before running the command.")])])])])]),e._v(" "),t("li",[t("p",[e._v("Make a request to your node using localhost:\nOpen your browser or use the "),t("code",[e._v("wget")]),e._v(" command in the terminal to navigate to http://localhost:3000/3lyxgbgEvqNSvJrTX2J7CfRychUD5KClFhhVLyTPNCQ.\nIf you can see the image, your node is operating correctly.")])])]),e._v(" "),t("h2",{attrs:{id:"set-up-networking"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-up-networking"}},[e._v("#")]),e._v(" Set up Networking")]),e._v(" "),t("p",[e._v("The following guide assumes you are running your node on a local home computer.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Register a Domain Name:\nChoose a domain registrar (e.g., "),t("a",{attrs:{href:"https://www.namecheap.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Namecheap"),t("OutboundLink")],1),e._v(") to register a domain name.")])]),e._v(" "),t("li",[t("p",[e._v("Point the Domain at Your Home Internet:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Obtain your public IP address by visiting https://www.whatsmyip.org/ or running:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("curl ifconfig.me\n")])])])]),e._v(" "),t("li",[t("p",[e._v('Create an A record with your registrar for your domain and wildcard subdomains, using your public IP address. For example, if your domain is "ar.io," create a record for "ar.io" and "*.ar.io."')])])])]),e._v(" "),t("li",[t("p",[e._v("Set up Port Forwarding:")]),e._v(" "),t("ul",[t("li",[e._v("Obtain the local IP address of the machine where the node is installed by running:"),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ip addr show | grep -w inet | awk '{print $2}' | awk -F'/' '{print $1}'\n")])])]),t("ul",[t("li",[e._v("If there are multiple lines of output, choose the one starting with 192 (usually).")])])]),e._v(" "),t("li",[e._v("Enter your router's IP address in the address bar of a browser (e.g., "),t("code",[e._v("192.168.0.1")]),e._v(").\n"),t("ul",[t("li",[e._v("If you're unsure of your router's IP address, consult your router's documentation or contact your Internet Service Provider (ISP).")])])]),e._v(" "),t("li",[e._v("Navigate to the port forwarding settings in your router configuration.\n"),t("ul",[t("li",[e._v("The exact steps may vary depending on your router model. Consult your router's documentation or support for detailed steps.")])])]),e._v(" "),t("li",[e._v("Set up port forwarding rules to forward incoming traffic on ports 80 (HTTP) and 443 (HTTPS) to the same ports on the machine running your node. You may also forward port 22 if you want to enable SSH access to your node from outside your home network.")])])]),e._v(" "),t("li",[t("p",[e._v("Create SSL (HTTPS) Certificates for Your Domain:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo certbot certonly --manual --preferred-challenges dns --email -d .com -d '*..com'\n")])])]),t("p",[e._v("Follow the instructions to create the required TXT records for your domain in your chosen registrar. Use a "),t("a",{attrs:{href:"https://dnschecker.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("DNS checker"),t("OutboundLink")],1),e._v(" to verify the propagation of each record. This can take some time.")]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT")]),e._v(": Wild card subdomain (*..com) cannot auto renew without obtaining an API key from your domain registrar. Not all registrars offer this. Certbot certificates expire every 90 days. Be sure to consult with your chosen registrar to see if they offer an API for this purpose, or run the above command again to renew your certificates. You will receive an email warning at the address you provided to remind you when it is time to renew.")])]),e._v(" "),t("li",[t("p",[e._v("Configure nginx:\nnginx is a free and open-source web server and reverse proxy server. It will handle incoming traffic, provide SSL certificates, and redirect the traffic to your node.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Open the default configuration file:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo nano /etc/nginx/sites-available/default\n")])])])]),e._v(" "),t("li",[t("p",[e._v('Replace the file\'s contents with the following configuration (replace "" when necessary):')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("# Force redirects from HTTP to HTTPS\nserver {\n listen 80;\n listen [::]:80;\n server_name .com *..com;\n\n location / {\n return 301 https://$host$request_uri;\n }\n}\n\n# Forward traffic to your node and provide SSL certificates\nserver {\n listen 443 ssl;\n listen [::]:443 ssl;\n server_name .com *..com;\n\n ssl_certificate /etc/letsencrypt/live/.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/.com/privkey.pem;\n\n location / {\n proxy_pass http://localhost:3000;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_http_version 1.1;\n }\n}\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Save and exit nano.")])]),e._v(" "),t("li",[t("p",[e._v("Test the configuration:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo nginx -t\n")])])])]),e._v(" "),t("li",[t("p",[e._v("If there are no errors, restart nginx:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo service nginx restart\n")])])])])])])]),e._v(" "),t("p",[e._v("Your node should now be running and connected to the internet. Test it by entering https:///3lyxgbgEvqNSvJrTX2J7CfRychUD5KClFhhVLyTPNCQ in your browser.")]),e._v(" "),t("p",[t("strong",[e._v("Note")]),e._v(": If you encounter any issues during the installation process, please seek assistance from the "),t("a",{attrs:{href:"https://discord.gg/7zUPfN4D6g",target:"_blank",rel:"noopener noreferrer"}},[e._v("AR.IO community"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{330:function(e,t,a){"use strict";a.r(t);var s=a(10),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"linux-installation-instructions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#linux-installation-instructions"}},[e._v("#")]),e._v(" Linux Installation Instructions")]),e._v(" "),t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),t("p",[e._v("The following instructions will guide you through the process of installing the AR.IO node on a Linux machine, specifically Ubuntu 22.04.3 desktop on a home computer. Actual steps may differ slightly on different versions or distributions. This guide will cover how to set up your node, point a domain name to your home network, and create an nginx server for routing traffic to your node. No prior coding experience is required.")]),e._v(" "),t("h2",{attrs:{id:"system-requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#system-requirements"}},[e._v("#")]),e._v(" System Requirements")]),e._v(" "),t("p",[e._v("Please note, The AR.IO Node software is still in development and testing, all system requirements are subject to change.")]),e._v(" "),t("p",[e._v("External storage devices should be formatted as ext4.")]),e._v(" "),t("h3",{attrs:{id:"minimum-requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#minimum-requirements"}},[e._v("#")]),e._v(" Minimum requirements")]),e._v(" "),t("p",[e._v("The hardware specifications listed below represent the minimum system requirements at which the AR.IO Node has been tested. While your Node may still operate on systems with lesser specifications, please note that AR.IO cannot guarantee performance or functionality under those conditions. Use below-minimum hardware at your own risk.")]),e._v(" "),t("ul",[t("li",[e._v("4 core CPU")]),e._v(" "),t("li",[e._v("4 GB Ram")]),e._v(" "),t("li",[e._v("500 GB storage (SSD recommended)")]),e._v(" "),t("li",[e._v("Stable 50 Mbps internet connection")])]),e._v(" "),t("h3",{attrs:{id:"recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recommended"}},[e._v("#")]),e._v(" Recommended")]),e._v(" "),t("ul",[t("li",[e._v("12 core CPU")]),e._v(" "),t("li",[e._v("32 GB Ram")]),e._v(" "),t("li",[e._v("2 TB SSD storage")]),e._v(" "),t("li",[e._v("Stable 1 Gbps internet connection")])]),e._v(" "),t("h2",{attrs:{id:"install-packages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-packages"}},[e._v("#")]),e._v(" Install Packages")]),e._v(" "),t("p",[e._v("If you would like to quickly install all required and suggested packages, you can run the following 2 commands in your terminal, and skip to "),t("a",{attrs:{href:"#install-the-node"}},[e._v("installing the Node")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('sudo apt update -y && sudo apt upgrade -y && sudo apt install -y curl openssh-server docker-compose git certbot nginx sqlite3 build-essential && sudo systemctl enable ssh && curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && sudo apt-get update -y && sudo apt-get install -y yarn && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash && source ~/.bashrc && sudo ufw allow 22 80 443 && sudo ufw enable\n')])])]),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("nvm install 18.8.0 && nvm use 18.8.0\n")])])]),t("h3",{attrs:{id:"required-packages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#required-packages"}},[e._v("#")]),e._v(" Required packages")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Update your software:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt update\nsudo apt upgrade\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Enable your firewall and open necessary ports:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo ufw enable\n\n# Optional: If using SSH, allow port 22\nsudo ufw allow 22\n\n# Allow ports 80 and 443 for HTTP and HTTPS\nsudo ufw allow 80\nsudo ufw allow 443\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install nginx:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install nginx -y\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install git:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install git -y\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install Docker:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install docker-compose -y\n")])])]),t("ul",[t("li",[e._v("Test Docker installation:"),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo docker run hello-world\n")])])])])])]),e._v(" "),t("li",[t("p",[e._v("Install Certbot:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install certbot -y\n")])])])])]),e._v(" "),t("h3",{attrs:{id:"suggested-packages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#suggested-packages"}},[e._v("#")]),e._v(" Suggested packages")]),e._v(" "),t("p",[e._v("These packages are not required to run a node in its basic form. However, they will become necessary for more advanced usage or customization.")]),e._v(" "),t("ol",{attrs:{start:"7"}},[t("li",[t("p",[e._v("Install ssh (optional, for remote access to your Linux machine):")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install openssh-server -y\nsudo systemctl enable ssh\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install Yarn:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -\n\necho "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list\n\nsudo apt-get update -y\n\nsudo apt-get install yarn -y\n')])])])]),e._v(" "),t("li",[t("p",[e._v("Install NVM (Node Version Manager):")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash\nsource ~/.bashrc\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install Node.js:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("nvm install 18.8.0\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install build tools")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install build-essential\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Install SQLite:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo apt install sqlite3 -y\n")])])])])]),e._v(" "),t("h2",{attrs:{id:"install-the-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-the-node"}},[e._v("#")]),e._v(" Install the Node")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Navigate to the desired installation location:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("NOTE")]),e._v(": Your database of Arweave Transaction Headers will be created in the project directory, not Docker. So, if you are using an external hard drive to turn an old machine into a node, install the node directly to that external drive.")])])]),e._v(" "),t("li",[t("p",[e._v("Clone the ar-io-node repository and navigate into it:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("git clone -b main https://github.com/ar-io/ar-io-node\ncd ar-io-node\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Create an environmental variables file:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("nano .env\n")])])]),t("p",[e._v("Paste the following content into the new file, replacing with the domain address you are using to access the node, and with the public address of your Arweave wallet, save, and exit:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("\nGRAPHQL_HOST=arweave.net\nGRAPHQL_PORT=443\nSTART_HEIGHT=0\nRUN_OBSERVER=true\nARNS_ROOT_HOST=\nAR_IO_WALLET=\nOBSERVER_WALLET=\n")])])]),t("ul",[t("li",[e._v("The GRAPHQL values set the proxy for GQL queries to arweave.net, You may use any available gateway that supports GQL queries. If omitted, your node can support GQL queries on locally indexed transactions, but only L1 transactions are indexed by default.")]),e._v(" "),t("li",[t("code",[e._v("START_HEIGHT")]),e._v(" is an optional line. It sets the block number where your node will start downloading and indexing transactions headers. Omitting this line will begin indexing at block 0.")]),e._v(" "),t("li",[t("code",[e._v("RUN_OBSERVER")]),e._v(" turns on the Observer to generate Network Compliance Reports. This is required for full participation in the AR.IO Network. Set to "),t("code",[e._v("false")]),e._v(" to run your gateway without Observer.")]),e._v(" "),t("li",[t("code",[e._v("ARNS_ROOT_HOST")]),e._v(" sets the starting point for resolving ARNS names, which are accessed as a subdomain of a gateway. It should be set to the url you are pointing to your node, excluding any protocol prefix. For example, use "),t("code",[e._v("node-ar.io")]),e._v(" and not "),t("code",[e._v("https://node-ar.io")]),e._v(". If you are using a subdomain to access your node and do not set this value, the node will not understand incoming requests.")]),e._v(" "),t("li",[t("code",[e._v("AR_IO_WALLET")]),e._v(" is optional, and sets the wallet you want associated with your Gateway. An associated wallet is required to join the AR.IO network.")]),e._v(" "),t("li",[t("code",[e._v("OBSERVER_WALLET")]),e._v(" is the public address of the wallet used to sign Observer transactions. This is required for Observer to run, but may be omitted if you are running a gateway outside of the AR.IO network and do not plan to run Observer. You will need to supply the keyfile to this wallet in the next step.")])]),e._v(" "),t("p",[e._v("Advanced configuration options can be found at "),t("a",{attrs:{href:"https://docs.ar.io/gateways/ar-io-node/advanced-config.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("docs.ar.io"),t("OutboundLink")],1)])]),e._v(" "),t("li",[t("p",[e._v("Supply Your Observer Wallet Keyfile:")]),e._v(" "),t("p",[e._v("If you are running Observer, you need to provide a wallet keyfile in order to sign report upload transactions. The keyfile must be saved in the "),t("code",[e._v("wallets")]),e._v(" directory in the root of the repository. Name the file "),t("code",[e._v(".json")]),e._v(', replacing "" with the public address of the wallet. This should match your '),t("code",[e._v("OBSERVER_WALLET")]),e._v(" environmental variable.")]),e._v(" "),t("p",[e._v("Learn more about creating Arweave wallets and obtaining keyfiles "),t("a",{attrs:{href:"https://ar.io/wallet/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)])]),e._v(" "),t("li",[t("p",[e._v("Start the Docker container:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo docker-compose up -d\n")])])]),t("ul",[t("li",[e._v("Explanation of flags:\n"),t("ul",[t("li",[t("code",[e._v("up")]),e._v(": Start the Docker containers.")]),e._v(" "),t("li",[t("code",[e._v("-d")]),e._v(": Run the containers as background processes (detached mode).")])])])]),e._v(" "),t("p",[t("strong",[e._v("NOTE")]),e._v(": Effective with Release #3, it is no longer required to include the "),t("code",[e._v("--build")]),e._v(" flag when starting your gateway. Docker will automatically build using the image specified in the "),t("code",[e._v("docker-commpose.yaml")]),e._v(" file.")])])]),e._v(" "),t("p",[e._v("To ensure your node is running correctly, follow the next two steps.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Check the logs for errors:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo docker-compose logs -f --tail=0\n")])])]),t("ul",[t("li",[e._v("Explanation of flags:\n"),t("ul",[t("li",[t("code",[e._v("-f")]),e._v(": Follow the logs in real time.")]),e._v(" "),t("li",[t("code",[e._v("--tail=0")]),e._v(": Ignore all logs from before running the command.")])])])])]),e._v(" "),t("li",[t("p",[e._v("Make a request to your node using localhost:\nOpen your browser or use the "),t("code",[e._v("wget")]),e._v(" command in the terminal to navigate to http://localhost:3000/3lyxgbgEvqNSvJrTX2J7CfRychUD5KClFhhVLyTPNCQ.\nIf you can see the image, your node is operating correctly.")])])]),e._v(" "),t("h2",{attrs:{id:"set-up-networking"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-up-networking"}},[e._v("#")]),e._v(" Set up Networking")]),e._v(" "),t("p",[e._v("The following guide assumes you are running your node on a local home computer.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Register a Domain Name:\nChoose a domain registrar (e.g., "),t("a",{attrs:{href:"https://www.namecheap.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Namecheap"),t("OutboundLink")],1),e._v(") to register a domain name.")])]),e._v(" "),t("li",[t("p",[e._v("Point the Domain at Your Home Internet:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Obtain your public IP address by visiting https://www.whatsmyip.org/ or running:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("curl ifconfig.me\n")])])])]),e._v(" "),t("li",[t("p",[e._v('Create an A record with your registrar for your domain and wildcard subdomains, using your public IP address. For example, if your domain is "ar.io," create a record for "ar.io" and "*.ar.io."')])])])]),e._v(" "),t("li",[t("p",[e._v("Set up Port Forwarding:")]),e._v(" "),t("ul",[t("li",[e._v("Obtain the local IP address of the machine where the node is installed by running:"),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("ip addr show | grep -w inet | awk '{print $2}' | awk -F'/' '{print $1}'\n")])])]),t("ul",[t("li",[e._v("If there are multiple lines of output, choose the one starting with 192 (usually).")])])]),e._v(" "),t("li",[e._v("Enter your router's IP address in the address bar of a browser (e.g., "),t("code",[e._v("192.168.0.1")]),e._v(").\n"),t("ul",[t("li",[e._v("If you're unsure of your router's IP address, consult your router's documentation or contact your Internet Service Provider (ISP).")])])]),e._v(" "),t("li",[e._v("Navigate to the port forwarding settings in your router configuration.\n"),t("ul",[t("li",[e._v("The exact steps may vary depending on your router model. Consult your router's documentation or support for detailed steps.")])])]),e._v(" "),t("li",[e._v("Set up port forwarding rules to forward incoming traffic on ports 80 (HTTP) and 443 (HTTPS) to the same ports on the machine running your node. You may also forward port 22 if you want to enable SSH access to your node from outside your home network.")])])]),e._v(" "),t("li",[t("p",[e._v("Create SSL (HTTPS) Certificates for Your Domain:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo certbot certonly --manual --preferred-challenges dns --email -d .com -d '*..com'\n")])])]),t("p",[e._v("Follow the instructions to create the required TXT records for your domain in your chosen registrar. Use a "),t("a",{attrs:{href:"https://dnschecker.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("DNS checker"),t("OutboundLink")],1),e._v(" to verify the propagation of each record. This can take some time.")]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT")]),e._v(": Wild card subdomain (*..com) cannot auto renew without obtaining an API key from your domain registrar. Not all registrars offer this. Certbot certificates expire every 90 days. Be sure to consult with your chosen registrar to see if they offer an API for this purpose, or run the above command again to renew your certificates. You will receive an email warning at the address you provided to remind you when it is time to renew.")])]),e._v(" "),t("li",[t("p",[e._v("Configure nginx:\nnginx is a free and open-source web server and reverse proxy server. It will handle incoming traffic, provide SSL certificates, and redirect the traffic to your node.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Open the default configuration file:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo nano /etc/nginx/sites-available/default\n")])])])]),e._v(" "),t("li",[t("p",[e._v('Replace the file\'s contents with the following configuration (replace "" when necessary):')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("# Force redirects from HTTP to HTTPS\nserver {\n listen 80;\n listen [::]:80;\n server_name .com *..com;\n\n location / {\n return 301 https://$host$request_uri;\n }\n}\n\n# Forward traffic to your node and provide SSL certificates\nserver {\n listen 443 ssl;\n listen [::]:443 ssl;\n server_name .com *..com;\n\n ssl_certificate /etc/letsencrypt/live/.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/.com/privkey.pem;\n\n location / {\n proxy_pass http://localhost:3000;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_http_version 1.1;\n }\n}\n")])])])]),e._v(" "),t("li",[t("p",[e._v("Save and exit nano.")])]),e._v(" "),t("li",[t("p",[e._v("Test the configuration:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo nginx -t\n")])])])]),e._v(" "),t("li",[t("p",[e._v("If there are no errors, restart nginx:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("sudo service nginx restart\n")])])])])])])]),e._v(" "),t("p",[e._v("Your node should now be running and connected to the internet. Test it by entering https:///3lyxgbgEvqNSvJrTX2J7CfRychUD5KClFhhVLyTPNCQ in your browser.")]),e._v(" "),t("p",[t("strong",[e._v("Note")]),e._v(": If you encounter any issues during the installation process, please seek assistance from the "),t("a",{attrs:{href:"https://discord.gg/7zUPfN4D6g",target:"_blank",rel:"noopener noreferrer"}},[e._v("AR.IO community"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/43.0be352fc.js b/assets/js/43.4d636e0c.js similarity index 91% rename from assets/js/43.0be352fc.js rename to assets/js/43.4d636e0c.js index e2b4fa74..28535d67 100644 --- a/assets/js/43.0be352fc.js +++ b/assets/js/43.4d636e0c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{333:function(e,t,s){"use strict";s.r(t);var n=s(10),o=Object(n.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[this._v("#")]),this._v(" Overview")]),this._v(" "),e("p",[this._v("Easy setup guides have been designed to get your AR.IO Gateway up and running correctly and quickly. These guides only go through some basic configurations, while more advanced options can be found "),e("RouterLink",{attrs:{to:"/gateways/ar-io-node/advanced-config.html"}},[this._v("here")])],1)])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{334:function(e,t,s){"use strict";s.r(t);var n=s(10),o=Object(n.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("h1",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[this._v("#")]),this._v(" Overview")]),this._v(" "),e("p",[this._v("Easy setup guides have been designed to get your AR.IO Gateway up and running correctly and quickly. These guides only go through some basic configurations, while more advanced options can be found "),e("RouterLink",{attrs:{to:"/gateways/ar-io-node/advanced-config.html"}},[this._v("here")])],1)])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/44.da147a1d.js b/assets/js/44.94edac0f.js similarity index 99% rename from assets/js/44.da147a1d.js rename to assets/js/44.94edac0f.js index be1670f1..fe3b440c 100644 --- a/assets/js/44.da147a1d.js +++ b/assets/js/44.94edac0f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{334:function(e,r,t){"use strict";t.r(r);var a=t(10),o=Object(a.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"ar-io-release-notes"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#ar-io-release-notes"}},[e._v("#")]),e._v(" ar.io Release Notes")]),e._v(" "),r("h2",{attrs:{id:"overview"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),r("p",[e._v("Welcome to the documentation page for the ar.io gateway release notes. Here, you will find detailed information about each version of the ar.io gateway, including the enhancements, bug fixes, and any other changes introduced in every release. This page serves as a comprehensive resource to keep you informed about the latest developments and updates in the ar.io gateway. For those interested in exploring the source code, each release's code is readily accessible at our GitHub repository: ar.io gateway "),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/blob/main/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("change logs"),r("OutboundLink")],1),e._v(". Stay updated with the continuous improvements and advancements in the ar.io gateway by referring to this page for all release-related information.")]),e._v(" "),r("h2",{attrs:{id:"release-6-2024-01-29"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#release-6-2024-01-29"}},[e._v("#")]),e._v(" [Release 6] - 2024-01-29")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("Fixed")]),e._v(" "),r("ul",[r("li",[e._v("Update observer to improve reliability of contract state synchronization and evaluation.")])])])]),e._v(" "),r("h2",{attrs:{id:"release-5-2024-01-25"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#release-5-2024-01-25"}},[e._v("#")]),e._v(" [Release 5] - 2024-01-25")]),e._v(" "),r("ul",[r("li",[r("p",[r("strong",[e._v("Added")])]),e._v(" "),r("ul",[r("li",[e._v("Added transaction offset indexing to support future data retrieval capabilities.")]),e._v(" "),r("li",[e._v("Enabled IPv6 support in Envoy config.")]),e._v(" "),r("li",[e._v("Added ability to configure observer report generation interval via the "),r("code",[e._v("REPORT_GENERATION_INTERVAL_MS")]),e._v(" environmental variable. (Intended primarily for development and testing)")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Changed")])]),e._v(" "),r("ul",[r("li",[e._v("Updated observer to properly handle FQDN conflicts.")]),e._v(" "),r("li",[e._v("Renamed most "),r("code",[e._v("created_at")]),e._v(" columns to index to "),r("code",[e._v("indexed_at")]),e._v(" for consistency and clarity.")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Fixed")])]),e._v(" "),r("ul",[r("li",[e._v("Updated LMDB version to remove Buffer workaround and fix occasional block cache errors.")])])])]),e._v(" "),r("h2",{attrs:{id:"release-4-2024-01-11"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#release-4-2024-01-11"}},[e._v("#")]),e._v(" [Release 4] - 2024-01-11")]),e._v(" "),r("ul",[r("li",[r("p",[r("strong",[e._v("Added")])]),e._v(" "),r("ul",[r("li",[e._v("Added circuit breakers around data index access to reduce impact of DB access contention under heavy requests loads.")]),e._v(" "),r("li",[e._v("Added support for configuring data source priority via the ON_DEMAND_RETRIEVAL_ORDER environment variable.")]),e._v(" "),r("li",[e._v("Updated observer to a version that retrieves epoch start and duration from contract state.")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Changed")])]),e._v(" "),r("ul",[r("li",[e._v("Set the Redis max memory eviction policy to "),r("code",[e._v("allkeys-lru")]),e._v(".")]),e._v(" "),r("li",[e._v("Reduced default Redis max memory from 2GB to 256MB.")]),e._v(" "),r("li",[e._v("Improved predictability and performance of GraphQL queries.")]),e._v(" "),r("li",[e._v("Eliminated unbundling worker threads when filters are configured to skip indexing ANS-104 bundles.")]),e._v(" "),r("li",[e._v("Reduced the default number of ANS-104 worker threads from 2 to 1 when unbundling is enabled to conserve memory.")]),e._v(" "),r("li",[e._v("Increased nodejs max old space size to 8GB when ANS-104 workers > 1.")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Fixed")])]),e._v(" "),r("ul",[r("li",[e._v("Adjusted paths for chunks indexed by data root to include the full data root.")])])])]),e._v(" "),r("h2",{attrs:{id:"release-3-2023-12-05"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#release-3-2023-12-05"}},[e._v("#")]),e._v(" [Release 3] - 2023-12-05")]),e._v(" "),r("ul",[r("li",[r("p",[r("strong",[e._v("Added")])]),e._v(" "),r("ul",[r("li",[e._v("Support range requests ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/61",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 61"),r("OutboundLink")],1),e._v(", "),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/64",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 64"),r("OutboundLink")],1),e._v(")\n"),r("ul",[r("li",[e._v("Note: serving multiple ranges in a single request is not yet supported.")])])]),e._v(" "),r("li",[e._v("Release number in "),r("code",[e._v("/ar-io/info")]),e._v(" response.")]),e._v(" "),r("li",[e._v("Redis header cache implementation ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/62",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 62"),r("OutboundLink")],1),e._v(").\n"),r("ul",[r("li",[e._v("New default header cache (replaces old FS cache).")])])]),e._v(" "),r("li",[e._v("LMDB header cache implementation ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/60",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 60"),r("OutboundLink")],1),e._v(").\n"),r("ul",[r("li",[e._v("Intended for use in development only.")]),e._v(" "),r("li",[e._v("Enable by setting "),r("code",[e._v("CHAIN_CACHE_TYPE=lmdb")]),e._v(".")])])]),e._v(" "),r("li",[e._v("Filesystem header cache cleanup worker ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/68",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 68"),r("OutboundLink")],1),e._v(").\n"),r("ul",[r("li",[e._v("Enabled by default to cleanup old filesystem cache now that Redis is the new default.")])])]),e._v(" "),r("li",[e._v("Support for parallel ANS-104 unbundling ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/65",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 65"),r("OutboundLink")],1),e._v(").")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Changed")])]),e._v(" "),r("ul",[r("li",[e._v("Used pinned container images tags for releases.")]),e._v(" "),r("li",[e._v("Default to Redis header cache when running via docker-compose.")]),e._v(" "),r("li",[e._v("Default to LMDB header cache when running via "),r("code",[e._v("yarn start")]),e._v(".")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Fixed")])]),e._v(" "),r("ul",[r("li",[e._v("Correct GraphQL pagination for transactions with duplicate tags.")])])])])])}),[],!1,null,null,null);r.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{333:function(e,r,t){"use strict";t.r(r);var a=t(10),o=Object(a.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"ar-io-release-notes"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#ar-io-release-notes"}},[e._v("#")]),e._v(" ar.io Release Notes")]),e._v(" "),r("h2",{attrs:{id:"overview"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),r("p",[e._v("Welcome to the documentation page for the ar.io gateway release notes. Here, you will find detailed information about each version of the ar.io gateway, including the enhancements, bug fixes, and any other changes introduced in every release. This page serves as a comprehensive resource to keep you informed about the latest developments and updates in the ar.io gateway. For those interested in exploring the source code, each release's code is readily accessible at our GitHub repository: ar.io gateway "),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/blob/main/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("change logs"),r("OutboundLink")],1),e._v(". Stay updated with the continuous improvements and advancements in the ar.io gateway by referring to this page for all release-related information.")]),e._v(" "),r("h2",{attrs:{id:"release-6-2024-01-29"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#release-6-2024-01-29"}},[e._v("#")]),e._v(" [Release 6] - 2024-01-29")]),e._v(" "),r("ul",[r("li",[r("strong",[e._v("Fixed")]),e._v(" "),r("ul",[r("li",[e._v("Update observer to improve reliability of contract state synchronization and evaluation.")])])])]),e._v(" "),r("h2",{attrs:{id:"release-5-2024-01-25"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#release-5-2024-01-25"}},[e._v("#")]),e._v(" [Release 5] - 2024-01-25")]),e._v(" "),r("ul",[r("li",[r("p",[r("strong",[e._v("Added")])]),e._v(" "),r("ul",[r("li",[e._v("Added transaction offset indexing to support future data retrieval capabilities.")]),e._v(" "),r("li",[e._v("Enabled IPv6 support in Envoy config.")]),e._v(" "),r("li",[e._v("Added ability to configure observer report generation interval via the "),r("code",[e._v("REPORT_GENERATION_INTERVAL_MS")]),e._v(" environmental variable. (Intended primarily for development and testing)")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Changed")])]),e._v(" "),r("ul",[r("li",[e._v("Updated observer to properly handle FQDN conflicts.")]),e._v(" "),r("li",[e._v("Renamed most "),r("code",[e._v("created_at")]),e._v(" columns to index to "),r("code",[e._v("indexed_at")]),e._v(" for consistency and clarity.")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Fixed")])]),e._v(" "),r("ul",[r("li",[e._v("Updated LMDB version to remove Buffer workaround and fix occasional block cache errors.")])])])]),e._v(" "),r("h2",{attrs:{id:"release-4-2024-01-11"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#release-4-2024-01-11"}},[e._v("#")]),e._v(" [Release 4] - 2024-01-11")]),e._v(" "),r("ul",[r("li",[r("p",[r("strong",[e._v("Added")])]),e._v(" "),r("ul",[r("li",[e._v("Added circuit breakers around data index access to reduce impact of DB access contention under heavy requests loads.")]),e._v(" "),r("li",[e._v("Added support for configuring data source priority via the ON_DEMAND_RETRIEVAL_ORDER environment variable.")]),e._v(" "),r("li",[e._v("Updated observer to a version that retrieves epoch start and duration from contract state.")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Changed")])]),e._v(" "),r("ul",[r("li",[e._v("Set the Redis max memory eviction policy to "),r("code",[e._v("allkeys-lru")]),e._v(".")]),e._v(" "),r("li",[e._v("Reduced default Redis max memory from 2GB to 256MB.")]),e._v(" "),r("li",[e._v("Improved predictability and performance of GraphQL queries.")]),e._v(" "),r("li",[e._v("Eliminated unbundling worker threads when filters are configured to skip indexing ANS-104 bundles.")]),e._v(" "),r("li",[e._v("Reduced the default number of ANS-104 worker threads from 2 to 1 when unbundling is enabled to conserve memory.")]),e._v(" "),r("li",[e._v("Increased nodejs max old space size to 8GB when ANS-104 workers > 1.")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Fixed")])]),e._v(" "),r("ul",[r("li",[e._v("Adjusted paths for chunks indexed by data root to include the full data root.")])])])]),e._v(" "),r("h2",{attrs:{id:"release-3-2023-12-05"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#release-3-2023-12-05"}},[e._v("#")]),e._v(" [Release 3] - 2023-12-05")]),e._v(" "),r("ul",[r("li",[r("p",[r("strong",[e._v("Added")])]),e._v(" "),r("ul",[r("li",[e._v("Support range requests ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/61",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 61"),r("OutboundLink")],1),e._v(", "),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/64",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 64"),r("OutboundLink")],1),e._v(")\n"),r("ul",[r("li",[e._v("Note: serving multiple ranges in a single request is not yet supported.")])])]),e._v(" "),r("li",[e._v("Release number in "),r("code",[e._v("/ar-io/info")]),e._v(" response.")]),e._v(" "),r("li",[e._v("Redis header cache implementation ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/62",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 62"),r("OutboundLink")],1),e._v(").\n"),r("ul",[r("li",[e._v("New default header cache (replaces old FS cache).")])])]),e._v(" "),r("li",[e._v("LMDB header cache implementation ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/60",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 60"),r("OutboundLink")],1),e._v(").\n"),r("ul",[r("li",[e._v("Intended for use in development only.")]),e._v(" "),r("li",[e._v("Enable by setting "),r("code",[e._v("CHAIN_CACHE_TYPE=lmdb")]),e._v(".")])])]),e._v(" "),r("li",[e._v("Filesystem header cache cleanup worker ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/68",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 68"),r("OutboundLink")],1),e._v(").\n"),r("ul",[r("li",[e._v("Enabled by default to cleanup old filesystem cache now that Redis is the new default.")])])]),e._v(" "),r("li",[e._v("Support for parallel ANS-104 unbundling ("),r("a",{attrs:{href:"https://github.com/ar-io/ar-io-node/pull/65",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR 65"),r("OutboundLink")],1),e._v(").")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Changed")])]),e._v(" "),r("ul",[r("li",[e._v("Used pinned container images tags for releases.")]),e._v(" "),r("li",[e._v("Default to Redis header cache when running via docker-compose.")]),e._v(" "),r("li",[e._v("Default to LMDB header cache when running via "),r("code",[e._v("yarn start")]),e._v(".")])])]),e._v(" "),r("li",[r("p",[r("strong",[e._v("Fixed")])]),e._v(" "),r("ul",[r("li",[e._v("Correct GraphQL pagination for transactions with duplicate tags.")])])])])])}),[],!1,null,null,null);r.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/50.3a5f97de.js b/assets/js/50.fd6e9514.js similarity index 99% rename from assets/js/50.3a5f97de.js rename to assets/js/50.fd6e9514.js index 956f61cc..01d9ab58 100644 --- a/assets/js/50.3a5f97de.js +++ b/assets/js/50.fd6e9514.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{343:function(e,t,a){"use strict";a.r(t);var n=a(10),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"glossary"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#glossary"}},[e._v("#")]),e._v(" Glossary")]),e._v(" "),t("p",[e._v("Many novel terms and acronyms are used by the Arweave ecosystem as well as some new ones introduced by AR.IO. The list below is intended to serve as a non-exhaustive reference of those terms:")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("Arweave Name System (ArNS)")]),e._v(": a decentralized and censorship-resistant naming system enabled by AR.IO gateways which connects friendly names to permaweb applications, pages, and data.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Arweave Name Token (ANT), “Name Token”")]),e._v(": a SmartWeave based token, that is connected to each registered ArNS Name. Each ANT gives the owner the ability to update the subdomains and Arweave transaction IDs used by the registered name as well as transfer ownership and other functions.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Arweave Network Standards (ANS)")]),e._v(": Drafts and finalized standards for data formats, tag formats, data protocols, custom gateway features and anything that is built on top the Arweave Network. Specific standards are denoted by an associated number, e.g., ANS-###.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Base Layer Transaction")]),e._v(": refers to one of up to 1,000 transactions that make up a single Arweave block. A base layer transaction may contain bundled data items.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Bundle, bundling")]),e._v(": an Arweave concept introduced in ANS-104 that allows for a way of writing multiple independent data transactions into one base layer transaction. Bundled transactions contain multiple independent transactions, called data items, wrapped into one larger transaction. This offers two major network benefits:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("A scaling solution for increasing the throughput of uploads to the Arweave network,")])]),e._v(" "),t("li",[t("p",[e._v("Allows delegation of payment for an upload to a third party, while maintaining the identity and signature of the person who created the upload, without them needing to have a wallet with funds.")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Bundled Data Item (BDI)")]),e._v(": A data item / transaction nested within an ANS-104 bundled transaction.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Bundler")]),e._v(": a third-party service that bundles data files on a user’s behalf.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Chunk")]),e._v(": A chunk is a unit of data that is stored on the Arweave network. It represents a piece of a larger file that has been split into smaller, manageable segments for efficient storage and retrieval.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Decentralized, decentralization, etc")]),e._v(": a nonbinary, many axis scale enabling a system or platform to be: permissionless, trustless, verifiable, transparent, open-source, composable, resilient, and censorship resistant. Ultimately, something that is decentralized is not prone to single points of failure or influence.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Epoch")]),e._v(": a specific duration (e.g., one block-week) during which network activities and evaluations are conducted. It serves as a key time frame for processes such as observation duties, performance assessments, and reward distributions within the network's protocols.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Gateway")]),e._v(": a node operating on the Arweave network that provides services for reading from, writing to, and indexing the data stored on the permaweb. Sometimes referred to as “permaweb nodes”.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Gateway Address Registry (GAR)")]),e._v(": a decentralized directory maintained in the AR.IO SmartWeave Contract. It serves as the authoritative list of all registered gateways on the AR.IO Network. The registry provides detailed metadata about each gateway to facilitate discovery, health monitoring, and data sharing among permaweb apps and users. The GAR is designed to be easily queryable, sortable, and filterable by end users and clients, allowing for tailored selections based on various criteria to meet specific use cases.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Indexing")]),e._v(": The act of organizing transaction data tags into queryable databases.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Layer 2 Infrastructure")]),e._v(": Layer 2 refers to the technology / infrastructure stack built “above” a base layer. In this use, the AR.IO Network would be considered Layer 2 infrastructure to the base Arweave protocol.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Manifest (aka Path Manifest, Arweave Manifest)")]),e._v(": special “aggregate” files uploaded to Arweave that map user-definable sub-paths with other Arweave transaction IDs. This allows users to create logical groups of content, for example a directory of related files, or the files and assets that make up a web page or application. Instead of having to manually collate these assets, manifests group them together so that an entire website or app can be launched from a single manifest file. Gateways can interpret this structure, so that users can then reference individual transactions by their file name and/or path.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Mempool")]),e._v(': short for "memory pool," is a component of Arweave mining nodes that temporarily stores valid transactions that have been broadcasted to the network but have not yet been added to a block.')])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Miner (aka Arweave Node)")]),e._v(": a node operating on the Arweave network responsible for data storage and recall.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Observer")]),e._v(": a gateway selected to evaluate the performance of peer gateways in resolving ArNS names. Observers assess and report on the operational efficacy of other gateways.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Period")]),e._v(": refers to a predefined time span (e.g., a block-day) that serves as a cycle for network activities such as dynamic pricing. It is a fundamental unit of time for operational and protocol processes within the network.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Permaweb")]),e._v(": The permaweb is the permanent and decentralized web of files and applications built on top of Arweave.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Permaweb Service Token (PST)")]),e._v(": An alternate term used within the Arweave ecosystem to denote a SmartWeave Token (SWT).")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Protocol Balance")]),e._v(": The primary sink and source of IO tokens circulating through the AR.IO Network. This balance is akin to a central vault or wallet programmatically encoded into the network’s smart contract from which ArNS revenue is accumulated and incentive rewards are distributed.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Protocol Rewards")]),e._v(": IO Token incentive rewards distributed by the protocol to the network’s eligible users and gateway operators.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Seeding")]),e._v(": Refers to the act of propagating new data throughout the network. Miner nodes seed Arweave base layer transaction data to other miners, while gateways ensure that the transactions they receive reach the Arweave nodes. Both gateways and Arweave nodes seed base layer transactions and data chunks.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Staking (of tokens)")]),e._v(": Refers to the process of locking IO tokens into a protocol-facilitated vault, temporarily removing them from circulation until unlocked. This action represents an opportunity cost for the gateway operator and serves as a motivator to prioritize the network's collective interests.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("SmartWeave")]),e._v(": Arweave’s smart contract protocol.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("SmartWeave Token (SWT)")]),e._v(": A smart contract token built on SmartWeave.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Transaction ID (txID)")]),e._v(": Every transaction and data file uploaded to Arweave is assigned a unique identifier code known as the Transaction ID. These txID’s can be referenced by users to easily locate and retrieve files.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Trust-minimization")]),e._v(": Relates to enacting network security by minimizing the number of entities and the degree to which they must be trusted to achieve reliable network interactions. A network with trust-minimizing mechanisms means that it has reduced exposure to undesirable third-party actions and built-in incentives to reward good behavior while punishing bad behavior.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Vault")]),e._v(": Token vaults are protocol level mechanisms used to contain staked tokens over time. Each vault contains a starting block height, ending block height (if applicable), along with a balance of tokens.")])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{340:function(e,t,a){"use strict";a.r(t);var n=a(10),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"glossary"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#glossary"}},[e._v("#")]),e._v(" Glossary")]),e._v(" "),t("p",[e._v("Many novel terms and acronyms are used by the Arweave ecosystem as well as some new ones introduced by AR.IO. The list below is intended to serve as a non-exhaustive reference of those terms:")]),e._v(" "),t("ul",[t("li",[t("p",[t("strong",[e._v("Arweave Name System (ArNS)")]),e._v(": a decentralized and censorship-resistant naming system enabled by AR.IO gateways which connects friendly names to permaweb applications, pages, and data.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Arweave Name Token (ANT), “Name Token”")]),e._v(": a SmartWeave based token, that is connected to each registered ArNS Name. Each ANT gives the owner the ability to update the subdomains and Arweave transaction IDs used by the registered name as well as transfer ownership and other functions.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Arweave Network Standards (ANS)")]),e._v(": Drafts and finalized standards for data formats, tag formats, data protocols, custom gateway features and anything that is built on top the Arweave Network. Specific standards are denoted by an associated number, e.g., ANS-###.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Base Layer Transaction")]),e._v(": refers to one of up to 1,000 transactions that make up a single Arweave block. A base layer transaction may contain bundled data items.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Bundle, bundling")]),e._v(": an Arweave concept introduced in ANS-104 that allows for a way of writing multiple independent data transactions into one base layer transaction. Bundled transactions contain multiple independent transactions, called data items, wrapped into one larger transaction. This offers two major network benefits:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("A scaling solution for increasing the throughput of uploads to the Arweave network,")])]),e._v(" "),t("li",[t("p",[e._v("Allows delegation of payment for an upload to a third party, while maintaining the identity and signature of the person who created the upload, without them needing to have a wallet with funds.")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Bundled Data Item (BDI)")]),e._v(": A data item / transaction nested within an ANS-104 bundled transaction.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Bundler")]),e._v(": a third-party service that bundles data files on a user’s behalf.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Chunk")]),e._v(": A chunk is a unit of data that is stored on the Arweave network. It represents a piece of a larger file that has been split into smaller, manageable segments for efficient storage and retrieval.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Decentralized, decentralization, etc")]),e._v(": a nonbinary, many axis scale enabling a system or platform to be: permissionless, trustless, verifiable, transparent, open-source, composable, resilient, and censorship resistant. Ultimately, something that is decentralized is not prone to single points of failure or influence.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Epoch")]),e._v(": a specific duration (e.g., one block-week) during which network activities and evaluations are conducted. It serves as a key time frame for processes such as observation duties, performance assessments, and reward distributions within the network's protocols.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Gateway")]),e._v(": a node operating on the Arweave network that provides services for reading from, writing to, and indexing the data stored on the permaweb. Sometimes referred to as “permaweb nodes”.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Gateway Address Registry (GAR)")]),e._v(": a decentralized directory maintained in the AR.IO SmartWeave Contract. It serves as the authoritative list of all registered gateways on the AR.IO Network. The registry provides detailed metadata about each gateway to facilitate discovery, health monitoring, and data sharing among permaweb apps and users. The GAR is designed to be easily queryable, sortable, and filterable by end users and clients, allowing for tailored selections based on various criteria to meet specific use cases.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Indexing")]),e._v(": The act of organizing transaction data tags into queryable databases.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Layer 2 Infrastructure")]),e._v(": Layer 2 refers to the technology / infrastructure stack built “above” a base layer. In this use, the AR.IO Network would be considered Layer 2 infrastructure to the base Arweave protocol.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Manifest (aka Path Manifest, Arweave Manifest)")]),e._v(": special “aggregate” files uploaded to Arweave that map user-definable sub-paths with other Arweave transaction IDs. This allows users to create logical groups of content, for example a directory of related files, or the files and assets that make up a web page or application. Instead of having to manually collate these assets, manifests group them together so that an entire website or app can be launched from a single manifest file. Gateways can interpret this structure, so that users can then reference individual transactions by their file name and/or path.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Mempool")]),e._v(': short for "memory pool," is a component of Arweave mining nodes that temporarily stores valid transactions that have been broadcasted to the network but have not yet been added to a block.')])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Miner (aka Arweave Node)")]),e._v(": a node operating on the Arweave network responsible for data storage and recall.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Observer")]),e._v(": a gateway selected to evaluate the performance of peer gateways in resolving ArNS names. Observers assess and report on the operational efficacy of other gateways.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Period")]),e._v(": refers to a predefined time span (e.g., a block-day) that serves as a cycle for network activities such as dynamic pricing. It is a fundamental unit of time for operational and protocol processes within the network.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Permaweb")]),e._v(": The permaweb is the permanent and decentralized web of files and applications built on top of Arweave.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Permaweb Service Token (PST)")]),e._v(": An alternate term used within the Arweave ecosystem to denote a SmartWeave Token (SWT).")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Protocol Balance")]),e._v(": The primary sink and source of IO tokens circulating through the AR.IO Network. This balance is akin to a central vault or wallet programmatically encoded into the network’s smart contract from which ArNS revenue is accumulated and incentive rewards are distributed.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Protocol Rewards")]),e._v(": IO Token incentive rewards distributed by the protocol to the network’s eligible users and gateway operators.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Seeding")]),e._v(": Refers to the act of propagating new data throughout the network. Miner nodes seed Arweave base layer transaction data to other miners, while gateways ensure that the transactions they receive reach the Arweave nodes. Both gateways and Arweave nodes seed base layer transactions and data chunks.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Staking (of tokens)")]),e._v(": Refers to the process of locking IO tokens into a protocol-facilitated vault, temporarily removing them from circulation until unlocked. This action represents an opportunity cost for the gateway operator and serves as a motivator to prioritize the network's collective interests.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("SmartWeave")]),e._v(": Arweave’s smart contract protocol.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("SmartWeave Token (SWT)")]),e._v(": A smart contract token built on SmartWeave.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Transaction ID (txID)")]),e._v(": Every transaction and data file uploaded to Arweave is assigned a unique identifier code known as the Transaction ID. These txID’s can be referenced by users to easily locate and retrieve files.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Trust-minimization")]),e._v(": Relates to enacting network security by minimizing the number of entities and the degree to which they must be trusted to achieve reliable network interactions. A network with trust-minimizing mechanisms means that it has reduced exposure to undesirable third-party actions and built-in incentives to reward good behavior while punishing bad behavior.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Vault")]),e._v(": Token vaults are protocol level mechanisms used to contain staked tokens over time. Each vault contains a starting block height, ending block height (if applicable), along with a balance of tokens.")])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/51.f7b7a97c.js b/assets/js/51.da51b8a3.js similarity index 97% rename from assets/js/51.f7b7a97c.js rename to assets/js/51.da51b8a3.js index d10b1cc1..bd14e067 100644 --- a/assets/js/51.f7b7a97c.js +++ b/assets/js/51.da51b8a3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{340:function(a,e,s){"use strict";s.r(e);var t=s(10),n=Object(t.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"managing-arns-assets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-arns-assets"}},[a._v("#")]),a._v(" Managing ArNS Assets")]),a._v(" "),e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[a._v("#")]),a._v(" Overview")]),a._v(" "),e("p",[a._v("From the Manage Assets page of arns.app, you can view details about your registered names, assign new Target IDs for your names to resolve to, or register new "),e("RouterLink",{attrs:{to:"/arns.html#under_names"}},[a._v("undernames")]),a._v(" for your ArNS names.")],1),a._v(" "),e("p",[a._v('Access the Manage Assets page by connecting your Arweave wallet, and clicking on the account button displaying your wallet address (the connect button if you are not connected), then selecting "Manage Assets" from the menu.')]),a._v(" "),e("video",{staticClass:"amazingdiagram",attrs:{controls:""}},[e("source",{attrs:{src:a.$withBase("/videos/manage-assets.mp4"),type:"video/mp4"}}),a._v("\n Your browser does not support the video tag.\n")]),a._v(" "),e("p",[a._v("The Manage Assets page features two important tabs. "),e("code",[a._v("Names")]),a._v(" and "),e("code",[a._v("ANTS")]),a._v(".")]),a._v(" "),e("h2",{attrs:{id:"names"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#names"}},[a._v("#")]),a._v(" Names")]),a._v(" "),e("p",[a._v("The "),e("code",[a._v("Names")]),a._v(' tab displays all of the ArNS names registered to the currently connected wallet. Each name has its own "details" button which allows you to view details about the name, extend the lease period, or increase the available undernames for that name.')]),a._v(" "),e("img",{staticClass:"amazingdiagram",attrs:{src:a.$withBase("/images/arns-assets-names.jpeg")}}),a._v(" "),e("h2",{attrs:{id:"ants"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ants"}},[a._v("#")]),a._v(" ANTs")]),a._v(" "),e("p",[a._v("The "),e("code",[a._v("ANTs")]),a._v(' tab displays each ANT owned by the connected wallet (except for advanced use cases, each ArNS name will have its own ANT). You can view and create new undernames using the "Undernames" button, or access advanced management options by clicking on the "manage" icon (shaped like a gear).')]),a._v(" "),e("img",{staticClass:"amazingdiagram",attrs:{src:a.$withBase("/images/arns-assets-ants.jpeg")}}),a._v(" "),e("p",[a._v("The Advanced manage page allows you to transfer ownership, add or remove controllers (other wallets who are able to manage an ANT) or set/modify a Target ID for a name to resolve to.")]),a._v(" "),e("img",{staticClass:"amazingdiagram",attrs:{src:a.$withBase("/images/arns-manage-ant.jpeg")}})])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{341:function(a,e,s){"use strict";s.r(e);var t=s(10),n=Object(t.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"managing-arns-assets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-arns-assets"}},[a._v("#")]),a._v(" Managing ArNS Assets")]),a._v(" "),e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[a._v("#")]),a._v(" Overview")]),a._v(" "),e("p",[a._v("From the Manage Assets page of arns.app, you can view details about your registered names, assign new Target IDs for your names to resolve to, or register new "),e("RouterLink",{attrs:{to:"/arns.html#under_names"}},[a._v("undernames")]),a._v(" for your ArNS names.")],1),a._v(" "),e("p",[a._v('Access the Manage Assets page by connecting your Arweave wallet, and clicking on the account button displaying your wallet address (the connect button if you are not connected), then selecting "Manage Assets" from the menu.')]),a._v(" "),e("video",{staticClass:"amazingdiagram",attrs:{controls:""}},[e("source",{attrs:{src:a.$withBase("/videos/manage-assets.mp4"),type:"video/mp4"}}),a._v("\n Your browser does not support the video tag.\n")]),a._v(" "),e("p",[a._v("The Manage Assets page features two important tabs. "),e("code",[a._v("Names")]),a._v(" and "),e("code",[a._v("ANTS")]),a._v(".")]),a._v(" "),e("h2",{attrs:{id:"names"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#names"}},[a._v("#")]),a._v(" Names")]),a._v(" "),e("p",[a._v("The "),e("code",[a._v("Names")]),a._v(' tab displays all of the ArNS names registered to the currently connected wallet. Each name has its own "details" button which allows you to view details about the name, extend the lease period, or increase the available undernames for that name.')]),a._v(" "),e("img",{staticClass:"amazingdiagram",attrs:{src:a.$withBase("/images/arns-assets-names.jpeg")}}),a._v(" "),e("h2",{attrs:{id:"ants"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ants"}},[a._v("#")]),a._v(" ANTs")]),a._v(" "),e("p",[a._v("The "),e("code",[a._v("ANTs")]),a._v(' tab displays each ANT owned by the connected wallet (except for advanced use cases, each ArNS name will have its own ANT). You can view and create new undernames using the "Undernames" button, or access advanced management options by clicking on the "manage" icon (shaped like a gear).')]),a._v(" "),e("img",{staticClass:"amazingdiagram",attrs:{src:a.$withBase("/images/arns-assets-ants.jpeg")}}),a._v(" "),e("p",[a._v("The Advanced manage page allows you to transfer ownership, add or remove controllers (other wallets who are able to manage an ANT) or set/modify a Target ID for a name to resolve to.")]),a._v(" "),e("img",{staticClass:"amazingdiagram",attrs:{src:a.$withBase("/images/arns-manage-ant.jpeg")}})])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/52.1f0ae440.js b/assets/js/52.7acdcdc0.js similarity index 94% rename from assets/js/52.1f0ae440.js rename to assets/js/52.7acdcdc0.js index e375d5d4..afc92639 100644 --- a/assets/js/52.1f0ae440.js +++ b/assets/js/52.7acdcdc0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{341:function(e,a,r){"use strict";r.r(a);var t=r(10),s=Object(t.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"arweave-name-system-arns"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arweave-name-system-arns"}},[e._v("#")]),e._v(" Arweave Name System (ArNS)")]),e._v(" "),a("h2",{attrs:{id:"overview"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),a("p",[e._v("The Arweave Name System (ArNS) is a decentralized, censorship-resistant naming system on Arweave. It allows data on Arweave to be assigned to friendly domain names. Learn more about ArNS "),a("RouterLink",{attrs:{to:"/arns.html"}},[e._v("here")]),e._v(".")],1),e._v(" "),a("p",[e._v("This guide will walk you through the process of purchasing and managing an ArNS name using "),a("a",{attrs:{href:"https://arns.app",target:"_blank",rel:"noopener noreferrer"}},[e._v("arns.app"),a("OutboundLink")],1),e._v(", the official ArNS portal from AR.IO.")])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{342:function(e,a,r){"use strict";r.r(a);var t=r(10),s=Object(t.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"arweave-name-system-arns"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#arweave-name-system-arns"}},[e._v("#")]),e._v(" Arweave Name System (ArNS)")]),e._v(" "),a("h2",{attrs:{id:"overview"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),a("p",[e._v("The Arweave Name System (ArNS) is a decentralized, censorship-resistant naming system on Arweave. It allows data on Arweave to be assigned to friendly domain names. Learn more about ArNS "),a("RouterLink",{attrs:{to:"/arns.html"}},[e._v("here")]),e._v(".")],1),e._v(" "),a("p",[e._v("This guide will walk you through the process of purchasing and managing an ArNS name using "),a("a",{attrs:{href:"https://arns.app",target:"_blank",rel:"noopener noreferrer"}},[e._v("arns.app"),a("OutboundLink")],1),e._v(", the official ArNS portal from AR.IO.")])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/54.d1a6f33c.js b/assets/js/54.c1d0ffd8.js similarity index 99% rename from assets/js/54.d1a6f33c.js rename to assets/js/54.c1d0ffd8.js index a78c951f..3b5dc6ee 100644 --- a/assets/js/54.d1a6f33c.js +++ b/assets/js/54.c1d0ffd8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{342:function(t,e,a){"use strict";a.r(e);var s=a(10),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"graphql"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#graphql"}},[t._v("#")]),t._v(" GraphQL")]),t._v(" "),e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[t._v("#")]),t._v(" Overview")]),t._v(" "),e("p",[t._v("GraphQL is a powerful query language designed for modern web applications to efficiently fetch data. It enables precise queries, allowing users to specify exactly which data they need and in what format, significantly reducing the amount of unnecessary data transferred. This approach is ideal for dealing with complex systems and large datasets, as it minimizes bandwidth and improves performance. GraphQL operates through a single endpoint, streamlining the way applications communicate with databases.")]),t._v(" "),e("p",[t._v("The integration of GraphQL with Arweave introduces a refined method for interacting with decentralized data storage. Arweave allows for the tagging of uploaded data, facilitating enhanced searchability and retrievability within its blockchain network. Utilizing GraphQL, users can perform targeted queries that leverage these tags, ensuring the retrieval of specific data swiftly and efficiently. This capability is particularly beneficial for the development of decentralized applications (dApps), the archival of content in a permanent and unalterable form, and the establishment of data marketplaces where precision and efficiency in data access are paramount.")]),t._v(" "),e("p",[t._v("Together, GraphQL and Arweave form a compelling combination, offering developers and users a robust framework for managing and querying data in a decentralized environment. This integration not only promotes the efficient and scalable retrieval of data but also supports the creation of more sophisticated and data-intensive applications on the decentralized web, maintaining a balance between technical depth and accessibility.")]),t._v(" "),e("h2",{attrs:{id:"constructing-a-query"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#constructing-a-query"}},[t._v("#")]),t._v(" Constructing a Query")]),t._v(" "),e("h3",{attrs:{id:"basic-syntax"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-syntax"}},[t._v("#")]),t._v(" Basic Syntax")]),t._v(" "),e("p",[t._v("In GraphQL, you start with a root field and use braces to outline the fields you want to retrieve, allowing for precise, hierarchical data requests. For instance:")]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n transactions "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n edges "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id\n tags "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name\n value\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("This query demonstrates fetching transactions and their tags, illustrating the hierarchical nature of GraphQL queries.")]),t._v(" "),e("h3",{attrs:{id:"customizing-searches-with-tags"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#customizing-searches-with-tags"}},[t._v("#")]),t._v(" Customizing Searches with Tags")]),t._v(" "),e("p",[t._v("Arweave utilizes a tagging system for transactions, enabling intricate search capabilities. You can filter queries using these tags:")]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n transactions(tags"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("name"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"App-Name"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" values"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"YourAppName"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(") "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n edges "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id\n data "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n size\n type\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("This example filters transactions by a specific application name, and returns the "),e("code",[t._v("id")]),t._v(", "),e("code",[t._v("size")]),t._v(", and "),e("code",[t._v("type")]),t._v(" of the transaction, showcasing how to customize queries for targeted data retrieval.")]),t._v(" "),e("p",[e("strong",[t._v("NOTE")]),t._v(": Tags are not the only option for filtering results, but are extremely useful due to the ability to add custom tags during the upload process.")]),t._v(" "),e("h3",{attrs:{id:"understanding-edges-and-nodes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#understanding-edges-and-nodes"}},[t._v("#")]),t._v(" Understanding Edges and Nodes")]),t._v(" "),e("p",[t._v("In the realm of GraphQL queries, especially when interfacing with Arweave, grasping the concept of edges and nodes is pivotal for constructing efficient and effective queries. This structure is not unique to Arweave but is particularly relevant due to the decentralized and interconnected nature of the data stored on its blockchain.")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("Nodes")]),t._v(": At the heart of GraphQL's query structure, nodes represent individual data points or entities. In the context of Arweave, a node could be a transaction, a block, or any piece of data stored within the network. Nodes are the primary targets of your query, containing the data you wish to retrieve, such as transaction IDs, tags, or the content of data transactions.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("Edges")]),t._v(": Serving as the glue between nodes, edges are constructs that outline the relationship between different nodes. They can contain metadata about the connection, such as the nature of the relationship or additional attributes that describe how nodes are linked. In many GraphQL implementations, including those that interact with Arweave, edges are used to navigate through collections of related data, making them crucial for understanding the data's structure and lineage.")])])]),t._v(" "),e("p",[t._v("This hierarchical model is especially useful for querying complex and relational data sets, allowing for detailed navigation and efficient data retrieval within Arweave's decentralized storage system. By effectively utilizing the edges and nodes structure, you can precisely target the data you need, whether it's filtering transactions by tags, fetching related transactions, or exploring the blockchain's structure.")]),t._v(" "),e("h3",{attrs:{id:"pagination"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pagination"}},[t._v("#")]),t._v(" Pagination")]),t._v(" "),e("p",[t._v("To add pagination to your GraphQL queries, you can use the "),e("code",[t._v("first")]),t._v(", "),e("code",[t._v("last")]),t._v(", "),e("code",[t._v("before")]),t._v(", and "),e("code",[t._v("after")]),t._v(" parameters. These parameters control the slice of data you're querying, making data retrieval more efficient and manageable.")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("first")]),t._v(": Specify the number of items to retrieve from the start of the list or dataset.")]),t._v(" "),e("li",[e("strong",[t._v("last")]),t._v(": Specify the number of items to retrieve from the end of the list or dataset.")])]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n transactions(first"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(") "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n edges "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("This query fetches the first 10 transactions.")]),t._v(" "),e("p",[t._v("To navigate through your dataset, you can use after and before in conjunction with "),e("code",[t._v("first")]),t._v(" or "),e("code",[t._v("last")]),t._v(". These parameters accept cursors, which are typically provided in the response of your initial query.")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("after")]),t._v(": Fetch items after the specified cursor, used with first.")]),t._v(" "),e("li",[e("strong",[t._v("before")]),t._v(": Fetch items before the specified cursor, used with last.")])]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n transactions(first"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" after"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cursorOfLastItem"')]),t._v(") "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n edges "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v('This query fetches the next 10 transactions following the transaction with the cursor "cursorOfLastItem".')]),t._v(" "),e("p",[t._v("If no pagination terms are set, GraphQL servers may apply default limits to prevent excessively large datasets from being returned in a single query, potentially impacting performance. The default behavior can vary based on the server's configuration but often involves returning a predefined maximum number of items.")]),t._v(" "),e("p",[t._v("For instance, without specifying "),e("code",[t._v("first")]),t._v(" or "),e("code",[t._v("last")]),t._v(", a query to the transactions field might return the first 5-10 transactions by default, depending on the server settings.")]),t._v(" "),e("p",[t._v("This behavior ensures that server resources are not overwhelmed by large requests and that client applications receive data in manageable chunks.")]),t._v(" "),e("h3",{attrs:{id:"general-tips-for-optimizing-queries"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-tips-for-optimizing-queries"}},[t._v("#")]),t._v(" General Tips for Optimizing Queries")]),t._v(" "),e("p",[t._v("To optimize your GraphQL queries in Arweave, follow these general guidelines:")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Specificity")]),t._v(": Query with the most precise tags possible to narrow the search scope and enhance performance.")]),t._v(" "),e("li",[e("strong",[t._v("Minimalism")]),t._v(": Limit your query to the essential set of tags to reduce processing time and data transfer.")]),t._v(" "),e("li",[e("strong",[t._v("Schema Design")]),t._v(": Design your app's schema to reflect query patterns, possibly introducing tags that encapsulate frequent combinations of criteria.")]),t._v(" "),e("li",[e("strong",[t._v("Include Non-tag Fields")]),t._v(": Adding fields like owner can refine your search, making your queries more efficient.")]),t._v(" "),e("li",[e("strong",[t._v("Order Your Tags")]),t._v(": Arrange tags from most specific to most general to leverage Arweave's indexing more effectively.")])]),t._v(" "),e("p",[t._v("By incorporating these strategies, developers can achieve faster and more precise data access from Arweave, enhancing the performance and responsiveness of decentralized applications. This balanced approach to query construction and optimization is key to navigating the expansive and decentralized storage landscape Arweave provides.")]),t._v(" "),e("h2",{attrs:{id:"making-a-query"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#making-a-query"}},[t._v("#")]),t._v(" Making a Query")]),t._v(" "),e("p",[t._v("Executing GraphQL queries within the Arweave ecosystem offers flexibility and multiple avenues for developers and users alike. Whether you prefer a hands-on, manual approach to constructing and testing queries, or you aim for automation and integration within your applications, Arweave provides the tools necessary to interact with its decentralized data storage seamlessly.")]),t._v(" "),e("h3",{attrs:{id:"graphql-playground"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#graphql-playground"}},[t._v("#")]),t._v(" GraphQL Playground")]),t._v(" "),e("p",[t._v("For those new to GraphQL or seeking to fine-tune their queries before implementation, the GraphQL playground offers an invaluable resource. This interactive interface allows users to manually construct queries, explore the schema, and immediately see the results of their queries. Accessible via web browsers, the playground can be found at the /graphql endpoint of most Arweave indexing services, such as "),e("a",{attrs:{href:"https://arweave.dev/graphql",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://arweave.dev/graphql"),e("OutboundLink")],1),t._v(". Here, you can experiment with different queries, understand the structure of the data, and refine your approach without writing a single line of code in your application.")]),t._v(" "),e("p",[t._v("Steps for Accessing the GraphQL Playground:")]),t._v(" "),e("ol",[e("li",[t._v("Navigate to "),e("a",{attrs:{href:"https://arweave.dev/graphql",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://arweave.dev/graphql"),e("OutboundLink")],1),t._v(", or the graphql endpoint of any ar.io gateway, in your web browser.")]),t._v(" "),e("li",[t._v("Enter your GraphQL query in the provided interface.")]),t._v(" "),e("li",[t._v('Press the "play" button to execute the query to see real-time results and debug as needed.')])]),t._v(" "),e("h3",{attrs:{id:"using-an-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-an-api"}},[t._v("#")]),t._v(" Using an API")]),t._v(" "),e("p",[t._v("For application development and automation, making GraphQL queries programmatically is essential. You can send "),e("code",[t._v("POST")]),t._v(" requests directly to the GraphQL endpoint of any indexing service that supports it, such as arweave.net or any ar.io gateway. These requests should contain your query in the body, allowing for dynamic and automated data retrieval within your application.")]),t._v(" "),e("p",[t._v("When selecting an indexing service, consider the data coverage and reliability of the gateway to ensure it meets your application's needs. Different gateways might have varying degrees of indexed data available, so choosing one that is consistently up-to-date and comprehensive is key.")]),t._v(" "),e("p",[t._v("Example of making a programmatic query:")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" axios "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'axios'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("query")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token template-string"}},[e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('\n {\n transactions(tags: [{name: "App-Name", values: "YourAppName"}]) {\n edges {\n node {\n id\n tags {\n name\n value\n }\n }\n }\n }\n }\n ')]),e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\naxios"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://arweave.net/graphql'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" query"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Error:'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" error"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"using-an-sdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-an-sdk"}},[t._v("#")]),t._v(" Using an SDK")]),t._v(" "),e("p",[t._v("For an even more integrated experience, some Software Development Kits (SDKs) offer direct methods for executing GraphQL queries. The "),e("a",{attrs:{href:"https://github.com/ArweaveTeam/arweave-js",target:"_blank",rel:"noopener noreferrer"}},[t._v("Arweave SDK"),e("OutboundLink")],1),t._v(", for example, provides built-in functionalities to interact with the blockchain, simplifying the process of making queries. By leveraging these SDKs, developers can bypass the intricacies of manual HTTP request construction, focusing instead on the logic and design of their applications.")]),t._v(" "),e("p",[t._v("Example of using the Arweave SDK for GraphQL queries:")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Assuming the Arweave SDK is already set up and initialized")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("query")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token template-string"}},[e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('\n {\n transactions(tags: [{name: "App-Name", values: "YourAppName"}]) {\n edges {\n node {\n id\n tags {\n name\n value\n }\n }\n }\n }\n }\n ')]),e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\narweave"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("api"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/graphql'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" query"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Error:'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" error"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{343:function(t,e,a){"use strict";a.r(e);var s=a(10),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"graphql"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#graphql"}},[t._v("#")]),t._v(" GraphQL")]),t._v(" "),e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[t._v("#")]),t._v(" Overview")]),t._v(" "),e("p",[t._v("GraphQL is a powerful query language designed for modern web applications to efficiently fetch data. It enables precise queries, allowing users to specify exactly which data they need and in what format, significantly reducing the amount of unnecessary data transferred. This approach is ideal for dealing with complex systems and large datasets, as it minimizes bandwidth and improves performance. GraphQL operates through a single endpoint, streamlining the way applications communicate with databases.")]),t._v(" "),e("p",[t._v("The integration of GraphQL with Arweave introduces a refined method for interacting with decentralized data storage. Arweave allows for the tagging of uploaded data, facilitating enhanced searchability and retrievability within its blockchain network. Utilizing GraphQL, users can perform targeted queries that leverage these tags, ensuring the retrieval of specific data swiftly and efficiently. This capability is particularly beneficial for the development of decentralized applications (dApps), the archival of content in a permanent and unalterable form, and the establishment of data marketplaces where precision and efficiency in data access are paramount.")]),t._v(" "),e("p",[t._v("Together, GraphQL and Arweave form a compelling combination, offering developers and users a robust framework for managing and querying data in a decentralized environment. This integration not only promotes the efficient and scalable retrieval of data but also supports the creation of more sophisticated and data-intensive applications on the decentralized web, maintaining a balance between technical depth and accessibility.")]),t._v(" "),e("h2",{attrs:{id:"constructing-a-query"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#constructing-a-query"}},[t._v("#")]),t._v(" Constructing a Query")]),t._v(" "),e("h3",{attrs:{id:"basic-syntax"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-syntax"}},[t._v("#")]),t._v(" Basic Syntax")]),t._v(" "),e("p",[t._v("In GraphQL, you start with a root field and use braces to outline the fields you want to retrieve, allowing for precise, hierarchical data requests. For instance:")]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n transactions "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n edges "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id\n tags "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name\n value\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("This query demonstrates fetching transactions and their tags, illustrating the hierarchical nature of GraphQL queries.")]),t._v(" "),e("h3",{attrs:{id:"customizing-searches-with-tags"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#customizing-searches-with-tags"}},[t._v("#")]),t._v(" Customizing Searches with Tags")]),t._v(" "),e("p",[t._v("Arweave utilizes a tagging system for transactions, enabling intricate search capabilities. You can filter queries using these tags:")]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n transactions(tags"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("name"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"App-Name"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" values"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"YourAppName"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(") "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n edges "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id\n data "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n size\n type\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("This example filters transactions by a specific application name, and returns the "),e("code",[t._v("id")]),t._v(", "),e("code",[t._v("size")]),t._v(", and "),e("code",[t._v("type")]),t._v(" of the transaction, showcasing how to customize queries for targeted data retrieval.")]),t._v(" "),e("p",[e("strong",[t._v("NOTE")]),t._v(": Tags are not the only option for filtering results, but are extremely useful due to the ability to add custom tags during the upload process.")]),t._v(" "),e("h3",{attrs:{id:"understanding-edges-and-nodes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#understanding-edges-and-nodes"}},[t._v("#")]),t._v(" Understanding Edges and Nodes")]),t._v(" "),e("p",[t._v("In the realm of GraphQL queries, especially when interfacing with Arweave, grasping the concept of edges and nodes is pivotal for constructing efficient and effective queries. This structure is not unique to Arweave but is particularly relevant due to the decentralized and interconnected nature of the data stored on its blockchain.")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("Nodes")]),t._v(": At the heart of GraphQL's query structure, nodes represent individual data points or entities. In the context of Arweave, a node could be a transaction, a block, or any piece of data stored within the network. Nodes are the primary targets of your query, containing the data you wish to retrieve, such as transaction IDs, tags, or the content of data transactions.")])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("Edges")]),t._v(": Serving as the glue between nodes, edges are constructs that outline the relationship between different nodes. They can contain metadata about the connection, such as the nature of the relationship or additional attributes that describe how nodes are linked. In many GraphQL implementations, including those that interact with Arweave, edges are used to navigate through collections of related data, making them crucial for understanding the data's structure and lineage.")])])]),t._v(" "),e("p",[t._v("This hierarchical model is especially useful for querying complex and relational data sets, allowing for detailed navigation and efficient data retrieval within Arweave's decentralized storage system. By effectively utilizing the edges and nodes structure, you can precisely target the data you need, whether it's filtering transactions by tags, fetching related transactions, or exploring the blockchain's structure.")]),t._v(" "),e("h3",{attrs:{id:"pagination"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pagination"}},[t._v("#")]),t._v(" Pagination")]),t._v(" "),e("p",[t._v("To add pagination to your GraphQL queries, you can use the "),e("code",[t._v("first")]),t._v(", "),e("code",[t._v("last")]),t._v(", "),e("code",[t._v("before")]),t._v(", and "),e("code",[t._v("after")]),t._v(" parameters. These parameters control the slice of data you're querying, making data retrieval more efficient and manageable.")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("first")]),t._v(": Specify the number of items to retrieve from the start of the list or dataset.")]),t._v(" "),e("li",[e("strong",[t._v("last")]),t._v(": Specify the number of items to retrieve from the end of the list or dataset.")])]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n transactions(first"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(") "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n edges "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("This query fetches the first 10 transactions.")]),t._v(" "),e("p",[t._v("To navigate through your dataset, you can use after and before in conjunction with "),e("code",[t._v("first")]),t._v(" or "),e("code",[t._v("last")]),t._v(". These parameters accept cursors, which are typically provided in the response of your initial query.")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("after")]),t._v(": Fetch items after the specified cursor, used with first.")]),t._v(" "),e("li",[e("strong",[t._v("before")]),t._v(": Fetch items before the specified cursor, used with last.")])]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n transactions(first"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" after"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cursorOfLastItem"')]),t._v(") "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n edges "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n id\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v('This query fetches the next 10 transactions following the transaction with the cursor "cursorOfLastItem".')]),t._v(" "),e("p",[t._v("If no pagination terms are set, GraphQL servers may apply default limits to prevent excessively large datasets from being returned in a single query, potentially impacting performance. The default behavior can vary based on the server's configuration but often involves returning a predefined maximum number of items.")]),t._v(" "),e("p",[t._v("For instance, without specifying "),e("code",[t._v("first")]),t._v(" or "),e("code",[t._v("last")]),t._v(", a query to the transactions field might return the first 5-10 transactions by default, depending on the server settings.")]),t._v(" "),e("p",[t._v("This behavior ensures that server resources are not overwhelmed by large requests and that client applications receive data in manageable chunks.")]),t._v(" "),e("h3",{attrs:{id:"general-tips-for-optimizing-queries"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-tips-for-optimizing-queries"}},[t._v("#")]),t._v(" General Tips for Optimizing Queries")]),t._v(" "),e("p",[t._v("To optimize your GraphQL queries in Arweave, follow these general guidelines:")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("Specificity")]),t._v(": Query with the most precise tags possible to narrow the search scope and enhance performance.")]),t._v(" "),e("li",[e("strong",[t._v("Minimalism")]),t._v(": Limit your query to the essential set of tags to reduce processing time and data transfer.")]),t._v(" "),e("li",[e("strong",[t._v("Schema Design")]),t._v(": Design your app's schema to reflect query patterns, possibly introducing tags that encapsulate frequent combinations of criteria.")]),t._v(" "),e("li",[e("strong",[t._v("Include Non-tag Fields")]),t._v(": Adding fields like owner can refine your search, making your queries more efficient.")]),t._v(" "),e("li",[e("strong",[t._v("Order Your Tags")]),t._v(": Arrange tags from most specific to most general to leverage Arweave's indexing more effectively.")])]),t._v(" "),e("p",[t._v("By incorporating these strategies, developers can achieve faster and more precise data access from Arweave, enhancing the performance and responsiveness of decentralized applications. This balanced approach to query construction and optimization is key to navigating the expansive and decentralized storage landscape Arweave provides.")]),t._v(" "),e("h2",{attrs:{id:"making-a-query"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#making-a-query"}},[t._v("#")]),t._v(" Making a Query")]),t._v(" "),e("p",[t._v("Executing GraphQL queries within the Arweave ecosystem offers flexibility and multiple avenues for developers and users alike. Whether you prefer a hands-on, manual approach to constructing and testing queries, or you aim for automation and integration within your applications, Arweave provides the tools necessary to interact with its decentralized data storage seamlessly.")]),t._v(" "),e("h3",{attrs:{id:"graphql-playground"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#graphql-playground"}},[t._v("#")]),t._v(" GraphQL Playground")]),t._v(" "),e("p",[t._v("For those new to GraphQL or seeking to fine-tune their queries before implementation, the GraphQL playground offers an invaluable resource. This interactive interface allows users to manually construct queries, explore the schema, and immediately see the results of their queries. Accessible via web browsers, the playground can be found at the /graphql endpoint of most Arweave indexing services, such as "),e("a",{attrs:{href:"https://arweave.dev/graphql",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://arweave.dev/graphql"),e("OutboundLink")],1),t._v(". Here, you can experiment with different queries, understand the structure of the data, and refine your approach without writing a single line of code in your application.")]),t._v(" "),e("p",[t._v("Steps for Accessing the GraphQL Playground:")]),t._v(" "),e("ol",[e("li",[t._v("Navigate to "),e("a",{attrs:{href:"https://arweave.dev/graphql",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://arweave.dev/graphql"),e("OutboundLink")],1),t._v(", or the graphql endpoint of any ar.io gateway, in your web browser.")]),t._v(" "),e("li",[t._v("Enter your GraphQL query in the provided interface.")]),t._v(" "),e("li",[t._v('Press the "play" button to execute the query to see real-time results and debug as needed.')])]),t._v(" "),e("h3",{attrs:{id:"using-an-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-an-api"}},[t._v("#")]),t._v(" Using an API")]),t._v(" "),e("p",[t._v("For application development and automation, making GraphQL queries programmatically is essential. You can send "),e("code",[t._v("POST")]),t._v(" requests directly to the GraphQL endpoint of any indexing service that supports it, such as arweave.net or any ar.io gateway. These requests should contain your query in the body, allowing for dynamic and automated data retrieval within your application.")]),t._v(" "),e("p",[t._v("When selecting an indexing service, consider the data coverage and reliability of the gateway to ensure it meets your application's needs. Different gateways might have varying degrees of indexed data available, so choosing one that is consistently up-to-date and comprehensive is key.")]),t._v(" "),e("p",[t._v("Example of making a programmatic query:")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" axios "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'axios'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("query")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token template-string"}},[e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('\n {\n transactions(tags: [{name: "App-Name", values: "YourAppName"}]) {\n edges {\n node {\n id\n tags {\n name\n value\n }\n }\n }\n }\n }\n ')]),e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\naxios"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://arweave.net/graphql'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" query"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Error:'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" error"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"using-an-sdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-an-sdk"}},[t._v("#")]),t._v(" Using an SDK")]),t._v(" "),e("p",[t._v("For an even more integrated experience, some Software Development Kits (SDKs) offer direct methods for executing GraphQL queries. The "),e("a",{attrs:{href:"https://github.com/ArweaveTeam/arweave-js",target:"_blank",rel:"noopener noreferrer"}},[t._v("Arweave SDK"),e("OutboundLink")],1),t._v(", for example, provides built-in functionalities to interact with the blockchain, simplifying the process of making queries. By leveraging these SDKs, developers can bypass the intricacies of manual HTTP request construction, focusing instead on the logic and design of their applications.")]),t._v(" "),e("p",[t._v("Example of using the Arweave SDK for GraphQL queries:")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Assuming the Arweave SDK is already set up and initialized")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("query")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token template-string"}},[e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('\n {\n transactions(tags: [{name: "App-Name", values: "YourAppName"}]) {\n edges {\n node {\n id\n tags {\n name\n value\n }\n }\n }\n }\n }\n ')]),e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\narweave"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("api"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/graphql'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" query"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Error:'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" error"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/app.4bfa30ef.js b/assets/js/app.b9a5ad62.js similarity index 86% rename from assets/js/app.4bfa30ef.js rename to assets/js/app.b9a5ad62.js index b47aa4d3..022768c2 100644 --- a/assets/js/app.4bfa30ef.js +++ b/assets/js/app.b9a5ad62.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],u=e[1],c=e[2],f=0,p=[];f
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var u=n.render(!e),c=u.querySelector(r.barSelector),l=r.speed,f=r.easing;return u.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,l,f)),1===t?(s(u,{transition:"none",opacity:1}),u.offsetWidth,setTimeout((function(){s(u,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),l)}),l)):setTimeout(e,l)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),u=t?"-100":i(n.status||0),l=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+u+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),l!=document.body&&c(l,"nprogress-custom-parent"),l.appendChild(e),e},n.remove=function(){l(document.documentElement,"nprogress-busy"),l(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function u(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function c(t,e){var n=f(t),r=n+e;u(n,e)||(t.className=r.substring(1))}function l(t,e){var n,r=f(t);u(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e,n){"use strict";var r=n(0),o=n(45).f,i=n(13),a=n(93),s=n(32),u=n(60),c=n(122);t.exports=function(t,e){var n,l,f,p,d,h=t.target,v=t.global,g=t.stat;if(n=v?r:g?r[h]||s(h,{}):(r[h]||{}).prototype)for(l in e){if(p=e[l],f=t.dontCallGetSet?(d=o(n,l))&&d.value:n[l],!c(v?l:h+(g?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;u(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),a(n,l,p,t)}}},function(t,e,n){"use strict";var r=n(25),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(t,e,n){"use strict";var r=n(3);t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},function(t,e,n){"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){"use strict";var r=n(46),o=n(47);t.exports=function(t){return r(o(t))}},function(t,e,n){"use strict";var r=n(0),o=n(1),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},function(t,e,n){"use strict";var r=n(1),o=n(104),i=TypeError;t.exports=function(t){if(r(t))return t;throw new i(o(t)+" is not a function")}},function(t,e,n){"use strict";var r=n(0),o=n(55),i=n(8),a=n(57),s=n(53),u=n(52),c=r.Symbol,l=o("wks"),f=u?c.for||c:c&&c.withoutSetter||a;t.exports=function(t){return i(l,t)||(l[t]=s&&i(c,t)?c[t]:f("Symbol."+t)),l[t]}},function(t,e,n){"use strict";var r=n(0),o=n(32),i=r["__core-js_shared__"]||o("__core-js_shared__",{});t.exports=i},function(t,e,n){"use strict";var r=n(0),o=Object.defineProperty;t.exports=function(t,e){try{o(r,t,{value:e,configurable:!0,writable:!0})}catch(n){r[t]=e}return e}},function(t,e,n){"use strict";var r=n(47),o=Object;t.exports=function(t){return o(r(t))}},function(t,e,n){"use strict";var r=n(7),o=String,i=TypeError;t.exports=function(t){if(r(t))return t;throw new i(o(t)+" is not an object")}},function(t,e,n){"use strict";var r=n(119);t.exports=function(t){return r(t.length)}},function(t,e,n){var r=n(146),o=n(11),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=u},function(t,e,n){var r=n(9)(n(6),"Map");t.exports=r},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(166),o=n(173),i=n(175),a=n(176),s=n(177);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){var r=n(4),o=n(43),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function(t,e){if(r(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!o(t))||(a.test(t)||!i.test(t)||null!=e&&t in Object(e))}},function(t,e,n){var r=n(12),o=n(11);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},function(t,e){t.exports=function(t){return t}},function(t,e,n){"use strict";var r=n(5),o=n(24),i=n(100),a=n(26),s=n(27),u=n(49),c=n(8),l=n(58),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=s(t),e=u(e),l)try{return f(t,e)}catch(t){}if(c(t,e))return a(!o(i.f,t,e),t[e])}},function(t,e,n){"use strict";var r=n(2),o=n(3),i=n(16),a=Object,s=r("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===i(t)?s(t,""):a(t)}:a},function(t,e,n){"use strict";var r=n(48),o=TypeError;t.exports=function(t){if(r(t))throw new o("Can't call method on "+t);return t}},function(t,e,n){"use strict";t.exports=function(t){return null==t}},function(t,e,n){"use strict";var r=n(101),o=n(50);t.exports=function(t){var e=r(t,"string");return o(e)?e:e+""}},function(t,e,n){"use strict";var r=n(28),o=n(1),i=n(51),a=n(52),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=r("Symbol");return o(e)&&i(e.prototype,s(t))}},function(t,e,n){"use strict";var r=n(2);t.exports=r({}.isPrototypeOf)},function(t,e,n){"use strict";var r=n(53);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,e,n){"use strict";var r=n(54),o=n(3),i=n(0).String;t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol("symbol detection");return!i(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(t,e,n){"use strict";var r,o,i=n(0),a=n(102),s=i.process,u=i.Deno,c=s&&s.versions||u&&u.version,l=c&&c.v8;l&&(o=(r=l.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),t.exports=o},function(t,e,n){"use strict";var r=n(56),o=n(31);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.35.0",mode:r?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.35.0/LICENSE",source:"https://github.com/zloirock/core-js"})},function(t,e,n){"use strict";t.exports=!1},function(t,e,n){"use strict";var r=n(2),o=0,i=Math.random(),a=r(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+i,36)}},function(t,e,n){"use strict";var r=n(5),o=n(3),i=n(106);t.exports=!r&&!o((function(){return 7!==Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){"use strict";t.exports={}},function(t,e,n){"use strict";var r=n(8),o=n(113),i=n(45),a=n(15);t.exports=function(t,e,n){for(var s=o(e),u=a.f,c=i.f,l=0;ll))return!1;var p=u.get(t),d=u.get(e);if(p&&d)return p==e&&d==t;var h=-1,v=!0,g=2&n?new r:void 0;for(u.set(t,e),u.set(e,t);++h-1&&t%1==0&&t=0&&Math.floor(e)===e&&isFinite(t)}function v(t){return a(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function g(t){return null==t?"":Array.isArray(t)||p(t)&&t.toString===f?JSON.stringify(t,m,2):String(t)}function m(t,e){return e&&e.__v_isRef?e.value:e}function y(t){var e=parseFloat(t);return isNaN(e)?t:e}function b(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(r,1)}}var x=Object.prototype.hasOwnProperty;function k(t,e){return x.call(t,e)}function O(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var S=/-(\w)/g,C=O((function(t){return t.replace(S,(function(t,e){return e?e.toUpperCase():""}))})),j=O((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),$=/\B([A-Z])/g,P=O((function(t){return t.replace($,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function A(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function T(t,e){for(var n in e)t[n]=e[n];return t}function L(t){for(var e={},n=0;n0,Z=J&&J.indexOf("edge/")>0;J&&J.indexOf("android");var tt=J&&/iphone|ipad|ipod|ios/.test(J);J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J);var et,nt=J&&J.match(/firefox\/(\d+)/),rt={}.watch,ot=!1;if(Q)try{var it={};Object.defineProperty(it,"passive",{get:function(){ot=!0}}),window.addEventListener("test-passive",null,it)}catch(t){}var at=function(){return void 0===et&&(et=!Q&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),et},st=Q&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ut(t){return"function"==typeof t&&/native code/.test(t.toString())}var ct,lt="undefined"!=typeof Symbol&&ut(Symbol)&&"undefined"!=typeof Reflect&&ut(Reflect.ownKeys);ct="undefined"!=typeof Set&&ut(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ft=null;function pt(t){void 0===t&&(t=null),t||ft&&ft._scope.off(),ft=t,t&&t._scope.on()}var dt=function(){function t(t,e,n,r,o,i,a,s){this.tag=t,this.data=e,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),ht=function(t){void 0===t&&(t="");var e=new dt;return e.text=t,e.isComment=!0,e};function vt(t){return new dt(void 0,void 0,void 0,String(t))}function gt(t){var e=new dt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}"function"==typeof SuppressedError&&SuppressedError;var mt=0,yt=[],bt=function(){function t(){this._pending=!1,this.id=mt++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,yt.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){var e=this.subs.filter((function(t){return t}));for(var n=0,r=e.length;n0&&(oe((c=t(c,"".concat(n||"","_").concat(r)))[0])&&oe(f)&&(p[l]=vt(f.text+c[0].text),c.shift()),p.push.apply(p,c)):u(c)?oe(f)?p[l]=vt(f.text+c):""!==c&&p.push(vt(c)):oe(c)&&oe(f)?p[l]=vt(f.text+c.text):(s(e._isVList)&&a(c.tag)&&i(c.key)&&a(n)&&(c.key="__vlist".concat(n,"_").concat(r,"__")),p.push(c)));return p}(t):void 0}function oe(t){return a(t)&&a(t.text)&&!1===t.isComment}function ie(t,e){var n,r,i,s,u=null;if(o(t)||"string"==typeof t)for(u=new Array(t.length),n=0,r=t.length;n0,s=e?!!e.$stable:!a,u=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&o&&o!==r&&u===o.$key&&!a&&!o.$hasNormal)return o;for(var c in i={},e)e[c]&&"$"!==c[0]&&(i[c]=Oe(t,n,c,e[c]))}else i={};for(var l in n)l in i||(i[l]=Se(n,l));return e&&Object.isExtensible(e)&&(e._normalized=i),W(i,"$stable",s),W(i,"$key",u),W(i,"$hasNormal",a),i}function Oe(t,e,n,r){var i=function(){var e=ft;pt(t);var n=arguments.length?r.apply(null,arguments):r({}),i=(n=n&&"object"==typeof n&&!o(n)?[n]:re(n))&&n[0];return pt(e),n&&(!i||1===n.length&&i.isComment&&!xe(i))?void 0:n};return r.proxy&&Object.defineProperty(e,n,{get:i,enumerable:!0,configurable:!0}),i}function Se(t,e){return function(){return t[e]}}function Ce(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};W(e,"_v_attr_proxy",!0),je(e,t.$attrs,r,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||je(t._listenersProxy={},t.$listeners,r,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||Pe(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:E(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return qt(t,e,n)}))}}}function je(t,e,n,r,o){var i=!1;for(var a in e)a in t?e[a]!==n[a]&&(i=!0):(i=!0,$e(t,a,r,o));for(var a in t)a in e||(i=!0,delete t[a]);return i}function $e(t,e,n,r){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[r][e]}})}function Pe(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var Ee=null;function Ae(t,e){return(t.__esModule||lt&&"Module"===t[Symbol.toStringTag])&&(t=t.default),l(t)?e.extend(t):t}function Te(t){if(o(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(mn=function(){return yn.now()})}var bn=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function _n(){var t,e;for(gn=mn(),hn=!0,ln.sort(bn),vn=0;vnvn&&ln[n].id>t.id;)n--;ln.splice(n+1,0,t)}else ln.push(t);dn||(dn=!0,He(_n))}}function xn(t,e){if(t){for(var n=Object.create(null),r=lt?Reflect.ownKeys(t):Object.keys(t),o=0;o-1)if(i&&!k(o,"default"))a=!1;else if(""===a||a===P(t)){var u=Vn(String,o.type);(u<0||s-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!d(t)&&t.test(e)}function ir(t,e){var n=t.cache,r=t.keys,o=t._vnode,i=t.$vnode;for(var a in n){var s=n[a];if(s){var u=s.name;u&&!e(u)&&ar(n,a,r,o)}}i.componentOptions.children=void 0}function ar(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,w(n,e)}er.prototype._init=function(t){var e=this;e._uid=Zn++,e._isVue=!0,e.__v_skip=!0,e._scope=new Jt(!0),e._scope.parent=void 0,e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Dn(tr(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&rn(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=_e(e._renderChildren,o),t.$scopedSlots=n?ke(t.$parent,n.data.scopedSlots,t.$slots):r,t._c=function(e,n,r,o){return Le(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return Le(t,e,n,r,o,!0)};var i=n&&n.data;Tt(t,"$attrs",i&&i.attrs||r,null,!0),Tt(t,"$listeners",e._parentListeners||r,null,!0)}(e),cn(e,"beforeCreate",void 0,!1),function(t){var e=xn(t.$options.inject,t);e&&($t(!1),Object.keys(e).forEach((function(n){Tt(t,n,e[n])})),$t(!0))}(e),Hn(e),function(t){var e=t.$options.provide;if(e){var n=c(e)?e.call(t):e;if(!l(n))return;for(var r=Yt(t),o=lt?Reflect.ownKeys(n):Object.keys(n),i=0;i1?A(n):n;for(var r=A(arguments,1),o='event handler for "'.concat(t,'"'),i=0,a=n.length;iparseInt(this.max)&&ar(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)ar(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){ir(t,(function(t){return or(e,t)}))})),this.$watch("exclude",(function(e){ir(t,(function(t){return!or(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Te(t),n=e&&e.componentOptions;if(n){var r=rr(n),o=this.include,i=this.exclude;if(o&&(!r||!or(o,r))||i&&r&&or(i,r))return e;var a=this.cache,s=this.keys,u=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;a[u]?(e.componentInstance=a[u].componentInstance,w(s,u),s.push(u)):(this.vnodeToCache=e,this.keyToCache=u),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return z}};Object.defineProperty(t,"config",e),t.util={warn:An,extend:T,mergeOptions:Dn,defineReactive:Tt},t.set=Lt,t.delete=Rt,t.nextTick=He,t.observable=function(t){return At(t),t},t.options=Object.create(null),B.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,T(t.options.components,ur),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=A(arguments,1);return n.unshift(this),c(t.install)?t.install.apply(t,n):c(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Dn(this.options,t),this}}(t),nr(t),function(t){B.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&p(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&c(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(er),Object.defineProperty(er.prototype,"$isServer",{get:at}),Object.defineProperty(er.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(er,"FunctionalRenderContext",{value:kn}),er.version="2.7.16";var cr=b("style,class"),lr=b("input,textarea,option,select,progress"),fr=b("contenteditable,draggable,spellcheck"),pr=b("events,caret,typing,plaintext-only"),dr=b("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),hr="http://www.w3.org/1999/xlink",vr=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},gr=function(t){return vr(t)?t.slice(6,t.length):""},mr=function(t){return null==t||!1===t};function yr(t){for(var e=t.data,n=t,r=t;a(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=br(r.data,e));for(;a(n=n.parent);)n&&n.data&&(e=br(e,n.data));return function(t,e){if(a(t)||a(e))return _r(t,wr(e));return""}(e.staticClass,e.class)}function br(t,e){return{staticClass:_r(t.staticClass,e.staticClass),class:a(t.class)?[t.class,e.class]:e.class}}function _r(t,e){return t?e?t+" "+e:t:e||""}function wr(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?Gr(t,e,n):dr(e)?mr(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):fr(e)?t.setAttribute(e,function(t,e){return mr(e)||"false"===e?"false":"contenteditable"===t&&pr(e)?e:"true"}(e,n)):vr(e)?mr(n)?t.removeAttributeNS(hr,gr(e)):t.setAttributeNS(hr,e,n):Gr(t,e,n)}function Gr(t,e,n){if(mr(n))t.removeAttribute(e);else{if(Y&&!X&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Wr={create:zr,update:zr};function Hr(t,e){var n=e.elm,r=e.data,o=t.data;if(!(i(r.staticClass)&&i(r.class)&&(i(o)||i(o.staticClass)&&i(o.class)))){var s=yr(e),u=n._transitionClasses;a(u)&&(s=_r(s,wr(u))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Kr,Qr={create:Hr,update:Hr};function Jr(t,e,n){var r=Kr;return function o(){var i=e.apply(null,arguments);null!==i&&Zr(t,o,n,r)}}var Yr=Ue&&!(nt&&Number(nt[1])<=53);function Xr(t,e,n,r){if(Yr){var o=gn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Kr.addEventListener(t,e,ot?{capture:n,passive:r}:n)}function Zr(t,e,n,r){(r||Kr).removeEventListener(t,e._wrapper||e,n)}function to(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Kr=e.elm||t.elm,function(t){if(a(t.__r)){var e=Y?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}a(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),te(n,r,Xr,Zr,Jr,e.context),Kr=void 0}}var eo,no={create:to,update:to,destroy:function(t){return to(t,Tr)}};function ro(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,r,o=e.elm,u=t.data.domProps||{},c=e.data.domProps||{};for(n in(a(c.__ob__)||s(c._v_attr_proxy))&&(c=e.data.domProps=T({},c)),u)n in c||(o[n]="");for(n in c){if(r=c[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===u[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=r;var l=i(r)?"":String(r);oo(o,l)&&(o.value=l)}else if("innerHTML"===n&&Or(o.tagName)&&i(o.innerHTML)){(eo=eo||document.createElement("div")).innerHTML="".concat(r,"");for(var f=eo.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;f.firstChild;)o.appendChild(f.firstChild)}else if(r!==u[n])try{o[n]=r}catch(t){}}}}function oo(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(a(r)){if(r.number)return y(n)!==y(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var io={create:ro,update:ro},ao=O((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function so(t){var e=uo(t.style);return t.staticStyle?T(t.staticStyle,e):e}function uo(t){return Array.isArray(t)?L(t):"string"==typeof t?ao(t):t}var co,lo=/^--/,fo=/\s*!important$/,po=function(t,e,n){if(lo.test(e))t.style.setProperty(e,n);else if(fo.test(n))t.style.setProperty(P(e),n.replace(fo,""),"important");else{var r=vo(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(yo).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function _o(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(yo).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function wo(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&T(e,xo(t.name||"v")),T(e,t),e}return"string"==typeof t?xo(t):void 0}}var xo=O((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),ko=Q&&!X,Oo="transition",So="transitionend",Co="animation",jo="animationend";ko&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Oo="WebkitTransition",So="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Co="WebkitAnimation",jo="webkitAnimationEnd"));var $o=Q?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Po(t){$o((function(){$o(t)}))}function Eo(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),bo(t,e))}function Ao(t,e){t._transitionClasses&&w(t._transitionClasses,e),_o(t,e)}function To(t,e,n){var r=Ro(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?So:jo,u=0,c=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++u>=a&&c()};setTimeout((function(){u0&&(n="transition",l=a,f=i.length):"animation"===e?c>0&&(n="animation",l=c,f=u.length):f=(n=(l=Math.max(a,c))>0?a>c?"transition":"animation":null)?"transition"===n?i.length:u.length:0,{type:n,timeout:l,propCount:f,hasTransform:"transition"===n&&Lo.test(r[Oo+"Property"])}}function Io(t,e){for(;t.length1}function Bo(t,e){!0!==e.data.show&&No(e)}var qo=function(t){var e,n,r={},c=t.modules,l=t.nodeOps;for(e=0;eh?_(t,i(n[m+1])?null:n[m+1].elm,n,d,m,r):d>m&&x(e,f,h)}(f,v,m,n,c):a(m)?(a(t.text)&&l.setTextContent(f,""),_(f,null,m,0,m.length-1,n)):a(v)?x(v,0,v.length-1):a(t.text)&&l.setTextContent(f,""):t.text!==e.text&&l.setTextContent(f,e.text),a(h)&&a(d=h.hook)&&a(d=d.postpatch)&&d(t,e)}}}function C(t,e,n){if(s(n)&&a(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(N(Ho(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function Wo(t,e){return e.every((function(e){return!N(e,t)}))}function Ho(t){return"_value"in t?t._value:t.value}function Ko(t){t.target.composing=!0}function Qo(t){t.target.composing&&(t.target.composing=!1,Jo(t.target,"input"))}function Jo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Yo(t){return!t.componentInstance||t.data&&t.data.transition?t:Yo(t.componentInstance._vnode)}var Xo={model:zo,show:{bind:function(t,e,n){var r=e.value,o=(n=Yo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,No(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=Yo(n)).data&&n.data.transition?(n.data.show=!0,r?No(n,(function(){t.style.display=t.__vOriginalDisplay})):Do(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},Zo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ti(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?ti(Te(e.children)):t}function ei(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var r in o)e[C(r)]=o[r];return e}function ni(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var ri=function(t){return t.tag||xe(t)},oi=function(t){return"show"===t.name},ii={name:"transition",props:Zo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(ri)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=ti(o);if(!i)return o;if(this._leaving)return ni(t,o);var a="__transition-".concat(this._uid,"-");i.key=null==i.key?i.isComment?a+"comment":a+i.tag:u(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s=(i.data||(i.data={})).transition=ei(this),c=this._vnode,l=ti(c);if(i.data.directives&&i.data.directives.some(oi)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!xe(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=T({},s);if("out-in"===r)return this._leaving=!0,ee(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),ni(t,o);if("in-out"===r){if(xe(i))return c;var p,d=function(){p()};ee(s,"afterEnter",d),ee(s,"enterCancelled",d),ee(f,"delayLeave",(function(t){p=t}))}}return o}}},ai=T({tag:String,moveClass:String},Zo);function si(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function ui(t){t.data.newPos=t.elm.getBoundingClientRect()}function ci(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate(".concat(r,"px,").concat(o,"px)"),i.transitionDuration="0s"}}delete ai.mode;var li={Transition:ii,TransitionGroup:{props:ai,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=an(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ei(this),s=0;s-1?Cr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Cr[t]=/HTMLUnknownElement/.test(e.toString())},T(er.options.directives,Xo),T(er.options.components,li),er.prototype.__patch__=Q?qo:R,er.prototype.$mount=function(t,e){return function(t,e,n){var r;t.$el=e,t.$options.render||(t.$options.render=ht),cn(t,"beforeMount"),r=function(){t._update(t._render(),n)},new Ze(t,r,R,{before:function(){t._isMounted&&!t._isDestroyed&&cn(t,"beforeUpdate")}},!0),n=!1;var o=t._preWatchers;if(o)for(var i=0;i=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),c=e&&e.path||"/",l=u.path?Ai(u.path,c,n||o.append):c,f=function(t,e,n){void 0===e&&(e={});var r,o=n||yi;try{r=o(t||"")}catch(t){r={}}for(var i in e){var a=e[i];r[i]=Array.isArray(a)?a.map(mi):mi(a)}return r}(u.query,o.query,r&&r.options.parseQuery),p=o.hash||u.hash;return p&&"#"!==p.charAt(0)&&(p="#"+p),{_normalized:!0,path:l,query:f,hash:p}}var Xi,Zi=function(){},ta={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,s=o.href,u={},c=n.options.linkActiveClass,l=n.options.linkExactActiveClass,f=null==c?"router-link-active":c,p=null==l?"router-link-exact-active":l,d=null==this.activeClass?f:this.activeClass,h=null==this.exactActiveClass?p:this.exactActiveClass,v=a.redirectedFrom?wi(null,Yi(a.redirectedFrom),null,n):a;u[h]=Ci(r,v,this.exactPath),u[d]=this.exact||this.exactPath?u[h]:function(t,e){return 0===t.path.replace(_i,"/").indexOf(e.path.replace(_i,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,v);var g=u[h]?this.ariaCurrentValue:null,m=function(t){ea(t)&&(e.replace?n.replace(i,Zi):n.push(i,Zi))},y={click:ea};Array.isArray(this.event)?this.event.forEach((function(t){y[t]=m})):y[this.event]=m;var b={class:u},_=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:s,route:a,navigate:m,isActive:u[d],isExactActive:u[h]});if(_){if(1===_.length)return _[0];if(_.length>1||!_.length)return 0===_.length?t():t("span",{},_)}if("a"===this.tag)b.on=y,b.attrs={href:s,"aria-current":g};else{var w=function t(e){var n;if(e)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=Ji(l.path,s.params),u(l,s,a)}if(s.path){s.params={};for(var d=0;d-1}function Ta(t,e){return Aa(t)&&t._isRouter&&(null==e||t.type===e)}function La(t,e,n){var r=function(o){o>=t.length?n():t[o]?e(t[o],(function(){r(o+1)})):r(o+1)};r(0)}function Ra(t){return function(e,n,r){var o=!1,i=0,a=null;Ia(t,(function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){o=!0,i++;var u,c=Da((function(e){var o;((o=e).__esModule||Na&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:Xi.extend(e),n.components[s]=e,--i<=0&&r()})),l=Da((function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=Aa(t)?t:new Error(e),r(a))}));try{u=t(c,l)}catch(t){l(t)}if(u)if("function"==typeof u.then)u.then(c,l);else{var f=u.component;f&&"function"==typeof f.then&&f.then(c,l)}}})),o||r()}}function Ia(t,e){return Ma(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function Ma(t){return Array.prototype.concat.apply([],t)}var Na="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Da(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Ua=function(t,e){this.router=t,this.base=function(t){if(!t)if(na){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=ki,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Fa(t,e,n,r){var o=Ia(t,(function(t,r,o,i){var a=function(t,e){"function"!=typeof t&&(t=Xi.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,r,o,i)})):n(a,r,o,i)}));return Ma(r?o.reverse():o)}function Ba(t,e){if(e)return function(){return t.apply(e,arguments)}}Ua.prototype.listen=function(t){this.cb=t},Ua.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Ua.prototype.onError=function(t){this.errorCbs.push(t)},Ua.prototype.transitionTo=function(t,e,n){var r,o=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),e&&e(r),o.ensureURL(),o.router.afterHooks.forEach((function(t){t&&t(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(t){t(r)})))}),(function(t){n&&n(t),t&&!o.ready&&(Ta(t,Ca.redirected)&&i===ki||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(t)}))))}))},Ua.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current;this.pending=t;var i,a,s=function(t){!Ta(t)&&Aa(t)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},u=t.matched.length-1,c=o.matched.length-1;if(Ci(t,o)&&u===c&&t.matched[u]===o.matched[c])return this.ensureURL(),t.hash&&ha(this.router,o,t,!1),s(((a=Pa(i=o,t,Ca.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var l=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=ka&&n;r&&this.listeners.push(da());var o=function(){var n=t.current,o=za(t.base);t.current===ki&&o===t._startLocation||t.transitionTo(o,(function(t){r&&ha(e,t,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Oa(Ti(r.base+t.fullPath)),ha(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Sa(Ti(r.base+t.fullPath)),ha(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(za(this.base)!==this.current.fullPath){var e=Ti(this.base+this.current.fullPath);t?Oa(e):Sa(e)}},e.prototype.getCurrentLocation=function(){return za(this.base)},e}(Ua);function za(t){var e=window.location.pathname,n=e.toLowerCase(),r=t.toLowerCase();return!t||n!==r&&0!==n.indexOf(Ti(r+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Va=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=za(t);if(!/^\/#/.test(e))return window.location.replace(Ti(t+"/#"+e)),!0}(this.base)||Ga()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=ka&&e;n&&this.listeners.push(da());var r=function(){var e=t.current;Ga()&&t.transitionTo(Wa(),(function(r){n&&ha(t.router,r,e,!0),ka||Qa(r.fullPath)}))},o=ka?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ka(t.fullPath),ha(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Qa(t.fullPath),ha(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Wa()!==e&&(t?Ka(e):Qa(e))},e.prototype.getCurrentLocation=function(){return Wa()},e}(Ua);function Ga(){var t=Wa();return"/"===t.charAt(0)||(Qa("/"+t),!1)}function Wa(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Ha(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Ka(t){ka?Oa(Ha(t)):window.location.hash=t}function Qa(t){ka?Sa(Ha(t)):window.location.replace(Ha(t))}var Ja=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,t)}))}),(function(t){Ta(t,Ca.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Ua),Ya=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=ia(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!ka&&!1!==t.fallback,this.fallback&&(e="hash"),na||(e="abstract"),this.mode=e,e){case"history":this.history=new qa(this,t.base);break;case"hash":this.history=new Va(this,t.base,this.fallback);break;case"abstract":this.history=new Ja(this,t.base);break;default:0}},Xa={currentRoute:{configurable:!0}};Ya.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Xa.currentRoute.get=function(){return this.history&&this.history.current},Ya.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof qa||n instanceof Va){var r=function(t){n.setupListeners(),function(t){var r=n.current,o=e.options.scrollBehavior;ka&&o&&"fullPath"in t&&ha(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Ya.prototype.beforeEach=function(t){return ts(this.beforeHooks,t)},Ya.prototype.beforeResolve=function(t){return ts(this.resolveHooks,t)},Ya.prototype.afterEach=function(t){return ts(this.afterHooks,t)},Ya.prototype.onReady=function(t,e){this.history.onReady(t,e)},Ya.prototype.onError=function(t){this.history.onError(t)},Ya.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.push(t,e,n)}));this.history.push(t,e,n)},Ya.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.replace(t,e,n)}));this.history.replace(t,e,n)},Ya.prototype.go=function(t){this.history.go(t)},Ya.prototype.back=function(){this.go(-1)},Ya.prototype.forward=function(){this.go(1)},Ya.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Ya.prototype.resolve=function(t,e,n){var r=Yi(t,e=e||this.history.current,n,this),o=this.match(r,e),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?Ti(t+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},Ya.prototype.getRoutes=function(){return this.matcher.getRoutes()},Ya.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==ki&&this.history.transitionTo(this.history.getCurrentLocation())},Ya.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==ki&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Ya.prototype,Xa);var Za=Ya;function ts(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Ya.install=function t(e){if(!t.installed||Xi!==e){t.installed=!0,Xi=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",Pi),e.component("RouterLink",ta);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},Ya.version="3.6.5",Ya.isNavigationFailure=Ta,Ya.NavigationFailureType=Ca,Ya.START_LOCATION=ki,na&&window.Vue&&window.Vue.use(Ya);n(99);n(90),n(129);var es={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(13)]).then(n.bind(null,311)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(14)]).then(n.bind(null,260)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(22)]).then(n.bind(null,247)),"components/Home":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,291)),"components/NavLink":()=>n.e(24).then(n.bind(null,246)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(12)]).then(n.bind(null,274)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,307)),"components/Page":()=>Promise.all([n.e(0),n.e(11)]).then(n.bind(null,293)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,276)),"components/PageNav":()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,277)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,294)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(21)]).then(n.bind(null,297)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,275)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,261)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,258)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,316)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,312)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,313)),"layouts/404":()=>n.e(25).then(n.bind(null,314)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,308)),NotFound:()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(7)]).then(n.bind(null,315)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,308)),"components/Footer":()=>Promise.all([n.e(0),n.e(23)]).then(n.bind(null,296)),"components/SearchBox":()=>Promise.all([n.e(0),n.e(18)]).then(n.bind(null,292)),"components/SearchModal":()=>Promise.all([n.e(0),n.e(19)]).then(n.bind(null,295)),"layouts/NotFound":()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(7)]).then(n.bind(null,315))},ns={"v-c0a4944c":()=>n.e(26).then(n.bind(null,317)),"v-038b01fa":()=>n.e(27).then(n.bind(null,318)),"v-b8cb630c":()=>n.e(28).then(n.bind(null,319)),"v-1ba5eb6a":()=>n.e(29).then(n.bind(null,320)),"v-0a39d43a":()=>n.e(30).then(n.bind(null,321)),"v-c0082a28":()=>n.e(31).then(n.bind(null,322)),"v-ecd6cf40":()=>n.e(32).then(n.bind(null,323)),"v-90d4f50c":()=>n.e(33).then(n.bind(null,324)),"v-48851acc":()=>n.e(34).then(n.bind(null,325)),"v-9172688c":()=>n.e(35).then(n.bind(null,326)),"v-172dfc5a":()=>n.e(36).then(n.bind(null,327)),"v-30ab1e90":()=>n.e(37).then(n.bind(null,328)),"v-e0d70ecc":()=>n.e(39).then(n.bind(null,329)),"v-2fa5878c":()=>n.e(38).then(n.bind(null,330)),"v-6e1e3488":()=>n.e(40).then(n.bind(null,331)),"v-2151a890":()=>n.e(41).then(n.bind(null,332)),"v-ad4931e0":()=>n.e(43).then(n.bind(null,333)),"v-79f5d88c":()=>n.e(44).then(n.bind(null,334)),"v-4222367a":()=>n.e(45).then(n.bind(null,335)),"v-68d9087a":()=>n.e(47).then(n.bind(null,336)),"v-0cbb8c5a":()=>n.e(46).then(n.bind(null,337)),"v-2aed10ba":()=>n.e(48).then(n.bind(null,338)),"v-d8e9780c":()=>n.e(49).then(n.bind(null,339)),"v-657f8880":()=>n.e(51).then(n.bind(null,340)),"v-bf3acddc":()=>n.e(52).then(n.bind(null,341)),"v-c8f0091c":()=>n.e(54).then(n.bind(null,342)),"v-37cd1c0a":()=>n.e(50).then(n.bind(null,343)),"v-401d6fcc":()=>n.e(53).then(n.bind(null,344)),"v-a40710da":()=>n.e(55).then(n.bind(null,345)),"v-4d71a012":()=>n.e(56).then(n.bind(null,346)),"v-3798e78c":()=>n.e(57).then(n.bind(null,347)),"v-fc9b918c":()=>n.e(58).then(n.bind(null,348)),"v-2c88928c":()=>n.e(42).then(n.bind(null,349))};function rs(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const os=/-(\w)/g,is=rs(t=>t.replace(os,(t,e)=>e?e.toUpperCase():"")),as=/\B([A-Z])/g,ss=rs(t=>t.replace(as,"-$1").toLowerCase()),us=rs(t=>t.charAt(0).toUpperCase()+t.slice(1));function cs(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(us(is(e))):t(us(e))||t(ss(e))}const ls=Object.assign({},es,ns),fs=t=>ls[t],ps=t=>ns[t],ds=t=>es[t],hs=t=>er.component(t);function vs(t){return cs(ps,t)}function gs(t){return cs(ds,t)}function ms(t){return cs(fs,t)}function ys(t){return cs(hs,t)}function bs(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!ys(t)&&ms(t)){const e=await ms(t)();er.component(t,e.default)}}))}function _s(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var ws=n(87),xs=n.n(ws),ks=n(88),Os=n.n(ks),Ss={created(){if(this.siteMeta=this.$site.headTags.filter(([t])=>"meta"===t).map(([t,e])=>e),this.$ssrContext){const e=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(t=e)?t.map(t=>{let e="{e+=` ${n}="${Os()(t[n])}"`}),e+">"}).join("\n "):"",this.$ssrContext.canonicalLink=js(this.$canonicalUrl)}var t},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.getMergedMetaTags();this.currentMetaTags=$s(t,this.currentMetaTags)},getMergedMetaTags(){const t=this.$page.frontmatter.meta||[];return xs()([{name:"description",content:this.$description}],t,this.siteMeta,Ps)},updateCanonicalLink(){Cs(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",js(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){$s(null,this.currentMetaTags),Cs()}};function Cs(){const t=document.querySelector("link[rel='canonical']");t&&t.remove()}function js(t=""){return t?``:""}function $s(t,e){if(e&&[...e].filter(t=>t.parentNode===document.head).forEach(t=>document.head.removeChild(t)),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}function Ps(t){for(const e of["name","property","itemprop"])if(t.hasOwnProperty(e))return t[e]+e;return JSON.stringify(t)}var Es=n(89),As={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(Es)()((function(){this.setActiveHash()}),300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Ts=n(22),Ls=n.n(Ts),Rs={mounted(){Ls.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||er.component(t.name)||Ls.a.start(),n()}),this.$router.afterEach(()=>{Ls.a.done(),this.isSidebarOpen=!1})}},Is={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let t={};return t[this.options.align]="7.5px",t},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(t){let e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:null},copyToClipboard(t){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let t=document.createElement("textarea");document.body.appendChild(t),t.value=this.code,t.select(),document.execCommand("Copy"),t.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let t=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${t.r}, ${t.g}, ${t.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},Ms=(n(237),n(10)),Ns=Object(Ms.a)(Is,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"code-copy"},[e("svg",{class:t.iconClass,style:t.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:t.copyToClipboard}},[e("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),t._v(" "),e("path",{attrs:{fill:t.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),t._v(" "),e("span",{class:t.success?"success":"",style:t.alignStyle},[t._v("\n "+t._s(t.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,Ds=(n(238),[Ss,As,Rs,{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(t=>{if(t.classList.contains("code-copy-added"))return;let e=new(er.extend(Ns));e.options={align:"bottom",color:"#27b1ff",backgroundTransition:!0,backgroundColor:"#0075b8",successText:"Copied!",staticIcon:!1},e.code=t.innerText,e.parent=t,e.$mount(),t.classList.add("code-copy-added"),t.appendChild(e.$el)})},100)}}}]),Us={name:"GlobalLayout",computed:{layout(){const t=this.getLayout();return _s("layout",t),er.component(t)}},methods:{getLayout(){if(this.$page.path){const t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},Fs=Object(Ms.a)(Us,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}(Fs,"mixins",Ds);const Bs=[{name:"v-c0a4944c",path:"/arns/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-c0a4944c").then(n)}},{path:"/arns/index.html",redirect:"/arns/"},{path:"/arns.html",redirect:"/arns/"},{name:"v-038b01fa",path:"/arweave/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-038b01fa").then(n)}},{path:"/arweave/index.html",redirect:"/arweave/"},{path:"/arweave.html",redirect:"/arweave/"},{name:"v-b8cb630c",path:"/community-resources.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-b8cb630c").then(n)}},{name:"v-1ba5eb6a",path:"/arcss/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-1ba5eb6a").then(n)}},{path:"/arcss/index.html",redirect:"/arcss/"},{path:"/concepts/arcss.html",redirect:"/arcss/"},{name:"v-0a39d43a",path:"/concepts/sandboxing.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-0a39d43a").then(n)}},{name:"v-c0082a28",path:"/contribute.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-c0082a28").then(n)}},{name:"v-ecd6cf40",path:"/foundation/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-ecd6cf40").then(n)}},{path:"/foundation/index.html",redirect:"/foundation/"},{path:"/foundation.html",redirect:"/foundation/"},{name:"v-90d4f50c",path:"/gateway-network/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-90d4f50c").then(n)}},{path:"/gateway-network/index.html",redirect:"/gateway-network/"},{path:"/gateway-network.html",redirect:"/gateway-network/"},{name:"v-48851acc",path:"/gateways/ar-io-node/admin/admin-api.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-48851acc").then(n)}},{name:"v-9172688c",path:"/gateways/ar-io-node/advanced-config.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-9172688c").then(n)}},{name:"v-172dfc5a",path:"/gateways/ar-io-node/api.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-172dfc5a").then(n)}},{name:"v-30ab1e90",path:"/gateways/ar-io-node/arnsoip/observer.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-30ab1e90").then(n)}},{name:"v-e0d70ecc",path:"/gateways/ar-io-node/linux-setup.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-e0d70ecc").then(n)}},{name:"v-2fa5878c",path:"/gateways/ar-io-node/env.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-2fa5878c").then(n)}},{name:"v-6e1e3488",path:"/troubleshooting-observer/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-6e1e3488").then(n)}},{path:"/troubleshooting-observer/index.html",redirect:"/troubleshooting-observer/"},{path:"/gateways/ar-io-node/observer-troubleshooting.html",redirect:"/troubleshooting-observer/"},{name:"v-2151a890",path:"/gateways/ar-io-node/observer-upgrade.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-2151a890").then(n)}},{name:"v-ad4931e0",path:"/gateways/ar-io-node/overview/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-ad4931e0").then(n)}},{path:"/gateways/ar-io-node/overview/index.html",redirect:"/gateways/ar-io-node/overview/"},{path:"/gateways/ar-io-node/overview.html",redirect:"/gateways/ar-io-node/overview/"},{name:"v-79f5d88c",path:"/gateways/ar-io-node/release-notes.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-79f5d88c").then(n)}},{name:"v-4222367a",path:"/gateways/testnet/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-4222367a").then(n)}},{path:"/gateways/testnet/index.html",redirect:"/gateways/testnet/"},{path:"/gateways/ar-io-node/testnet.html",redirect:"/gateways/testnet/"},{name:"v-68d9087a",path:"/gateways/upgrade/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-68d9087a").then(n)}},{path:"/gateways/upgrade/index.html",redirect:"/gateways/upgrade/"},{path:"/gateways/ar-io-node/upgrading.html",redirect:"/gateways/upgrade/"},{name:"v-0cbb8c5a",path:"/troubleshooting/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-0cbb8c5a").then(n)}},{path:"/troubleshooting/index.html",redirect:"/troubleshooting/"},{path:"/gateways/ar-io-node/troubleshooting.html",redirect:"/troubleshooting/"},{name:"v-2aed10ba",path:"/gateways/ar-io-node/windows-setup.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-2aed10ba").then(n)}},{name:"v-d8e9780c",path:"/gateways/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-d8e9780c").then(n)}},{path:"/gateways/index.html",redirect:"/gateways/"},{path:"/gateways/gateways.html",redirect:"/gateways/"},{name:"v-657f8880",path:"/guides/arns/managing.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-657f8880").then(n)}},{name:"v-bf3acddc",path:"/guides/arns/overview.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-bf3acddc").then(n)}},{name:"v-c8f0091c",path:"/guides/graphql/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-c8f0091c").then(n)}},{path:"/guides/graphql/index.html",redirect:"/guides/graphql/"},{path:"/guides/gql.html",redirect:"/guides/graphql/"},{name:"v-37cd1c0a",path:"/glossary.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-37cd1c0a").then(n)}},{name:"v-401d6fcc",path:"/guides/arns/registering.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-401d6fcc").then(n)}},{name:"v-a40710da",path:"/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-a40710da").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-4d71a012",path:"/introduction/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-4d71a012").then(n)}},{path:"/introduction/index.html",redirect:"/introduction/"},{path:"/introduction.html",redirect:"/introduction/"},{name:"v-3798e78c",path:"/labs/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-3798e78c").then(n)}},{path:"/labs/index.html",redirect:"/labs/"},{path:"/labs.html",redirect:"/labs/"},{name:"v-fc9b918c",path:"/token/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-fc9b918c").then(n)}},{path:"/token/index.html",redirect:"/token/"},{path:"/token.html",redirect:"/token/"},{name:"v-2c88928c",path:"/gateways/ar-io-node/operation.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-2c88928c").then(n)}},{path:"*",component:Fs}],qs={title:"ar.io Docs",description:"ar.io documentation",base:"/docs/",headTags:[["meta",{name:"theme-color",content:"#3eaf7c"}],["meta",{name:"apple-mobile-web-app-capable",content:"yes"}],["meta",{name:"apple-mobile-web-app-status-bar-style",content:"black"}],["script",{src:"https://plausible.io/js/script.js",defer:!0,"data-domain":"docs.ar.io"}],["link",{rel:"stylesheet",href:"https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"}],["link",{rel:"stylesheet",href:"https://fonts.googleapis.com/css2?family=Dancing+Script:wght@400;500;600;700&display=swap"}]],pages:[{title:"Arweave Name System (ArNS)",frontmatter:{permalink:"/arns/"},regularPath:"/arns.html",relativePath:"arns.md",key:"v-c0a4944c",path:"/arns/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Name Registry",slug:"name-registry"},{level:3,title:"Name Validation Rules",slug:"name-validation-rules"},{level:2,title:"Arweave Name Token (ANT)",slug:"arweave-name-token-ant"},{level:3,title:"Under_Names",slug:"under-names"},{level:2,title:"Addressing Variable Market Conditions",slug:"addressing-variable-market-conditions"},{level:2,title:"Dynamic Pricing Model",slug:"dynamic-pricing-model"},{level:3,title:"Pricing Scenarios",slug:"pricing-scenarios"},{level:3,title:"Dynamic Pricing Mechanics",slug:"dynamic-pricing-mechanics"},{level:3,title:"Step Pricing Mechanics",slug:"step-pricing-mechanics"},{level:2,title:"Bid Initiated Dutch Auctions (BIDA)",slug:"bid-initiated-dutch-auctions-bida"},{level:3,title:"Auction Price Curve",slug:"auction-price-curve"}]},{title:"Arweave",frontmatter:{permalink:"/arweave/"},regularPath:"/arweave.html",relativePath:"arweave.md",key:"v-038b01fa",path:"/arweave/",headers:[{level:2,title:"The Permanence Pie",slug:"the-permanence-pie"},{level:2,title:"What Is Arweave",slug:"what-is-arweave"},{level:2,title:"Gateways",slug:"gateways"},{level:2,title:"SmartWeave",slug:"smartweave"},{level:2,title:"The Permaweb",slug:"the-permaweb"},{level:2,title:"References and Further Reading",slug:"references-and-further-reading"}]},{title:"Community Resources",frontmatter:{next:!1},regularPath:"/community-resources.html",relativePath:"community-resources.md",key:"v-b8cb630c",path:"/community-resources.html"},{title:"ARCSS",frontmatter:{permalink:"/arcss",prev:!1},regularPath:"/concepts/arcss.html",relativePath:"concepts/arcss.md",key:"v-1ba5eb6a",path:"/arcss/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Browser Integration",slug:"browser-integration"},{level:2,title:"Internal Application Integration",slug:"internal-application-integration"},{level:2,title:"Benefits of ARCSS Over Hardcoded Gateway Links",slug:"benefits-of-arcss-over-hardcoded-gateway-links"},{level:2,title:"Use Cases",slug:"use-cases"},{level:3,title:"Decentralized Web Hosting with Flexible Access",slug:"decentralized-web-hosting-with-flexible-access"},{level:3,title:"Digital Archives and Preservation with Enhanced Sharing",slug:"digital-archives-and-preservation-with-enhanced-sharing"},{level:3,title:"Media Sharing Platforms with Consistent Content Delivery",slug:"media-sharing-platforms-with-consistent-content-delivery"},{level:3,title:"Decentralized Applications (DApps) with Reliable Front-End Accessibility",slug:"decentralized-applications-dapps-with-reliable-front-end-accessibility"},{level:2,title:"How it Works",slug:"how-it-works"},{level:3,title:"Transaction ID",slug:"transaction-id"},{level:3,title:"ArNS",slug:"arns"},{level:2,title:"Wayfinder",slug:"wayfinder"},{level:3,title:"v0.0.10",slug:"v0-0-10"},{level:3,title:"Key Features",slug:"key-features"},{level:3,title:"Use Cases",slug:"use-cases-2"}]},{title:"Browser Sandboxing",frontmatter:{next:!1},regularPath:"/concepts/sandboxing.html",relativePath:"concepts/sandboxing.md",key:"v-0a39d43a",path:"/concepts/sandboxing.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"TLS and its Role in Browser Sandboxing",slug:"tls-and-its-role-in-browser-sandboxing"},{level:2,title:"Deriving Sandbox Value",slug:"deriving-sandbox-value"}]},{title:"Contributing to AR.IO Docs",frontmatter:{next:!1},regularPath:"/contribute.html",relativePath:"contribute.md",key:"v-c0082a28",path:"/contribute.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Initial Setup",slug:"initial-setup"},{level:3,title:"Fork the Repository",slug:"fork-the-repository"},{level:3,title:"Clone your Fork",slug:"clone-your-fork"},{level:3,title:"Link Upstream",slug:"link-upstream"},{level:3,title:"Install Dependencies for Docs Portal",slug:"install-dependencies-for-docs-portal"},{level:2,title:"Editing",slug:"editing"},{level:3,title:"Branches",slug:"branches"},{level:3,title:"What is Markdown?",slug:"what-is-markdown"},{level:3,title:"Frontmatter",slug:"frontmatter"},{level:3,title:"CSS",slug:"css"},{level:3,title:"Adding to the Sidebar",slug:"adding-to-the-sidebar"},{level:2,title:"Development and Deployment",slug:"development-and-deployment"},{level:3,title:"Launching Development Server",slug:"launching-development-server"},{level:3,title:"Building Static Files",slug:"building-static-files"},{level:3,title:"Creating Your Pull Request",slug:"creating-your-pull-request"}]},{title:"AR.IO Foundation",frontmatter:{permalink:"/foundation",prev:!1},regularPath:"/foundation.html",relativePath:"foundation.md",key:"v-ecd6cf40",path:"/foundation/",headers:[{level:2,title:"What is the AR.IO Foundation?",slug:"what-is-the-ar-io-foundation"},{level:2,title:"Guiding Philosophy",slug:"guiding-philosophy"}]},{title:"Gateway network",frontmatter:{permalink:"/gateway-network/"},regularPath:"/gateway-network.html",relativePath:"gateway-network.md",key:"v-90d4f50c",path:"/gateway-network/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Gateway Address Registry (GAR)",slug:"gateway-address-registry-gar"},{level:2,title:"Staking",slug:"staking"},{level:2,title:"Schema",slug:"schema"},{level:3,title:"Gateway Schema",slug:"gateway-schema"},{level:3,title:"Token Vault",slug:"token-vault"},{level:3,title:"Gateway Settings",slug:"gateway-settings"}]},{title:"AR.IO HTTP API Admin Endpoints",frontmatter:{},regularPath:"/gateways/ar-io-node/admin/admin-api.html",relativePath:"gateways/ar-io-node/admin/admin-api.md",key:"v-48851acc",path:"/gateways/ar-io-node/admin/admin-api.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Debug",slug:"debug"},{level:2,title:"Queue Transaction",slug:"queue-transaction"},{level:2,title:"Block Data",slug:"block-data"}]},{title:"Advanced Configuration",frontmatter:{},regularPath:"/gateways/ar-io-node/advanced-config.html",relativePath:"gateways/ar-io-node/advanced-config.md",key:"v-9172688c",path:"/gateways/ar-io-node/advanced-config.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Data Storage Location",slug:"data-storage-location"},{level:2,title:"Admin API Key",slug:"admin-api-key"},{level:2,title:"Wallet Association",slug:"wallet-association"},{level:2,title:"Unbundling",slug:"unbundling"},{level:2,title:"Content Moderation",slug:"content-moderation"}]},{title:"AR.IO HTTP API",frontmatter:{},regularPath:"/gateways/ar-io-node/api.html",relativePath:"gateways/ar-io-node/api.md",key:"v-172dfc5a",path:"/gateways/ar-io-node/api.html"},{title:"Observation and Incentives",frontmatter:{next:!1},regularPath:"/gateways/ar-io-node/arnsoip/observer.html",relativePath:"gateways/ar-io-node/arnsoip/observer.md",key:"v-30ab1e90",path:"/gateways/ar-io-node/arnsoip/observer.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Observation Protocol",slug:"observation-protocol"},{level:2,title:"Onchain Reports",slug:"onchain-reports"},{level:2,title:"Selection of Observers",slug:"selection-of-observers"},{level:3,title:"Criteria for Selection",slug:"criteria-for-selection"},{level:3,title:"Weight Calculation and Normalization",slug:"weight-calculation-and-normalization"},{level:3,title:"Random Selection Process",slug:"random-selection-process"},{level:2,title:"Performance Evaluation",slug:"performance-evaluation"},{level:2,title:"Reward Distribution",slug:"reward-distribution"},{level:3,title:"Distribution Based on Performance",slug:"distribution-based-on-performance"},{level:3,title:"Undistributed Rewards",slug:"undistributed-rewards"},{level:2,title:"Handling Inactive Gateways",slug:"handling-inactive-gateways"},{level:2,title:"Observer Report Details",slug:"observer-report-details"},{level:2,title:"General Information",slug:"general-information"},{level:2,title:"Overall Gateway Operator Assessment",slug:"overall-gateway-operator-assessment"},{level:2,title:"ArNS Assessments",slug:"arns-assessments"},{level:2,title:"Example Observation Report",slug:"example-observation-report"},{level:2,title:"Viewing Observation Reports",slug:"viewing-observation-reports"},{level:3,title:"example",slug:"example"}]},{title:"Linux Installation Instructions",frontmatter:{prev:!1,next:"./testnet",tags:["domain","url","setup","start","help","how to","ubuntu","testnet"]},regularPath:"/gateways/ar-io-node/linux-setup.html",relativePath:"gateways/ar-io-node/linux-setup.md",key:"v-e0d70ecc",path:"/gateways/ar-io-node/linux-setup.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"System Requirements",slug:"system-requirements"},{level:3,title:"Minimum requirements",slug:"minimum-requirements"},{level:3,title:"Recommended",slug:"recommended"},{level:2,title:"Install Packages",slug:"install-packages"},{level:3,title:"Required packages",slug:"required-packages"},{level:3,title:"Suggested packages",slug:"suggested-packages"},{level:2,title:"Install the Node",slug:"install-the-node"},{level:2,title:"Set up Networking",slug:"set-up-networking"}]},{title:"Environmental Variables",frontmatter:{},regularPath:"/gateways/ar-io-node/env.html",relativePath:"gateways/ar-io-node/env.md",key:"v-2fa5878c",path:"/gateways/ar-io-node/env.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Variables",slug:"variables"}]},{title:"Troubleshooting Observer",frontmatter:{permalink:"/troubleshooting-observer",next:!1},regularPath:"/gateways/ar-io-node/observer-troubleshooting.html",relativePath:"gateways/ar-io-node/observer-troubleshooting.md",key:"v-6e1e3488",path:"/troubleshooting-observer/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Observer not running and/or unable to connect",slug:"observer-not-running-and-or-unable-to-connect"},{level:3,title:"",slug:""},{level:2,title:"Observer wallet has no AR",slug:"observer-wallet-has-no-ar"},{level:3,title:"",slug:"-2"},{level:2,title:"Observer wallet ... does not match the 'observerWallet' set on the gateway ...",slug:"observer-wallet-does-not-match-the-observerwallet-set-on-the-gateway"},{level:3,title:"",slug:"-3"},{level:2,title:"Uncertain - confirm your OBSERVER_WALLET is set in the .env file and corresponding wallet is located in wallets/.json...",slug:"uncertain-confirm-your-observer-wallet-is-set-in-the-env-file-and-corresponding-wallet-is-located-in-wallets-address-json"},{level:3,title:"",slug:"-4"}]},{title:"Upgrading to the Observer Module",frontmatter:{},regularPath:"/gateways/ar-io-node/observer-upgrade.html",relativePath:"gateways/ar-io-node/observer-upgrade.md",key:"v-2151a890",path:"/gateways/ar-io-node/observer-upgrade.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Supply a Keyfile",slug:"supply-a-keyfile"},{level:2,title:"Environmental variables",slug:"environmental-variables"}]},{title:"Overview",frontmatter:{permalink:"/gateways/ar-io-node/overview"},regularPath:"/gateways/ar-io-node/overview.html",relativePath:"gateways/ar-io-node/overview.md",key:"v-ad4931e0",path:"/gateways/ar-io-node/overview/"},{title:"ar.io Release Notes",frontmatter:{next:!1},regularPath:"/gateways/ar-io-node/release-notes.html",relativePath:"gateways/ar-io-node/release-notes.md",key:"v-79f5d88c",path:"/gateways/ar-io-node/release-notes.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"[Release 6] - 2024-01-29",slug:"release-6-2024-01-29"},{level:2,title:"[Release 5] - 2024-01-25",slug:"release-5-2024-01-25"},{level:2,title:"[Release 4] - 2024-01-11",slug:"release-4-2024-01-11"},{level:2,title:"[Release 3] - 2023-12-05",slug:"release-3-2023-12-05"}]},{title:"Join the AR.IO Testnet",frontmatter:{prev:!1,permalink:"/gateways/testnet/",tags:["testnet","join","application","jwk","qty","fqdn","label","note","properties"]},regularPath:"/gateways/ar-io-node/testnet.html",relativePath:"gateways/ar-io-node/testnet.md",key:"v-4222367a",path:"/gateways/testnet/",headers:[{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Submit an Application",slug:"submit-an-application"},{level:2,title:"Setting up and Running the Join Script",slug:"setting-up-and-running-the-join-script"},{level:3,title:"Clone the Repo",slug:"clone-the-repo"},{level:3,title:"Install dependencies",slug:"install-dependencies"},{level:3,title:"Provide Wallet Keys",slug:"provide-wallet-keys"},{level:3,title:"Configure your settings",slug:"configure-your-settings"},{level:3,title:"Run the Script",slug:"run-the-script"},{level:2,title:"Update Your Gateway Settings",slug:"update-your-gateway-settings"}]},{title:"Upgrading your Gateway",frontmatter:{permalink:"/gateways/upgrade/"},regularPath:"/gateways/ar-io-node/upgrading.html",relativePath:"gateways/ar-io-node/upgrading.md",key:"v-68d9087a",path:"/gateways/upgrade/",headers:[{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Checking your Release Number",slug:"checking-your-release-number"},{level:2,title:"Upgrade Steps",slug:"upgrade-steps"}]},{title:"Troubleshooting",frontmatter:{permalink:"/troubleshooting"},regularPath:"/gateways/ar-io-node/troubleshooting.html",relativePath:"gateways/ar-io-node/troubleshooting.md",key:"v-0cbb8c5a",path:"/troubleshooting/",headers:[{level:2,title:"My Gateway Seems to be Running but...",slug:"my-gateway-seems-to-be-running-but"},{level:3,title:"",slug:""},{level:3,title:"",slug:"-2"},{level:3,title:"",slug:"-3"},{level:3,title:"",slug:"-4"},{level:3,title:"",slug:"-5"},{level:3,title:"",slug:"-6"},{level:3,title:"",slug:"-7"},{level:3,title:"",slug:"-8"},{level:2,title:"My Gateway was Running, but now it isn't",slug:"my-gateway-was-running-but-now-it-isn-t"},{level:3,title:"",slug:"-9"},{level:2,title:"I am having Trouble Getting my Gateway Set up",slug:"i-am-having-trouble-getting-my-gateway-set-up"},{level:3,title:"",slug:"-10"},{level:3,title:"",slug:"-11"},{level:3,title:"",slug:"-12"},{level:2,title:"Quick Lookup",slug:"quick-lookup"}]},{title:"Windows Installation Instructions",frontmatter:{prev:!1,next:"./testnet"},regularPath:"/gateways/ar-io-node/windows-setup.html",relativePath:"gateways/ar-io-node/windows-setup.md",key:"v-2aed10ba",path:"/gateways/ar-io-node/windows-setup.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Install Required Packages",slug:"install-required-packages"},{level:2,title:"Clone the Repository",slug:"clone-the-repository"},{level:2,title:"Create the Environment File",slug:"create-the-environment-file"},{level:2,title:"Supply Your Observer Wallet Keyfile:",slug:"supply-your-observer-wallet-keyfile"},{level:2,title:"Start the Docker Containers",slug:"start-the-docker-containers"},{level:2,title:"Test Localhost",slug:"test-localhost"},{level:2,title:"Set Up Router Port Forwarding",slug:"set-up-router-port-forwarding"},{level:2,title:"Install and Configure NGINX Docker",slug:"install-and-configure-nginx-docker"}]},{title:"Gateway Architecture",frontmatter:{permalink:"/gateways/"},regularPath:"/gateways/gateways.html",relativePath:"gateways/gateways.md",key:"v-d8e9780c",path:"/gateways/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"AR.IO Gateway Benefits",slug:"ar-io-gateway-benefits"},{level:2,title:"Gateway Modularity",slug:"gateway-modularity"},{level:2,title:"ARNS Indexing and Routing",slug:"arns-indexing-and-routing"},{level:2,title:"Content Moderation",slug:"content-moderation"}]},{title:"Managing ArNS Assets",frontmatter:{next:!1},regularPath:"/guides/arns/managing.html",relativePath:"guides/arns/managing.md",key:"v-657f8880",path:"/guides/arns/managing.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Names",slug:"names"},{level:2,title:"ANTs",slug:"ants"}]},{title:"Arweave Name System (ArNS)",frontmatter:{prev:!1},regularPath:"/guides/arns/overview.html",relativePath:"guides/arns/overview.md",key:"v-bf3acddc",path:"/guides/arns/overview.html",headers:[{level:2,title:"Overview",slug:"overview"}]},{title:"GraphQL",frontmatter:{permalink:"/guides/graphql/"},regularPath:"/guides/gql.html",relativePath:"guides/gql.md",key:"v-c8f0091c",path:"/guides/graphql/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Constructing a Query",slug:"constructing-a-query"},{level:3,title:"Basic Syntax",slug:"basic-syntax"},{level:3,title:"Customizing Searches with Tags",slug:"customizing-searches-with-tags"},{level:3,title:"Understanding Edges and Nodes",slug:"understanding-edges-and-nodes"},{level:3,title:"Pagination",slug:"pagination"},{level:3,title:"General Tips for Optimizing Queries",slug:"general-tips-for-optimizing-queries"},{level:2,title:"Making a Query",slug:"making-a-query"},{level:3,title:"GraphQL Playground",slug:"graphql-playground"},{level:3,title:"Using an API",slug:"using-an-api"},{level:3,title:"Using an SDK",slug:"using-an-sdk"}]},{title:"Glossary",frontmatter:{prev:!1,next:!1},regularPath:"/glossary.html",relativePath:"glossary.md",key:"v-37cd1c0a",path:"/glossary.html"},{title:"Registering an ArNS name",frontmatter:{},regularPath:"/guides/arns/registering.html",relativePath:"guides/arns/registering.md",key:"v-401d6fcc",path:"/guides/arns/registering.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Connect Your Wallet",slug:"connect-your-wallet"},{level:2,title:"Checking Availability",slug:"checking-availability"},{level:2,title:"Configure Your Purchase",slug:"configure-your-purchase"},{level:2,title:"Confirm Your Purchase",slug:"confirm-your-purchase"},{level:2,title:"Auctions",slug:"auctions"}]},{title:"Welcome to the Permaweb",frontmatter:{homepage:!0},regularPath:"/",relativePath:"index.md",key:"v-a40710da",path:"/"},{title:"Introduction",frontmatter:{permalink:"/introduction/",prev:!1},regularPath:"/introduction.html",relativePath:"introduction.md",key:"v-4d71a012",path:"/introduction/",headers:[{level:2,title:"TL;DR",slug:"tl-dr"},{level:2,title:"What is AR.IO",slug:"what-is-ar-io"},{level:2,title:"Why AR.IO ?",slug:"why-ar-io"}]},{title:"AR.IO Labs",frontmatter:{permalink:"/labs/"},regularPath:"/labs.html",relativePath:"labs.md",key:"v-3798e78c",path:"/labs/",headers:[{level:2,title:"What is AR.IO Labs?",slug:"what-is-ar-io-labs"}]},{title:"The IO Token",frontmatter:{permalink:"/token/"},regularPath:"/token.html",relativePath:"token.md",key:"v-fc9b918c",path:"/token/",headers:[{level:2,title:"Overview",slug:"overview"}]},{title:"Operation",frontmatter:{prev:"./windows-setup",next:"./linux-setup"},regularPath:"/gateways/ar-io-node/operation.html",relativePath:"gateways/ar-io-node/operation.md",key:"v-2c88928c",path:"/gateways/ar-io-node/operation.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:3,title:"Errors",slug:"errors"},{level:3,title:"Authentication",slug:"authentication"},{level:2,title:"Cache",slug:"cache"},{level:3,title:"Transaction",slug:"transaction"},{level:3,title:"Raw Transation",slug:"raw-transation"},{level:2,title:"Network",slug:"network"},{level:3,title:"Network information",slug:"network-information"},{level:3,title:"Peer information",slug:"peer-information"},{level:3,title:"Network Block Height",slug:"network-block-height"},{level:2,title:"Pricing",slug:"pricing"},{level:3,title:"Upload",slug:"upload"},{level:3,title:"Transfer and Upload",slug:"transfer-and-upload"},{level:2,title:"Wallets",slug:"wallets"},{level:3,title:"Balance",slug:"balance"},{level:3,title:"Last Transaction",slug:"last-transaction"},{level:2,title:"Blocks",slug:"blocks"},{level:3,title:"Current Block",slug:"current-block"},{level:3,title:"Specific Block",slug:"specific-block"},{level:3,title:"Get Block by Hash",slug:"get-block-by-hash"},{level:2,title:"Transactions",slug:"transactions"},{level:3,title:"Pending",slug:"pending"},{level:3,title:"Transaction",slug:"transaction-2"},{level:3,title:"Offset",slug:"offset"},{level:3,title:"Status",slug:"status"},{level:2,title:"Chunks",slug:"chunks"}]}],themeConfig:{footer:!0,fontFamily:{base:["Dancing Script","cursive"]},searchPlaceholder:"Search",repo:"",editLinks:!1,docsDir:"",editLinkText:"",lastUpdated:!1,initialOpenGroupIndex:-1,logo:"/docs//images/logo-party.gif",sidebar:{"/":[{title:"Welcome",path:"/"},{title:"White Paper",path:"https://arweave.net/lNjWn3LpyhKC95Kqe-x8X2qgju0j98MhucdDKK85vc4"},{title:"Network Overview",children:[{title:"Introduction",path:"/introduction"},{title:"Arweave and the Permaweb",path:"/arweave"},{title:"The IO Token",path:"/token.md"},{title:"Gateway Architecture",path:"/gateways/gateways"},{title:"Gateway Network",path:"/gateway-network"},{title:"Arweave name System (ArNS)",path:"/arns.md"},{title:"Observation and Incentive Protocol",path:"/gateways/ar-io-node/arnsoip/observer"}]},{title:"Gateway Operators",children:[{title:"Getting Started",children:[{title:"Overview",path:"/gateways/ar-io-node/overview"},{title:"Setting up on Windows",path:"/gateways/ar-io-node/windows-setup"},{title:"Setting up on Linux",path:"/gateways/ar-io-node/linux-setup"},{title:"Join the Network",path:"/gateways/ar-io-node/testnet"},{title:"Upgrading",path:"/gateways/ar-io-node/upgrading"}]},{title:"Advanced Configurations",path:"/gateways/ar-io-node/advanced-config"},{title:"Environmental Variables",path:"/gateways/ar-io-node/env"},{title:"AR.IO HTTP API",path:"/gateways/ar-io-node/api"},{title:"AR.IO Admin API",path:"/gateways/ar-io-node/admin/admin-api"},{title:"Upgrading to Observer",path:"/gateways/ar-io-node/observer-upgrade"},{title:"Troubleshooting",path:"/gateways/ar-io-node/troubleshooting"},{title:"Troubleshooting Observer",path:"/gateways/ar-io-node/observer-troubleshooting"},{title:"Release Notes",path:"/gateways/ar-io-node/release-notes"}]},{title:"Ecosystem and Community",children:[{title:"AR.IO Foundation",path:"/foundation"},{title:"AR.IO Labs",path:"/labs"},{title:"Community Resources",path:"/community-resources"}]},{title:"Glossary",path:"/glossary"},{title:"Concepts",children:[{title:"ar:// (ARCSS)",path:"/concepts/arcss"},{title:"Browser Sandboxing",path:"/concepts/sandboxing"}]},{title:"Guides",children:[{title:"Arweave Name System (ArNS)",children:[{title:"ArNS App",children:[{title:"Overview",path:"/guides/arns/overview"},{title:"Registering a Name",path:"/guides/arns/registering"},{title:"Managing Assets",path:"/guides/arns/managing"}]}]},{title:"GraphQL",path:"/guides/gql"}]}]}}};function zs(){return"undefined"!=typeof navigator&&"undefined"!=typeof window?window:"undefined"!=typeof global?global:{}}const Vs="function"==typeof Proxy;let Gs,Ws;function Hs(){return void 0!==Gs||("undefined"!=typeof window&&window.performance?(Gs=!0,Ws=window.performance):"undefined"!=typeof global&&(null===(t=global.perf_hooks)||void 0===t?void 0:t.performance)?(Gs=!0,Ws=global.perf_hooks.performance):Gs=!1),Gs?Ws.now():Date.now();var t}class Ks{constructor(t,e){this.target=null,this.targetQueue=[],this.onQueue=[],this.plugin=t,this.hook=e;const n={};if(t.settings)for(const e in t.settings){const r=t.settings[e];n[e]=r.defaultValue}const r="__vue-devtools-plugin-settings__"+t.id;let o=Object.assign({},n);try{const t=localStorage.getItem(r),e=JSON.parse(t);Object.assign(o,e)}catch(t){}this.fallbacks={getSettings:()=>o,setSettings(t){try{localStorage.setItem(r,JSON.stringify(t))}catch(t){}o=t},now:()=>Hs()},e&&e.on("plugin:settings:set",(t,e)=>{t===this.plugin.id&&this.fallbacks.setSettings(e)}),this.proxiedOn=new Proxy({},{get:(t,e)=>this.target?this.target.on[e]:(...t)=>{this.onQueue.push({method:e,args:t})}}),this.proxiedTarget=new Proxy({},{get:(t,e)=>this.target?this.target[e]:"on"===e?this.proxiedOn:Object.keys(this.fallbacks).includes(e)?(...t)=>(this.targetQueue.push({method:e,args:t,resolve:()=>{}}),this.fallbacks[e](...t)):(...t)=>new Promise(n=>{this.targetQueue.push({method:e,args:t,resolve:n})})})}async setRealTarget(t){this.target=t;for(const t of this.onQueue)this.target.on[t.method](...t.args);for(const t of this.targetQueue)t.resolve(await this.target[t.method](...t.args))}}function Qs(t,e){const n=t,r=zs(),o=zs().__VUE_DEVTOOLS_GLOBAL_HOOK__,i=Vs&&n.enableEarlyProxy;if(!o||!r.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__&&i){const t=i?new Ks(n,o):null;(r.__VUE_DEVTOOLS_PLUGINS__=r.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:n,setupFn:e,proxy:t}),t&&e(t.proxiedTarget)}else o.emit("devtools-plugin:setup",t,e)} +var r=Object.freeze({}),o=Array.isArray;function i(t){return null==t}function a(t){return null!=t}function s(t){return!0===t}function u(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function c(t){return"function"==typeof t}function l(t){return null!==t&&"object"==typeof t}var f=Object.prototype.toString;function p(t){return"[object Object]"===f.call(t)}function d(t){return"[object RegExp]"===f.call(t)}function h(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function v(t){return a(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function g(t){return null==t?"":Array.isArray(t)||p(t)&&t.toString===f?JSON.stringify(t,m,2):String(t)}function m(t,e){return e&&e.__v_isRef?e.value:e}function y(t){var e=parseFloat(t);return isNaN(e)?t:e}function b(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(r,1)}}var x=Object.prototype.hasOwnProperty;function k(t,e){return x.call(t,e)}function O(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var S=/-(\w)/g,C=O((function(t){return t.replace(S,(function(t,e){return e?e.toUpperCase():""}))})),j=O((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),$=/\B([A-Z])/g,P=O((function(t){return t.replace($,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function A(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function T(t,e){for(var n in e)t[n]=e[n];return t}function L(t){for(var e={},n=0;n0,Z=J&&J.indexOf("edge/")>0;J&&J.indexOf("android");var tt=J&&/iphone|ipad|ipod|ios/.test(J);J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J);var et,nt=J&&J.match(/firefox\/(\d+)/),rt={}.watch,ot=!1;if(Q)try{var it={};Object.defineProperty(it,"passive",{get:function(){ot=!0}}),window.addEventListener("test-passive",null,it)}catch(t){}var at=function(){return void 0===et&&(et=!Q&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),et},st=Q&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ut(t){return"function"==typeof t&&/native code/.test(t.toString())}var ct,lt="undefined"!=typeof Symbol&&ut(Symbol)&&"undefined"!=typeof Reflect&&ut(Reflect.ownKeys);ct="undefined"!=typeof Set&&ut(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ft=null;function pt(t){void 0===t&&(t=null),t||ft&&ft._scope.off(),ft=t,t&&t._scope.on()}var dt=function(){function t(t,e,n,r,o,i,a,s){this.tag=t,this.data=e,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),ht=function(t){void 0===t&&(t="");var e=new dt;return e.text=t,e.isComment=!0,e};function vt(t){return new dt(void 0,void 0,void 0,String(t))}function gt(t){var e=new dt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}"function"==typeof SuppressedError&&SuppressedError;var mt=0,yt=[],bt=function(){function t(){this._pending=!1,this.id=mt++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,yt.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){var e=this.subs.filter((function(t){return t}));for(var n=0,r=e.length;n0&&(oe((c=t(c,"".concat(n||"","_").concat(r)))[0])&&oe(f)&&(p[l]=vt(f.text+c[0].text),c.shift()),p.push.apply(p,c)):u(c)?oe(f)?p[l]=vt(f.text+c):""!==c&&p.push(vt(c)):oe(c)&&oe(f)?p[l]=vt(f.text+c.text):(s(e._isVList)&&a(c.tag)&&i(c.key)&&a(n)&&(c.key="__vlist".concat(n,"_").concat(r,"__")),p.push(c)));return p}(t):void 0}function oe(t){return a(t)&&a(t.text)&&!1===t.isComment}function ie(t,e){var n,r,i,s,u=null;if(o(t)||"string"==typeof t)for(u=new Array(t.length),n=0,r=t.length;n0,s=e?!!e.$stable:!a,u=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&o&&o!==r&&u===o.$key&&!a&&!o.$hasNormal)return o;for(var c in i={},e)e[c]&&"$"!==c[0]&&(i[c]=Oe(t,n,c,e[c]))}else i={};for(var l in n)l in i||(i[l]=Se(n,l));return e&&Object.isExtensible(e)&&(e._normalized=i),W(i,"$stable",s),W(i,"$key",u),W(i,"$hasNormal",a),i}function Oe(t,e,n,r){var i=function(){var e=ft;pt(t);var n=arguments.length?r.apply(null,arguments):r({}),i=(n=n&&"object"==typeof n&&!o(n)?[n]:re(n))&&n[0];return pt(e),n&&(!i||1===n.length&&i.isComment&&!xe(i))?void 0:n};return r.proxy&&Object.defineProperty(e,n,{get:i,enumerable:!0,configurable:!0}),i}function Se(t,e){return function(){return t[e]}}function Ce(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};W(e,"_v_attr_proxy",!0),je(e,t.$attrs,r,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||je(t._listenersProxy={},t.$listeners,r,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||Pe(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:E(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return qt(t,e,n)}))}}}function je(t,e,n,r,o){var i=!1;for(var a in e)a in t?e[a]!==n[a]&&(i=!0):(i=!0,$e(t,a,r,o));for(var a in t)a in e||(i=!0,delete t[a]);return i}function $e(t,e,n,r){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[r][e]}})}function Pe(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var Ee=null;function Ae(t,e){return(t.__esModule||lt&&"Module"===t[Symbol.toStringTag])&&(t=t.default),l(t)?e.extend(t):t}function Te(t){if(o(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(mn=function(){return yn.now()})}var bn=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function _n(){var t,e;for(gn=mn(),hn=!0,ln.sort(bn),vn=0;vnvn&&ln[n].id>t.id;)n--;ln.splice(n+1,0,t)}else ln.push(t);dn||(dn=!0,He(_n))}}function xn(t,e){if(t){for(var n=Object.create(null),r=lt?Reflect.ownKeys(t):Object.keys(t),o=0;o-1)if(i&&!k(o,"default"))a=!1;else if(""===a||a===P(t)){var u=Vn(String,o.type);(u<0||s-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!d(t)&&t.test(e)}function ir(t,e){var n=t.cache,r=t.keys,o=t._vnode,i=t.$vnode;for(var a in n){var s=n[a];if(s){var u=s.name;u&&!e(u)&&ar(n,a,r,o)}}i.componentOptions.children=void 0}function ar(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,w(n,e)}er.prototype._init=function(t){var e=this;e._uid=Zn++,e._isVue=!0,e.__v_skip=!0,e._scope=new Jt(!0),e._scope.parent=void 0,e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Dn(tr(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&rn(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=_e(e._renderChildren,o),t.$scopedSlots=n?ke(t.$parent,n.data.scopedSlots,t.$slots):r,t._c=function(e,n,r,o){return Le(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return Le(t,e,n,r,o,!0)};var i=n&&n.data;Tt(t,"$attrs",i&&i.attrs||r,null,!0),Tt(t,"$listeners",e._parentListeners||r,null,!0)}(e),cn(e,"beforeCreate",void 0,!1),function(t){var e=xn(t.$options.inject,t);e&&($t(!1),Object.keys(e).forEach((function(n){Tt(t,n,e[n])})),$t(!0))}(e),Hn(e),function(t){var e=t.$options.provide;if(e){var n=c(e)?e.call(t):e;if(!l(n))return;for(var r=Yt(t),o=lt?Reflect.ownKeys(n):Object.keys(n),i=0;i1?A(n):n;for(var r=A(arguments,1),o='event handler for "'.concat(t,'"'),i=0,a=n.length;iparseInt(this.max)&&ar(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)ar(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){ir(t,(function(t){return or(e,t)}))})),this.$watch("exclude",(function(e){ir(t,(function(t){return!or(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Te(t),n=e&&e.componentOptions;if(n){var r=rr(n),o=this.include,i=this.exclude;if(o&&(!r||!or(o,r))||i&&r&&or(i,r))return e;var a=this.cache,s=this.keys,u=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;a[u]?(e.componentInstance=a[u].componentInstance,w(s,u),s.push(u)):(this.vnodeToCache=e,this.keyToCache=u),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return z}};Object.defineProperty(t,"config",e),t.util={warn:An,extend:T,mergeOptions:Dn,defineReactive:Tt},t.set=Lt,t.delete=Rt,t.nextTick=He,t.observable=function(t){return At(t),t},t.options=Object.create(null),B.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,T(t.options.components,ur),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=A(arguments,1);return n.unshift(this),c(t.install)?t.install.apply(t,n):c(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Dn(this.options,t),this}}(t),nr(t),function(t){B.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&p(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&c(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(er),Object.defineProperty(er.prototype,"$isServer",{get:at}),Object.defineProperty(er.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(er,"FunctionalRenderContext",{value:kn}),er.version="2.7.16";var cr=b("style,class"),lr=b("input,textarea,option,select,progress"),fr=b("contenteditable,draggable,spellcheck"),pr=b("events,caret,typing,plaintext-only"),dr=b("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),hr="http://www.w3.org/1999/xlink",vr=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},gr=function(t){return vr(t)?t.slice(6,t.length):""},mr=function(t){return null==t||!1===t};function yr(t){for(var e=t.data,n=t,r=t;a(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=br(r.data,e));for(;a(n=n.parent);)n&&n.data&&(e=br(e,n.data));return function(t,e){if(a(t)||a(e))return _r(t,wr(e));return""}(e.staticClass,e.class)}function br(t,e){return{staticClass:_r(t.staticClass,e.staticClass),class:a(t.class)?[t.class,e.class]:e.class}}function _r(t,e){return t?e?t+" "+e:t:e||""}function wr(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?Gr(t,e,n):dr(e)?mr(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):fr(e)?t.setAttribute(e,function(t,e){return mr(e)||"false"===e?"false":"contenteditable"===t&&pr(e)?e:"true"}(e,n)):vr(e)?mr(n)?t.removeAttributeNS(hr,gr(e)):t.setAttributeNS(hr,e,n):Gr(t,e,n)}function Gr(t,e,n){if(mr(n))t.removeAttribute(e);else{if(Y&&!X&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Wr={create:zr,update:zr};function Hr(t,e){var n=e.elm,r=e.data,o=t.data;if(!(i(r.staticClass)&&i(r.class)&&(i(o)||i(o.staticClass)&&i(o.class)))){var s=yr(e),u=n._transitionClasses;a(u)&&(s=_r(s,wr(u))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Kr,Qr={create:Hr,update:Hr};function Jr(t,e,n){var r=Kr;return function o(){var i=e.apply(null,arguments);null!==i&&Zr(t,o,n,r)}}var Yr=Ue&&!(nt&&Number(nt[1])<=53);function Xr(t,e,n,r){if(Yr){var o=gn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Kr.addEventListener(t,e,ot?{capture:n,passive:r}:n)}function Zr(t,e,n,r){(r||Kr).removeEventListener(t,e._wrapper||e,n)}function to(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Kr=e.elm||t.elm,function(t){if(a(t.__r)){var e=Y?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}a(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),te(n,r,Xr,Zr,Jr,e.context),Kr=void 0}}var eo,no={create:to,update:to,destroy:function(t){return to(t,Tr)}};function ro(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,r,o=e.elm,u=t.data.domProps||{},c=e.data.domProps||{};for(n in(a(c.__ob__)||s(c._v_attr_proxy))&&(c=e.data.domProps=T({},c)),u)n in c||(o[n]="");for(n in c){if(r=c[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===u[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=r;var l=i(r)?"":String(r);oo(o,l)&&(o.value=l)}else if("innerHTML"===n&&Or(o.tagName)&&i(o.innerHTML)){(eo=eo||document.createElement("div")).innerHTML="".concat(r,"");for(var f=eo.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;f.firstChild;)o.appendChild(f.firstChild)}else if(r!==u[n])try{o[n]=r}catch(t){}}}}function oo(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(a(r)){if(r.number)return y(n)!==y(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var io={create:ro,update:ro},ao=O((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function so(t){var e=uo(t.style);return t.staticStyle?T(t.staticStyle,e):e}function uo(t){return Array.isArray(t)?L(t):"string"==typeof t?ao(t):t}var co,lo=/^--/,fo=/\s*!important$/,po=function(t,e,n){if(lo.test(e))t.style.setProperty(e,n);else if(fo.test(n))t.style.setProperty(P(e),n.replace(fo,""),"important");else{var r=vo(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(yo).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function _o(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(yo).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function wo(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&T(e,xo(t.name||"v")),T(e,t),e}return"string"==typeof t?xo(t):void 0}}var xo=O((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),ko=Q&&!X,Oo="transition",So="transitionend",Co="animation",jo="animationend";ko&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Oo="WebkitTransition",So="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Co="WebkitAnimation",jo="webkitAnimationEnd"));var $o=Q?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Po(t){$o((function(){$o(t)}))}function Eo(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),bo(t,e))}function Ao(t,e){t._transitionClasses&&w(t._transitionClasses,e),_o(t,e)}function To(t,e,n){var r=Ro(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?So:jo,u=0,c=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++u>=a&&c()};setTimeout((function(){u0&&(n="transition",l=a,f=i.length):"animation"===e?c>0&&(n="animation",l=c,f=u.length):f=(n=(l=Math.max(a,c))>0?a>c?"transition":"animation":null)?"transition"===n?i.length:u.length:0,{type:n,timeout:l,propCount:f,hasTransform:"transition"===n&&Lo.test(r[Oo+"Property"])}}function Io(t,e){for(;t.length1}function Bo(t,e){!0!==e.data.show&&No(e)}var qo=function(t){var e,n,r={},c=t.modules,l=t.nodeOps;for(e=0;eh?_(t,i(n[m+1])?null:n[m+1].elm,n,d,m,r):d>m&&x(e,f,h)}(f,v,m,n,c):a(m)?(a(t.text)&&l.setTextContent(f,""),_(f,null,m,0,m.length-1,n)):a(v)?x(v,0,v.length-1):a(t.text)&&l.setTextContent(f,""):t.text!==e.text&&l.setTextContent(f,e.text),a(h)&&a(d=h.hook)&&a(d=d.postpatch)&&d(t,e)}}}function C(t,e,n){if(s(n)&&a(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(N(Ho(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function Wo(t,e){return e.every((function(e){return!N(e,t)}))}function Ho(t){return"_value"in t?t._value:t.value}function Ko(t){t.target.composing=!0}function Qo(t){t.target.composing&&(t.target.composing=!1,Jo(t.target,"input"))}function Jo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Yo(t){return!t.componentInstance||t.data&&t.data.transition?t:Yo(t.componentInstance._vnode)}var Xo={model:zo,show:{bind:function(t,e,n){var r=e.value,o=(n=Yo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,No(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=Yo(n)).data&&n.data.transition?(n.data.show=!0,r?No(n,(function(){t.style.display=t.__vOriginalDisplay})):Do(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},Zo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ti(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?ti(Te(e.children)):t}function ei(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var r in o)e[C(r)]=o[r];return e}function ni(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var ri=function(t){return t.tag||xe(t)},oi=function(t){return"show"===t.name},ii={name:"transition",props:Zo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(ri)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=ti(o);if(!i)return o;if(this._leaving)return ni(t,o);var a="__transition-".concat(this._uid,"-");i.key=null==i.key?i.isComment?a+"comment":a+i.tag:u(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s=(i.data||(i.data={})).transition=ei(this),c=this._vnode,l=ti(c);if(i.data.directives&&i.data.directives.some(oi)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!xe(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=T({},s);if("out-in"===r)return this._leaving=!0,ee(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),ni(t,o);if("in-out"===r){if(xe(i))return c;var p,d=function(){p()};ee(s,"afterEnter",d),ee(s,"enterCancelled",d),ee(f,"delayLeave",(function(t){p=t}))}}return o}}},ai=T({tag:String,moveClass:String},Zo);function si(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function ui(t){t.data.newPos=t.elm.getBoundingClientRect()}function ci(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate(".concat(r,"px,").concat(o,"px)"),i.transitionDuration="0s"}}delete ai.mode;var li={Transition:ii,TransitionGroup:{props:ai,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=an(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ei(this),s=0;s-1?Cr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Cr[t]=/HTMLUnknownElement/.test(e.toString())},T(er.options.directives,Xo),T(er.options.components,li),er.prototype.__patch__=Q?qo:R,er.prototype.$mount=function(t,e){return function(t,e,n){var r;t.$el=e,t.$options.render||(t.$options.render=ht),cn(t,"beforeMount"),r=function(){t._update(t._render(),n)},new Ze(t,r,R,{before:function(){t._isMounted&&!t._isDestroyed&&cn(t,"beforeUpdate")}},!0),n=!1;var o=t._preWatchers;if(o)for(var i=0;i=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),c=e&&e.path||"/",l=u.path?Ai(u.path,c,n||o.append):c,f=function(t,e,n){void 0===e&&(e={});var r,o=n||yi;try{r=o(t||"")}catch(t){r={}}for(var i in e){var a=e[i];r[i]=Array.isArray(a)?a.map(mi):mi(a)}return r}(u.query,o.query,r&&r.options.parseQuery),p=o.hash||u.hash;return p&&"#"!==p.charAt(0)&&(p="#"+p),{_normalized:!0,path:l,query:f,hash:p}}var Xi,Zi=function(){},ta={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,s=o.href,u={},c=n.options.linkActiveClass,l=n.options.linkExactActiveClass,f=null==c?"router-link-active":c,p=null==l?"router-link-exact-active":l,d=null==this.activeClass?f:this.activeClass,h=null==this.exactActiveClass?p:this.exactActiveClass,v=a.redirectedFrom?wi(null,Yi(a.redirectedFrom),null,n):a;u[h]=Ci(r,v,this.exactPath),u[d]=this.exact||this.exactPath?u[h]:function(t,e){return 0===t.path.replace(_i,"/").indexOf(e.path.replace(_i,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,v);var g=u[h]?this.ariaCurrentValue:null,m=function(t){ea(t)&&(e.replace?n.replace(i,Zi):n.push(i,Zi))},y={click:ea};Array.isArray(this.event)?this.event.forEach((function(t){y[t]=m})):y[this.event]=m;var b={class:u},_=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:s,route:a,navigate:m,isActive:u[d],isExactActive:u[h]});if(_){if(1===_.length)return _[0];if(_.length>1||!_.length)return 0===_.length?t():t("span",{},_)}if("a"===this.tag)b.on=y,b.attrs={href:s,"aria-current":g};else{var w=function t(e){var n;if(e)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=Ji(l.path,s.params),u(l,s,a)}if(s.path){s.params={};for(var d=0;d-1}function Ta(t,e){return Aa(t)&&t._isRouter&&(null==e||t.type===e)}function La(t,e,n){var r=function(o){o>=t.length?n():t[o]?e(t[o],(function(){r(o+1)})):r(o+1)};r(0)}function Ra(t){return function(e,n,r){var o=!1,i=0,a=null;Ia(t,(function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){o=!0,i++;var u,c=Da((function(e){var o;((o=e).__esModule||Na&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:Xi.extend(e),n.components[s]=e,--i<=0&&r()})),l=Da((function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=Aa(t)?t:new Error(e),r(a))}));try{u=t(c,l)}catch(t){l(t)}if(u)if("function"==typeof u.then)u.then(c,l);else{var f=u.component;f&&"function"==typeof f.then&&f.then(c,l)}}})),o||r()}}function Ia(t,e){return Ma(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function Ma(t){return Array.prototype.concat.apply([],t)}var Na="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Da(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Ua=function(t,e){this.router=t,this.base=function(t){if(!t)if(na){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=ki,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Fa(t,e,n,r){var o=Ia(t,(function(t,r,o,i){var a=function(t,e){"function"!=typeof t&&(t=Xi.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,r,o,i)})):n(a,r,o,i)}));return Ma(r?o.reverse():o)}function Ba(t,e){if(e)return function(){return t.apply(e,arguments)}}Ua.prototype.listen=function(t){this.cb=t},Ua.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Ua.prototype.onError=function(t){this.errorCbs.push(t)},Ua.prototype.transitionTo=function(t,e,n){var r,o=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),e&&e(r),o.ensureURL(),o.router.afterHooks.forEach((function(t){t&&t(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(t){t(r)})))}),(function(t){n&&n(t),t&&!o.ready&&(Ta(t,Ca.redirected)&&i===ki||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(t)}))))}))},Ua.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current;this.pending=t;var i,a,s=function(t){!Ta(t)&&Aa(t)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},u=t.matched.length-1,c=o.matched.length-1;if(Ci(t,o)&&u===c&&t.matched[u]===o.matched[c])return this.ensureURL(),t.hash&&ha(this.router,o,t,!1),s(((a=Pa(i=o,t,Ca.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var l=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=ka&&n;r&&this.listeners.push(da());var o=function(){var n=t.current,o=za(t.base);t.current===ki&&o===t._startLocation||t.transitionTo(o,(function(t){r&&ha(e,t,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Oa(Ti(r.base+t.fullPath)),ha(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Sa(Ti(r.base+t.fullPath)),ha(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(za(this.base)!==this.current.fullPath){var e=Ti(this.base+this.current.fullPath);t?Oa(e):Sa(e)}},e.prototype.getCurrentLocation=function(){return za(this.base)},e}(Ua);function za(t){var e=window.location.pathname,n=e.toLowerCase(),r=t.toLowerCase();return!t||n!==r&&0!==n.indexOf(Ti(r+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Va=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=za(t);if(!/^\/#/.test(e))return window.location.replace(Ti(t+"/#"+e)),!0}(this.base)||Ga()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=ka&&e;n&&this.listeners.push(da());var r=function(){var e=t.current;Ga()&&t.transitionTo(Wa(),(function(r){n&&ha(t.router,r,e,!0),ka||Qa(r.fullPath)}))},o=ka?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ka(t.fullPath),ha(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Qa(t.fullPath),ha(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Wa()!==e&&(t?Ka(e):Qa(e))},e.prototype.getCurrentLocation=function(){return Wa()},e}(Ua);function Ga(){var t=Wa();return"/"===t.charAt(0)||(Qa("/"+t),!1)}function Wa(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Ha(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Ka(t){ka?Oa(Ha(t)):window.location.hash=t}function Qa(t){ka?Sa(Ha(t)):window.location.replace(Ha(t))}var Ja=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,t)}))}),(function(t){Ta(t,Ca.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Ua),Ya=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=ia(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!ka&&!1!==t.fallback,this.fallback&&(e="hash"),na||(e="abstract"),this.mode=e,e){case"history":this.history=new qa(this,t.base);break;case"hash":this.history=new Va(this,t.base,this.fallback);break;case"abstract":this.history=new Ja(this,t.base);break;default:0}},Xa={currentRoute:{configurable:!0}};Ya.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Xa.currentRoute.get=function(){return this.history&&this.history.current},Ya.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof qa||n instanceof Va){var r=function(t){n.setupListeners(),function(t){var r=n.current,o=e.options.scrollBehavior;ka&&o&&"fullPath"in t&&ha(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Ya.prototype.beforeEach=function(t){return ts(this.beforeHooks,t)},Ya.prototype.beforeResolve=function(t){return ts(this.resolveHooks,t)},Ya.prototype.afterEach=function(t){return ts(this.afterHooks,t)},Ya.prototype.onReady=function(t,e){this.history.onReady(t,e)},Ya.prototype.onError=function(t){this.history.onError(t)},Ya.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.push(t,e,n)}));this.history.push(t,e,n)},Ya.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.replace(t,e,n)}));this.history.replace(t,e,n)},Ya.prototype.go=function(t){this.history.go(t)},Ya.prototype.back=function(){this.go(-1)},Ya.prototype.forward=function(){this.go(1)},Ya.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Ya.prototype.resolve=function(t,e,n){var r=Yi(t,e=e||this.history.current,n,this),o=this.match(r,e),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?Ti(t+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},Ya.prototype.getRoutes=function(){return this.matcher.getRoutes()},Ya.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==ki&&this.history.transitionTo(this.history.getCurrentLocation())},Ya.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==ki&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Ya.prototype,Xa);var Za=Ya;function ts(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Ya.install=function t(e){if(!t.installed||Xi!==e){t.installed=!0,Xi=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",Pi),e.component("RouterLink",ta);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},Ya.version="3.6.5",Ya.isNavigationFailure=Ta,Ya.NavigationFailureType=Ca,Ya.START_LOCATION=ki,na&&window.Vue&&window.Vue.use(Ya);n(99);n(90),n(129);var es={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(13)]).then(n.bind(null,311)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(14)]).then(n.bind(null,260)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(22)]).then(n.bind(null,247)),"components/Home":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,291)),"components/NavLink":()=>n.e(24).then(n.bind(null,246)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(12)]).then(n.bind(null,274)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,307)),"components/Page":()=>Promise.all([n.e(0),n.e(11)]).then(n.bind(null,293)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,276)),"components/PageNav":()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,277)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,294)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(21)]).then(n.bind(null,297)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,275)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,261)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,258)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,316)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,312)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,313)),"layouts/404":()=>n.e(25).then(n.bind(null,314)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,308)),NotFound:()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(7)]).then(n.bind(null,315)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,308)),"components/Footer":()=>Promise.all([n.e(0),n.e(23)]).then(n.bind(null,296)),"components/SearchBox":()=>Promise.all([n.e(0),n.e(18)]).then(n.bind(null,292)),"components/SearchModal":()=>Promise.all([n.e(0),n.e(19)]).then(n.bind(null,295)),"layouts/NotFound":()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(7)]).then(n.bind(null,315))},ns={"v-038b01fa":()=>n.e(27).then(n.bind(null,317)),"v-c0a4944c":()=>n.e(26).then(n.bind(null,318)),"v-1ba5eb6a":()=>n.e(29).then(n.bind(null,319)),"v-b8cb630c":()=>n.e(28).then(n.bind(null,320)),"v-0a39d43a":()=>n.e(30).then(n.bind(null,321)),"v-c0082a28":()=>n.e(31).then(n.bind(null,322)),"v-ecd6cf40":()=>n.e(32).then(n.bind(null,323)),"v-48851acc":()=>n.e(34).then(n.bind(null,324)),"v-9172688c":()=>n.e(35).then(n.bind(null,325)),"v-172dfc5a":()=>n.e(36).then(n.bind(null,326)),"v-30ab1e90":()=>n.e(37).then(n.bind(null,327)),"v-90d4f50c":()=>n.e(33).then(n.bind(null,328)),"v-2fa5878c":()=>n.e(38).then(n.bind(null,329)),"v-e0d70ecc":()=>n.e(39).then(n.bind(null,330)),"v-6e1e3488":()=>n.e(40).then(n.bind(null,331)),"v-2151a890":()=>n.e(41).then(n.bind(null,332)),"v-79f5d88c":()=>n.e(44).then(n.bind(null,333)),"v-ad4931e0":()=>n.e(43).then(n.bind(null,334)),"v-4222367a":()=>n.e(45).then(n.bind(null,335)),"v-68d9087a":()=>n.e(47).then(n.bind(null,336)),"v-0cbb8c5a":()=>n.e(46).then(n.bind(null,337)),"v-2aed10ba":()=>n.e(48).then(n.bind(null,338)),"v-d8e9780c":()=>n.e(49).then(n.bind(null,339)),"v-37cd1c0a":()=>n.e(50).then(n.bind(null,340)),"v-657f8880":()=>n.e(51).then(n.bind(null,341)),"v-bf3acddc":()=>n.e(52).then(n.bind(null,342)),"v-c8f0091c":()=>n.e(54).then(n.bind(null,343)),"v-401d6fcc":()=>n.e(53).then(n.bind(null,344)),"v-a40710da":()=>n.e(55).then(n.bind(null,345)),"v-4d71a012":()=>n.e(56).then(n.bind(null,346)),"v-3798e78c":()=>n.e(57).then(n.bind(null,347)),"v-fc9b918c":()=>n.e(58).then(n.bind(null,348)),"v-2c88928c":()=>n.e(42).then(n.bind(null,349))};function rs(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const os=/-(\w)/g,is=rs(t=>t.replace(os,(t,e)=>e?e.toUpperCase():"")),as=/\B([A-Z])/g,ss=rs(t=>t.replace(as,"-$1").toLowerCase()),us=rs(t=>t.charAt(0).toUpperCase()+t.slice(1));function cs(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(us(is(e))):t(us(e))||t(ss(e))}const ls=Object.assign({},es,ns),fs=t=>ls[t],ps=t=>ns[t],ds=t=>es[t],hs=t=>er.component(t);function vs(t){return cs(ps,t)}function gs(t){return cs(ds,t)}function ms(t){return cs(fs,t)}function ys(t){return cs(hs,t)}function bs(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!ys(t)&&ms(t)){const e=await ms(t)();er.component(t,e.default)}}))}function _s(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var ws=n(87),xs=n.n(ws),ks=n(88),Os=n.n(ks),Ss={created(){if(this.siteMeta=this.$site.headTags.filter(([t])=>"meta"===t).map(([t,e])=>e),this.$ssrContext){const e=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(t=e)?t.map(t=>{let e="{e+=` ${n}="${Os()(t[n])}"`}),e+">"}).join("\n "):"",this.$ssrContext.canonicalLink=js(this.$canonicalUrl)}var t},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.getMergedMetaTags();this.currentMetaTags=$s(t,this.currentMetaTags)},getMergedMetaTags(){const t=this.$page.frontmatter.meta||[];return xs()([{name:"description",content:this.$description}],t,this.siteMeta,Ps)},updateCanonicalLink(){Cs(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",js(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){$s(null,this.currentMetaTags),Cs()}};function Cs(){const t=document.querySelector("link[rel='canonical']");t&&t.remove()}function js(t=""){return t?``:""}function $s(t,e){if(e&&[...e].filter(t=>t.parentNode===document.head).forEach(t=>document.head.removeChild(t)),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}function Ps(t){for(const e of["name","property","itemprop"])if(t.hasOwnProperty(e))return t[e]+e;return JSON.stringify(t)}var Es=n(89),As={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(Es)()((function(){this.setActiveHash()}),300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Ts=n(22),Ls=n.n(Ts),Rs={mounted(){Ls.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||er.component(t.name)||Ls.a.start(),n()}),this.$router.afterEach(()=>{Ls.a.done(),this.isSidebarOpen=!1})}},Is={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let t={};return t[this.options.align]="7.5px",t},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(t){let e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:null},copyToClipboard(t){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let t=document.createElement("textarea");document.body.appendChild(t),t.value=this.code,t.select(),document.execCommand("Copy"),t.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let t=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${t.r}, ${t.g}, ${t.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},Ms=(n(237),n(10)),Ns=Object(Ms.a)(Is,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"code-copy"},[e("svg",{class:t.iconClass,style:t.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:t.copyToClipboard}},[e("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),t._v(" "),e("path",{attrs:{fill:t.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),t._v(" "),e("span",{class:t.success?"success":"",style:t.alignStyle},[t._v("\n "+t._s(t.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,Ds=(n(238),[Ss,As,Rs,{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(t=>{if(t.classList.contains("code-copy-added"))return;let e=new(er.extend(Ns));e.options={align:"bottom",color:"#27b1ff",backgroundTransition:!0,backgroundColor:"#0075b8",successText:"Copied!",staticIcon:!1},e.code=t.innerText,e.parent=t,e.$mount(),t.classList.add("code-copy-added"),t.appendChild(e.$el)})},100)}}}]),Us={name:"GlobalLayout",computed:{layout(){const t=this.getLayout();return _s("layout",t),er.component(t)}},methods:{getLayout(){if(this.$page.path){const t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},Fs=Object(Ms.a)(Us,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}(Fs,"mixins",Ds);const Bs=[{name:"v-038b01fa",path:"/arweave/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-038b01fa").then(n)}},{path:"/arweave/index.html",redirect:"/arweave/"},{path:"/arweave.html",redirect:"/arweave/"},{name:"v-c0a4944c",path:"/arns/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-c0a4944c").then(n)}},{path:"/arns/index.html",redirect:"/arns/"},{path:"/arns.html",redirect:"/arns/"},{name:"v-1ba5eb6a",path:"/arcss/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-1ba5eb6a").then(n)}},{path:"/arcss/index.html",redirect:"/arcss/"},{path:"/concepts/arcss.html",redirect:"/arcss/"},{name:"v-b8cb630c",path:"/community-resources.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-b8cb630c").then(n)}},{name:"v-0a39d43a",path:"/concepts/sandboxing.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-0a39d43a").then(n)}},{name:"v-c0082a28",path:"/contribute.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-c0082a28").then(n)}},{name:"v-ecd6cf40",path:"/foundation/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-ecd6cf40").then(n)}},{path:"/foundation/index.html",redirect:"/foundation/"},{path:"/foundation.html",redirect:"/foundation/"},{name:"v-48851acc",path:"/gateways/ar-io-node/admin/admin-api.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-48851acc").then(n)}},{name:"v-9172688c",path:"/gateways/ar-io-node/advanced-config.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-9172688c").then(n)}},{name:"v-172dfc5a",path:"/gateways/ar-io-node/api.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-172dfc5a").then(n)}},{name:"v-30ab1e90",path:"/gateways/ar-io-node/arnsoip/observer.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-30ab1e90").then(n)}},{name:"v-90d4f50c",path:"/gateway-network/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-90d4f50c").then(n)}},{path:"/gateway-network/index.html",redirect:"/gateway-network/"},{path:"/gateway-network.html",redirect:"/gateway-network/"},{name:"v-2fa5878c",path:"/gateways/ar-io-node/env.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-2fa5878c").then(n)}},{name:"v-e0d70ecc",path:"/gateways/ar-io-node/linux-setup.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-e0d70ecc").then(n)}},{name:"v-6e1e3488",path:"/troubleshooting-observer/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-6e1e3488").then(n)}},{path:"/troubleshooting-observer/index.html",redirect:"/troubleshooting-observer/"},{path:"/gateways/ar-io-node/observer-troubleshooting.html",redirect:"/troubleshooting-observer/"},{name:"v-2151a890",path:"/gateways/ar-io-node/observer-upgrade.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-2151a890").then(n)}},{name:"v-79f5d88c",path:"/gateways/ar-io-node/release-notes.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-79f5d88c").then(n)}},{name:"v-ad4931e0",path:"/gateways/ar-io-node/overview/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-ad4931e0").then(n)}},{path:"/gateways/ar-io-node/overview/index.html",redirect:"/gateways/ar-io-node/overview/"},{path:"/gateways/ar-io-node/overview.html",redirect:"/gateways/ar-io-node/overview/"},{name:"v-4222367a",path:"/gateways/testnet/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-4222367a").then(n)}},{path:"/gateways/testnet/index.html",redirect:"/gateways/testnet/"},{path:"/gateways/ar-io-node/testnet.html",redirect:"/gateways/testnet/"},{name:"v-68d9087a",path:"/gateways/upgrade/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-68d9087a").then(n)}},{path:"/gateways/upgrade/index.html",redirect:"/gateways/upgrade/"},{path:"/gateways/ar-io-node/upgrading.html",redirect:"/gateways/upgrade/"},{name:"v-0cbb8c5a",path:"/troubleshooting/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-0cbb8c5a").then(n)}},{path:"/troubleshooting/index.html",redirect:"/troubleshooting/"},{path:"/gateways/ar-io-node/troubleshooting.html",redirect:"/troubleshooting/"},{name:"v-2aed10ba",path:"/gateways/ar-io-node/windows-setup.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-2aed10ba").then(n)}},{name:"v-d8e9780c",path:"/gateways/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-d8e9780c").then(n)}},{path:"/gateways/index.html",redirect:"/gateways/"},{path:"/gateways/gateways.html",redirect:"/gateways/"},{name:"v-37cd1c0a",path:"/glossary.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-37cd1c0a").then(n)}},{name:"v-657f8880",path:"/guides/arns/managing.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-657f8880").then(n)}},{name:"v-bf3acddc",path:"/guides/arns/overview.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-bf3acddc").then(n)}},{name:"v-c8f0091c",path:"/guides/graphql/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-c8f0091c").then(n)}},{path:"/guides/graphql/index.html",redirect:"/guides/graphql/"},{path:"/guides/gql.html",redirect:"/guides/graphql/"},{name:"v-401d6fcc",path:"/guides/arns/registering.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-401d6fcc").then(n)}},{name:"v-a40710da",path:"/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-a40710da").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-4d71a012",path:"/introduction/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-4d71a012").then(n)}},{path:"/introduction/index.html",redirect:"/introduction/"},{path:"/introduction.html",redirect:"/introduction/"},{name:"v-3798e78c",path:"/labs/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-3798e78c").then(n)}},{path:"/labs/index.html",redirect:"/labs/"},{path:"/labs.html",redirect:"/labs/"},{name:"v-fc9b918c",path:"/token/",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-fc9b918c").then(n)}},{path:"/token/index.html",redirect:"/token/"},{path:"/token.html",redirect:"/token/"},{name:"v-2c88928c",path:"/gateways/ar-io-node/operation.html",component:Fs,beforeEnter:(t,e,n)=>{bs("Layout","v-2c88928c").then(n)}},{path:"*",component:Fs}],qs={title:"ar.io Docs",description:"ar.io documentation",base:"/docs/",headTags:[["meta",{name:"theme-color",content:"#3eaf7c"}],["meta",{name:"apple-mobile-web-app-capable",content:"yes"}],["meta",{name:"apple-mobile-web-app-status-bar-style",content:"black"}],["script",{src:"https://plausible.io/js/script.js",defer:!0,"data-domain":"docs.ar.io"}],["link",{rel:"stylesheet",href:"https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"}],["link",{rel:"stylesheet",href:"https://fonts.googleapis.com/css2?family=Dancing+Script:wght@400;500;600;700&display=swap"}]],pages:[{title:"Arweave",frontmatter:{permalink:"/arweave/"},regularPath:"/arweave.html",relativePath:"arweave.md",key:"v-038b01fa",path:"/arweave/",headers:[{level:2,title:"The Permanence Pie",slug:"the-permanence-pie"},{level:2,title:"What Is Arweave",slug:"what-is-arweave"},{level:2,title:"Gateways",slug:"gateways"},{level:2,title:"SmartWeave",slug:"smartweave"},{level:2,title:"The Permaweb",slug:"the-permaweb"},{level:2,title:"References and Further Reading",slug:"references-and-further-reading"}]},{title:"Arweave Name System (ArNS)",frontmatter:{permalink:"/arns/"},regularPath:"/arns.html",relativePath:"arns.md",key:"v-c0a4944c",path:"/arns/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Name Registry",slug:"name-registry"},{level:3,title:"Name Validation Rules",slug:"name-validation-rules"},{level:2,title:"Arweave Name Token (ANT)",slug:"arweave-name-token-ant"},{level:3,title:"Under_Names",slug:"under-names"},{level:2,title:"Addressing Variable Market Conditions",slug:"addressing-variable-market-conditions"},{level:2,title:"Dynamic Pricing Model",slug:"dynamic-pricing-model"},{level:3,title:"Pricing Scenarios",slug:"pricing-scenarios"},{level:3,title:"Dynamic Pricing Mechanics",slug:"dynamic-pricing-mechanics"},{level:3,title:"Step Pricing Mechanics",slug:"step-pricing-mechanics"},{level:2,title:"Bid Initiated Dutch Auctions (BIDA)",slug:"bid-initiated-dutch-auctions-bida"},{level:3,title:"Auction Price Curve",slug:"auction-price-curve"}]},{title:"ARCSS",frontmatter:{permalink:"/arcss",prev:!1},regularPath:"/concepts/arcss.html",relativePath:"concepts/arcss.md",key:"v-1ba5eb6a",path:"/arcss/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Browser Integration",slug:"browser-integration"},{level:2,title:"Internal Application Integration",slug:"internal-application-integration"},{level:2,title:"Benefits of ARCSS Over Hardcoded Gateway Links",slug:"benefits-of-arcss-over-hardcoded-gateway-links"},{level:2,title:"Use Cases",slug:"use-cases"},{level:3,title:"Decentralized Web Hosting with Flexible Access",slug:"decentralized-web-hosting-with-flexible-access"},{level:3,title:"Digital Archives and Preservation with Enhanced Sharing",slug:"digital-archives-and-preservation-with-enhanced-sharing"},{level:3,title:"Media Sharing Platforms with Consistent Content Delivery",slug:"media-sharing-platforms-with-consistent-content-delivery"},{level:3,title:"Decentralized Applications (DApps) with Reliable Front-End Accessibility",slug:"decentralized-applications-dapps-with-reliable-front-end-accessibility"},{level:2,title:"How it Works",slug:"how-it-works"},{level:3,title:"Transaction ID",slug:"transaction-id"},{level:3,title:"ArNS",slug:"arns"},{level:2,title:"Wayfinder",slug:"wayfinder"},{level:3,title:"v0.0.10",slug:"v0-0-10"},{level:3,title:"Key Features",slug:"key-features"},{level:3,title:"Use Cases",slug:"use-cases-2"}]},{title:"Community Resources",frontmatter:{prev:!1,next:!1},regularPath:"/community-resources.html",relativePath:"community-resources.md",key:"v-b8cb630c",path:"/community-resources.html"},{title:"Browser Sandboxing",frontmatter:{next:!1},regularPath:"/concepts/sandboxing.html",relativePath:"concepts/sandboxing.md",key:"v-0a39d43a",path:"/concepts/sandboxing.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"TLS and its Role in Browser Sandboxing",slug:"tls-and-its-role-in-browser-sandboxing"},{level:2,title:"Deriving Sandbox Value",slug:"deriving-sandbox-value"}]},{title:"Contributing to AR.IO Docs",frontmatter:{next:!1},regularPath:"/contribute.html",relativePath:"contribute.md",key:"v-c0082a28",path:"/contribute.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Initial Setup",slug:"initial-setup"},{level:3,title:"Fork the Repository",slug:"fork-the-repository"},{level:3,title:"Clone your Fork",slug:"clone-your-fork"},{level:3,title:"Link Upstream",slug:"link-upstream"},{level:3,title:"Install Dependencies for Docs Portal",slug:"install-dependencies-for-docs-portal"},{level:2,title:"Editing",slug:"editing"},{level:3,title:"Branches",slug:"branches"},{level:3,title:"What is Markdown?",slug:"what-is-markdown"},{level:3,title:"Frontmatter",slug:"frontmatter"},{level:3,title:"CSS",slug:"css"},{level:3,title:"Adding to the Sidebar",slug:"adding-to-the-sidebar"},{level:2,title:"Development and Deployment",slug:"development-and-deployment"},{level:3,title:"Launching Development Server",slug:"launching-development-server"},{level:3,title:"Building Static Files",slug:"building-static-files"},{level:3,title:"Creating Your Pull Request",slug:"creating-your-pull-request"}]},{title:"AR.IO Foundation",frontmatter:{permalink:"/foundation",prev:!1},regularPath:"/foundation.html",relativePath:"foundation.md",key:"v-ecd6cf40",path:"/foundation/",headers:[{level:2,title:"What is the AR.IO Foundation?",slug:"what-is-the-ar-io-foundation"},{level:2,title:"Guiding Philosophy",slug:"guiding-philosophy"}]},{title:"AR.IO HTTP API Admin Endpoints",frontmatter:{},regularPath:"/gateways/ar-io-node/admin/admin-api.html",relativePath:"gateways/ar-io-node/admin/admin-api.md",key:"v-48851acc",path:"/gateways/ar-io-node/admin/admin-api.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Debug",slug:"debug"},{level:2,title:"Queue Transaction",slug:"queue-transaction"},{level:2,title:"Block Data",slug:"block-data"}]},{title:"Advanced Configuration",frontmatter:{},regularPath:"/gateways/ar-io-node/advanced-config.html",relativePath:"gateways/ar-io-node/advanced-config.md",key:"v-9172688c",path:"/gateways/ar-io-node/advanced-config.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Data Storage Location",slug:"data-storage-location"},{level:2,title:"Admin API Key",slug:"admin-api-key"},{level:2,title:"Wallet Association",slug:"wallet-association"},{level:2,title:"Unbundling",slug:"unbundling"},{level:2,title:"Content Moderation",slug:"content-moderation"}]},{title:"AR.IO HTTP API",frontmatter:{},regularPath:"/gateways/ar-io-node/api.html",relativePath:"gateways/ar-io-node/api.md",key:"v-172dfc5a",path:"/gateways/ar-io-node/api.html"},{title:"Observation and Incentives",frontmatter:{next:!1},regularPath:"/gateways/ar-io-node/arnsoip/observer.html",relativePath:"gateways/ar-io-node/arnsoip/observer.md",key:"v-30ab1e90",path:"/gateways/ar-io-node/arnsoip/observer.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Observation Protocol",slug:"observation-protocol"},{level:2,title:"Onchain Reports",slug:"onchain-reports"},{level:2,title:"Selection of Observers",slug:"selection-of-observers"},{level:3,title:"Criteria for Selection",slug:"criteria-for-selection"},{level:3,title:"Weight Calculation and Normalization",slug:"weight-calculation-and-normalization"},{level:3,title:"Random Selection Process",slug:"random-selection-process"},{level:2,title:"Performance Evaluation",slug:"performance-evaluation"},{level:2,title:"Reward Distribution",slug:"reward-distribution"},{level:3,title:"Distribution Based on Performance",slug:"distribution-based-on-performance"},{level:3,title:"Undistributed Rewards",slug:"undistributed-rewards"},{level:2,title:"Handling Inactive Gateways",slug:"handling-inactive-gateways"},{level:2,title:"Observer Report Details",slug:"observer-report-details"},{level:2,title:"General Information",slug:"general-information"},{level:2,title:"Overall Gateway Operator Assessment",slug:"overall-gateway-operator-assessment"},{level:2,title:"ArNS Assessments",slug:"arns-assessments"},{level:2,title:"Example Observation Report",slug:"example-observation-report"},{level:2,title:"Viewing Observation Reports",slug:"viewing-observation-reports"},{level:3,title:"example",slug:"example"}]},{title:"Gateway network",frontmatter:{permalink:"/gateway-network/"},regularPath:"/gateway-network.html",relativePath:"gateway-network.md",key:"v-90d4f50c",path:"/gateway-network/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Gateway Address Registry (GAR)",slug:"gateway-address-registry-gar"},{level:2,title:"Staking",slug:"staking"},{level:2,title:"Schema",slug:"schema"},{level:3,title:"Gateway Schema",slug:"gateway-schema"},{level:3,title:"Token Vault",slug:"token-vault"},{level:3,title:"Gateway Settings",slug:"gateway-settings"}]},{title:"Environmental Variables",frontmatter:{},regularPath:"/gateways/ar-io-node/env.html",relativePath:"gateways/ar-io-node/env.md",key:"v-2fa5878c",path:"/gateways/ar-io-node/env.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Variables",slug:"variables"}]},{title:"Linux Installation Instructions",frontmatter:{prev:!1,next:"./testnet",tags:["domain","url","setup","start","help","how to","ubuntu","testnet"]},regularPath:"/gateways/ar-io-node/linux-setup.html",relativePath:"gateways/ar-io-node/linux-setup.md",key:"v-e0d70ecc",path:"/gateways/ar-io-node/linux-setup.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"System Requirements",slug:"system-requirements"},{level:3,title:"Minimum requirements",slug:"minimum-requirements"},{level:3,title:"Recommended",slug:"recommended"},{level:2,title:"Install Packages",slug:"install-packages"},{level:3,title:"Required packages",slug:"required-packages"},{level:3,title:"Suggested packages",slug:"suggested-packages"},{level:2,title:"Install the Node",slug:"install-the-node"},{level:2,title:"Set up Networking",slug:"set-up-networking"}]},{title:"Troubleshooting Observer",frontmatter:{permalink:"/troubleshooting-observer",next:!1},regularPath:"/gateways/ar-io-node/observer-troubleshooting.html",relativePath:"gateways/ar-io-node/observer-troubleshooting.md",key:"v-6e1e3488",path:"/troubleshooting-observer/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Observer not running and/or unable to connect",slug:"observer-not-running-and-or-unable-to-connect"},{level:3,title:"",slug:""},{level:2,title:"Observer wallet has no AR",slug:"observer-wallet-has-no-ar"},{level:3,title:"",slug:"-2"},{level:2,title:"Observer wallet ... does not match the 'observerWallet' set on the gateway ...",slug:"observer-wallet-does-not-match-the-observerwallet-set-on-the-gateway"},{level:3,title:"",slug:"-3"},{level:2,title:"Uncertain - confirm your OBSERVER_WALLET is set in the .env file and corresponding wallet is located in wallets/.json...",slug:"uncertain-confirm-your-observer-wallet-is-set-in-the-env-file-and-corresponding-wallet-is-located-in-wallets-address-json"},{level:3,title:"",slug:"-4"}]},{title:"Upgrading to the Observer Module",frontmatter:{},regularPath:"/gateways/ar-io-node/observer-upgrade.html",relativePath:"gateways/ar-io-node/observer-upgrade.md",key:"v-2151a890",path:"/gateways/ar-io-node/observer-upgrade.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Supply a Keyfile",slug:"supply-a-keyfile"},{level:2,title:"Environmental variables",slug:"environmental-variables"}]},{title:"ar.io Release Notes",frontmatter:{next:!1},regularPath:"/gateways/ar-io-node/release-notes.html",relativePath:"gateways/ar-io-node/release-notes.md",key:"v-79f5d88c",path:"/gateways/ar-io-node/release-notes.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"[Release 6] - 2024-01-29",slug:"release-6-2024-01-29"},{level:2,title:"[Release 5] - 2024-01-25",slug:"release-5-2024-01-25"},{level:2,title:"[Release 4] - 2024-01-11",slug:"release-4-2024-01-11"},{level:2,title:"[Release 3] - 2023-12-05",slug:"release-3-2023-12-05"}]},{title:"Overview",frontmatter:{permalink:"/gateways/ar-io-node/overview"},regularPath:"/gateways/ar-io-node/overview.html",relativePath:"gateways/ar-io-node/overview.md",key:"v-ad4931e0",path:"/gateways/ar-io-node/overview/"},{title:"Join the AR.IO Testnet",frontmatter:{prev:!1,permalink:"/gateways/testnet/",tags:["testnet","join","application","jwk","qty","fqdn","label","note","properties"]},regularPath:"/gateways/ar-io-node/testnet.html",relativePath:"gateways/ar-io-node/testnet.md",key:"v-4222367a",path:"/gateways/testnet/",headers:[{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Submit an Application",slug:"submit-an-application"},{level:2,title:"Setting up and Running the Join Script",slug:"setting-up-and-running-the-join-script"},{level:3,title:"Clone the Repo",slug:"clone-the-repo"},{level:3,title:"Install dependencies",slug:"install-dependencies"},{level:3,title:"Provide Wallet Keys",slug:"provide-wallet-keys"},{level:3,title:"Configure your settings",slug:"configure-your-settings"},{level:3,title:"Run the Script",slug:"run-the-script"},{level:2,title:"Update Your Gateway Settings",slug:"update-your-gateway-settings"}]},{title:"Upgrading your Gateway",frontmatter:{permalink:"/gateways/upgrade/"},regularPath:"/gateways/ar-io-node/upgrading.html",relativePath:"gateways/ar-io-node/upgrading.md",key:"v-68d9087a",path:"/gateways/upgrade/",headers:[{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Checking your Release Number",slug:"checking-your-release-number"},{level:2,title:"Upgrade Steps",slug:"upgrade-steps"}]},{title:"Troubleshooting",frontmatter:{permalink:"/troubleshooting"},regularPath:"/gateways/ar-io-node/troubleshooting.html",relativePath:"gateways/ar-io-node/troubleshooting.md",key:"v-0cbb8c5a",path:"/troubleshooting/",headers:[{level:2,title:"My Gateway Seems to be Running but...",slug:"my-gateway-seems-to-be-running-but"},{level:3,title:"",slug:""},{level:3,title:"",slug:"-2"},{level:3,title:"",slug:"-3"},{level:3,title:"",slug:"-4"},{level:3,title:"",slug:"-5"},{level:3,title:"",slug:"-6"},{level:3,title:"",slug:"-7"},{level:3,title:"",slug:"-8"},{level:2,title:"My Gateway was Running, but now it isn't",slug:"my-gateway-was-running-but-now-it-isn-t"},{level:3,title:"",slug:"-9"},{level:2,title:"I am having Trouble Getting my Gateway Set up",slug:"i-am-having-trouble-getting-my-gateway-set-up"},{level:3,title:"",slug:"-10"},{level:3,title:"",slug:"-11"},{level:3,title:"",slug:"-12"},{level:2,title:"Quick Lookup",slug:"quick-lookup"}]},{title:"Windows Installation Instructions",frontmatter:{prev:!1,next:"./testnet"},regularPath:"/gateways/ar-io-node/windows-setup.html",relativePath:"gateways/ar-io-node/windows-setup.md",key:"v-2aed10ba",path:"/gateways/ar-io-node/windows-setup.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Install Required Packages",slug:"install-required-packages"},{level:2,title:"Clone the Repository",slug:"clone-the-repository"},{level:2,title:"Create the Environment File",slug:"create-the-environment-file"},{level:2,title:"Supply Your Observer Wallet Keyfile:",slug:"supply-your-observer-wallet-keyfile"},{level:2,title:"Start the Docker Containers",slug:"start-the-docker-containers"},{level:2,title:"Test Localhost",slug:"test-localhost"},{level:2,title:"Set Up Router Port Forwarding",slug:"set-up-router-port-forwarding"},{level:2,title:"Install and Configure NGINX Docker",slug:"install-and-configure-nginx-docker"}]},{title:"Gateway Architecture",frontmatter:{permalink:"/gateways/"},regularPath:"/gateways/gateways.html",relativePath:"gateways/gateways.md",key:"v-d8e9780c",path:"/gateways/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"AR.IO Gateway Benefits",slug:"ar-io-gateway-benefits"},{level:2,title:"Gateway Modularity",slug:"gateway-modularity"},{level:2,title:"ARNS Indexing and Routing",slug:"arns-indexing-and-routing"},{level:2,title:"Content Moderation",slug:"content-moderation"}]},{title:"Glossary",frontmatter:{prev:!1,next:!1},regularPath:"/glossary.html",relativePath:"glossary.md",key:"v-37cd1c0a",path:"/glossary.html"},{title:"Managing ArNS Assets",frontmatter:{next:!1},regularPath:"/guides/arns/managing.html",relativePath:"guides/arns/managing.md",key:"v-657f8880",path:"/guides/arns/managing.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Names",slug:"names"},{level:2,title:"ANTs",slug:"ants"}]},{title:"Arweave Name System (ArNS)",frontmatter:{prev:!1},regularPath:"/guides/arns/overview.html",relativePath:"guides/arns/overview.md",key:"v-bf3acddc",path:"/guides/arns/overview.html",headers:[{level:2,title:"Overview",slug:"overview"}]},{title:"GraphQL",frontmatter:{permalink:"/guides/graphql/"},regularPath:"/guides/gql.html",relativePath:"guides/gql.md",key:"v-c8f0091c",path:"/guides/graphql/",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Constructing a Query",slug:"constructing-a-query"},{level:3,title:"Basic Syntax",slug:"basic-syntax"},{level:3,title:"Customizing Searches with Tags",slug:"customizing-searches-with-tags"},{level:3,title:"Understanding Edges and Nodes",slug:"understanding-edges-and-nodes"},{level:3,title:"Pagination",slug:"pagination"},{level:3,title:"General Tips for Optimizing Queries",slug:"general-tips-for-optimizing-queries"},{level:2,title:"Making a Query",slug:"making-a-query"},{level:3,title:"GraphQL Playground",slug:"graphql-playground"},{level:3,title:"Using an API",slug:"using-an-api"},{level:3,title:"Using an SDK",slug:"using-an-sdk"}]},{title:"Registering an ArNS name",frontmatter:{},regularPath:"/guides/arns/registering.html",relativePath:"guides/arns/registering.md",key:"v-401d6fcc",path:"/guides/arns/registering.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Connect Your Wallet",slug:"connect-your-wallet"},{level:2,title:"Checking Availability",slug:"checking-availability"},{level:2,title:"Configure Your Purchase",slug:"configure-your-purchase"},{level:2,title:"Confirm Your Purchase",slug:"confirm-your-purchase"},{level:2,title:"Auctions",slug:"auctions"}]},{title:"Welcome to the Permaweb",frontmatter:{homepage:!0},regularPath:"/",relativePath:"index.md",key:"v-a40710da",path:"/"},{title:"Introduction",frontmatter:{permalink:"/introduction/",prev:!1},regularPath:"/introduction.html",relativePath:"introduction.md",key:"v-4d71a012",path:"/introduction/",headers:[{level:2,title:"TL;DR",slug:"tl-dr"},{level:2,title:"What is AR.IO",slug:"what-is-ar-io"},{level:2,title:"Why AR.IO ?",slug:"why-ar-io"}]},{title:"AR.IO Labs",frontmatter:{permalink:"/labs/"},regularPath:"/labs.html",relativePath:"labs.md",key:"v-3798e78c",path:"/labs/",headers:[{level:2,title:"What is AR.IO Labs?",slug:"what-is-ar-io-labs"}]},{title:"The IO Token",frontmatter:{permalink:"/token/"},regularPath:"/token.html",relativePath:"token.md",key:"v-fc9b918c",path:"/token/",headers:[{level:2,title:"Overview",slug:"overview"}]},{title:"Operation",frontmatter:{prev:"./windows-setup",next:"./linux-setup"},regularPath:"/gateways/ar-io-node/operation.html",relativePath:"gateways/ar-io-node/operation.md",key:"v-2c88928c",path:"/gateways/ar-io-node/operation.html",headers:[{level:2,title:"Overview",slug:"overview"},{level:3,title:"Errors",slug:"errors"},{level:3,title:"Authentication",slug:"authentication"},{level:2,title:"Cache",slug:"cache"},{level:3,title:"Transaction",slug:"transaction"},{level:3,title:"Raw Transation",slug:"raw-transation"},{level:2,title:"Network",slug:"network"},{level:3,title:"Network information",slug:"network-information"},{level:3,title:"Peer information",slug:"peer-information"},{level:3,title:"Network Block Height",slug:"network-block-height"},{level:2,title:"Pricing",slug:"pricing"},{level:3,title:"Upload",slug:"upload"},{level:3,title:"Transfer and Upload",slug:"transfer-and-upload"},{level:2,title:"Wallets",slug:"wallets"},{level:3,title:"Balance",slug:"balance"},{level:3,title:"Last Transaction",slug:"last-transaction"},{level:2,title:"Blocks",slug:"blocks"},{level:3,title:"Current Block",slug:"current-block"},{level:3,title:"Specific Block",slug:"specific-block"},{level:3,title:"Get Block by Hash",slug:"get-block-by-hash"},{level:2,title:"Transactions",slug:"transactions"},{level:3,title:"Pending",slug:"pending"},{level:3,title:"Transaction",slug:"transaction-2"},{level:3,title:"Offset",slug:"offset"},{level:3,title:"Status",slug:"status"},{level:2,title:"Chunks",slug:"chunks"}]}],themeConfig:{footer:!0,fontFamily:{base:["Dancing Script","cursive"]},searchPlaceholder:"Search",repo:"",editLinks:!1,docsDir:"",editLinkText:"",lastUpdated:!1,initialOpenGroupIndex:-1,logo:"/docs//images/logo-party.gif",sidebar:{"/":[{title:"Welcome",path:"/"},{title:"White Paper",path:"https://arweave.net/lNjWn3LpyhKC95Kqe-x8X2qgju0j98MhucdDKK85vc4"},{title:"Network Overview",children:[{title:"Introduction",path:"/introduction"},{title:"Arweave and the Permaweb",path:"/arweave"},{title:"The IO Token",path:"/token.md"},{title:"Gateway Architecture",path:"/gateways/gateways"},{title:"Gateway Network",path:"/gateway-network"},{title:"Arweave name System (ArNS)",path:"/arns.md"},{title:"Observation and Incentive Protocol",path:"/gateways/ar-io-node/arnsoip/observer"}]},{title:"Gateway Operators",children:[{title:"Getting Started",children:[{title:"Overview",path:"/gateways/ar-io-node/overview"},{title:"Setting up on Windows",path:"/gateways/ar-io-node/windows-setup"},{title:"Setting up on Linux",path:"/gateways/ar-io-node/linux-setup"},{title:"Join the Network",path:"/gateways/ar-io-node/testnet"},{title:"Upgrading",path:"/gateways/ar-io-node/upgrading"}]},{title:"Advanced Configurations",path:"/gateways/ar-io-node/advanced-config"},{title:"Environmental Variables",path:"/gateways/ar-io-node/env"},{title:"AR.IO HTTP API",path:"/gateways/ar-io-node/api"},{title:"AR.IO Admin API",path:"/gateways/ar-io-node/admin/admin-api"},{title:"Upgrading to Observer",path:"/gateways/ar-io-node/observer-upgrade"},{title:"Troubleshooting",path:"/gateways/ar-io-node/troubleshooting"},{title:"Troubleshooting Observer",path:"/gateways/ar-io-node/observer-troubleshooting"},{title:"Release Notes",path:"/gateways/ar-io-node/release-notes"}]},{title:"Glossary",path:"/glossary"},{title:"Concepts",children:[{title:"ar:// (ARCSS)",path:"/concepts/arcss"},{title:"Browser Sandboxing",path:"/concepts/sandboxing"}]},{title:"Guides",children:[{title:"Arweave Name System (ArNS)",children:[{title:"ArNS App",children:[{title:"Overview",path:"/guides/arns/overview"},{title:"Registering a Name",path:"/guides/arns/registering"},{title:"Managing Assets",path:"/guides/arns/managing"}]}]},{title:"GraphQL",path:"/guides/gql"}]},{title:"Community Resources",path:"/community-resources"}]}}};function zs(){return"undefined"!=typeof navigator&&"undefined"!=typeof window?window:"undefined"!=typeof global?global:{}}const Vs="function"==typeof Proxy;let Gs,Ws;function Hs(){return void 0!==Gs||("undefined"!=typeof window&&window.performance?(Gs=!0,Ws=window.performance):"undefined"!=typeof global&&(null===(t=global.perf_hooks)||void 0===t?void 0:t.performance)?(Gs=!0,Ws=global.perf_hooks.performance):Gs=!1),Gs?Ws.now():Date.now();var t}class Ks{constructor(t,e){this.target=null,this.targetQueue=[],this.onQueue=[],this.plugin=t,this.hook=e;const n={};if(t.settings)for(const e in t.settings){const r=t.settings[e];n[e]=r.defaultValue}const r="__vue-devtools-plugin-settings__"+t.id;let o=Object.assign({},n);try{const t=localStorage.getItem(r),e=JSON.parse(t);Object.assign(o,e)}catch(t){}this.fallbacks={getSettings:()=>o,setSettings(t){try{localStorage.setItem(r,JSON.stringify(t))}catch(t){}o=t},now:()=>Hs()},e&&e.on("plugin:settings:set",(t,e)=>{t===this.plugin.id&&this.fallbacks.setSettings(e)}),this.proxiedOn=new Proxy({},{get:(t,e)=>this.target?this.target.on[e]:(...t)=>{this.onQueue.push({method:e,args:t})}}),this.proxiedTarget=new Proxy({},{get:(t,e)=>this.target?this.target[e]:"on"===e?this.proxiedOn:Object.keys(this.fallbacks).includes(e)?(...t)=>(this.targetQueue.push({method:e,args:t,resolve:()=>{}}),this.fallbacks[e](...t)):(...t)=>new Promise(n=>{this.targetQueue.push({method:e,args:t,resolve:n})})})}async setRealTarget(t){this.target=t;for(const t of this.onQueue)this.target.on[t.method](...t.args);for(const t of this.targetQueue)t.resolve(await this.target[t.method](...t.args))}}function Qs(t,e){const n=t,r=zs(),o=zs().__VUE_DEVTOOLS_GLOBAL_HOOK__,i=Vs&&n.enableEarlyProxy;if(!o||!r.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__&&i){const t=i?new Ks(n,o):null;(r.__VUE_DEVTOOLS_PLUGINS__=r.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:n,setupFn:e,proxy:t}),t&&e(t.proxiedTarget)}else o.emit("devtools-plugin:setup",t,e)} /*! * vuex v4.1.0 * (c) 2022 Evan You * @license MIT - */function Js(t,e){if(void 0===e&&(e=[]),null===t||"object"!=typeof t)return t;var n,r=(n=function(e){return e.original===t},e.filter(n)[0]);if(r)return r.copy;var o=Array.isArray(t)?[]:{};return e.push({original:t,copy:o}),Object.keys(t).forEach((function(n){o[n]=Js(t[n],e)})),o}function Ys(t,e){Object.keys(t).forEach((function(n){return e(t[n],n)}))}function Xs(t){return null!==t&&"object"==typeof t}function Zs(t,e){if(!t)throw new Error("[vuex] "+e)}function tu(t,e,n){return e.indexOf(t)<0&&(n&&n.prepend?e.unshift(t):e.push(t)),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}function eu(t,e){t._actions=Object.create(null),t._mutations=Object.create(null),t._wrappedGetters=Object.create(null),t._modulesNamespaceMap=Object.create(null);var n=t.state;ru(t,n,[],t._modules.root,!0),nu(t,n,e)}function nu(t,e,n){var r=t._state,o=t._scope;t.getters={},t._makeLocalGettersCache=Object.create(null);var i,a=t._wrappedGetters,s={},u={},l=new Jt(!0);l.run((function(){Ys(a,(function(e,n){s[n]=function(t,e){return function(){return t(e)}}(e,t),u[n]=function(t,e){var n,r,o=c(t);o?(n=t,r=R):(n=t.get,r=t.set);var i=at()?null:new Ze(ft,n,R,{lazy:!0}),a={effect:i,get value(){return i?(i.dirty&&i.evaluate(),bt.target&&i.depend(),i.value):n()},set value(t){r(t)}};return W(a,"__v_isRef",!0),W(a,"__v_isReadonly",o),a}((function(){return s[n]()})),Object.defineProperty(t.getters,n,{get:function(){return u[n].value},enumerable:!0})}))})),t._state=(Nt(i={data:e},!1),i),t._scope=l,t.strict&&function(t){Kt((function(){return t._state.data}),(function(){Zs(t._committing,"do not mutate vuex store state outside mutation handlers.")}),{deep:!0,flush:"sync"})}(t),r&&n&&t._withCommit((function(){r.data=null})),o&&o.stop()}function ru(t,e,n,r,o){var i=!n.length,a=t._modules.getNamespace(n);if(r.namespaced&&(t._modulesNamespaceMap[a]&&console.error("[vuex] duplicate namespace "+a+" for the namespaced module "+n.join("/")),t._modulesNamespaceMap[a]=r),!i&&!o){var s=iu(e,n.slice(0,-1)),u=n[n.length-1];t._withCommit((function(){u in s&&console.warn('[vuex] state field "'+u+'" was overridden by a module with the same name at "'+n.join(".")+'"'),s[u]=r.state}))}var c=r.context=function(t,e,n){var r=""===e,o={dispatch:r?t.dispatch:function(n,r,o){var i=au(n,r,o),a=i.payload,s=i.options,u=i.type;if(s&&s.root||(u=e+u,t._actions[u]))return t.dispatch(u,a);console.error("[vuex] unknown local action type: "+i.type+", global type: "+u)},commit:r?t.commit:function(n,r,o){var i=au(n,r,o),a=i.payload,s=i.options,u=i.type;s&&s.root||(u=e+u,t._mutations[u])?t.commit(u,a,s):console.error("[vuex] unknown local mutation type: "+i.type+", global type: "+u)}};return Object.defineProperties(o,{getters:{get:r?function(){return t.getters}:function(){return ou(t,e)}},state:{get:function(){return iu(t.state,n)}}}),o}(t,a,n);r.forEachMutation((function(e,n){!function(t,e,n,r){(t._mutations[e]||(t._mutations[e]=[])).push((function(e){n.call(t,r.state,e)}))}(t,a+n,e,c)})),r.forEachAction((function(e,n){var r=e.root?n:a+n,o=e.handler||e;!function(t,e,n,r){(t._actions[e]||(t._actions[e]=[])).push((function(e){var o,i=n.call(t,{dispatch:r.dispatch,commit:r.commit,getters:r.getters,state:r.state,rootGetters:t.getters,rootState:t.state},e);return(o=i)&&"function"==typeof o.then||(i=Promise.resolve(i)),t._devtoolHook?i.catch((function(e){throw t._devtoolHook.emit("vuex:error",e),e})):i}))}(t,r,o,c)})),r.forEachGetter((function(e,n){!function(t,e,n,r){if(t._wrappedGetters[e])return void console.error("[vuex] duplicate getter key: "+e);t._wrappedGetters[e]=function(t){return n(r.state,r.getters,t.state,t.getters)}}(t,a+n,e,c)})),r.forEachChild((function(r,i){ru(t,e,n.concat(i),r,o)}))}function ou(t,e){if(!t._makeLocalGettersCache[e]){var n={},r=e.length;Object.keys(t.getters).forEach((function(o){if(o.slice(0,r)===e){var i=o.slice(r);Object.defineProperty(n,i,{get:function(){return t.getters[o]},enumerable:!0})}})),t._makeLocalGettersCache[e]=n}return t._makeLocalGettersCache[e]}function iu(t,e){return e.reduce((function(t,e){return t[e]}),t)}function au(t,e,n){return Xs(t)&&t.type&&(n=e,e=t,t=t.type),Zs("string"==typeof t,"expects string as the type, but found "+typeof t+"."),{type:t,payload:e,options:n}}var su=0;function uu(t,e){Qs({id:"org.vuejs.vuex",app:t,label:"Vuex",homepage:"https://next.vuex.vuejs.org/",logo:"https://vuejs.org/images/icons/favicon-96x96.png",packageName:"vuex",componentStateTypes:["vuex bindings"]},(function(n){n.addTimelineLayer({id:"vuex:mutations",label:"Vuex Mutations",color:cu}),n.addTimelineLayer({id:"vuex:actions",label:"Vuex Actions",color:cu}),n.addInspector({id:"vuex",label:"Vuex",icon:"storage",treeFilterPlaceholder:"Filter stores..."}),n.on.getInspectorTree((function(n){if(n.app===t&&"vuex"===n.inspectorId)if(n.filter){var r=[];!function t(e,n,r,o){o.includes(r)&&e.push({id:o||"root",label:o.endsWith("/")?o.slice(0,o.length-1):o||"Root",tags:n.namespaced?[lu]:[]});Object.keys(n._children).forEach((function(i){t(e,n._children[i],r,o+i+"/")}))}(r,e._modules.root,n.filter,""),n.rootNodes=r}else n.rootNodes=[pu(e._modules.root,"")]})),n.on.getInspectorState((function(n){if(n.app===t&&"vuex"===n.inspectorId){var r=n.nodeId;ou(e,r),n.state=function(t,e,n){e="root"===n?e:e[n];var r=Object.keys(e),o={state:Object.keys(t.state).map((function(e){return{key:e,editable:!0,value:t.state[e]}}))};if(r.length){var i=function(t){var e={};return Object.keys(t).forEach((function(n){var r=n.split("/");if(r.length>1){var o=e,i=r.pop();r.forEach((function(t){o[t]||(o[t]={_custom:{value:{},display:t,tooltip:"Module",abstract:!0}}),o=o[t]._custom.value})),o[i]=du((function(){return t[n]}))}else e[n]=du((function(){return t[n]}))})),e}(e);o.getters=Object.keys(i).map((function(t){return{key:t.endsWith("/")?fu(t):t,editable:!1,value:du((function(){return i[t]}))}}))}return o}((o=e._modules,(a=(i=r).split("/").filter((function(t){return t}))).reduce((function(t,e,n){var r=t[e];if(!r)throw new Error('Missing module "'+e+'" for path "'+i+'".');return n===a.length-1?r:r._children}),"root"===i?o:o.root._children)),"root"===r?e.getters:e._makeLocalGettersCache,r)}var o,i,a})),n.on.editInspectorState((function(n){if(n.app===t&&"vuex"===n.inspectorId){var r=n.nodeId,o=n.path;"root"!==r&&(o=r.split("/").filter(Boolean).concat(o)),e._withCommit((function(){n.set(e._state.data,o,n.state.value)}))}})),e.subscribe((function(t,e){var r={};t.payload&&(r.payload=t.payload),r.state=e,n.notifyComponentUpdate(),n.sendInspectorTree("vuex"),n.sendInspectorState("vuex"),n.addTimelineEvent({layerId:"vuex:mutations",event:{time:Date.now(),title:t.type,data:r}})})),e.subscribeAction({before:function(t,e){var r={};t.payload&&(r.payload=t.payload),t._id=su++,t._time=Date.now(),r.state=e,n.addTimelineEvent({layerId:"vuex:actions",event:{time:t._time,title:t.type,groupId:t._id,subtitle:"start",data:r}})},after:function(t,e){var r={},o=Date.now()-t._time;r.duration={_custom:{type:"duration",display:o+"ms",tooltip:"Action duration",value:o}},t.payload&&(r.payload=t.payload),r.state=e,n.addTimelineEvent({layerId:"vuex:actions",event:{time:Date.now(),title:t.type,groupId:t._id,subtitle:"end",data:r}})}})}))}var cu=8702998,lu={label:"namespaced",textColor:16777215,backgroundColor:6710886};function fu(t){return t&&"root"!==t?t.split("/").slice(-2,-1)[0]:"Root"}function pu(t,e){return{id:e||"root",label:fu(e),tags:t.namespaced?[lu]:[],children:Object.keys(t._children).map((function(n){return pu(t._children[n],e+n+"/")}))}}function du(t){try{return t()}catch(t){return t}}var hu=function(t,e){this.runtime=e,this._children=Object.create(null),this._rawModule=t;var n=t.state;this.state=("function"==typeof n?n():n)||{}},vu={namespaced:{configurable:!0}};vu.namespaced.get=function(){return!!this._rawModule.namespaced},hu.prototype.addChild=function(t,e){this._children[t]=e},hu.prototype.removeChild=function(t){delete this._children[t]},hu.prototype.getChild=function(t){return this._children[t]},hu.prototype.hasChild=function(t){return t in this._children},hu.prototype.update=function(t){this._rawModule.namespaced=t.namespaced,t.actions&&(this._rawModule.actions=t.actions),t.mutations&&(this._rawModule.mutations=t.mutations),t.getters&&(this._rawModule.getters=t.getters)},hu.prototype.forEachChild=function(t){Ys(this._children,t)},hu.prototype.forEachGetter=function(t){this._rawModule.getters&&Ys(this._rawModule.getters,t)},hu.prototype.forEachAction=function(t){this._rawModule.actions&&Ys(this._rawModule.actions,t)},hu.prototype.forEachMutation=function(t){this._rawModule.mutations&&Ys(this._rawModule.mutations,t)},Object.defineProperties(hu.prototype,vu);var gu=function(t){this.register([],t,!1)};gu.prototype.get=function(t){return t.reduce((function(t,e){return t.getChild(e)}),this.root)},gu.prototype.getNamespace=function(t){var e=this.root;return t.reduce((function(t,n){return t+((e=e.getChild(n)).namespaced?n+"/":"")}),"")},gu.prototype.update=function(t){!function t(e,n,r){if(bu(e,r),n.update(r),r.modules)for(var o in r.modules){if(!n.getChild(o))return void console.warn("[vuex] trying to add a new module '"+o+"' on hot reloading, manual reload is needed");t(e.concat(o),n.getChild(o),r.modules[o])}}([],this.root,t)},gu.prototype.register=function(t,e,n){var r=this;void 0===n&&(n=!0),bu(t,e);var o=new hu(e,n);0===t.length?this.root=o:this.get(t.slice(0,-1)).addChild(t[t.length-1],o);e.modules&&Ys(e.modules,(function(e,o){r.register(t.concat(o),e,n)}))},gu.prototype.unregister=function(t){var e=this.get(t.slice(0,-1)),n=t[t.length-1],r=e.getChild(n);r?r.runtime&&e.removeChild(n):console.warn("[vuex] trying to unregister module '"+n+"', which is not registered")},gu.prototype.isRegistered=function(t){var e=this.get(t.slice(0,-1)),n=t[t.length-1];return!!e&&e.hasChild(n)};var mu={assert:function(t){return"function"==typeof t},expected:"function"},yu={getters:mu,mutations:mu,actions:{assert:function(t){return"function"==typeof t||"object"==typeof t&&"function"==typeof t.handler},expected:'function or object with "handler" function'}};function bu(t,e){Object.keys(yu).forEach((function(n){if(e[n]){var r=yu[n];Ys(e[n],(function(e,o){Zs(r.assert(e),function(t,e,n,r,o){var i=e+" should be "+o+' but "'+e+"."+n+'"';t.length>0&&(i+=' in module "'+t.join(".")+'"');return i+=" is "+JSON.stringify(r)+"."}(t,n,o,e,r.expected))}))}}))}var _u=function t(e){var n=this;void 0===e&&(e={}),Zs("undefined"!=typeof Promise,"vuex requires a Promise polyfill in this browser."),Zs(this instanceof t,"store must be called with the new operator.");var r=e.plugins;void 0===r&&(r=[]);var o=e.strict;void 0===o&&(o=!1);var i=e.devtools;this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new gu(e),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._makeLocalGettersCache=Object.create(null),this._scope=null,this._devtools=i;var a=this,s=this.dispatch,u=this.commit;this.dispatch=function(t,e){return s.call(a,t,e)},this.commit=function(t,e,n){return u.call(a,t,e,n)},this.strict=o;var c=this._modules.root.state;ru(this,c,[],this._modules.root),nu(this,c),r.forEach((function(t){return t(n)}))},wu={state:{configurable:!0}};_u.prototype.install=function(t,e){t.provide(e||"store",this),t.config.globalProperties.$store=this,(void 0===this._devtools||this._devtools)&&uu(t,this)},wu.state.get=function(){return this._state.data},wu.state.set=function(t){Zs(!1,"use store.replaceState() to explicit replace store state.")},_u.prototype.commit=function(t,e,n){var r=this,o=au(t,e,n),i=o.type,a=o.payload,s=o.options,u={type:i,payload:a},c=this._mutations[i];c?(this._withCommit((function(){c.forEach((function(t){t(a)}))})),this._subscribers.slice().forEach((function(t){return t(u,r.state)})),s&&s.silent&&console.warn("[vuex] mutation type: "+i+". Silent option has been removed. Use the filter functionality in the vue-devtools")):console.error("[vuex] unknown mutation type: "+i)},_u.prototype.dispatch=function(t,e){var n=this,r=au(t,e),o=r.type,i=r.payload,a={type:o,payload:i},s=this._actions[o];if(s){try{this._actionSubscribers.slice().filter((function(t){return t.before})).forEach((function(t){return t.before(a,n.state)}))}catch(t){console.warn("[vuex] error in before action subscribers: "),console.error(t)}var u=s.length>1?Promise.all(s.map((function(t){return t(i)}))):s[0](i);return new Promise((function(t,e){u.then((function(e){try{n._actionSubscribers.filter((function(t){return t.after})).forEach((function(t){return t.after(a,n.state)}))}catch(t){console.warn("[vuex] error in after action subscribers: "),console.error(t)}t(e)}),(function(t){try{n._actionSubscribers.filter((function(t){return t.error})).forEach((function(e){return e.error(a,n.state,t)}))}catch(t){console.warn("[vuex] error in error action subscribers: "),console.error(t)}e(t)}))}))}console.error("[vuex] unknown action type: "+o)},_u.prototype.subscribe=function(t,e){return tu(t,this._subscribers,e)},_u.prototype.subscribeAction=function(t,e){return tu("function"==typeof t?{before:t}:t,this._actionSubscribers,e)},_u.prototype.watch=function(t,e,n){var r=this;return Zs("function"==typeof t,"store.watch only accepts a function."),Kt((function(){return t(r.state,r.getters)}),e,Object.assign({},n))},_u.prototype.replaceState=function(t){var e=this;this._withCommit((function(){e._state.data=t}))},_u.prototype.registerModule=function(t,e,n){void 0===n&&(n={}),"string"==typeof t&&(t=[t]),Zs(Array.isArray(t),"module path must be a string or an Array."),Zs(t.length>0,"cannot register the root module by using registerModule."),this._modules.register(t,e),ru(this,this.state,t,this._modules.get(t),n.preserveState),nu(this,this.state)},_u.prototype.unregisterModule=function(t){var e=this;"string"==typeof t&&(t=[t]),Zs(Array.isArray(t),"module path must be a string or an Array."),this._modules.unregister(t),this._withCommit((function(){delete iu(e.state,t.slice(0,-1))[t[t.length-1]]})),eu(this)},_u.prototype.hasModule=function(t){return"string"==typeof t&&(t=[t]),Zs(Array.isArray(t),"module path must be a string or an Array."),this._modules.isRegistered(t)},_u.prototype.hotUpdate=function(t){this._modules.update(t),eu(this,!0)},_u.prototype._withCommit=function(t){var e=this._committing;this._committing=!0,t(),this._committing=e},Object.defineProperties(_u.prototype,wu);var xu=$u((function(t,e){var n={};return ju(e)||console.error("[vuex] mapState: mapper parameter must be either an Array or an Object"),Cu(e).forEach((function(e){var r=e.key,o=e.val;n[r]=function(){var e=this.$store.state,n=this.$store.getters;if(t){var r=Pu(this.$store,"mapState",t);if(!r)return;e=r.context.state,n=r.context.getters}return"function"==typeof o?o.call(this,e,n):e[o]},n[r].vuex=!0})),n})),ku=$u((function(t,e){var n={};return ju(e)||console.error("[vuex] mapMutations: mapper parameter must be either an Array or an Object"),Cu(e).forEach((function(e){var r=e.key,o=e.val;n[r]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var r=this.$store.commit;if(t){var i=Pu(this.$store,"mapMutations",t);if(!i)return;r=i.context.commit}return"function"==typeof o?o.apply(this,[r].concat(e)):r.apply(this.$store,[o].concat(e))}})),n})),Ou=$u((function(t,e){var n={};return ju(e)||console.error("[vuex] mapGetters: mapper parameter must be either an Array or an Object"),Cu(e).forEach((function(e){var r=e.key,o=e.val;o=t+o,n[r]=function(){if(!t||Pu(this.$store,"mapGetters",t)){if(o in this.$store.getters)return this.$store.getters[o];console.error("[vuex] unknown getter: "+o)}},n[r].vuex=!0})),n})),Su=$u((function(t,e){var n={};return ju(e)||console.error("[vuex] mapActions: mapper parameter must be either an Array or an Object"),Cu(e).forEach((function(e){var r=e.key,o=e.val;n[r]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var r=this.$store.dispatch;if(t){var i=Pu(this.$store,"mapActions",t);if(!i)return;r=i.context.dispatch}return"function"==typeof o?o.apply(this,[r].concat(e)):r.apply(this.$store,[o].concat(e))}})),n}));function Cu(t){return ju(t)?Array.isArray(t)?t.map((function(t){return{key:t,val:t}})):Object.keys(t).map((function(e){return{key:e,val:t[e]}})):[]}function ju(t){return Array.isArray(t)||Xs(t)}function $u(t){return function(e,n){return"string"!=typeof e?(n=e,e=""):"/"!==e.charAt(e.length-1)&&(e+="/"),t(e,n)}}function Pu(t,e,n){var r=t._modulesNamespaceMap[n];return r||console.error("[vuex] module namespace not found in "+e+"(): "+n),r}function Eu(t,e,n){var r=n?t.groupCollapsed:t.group;try{r.call(t,e)}catch(n){t.log(e)}}function Au(t){try{t.groupEnd()}catch(e){t.log("—— log end ——")}}function Tu(){var t=new Date;return" @ "+Lu(t.getHours(),2)+":"+Lu(t.getMinutes(),2)+":"+Lu(t.getSeconds(),2)+"."+Lu(t.getMilliseconds(),3)}function Lu(t,e){return n="0",r=e-t.toString().length,new Array(r+1).join(n)+t;var n,r}var Ru={version:"4.1.0",Store:_u,storeKey:"store",createStore:function(t){return new _u(t)},useStore:function(t){return void 0===t&&(t=null),function(t,e,n){void 0===n&&(n=!1);var r=ft;if(r){var o=r.$parent&&r.$parent._provided;if(o&&t in o)return o[t];if(arguments.length>1)return n&&c(e)?e.call(r):e}else 0}(null!==t?t:"store")},mapState:xu,mapMutations:ku,mapGetters:Ou,mapActions:Su,createNamespacedHelpers:function(t){return{mapState:xu.bind(null,t),mapGetters:Ou.bind(null,t),mapMutations:ku.bind(null,t),mapActions:Su.bind(null,t)}},createLogger:function(t){void 0===t&&(t={});var e=t.collapsed;void 0===e&&(e=!0);var n=t.filter;void 0===n&&(n=function(t,e,n){return!0});var r=t.transformer;void 0===r&&(r=function(t){return t});var o=t.mutationTransformer;void 0===o&&(o=function(t){return t});var i=t.actionFilter;void 0===i&&(i=function(t,e){return!0});var a=t.actionTransformer;void 0===a&&(a=function(t){return t});var s=t.logMutations;void 0===s&&(s=!0);var u=t.logActions;void 0===u&&(u=!0);var c=t.logger;return void 0===c&&(c=console),function(t){var l=Js(t.state);void 0!==c&&(s&&t.subscribe((function(t,i){var a=Js(i);if(n(t,l,a)){var s=Tu(),u=o(t),f="mutation "+t.type+s;Eu(c,f,e),c.log("%c prev state","color: #9E9E9E; font-weight: bold",r(l)),c.log("%c mutation","color: #03A9F4; font-weight: bold",u),c.log("%c next state","color: #4CAF50; font-weight: bold",r(a)),Au(c)}l=a})),u&&t.subscribeAction((function(t,n){if(i(t,n)){var r=Tu(),o=a(t),s="action "+t.type+r;Eu(c,s,e),c.log("%c action","color: #03A9F4; font-weight: bold",o),Au(c)}})))}}};er.use(Ru);var Iu=new Ru.Store({state:{isLight:!1,isSearchModalOpen:!1},mutations:{openSearchModal(t){t.isSearchModalOpen=!0},closeSearchModal(t){t.isSearchModalOpen=!1},toggleLightMode(t){t.isLight=!t.isLight}}});n(239);er.component("Badge",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,316))),er.component("CodeBlock",()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,312))),er.component("CodeGroup",()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,313)));n(240);var Mu=[({Vue:t,options:e,router:n,siteData:r})=>{t.mixin({beforeCreate(){this.$store=Iu}})},{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({Vue:t})=>{t.component("CodeCopy",Ns)}],Nu=[];class Du extends class{constructor(){this.store=new er({data:{state:{}}})}$get(t){return this.store.state[t]}$set(t,e){er.set(this.store.state,t,e)}$emit(...t){this.store.$emit(...t)}$on(...t){this.store.$on(...t)}}{}Object.assign(Du.prototype,{getPageAsyncComponent:vs,getLayoutAsyncComponent:gs,getAsyncComponent:ms,getVueComponent:ys});var Uu={install(t){const e=new Du;t.$vuepress=e,t.prototype.$vuepress=e}};function Fu(t,e){const n=e.toLowerCase();return t.options.routes.some(t=>t.path.toLowerCase()===n)}var Bu={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return _s("pageKey",e),er.component(e)||er.component(e,vs(e)),er.component(e)?t(e):t("")}},qu={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:["content__"+e.slotKey]},n()[e.slotKey])},zu={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},Vu=(n(241),n(242),Object(Ms.a)(zu,(function(){var t=this._self._c;return t("span",[t("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[t("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),t("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),t("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),Gu={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};er.config.productionTip=!1,er.use(Za),er.use(Uu),er.mixin(function(t,e,n=er){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e});Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const r=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),i={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),i),{computed:i}}(t=>class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const r in t)"/"===r?n=t[r]:0===this.$page.path.indexOf(r)&&(e=t[r]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:t}=this.$page.frontmatter;return"string"==typeof t&&t}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!er.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(t.hash)}:{x:0,y:0})});!function(t){t.beforeEach((e,n,r)=>{if(Fu(t,e.path))r();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";Fu(t,n)?r(n):r()}else r();else{const n=e.path+"/",o=e.path+".html";Fu(t,o)?r(o):Fu(t,n)?r(n):r()}})}(n);const r={};try{await Promise.all(Mu.filter(t=>"function"==typeof t).map(e=>e({Vue:er,options:r,router:n,siteData:qs,isServer:t})))}catch(t){console.error(t)}return{app:new er(Object.assign(r,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("RouterView",{ref:"layout"}),t("div",{class:"global-ui"},Nu.map(e=>t(e)))])})),router:n}}(!1).then(({app:t,router:e})=>{e.onReady(()=>{t.$mount("#app")})})}]); \ No newline at end of file + */function Js(t,e){if(void 0===e&&(e=[]),null===t||"object"!=typeof t)return t;var n,r=(n=function(e){return e.original===t},e.filter(n)[0]);if(r)return r.copy;var o=Array.isArray(t)?[]:{};return e.push({original:t,copy:o}),Object.keys(t).forEach((function(n){o[n]=Js(t[n],e)})),o}function Ys(t,e){Object.keys(t).forEach((function(n){return e(t[n],n)}))}function Xs(t){return null!==t&&"object"==typeof t}function Zs(t,e){if(!t)throw new Error("[vuex] "+e)}function tu(t,e,n){return e.indexOf(t)<0&&(n&&n.prepend?e.unshift(t):e.push(t)),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}function eu(t,e){t._actions=Object.create(null),t._mutations=Object.create(null),t._wrappedGetters=Object.create(null),t._modulesNamespaceMap=Object.create(null);var n=t.state;ru(t,n,[],t._modules.root,!0),nu(t,n,e)}function nu(t,e,n){var r=t._state,o=t._scope;t.getters={},t._makeLocalGettersCache=Object.create(null);var i,a=t._wrappedGetters,s={},u={},l=new Jt(!0);l.run((function(){Ys(a,(function(e,n){s[n]=function(t,e){return function(){return t(e)}}(e,t),u[n]=function(t,e){var n,r,o=c(t);o?(n=t,r=R):(n=t.get,r=t.set);var i=at()?null:new Ze(ft,n,R,{lazy:!0}),a={effect:i,get value(){return i?(i.dirty&&i.evaluate(),bt.target&&i.depend(),i.value):n()},set value(t){r(t)}};return W(a,"__v_isRef",!0),W(a,"__v_isReadonly",o),a}((function(){return s[n]()})),Object.defineProperty(t.getters,n,{get:function(){return u[n].value},enumerable:!0})}))})),t._state=(Nt(i={data:e},!1),i),t._scope=l,t.strict&&function(t){Kt((function(){return t._state.data}),(function(){Zs(t._committing,"do not mutate vuex store state outside mutation handlers.")}),{deep:!0,flush:"sync"})}(t),r&&n&&t._withCommit((function(){r.data=null})),o&&o.stop()}function ru(t,e,n,r,o){var i=!n.length,a=t._modules.getNamespace(n);if(r.namespaced&&(t._modulesNamespaceMap[a]&&console.error("[vuex] duplicate namespace "+a+" for the namespaced module "+n.join("/")),t._modulesNamespaceMap[a]=r),!i&&!o){var s=iu(e,n.slice(0,-1)),u=n[n.length-1];t._withCommit((function(){u in s&&console.warn('[vuex] state field "'+u+'" was overridden by a module with the same name at "'+n.join(".")+'"'),s[u]=r.state}))}var c=r.context=function(t,e,n){var r=""===e,o={dispatch:r?t.dispatch:function(n,r,o){var i=au(n,r,o),a=i.payload,s=i.options,u=i.type;if(s&&s.root||(u=e+u,t._actions[u]))return t.dispatch(u,a);console.error("[vuex] unknown local action type: "+i.type+", global type: "+u)},commit:r?t.commit:function(n,r,o){var i=au(n,r,o),a=i.payload,s=i.options,u=i.type;s&&s.root||(u=e+u,t._mutations[u])?t.commit(u,a,s):console.error("[vuex] unknown local mutation type: "+i.type+", global type: "+u)}};return Object.defineProperties(o,{getters:{get:r?function(){return t.getters}:function(){return ou(t,e)}},state:{get:function(){return iu(t.state,n)}}}),o}(t,a,n);r.forEachMutation((function(e,n){!function(t,e,n,r){(t._mutations[e]||(t._mutations[e]=[])).push((function(e){n.call(t,r.state,e)}))}(t,a+n,e,c)})),r.forEachAction((function(e,n){var r=e.root?n:a+n,o=e.handler||e;!function(t,e,n,r){(t._actions[e]||(t._actions[e]=[])).push((function(e){var o,i=n.call(t,{dispatch:r.dispatch,commit:r.commit,getters:r.getters,state:r.state,rootGetters:t.getters,rootState:t.state},e);return(o=i)&&"function"==typeof o.then||(i=Promise.resolve(i)),t._devtoolHook?i.catch((function(e){throw t._devtoolHook.emit("vuex:error",e),e})):i}))}(t,r,o,c)})),r.forEachGetter((function(e,n){!function(t,e,n,r){if(t._wrappedGetters[e])return void console.error("[vuex] duplicate getter key: "+e);t._wrappedGetters[e]=function(t){return n(r.state,r.getters,t.state,t.getters)}}(t,a+n,e,c)})),r.forEachChild((function(r,i){ru(t,e,n.concat(i),r,o)}))}function ou(t,e){if(!t._makeLocalGettersCache[e]){var n={},r=e.length;Object.keys(t.getters).forEach((function(o){if(o.slice(0,r)===e){var i=o.slice(r);Object.defineProperty(n,i,{get:function(){return t.getters[o]},enumerable:!0})}})),t._makeLocalGettersCache[e]=n}return t._makeLocalGettersCache[e]}function iu(t,e){return e.reduce((function(t,e){return t[e]}),t)}function au(t,e,n){return Xs(t)&&t.type&&(n=e,e=t,t=t.type),Zs("string"==typeof t,"expects string as the type, but found "+typeof t+"."),{type:t,payload:e,options:n}}var su=0;function uu(t,e){Qs({id:"org.vuejs.vuex",app:t,label:"Vuex",homepage:"https://next.vuex.vuejs.org/",logo:"https://vuejs.org/images/icons/favicon-96x96.png",packageName:"vuex",componentStateTypes:["vuex bindings"]},(function(n){n.addTimelineLayer({id:"vuex:mutations",label:"Vuex Mutations",color:cu}),n.addTimelineLayer({id:"vuex:actions",label:"Vuex Actions",color:cu}),n.addInspector({id:"vuex",label:"Vuex",icon:"storage",treeFilterPlaceholder:"Filter stores..."}),n.on.getInspectorTree((function(n){if(n.app===t&&"vuex"===n.inspectorId)if(n.filter){var r=[];!function t(e,n,r,o){o.includes(r)&&e.push({id:o||"root",label:o.endsWith("/")?o.slice(0,o.length-1):o||"Root",tags:n.namespaced?[lu]:[]});Object.keys(n._children).forEach((function(i){t(e,n._children[i],r,o+i+"/")}))}(r,e._modules.root,n.filter,""),n.rootNodes=r}else n.rootNodes=[pu(e._modules.root,"")]})),n.on.getInspectorState((function(n){if(n.app===t&&"vuex"===n.inspectorId){var r=n.nodeId;ou(e,r),n.state=function(t,e,n){e="root"===n?e:e[n];var r=Object.keys(e),o={state:Object.keys(t.state).map((function(e){return{key:e,editable:!0,value:t.state[e]}}))};if(r.length){var i=function(t){var e={};return Object.keys(t).forEach((function(n){var r=n.split("/");if(r.length>1){var o=e,i=r.pop();r.forEach((function(t){o[t]||(o[t]={_custom:{value:{},display:t,tooltip:"Module",abstract:!0}}),o=o[t]._custom.value})),o[i]=du((function(){return t[n]}))}else e[n]=du((function(){return t[n]}))})),e}(e);o.getters=Object.keys(i).map((function(t){return{key:t.endsWith("/")?fu(t):t,editable:!1,value:du((function(){return i[t]}))}}))}return o}((o=e._modules,(a=(i=r).split("/").filter((function(t){return t}))).reduce((function(t,e,n){var r=t[e];if(!r)throw new Error('Missing module "'+e+'" for path "'+i+'".');return n===a.length-1?r:r._children}),"root"===i?o:o.root._children)),"root"===r?e.getters:e._makeLocalGettersCache,r)}var o,i,a})),n.on.editInspectorState((function(n){if(n.app===t&&"vuex"===n.inspectorId){var r=n.nodeId,o=n.path;"root"!==r&&(o=r.split("/").filter(Boolean).concat(o)),e._withCommit((function(){n.set(e._state.data,o,n.state.value)}))}})),e.subscribe((function(t,e){var r={};t.payload&&(r.payload=t.payload),r.state=e,n.notifyComponentUpdate(),n.sendInspectorTree("vuex"),n.sendInspectorState("vuex"),n.addTimelineEvent({layerId:"vuex:mutations",event:{time:Date.now(),title:t.type,data:r}})})),e.subscribeAction({before:function(t,e){var r={};t.payload&&(r.payload=t.payload),t._id=su++,t._time=Date.now(),r.state=e,n.addTimelineEvent({layerId:"vuex:actions",event:{time:t._time,title:t.type,groupId:t._id,subtitle:"start",data:r}})},after:function(t,e){var r={},o=Date.now()-t._time;r.duration={_custom:{type:"duration",display:o+"ms",tooltip:"Action duration",value:o}},t.payload&&(r.payload=t.payload),r.state=e,n.addTimelineEvent({layerId:"vuex:actions",event:{time:Date.now(),title:t.type,groupId:t._id,subtitle:"end",data:r}})}})}))}var cu=8702998,lu={label:"namespaced",textColor:16777215,backgroundColor:6710886};function fu(t){return t&&"root"!==t?t.split("/").slice(-2,-1)[0]:"Root"}function pu(t,e){return{id:e||"root",label:fu(e),tags:t.namespaced?[lu]:[],children:Object.keys(t._children).map((function(n){return pu(t._children[n],e+n+"/")}))}}function du(t){try{return t()}catch(t){return t}}var hu=function(t,e){this.runtime=e,this._children=Object.create(null),this._rawModule=t;var n=t.state;this.state=("function"==typeof n?n():n)||{}},vu={namespaced:{configurable:!0}};vu.namespaced.get=function(){return!!this._rawModule.namespaced},hu.prototype.addChild=function(t,e){this._children[t]=e},hu.prototype.removeChild=function(t){delete this._children[t]},hu.prototype.getChild=function(t){return this._children[t]},hu.prototype.hasChild=function(t){return t in this._children},hu.prototype.update=function(t){this._rawModule.namespaced=t.namespaced,t.actions&&(this._rawModule.actions=t.actions),t.mutations&&(this._rawModule.mutations=t.mutations),t.getters&&(this._rawModule.getters=t.getters)},hu.prototype.forEachChild=function(t){Ys(this._children,t)},hu.prototype.forEachGetter=function(t){this._rawModule.getters&&Ys(this._rawModule.getters,t)},hu.prototype.forEachAction=function(t){this._rawModule.actions&&Ys(this._rawModule.actions,t)},hu.prototype.forEachMutation=function(t){this._rawModule.mutations&&Ys(this._rawModule.mutations,t)},Object.defineProperties(hu.prototype,vu);var gu=function(t){this.register([],t,!1)};gu.prototype.get=function(t){return t.reduce((function(t,e){return t.getChild(e)}),this.root)},gu.prototype.getNamespace=function(t){var e=this.root;return t.reduce((function(t,n){return t+((e=e.getChild(n)).namespaced?n+"/":"")}),"")},gu.prototype.update=function(t){!function t(e,n,r){if(bu(e,r),n.update(r),r.modules)for(var o in r.modules){if(!n.getChild(o))return void console.warn("[vuex] trying to add a new module '"+o+"' on hot reloading, manual reload is needed");t(e.concat(o),n.getChild(o),r.modules[o])}}([],this.root,t)},gu.prototype.register=function(t,e,n){var r=this;void 0===n&&(n=!0),bu(t,e);var o=new hu(e,n);0===t.length?this.root=o:this.get(t.slice(0,-1)).addChild(t[t.length-1],o);e.modules&&Ys(e.modules,(function(e,o){r.register(t.concat(o),e,n)}))},gu.prototype.unregister=function(t){var e=this.get(t.slice(0,-1)),n=t[t.length-1],r=e.getChild(n);r?r.runtime&&e.removeChild(n):console.warn("[vuex] trying to unregister module '"+n+"', which is not registered")},gu.prototype.isRegistered=function(t){var e=this.get(t.slice(0,-1)),n=t[t.length-1];return!!e&&e.hasChild(n)};var mu={assert:function(t){return"function"==typeof t},expected:"function"},yu={getters:mu,mutations:mu,actions:{assert:function(t){return"function"==typeof t||"object"==typeof t&&"function"==typeof t.handler},expected:'function or object with "handler" function'}};function bu(t,e){Object.keys(yu).forEach((function(n){if(e[n]){var r=yu[n];Ys(e[n],(function(e,o){Zs(r.assert(e),function(t,e,n,r,o){var i=e+" should be "+o+' but "'+e+"."+n+'"';t.length>0&&(i+=' in module "'+t.join(".")+'"');return i+=" is "+JSON.stringify(r)+"."}(t,n,o,e,r.expected))}))}}))}var _u=function t(e){var n=this;void 0===e&&(e={}),Zs("undefined"!=typeof Promise,"vuex requires a Promise polyfill in this browser."),Zs(this instanceof t,"store must be called with the new operator.");var r=e.plugins;void 0===r&&(r=[]);var o=e.strict;void 0===o&&(o=!1);var i=e.devtools;this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new gu(e),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._makeLocalGettersCache=Object.create(null),this._scope=null,this._devtools=i;var a=this,s=this.dispatch,u=this.commit;this.dispatch=function(t,e){return s.call(a,t,e)},this.commit=function(t,e,n){return u.call(a,t,e,n)},this.strict=o;var c=this._modules.root.state;ru(this,c,[],this._modules.root),nu(this,c),r.forEach((function(t){return t(n)}))},wu={state:{configurable:!0}};_u.prototype.install=function(t,e){t.provide(e||"store",this),t.config.globalProperties.$store=this,(void 0===this._devtools||this._devtools)&&uu(t,this)},wu.state.get=function(){return this._state.data},wu.state.set=function(t){Zs(!1,"use store.replaceState() to explicit replace store state.")},_u.prototype.commit=function(t,e,n){var r=this,o=au(t,e,n),i=o.type,a=o.payload,s=o.options,u={type:i,payload:a},c=this._mutations[i];c?(this._withCommit((function(){c.forEach((function(t){t(a)}))})),this._subscribers.slice().forEach((function(t){return t(u,r.state)})),s&&s.silent&&console.warn("[vuex] mutation type: "+i+". Silent option has been removed. Use the filter functionality in the vue-devtools")):console.error("[vuex] unknown mutation type: "+i)},_u.prototype.dispatch=function(t,e){var n=this,r=au(t,e),o=r.type,i=r.payload,a={type:o,payload:i},s=this._actions[o];if(s){try{this._actionSubscribers.slice().filter((function(t){return t.before})).forEach((function(t){return t.before(a,n.state)}))}catch(t){console.warn("[vuex] error in before action subscribers: "),console.error(t)}var u=s.length>1?Promise.all(s.map((function(t){return t(i)}))):s[0](i);return new Promise((function(t,e){u.then((function(e){try{n._actionSubscribers.filter((function(t){return t.after})).forEach((function(t){return t.after(a,n.state)}))}catch(t){console.warn("[vuex] error in after action subscribers: "),console.error(t)}t(e)}),(function(t){try{n._actionSubscribers.filter((function(t){return t.error})).forEach((function(e){return e.error(a,n.state,t)}))}catch(t){console.warn("[vuex] error in error action subscribers: "),console.error(t)}e(t)}))}))}console.error("[vuex] unknown action type: "+o)},_u.prototype.subscribe=function(t,e){return tu(t,this._subscribers,e)},_u.prototype.subscribeAction=function(t,e){return tu("function"==typeof t?{before:t}:t,this._actionSubscribers,e)},_u.prototype.watch=function(t,e,n){var r=this;return Zs("function"==typeof t,"store.watch only accepts a function."),Kt((function(){return t(r.state,r.getters)}),e,Object.assign({},n))},_u.prototype.replaceState=function(t){var e=this;this._withCommit((function(){e._state.data=t}))},_u.prototype.registerModule=function(t,e,n){void 0===n&&(n={}),"string"==typeof t&&(t=[t]),Zs(Array.isArray(t),"module path must be a string or an Array."),Zs(t.length>0,"cannot register the root module by using registerModule."),this._modules.register(t,e),ru(this,this.state,t,this._modules.get(t),n.preserveState),nu(this,this.state)},_u.prototype.unregisterModule=function(t){var e=this;"string"==typeof t&&(t=[t]),Zs(Array.isArray(t),"module path must be a string or an Array."),this._modules.unregister(t),this._withCommit((function(){delete iu(e.state,t.slice(0,-1))[t[t.length-1]]})),eu(this)},_u.prototype.hasModule=function(t){return"string"==typeof t&&(t=[t]),Zs(Array.isArray(t),"module path must be a string or an Array."),this._modules.isRegistered(t)},_u.prototype.hotUpdate=function(t){this._modules.update(t),eu(this,!0)},_u.prototype._withCommit=function(t){var e=this._committing;this._committing=!0,t(),this._committing=e},Object.defineProperties(_u.prototype,wu);var xu=$u((function(t,e){var n={};return ju(e)||console.error("[vuex] mapState: mapper parameter must be either an Array or an Object"),Cu(e).forEach((function(e){var r=e.key,o=e.val;n[r]=function(){var e=this.$store.state,n=this.$store.getters;if(t){var r=Pu(this.$store,"mapState",t);if(!r)return;e=r.context.state,n=r.context.getters}return"function"==typeof o?o.call(this,e,n):e[o]},n[r].vuex=!0})),n})),ku=$u((function(t,e){var n={};return ju(e)||console.error("[vuex] mapMutations: mapper parameter must be either an Array or an Object"),Cu(e).forEach((function(e){var r=e.key,o=e.val;n[r]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var r=this.$store.commit;if(t){var i=Pu(this.$store,"mapMutations",t);if(!i)return;r=i.context.commit}return"function"==typeof o?o.apply(this,[r].concat(e)):r.apply(this.$store,[o].concat(e))}})),n})),Ou=$u((function(t,e){var n={};return ju(e)||console.error("[vuex] mapGetters: mapper parameter must be either an Array or an Object"),Cu(e).forEach((function(e){var r=e.key,o=e.val;o=t+o,n[r]=function(){if(!t||Pu(this.$store,"mapGetters",t)){if(o in this.$store.getters)return this.$store.getters[o];console.error("[vuex] unknown getter: "+o)}},n[r].vuex=!0})),n})),Su=$u((function(t,e){var n={};return ju(e)||console.error("[vuex] mapActions: mapper parameter must be either an Array or an Object"),Cu(e).forEach((function(e){var r=e.key,o=e.val;n[r]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var r=this.$store.dispatch;if(t){var i=Pu(this.$store,"mapActions",t);if(!i)return;r=i.context.dispatch}return"function"==typeof o?o.apply(this,[r].concat(e)):r.apply(this.$store,[o].concat(e))}})),n}));function Cu(t){return ju(t)?Array.isArray(t)?t.map((function(t){return{key:t,val:t}})):Object.keys(t).map((function(e){return{key:e,val:t[e]}})):[]}function ju(t){return Array.isArray(t)||Xs(t)}function $u(t){return function(e,n){return"string"!=typeof e?(n=e,e=""):"/"!==e.charAt(e.length-1)&&(e+="/"),t(e,n)}}function Pu(t,e,n){var r=t._modulesNamespaceMap[n];return r||console.error("[vuex] module namespace not found in "+e+"(): "+n),r}function Eu(t,e,n){var r=n?t.groupCollapsed:t.group;try{r.call(t,e)}catch(n){t.log(e)}}function Au(t){try{t.groupEnd()}catch(e){t.log("—— log end ——")}}function Tu(){var t=new Date;return" @ "+Lu(t.getHours(),2)+":"+Lu(t.getMinutes(),2)+":"+Lu(t.getSeconds(),2)+"."+Lu(t.getMilliseconds(),3)}function Lu(t,e){return n="0",r=e-t.toString().length,new Array(r+1).join(n)+t;var n,r}var Ru={version:"4.1.0",Store:_u,storeKey:"store",createStore:function(t){return new _u(t)},useStore:function(t){return void 0===t&&(t=null),function(t,e,n){void 0===n&&(n=!1);var r=ft;if(r){var o=r.$parent&&r.$parent._provided;if(o&&t in o)return o[t];if(arguments.length>1)return n&&c(e)?e.call(r):e}else 0}(null!==t?t:"store")},mapState:xu,mapMutations:ku,mapGetters:Ou,mapActions:Su,createNamespacedHelpers:function(t){return{mapState:xu.bind(null,t),mapGetters:Ou.bind(null,t),mapMutations:ku.bind(null,t),mapActions:Su.bind(null,t)}},createLogger:function(t){void 0===t&&(t={});var e=t.collapsed;void 0===e&&(e=!0);var n=t.filter;void 0===n&&(n=function(t,e,n){return!0});var r=t.transformer;void 0===r&&(r=function(t){return t});var o=t.mutationTransformer;void 0===o&&(o=function(t){return t});var i=t.actionFilter;void 0===i&&(i=function(t,e){return!0});var a=t.actionTransformer;void 0===a&&(a=function(t){return t});var s=t.logMutations;void 0===s&&(s=!0);var u=t.logActions;void 0===u&&(u=!0);var c=t.logger;return void 0===c&&(c=console),function(t){var l=Js(t.state);void 0!==c&&(s&&t.subscribe((function(t,i){var a=Js(i);if(n(t,l,a)){var s=Tu(),u=o(t),f="mutation "+t.type+s;Eu(c,f,e),c.log("%c prev state","color: #9E9E9E; font-weight: bold",r(l)),c.log("%c mutation","color: #03A9F4; font-weight: bold",u),c.log("%c next state","color: #4CAF50; font-weight: bold",r(a)),Au(c)}l=a})),u&&t.subscribeAction((function(t,n){if(i(t,n)){var r=Tu(),o=a(t),s="action "+t.type+r;Eu(c,s,e),c.log("%c action","color: #03A9F4; font-weight: bold",o),Au(c)}})))}}};er.use(Ru);var Iu=new Ru.Store({state:{isLight:!1,isSearchModalOpen:!1},mutations:{openSearchModal(t){t.isSearchModalOpen=!0},closeSearchModal(t){t.isSearchModalOpen=!1},toggleLightMode(t){t.isLight=!t.isLight}}});n(239);er.component("Badge",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,316))),er.component("CodeBlock",()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,312))),er.component("CodeGroup",()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,313)));n(240);var Mu=[({Vue:t,options:e,router:n,siteData:r})=>{t.mixin({beforeCreate(){this.$store=Iu}})},{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({Vue:t})=>{t.component("CodeCopy",Ns)}],Nu=[];class Du extends class{constructor(){this.store=new er({data:{state:{}}})}$get(t){return this.store.state[t]}$set(t,e){er.set(this.store.state,t,e)}$emit(...t){this.store.$emit(...t)}$on(...t){this.store.$on(...t)}}{}Object.assign(Du.prototype,{getPageAsyncComponent:vs,getLayoutAsyncComponent:gs,getAsyncComponent:ms,getVueComponent:ys});var Uu={install(t){const e=new Du;t.$vuepress=e,t.prototype.$vuepress=e}};function Fu(t,e){const n=e.toLowerCase();return t.options.routes.some(t=>t.path.toLowerCase()===n)}var Bu={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return _s("pageKey",e),er.component(e)||er.component(e,vs(e)),er.component(e)?t(e):t("")}},qu={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:["content__"+e.slotKey]},n()[e.slotKey])},zu={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},Vu=(n(241),n(242),Object(Ms.a)(zu,(function(){var t=this._self._c;return t("span",[t("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[t("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),t("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),t("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),Gu={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};er.config.productionTip=!1,er.use(Za),er.use(Uu),er.mixin(function(t,e,n=er){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e});Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const r=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),i={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),i),{computed:i}}(t=>class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const r in t)"/"===r?n=t[r]:0===this.$page.path.indexOf(r)&&(e=t[r]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:t}=this.$page.frontmatter;return"string"==typeof t&&t}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!er.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(t.hash)}:{x:0,y:0})});!function(t){t.beforeEach((e,n,r)=>{if(Fu(t,e.path))r();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";Fu(t,n)?r(n):r()}else r();else{const n=e.path+"/",o=e.path+".html";Fu(t,o)?r(o):Fu(t,n)?r(n):r()}})}(n);const r={};try{await Promise.all(Mu.filter(t=>"function"==typeof t).map(e=>e({Vue:er,options:r,router:n,siteData:qs,isServer:t})))}catch(t){console.error(t)}return{app:new er(Object.assign(r,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("RouterView",{ref:"layout"}),t("div",{class:"global-ui"},Nu.map(e=>t(e)))])})),router:n}}(!1).then(({app:t,router:e})=>{e.onReady(()=>{t.$mount("#app")})})}]); \ No newline at end of file diff --git a/community-resources.html b/community-resources.html index 62ce8cf9..f19aec3c 100644 --- a/community-resources.html +++ b/community-resources.html @@ -13,11 +13,11 @@ - + - - + + diff --git a/concepts/sandboxing.html b/concepts/sandboxing.html index 3e29362b..15ee251b 100644 --- a/concepts/sandboxing.html +++ b/concepts/sandboxing.html @@ -13,11 +13,11 @@ - + -

# Browser Sandboxing

# Overview

Browser sandboxing allows data requests to a gateway node to benefit from the security advantages of using a browser's same-origin policy by redirecting the requests to a pseudo-unique subdomain of the gateway's apex domain. For example, an attempt to access https://arweave.net/gnWKBqFXMJrrksEWrXLQRUQQQeFhv4uVxesHBcT8i6o would redirect to https://qj2yubvbk4yjv24syelk24wqivcbaqpbmg7yxfof5mdqlrh4rova.arweave.net/gnWKBqFXMJrrksEWrXLQRUQQQeFhv4uVxesHBcT8i6o

Two DNS records are required to link a domain to an Arweave transaction on a gateway node. For example, www.mycustomsite.com would need the following records to link it to www.arweave-gateway.net:

  • A DNS CNAME record pointing to an Arweave gateway: www CNAME arweave-gateway.net,
  • A DNS TXT record linking the domain with a specific transaction ID: arweavetx TXT kTv4OkVtmc0NAsqIcnHfudKjykJeQ83qXXrxf8hrh0S

When a browser requests www.mycustomsite.com the user's machine will (through the usual DNS processes) resolve this to the IP address for the gateway node arweave-gateway.net. When the gateway receives an HTTP request with a non-default hostname, e.g. www.mycustomsite.com instead of www.arweave-gateway.net, the gateway will query the DNS records for www.mycustomsite.com and the 'arweavetx' TXT record will tell the node which transaction to serve.

# TLS and its Role in Browser Sandboxing

Transport Layer Security (TLS) is a cryptographic protocol designed to provide communications security over a computer network. In the context of Arweave applications and browser sandboxing, TLS plays a critical role in ensuring secure data transmission and enabling the effective use of browser security features.

When Arweave applications are accessed without TLS, most browsers restrict the use of native cryptographic functions. These functions, which include hashing, signing, and verification, are essential for the secure operation of Arweave permaweb apps. Without TLS, not only are these functions unavailable, but the applications also become susceptible to various security threats, notably man-in-the-middle (MITM) attacks. Although Arweave transactions are signed, making direct MITM attacks challenging, the absence of encryption can expose other vulnerabilities. For instance, attackers could intercept and alter the /price endpoint, potentially causing transaction failures or leading to overcharging.

To address these concerns, gateway operators are responsible for generating and maintaining TLS certificates for their gateways. This can be achieved through various systems, such as ACME for Let's Encrypt. An important step in setting up a gateway is obtaining a wildcard TLS certificate for the gateway's domain. This certificate secures traffic on both the apex domain and its single-level subdomains (e.g., gateway.com and subdomain.gateway.com).

The integration of TLS is crucial for the implementation of browser sandboxing. When a browser requests a transaction from a gateway, the gateway issues a 301 redirect to a subdomain of the gateway, using a Base32 pseudo-unique address derived from the transaction ID. This redirection, secured by TLS, invokes the browser's same-origin policy. As a result, the requested web page is confined within a secure sandbox environment, isolated from other domains. This isolation is vital for maintaining the integrity and security of transactions and interactions within Arweave's permaweb applications.

# Deriving Sandbox Value

ar.io nodes generate browser sandbox values deterministically. Because of this, it is possible to calculate ahead of time what that value will be for a particular transaction id.

Sandbox values are a Base32 encoding of the transaction ID. ar.io gateways use the following code snippet to accomplish the encoding:

const expectedTxSandbox = (id: string): string => {
+    

# Browser Sandboxing

# Overview

Browser sandboxing allows data requests to a gateway node to benefit from the security advantages of using a browser's same-origin policy by redirecting the requests to a pseudo-unique subdomain of the gateway's apex domain. For example, an attempt to access https://arweave.net/gnWKBqFXMJrrksEWrXLQRUQQQeFhv4uVxesHBcT8i6o would redirect to https://qj2yubvbk4yjv24syelk24wqivcbaqpbmg7yxfof5mdqlrh4rova.arweave.net/gnWKBqFXMJrrksEWrXLQRUQQQeFhv4uVxesHBcT8i6o

Two DNS records are required to link a domain to an Arweave transaction on a gateway node. For example, www.mycustomsite.com would need the following records to link it to www.arweave-gateway.net:

  • A DNS CNAME record pointing to an Arweave gateway: www CNAME arweave-gateway.net,
  • A DNS TXT record linking the domain with a specific transaction ID: arweavetx TXT kTv4OkVtmc0NAsqIcnHfudKjykJeQ83qXXrxf8hrh0S

When a browser requests www.mycustomsite.com the user's machine will (through the usual DNS processes) resolve this to the IP address for the gateway node arweave-gateway.net. When the gateway receives an HTTP request with a non-default hostname, e.g. www.mycustomsite.com instead of www.arweave-gateway.net, the gateway will query the DNS records for www.mycustomsite.com and the 'arweavetx' TXT record will tell the node which transaction to serve.

# TLS and its Role in Browser Sandboxing

Transport Layer Security (TLS) is a cryptographic protocol designed to provide communications security over a computer network. In the context of Arweave applications and browser sandboxing, TLS plays a critical role in ensuring secure data transmission and enabling the effective use of browser security features.

When Arweave applications are accessed without TLS, most browsers restrict the use of native cryptographic functions. These functions, which include hashing, signing, and verification, are essential for the secure operation of Arweave permaweb apps. Without TLS, not only are these functions unavailable, but the applications also become susceptible to various security threats, notably man-in-the-middle (MITM) attacks. Although Arweave transactions are signed, making direct MITM attacks challenging, the absence of encryption can expose other vulnerabilities. For instance, attackers could intercept and alter the /price endpoint, potentially causing transaction failures or leading to overcharging.

To address these concerns, gateway operators are responsible for generating and maintaining TLS certificates for their gateways. This can be achieved through various systems, such as ACME for Let's Encrypt. An important step in setting up a gateway is obtaining a wildcard TLS certificate for the gateway's domain. This certificate secures traffic on both the apex domain and its single-level subdomains (e.g., gateway.com and subdomain.gateway.com).

The integration of TLS is crucial for the implementation of browser sandboxing. When a browser requests a transaction from a gateway, the gateway issues a 301 redirect to a subdomain of the gateway, using a Base32 pseudo-unique address derived from the transaction ID. This redirection, secured by TLS, invokes the browser's same-origin policy. As a result, the requested web page is confined within a secure sandbox environment, isolated from other domains. This isolation is vital for maintaining the integrity and security of transactions and interactions within Arweave's permaweb applications.

# Deriving Sandbox Value

ar.io nodes generate browser sandbox values deterministically. Because of this, it is possible to calculate ahead of time what that value will be for a particular transaction id.

Sandbox values are a Base32 encoding of the transaction ID. ar.io gateways use the following code snippet to accomplish the encoding:

const expectedTxSandbox = (id: string): string => {
   return toB32(fromB64Url(id));
 };
 

Example:

const id = 'gnWKBqFXMJrrksEWrXLQRUQQQeFhv4uVxesHBcT8i6o';
@@ -27,6 +27,6 @@
 console.log(expectedTxSandbox);
 

Example Output:

qj2yubvbk4yjv24syelk24wqivcbaqpbmg7yxfof5mdqlrh4rova
 

View the full code for generating browser sandbox values here (opens new window).

- + diff --git a/contribute.html b/contribute.html index 165d26df..36100fe5 100644 --- a/contribute.html +++ b/contribute.html @@ -13,11 +13,11 @@ - + -

# Contributing to AR.IO Docs

# Overview

The AR.IO Docs serve as a primary source of information and guidance for users, developers, and contributors interacting with the AR.IO platform. As such, maintaining its clarity, accuracy, and comprehensiveness is paramount. This document outlines the standardized procedures and best practices for contributing to these docs. By following this guide, contributors can ensure that their additions and modifications align with the established documentation structure and conventions.

Contributions can range from minor typographical corrections to the addition of entire new sections. Regardless of the scale, every contribution is valuable. Proper setup, understanding the file structure, and familiarity with the submission process are essential components of effective contribution. The sections that follow delve into each stage of the contribution process, from initial setup and local development to the submission of changes for review.

By adhering to this guide, contributors can streamline the review and integration of their changes, ensuring that the AR.IO Docs remain a reliable and up-to-date resource for all its users.

# Prerequisites

# Initial Setup

# Fork the Repository

While logged into your Github account, visit the repository for the AR.IO public site (opens new window)

Near the top right of the page, there will be a button labeled "fork".

Clicking this will begin the process of making a copy of the public-site repo under your own account.

On the next screen, make sure the box labeled "copy the main branch only" is NOT checked, then click "create fork"

This process only needs to be completed once, you will not need to create a new fork each time you want to submit an edit.

# Clone your Fork

Once you have your fork created, you'll need to clone it onto your computer in order to make your edits.

Navigate the the location you want to clone the repo and open a terminal (or command prompt/powershell on Windows)

run the command:

git clone -b main https://github.com/yourusernamehere/public-site
+    

# Contributing to AR.IO Docs

# Overview

The AR.IO Docs serve as a primary source of information and guidance for users, developers, and contributors interacting with the AR.IO platform. As such, maintaining its clarity, accuracy, and comprehensiveness is paramount. This document outlines the standardized procedures and best practices for contributing to these docs. By following this guide, contributors can ensure that their additions and modifications align with the established documentation structure and conventions.

Contributions can range from minor typographical corrections to the addition of entire new sections. Regardless of the scale, every contribution is valuable. Proper setup, understanding the file structure, and familiarity with the submission process are essential components of effective contribution. The sections that follow delve into each stage of the contribution process, from initial setup and local development to the submission of changes for review.

By adhering to this guide, contributors can streamline the review and integration of their changes, ensuring that the AR.IO Docs remain a reliable and up-to-date resource for all its users.

# Prerequisites

# Initial Setup

# Fork the Repository

While logged into your Github account, visit the repository for the AR.IO public site (opens new window)

Near the top right of the page, there will be a button labeled "fork".

Clicking this will begin the process of making a copy of the public-site repo under your own account.

On the next screen, make sure the box labeled "copy the main branch only" is NOT checked, then click "create fork"

This process only needs to be completed once, you will not need to create a new fork each time you want to submit an edit.

# Clone your Fork

Once you have your fork created, you'll need to clone it onto your computer in order to make your edits.

Navigate the the location you want to clone the repo and open a terminal (or command prompt/powershell on Windows)

run the command:

git clone -b main https://github.com/yourusernamehere/public-site
 

Be sure to replace "yourusernamehere" with your Github username

The AR.IO Public Site, and especially the docs portal, is constantly evolving. You are going to want to be able to pull updates from the AR.IO repo into your fork without having to delete it and create a new fork. To do this, you can link the original repo to your fork as "upstream".

From inside the fork on your computer, run the command:

git remote add upstream https://github.com/ar-io/public-site
 

You can then check to make sure the upstream source was added with:

git remote -v
 

# Pull updates

Periodically, you should check if there have been updates to the original repo by using"

git fetch upstream
@@ -152,6 +152,6 @@
 

# Development and Deployment

# Launching Development Server

From inside the docsGenerator/docs directory in your terminal, you can launch a development server in order to preview your edits. This will automatically update as you are making edits, but if some changes do not immediately appear you can shut the server down and restart it for a hard refresh:

yarn dev
 

The development server will, by default, launch at localhost:8080. The server can be shut down with ctrl+c or by killing the terminal used to start it.

The most common error when attempting to launch the development server comes from not having a compatible version of Nodejs. If you get an error, try switching to Node version 16.15.1

# Building Static Files

The Vuepress docs portal is nested inside a static html website. For ease of deployment, Vuepress can build the docs portal into static html files and place them in the docs/ folder in the root of the website. This is not necessary for submitting a pr, but it may be useful for local testing. You can do this by navigating your terminal inside the docs portal Vuepress app docsGenerator/docs and running the command:

yarn build
 

# Creating Your Pull Request

Once you have all of your local changes committed and synced to your github account, you can create a Pull Request and have the team review the changes for integration into the public site.

  1. Ensure that all of your changes are committed to your own repository. All commits should follow the Conventional Commits (opens new window) standards.

  2. Navigate to your forked repository's page on GitHub.

  3. Switch to the branch you created for your changes.

  4. You should see a banner indicating that you recently pushed a new branch. Click on the "Compare & pull request" button on that banner.

  5. Make sure the base repository is set to the original AR.IO repository and the base branch is set to "staging".

  6. Provide a brief description of your changes in the pull request form. Ensure your title adheres to the Conventional Commits (opens new window) standards.

  7. Review the changes and confirm they appear as expected.

  8. Once you're ready, click on the "Create pull request" button. The AR.IO team will review the request and, if approved, merge your changes into the staging branch of the repository. The changes will later be merged into the main branch for production deployment.

- + diff --git a/foundation/index.html b/foundation/index.html index 264e9034..37d7193f 100644 --- a/foundation/index.html +++ b/foundation/index.html @@ -13,11 +13,11 @@ - + -

# AR.IO Foundation

# What is the AR.IO Foundation?

The AR.IO Foundation is dedicated to the stewardship and prosperity of The AR.IO Network and its associated token ecosystem. It holds a non-revocable, exclusive license to promote the development of the network, prioritizing the ecosystem's wellbeing, particularly the users.

Key strategies employed by the Foundation (with the assistance of third-party teams) in support of the network include:

  • Providing grants and incentive programs

  • Making strategic investments

  • Engaging in direct software development

  • Producing educational content

  • Conducting publicity and marketing initiatives

  • Forming partnerships

# Guiding Philosophy

The AR.IO Foundation serves as a unifying force within the ecosystem, facilitating communication, fostering innovation, and driving overall progress. Its primary aim is to function as a supportive entity rather than exerting excessive control over the network or disrupting its economic processes.

The key objectives of the AR.IO Foundation are as follows:

  • Sustaining and advancing the AR.IO Network: The Foundation takes responsibility for the continued development and enhancement of the AR.IO Network. It works collaboratively with developers, contributors, and stakeholders to ensure the network remains robust, secure, and adaptable to evolving technological landscapes.

  • Allocating resources to promote ecosystem and community growth: The Foundation is entrusted with managing and allocating resources to fuel the growth and expansion of the AR.IO ecosystem. This includes funding research initiatives, supporting innovative projects, and encouraging community-driven initiatives that contribute to the network's overall health and vitality.

  • Managing the core development of the AR.IO Network: The Foundation oversees and coordinates the core development efforts of the AR.IO Network. This involves coordinating with developers and technical teams to implement upgrades, address vulnerabilities, and introduce new features that align with the network's vision and community consensus.

  • Fostering collaboration and inclusivity: The Foundation actively fosters a culture of collaboration and inclusivity within the AR.IO ecosystem. It encourages diverse perspectives and welcomes contributions from individuals and organizations, fostering an environment where all participants can thrive and collectively shape the network's future.

By diligently pursuing these objectives, the AR.IO Foundation aims to create an environment where the AR.IO Network can flourish as a decentralized, secure, and resilient platform, contributing positively to the broader permaweb and decentralized storage landscape.

- +

# AR.IO Foundation

# What is the AR.IO Foundation?

The AR.IO Foundation is dedicated to the stewardship and prosperity of The AR.IO Network and its associated token ecosystem. It holds a non-revocable, exclusive license to promote the development of the network, prioritizing the ecosystem's wellbeing, particularly the users.

Key strategies employed by the Foundation (with the assistance of third-party teams) in support of the network include:

  • Providing grants and incentive programs

  • Making strategic investments

  • Engaging in direct software development

  • Producing educational content

  • Conducting publicity and marketing initiatives

  • Forming partnerships

# Guiding Philosophy

The AR.IO Foundation serves as a unifying force within the ecosystem, facilitating communication, fostering innovation, and driving overall progress. Its primary aim is to function as a supportive entity rather than exerting excessive control over the network or disrupting its economic processes.

The key objectives of the AR.IO Foundation are as follows:

  • Sustaining and advancing the AR.IO Network: The Foundation takes responsibility for the continued development and enhancement of the AR.IO Network. It works collaboratively with developers, contributors, and stakeholders to ensure the network remains robust, secure, and adaptable to evolving technological landscapes.

  • Allocating resources to promote ecosystem and community growth: The Foundation is entrusted with managing and allocating resources to fuel the growth and expansion of the AR.IO ecosystem. This includes funding research initiatives, supporting innovative projects, and encouraging community-driven initiatives that contribute to the network's overall health and vitality.

  • Managing the core development of the AR.IO Network: The Foundation oversees and coordinates the core development efforts of the AR.IO Network. This involves coordinating with developers and technical teams to implement upgrades, address vulnerabilities, and introduce new features that align with the network's vision and community consensus.

  • Fostering collaboration and inclusivity: The Foundation actively fosters a culture of collaboration and inclusivity within the AR.IO ecosystem. It encourages diverse perspectives and welcomes contributions from individuals and organizations, fostering an environment where all participants can thrive and collectively shape the network's future.

By diligently pursuing these objectives, the AR.IO Foundation aims to create an environment where the AR.IO Network can flourish as a decentralized, secure, and resilient platform, contributing positively to the broader permaweb and decentralized storage landscape.

+ diff --git a/gateway-network/index.html b/gateway-network/index.html index 73fbe56e..ef0a4944 100644 --- a/gateway-network/index.html +++ b/gateway-network/index.html @@ -13,11 +13,11 @@ - + -

# Gateway network

# Overview

The AR.IO Network consists of AR.IO Gateway nodes, which are identified by their registered Arweave wallet addresses and either their IP addresses or hostnames, as stored in the network's smart contract Gateway Address Registry (GAR).

These nodes adhere to the AR.IO Network Protocols, creating a collaborative environment of Gateway nodes that vary in scale and specialization. The network ensures a fundamental level of service quality and trust minimization among its participants.

Being part of the network grants AR.IO Gateways an array of advantages, such as:

  • Simplified advertising of services and end user discovery via the Gateway Address Registry.

  • More rapid bootstrapping of key Gateway operational data due to prioritized data request fulfillment among Gateways joined to the network.

  • Sharing of data processing results.

  • Access to support channels tailored for operators.

  • Enhanced trust and transparency through the use of AGPL-3 licenses, which mandate public disclosure of any software changes, thereby reinforcing the network's integrity and reliability.

  • Improved network reliability and performance through an incentive protocol, which uses a system of rewards and evaluations to encourage high-quality service from Gateways.

# Gateway Address Registry (GAR)

Any Gateway operator that whishes to join the AR.IO Network must register their node in the AR.IO SmartWeave Contract's "Gateway Address Registry", known as the GAR. Registration involves staking a minimum amount of IO tokens and providing additional metadata describing the Gateway service offered.

After joining the network, the operator's Gateway can be easily discovered by permaweb apps, its health can be observed, and it can participate in the AR.IO data sharing protocol.

The Gateway operator can modify their Gateway's GAR configuration as needed, which includes adding more tokens to their stake or removing them. Operators can completely remove their stake and leave the AR.IO Network following a minimum network exit wait time. This exit time ensures that Gateways cannot quickly escape from an anticipated penalty.

The GAR advertises the specific attributes of each Gateway including its stake and settings. This enables permaweb apps and users to discover which Gateways are currently available and meet their needs. Apps that read the GAR can sort and filter it using the Gateway metadata, for example, ranking Gateways with the highest stake at the top of the list. This would allow users to prefer the lower-trust, higher staked Gateways before settling on a higher-trust, lower staked Gateway.

# Staking

Staking tokens serves a dual purpose in the AR.IO Network:

  • It acts as a method of public commitment, and

  • It qualifies participants for reward distribution.

In the AR.IO Network, "staking" designates the act of locking a specified amount of IO tokens into a protocol-controlled vault. These tokens act as a form of collateral and public commitment, encouraging network participants to act in the network's best interests. Once tokens are deposited in the vault, they remain locked until either the participant triggers the "unstake" function or the vault's predetermined lock period expires.

It is important to note that unlike other protocols, the IO token is non-inflationary. Therefore, the staking mechanism in the AR.IO Network is not designed to function as a yield-generation tool. By staking their tokens, participants become eligible for potential rewards, fostering an atmosphere of mutual trust within the network. Specifically, Gateway operators stake tokens to facilitate their Gateway integration and establish public trust. Once connected, they become eligible for rewards driven by the protocol and gain access to the network's shared resources.

# Schema

# Gateway Schema

Gateway
Name Type Description
operatorStake number The total stake of the Gateway's operator.
start number Block number in which the Gateway joined the network.
end number Block number in which the Gateway can leave the network, setting to 0 means no end date.
status string Participation status of the Gateway, "joined" - participating in the network, "hidden" - not leaving, but not participating, "leaving" - in the process of withdrawing from the network.
vaults array of objects The locked tokens staked by the Gateway operator, view schema.
settings object Additional configuration settings for the Gateway, view schema.

# Token Vault

Token Vault
Name Type Description
balance number Positive integer, the number of IO tokens locked.
start number Block number in which locking starts.
end number Block number in which locking ends. Setting to 0 means no end date.

# Gateway Settings

Gateway Settings
Name Type Required Description
label string yes The friendly name used to label the Gateway.
fqdn string yes The fully qualified domain name at which the Gateway can be reached. e.g. arweave.net
port number yes The port used by the Gateway. e.g. 443
protocol string yes Web protocol used by this Gateway "https", or "http"
properties string no An Arweave transaction ID containing additional properties of the Gateway.
note string no An Arweave transaction ID containing additional notes the Gateway operator can set to include things like announcements, maintenance, or other operational updates.
observerWallet string yes The public address for the wallet being used to sign and upload Observer reports
- +

# Gateway network

# Overview

The AR.IO Network consists of AR.IO Gateway nodes, which are identified by their registered Arweave wallet addresses and either their IP addresses or hostnames, as stored in the network's smart contract Gateway Address Registry (GAR).

These nodes adhere to the AR.IO Network Protocols, creating a collaborative environment of Gateway nodes that vary in scale and specialization. The network ensures a fundamental level of service quality and trust minimization among its participants.

Being part of the network grants AR.IO Gateways an array of advantages, such as:

  • Simplified advertising of services and end user discovery via the Gateway Address Registry.

  • More rapid bootstrapping of key Gateway operational data due to prioritized data request fulfillment among Gateways joined to the network.

  • Sharing of data processing results.

  • Access to support channels tailored for operators.

  • Enhanced trust and transparency through the use of AGPL-3 licenses, which mandate public disclosure of any software changes, thereby reinforcing the network's integrity and reliability.

  • Improved network reliability and performance through an incentive protocol, which uses a system of rewards and evaluations to encourage high-quality service from Gateways.

# Gateway Address Registry (GAR)

Any Gateway operator that whishes to join the AR.IO Network must register their node in the AR.IO SmartWeave Contract's "Gateway Address Registry", known as the GAR. Registration involves staking a minimum amount of IO tokens and providing additional metadata describing the Gateway service offered.

After joining the network, the operator's Gateway can be easily discovered by permaweb apps, its health can be observed, and it can participate in the AR.IO data sharing protocol.

The Gateway operator can modify their Gateway's GAR configuration as needed, which includes adding more tokens to their stake or removing them. Operators can completely remove their stake and leave the AR.IO Network following a minimum network exit wait time. This exit time ensures that Gateways cannot quickly escape from an anticipated penalty.

The GAR advertises the specific attributes of each Gateway including its stake and settings. This enables permaweb apps and users to discover which Gateways are currently available and meet their needs. Apps that read the GAR can sort and filter it using the Gateway metadata, for example, ranking Gateways with the highest stake at the top of the list. This would allow users to prefer the lower-trust, higher staked Gateways before settling on a higher-trust, lower staked Gateway.

# Staking

Staking tokens serves a dual purpose in the AR.IO Network:

  • It acts as a method of public commitment, and

  • It qualifies participants for reward distribution.

In the AR.IO Network, "staking" designates the act of locking a specified amount of IO tokens into a protocol-controlled vault. These tokens act as a form of collateral and public commitment, encouraging network participants to act in the network's best interests. Once tokens are deposited in the vault, they remain locked until either the participant triggers the "unstake" function or the vault's predetermined lock period expires.

It is important to note that unlike other protocols, the IO token is non-inflationary. Therefore, the staking mechanism in the AR.IO Network is not designed to function as a yield-generation tool. By staking their tokens, participants become eligible for potential rewards, fostering an atmosphere of mutual trust within the network. Specifically, Gateway operators stake tokens to facilitate their Gateway integration and establish public trust. Once connected, they become eligible for rewards driven by the protocol and gain access to the network's shared resources.

# Schema

# Gateway Schema

Gateway
Name Type Description
operatorStake number The total stake of the Gateway's operator.
start number Block number in which the Gateway joined the network.
end number Block number in which the Gateway can leave the network, setting to 0 means no end date.
status string Participation status of the Gateway, "joined" - participating in the network, "hidden" - not leaving, but not participating, "leaving" - in the process of withdrawing from the network.
vaults array of objects The locked tokens staked by the Gateway operator, view schema.
settings object Additional configuration settings for the Gateway, view schema.

# Token Vault

Token Vault
Name Type Description
balance number Positive integer, the number of IO tokens locked.
start number Block number in which locking starts.
end number Block number in which locking ends. Setting to 0 means no end date.

# Gateway Settings

Gateway Settings
Name Type Required Description
label string yes The friendly name used to label the Gateway.
fqdn string yes The fully qualified domain name at which the Gateway can be reached. e.g. arweave.net
port number yes The port used by the Gateway. e.g. 443
protocol string yes Web protocol used by this Gateway "https", or "http"
properties string no An Arweave transaction ID containing additional properties of the Gateway.
note string no An Arweave transaction ID containing additional notes the Gateway operator can set to include things like announcements, maintenance, or other operational updates.
observerWallet string yes The public address for the wallet being used to sign and upload Observer reports
+ diff --git a/gateways/ar-io-node/admin/admin-api.html b/gateways/ar-io-node/admin/admin-api.html index 14f8f1cd..05881acf 100644 --- a/gateways/ar-io-node/admin/admin-api.html +++ b/gateways/ar-io-node/admin/admin-api.html @@ -13,11 +13,11 @@ - + -

# AR.IO HTTP API Admin Endpoints

# Overview

The AR.IO HTTP API offers several endpoints that allow access to internal information and the ability to make adjustments without restarting your Gateway. Each of these endpoints behind /ar-io/admin/ have access restricted, so you will need to have set up your ADMIN_API_KEY variable and include "Authorization: "Bearer ${ADMIN_API_KEY}" in the header of your request.

When testing endpoints at <your-Gateway>/api-docs, you can enter your ADMIN_API_KEY using the green "Authorize" button near the top of the page, or by clicking any of the open lock icons next to a password protected end point.

# Debug

The ar-io/admin/debug endpoint provides a comprehensive view of the current state of your Gateway. This endpoint has been designed to offer developers and administrators insights into the operational status of the gateway, including any errors or warnings that have occurred since the last startup.

Example response
{
+    

# AR.IO HTTP API Admin Endpoints

# Overview

The AR.IO HTTP API offers several endpoints that allow access to internal information and the ability to make adjustments without restarting your Gateway. Each of these endpoints behind /ar-io/admin/ have access restricted, so you will need to have set up your ADMIN_API_KEY variable and include "Authorization: "Bearer ${ADMIN_API_KEY}" in the header of your request.

When testing endpoints at <your-Gateway>/api-docs, you can enter your ADMIN_API_KEY using the green "Authorize" button near the top of the page, or by clicking any of the open lock icons next to a password protected end point.

# Debug

The ar-io/admin/debug endpoint provides a comprehensive view of the current state of your Gateway. This endpoint has been designed to offer developers and administrators insights into the operational status of the gateway, including any errors or warnings that have occurred since the last startup.

Example response
{
   db: {
     counts: {
       wallets: 137,
@@ -57,6 +57,6 @@
     "source": "Example source"
 }
 
  • id: This should be the transaction id of the content you want to block.
  • notes: Notes regarding the reason this content was blocked. For documentation purposes only.
  • source: Identifier for the source of TX IDs you are blocking. For example, the name of a public block list. For documentation purposes only.

Your Gateway will either respond with an error, or { message: 'Content blocked' }

- + diff --git a/gateways/ar-io-node/advanced-config.html b/gateways/ar-io-node/advanced-config.html index 63536ac6..f102283a 100644 --- a/gateways/ar-io-node/advanced-config.html +++ b/gateways/ar-io-node/advanced-config.html @@ -13,11 +13,11 @@ - + -

# Advanced Configuration

# Overview

The Getting Started guides for windows and linux contain all the information needed to start your ar.io Gateway node successfully with basic configurations. There are also ever expanding advanced configuration options that allow you to run your node in a way that is customized to your specific use case.

Most of the below options can be added to your .env file in order to customize its operation. Any changes made to your .env require you to stop the docker containers running your node, and restarting them with the --build flag in order for the changes to take effect. See ENV for a complete list of environmental variables you can set.

# Data Storage Location

You can set a custom location for your AR.IO Gateway to save the data it pulls from the Arweave network. There are three primary types of data stored, and you can set a unique storage location for each of these independently. These are "chunks data", "contiguous data", and "headers data". The custom location for each of these can be set in your .env file like this:

CHUNKS_DATA_PATH=<file path>
+    

# Advanced Configuration

# Overview

The Getting Started guides for windows and linux contain all the information needed to start your ar.io Gateway node successfully with basic configurations. There are also ever expanding advanced configuration options that allow you to run your node in a way that is customized to your specific use case.

Most of the below options can be added to your .env file in order to customize its operation. Any changes made to your .env require you to stop the docker containers running your node, and restarting them with the --build flag in order for the changes to take effect. See ENV for a complete list of environmental variables you can set.

# Data Storage Location

You can set a custom location for your AR.IO Gateway to save the data it pulls from the Arweave network. There are three primary types of data stored, and you can set a unique storage location for each of these independently. These are "chunks data", "contiguous data", and "headers data". The custom location for each of these can be set in your .env file like this:

CHUNKS_DATA_PATH=<file path>
 CONTIGUOUS_DATA_PATH=<file path>
 HEADERS_DATA_PATH=<file path>
 

Be sure to replace "<file path>" with the path to the location where you would like the data stored. If these values are omitted, the data will be stored in the "data" directory inside your Gateway code repository.

# Admin API Key

HTTP endpoints under "/ar-io/admin" are protected by an admin API key. These endpoints allow you to get certain analytics data or make adjustments to your node as it's running. When your node starts, it reads your environmental variables to see if a key is set. If not, a random key is generated. The key name is ADMIN_API_KEY and it should be set in your .env file like this:

ADMIN_API_KEY=SUPER_SECRET_PASSWORD
@@ -35,6 +35,6 @@
   "http://<HOST>:<PORT>/ar-io/admin/block-data" \
   -d '{ "id": "<ID>", "notes": "Example notes", "source": "Example source" }'
 
  • id (string): This will be the transaction ID of the content you want to add to your block list.
  • notes (string): Internal notes regarding why a particular ID is blocked.
  • source (string): Identifier of a particular source of IDs to block. (e.g. the name of a block list)

notes and source are used for documentation only, and have no effect on your block list itself.

- + diff --git a/gateways/ar-io-node/api.html b/gateways/ar-io-node/api.html index 03b71c96..036e28fa 100644 --- a/gateways/ar-io-node/api.html +++ b/gateways/ar-io-node/api.html @@ -13,11 +13,11 @@ - + -

# AR.IO HTTP API

Up to date documentation of endpoints for the AR.IO HTTP API used to access your Gateway can be found here (opens new window).

You can also view endpoint documentation and test the endpoints against your own Gateway by going to <your-Gateway>/api-docs

- +

# AR.IO HTTP API

Up to date documentation of endpoints for the AR.IO HTTP API used to access your Gateway can be found here (opens new window).

You can also view endpoint documentation and test the endpoints against your own Gateway by going to <your-Gateway>/api-docs

+ diff --git a/gateways/ar-io-node/arnsoip/observer.html b/gateways/ar-io-node/arnsoip/observer.html index 2198b638..296ab037 100644 --- a/gateways/ar-io-node/arnsoip/observer.html +++ b/gateways/ar-io-node/arnsoip/observer.html @@ -13,14 +13,14 @@ - + -

# Observation and Incentives

# Overview

The Observation and Incentive Protocol is designed to maintain and enhance the operational integrity of gateways on the AR.IO Network. It achieves this through a combination of incentivizing gateways for good performance and tasking those gateways to fulfill the role of "observers". The protocol is intentionally simple and adaptable, employing a smart contract-based method for onchain “voting” to assess peer performance while being flexible on how that performance is measured. This setup permits gateway and observer nodes to experiment and evolve best practices for performance evaluation, all while operating within the bounds of the network's immutable smart contract, thus eliminating the need for frequent contract updates (forks).

In this protocol, observers evaluate their gateway peers' performance to resolve ArNS names. Their aim is to ensure each gateway in the network accurately resolves a subset of names and assigning a pass / fail score based on their findings.

A key component of the protocol is its reward mechanism. This system is predicated on gateway performance and compliance with observation duties. Gateways that excel are tagged as "Functional Gateways" and earn rewards, while those that do not meet the criteria, “Deficient Gateways” risk facing penalties – namely, the lack of rewards.

Funds for incentive rewards are derived from the protocol balance, which consists of IO tokens collected from ArNS asset purchases. Every epoch, this balance is utilized to distribute rewards to qualifying gateways and observers based on certain performance metrics.

# Observation Protocol

The Observation protocol is organized around epochs, periods of time that are broken into an observation reporting and tallying phase. The protocol is followed across each epoch, promoting consistent healthy network activity that can form pro-social behaviors and react to malicious circumstances.

Observation and Incentive Protocol
  • To participate in the epoch, a gateway must have already staked IO tokens and joined the network before it starts.
  • Each epoch (approximately 7 block-days), a random pool of active gateways will be selected (prescribed) to perform observation duties.
  • Within the epoch, observers are tasked with evaluating a subset of ArNS names for each gateway in the network.
  • By the end of the epoch’s observation reporting period, the observer must upload its standardized health observation report to Arweave.
  • The observer must also submit a SmartWeave interaction to the AR.IO contract to save its report transaction ID and a summary of all failed gateways for tallying by the incentive protocol.
  • After the observation reporting period and tallying periods have closed, the payout is performed on the next contract state tick. +

    # Observation and Incentives

    # Overview

    The Observation and Incentive Protocol is designed to maintain and enhance the operational integrity of gateways on the AR.IO Network. It achieves this through a combination of incentivizing gateways for good performance and tasking those gateways to fulfill the role of "observers". The protocol is intentionally simple and adaptable, employing a smart contract-based method for onchain “voting” to assess peer performance while being flexible on how that performance is measured. This setup permits gateway and observer nodes to experiment and evolve best practices for performance evaluation, all while operating within the bounds of the network's immutable smart contract, thus eliminating the need for frequent contract updates (forks).

    In this protocol, observers evaluate their gateway peers' performance to resolve ArNS names. Their aim is to ensure each gateway in the network accurately resolves a subset of names and assigning a pass / fail score based on their findings.

    A key component of the protocol is its reward mechanism. This system is predicated on gateway performance and compliance with observation duties. Gateways that excel are tagged as "Functional Gateways" and earn rewards, while those that do not meet the criteria, “Deficient Gateways” risk facing penalties – namely, the lack of rewards.

    Funds for incentive rewards are derived from the protocol balance, which consists of IO tokens collected from ArNS asset purchases. Every epoch, this balance is utilized to distribute rewards to qualifying gateways and observers based on certain performance metrics.

    # Observation Protocol

    The Observation protocol is organized around epochs, periods of time that are broken into an observation reporting and tallying phase. The protocol is followed across each epoch, promoting consistent healthy network activity that can form pro-social behaviors and react to malicious circumstances.

    Observation and Incentive Protocol
    • To participate in the epoch, a gateway must have already staked IO tokens and joined the network before it starts.
    • Each epoch (approximately 7 block-days), a random pool of active gateways will be selected (prescribed) to perform observation duties.
    • Within the epoch, observers are tasked with evaluating a subset of ArNS names for each gateway in the network.
    • By the end of the epoch’s observation reporting period, the observer must upload its standardized health observation report to Arweave.
    • The observer must also submit a SmartWeave interaction to the AR.IO contract to save its report transaction ID and a summary of all failed gateways for tallying by the incentive protocol.
    • After the observation reporting period and tallying periods have closed, the payout is performed on the next contract state tick.
      • This payout rewards gateways and observers who have performed their duties.
      • Gateways that did not meet the performance threshold will not receive rewards.
      • Observers that did not perform their duties are not rewarded and in addition, are penalized on any gateway rewards received.
    • Community builders and application users can verify and leverage the report and distribution information to make more informed decisions on which gateway to use.

    # Onchain Reports

    The to-be-evaluated ArNS names include a set of names randomly determined by the protocol, known as “prescribed names”, which are common across all observers within the epoch, as well as a set of “chosen names” picked at the discretion of each individual observer. “Prescribed names” are assigned to act as a common denominator / baseline while “chosen names” allow each observer to evaluate names that may be important to their operation.

    Each observer shall assess the performance of the selected ArNS names (across all gateways) and summarize those findings in a report which details the following:

    • General Information: Observer's Arweave address, starting and concluding block heights for the epoch.

    • Gateway Operator Assessment: The expected and actual Arweave addresses of observed gateways, along with a summary verdict (pass or fail), and accompanying reasons for failure.

    • Detailed ArNS Evaluations: For each gateway, it includes the domain name, evaluated ArNS names, the associated block height, transaction IDs, data hashes, a "pass or fail" score, reasons for failure (if any), and performance metrics like time to the first byte.

    A comprehensive list of report criteria can be found in the Appendix.

    Observers shall upload their completed reports (in JSON format) to the Arweave network as an onchain audit trail. In addition, observers shall submit an interaction to the AR.IO SmartWeave contact detailing each gateway that they observed to have “failed” their assessments. This is tallied and used to determine the reward distribution.

    # Selection of Observers

    The observer selection process employs a random-weighted selection method. By combining random selection with weighted criteria like stake, tenure, and past rewards, the process aims to ensure both fairness and acknowledgment of consistent performance. This method allows for a systematic yet randomized approach to selecting gateways for observation tasks.

    # Criteria for Selection

    Up to 50 gateways can be chosen as observers per epoch. If the GAR contains 50 or fewer gateways, then every gateway is designated as an observer for that epoch. If there are greater than 50, then randomized selection shall be utilized.

    The weighted selection criteria will consider the following for each gateway:

    • Stake Weight (SW): This factor considers how financially committed a gateway is to the network. It is the ratio of the amount of IO tokens staked by the gateway relative to the network minimum and is expressed as SW = Gateway Stake / Minimum Stake.

    • Tenure Weight (TW): This factor considers how long a gateway has been part of the network, with a maximum value capped at 4. It is calculated as TW = Gateway Network Tenure / 6 block-months. This means that the maximum value is achieved after 2 block-years of participation in the network.

    • Gateway Reward Ratio Weight (GRRW): This factor is a proxy for a gateway’s performance at resolving ArNS names. The weight represents the ratio of epochs in which a gateway received rewards for correctly resolving names relative to their total time on the network.

    • Observer Reward Ratio Weight (ORRW): This factor is a proxy for a gateway’s performance at fulfilling observation duties. The weight reflects the ratio of epochs in which a gateway, as an observer, successfully submitted observation reports relative to their total periods of service as an observer.

    # Weight Calculation and Normalization

    For each gateway, a composite weight (CW) is computed, combining the Stake Weight, Tenure Weight, Gateway Reward Ratio Weight, and Observer Reward Ratio Weight.

    The formula used is: CW = SW x TW x GRRW x ORRW.

    These weights are then normalized across the network to create a continuous range, allowing for proportional random selection based on the weighted scores. The normalized composite weight (N_CW) for each gateway indicates its likelihood of being chosen as an observer and is calculated by dividing the gateway's CW by the sum of all CWs.

    # Random Selection Process

    The selection of observers is randomized within the framework of these weights. A set of unique random numbers is generated within the total range of normalized weights. For each random number, the gateway whose normalized weight range encompasses this number is selected. This system ensures that while gateways with higher weights are more likely to be chosen, all gateways maintain a non-zero chance of selection, preserving both fairness and meritocracy in the observer assignment process.

    # Performance Evaluation

    Consider the following classifications:

    • Functional or Passed Gateways: are gateways that meet or surpass the network’s performance and quality standards.

    • Deficient or Failed Gateways: are gateways that fall short of the network's performance expectations.

    • Functional or Submitted Observers: are selected observers who diligently perform their duties and submit observation reports and contract interactions.

    • Deficient or Failed Observers: are selected observers who do not fulfill their duty of submitting observation reports and contract interactions.

    At the end of an epoch, the smart contract will assess the results from the observers during a “tallying period” and determine a pass / fail score for each gateway:

    • If greater than or equal to 50% of submitted observer contract interactions indicate a PASS score, then that gateway is considered Functional and eligible for gateway rewards.

    • Else, if greater than 50% of submitted observer contract interactions indicate a FAIL score, then that gateway is considered Deficient and ineligible for gateway rewards.

    These results will determine how reward distributions are made for that epoch. Rewards shall be distributed after the epoch’s tallying period is complete.

    # Reward Distribution

    Each epoch, a defined portion of the protocol balance (e.g., 0.25%) is earmarked for distribution as rewards. From this allocation, two distinct reward categories are derived:

    1. Base Gateway Reward: This is the portion of the reward allocated to each Functional Gateway within the network and is calculated as:

      [Epoch Reward Allocation x 95% / Total Gateways in the Network]

    2. Base Observer Reward: Observers, due to their additional responsibilities, have a separate reward calculated as:

      [Epoch Reward Allocation x 5% / Total Selected Observers for the Epoch]

    # Distribution Based on Performance

    The reward distribution is contingent on the performance classifications derived from the Performance Evaluation:

    • Functional Gateways: Gateways that meet the performance criteria receive the Base Gateway Reward.

    • Deficient Gateways: Gateways falling short in performance do not receive any gateway rewards.

    • Functional Observers: Observers that fulfilled their duty receive the Base Observer Reward.

    • Deficient Observers: Observers failing to meet their responsibilities do not receive observer rewards. Furthermore, if they are also Functional Gateways, their gateway reward is reduced by 25% for that epoch as a consequence for not performing their observation duty.

    # Undistributed Rewards

    In cases where rewards are not distributed, either due to the inactivity or deficiency of gateways or observers, the allocated tokens shall remain in the protocol balance and carry forward to the next epoch. This mechanism is in place to discourage observers from frivolously marking their peers as offline in hopes of attaining a higher portion of the reward pool.

    # Handling Inactive Gateways

    To maintain network efficiency and reduce contract state bloat, gateways that are consistently offline, specifically for six (6) consecutive epochs, and thus fail to receive rewards, will be automatically removed from the Gateway Active Registry (GAR) as well as have their staked IO tokens unlocked and returned to the gateway operator.

    # Observer Report Details

    Each observer shall assess the performance of the selected ArNS names (across all AR.IO gateways) and summarize those findings in a report which details the following:

    # General Information

    • The observer's Arweave address.
    • The starting block height of the epoch.
    • The block height at which the report was generated.

    # Overall Gateway Operator Assessment

    • Gateway FQDN.
    • The Arweave address that the observer expects to be the owner / operator of the gateway.
    • The Arweave address that the observed gateway actually reports.
    • A final “pass or fail” rollup determination for each observed gateway.
    • Failure reason (if applicable).

    # ArNS Assessments

    • Observed ArNS name (for all prescribed and chosen names).
    • The block height at which the name was assessed.
    • The expected status code.
    • The resolved status code.
    • The transaction ID that the observer expects the associated name to resolve to.
    • The transaction ID that the gateway actually resolves to.
    • The data hash that the observer expects the associated name to resolve to.
    • The data hash that the gateway actually resolves to.
    • The “pass or fail” score associated with the observed name, at the observer’s discretion.
    • Failure reason (if applicable).
    • Timing / performance information associated with the name resolution such as time to first byte and total duration.

    The above is repeated for the entire name pool and across each gateway in the GAR.

    # Example Observation Report

    https://arweave.net/GG1YCFc7wQxKvQ1qD1lTEp2OAMBs4VzrpfdmeeLyjDI (opens new window)

    # Viewing Observation Reports

    You can easily view an observation report in a human readable format through your terminal with the following command:

    curl -L https://arweave.net/<txId> | zcat | jq .
     

    Be sure to replace <txId> with the txId of the report you want to view.

    # example

    curl -L https://arweave.net/H3zDmoDkpOg0U95rejBEq6gUnww_CEVscTuQVqfSbxk | zcat | jq .
     
    - + diff --git a/gateways/ar-io-node/env.html b/gateways/ar-io-node/env.html index 641813f4..29d0da2f 100644 --- a/gateways/ar-io-node/env.html +++ b/gateways/ar-io-node/env.html @@ -13,11 +13,11 @@ - + -

    # Environmental Variables

    # Overview

    The AR.IO Gateway allows configuration customization through environmental variables. These variables dictate the gateway's behavior, from block synchronization settings to log formatting. Detailed below is a table enumerating all available environmental variables, their respective types, default values, and a brief description. Note that certain variables, such as SANDBOX_PROTOCOL, rely on others (e.g., ARNS_ROOT_HOST) to function effectively. Ensure proper understanding of these dependencies when configuring.

    # Variables

    Sets the location for chunked data to be saved. If omitted, chunked data will be stored in the `data` directory Sets the location for contiguous data to be saved. If omitted, contiguous data will be stored in the `data` directory Sets the location for header data to be saved. If omitted, header data will be stored in the `data` directory Sets the location for sqlite indexed data to be saved. If omitted, sqlite data will be stored in the `data` directory Sets the location for temporary data to be saved. If omitted, temporary data will be stored in the `data` directory Sets the location for LMDB data to be saved. If omitted, LMDB data will be stored in the `data` directory
    ENV Name Type Default Value Description
    START_HEIGHT Number or "Infinity" 0 Starting block height for node synchronization (0 = start from genesis block)
    STOP_HEIGHT Number or "Infinity" "Infinity" Stop block height for node synchronization (Infinity = keep syncing until stopped)
    TRUSTED_NODE_URL String "https://arweave.net" Arweave node to use for fetching data
    TRUSTED_GATEWAY_URL String "https://arweave.net" Arweave node to use for proxying reqeusts
    TRUSTED_ARNS_GATEWAY_URL String https://NAME.arweave.dev ArNS gateway
    INSTANCE_ID String "" Adds an "INSTANCE_ID" field to output logs
    LOG_FORMAT String "simple" Sets the format of output logs, accepts "simple" and "json"
    SKIP_CACHE Boolean false If true, skips the local cache and always fetches headers from the node
    PORT Number 4000 AR.IO node exposed port number
    SIMULATED_REQUEST_FAILURE_RATE Number 0 Number from 0 to 1, representing the probability of a request failing
    AR_IO_WALLET String "" Arweave wallet address used for staking and rewards
    ADMIN_API_KEY String Generated API key used for admin API requests (if not set, it is generated and logged into the console)
    BACKFILL_BUNDLE_RECORDS Boolean false If true, AR.IO node will start indexing missing bundles
    FILTER_CHANGE_REPROCESS Boolean false If true, all indexed bundles will be reprocessed with the new filters (you can use this when you change the filters)
    ANS104_UNBUNDLE_FILTER String {"never": true} Only bundles compliant with this filter will be unbundled
    ANS104_INDEX_FILTER String {"never": true} Only bundles compliant with this filter will be indexed
    ARNS_ROOT_HOST String undefined Domain name for ArNS host
    SANDBOX_PROTOCOL String undefined Protocol setting in process of creating sandbox domains in ArNS (ARNS_ROOT_HOST needs to be set for this env to have any effect) accepts "http" or "https"
    START_WRITERS Boolean true If true, start indexing blocks, tx, ANS104 bundles
    RUN_OBSERVER Boolean true If true, runs the Observer alongside the gateway to generate Network compliance reports
    OBSERVER_WALLET String undefined The public wallet address of the wallet being used to sign report upload transactions for Observer
    CHUNKS_DATA_PATH string "data/chunks"
    CONTIGUOUS_DATA_PATH string "data/contiguous"
    HEADERS_DATA_PATH string "data/headers"
    SQLITE_DATA_PATH string "data/sqlite"
    TEMP_DATA_PATH string "data/tmp"
    LMDB_DATA_PATH string "data/LMDB"
    CHAIN_CACHE_TYPE String "redis" Sets the method for caching chain data, defaults to redis if gateway is started with docker-compose, otherwise defaults to LMDB
    REDIS_CACHE_URL String (URL) "redis://localhost:6379" URL of Redis database to be used for caching
    REDIS_CACHE_TTL_SECONDS Number 28800 TTL value for Redis cache, defaults to 8 hours (28800 seconds)
    ENABLE_FS_HEADER_CACHE_CLEANUP Boolean false If true, periodically deletes cached header data
    NODE_JS_MAX_OLD_SPACE_SIZE Number system default Sets the memory limit, in Megabytes, for NodeJs. Default value depends on hardware
    SUBMIT_CONTRACT_INTERACTIONS Boolean true If true, Observer will submit its generated reports to the ar.io Network. If false, reports will be generated but not submitted
    - +

    # Environmental Variables

    # Overview

    The AR.IO Gateway allows configuration customization through environmental variables. These variables dictate the gateway's behavior, from block synchronization settings to log formatting. Detailed below is a table enumerating all available environmental variables, their respective types, default values, and a brief description. Note that certain variables, such as SANDBOX_PROTOCOL, rely on others (e.g., ARNS_ROOT_HOST) to function effectively. Ensure proper understanding of these dependencies when configuring.

    # Variables

    Sets the location for chunked data to be saved. If omitted, chunked data will be stored in the `data` directory Sets the location for contiguous data to be saved. If omitted, contiguous data will be stored in the `data` directory Sets the location for header data to be saved. If omitted, header data will be stored in the `data` directory Sets the location for sqlite indexed data to be saved. If omitted, sqlite data will be stored in the `data` directory Sets the location for temporary data to be saved. If omitted, temporary data will be stored in the `data` directory Sets the location for LMDB data to be saved. If omitted, LMDB data will be stored in the `data` directory
    ENV Name Type Default Value Description
    START_HEIGHT Number or "Infinity" 0 Starting block height for node synchronization (0 = start from genesis block)
    STOP_HEIGHT Number or "Infinity" "Infinity" Stop block height for node synchronization (Infinity = keep syncing until stopped)
    TRUSTED_NODE_URL String "https://arweave.net" Arweave node to use for fetching data
    TRUSTED_GATEWAY_URL String "https://arweave.net" Arweave node to use for proxying reqeusts
    TRUSTED_ARNS_GATEWAY_URL String https://NAME.arweave.dev ArNS gateway
    INSTANCE_ID String "" Adds an "INSTANCE_ID" field to output logs
    LOG_FORMAT String "simple" Sets the format of output logs, accepts "simple" and "json"
    SKIP_CACHE Boolean false If true, skips the local cache and always fetches headers from the node
    PORT Number 4000 AR.IO node exposed port number
    SIMULATED_REQUEST_FAILURE_RATE Number 0 Number from 0 to 1, representing the probability of a request failing
    AR_IO_WALLET String "" Arweave wallet address used for staking and rewards
    ADMIN_API_KEY String Generated API key used for admin API requests (if not set, it is generated and logged into the console)
    BACKFILL_BUNDLE_RECORDS Boolean false If true, AR.IO node will start indexing missing bundles
    FILTER_CHANGE_REPROCESS Boolean false If true, all indexed bundles will be reprocessed with the new filters (you can use this when you change the filters)
    ANS104_UNBUNDLE_FILTER String {"never": true} Only bundles compliant with this filter will be unbundled
    ANS104_INDEX_FILTER String {"never": true} Only bundles compliant with this filter will be indexed
    ARNS_ROOT_HOST String undefined Domain name for ArNS host
    SANDBOX_PROTOCOL String undefined Protocol setting in process of creating sandbox domains in ArNS (ARNS_ROOT_HOST needs to be set for this env to have any effect) accepts "http" or "https"
    START_WRITERS Boolean true If true, start indexing blocks, tx, ANS104 bundles
    RUN_OBSERVER Boolean true If true, runs the Observer alongside the gateway to generate Network compliance reports
    OBSERVER_WALLET String undefined The public wallet address of the wallet being used to sign report upload transactions for Observer
    CHUNKS_DATA_PATH string "data/chunks"
    CONTIGUOUS_DATA_PATH string "data/contiguous"
    HEADERS_DATA_PATH string "data/headers"
    SQLITE_DATA_PATH string "data/sqlite"
    TEMP_DATA_PATH string "data/tmp"
    LMDB_DATA_PATH string "data/LMDB"
    CHAIN_CACHE_TYPE String "redis" Sets the method for caching chain data, defaults to redis if gateway is started with docker-compose, otherwise defaults to LMDB
    REDIS_CACHE_URL String (URL) "redis://localhost:6379" URL of Redis database to be used for caching
    REDIS_CACHE_TTL_SECONDS Number 28800 TTL value for Redis cache, defaults to 8 hours (28800 seconds)
    ENABLE_FS_HEADER_CACHE_CLEANUP Boolean false If true, periodically deletes cached header data
    NODE_JS_MAX_OLD_SPACE_SIZE Number system default Sets the memory limit, in Megabytes, for NodeJs. Default value depends on hardware
    SUBMIT_CONTRACT_INTERACTIONS Boolean true If true, Observer will submit its generated reports to the ar.io Network. If false, reports will be generated but not submitted
    + diff --git a/gateways/ar-io-node/linux-setup.html b/gateways/ar-io-node/linux-setup.html index 6f66cb5e..ec5a3a2f 100644 --- a/gateways/ar-io-node/linux-setup.html +++ b/gateways/ar-io-node/linux-setup.html @@ -13,11 +13,11 @@ - + -

    # Linux Installation Instructions

    # Overview

    The following instructions will guide you through the process of installing the AR.IO node on a Linux machine, specifically Ubuntu 22.04.3 desktop on a home computer. Actual steps may differ slightly on different versions or distributions. This guide will cover how to set up your node, point a domain name to your home network, and create an nginx server for routing traffic to your node. No prior coding experience is required.

    # System Requirements

    Please note, The AR.IO Node software is still in development and testing, all system requirements are subject to change.

    External storage devices should be formatted as ext4.

    # Minimum requirements

    The hardware specifications listed below represent the minimum system requirements at which the AR.IO Node has been tested. While your Node may still operate on systems with lesser specifications, please note that AR.IO cannot guarantee performance or functionality under those conditions. Use below-minimum hardware at your own risk.

    • 4 core CPU
    • 4 GB Ram
    • 500 GB storage (SSD recommended)
    • Stable 50 Mbps internet connection
    • 12 core CPU
    • 32 GB Ram
    • 2 TB SSD storage
    • Stable 1 Gbps internet connection

    # Install Packages

    If you would like to quickly install all required and suggested packages, you can run the following 2 commands in your terminal, and skip to installing the Node.

    sudo apt update -y && sudo apt upgrade -y && sudo apt install -y curl openssh-server docker-compose git certbot nginx sqlite3 build-essential && sudo systemctl enable ssh && curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && sudo apt-get update -y && sudo apt-get install -y yarn && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash && source ~/.bashrc && sudo ufw allow 22 80 443 && sudo ufw enable
    +    

    # Linux Installation Instructions

    # Overview

    The following instructions will guide you through the process of installing the AR.IO node on a Linux machine, specifically Ubuntu 22.04.3 desktop on a home computer. Actual steps may differ slightly on different versions or distributions. This guide will cover how to set up your node, point a domain name to your home network, and create an nginx server for routing traffic to your node. No prior coding experience is required.

    # System Requirements

    Please note, The AR.IO Node software is still in development and testing, all system requirements are subject to change.

    External storage devices should be formatted as ext4.

    # Minimum requirements

    The hardware specifications listed below represent the minimum system requirements at which the AR.IO Node has been tested. While your Node may still operate on systems with lesser specifications, please note that AR.IO cannot guarantee performance or functionality under those conditions. Use below-minimum hardware at your own risk.

    • 4 core CPU
    • 4 GB Ram
    • 500 GB storage (SSD recommended)
    • Stable 50 Mbps internet connection
    • 12 core CPU
    • 32 GB Ram
    • 2 TB SSD storage
    • Stable 1 Gbps internet connection

    # Install Packages

    If you would like to quickly install all required and suggested packages, you can run the following 2 commands in your terminal, and skip to installing the Node.

    sudo apt update -y && sudo apt upgrade -y && sudo apt install -y curl openssh-server docker-compose git certbot nginx sqlite3 build-essential && sudo systemctl enable ssh && curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && sudo apt-get update -y && sudo apt-get install -y yarn && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash && source ~/.bashrc && sudo ufw allow 22 80 443 && sudo ufw enable
     
    nvm install 18.8.0 && nvm use 18.8.0
     

    # Required packages

    1. Update your software:

      sudo apt update
       sudo apt upgrade
      @@ -104,6 +104,6 @@
       
    2. Save and exit nano.

    3. Test the configuration:

      sudo nginx -t
       
    4. If there are no errors, restart nginx:

      sudo service nginx restart
       

Your node should now be running and connected to the internet. Test it by entering https://<your-domain>/3lyxgbgEvqNSvJrTX2J7CfRychUD5KClFhhVLyTPNCQ in your browser.

Note: If you encounter any issues during the installation process, please seek assistance from the AR.IO community (opens new window).

- + diff --git a/gateways/ar-io-node/observer-upgrade.html b/gateways/ar-io-node/observer-upgrade.html index 19f0fe2c..38626a18 100644 --- a/gateways/ar-io-node/observer-upgrade.html +++ b/gateways/ar-io-node/observer-upgrade.html @@ -13,13 +13,13 @@ - + -

# Upgrading to the Observer Module

# Overview

From time to time, significant updates to the AR.IO Gateway node software might necessitate additional configuration steps to harness the entirety of the new features. The recent addition of the "Observer" module, designed to monitor the health of the AR.IO network, is a case in point. To integrate this module successfully, users will need to undertake two supplementary steps beyond the conventional upgrade routine:

  1. Supply the keyfile for an active Arweave wallet.

  2. Configure specific environmental variables.

Both of these steps can be completed during the normal upgrade process BEFORE you rebuild your gateway (step #5).

# Supply a Keyfile

A primary function of the Observer Module is to upload reports on the health of the AR.IO network to the Arweave blockweave. In order to do this, transactions must be signed and paid for. This requires the keyfile for an Arweave wallet be provided to your gateway.

You may use the same wallet linked to your gateway in the AR.IO network (AR_IO_WALLET in your .env file) but in most situations it is safer to use a separate fresh wallet, or a "hot" wallet you use for safely interacting with Dapps, especially if you host your gateway on a remote server where other people may have access. Find more information about creating fresh wallets here (opens new window).

Remember, your keyfile contains the public keys to your Arweave wallet, always be extremely careful not to expose it to unsafe conditions.

Your keyfile must be saved in the new wallets directory in the root of the gateway repository, with the name <public address>.json

For example: QGWqtJdLLgm2ehFWiiPzMaoFLD50CnGuzZIPEdoDRGQ.json

# Environmental variables

There are two new environmental variables that should be set when upgrading to Observer. Both of these should be added to the .env file prior to rebuilding your gateway:

  • RUN_OBSERVER (optional) - This is the on/off switch for Observer. The default value is true, so omitting this from your environmental variables will not prevent Observer from running. Set the value to false if you want your gateway to run without Observer. +

    # Upgrading to the Observer Module

    # Overview

    From time to time, significant updates to the AR.IO Gateway node software might necessitate additional configuration steps to harness the entirety of the new features. The recent addition of the "Observer" module, designed to monitor the health of the AR.IO network, is a case in point. To integrate this module successfully, users will need to undertake two supplementary steps beyond the conventional upgrade routine:

    1. Supply the keyfile for an active Arweave wallet.

    2. Configure specific environmental variables.

    Both of these steps can be completed during the normal upgrade process BEFORE you rebuild your gateway (step #5).

    # Supply a Keyfile

    A primary function of the Observer Module is to upload reports on the health of the AR.IO network to the Arweave blockweave. In order to do this, transactions must be signed and paid for. This requires the keyfile for an Arweave wallet be provided to your gateway.

    You may use the same wallet linked to your gateway in the AR.IO network (AR_IO_WALLET in your .env file) but in most situations it is safer to use a separate fresh wallet, or a "hot" wallet you use for safely interacting with Dapps, especially if you host your gateway on a remote server where other people may have access. Find more information about creating fresh wallets here (opens new window).

    Remember, your keyfile contains the public keys to your Arweave wallet, always be extremely careful not to expose it to unsafe conditions.

    Your keyfile must be saved in the new wallets directory in the root of the gateway repository, with the name <public address>.json

    For example: QGWqtJdLLgm2ehFWiiPzMaoFLD50CnGuzZIPEdoDRGQ.json

    # Environmental variables

    There are two new environmental variables that should be set when upgrading to Observer. Both of these should be added to the .env file prior to rebuilding your gateway:

    • RUN_OBSERVER (optional) - This is the on/off switch for Observer. The default value is true, so omitting this from your environmental variables will not prevent Observer from running. Set the value to false if you want your gateway to run without Observer.
      • RUN_OBSERVER=true
    • OBSERVER_WALLET - This should be set to the public address of the wallet you are using to sign Observer transactions.
      • OBSERVER_WALLET=QGWqtJdLLgm2ehFWiiPzMaoFLD50CnGuzZIPEdoDRGQ

    Note: If you encounter any issues during the upgrade process, please seek assistance from the AR.IO community (opens new window).

    - + diff --git a/gateways/ar-io-node/operation.html b/gateways/ar-io-node/operation.html index 02550345..ad317b47 100644 --- a/gateways/ar-io-node/operation.html +++ b/gateways/ar-io-node/operation.html @@ -13,11 +13,11 @@ - + -

    # Operation

    # Overview

    AR.IO Gateways are the interface between users and the Permaweb. Each Gateway acts like a "Permaweb Service Provider" and supports multiple, value-added, low-trust services for users and applications. The AR.IO HTTP API is served by all AR.IO Gateways, and is used by all Arweave clients looking to read, write, and query data. It supports the following capabilities:

    • Seeding layer one transactions to the greater Arweave network
    • Caching and serving chain and transaction data
    • Resolving friendly names to transaction data with the Arweave Name System
    • Indexing and querying layer one and two transactions
    • Proxy for Arweave nodes serving the Arweave HTTP API

    # Errors

    The API uses standard HTTP status codes to indicate the success of failure of the API call

    # Authentication

    All inbound transactions to the Arweave network must contain a valid signature from an Arweave wallet with the appropriate amount of AR Tokens. At this time, clients are not required to sign their requests for outbound data from the Arweave network.

    # Cache

    Provides data from the AR.IO Gateway cache

    # Transaction

    Gets Transaction data

    /{txId}

    Example

    Request

    https://arweave.net/dBSTUg33LAsC5ThFwiTXao873v34QNM_x-BvaaOK13E
    +    

    # Operation

    # Overview

    AR.IO Gateways are the interface between users and the Permaweb. Each Gateway acts like a "Permaweb Service Provider" and supports multiple, value-added, low-trust services for users and applications. The AR.IO HTTP API is served by all AR.IO Gateways, and is used by all Arweave clients looking to read, write, and query data. It supports the following capabilities:

    • Seeding layer one transactions to the greater Arweave network
    • Caching and serving chain and transaction data
    • Resolving friendly names to transaction data with the Arweave Name System
    • Indexing and querying layer one and two transactions
    • Proxy for Arweave nodes serving the Arweave HTTP API

    # Errors

    The API uses standard HTTP status codes to indicate the success of failure of the API call

    # Authentication

    All inbound transactions to the Arweave network must contain a valid signature from an Arweave wallet with the appropriate amount of AR Tokens. At this time, clients are not required to sign their requests for outbound data from the Arweave network.

    # Cache

    Provides data from the AR.IO Gateway cache

    # Transaction

    Gets Transaction data

    /{txId}

    Example

    Request

    https://arweave.net/dBSTUg33LAsC5ThFwiTXao873v34QNM_x-BvaaOK13E
     

    Response

    {"name":"Bananas.jpg","size":587828,"lastModifiedDate":1684980169000,"dataTxId":"h6sV7ST1gKAlRSvdOLoSiGg2nL2vZky_KYTj9M0GVS0","dataContentType":"image/jpeg"}
     

    # Raw Transation

    Gets the Raw data from a transaction, for example it can display the contents of an Arweave Manifest instead of directing your gateway to where the Manifest is pointing.

    /raw/{txId}

    Example

    Request

    https://arweave.net/raw/GPOX8dgUpFpt8IVUyyfBMiPpfWZ9eXHZjNi42W4-_50
     

    Response

    {"manifest":"arweave/paths","version":"0.1.0","index":{"path":"index.html"},"paths":{"about.html":{"id":"fOAhaHRcaVzbMgmWAEdPncX-ZsKVZgrFOor2BOQkLU4"},"index.html":{"id":"M4TIc72VRXUPfFZOnmqL1CsLLzdMrpONNelpyoD31KI"},"style.css":{"id":"CvGTQ3YpFsOQ6Xh1hPhSnyTQFPa6TUpGFmGZsIwaZDU"},"script.js":{"id":"xR8THTsuYrSnEmXueECknpbipvDcCKqqCg79Thos_I4"},"home.html":{"id":"2SzIqpI_fWuxX0j-FYMfIVUXtf7de0aaQJvp39d12UU"},"deploy.html":{"id":"HPdPumduTm17_aWnD2VDeaXJJHc_eGD2QloP0Zc0Byk"},"hash.html":{"id":"0p6gssMZ3R9iDFScwD9JKcW9snWTw5rqHnr5o8JXYy4"},"paths.html":{"id":"6nCmNdMxfb9zMYsl3pwFzFQ-AFIPjhVC9W4ZRs4QH4c"},"update.html":{"id":"BNKaYC6zmeS7ABycqmhLcmEHQKXw4B5RtD-v3nZ2rdk"},"code.html":{"id":"LC08UXIjb4Lv64pVSI-pC7c_tY9L221Sb27xBP4Q-qc"}}}
    @@ -61,6 +61,6 @@
     

    # Chunks

    Get existing chunk offset information

    /chunk/{offset}

    Example

    Request

    https://arweave.net/chunk/146788128412032
     
    Response
    {"tx_path":"hdWq1ZszBltk9XIkGv2yDLijyWbG7tnrRGT7VLc3hrKq2uqaqCHhijNLumytek1GK_EfsHS5zGYSyXP218ZrlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAL9xRcPRiJdHwKIwqVWFc03WLQPX_pdPK6eBkGDyoyglINUplsTV9ctXMDznPacmopzSYyxvbMbEql8jRW9z3uvdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAHWcAO5fnvS8i1dR0DMvq47fvjc6BCAKRYUyEQj1HeOkrQwuFz108Gvrl6UZteWygR75jjAmC3XxnY6hjnGMvTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtAAAAp86EvExjN5pmMbgA0epeTQQSmcu48Y2VDDcPA_lKJ6IQow56ogsMrzbS8S5IQG-7_L5dWzKCKDsAeaZ_az4CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAA8r751YA8Kq2_AleQT_A_R7HU59WAPFZaAlzRwXB8aYTpsfD9gtQXIN87OK0DEkDrBif6D-0YYrDVEG-8JCZtfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAA5Kqqj2vVHEG_K4NunOiODeMSfXnXyT0eCaf_xJDDIAbfUzMg0K612E47CYUVQSbeR46GAPRm7bHMXjtmJii7YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAME1z0BlQq8hEamYDmMnYo2ESNoQ33F466PT9IccTwKdxGcmv67CXThF9yIhkiiujvXaVK8lJ7jSJei_OTNLA1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABE7CKeu3Xce8mGabqh6VQhlht_SdtFe94-UuuKdYCWkfMQIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAROwig","packing":"unpacked","end_offset":"146788128412032","data_path":"yGaK4gUHpKT592HBM52EPtYPTOlXQ0xEsYAtsTLDKZf5DH-Cgsm9ozNJz1GyUWfGl1821cKPzRYEXyS-2ElccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA0tWhxbuyMy_85pTq-fKmzglh8tf7enrnc0CTObxp4B1h6Bbz_ro2lKtst64jbBFv2hmJULiXZFuS2FGiOTXxFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAAAkLsCIhZqqii07Ogt1xLB9tcJCy6nXb-PLCX4uJffDUEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQewig","chunk":"aWNhdGlvbhhDeWJlckNvbm5lY3QOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3FENvbnRlbnQtSWSAAWE5ZTRhMGRkZGY4ZWJmNjFlNzAxM2I1YzEwMGM2ZWE5YjM5MDg1YzZmMjhjZTc4ZGI5YjVhODU4YTUwZGQ5YzIcQ29udGVudC1EaWdlc3SAAWE5ZTRhMGRkZGY4ZWJmNjFlNzAxM2I1YzEwMGM2ZWE5YjM5MDg1YzZmMjhjZTc4ZGI5YjVhODU4YTUwZGQ5YzIcQ29udGVudC1BdXRob3IYanZwbm1hemUxcHhhAHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDVlOWIxNDY4YjIyYWQ1Yzg5MzliZGY5MmE3MjRjZmFkZjg0YWE5MmRcIixcInRzXCI6MTY5MTQ2MDYxODMwMSxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwianZwbm1hemUxcHhhXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiJhOWU0YTBkZGRmOGViZjYxZTcwMTNiNWMxMDBjNmVhOWIzOTA4NWM2ZjI4Y2U3OGRiOWI1YTg1OGE1MGRkOWMyIiwic2lnbmF0dXJlIjoiMHhlM2Y2ZjlkMjliMjQ4N2M0ODQ4MjNiZDdhNDAzMWZiZjRjNTE2OTAzNmUxYzhlOGZiM2VmMWRjYmU2YTM2MmRhYzFlNzgxNzllYjljYzdjM2U3MGUzMzE1OWYyMjVlNzIxNjYzNzk2NmNjOGVkYTg0MjJmZmM5YjU3M2YyZmI0MyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFT1IvZ3gxMmh1L1hSZzB1QTlXbnpFQXU5VFg5Mk8vTVRBY3VmT3YxNElVbVhuajNlWWthYXZVazFZczNDNk1ObGtVaEt4Z2orYnhaN3k4SUVYTUhiUkE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NWU5YjE0NjhiMjJhZDVjODkzOWJkZjkyYTcyNGNmYWRmODRhYTkyZCIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDZjYmFiYTVmZjg4OTc1MTc2MzFlYzcxNjJmZGE3MzU1MzcxYjVlN2NhMGJjODQ2MmU2ZGMzMDQxZjZjZTU5YjM3OTFiYmJlY2RiMWUwN2U5MmI3NDgxMTc1YjExYjUwM2Q1OTIwNzNjNDM0MzE4MzEwZDYyNzEzNTM4NDFlZGZmMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFT1IvZ3gxMmh1L1hSZzB1QTlXbnpFQXU5VFg5Mk8vTVRBY3VmT3YxNElVbVhuajNlWWthYXZVazFZczNDNk1ObGtVaEt4Z2orYnhaN3k4SUVYTUhiUkE9PSJ9fQEASjduLbz5q9JRuhdSD8Q4R2o9F24qLprPskKXQYkFd25ZGu1vrtLX1rXr1H-EcBCJAXacKORIgHErMDgI1oaS0txlQeeOPlrp-XmJW2dZWMOaY2SDplmI60dvHtsh7ZzfQPdKkGfWUo7lK6SUKbZV8q_2bmqIP0Tgfu5lTQbHqu9lpDaW5gmmh8f66bftafRsj1OZaGoGcieIl2QlbEAVsetyIxVvw7gFC0nyFkErRb8nTyKJoK-5KG92Ql8HUkvdbbCE3KPPnRyWPEjUUSlMO7bOhyrV1m4TbWguIJrnDF9ctIm-NeGAUmDOJYxo24RCm5stAMvUc90hAN4eFh3LgesvEpTqNNJP1A2cemxT8CxZ2UlX1IRNMKicvvYCDvOPv_OpP1NfVsDyPrHLUTq-9cMkGfD4JbIQjmnrca0lT6F_mLaXc-siu8mw4GD6UCSLmnvg_yQ38nVpQUwtcXyoYbiSefotE-J2CV9SlqQwyYjicmNnxJxWkTwOYWMuUeooiAJqUPsnp_zkEHanFG1LgFTYRQls58ef4AhKX_yZJ-hYTK2Fw0BSSiibZSNxcfu0tD-cK6eblIDYPSWBnLYaw0ZqE2A6MvlwDP-_9E8WQA6uLpZvQejApeCk3p4bE3bKl6AV7_yt3dachNmkFaPCmU_4bPVDDQ0AP4KyceW-o1ic-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABYTJjNjIwYzUwZWM0YmQ0OWZhMGUyNDAxNDUxNGM3NTlmZjZjZDRlYjFiOTRjNDRjMzc0Y2NkNGNmNGVmYzAwMRxDb250ZW50LURpZ2VzdIABYTJjNjIwYzUwZWM0YmQ0OWZhMGUyNDAxNDUxNGM3NTlmZjZjZDRlYjFiOTRjNDRjMzc0Y2NkNGNmNGVmYzAwMRxDb250ZW50LUF1dGhvchg1aTNhNTZzZjY5NjQOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDY3NzM2YjI5MGFhZWI1ZjM1NzZmOWEyZGVhYzYwYTVlNmY4ZWRlNjBcIixcInRzXCI6MTY5MTQ2MDYxODA5NSxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiNWkzYTU2c2Y2OTY0XCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiJhMmM2MjBjNTBlYzRiZDQ5ZmEwZTI0MDE0NTE0Yzc1OWZmNmNkNGViMWI5NGM0NGMzNzRjY2Q0Y2Y0ZWZjMDAxIiwic2lnbmF0dXJlIjoiMHhhNDhjOThiM2FkZGQ0MDdiMjk1ZTUzYjJmMzgwZmJjNDBlNDFkZjY1OWQ4MmM2YjMyZjIxOGUzZjdkNGI3OTZkMjAyZDdjMDhhZDFlNWUyMTUzMWM2N2FhNjFmM2EwMWQ5MjhmZDY0Yjk2YmFhMmE3NjA5NDQ0YjI0NTQyZjFmMCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFY0xOY1Nqcm1PdHJIN2hSQTBaZkRKc29kbE5UWDYyc0YrWG16R3Q3OFFHZS9IdFlaZ1EvWGlCc1ZUUTV1VUhHQTd3RGdsOUxUenZhUzAzSUZsN1dzb0E9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4Njc3MzZiMjkwYWFlYjVmMzU3NmY5YTJkZWFjNjBhNWU2ZjhlZGU2MCIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGNlMzJjYjMzOTUzZDJmZGIwNDNlNzhjZjBlM2JlYWNkZDgzMDI0NDEwYmMyNDc3YjE4ODAxY2Q5M2E0YTI0ZDg1Y2RiMWMxODM1MjQ5ODI2ZWI1NmRkZWNkNTc3MjA2YWExOWMxNDlmYjdlZjU0OTcxMmIwMzFhNTliZjEzZDRkMWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFY0xOY1Nqcm1PdHJIN2hSQTBaZkRKc29kbE5UWDYyc0YrWG16R3Q3OFFHZS9IdFlaZ1EvWGlCc1ZUUTV1VUhHQTd3RGdsOUxUenZhUzAzSUZsN1dzb0E9PSJ9fQEAFKoU3ie5lW7RMjwwmy_pGSxGlqkxRwEi3WQrUec028qreZy4lna8hpiPnu2wMo88hHOt51MXRnzVCX686M3_igQddk5iH-BI-GS0B3bOUo7ytMkMWwA9jRLPPSZOSwiUwTlu3xRJtt9Zy80ikx8V2XAEx0TK2E1FKnf3P4c4waN5RBURsqYVFGV0JpjRvXAk9D1hTkQGC7mga5RWiJJIGc6wbBuFdsXnZhgBiryNYThnUsu1hki1tJrppVfH_Y7gXThrsSS6ltuCnGZ5wtwhq2TqMeY78BBAAcMcnYSN56DSh0NNPqzKRsyfVFhpBc1CFh7cJogwW1LK5iCTCmXkE9TDndnftGERxPJK3L5ELWfAhckHAWwBj01KZ0-nVQoLGt2msWApiyoqVHeU09tPlCD9EA0v_jsOS6MnS2bUFb6XqVFiqMCueOW_0Sbq2s_J8PWn90lorfkZjLps21LNRnlenxy7qeCC2x_7Ui1TbGmCFajA9iA8LI27lBRBF1kvnM-ME7xXJx68lbqkxiDvGNJthQXKxnL8O4GcaOEVyXG5TITT35TuKs9HIiUB3L6tO0ILw2YMi5-Gxldr4PqZqmTbuB44N_AzYbbVkxhGvabT4Jx1eXtN2YT7kgBChGGEBWgMytaw4GCeavXHuIxygxriOG-ODQF_EnusyuFSJh-c-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABNzY0NWQ0MGM1NjhkZDdmMDdmNDg2MTgxYTc0OGE3Y2FlZTM4ZmMwZjA4Y2NmOWYyYzI3NTkzZWI3ZWY1MDg4NRxDb250ZW50LURpZ2VzdIABNzY0NWQ0MGM1NjhkZDdmMDdmNDg2MTgxYTc0OGE3Y2FlZTM4ZmMwZjA4Y2NmOWYyYzI3NTkzZWI3ZWY1MDg4NRxDb250ZW50LUF1dGhvchhraWIwMDY1ZWUyMXgOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg0NzM1YTBkMjY1YzEwYmZkMzdmYjllZjUwYjg1MGQ1MzUzOGI1NDZjXCIsXCJ0c1wiOjE2OTE0NjA2MTg2OTQsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImtpYjAwNjVlZTIxeFwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiI3NjQ1ZDQwYzU2OGRkN2YwN2Y0ODYxODFhNzQ4YTdjYWVlMzhmYzBmMDhjY2Y5ZjJjMjc1OTNlYjdlZjUwODg1Iiwic2lnbmF0dXJlIjoiMHhmZjBiNGY0ODk3OWUzZDJiYzc3MWY3NGVlMDEyOTcxZDQ3MDZlOWM4MDI0MmZlYWE5Y2Q0NTRlMmM5N2E3ODQyMDI0NGFkYjFkMzI2ZmU2NjNlNDc1MzEwYjg1MTBjYTFkODJiNzYwZjdkMTYxODQxMzE4M2M2NWRkMGI4ZWU5OSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFRUp6WUt5TXF6ZnRueDJsbWkvZ1lSNXFWN1U1Q1NGWjR0QUZhb1NFbGhGTUhrYWdRcW5sM1NKTWpEWllXK2RaV0NqNGtUR1pIL29acE94WFN2TENWc0E9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NDczNWEwZDI2NWMxMGJmZDM3ZmI5ZWY1MGI4NTBkNTM1MzhiNTQ2YyIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDZlZjk1M2M1ODkyNTZiYjI4MWQ4Njg5NjY0ODE1ZjZkOTlmYTc1ZGZlNjJhNjEyOWNjODQ5OGEzYWY0YWIxN2U1NGQzM2I1MDMzNzkwNzEyYzkyNjUyODUxZDgyZWRhZWUzYjY5MGE2OTg0ZDVmYThkY2E5OTUxZTBkMDZjODU5MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUVKellLeU1xemZ0bngybG1pL2dZUjVxVjdVNUNTRlo0dEFGYW9TRWxoRk1Ia2FnUXFubDNTSk1qRFpZVytkWldDajRrVEdaSC9vWnBPeFhTdkxDVnNBPT0ifX0BAI_bnzo7AAftuAxV83Ap1Slip7XUxT5CPuq0mXIDhpdX-P9Eigb3ujKiNHBfz7T4kwQnMQd0OGkie6Gl41QA_oJENvlA3HqC08nQghvUVafaPaepioRVgeOk1RdbsTly8hW9as7kY_qX0shdVtWFPASlXlnoB8tDd2wqdRf9hDop1J7EkySOwCx5s3NoSsgJEJ6r7Fhp5iNOdj2aG8LPJ95rOhec0qcSv1GFUxRJRB9Wm9o6vplDQk4uPmqjlywkXKGZmgPY4c_6IigO0F1XWJq5ubAqmO4ijovTZpuy4ZydM2WC6xZaSpngNLqn8_oGLwMvoYxZiPcPxFAiSIcVDRtzPtBvw-VbpI-a5TxdSZSshWVeA7sE8oKf8XNZameaNAg7UmYez3YYOfXt4lJeWDudyqceiYLtyjfLd0fIGAXh7q4PLhlhYzybFjOjuHKkOA-msoXwvYfAgfOzkQZTFQk6W7uAqqB11RPWLb_QT2mZ00y1fBLwG9W_NOnEBgP0iNNDIcLU5H-XbctDHbCkWjy9Ra0ofXm9De7B61kxEis0GCmwBXfguQRtq54edxlftewe_0UYHsMBckGfJDXba39f4z14vqyqYj03IIJKs3at_ITEp01TF9Of5lcLgtswX6qrrkQ-bLBcJqrigEowlzo-v6PYkPLm7K3V7Y38Cew4nPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfgEAAAAAAAAP9AUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAE1NDQxYzhiZWZjMjNhY2JiODcyNjcwZmM2NjI3MzBkOWU1NWM0NDMyYjI3ZjEyODQyMTZmMjI4MmM1MTZmMWUwHENvbnRlbnQtRGlnZXN0gAE1NDQxYzhiZWZjMjNhY2JiODcyNjcwZmM2NjI3MzBkOWU1NWM0NDMyYjI3ZjEyODQyMTZmMjI4MmM1MTZmMWUwHENvbnRlbnQtQXV0aG9yGjAwNjYxMDU1OTY3MzEAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4MGYwMTIzMGYwNjVkYjljMzQ4ZDNmZTZjNThlODZkNGRlMjk1MDhlZlwiLFwidHNcIjoxNjkxNDYwNjE5OTI1LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCIwMDY2MTA1NTk2NzMxXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiI1NDQxYzhiZWZjMjNhY2JiODcyNjcwZmM2NjI3MzBkOWU1NWM0NDMyYjI3ZjEyODQyMTZmMjI4MmM1MTZmMWUwIiwic2lnbmF0dXJlIjoiMHgzNTZlMmRkNmI2NmQ4MjEwMDZjNWMxMDk0ZDRkZDk0ZjA5MTJmNjZkMTVmZDc4OTc1YmY4MmE0MzJlMDcwNjE5YmZkMjE0ODg5OTU4MmVkN2M5NWYwNTExMmE0MDBhYmU2MzcyOTdhMmExYTJkYjVkYjMzMjIyODFmNWZhOWE1ZCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFbWs3aks3M2Uwb0FyQjJyS0VpclVvSjZ1Mmp1N3ZVQnRLSGozckdTSDFGQVJka1UvTUVPd2x5blZ2czltMHFEOVFhV2hmVU1pUXhNb2x0c2dvN2gzRlE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4MGYwMTIzMGYwNjVkYjljMzQ4ZDNmZTZjNThlODZkNGRlMjk1MDhlZiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDE4MmU3ZmM2YzhjYjI2YTExNzJiMDk0YjEwOWI3Y2FjNTBiOWVkYmE4ZDE4ZjgyZDJkN2ZjODI5ZTcwZGI3OGQ0ZDUyMTI1ZjkzMDNmMWFhZDFjNGQ4MmU3YjAzMWQyNDNhM2FmN2Y0NWMwOGVjN2JlMGQ4ZTExMDM4YjcwY2Q5MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFbWs3aks3M2Uwb0FyQjJyS0VpclVvSjZ1Mmp1N3ZVQnRLSGozckdTSDFGQVJka1UvTUVPd2x5blZ2czltMHFEOVFhV2hmVU1pUXhNb2x0c2dvN2gzRlE9PSJ9fQEAQWbiM7sww_5Us231eAaPVnM7FPqcGlMV0c-8rLTO2sKuZnsqcx21n29y1vQgTklGcxyLOOVTjxokynhjtwmnJsYUYvT0LSnYjFvNQtjv7HnPKGtAafL2ns4th8B4ImVqeb3SznqnAZ6PH5Q1lNe9R1YxpyQ_HahuL3g00nOSastUaLMCAdPBQdGsfyu-Y3k2XhxDXa8V0EQWTFrhPtGZzZl8zr0D9pktOni79gQT9aVq_3CJPRuiYNjfZlCFun1TdlA_AIIK-LaGDrwfV5DAsDX5-WtsrccL6dWe0ULHY3mfNvBSi0nn0wPG30K4WAPS7VDCg5mYDJfS1lv0p65w4A1sJzMrSmgZ6ohb_XTwn1wb-5h-E_wom6wJqFlVpSGMspUPqgi1Ycp46Qa8elWSPTF1zHjQtOUWACHjkKPElFak98ZThdM4LYQ7tOdDPAJCdINejMAtr3lrVHTdkza68oSFs1g8Ob5K5n-bmE67uK9EkXIx1fqfZuU46asBXkIqK9DkMtSjIAd16ghHGyamDXNPtKZm3Z6oS7jH5YrwXp5afOa30-RagepyS5f6jwb4HRUPxhweyqE6LJ812y_CZF4uW352tdOKNStGZTA6QddobGPHZdn-j8D7MiZSgnUlhYQMedLQPmxLPS5ypPt6TagQ6MneHyTV9H2Ldcc_rMyc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABNTU3ZmM5ZDBkODgzYzU3NDU0YjNhMTE2OTBkN2YyYmMzYWUyYjAyZDcxOTVhMTdiYjkwYWQ4ZDEyYWU1NTBhNRxDb250ZW50LURpZ2VzdIABNTU3ZmM5ZDBkODgzYzU3NDU0YjNhMTE2OTBkN2YyYmMzYWUyYjAyZDcxOTVhMTdiYjkwYWQ4ZDEyYWU1NTBhNRxDb250ZW50LUF1dGhvchhtYXdtdnMxcml3bHEOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDYxMzA4MTIyNWExNGI0OGYzMWFmZmIzNzNhYTA0YTBlZDk5YzAxNDdcIixcInRzXCI6MTY5MTQ2MDYxOTg2OSxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwibWF3bXZzMXJpd2xxXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiI1NTdmYzlkMGQ4ODNjNTc0NTRiM2ExMTY5MGQ3ZjJiYzNhZTJiMDJkNzE5NWExN2JiOTBhZDhkMTJhZTU1MGE1Iiwic2lnbmF0dXJlIjoiMHhmZTE3NTc0NGJkZjU3MDQ5MjljZmE5NzMwNDhiODM0ZTkxMTMyMjcwMmIxMTkyMjIyMzZhNDlmOGVmMDZlNTdjYjRiNTA1OTBjY2VjZjBmYjdkOTEzNWE5MmFlOTIwMDJjMGZkODQwODc3Mjg5NTNkODQ4YTNkOTI1ZjZkZGRjOSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWkQ4UXJmUktVc2ZkME9iTjdvZlEvZkN1K2N1akIrNlMvZVY3eml0dUlWa3lId2d6UlBRejZBVUJSaFRYQVRNSGZNemRMQmNCQ2phTFE2ZWtjbGhpeFE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NjEzMDgxMjI1YTE0YjQ4ZjMxYWZmYjM3M2FhMDRhMGVkOTljMDE0NyIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGFmOGZmY2UyYjMyZGI5ZGIxNzJjZTdmMDI4OTc0ODMwZDliMmY1YjI1YWNkMzMwOWVkNGEwY2VhODRmZjFjOGQ1MDQ1NjRiY2UzZDNjZmYxMTkxOGNhYjUzNzNjYzFkNDM0MDU1OTNmNGIzOGVlOTVlZDE4MzFkNzNkMDlhMDI0MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWkQ4UXJmUktVc2ZkME9iTjdvZlEvZkN1K2N1akIrNlMvZVY3eml0dUlWa3lId2d6UlBRejZBVUJSaFRYQVRNSGZNemRMQmNCQ2phTFE2ZWtjbGhpeFE9PSJ9fQEAjrnmlMttmqdj5USxoJyAfCOFt-hjCsTQQ3c98q9-jSNHbe6oSfQngjqG5C30nMI5OkoWDYHulfVeqDBoLeepmYDR_BHQKURXfadEXzqrtt4Cn8HMXgULO7DuF7iXZ9eec3WQvCbtFhUy-MwszxRw7kMqkTdYxVj9Hp8Qx3_eJe6JFus1MNJSZN-PC6w1R9t-vnDD-c8RNrjcwwwdRFY1DRH1POCQnOOJg0KyO8837G1IaoFc9hickgk5gw3ykyWqspmcMPDHFSGJt6eYSq67O0Ez-TPhPPURxaKWHlLG4_QbEHKWuJTjNMo-X6bElDLZfdF1wgQ-5Ja_8rJZ29m78e7lnnzeToqKAlitvg0LPl7-T20l0E4_VHi32YkiYMDDDZ49sRR7Ygm0bIpP6CclJCF0tBnEJQe_VQ3BiPxv9JxOOXewXhPAKKyZnOHgDN6p-_g9joHXDyD_1H-EdXpltIKBAumKjJAloqP9J9FDaCwqULqQmi0u_zC2Xwbq-tPurRKG_evsJlbVEEFJe6-HNaSCrMEgKRPjjgHmxBjQIj5wGv_ZTLkpbtdZ3ZL5tMPu2GhIEgudhKj5eW3NXjyW2sX6nXBz1JbF30vFIMmBupJTJ5m9rhnflUeCKS466QROfb844dpQTtfZVWwunMHOU_Yh9WlQvxnINdRR_fX616mc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1EaWdlc3SAATVlZWJjNmM2NzZmNzMyN2JkZjkzNDkzYmIxMzM2ZmQ5Yzk5MWUyNzQ0ODlhODdmZjczY2EwZTcwODNkNDQwOTUcQ29udGVudC1BdXRob3IYOTFpZG9ybnh2ZmczDkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAE1ZWViYzZjNjc2ZjczMjdiZGY5MzQ5M2JiMTMzNmZkOWM5OTFlMjc0NDg5YTg3ZmY3M2NhMGU3MDgzZDQ0MDk1AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDZmNGE5Mjk5OWJhZDc0OWY5MWZlMzJhNjIyYjhlM2VmNDE2MzY3MDVcIixcInRzXCI6MTY5MTQ2MDYxOTM5MixcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiOTFpZG9ybnh2ZmczXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiI1ZWViYzZjNjc2ZjczMjdiZGY5MzQ5M2JiMTMzNmZkOWM5OTFlMjc0NDg5YTg3ZmY3M2NhMGU3MDgzZDQ0MDk1Iiwic2lnbmF0dXJlIjoiMHg2ZDUzZDcwNzc2ZGIyMWNmNDY1NjMzNTJlMWY4MGIyNzE1ZDg2YzA3ZGNmMThjNjcxZmM1YWU2NjY4NDAzN2Q5MWRhNTJkYzJlZmJiYzQzZjk2NWI5YjQ3Y2ZhZjBiNGNkYTg1NGE3ZWFhZGEzOTVhYTk0M2JmMGUzZDBmNjI2MiIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFOVc5eGhjN2lucUtWRWxRL05zNnpqdTlrcXpEVkNQSTRNWmxxVkFyWTF5djRzV3IwSEIycEloazZOUjlycW1ha2Jza2Z2VzRoUjgzU0k1UGxLZEJiL3c9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NmY0YTkyOTk5YmFkNzQ5ZjkxZmUzMmE2MjJiOGUzZWY0MTYzNjcwNSIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDQ5MzAyMGY1MzgxYTkwY2E5NzQ4MGU5ZDNjNGRiN2Y4MjE4NWMyYjMyZjczNjYxMjA0MjFhMDk1NTVjYTZkZGE2YWM5Y2Q4OGEzYjBhNzE2MTczNGQ0ZDNiYzQyM2EzYjk2YTRhMmJmYTZkNzU2MDJmMDFkYWRkYmExNmFlMjQyMWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFOVc5eGhjN2lucUtWRWxRL05zNnpqdTlrcXpEVkNQSTRNWmxxVkFyWTF5djRzV3IwSEIycEloazZOUjlycW1ha2Jza2Z2VzRoUjgzU0k1UGxLZEJiL3c9PSJ9fQEAkAh0rKMc6sJlO4yZoP6oexiYJjklR2yvaOauUJt4aYIQjIc3IWjTjTdQEBC3KST5zlFadDi-8D-sY4O0IOFkE5JfOVIjPe5PBDw10YY_eydOF73KYdEebEjcWiLWQMtbE64HbElsetrRqZBmrMcEgqDs815rwoXUvCfqGZ8NSt9LanXE5BFVWMbfJlDXiQ5gXBGYk44aCTli1KRBdsF3KwQLEOci-3t9LkQTMU7adLwzxbSh-oJFZsBq-gZSuDfaQzeHwzhicPzZ-Qoq80nZW0I-W8f4W1NnRnUL6qJcLJcCamR0aeqioc7286v6FgSNOu7wqCfmzx7JEWNS0De7ZhP3LkFf3K1Fwpl23M_MFlWAzdSZg5JuigWjsH4GSAWIKW7-7XdgjFi6WwEC7yzzUaSKeIqdopjtmOmALeKvbYzmfsiXiM20pz-dgOPsEn3upopgENfr_GhoEzCh3e_rQ66Xc9tAO6ZKaNi8whN90nehJc7tOR9JSFLPveS03gVEYIA9BffkAdZHDmh--EZWgenU67VKDAOJtoi_rzYJo_ylQ1HKUEcclFw67rCuih5HJlGhZKRdxgBkzo43tdwRgK_e-__3tOo_2UdM5sJJ2bDgf8m-bJkI3RJhOHDvLl3k3T9F1xJRCMzm7-v8FLH_g-PbwX1SI5S8iVRRYM3-ynKc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABOWY5MGYwOTdkMzJlNzkyZDQyMjNkZGM3ZTJmMmU1ODhjYjNkMGEyYzZjNzMzMmZmNmEzZTI3MGQ5ZDE2NDhlZBxDb250ZW50LURpZ2VzdIABOWY5MGYwOTdkMzJlNzkyZDQyMjNkZGM3ZTJmMmU1ODhjYjNkMGEyYzZjNzMzMmZmNmEzZTI3MGQ5ZDE2NDhlZBxDb250ZW50LUF1dGhvchhkbjYzYTdkYTdvM2IOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweGQ1ZDkxMTc2ZGIxYjIyMjk4YTMzNGI5YzMzMmZiYTJmM2MzZGYwMmJcIixcInRzXCI6MTY5MTQ2MDYxOTQyMixcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiZG42M2E3ZGE3bzNiXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiI5ZjkwZjA5N2QzMmU3OTJkNDIyM2RkYzdlMmYyZTU4OGNiM2QwYTJjNmM3MzMyZmY2YTNlMjcwZDlkMTY0OGVkIiwic2lnbmF0dXJlIjoiMHg3YzMyNzZiN2RkZDExYTA0MWE1NWYwMGJkNTIxOTIxNDA4MDgxYWQ4MDk5Yzk1YzZiNTI1YWI4MmM4MmZmNThiMGRlN2QyZmQ1NmJmODJkZjAzNGYyMzkzNGRlNDY2YmUwZTcyOTUyNjUyMTQyMDQzODk4M2M1ODkwOTAwMDQzNyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFNGVCRTBMcXJFS1Q4NHMvZkgvL2RmK1NYeUFTRnVQNzZxNkJ3T05tcU0wWGlCUzNnR25DTHEyam9vVkZCUXhVYUxkeFJTRnp2U0w0blFRU291NHpiK0E9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4ZDVkOTExNzZkYjFiMjIyOThhMzM0YjljMzMyZmJhMmYzYzNkZjAyYiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDQwNTI1NGRmYjY0YmY4YzM3ZjFjMTIyNjYwOGI1ZDliZTQ4YWJmMmEwNjUzZjhhZDZlMmQ0ZDA1NTk5MDUxZTIyMTJiZDdjZGJiNTM3YjJjZDc5MWUwODkxZmU3MzcxMTFjOTM3OWQxZDY5MDkyYjZiYTZmZDNiYjhkOWE0YWQzMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFNGVCRTBMcXJFS1Q4NHMvZkgvL2RmK1NYeUFTRnVQNzZxNkJ3T05tcU0wWGlCUzNnR25DTHEyam9vVkZCUXhVYUxkeFJTRnp2U0w0blFRU291NHpiK0E9PSJ9fQEAZI4AV8tE7Ly8f6711NK5XCYbc5P5w6lx4s1JTeyC1lDtySrlLEgQHc7Kqra94ZtTz0ywgi2fUu7BCfyrIgKSFGPvGEiJ9IrxwXAfULUkwaRQVnFdAp7ZIFXWkGSFv2LTlBEHBg8-dflIQhbo77-fisDCpwP5cNzR2s2zk2JevhCtiA6nSbe6Y6V7JlL-yZ7wT3cujH1yA4jgZzLECOlOAdWU8J8NNIU_RGK9YsVv4_XUimaWv6XmVnn16t9lsCF-eGRNF3fqRcSXR5vhvz5CfuO4Cq2m8-mhKbdnbXAA8OpfmXRpF8FINXq9XeTNUN7FEbSzcqjXvISE7nCuSSQiGBolf4_RS-rhLtwYPBauSsLp2B9Nx_duKjry-7MFZp1Jzp1qksttfx3arm7BY2DdebaYexiOk7bgm33X5ZKLu1Jld6RWToIzJTIztlhzwQIggyMNpkKDxUS63C5qohu-6rCH1j_FQvcKcTTDDDA19sTCr9RD6vg5OUq541LqA75_0bzFilkxe4F877AZ9DS1xix44sGym87_8FHWPxSBxK10S2S9a0Zn-1DMb7zig4TSlRxMrDusDFIW46Kjm6ptIjeAqDaRGN_AgWm_Ao8rOCiudKVdCr4HYTg0KWs1fz8IQpPL7CY8E89EH5SXewIoM2LKxHV3zH4MpPt4BmpZa8yc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABMmYwMzgyN2M1NTNkOTAzYWNlZDcxNTY5OWEyMzFjMDk0YzQzMmZiMzhlZDBlNDZhNjkwOWRmZjA0OWFjOTIyYhxDb250ZW50LURpZ2VzdIABMmYwMzgyN2M1NTNkOTAzYWNlZDcxNTY5OWEyMzFjMDk0YzQzMmZiMzhlZDBlNDZhNjkwOWRmZjA0OWFjOTIyYhxDb250ZW50LUF1dGhvchhscmczNnc3MmEydHEOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg2M2NkNzhlZDVjOGIzZDdmMGYxMjJjOThmMDRjMmE3YTYyN2JhOGIzXCIsXCJ0c1wiOjE2OTE0NjA2MTkzNDQsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImxyZzM2dzcyYTJ0cVwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiIyZjAzODI3YzU1M2Q5MDNhY2VkNzE1Njk5YTIzMWMwOTRjNDMyZmIzOGVkMGU0NmE2OTA5ZGZmMDQ5YWM5MjJiIiwic2lnbmF0dXJlIjoiMHgzZmQyZDFmNDdmZTM3ZWMyNmNkMGE1OTVmOTEwYTYxMWRlNDM1MWM0ZjEzMWJhOTg4ZWY2ZGYxMTNlMzE3ZTlmZmMxZjk3MjkwMTk4ZjcxZWFlMDg0MGI5MDM2NGYwZDdhODA1ZDhjYzM5YjhiYzMzYTA4MjkwYWE0YjcwNGU4MSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFejhOdHN1TGdiWFpaekdkajZ4NnFLTVp0S0tkSEIzM0MvNjdUT2F2aXNLczhNY1dnS0hMaEhNVUxmUjhBZjhXSk11YUJvcFVORUJHSjlOcndWaUNITGc9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NjNjZDc4ZWQ1YzhiM2Q3ZjBmMTIyYzk4ZjA0YzJhN2E2MjdiYThiMyIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGYwMzExOTdhN2M3OTEzNmI3OTNkZDYzNmY3ZjhiZDY4MjFiZmNmOTJhYmI3NDE2YTRhNTQwZTgyOTdmMjk0YTQ3NjFiYmM5Y2NmZmU3M2I1MWIzZTc0ZjY4NGU0NjQ4OGE5MjVhM2VkOWYzNDYyOTAwZmNhYzZhYzA2MzNiNmY1MWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXo4TnRzdUxnYlhaWnpHZGo2eDZxS01adEtLZEhCMzNDLzY3VE9hdmlzS3M4TWNXZ0tITGhITVVMZlI4QWY4V0pNdWFCb3BVTkVCR0o5TnJ3VmlDSExnPT0ifX0BAEu5x3Usma1zD3MSvE6GBWqsczzjBQvqobYYtD6wUygmB7ASUDv138eUZndcTY2PgkC0WzoghvLnSXDm0pptOnpv5HbNRfJ-luipdZHoUam9K0t23arG2Rj5uixIxI6M_X2MCT8rY4nMMGGjwAE-Rff5JLNAcRekNgauzfwI4vkSWJ6MTIpIot3t3X_QFv0D7G1Y4Mlev36Juv939S81Id5EBnrWqGDTlU4ezrrHZSjmUtBYNX8_gCLjIu1KE82RLpI5L7R9w934OurQLCUrhDGAaTVsU8ejJ0e5SFBHnM0K-vXTS52LIxQ4uM1lopdzdLyvNjMICISj3Ds5R-9ICnCqvAh3TZr22t21P3cayHasZBI3E61XcWUsKpSrMS9FoIUcD6RfyJvTURPJG9GjYuLo-rZXL1LELM4Jx2zmKeuDv33Ug3duSYQaBzEUNCPWnLe1-jdze44kYmc6R8xQ9zs2cKw6C9htviMPbQVWdrj1L5Tk6nhDafj8RnwJ_0tAVtb3yiefxN4NB_Q5j2vpyhSWDtR0MSwn9QcXyUyrHu9nX480HijHgWbZvJXIuK5KAZ8GmcO9jdQmMHEwYghfJJG0LrTEhk5Pea7nX6foFr8xLIR44GVMzZZV27FjzC-gmeH_z_fhq9YoC6ASp3IJ1tL4_68umOfVNsHu05LX_w5wnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAE0MGFmOTRhMWE4YTFiZGJhZDlmMjdjZTRlYmY4YTIxMzkwM2MyNjMyNGJlNjIxYmNlOTRkNmNjMjg4YzFhNjM2HENvbnRlbnQtRGlnZXN0gAE0MGFmOTRhMWE4YTFiZGJhZDlmMjdjZTRlYmY4YTIxMzkwM2MyNjMyNGJlNjIxYmNlOTRkNmNjMjg4YzFhNjM2HENvbnRlbnQtQXV0aG9yGGY0MDExNjUzMTIyeQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg2ZGIyMjY1ZWNiYjRmNDYxNDNiNmEyNjZiNWUxNDZkMWUyOGM4MjAyXCIsXCJ0c1wiOjE2OTE0NjA2MjAyMzUsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImY0MDExNjUzMTIyeVwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiNDBhZjk0YTFhOGExYmRiYWQ5ZjI3Y2U0ZWJmOGEyMTM5MDNjMjYzMjRiZTYyMWJjZTk0ZDZjYzI4OGMxYTYzNiIsInNpZ25hdHVyZSI6IjB4NWViMGVkZWU4YjU3N2Q0MjllZmUxNTllZTVhNGIwMGNmNDRjZGYxODVmOGY2Zjc5Y2QwM2VmMjhiMzg4NWIzZWViNDg3NTU3NjlhZWMxN2Y4OGYzZDY3NWI5ZDZhY2RmZmQ0ODJkYmU3MmE5NjViMDY2YjAyZjVjMmRmZTMyYjEiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVhHWU9VK21STlk5RzM5L1lzcWFBV0dqbGpyMC9GSHZlWWFFRmxSODlHcDdqQitMNFhmKzRGRjNiOTF0V0NBcGhaZ0N6NElNRVRtU0Q1Qit0QjdmSmt3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDZkYjIyNjVlY2JiNGY0NjE0M2I2YTI2NmI1ZTE0NmQxZTI4YzgyMDIiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHhlM2UxM2Q2NWJkNGMxOTkyMzgzMDBiMDIwYmIwOTUyNmNiOWQwZTk0NGE1MTQzYTA4MzUyZDBiZDU2YzNhYzZjNDFjYjUxMTYzYzg5YzIxNGViN2Q2MDMzZDc5MjcwYWUzMzE3YjU1NjJhMWQ1YWE2ZTk0NzgxYmU2OTEwYWEwMDFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVhHWU9VK21STlk5RzM5L1lzcWFBV0dqbGpyMC9GSHZlWWFFRmxSODlHcDdqQitMNFhmKzRGRjNiOTF0V0NBcGhaZ0N6NElNRVRtU0Q1Qit0QjdmSmt3PT0ifX0BACC2-5l3m6KnICUDwWqKYLcQGGED9In1BzfP_A3ZTKfMNXzE4RuLxoJzlBpyGK01dduflBTE02xHwYxVWF9yf1XSXm5vu4AZIf3CbNolzp0smMgaeEq15lmT736tKNd9lcFnV2iXwKN5p9Pkg0fP5CpRjbUVE7pcaYbSwevj_VVSADkmJgwatL_o2k6kyMD5OoRYL0Ipli1Y9ZsnvDu3RhhqudDPh0I39PLU72ZamHzzRM2Hhm6vL1hbcDHk11lE7TP8V0410hO8epHPIiIAncOaEb1OmhkNKkK4X2iyqtpjUYwCBhKDo2WaayQAcZimwh3WZmszM1GzbyxX0UMSczFidurhmWHZ3iHHSH4shDri5vMp7_3WFo6VxkPajaiG4f3EKDhM5-zO-LjLloLBODT9_mC_V24IvRYJ5Gz8t6NrTsSL5QWk4pgUCkxTz3gN6oxbgz08MkryOujba-cBUXYsjqnZasN931QEd70DSlYhL6sP7T9ettgctWyE7oRcgMiG2WzLfFqU3FTm-6IarLgGBkf5IHCXEy8aQ0q2DREexYHiMOb6f0w1ixQmncPB_VLastirPxsSAcZa1pkXNEqvmSmr8xXnUuPoQwmu9tKLYMOL_jkPczHAX1LD9U85nKEdctLhdnSoudxEhKx4Ho33HcStZmh0PZD1rbZ5uhVfnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAAEwEAAAAAAAANngQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAATU3YTlmNTE2NTNjYjg5OTc2MTY2ODJjOWRiNWQzNWFlNDc1MzFmYzYwNGJkZGMxMzBlMDk1OWJmOTY3MTA4NTQcQ29udGVudC1EaWdlc3SAATU3YTlmNTE2NTNjYjg5OTc2MTY2ODJjOWRiNWQzNWFlNDc1MzFmYzYwNGJkZGMxMzBlMDk1OWJmOTY3MTA4NTQcQ29udGVudC1BdXRob3IcaGllbmRoMTEyMjAwMjMOQ2hhaW5JZAQ1NgxTb3VyY2USY3liZXJ0dW5lAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweGQwOTA2OTE4ZDRiZGYyZDc3NWY5OTExZWNiOTVhZWQzYjAxMjY1OGFcIixcInRzXCI6MTY5MTQ2MDYyMDYzMSxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiaGllbmRoMTEyMjAwMjNcIixcInRpdGxlXCI6XCI1NDU0NVwiLFwiYm9keVwiOlwiNDU0NVwifSIsImRpZ2VzdCI6IjU3YTlmNTE2NTNjYjg5OTc2MTY2ODJjOWRiNWQzNWFlNDc1MzFmYzYwNGJkZGMxMzBlMDk1OWJmOTY3MTA4NTQiLCJzaWduYXR1cmUiOiIweGEwZDE4YzMxNTMxYTM3ODYxMjUzYTcwZWE0NmQ1MzZiZmUwNmNiMGY4YTJmZjYxYzZiOGIwOWE0MmJiNTM0MmIyMWZkMTliOTJlMTg3MDUzN2JiMGNjMjMxNDcxY2MwNTM4ZjkxOGIwNDMyZjg4ZWIxYjZlYzIyZTYwYmQzYWFhIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVHVWp5M09oNnNzemZXTjg0U1BsMHdQYTVjUVRUWEJ0YXVYMDdid0l5d3lSRU5GMGk4SjErZUZSUG5PRHF1SmVxbjduVGNjQmFvVWtTelFlejh4M0pMZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhkMDkwNjkxOGQ0YmRmMmQ3NzVmOTkxMWVjYjk1YWVkM2IwMTI2NThhIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4NDQ4NzE0ODg3MTkxYjgzYTRmOTczN2QyMWU0Njc3ZDE3ZTNiYWRlNTcxMGRiMzI4MzE1ZjFjYjg1NzczZDNjNjNhZGYxODNkZDNmZmUxNzY3NDkyMGYxOTEzYmFkMmI0MTJjODJmNTc0NzEyYzdhZTE4YjAzZDAxYjg4ZGZmMzIxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgSSBhdXRob3JpemUgQ3liZXJUdW5lLnh5eiBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OiAgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUdVankzT2g2c3N6ZldOODRTUGwwd1BhNWNRVFRYQnRhdVgwN2J3SXl3eVJFTkYwaThKMStlRlJQbk9EcXVKZXFuN25UY2NCYW9Va1N6UWV6OHgzSkxnPT0ifX0BAIXJUsxYSPA4WDT5Blj_h3_fHLOgrqifbHA9UPiDlEoS8pvd51Xw_gnfjbPBhyavhCP0l3ym1yl0OpzRsNmN3cnY-kzS4midZEj-FP-_4HYikBz06m8tz0SPDaxLBHcWC03buGm3Hg3WtL-_giYBkjjPDC9DCN9d5jGYcDQnpIlxy2O7R66SSP84BEgwfqmw-qd9K7WmsPrvkv31r2CujGcsFaVjtBWjrDcp77_GHIZtc28xVv14fXTKbaQcy2_boehRKj5BfllHB-4CqY_xRsd_pC2N7Qu5N1iW9XMVz5scFy-kKdhnCBhfhSEpHrUYrOLpLUxrLmNIlnEpwYY3SIqLfvL9jj8B30VZKl2TqsbHABXTWoSNBstl3F9bcS5fKcg9kSOZWJ_CxpzfNiZ03pB9eETV1d6r5tflxDQn2oOHgwsi3iH66aFpJZ0Ou90TMYPOaQbKArDNVLkjVRhTtr0dJ3fQdyGTJxogaWXAHG1H18OmwH_AnXTMoH7eQi3CD6ndyjjnzOJk2Sm-LlfKBBJ1x3QrVZpFDztOztJbY7K85QB0yiGJqeGdn8s3KPgC91yMAcFvnEFxq_ZFI-WmOKWlyDWdQU1tcm6xX339dZwZJbkAJ_QEdZhk5a3AN0BEUS7N_ALl-ugBNuQ5XKc4i2GYlb9Pbxg0NF5i49Xyo_mEnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAgwEAAAAAAAAP_gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtRGlnZXN0gAFlYzc1YWI5NzQ2NWE0NmUxZDI1NGU0MmJlYzUyZWQwMjg0OTJlMWRhYWMxN2Y3YjZkYjUyYWFjNWI0OTAyOTNkHENvbnRlbnQtQXV0aG9yJGVsbGlzb25iZXJuYXJkb200Yw5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABZWM3NWFiOTc0NjVhNDZlMWQyNTRlNDJiZWM1MmVkMDI4NDkyZTFkYWFjMTdmN2I2ZGI1MmFhYzViNDkwMjkzZAB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg4OTBhODM4ZTExNmY2ZDQ2N2E1ZmFlMTc2M2RkODFhZjZhZjQ0N2JmXCIsXCJ0c1wiOjE2OTE0NjA2MjAyMjAsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImVsbGlzb25iZXJuYXJkb200Y1wiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIk9NRywgSSB3b24gYSBsb3Qgb2YgRk1CIGp1c3Qgbm93LlwifSIsImRpZ2VzdCI6ImVjNzVhYjk3NDY1YTQ2ZTFkMjU0ZTQyYmVjNTJlZDAyODQ5MmUxZGFhYzE3ZjdiNmRiNTJhYWM1YjQ5MDI5M2QiLCJzaWduYXR1cmUiOiIweGNhYTk5NzgzNDM0ODEwZTkyMWIwNzk2MWE2Y2I1MDlmNzUxNGI4OWVmZTYwYjc5YmMwMGRkYjM1YTYwOTA3NzUwNzcwNjRlOTkzYTcwNWFkNzkzMmM2Y2IxNzY2NDFmZGE2YzZiYmIzZTk4MTg3ZDRhODE3M2M4Y2RhNWQ0N2JkIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViQWhma3gyUmJuWW5oMitmTWhnV1NKamR1cXRXU3Fyd2tnZUYyU29HM01HR2YwSTY1bk1MVGNhU3BvakMvRXBWM09iVDVrOCtQdHVmckhoeWlHejVyQT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHg4OTBhODM4ZTExNmY2ZDQ2N2E1ZmFlMTc2M2RkODFhZjZhZjQ0N2JmIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4NWYyZjI5NDgxY2ZmMDQxN2ZmZmVlNDUxYzhkNDQ5MjFjMmUzNDk4MjFkYjIyMzc3ZTlmMzFjMDA0NzMyM2IyMTE4YjQwMjk2NzQ3ZDM4OGZlMTVjM2Y2Mzc2NjExYmEzOGQyMDQyN2E0YjcxOTk0NmNiMGRjNmZkOTAxZWY3MmIxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViQWhma3gyUmJuWW5oMitmTWhnV1NKamR1cXRXU3Fyd2tnZUYyU29HM01HR2YwSTY1bk1MVGNhU3BvakMvRXBWM09iVDVrOCtQdHVmckhoeWlHejVyQT09In19AQBseznYeayR5lK8-xfQ0E-ojrsihxMW7QEL-rIeUXfnzM67HFzgCFg1BsafeJGtd82k6oACp2fiqCMO0KaDhyMqQikgX2fERlp3Tp5SScvpq2O93ow8luVBgJwxR3qfc3G48FPUy7CvjMxm1Ex7l7ZCZCBi0LGqVjN6Ho09GuZ4idJnHx_Q5TAIzI5ObEHOkUKgDqsChbRxE2YeqjjqQ4Lwmx93ecSZ12sMmXfYqmolSI6Fzpth64mszlTW4HId4hlEr1iLHcYj7B1kcNKdX2TLsrCiLnidwpXjQSA02XLENrWixL1_zBOU3VQ4_AtEoGMPhD-PtDlL3vL-JAMOm98gSb7j4Kiq9H63j1tq9EixtZpeKKvAi8cdo350ANgvU0WZv9z_ie2GaQ9ilgA2WZ7o70sGPiAb5doNCXbTWGh_TtMhfWb-SfuAwexsCVuICH0JW6k-8VZXGrQMIb0KH20O7xJbIZnm8__OndcB41W0RooSDGrnwLj2mFuISwIvHCt1f6OStEhJiL3r_I9bG9ru4QAw6i1NrnCbh-fVz658Cm8WGZf4klakadft-lfqtaig4nyQELc-ouhMtUT0xNFGFjrtKt7aVvIerkb7-NTVn5ak9M7c0ZOxHmoXHUlzxbWfk_dJcvCXAyLbda4rH6Q97m8g6jErF0quZtRA182i4pz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAAwBAAAAAAAADZAEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBxDb250ZW50LUF1dGhvchhieHY2ZXVtcXdlajAOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbRRDb250ZW50LUlkgAEwZDFkNmRiYmZiOGYxMWZiZDYxZTBhNTZiYThiYjU2YTYwNDg4ZmE0OWYwMmMwZjNlYzc3ZmRhZGYyODA4NGZiHENvbnRlbnQtRGlnZXN0gAEwZDFkNmRiYmZiOGYxMWZiZDYxZTBhNTZiYThiYjU2YTYwNDg4ZmE0OWYwMmMwZjNlYzc3ZmRhZGYyODA4NGZiAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweGYwYzQxMDgxYzMzM2Y2YzQ4ZTE4ZjU3OTQ5OWY4OGQ1ODYzNGMwZmVcIixcInRzXCI6MTY5MTQ2MDYxOTgyNCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiYnh2NmV1bXF3ZWowXCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6IjBkMWQ2ZGJiZmI4ZjExZmJkNjFlMGE1NmJhOGJiNTZhNjA0ODhmYTQ5ZjAyYzBmM2VjNzdmZGFkZjI4MDg0ZmIiLCJzaWduYXR1cmUiOiIweDYwNjY4OGMyYjYxMDAxMjBmNDRmNjIyOTA5ZDU4NjdlN2RhZjEyYTI4NGU5OTk1MmM5ZWNiM2U1MjFhNTNlYTg2NjFjNDZiYzI4YTc1YTA2MGFlZDk3Y2FiZmFiMjk5YTk4MTgxZDIyOWMwN2VkMTkwZDVmMTkyMWQ3MGI4YjlkIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVYckNhUnVzdFQweHZLeUlsZ0NIandqUlVNR1JOWVQ3QUE5MUVEcU5EbkVsYzhsTlhqcjU0eHRiK0Q5aW9aQlRXOWlpWmJpdHJDWVNtQWtwTTVNRjgrQT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhmMGM0MTA4MWMzMzNmNmM0OGUxOGY1Nzk0OTlmODhkNTg2MzRjMGZlIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4Y2E4Mjg4NGM0ODA2YjE0NTllM2Q1MzYzYmI1NGQ3ZjEzMWVkNmExODQzMzY2OTJlMzZiYzQ4OTI2ODQwMzU2MTNjNmY4YmY5MzY4NzEzOGM5Y2IwM2Q1NjBkODY4Yzc4Y2U4OTg2OWE2MDRhZThkYWNjNjUwZGYyZGUxNjUyNGMxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWHJDYVJ1c3RUMHh2S3lJbGdDSGp3alJVTUdSTllUN0FBOTFFRHFORG5FbGM4bE5YanI1NHh0YitEOWlvWkJUVzlpaVpiaXRyQ1lTbUFrcE01TUY4K0E9PSJ9fQEAApBkElnWSNOxTOlfy9gS3KMmydUXeiuk-8CEofvfAbayeo5fGZvmH6tnSGWI5Ni2V6Htf1fGWYWOZbERwjhUe1I301OwBDZOdvgVxV_cQTCY-Wn3ekyuZUqhcbK8NhPZuOane1neoR8dvi74i7DudpxE7-NFHTFKsIE9Hs03W7-OjsGFgL-gQUVQ_hwxautY7ILSHqJlkcW6cq46yI9v1Uy6pgkJO3oksmJ2M_LgXyScAFmFL_qeIgGkyRiPZyE9BJaaVfc8bE_lRqIUjED412CH-hHFQWtLkPUWR7i8zs9Xp7qtMRmG7oEJl9qXzOCFPzrA12Lb6_SpaDmSpH6qsu3lmhs2LJxqZK6zxgeVqxhMdXuUvJCivnyQ6r6V3n2usij6G4BnU8tIkvkAIyG0eZmTpYwwNUUdtFnb9fl3LNHivrFfdHFGqHK2ARdhBF2-q8x9uRzsZOv3Z_R9YEH1KJvszgvAiDrdY6z1BDH-Vwn1oTRQEWN3_JaJB9GRxoa4omMWvhHEo9vsfE6p_Tf7Jce3pPqD3wovosRiWtShNpzLWsT4VSlgw-UHHwunRSuDoPF0mNCuT3Hr10HH6YV6RxHKCZ-4Mrs075wrtgA2sgkzqTwJxa0w8ban_3bvRnFUsG40skGQnZOMpWoRTsrR1nNJGauFbSMDyZM35Po5Yvmc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB-AQAAAAAAAA_0BRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABNGIwNzllNmRmZWExMTU2MjgxY2Q2NjdjZGMwYjU1NzU1YWMyZDcwZTA5NmMxNmQ2YzU4ZDdkZDdiNjJmOTI3YxxDb250ZW50LURpZ2VzdIABNGIwNzllNmRmZWExMTU2MjgxY2Q2NjdjZGMwYjU1NzU1YWMyZDcwZTA5NmMxNmQ2YzU4ZDdkZDdiNjJmOTI3YxxDb250ZW50LUF1dGhvchoxMTMyODYzMDEzOTYxDkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNwB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg1YWYxZGYwY2ExMDc4YjkyYmNhMDc0ODU2MTA2MThhNzBhMjk3NGUwXCIsXCJ0c1wiOjE2OTE0NjA2MjA1NDAsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjExMzI4NjMwMTM5NjFcIixcInRhcmdldFwiOlwiMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZVwiLFwidGl0bGVcIjpcIkZsYXBweU1vb25iaXJkXCIsXCJib2R5XCI6XCJTbyBmdW4gdG8gcGxheSBpbiBteSBzcGFyZSB0aW1lLlwifSIsImRpZ2VzdCI6IjRiMDc5ZTZkZmVhMTE1NjI4MWNkNjY3Y2RjMGI1NTc1NWFjMmQ3MGUwOTZjMTZkNmM1OGQ3ZGQ3YjYyZjkyN2MiLCJzaWduYXR1cmUiOiIweGUwN2ZmZWViMzI1MDg2OTJkYTA4MzZlZDk2MGRjOGFlZDFlNTcyZDk3MmJiNDVmOTIyNDc1MDNjYTc4ZmUzZjIyYmNlMTlhNDgwOWYwNTcyOTE5MTY1OWRjMDZkNjUxYWQyMTViNjNkY2RjZTA4MDQxZGI0NmYzMzBiM2RjN2JhIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVsZXR3YjBXUi9VT01XN2JQUy9NWE1ZSWY0WEZ5SVI3TWR0S0ZCWjlFb3VmbXlna3F0MjJTWFhpVlVQYnpjdFhCV1hqR1Exa29EWHkyNHlmcjFwQnVWUT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHg1YWYxZGYwY2ExMDc4YjkyYmNhMDc0ODU2MTA2MThhNzBhMjk3NGUwIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4ZDQzMjBmMGY1OWZkM2QwMWJmZTcxNmJlMDgwN2NmZmEyZDcwMjlhOGNhMjkyNTBjMWRmY2FkOTYwNjM5ZDM0ODE4MTc2ZjRlN2VhYmQwNjA0NGU3YWQ5M2ExOGYzNjE0NmVkMTRmNTAyMjJmNzZlYzYxNzNiNmJmNzZlYTcxOTcxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVsZXR3YjBXUi9VT01XN2JQUy9NWE1ZSWY0WEZ5SVI3TWR0S0ZCWjlFb3VmbXlna3F0MjJTWFhpVlVQYnpjdFhCV1hqR1Exa29EWHkyNHlmcjFwQnVWUT09In19AQCGx6Akn1fizpaeFg6vWJhSdGRrLM5SjgVccqwlWJV71itRyxnnxNsDWjLfBa3Lwbrs-pAKPCEx46EKTPJA8aP9eObgQQihwhXJqJMNSCs8_pm-_yCxvpN48RpcQSp-kb3CFvlZt86uOHtzcHvwnP0UtLebpSkWXzaqSuWMssghw9SAfYkoqSyGrkz5L-GVRXZZXFyAnQ6BEAu3fgFWKXDkLgujs1PoUtLuDUMOOTuWMa81kYXcfB5pS3myJaBl_c8qEMFoFelegOl3ao12DuKozJShLcvAZmoby4hd0yDvb8ZAPppC1KRqX6qLR9fdwtKvNIn7VXwVdLY9ki9s-jVBel_KcNeMR7QLseYcFExDZ4sGf8MKL8v8YzIJUFrJd2rBOJM5QyrcrjCbxEOaHWAiBo4EWKto3BbUAjZY_Fm42vXuVHgM7Lbn0jGlWRIV-ODkZAq184guqQ2XPTMHrVs87lRU_EMWP0FKxpImr4gZFn7VlCBob0QInOGPPvkh_dPsqf6woS2CeQn_NKJDSgKPX7IMe83Q7HGNwiJfjR5OpJ1qLN4XZhERohYxbiuNN0ivL2Rah5rMDm8pPcgywYoMx_UevNa43HEQzQwtLVIxpum6_kb-UsNNiWQkaOm0yhTOC3zGCnIICLump0F13gaNrqJM8ZpHncA3C4i-fFV3upz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAH0BAAAAAAAAD_IFGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAFiNmRmOWJjYmJjYTgzNjhiN2I4ZTgxZWVjOTRjY2IxYjk3ODY3M2M5NjJjMTM3NjhjYzJkOWYzYzc5MDlmNzE0HENvbnRlbnQtRGlnZXN0gAFiNmRmOWJjYmJjYTgzNjhiN2I4ZTgxZWVjOTRjY2IxYjk3ODY3M2M5NjJjMTM3NjhjYzJkOWYzYzc5MDlmNzE0HENvbnRlbnQtQXV0aG9yGHcwODg4NTE2MDYzdA5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4YzVlZGQ5YmI2NDdmZDY2MjQ5ZmVlYTA2NjBmNTBmZTM4YjE5ZTNiZVwiLFwidHNcIjoxNjkxNDYwNjE5MzE1LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJ3MDg4ODUxNjA2M3RcIixcInRhcmdldFwiOlwiMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZVwiLFwidGl0bGVcIjpcIkZsYXBweU1vb25iaXJkXCIsXCJib2R5XCI6XCJTbyBmdW4gdG8gcGxheSBpbiBteSBzcGFyZSB0aW1lLlwifSIsImRpZ2VzdCI6ImI2ZGY5YmNiYmNhODM2OGI3YjhlODFlZWM5NGNjYjFiOTc4NjczYzk2MmMxMzc2OGNjMmQ5ZjNjNzkwOWY3MTQiLCJzaWduYXR1cmUiOiIweGUwMTNhMTM3ZDE3N2U0OWM2MmI4OWFlZDVlMmZlNzZkNTQ1ZGJlNDdjY2E4MTE1YjI0YTAxNWUzYzNhOGMyN2E3OTQ3MDljMmFlNDFkMzAxNjBjOTI1YTU3ZTM0YzNjMzQzNTY3ZGFkZmFkNjNlOGIyYTE3NTlmOWQxZjU0NmQxIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV0Qzd1TFdWRjRyV042UGU2YzQwQ2QzNTlQc2sxM3RMZFROOCtlY0pHYzhldC8xbFh6N3hKYUZ6SURudXN5VE8wRUxwdU12NzJxelc4RXk1dlFYa1pUUT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhjNWVkZDliYjY0N2ZkNjYyNDlmZWVhMDY2MGY1MGZlMzhiMTllM2JlIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4MzJlNTZjM2EyOWNjN2VkZjdlNDY2YTc0YjZhNmU0OWFjMDNmNDM3N2I2OWQ0MGJkYzQ2YjA0MzdjMTNkYzZkOTNjZTJiNTk3MTBhNTM3MmU1MzU5OGQ3ZjhiYWNmMmRiYmM4OWI2MzBlMGMwNTM1OTA5MTYzNjJkYTFjMWJlYjQxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV0Qzd1TFdWRjRyV042UGU2YzQwQ2QzNTlQc2sxM3RMZFROOCtlY0pHYzhldC8xbFh6N3hKYUZ6SURudXN5VE8wRUxwdU12NzJxelc4RXk1dlFYa1pUUT09In19AQADfbg7hHNbSnuyvcwbq4zlvLUrvbjaeT65Q_piS-mpVYug3PSg4QjIcEt_AdW9d3lJPLOjl3NC9zJYoiDTQNDcpzzx1q0hcg7_wMROF56-Fq-jlW691jxFjc8i5GDYbYIWXYBkqwiZXnuKMqkRi2cG3RXYxqmaP4biVx4hVHSJL9wD1J1brnhmGG11timDGdm5w-IQ-zvCWAGOTQ-Orv5bUJUrbETorVgFZUzxWjdTWtSm36mAdGq5XeDTE_k-4CfcrCZAnOKIPiyJBnVC1LigboJR1rqcmwk5FV9zQrG4Rt8LokQ6dOPmC4HA6Bu_uujQEMKKYmoEUp5nJJX9YViKo2a3VCh4GjSp7UbavQ8Zl65VVyfUpesCxcBmjIcyFfz8564gUIAJMFNbykSXgoC6OBb_FdfB_ziX97yTdM7YpvuVApaMrrsXo9m9utDG-BksmTkZq6n2SwNt5oCRGHG4f7ks5uewA7hjhkg238RoJJiHL84fXI8FA_hxosepqqB4_oZ-g9MgNul38CA9KPX56ranae_AvSAdWkmM7aaJwKaSo9uLX-WX9cHZ82N5UxVGEZ_4v3xyWn1z2C2wTdXY-JUpsJkMKczDeETYvH-vpmpOMG-P-A2ZbUaAyZXdmSdBDTby0N7k-3HEtEs7Z3iUqFkyU93iNPsGzdgK8b5gppz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAH0BAAAAAAAAD_IFGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAEwMjhkZmQzMWViMTljOTgwNjhlZTY2YzA2YTU0NmM4NWM5NjM5NWM4YzI4MzYzOGMzMTQ1Y2E3ZTdkYTY4OWE4HENvbnRlbnQtRGlnZXN0gAEwMjhkZmQzMWViMTljOTgwNjhlZTY2YzA2YTU0NmM4NWM5NjM5NWM4YzI4MzYzOGMzMTQ1Y2E3ZTdkYTY4OWE4HENvbnRlbnQtQXV0aG9yGG1oOGx2a2psM2I1Ng5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4MDBmYjdiY2Y0MWU5Yjc0NTBlNDFlMmIwMmQxNTNjNTA4MzNhYjkzOFwiLFwidHNcIjoxNjkxNDYwNjIwMDIzLFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJtaDhsdmtqbDNiNTZcIixcInRhcmdldFwiOlwiMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZVwiLFwidGl0bGVcIjpcIkZsYXBweU1vb25iaXJkXCIsXCJib2R5XCI6XCJTbyBmdW4gdG8gcGxheSBpbiBteSBzcGFyZSB0aW1lLlwifSIsImRpZ2VzdCI6IjAyOGRmZDMxZWIxOWM5ODA2OGVlNjZjMDZhNTQ2Yzg1Yzk2Mzk1YzhjMjgzNjM4YzMxNDVjYTdlN2RhNjg5YTgiLCJzaWduYXR1cmUiOiIweDc1MGYyZTkwNmEyNGJhYWI3NWU0NTcyMDA0YmFlNTVlZGQ4MTQ5ZWU1MzUxM2VjMWMzODJjM2U5NmMyZTI2NjRiNmQzNDhmMWM4MjZjZWU3OWFkZTNjOGZkZmZlNzI4ZWI0MGZiMzEzMmFiNmEzMDBiOGU2MmYyNmIxYzk0NjE3Iiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpRkJlTU9xbmVERTZ6V1BybHJObU5OSWZ3UUJYdFVVYlVSN2tQRVN2RzlTTkdBcHFrRVZMRENEY3lOaGpxd0c2NTYydExqTzQyWlNZZnRkdER3TC9IZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHgwMGZiN2JjZjQxZTliNzQ1MGU0MWUyYjAyZDE1M2M1MDgzM2FiOTM4Iiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4ZTVhOTk2NDlhODE0YmEyNTAxZjc0YzFiNTllZDc1YjdhNDk0NDNmYzM0MDRiYTc5MzNmYjAxNzI5ZDgwMGQ5NDU5NmFiYTIyMjhlMmQ5MzkyOWI5NTNmYWNiN2Q4NWI3ZjMzNGI4YWM2MTI3ZGM4YTg5NDM5N2VhZDE4OTlkOWMxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpRkJlTU9xbmVERTZ6V1BybHJObU5OSWZ3UUJYdFVVYlVSN2tQRVN2RzlTTkdBcHFrRVZMRENEY3lOaGpxd0c2NTYydExqTzQyWlNZZnRkdER3TC9IZz09In19AQBW_DBFCnOmzFjJCbzWYmUI4ae8xSl5C41e54rgJhzyl70VIAhra2HaP38lpqJJgxcLVzuk-Ja_SWPHdUIwQ3khj-6vZQzewbjjR5Zu1G2FfztcIrW6Ylj0rNMWtsd0h6uA3T7b_3zVwAFr9VomS3AK1czo6QBDlk7Agfx_FpOjVYVwaqrwUptNVVCFGYrYeh7Y_nG4EgLmRndYyFmXAbrZ8m4L2zc0TKeiQNMHQYjuOO9fl1-3ta2Sz4VgOgBQUMYx9-IfEk3WvIeJmhCZo-wwgjjmfM14QrHTkGRNB9sd8GIB94kqQdTSMPKecH45a27Vut4CsI_fCIVpVuJhd9l6rr5cI-NO1--n_FMx-Rrc7Wclg7sF5QdZTbA1FTn_ARbpo2YdDUs6LnJbvhi23z4p3zopyGC5B7SVMCYtpnSF4IOezSicMkbx1Ld2I-692MotdPNaEMVLzPKDxjWd4RPnQRlVcziANRIVY0oE4a6QjFfmK7JSK6D1cAgzMa5LjkEoZHPaA2awphp7IQdQl7e7gFoximm38GLVhYBP3FHrQZ8rbe56-jZdi6qGZi1o3ZcAUNl6ElQjKmEZS1zy2s842-NuE3jgRXOBR4xJoFT6rmqMrrzsIpGdie0-7bZE_o2l7LuupOlkvqa3Cdk7H9NSS0lzv7qIMi6WntqeznoRhpz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAA0BAAAAAAAADZIEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAFjMjcyMDlmYWFiNDNiMWQ4YzgwODAxM2NkZDM3ZWUyNzJjZDRiNTkyN2MwMjczYTkxOTExNDRiYThlOWQxZTVkHENvbnRlbnQtRGlnZXN0gAFjMjcyMDlmYWFiNDNiMWQ4YzgwODAxM2NkZDM3ZWUyNzJjZDRiNTkyN2MwMjczYTkxOTExNDRiYThlOWQxZTVkHENvbnRlbnQtQXV0aG9yGjgxNjI1NTg2NTE1OTEOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg4YzMwYWYyNTQ3MTBiNTJlNWJiZjM5MTJjOTJmZjY2MGQ3NTRkNTBiXCIsXCJ0c1wiOjE2OTE0NjA2MjA2MDUsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjgxNjI1NTg2NTE1OTFcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiYzI3MjA5ZmFhYjQzYjFkOGM4MDgwMTNjZGQzN2VlMjcyY2Q0YjU5MjdjMDI3M2E5MTkxMTQ0YmE4ZTlkMWU1ZCIsInNpZ25hdHVyZSI6IjB4ZjkxOGVmYWMyMzY1YjVmMTY0YzdiMDgzOWI4N2YzNmZhNmE5MjBjODhjZDIwY2RkOWI3ZTkxYmEwODE5NDM5YTQ3MzUxZWYzMTAxMGU4MTVkMTNkNmRjMmEzMGUxMDc0NmQ4ODg5ZDU4OWY3MzE1M2I5NmRiODViYTBiMDlmN2QiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWhGWWF1Z0RLcXRVK05RbFVoUmVjUjNIdmJGK1hLVGYxWmI2cmhodEt4ZVFZN0w0OWp5anVGY0k0K3daQTJkTjJIdGlycS8xMmlpS2IyWDg2N0hLd3RnPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDhjMzBhZjI1NDcxMGI1MmU1YmJmMzkxMmM5MmZmNjYwZDc1NGQ1MGIiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHgzNWU3ZmExZjc3ZTVkYjhkODgzM2NjYmFmNTgwMGJkMTg2YTI2NmUyZWU2NWUyYzBmYzBhNTNhM2IzMzE1NzFkMDQ2NzA5MDAwNmIzNGE4ZjMwZTFkMDJjMmYzNDFhN2VhODZkZTM2NTg0ZGM0Yjc1MzYyZGRkNWE2M2YzMzg3NDFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVoRllhdWdES3F0VStOUWxVaFJlY1IzSHZiRitYS1RmMVpiNnJoaHRLeGVRWTdMNDlqeWp1RmNJNCt3WkEyZE4ySHRpcnEvMTJpaUtiMlg4NjdIS3d0Zz09In19AQAvdWd4Bv5gLKO6-6Eit1GykEJkKwbzIyteTikMasGtD3D9_x2wpA9Ad0Oe6XmKEo7f5biWeIkU_Yqcu-7M5w_LK6hEDpDq6YC-bWBzIG5YAWmvTfS40wdNnQoFl1QDVKdF8yRJ_HYvdkgFLMCNIZiB3Nnzb2mO4w69wQMkNUQ88bKEVIwq0-A4v6_L0--3ijAXJMVudstYL2digiqlWJklJCGpFAhqwmumQmj4Fq2VG11VraYj3W1TDn3hJWAnzneIXztz7QFGSu4qk17hzND0NRkZL5YkZFLS4NYZINhYyunGBw89at0RUY9vQAkpfZl73TlRFL8_rH4wwOQZy3SnuAOBx72dsNXQazfOYAefk5a5iAAkyq_tfBSUBZow7PrdQe39CgFPhXY9iuJ7p3QzuOxiiBXPqhnVRUz62xdWzz1gVxZWprGeCszCOqhDTAuRogeQg4l5E_okiWoAGb-n6fE0Zxa3C_RMC9nYnNSKmNyP2P4iho2zpEfExV2N-zQGwclN6F_fdpS43XawJKbBzxLYS8Quf20T0wORzz02tDI59S4at7S0PX6KR3NDQfc_X90Ot9DFqFXxryYT6nVS2WI6Ylce8VFVnoc0VopY8gKieDDjyoMIL9UFmz0BtdLnOb12eyjKoLs5eH4oRSPEr7ORitA0s8BJ03nk0uwRf5z4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAIMBAAAAAAAAD_4FGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdAxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3FENvbnRlbnQtSWSAATdlNWJjNGE1ODNkODY3NzRiNDE3YmMyZTc2YmRhNjcxMzBiODUyYWI0MzlkMTQ3YzYzNDI2ODU0MjgyZjA3N2McQ29udGVudC1EaWdlc3SAATdlNWJjNGE1ODNkODY3NzRiNDE3YmMyZTc2YmRhNjcxMzBiODUyYWI0MzlkMTQ3YzYzNDI2ODU0MjgyZjA3N2McQ29udGVudC1BdXRob3IkY29sdG9uYW5nZWxhbGpmbDM0DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4ZjIwMmVmMGNmNDhjYmM5ZTgyZWQ4ZWMxYTIzZDMzNmIyYTMwMzMwMFwiLFwidHNcIjoxNjkxNDYwNjIwNzQ1LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJjb2x0b25hbmdlbGFsamZsMzRcIixcInRhcmdldFwiOlwiMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZVwiLFwidGl0bGVcIjpcIkZsYXBweU1vb25iaXJkXCIsXCJib2R5XCI6XCJEYW1uIGl0LiBTbyBlbmdhaW5nIHRoYXQgSSBwbGF5ZWQgYWxsIG5pZ2h0LlwifSIsImRpZ2VzdCI6IjdlNWJjNGE1ODNkODY3NzRiNDE3YmMyZTc2YmRhNjcxMzBiODUyYWI0MzlkMTQ3YzYzNDI2ODU0MjgyZjA3N2MiLCJzaWduYXR1cmUiOiIweDc4OWNlMGFkMDU3MTUzZTZlMGRlYTliYWNlYmQ4MjM2YjE0YjhmMjNjOTg2YzUwYzRmNGRhOTRmYWM1NmJmMzAyOWVhMDhkZjIxZTkyNzE0ZjlkYWU3MmU3ZDI0ZmZmODZhMjQxMGQyZGYwYzM0ZGYwZDQzMmY0N2ZkZjBhYWZhIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVCZzZ0V1pyd05yRXVtN21FdWZRVit0dzViSnhjZ2gvNzVTc05RZEEwUFhGQ1RqbkZkSnlaQXo4YW5GS1FKL3VFa0dFSDZJM1k1NWp4UG9UZUYwZGdDZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhmMjAyZWYwY2Y0OGNiYzllODJlZDhlYzFhMjNkMzM2YjJhMzAzMzAwIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4ZTY3MzhhZjM4ZTFiZjg2MTFjY2UxOGNjN2QyNjAxMTllZWEzOWEyMGFjMzYyMDZhNGUwZDAxZDk3OWI4NjI3NzcxOGVkODZlOGEyOTkwNTQ5ZWQwNTM4YTljYjU5YTRmNjFlYjFkODdmYTc1MjJjMWViZWEzMTk1ZjFmYjY1ZWIxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVCZzZ0V1pyd05yRXVtN21FdWZRVit0dzViSnhjZ2gvNzVTc05RZEEwUFhGQ1RqbkZkSnlaQXo4YW5GS1FKL3VFa0dFSDZJM1k1NWp4UG9UZUYwZGdDZz09In19AQCI6rlxFMer8FzvqekmclPzmJfPgnqGBWF_B8DnlQg_mDpLATWYrn7c2nv53E_P9IKmmbnriuIBxP-ujJKlu0sB0FmkTZpWX0H5IHNV8DppeS1HeHutBgySgSpkjEAdhrA1thbtdCplYSYCPfo-mzS_Q6b5xEX6WvqTFtls0Z405GWe1ob-sdUc5RDHBqmxBwWtoStn7p71vKuEyn9Y0XAAjcyKFksXnPqlpuX-9tHpVoHIFmIzfdRdrPU3qhxtna3u3jX4v9ksz-nqAkQedk3DDHnCHQ0WWRBvBDL82in06MldqTnkQL3Ih2lkyvtfcysE-3Nfx4mVxSyFFfkeZHcwZNE-1Guw3OeuDOA6GJzrZjBLPMsH6f95Fdn0B9vPNT8Y5_IOO_FumvBa5Be5nShI-ad7FcWDXhOtmA3aE0asMKdiUV9zV-MeT-dUxWWDw7T7zbknFoYU-eHjlwP3oRRYzeccv6qUAGnI_38evf5druIkgG4fHn4J4rzpnHNfdiZ4bvOQbWNd2c661aXcLZ89y-MfnOgqKowGg8vlqDdn6Yp17fQnfZsyGpkoXdMvO0Z2LRDeEdwZRrfZSCP1GKzPBusYgjxNbIICKMW3ZYeqZZFnI9HEdlGf8qeXVJspBOUWoWnPRE3ANHP9SLik9LqhR85Tpd1kOKG2RfeDzGJcd5z4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAIQBAAAAAAAAD4AGGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBxDb250ZW50LURpZ2VzdIABZDlmMmRlMzMxZTU1MDRjZmRlOTkyYjIyZWYyYmEwMGU0ZWY1NWI1YjBiZGQ1MTcxY2JmYTk0ZDYwYmM4NzhiZBxDb250ZW50LUF1dGhvciZsYWJvcmVsd2F1dGVtX2N5YmVyDkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAFkOWYyZGUzMzFlNTUwNGNmZGU5OTJiMjJlZjJiYTAwZTRlZjU1YjViMGJkZDUxNzFjYmZhOTRkNjBiYzg3OGJkAHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweGRiY2IwZTMzMjU4M2JjMmRjNDEwODA2ZTgxZmRmNWFjODI1MzAwOGZcIixcInRzXCI6MTY5MTQ2MDYyMTE1MCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwibGFib3JlbHdhdXRlbV9jeWJlclwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiZDlmMmRlMzMxZTU1MDRjZmRlOTkyYjIyZWYyYmEwMGU0ZWY1NWI1YjBiZGQ1MTcxY2JmYTk0ZDYwYmM4NzhiZCIsInNpZ25hdHVyZSI6IjB4OTQzZjBmMTIyOTgwZmZkZGYwMDQ0Y2NhNTVjNjU3MDI0YzNiZWY1NWMzZjdiMjEwYmE0N2EwY2VlZWU3Njk1MThlYTYyYjJkNDJlYmNjYmU2YjJjYjMzYTcyZGRhYjQ4YTM4NjRmZTIwZWQyMzQxOTA3YTM3ZTc1ZDMxZWQ4MmMiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRW1FK0FvYW9HYkhHb0ZkWUZwMDFucVpCZDBqYVJLelNWZ3hsUWU1U04zd09LKzhCZE1YTGR6S0dIMkdpRHJHNGJFb25mSWh3Wkp1OU9xc0VvZExiVEVnPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGRiY2IwZTMzMjU4M2JjMmRjNDEwODA2ZTgxZmRmNWFjODI1MzAwOGYiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg5YzdmMWVjNTkwMjU3YmQ1Njc2Yjk0ZTgwNzE0ZjViYzJhZGMwNTQ0NjYyMzQ3MDJlYWZhNzdhOTIxMGQ4MTUwNjMwZWYxOTg4Mzc3ZjE0ZDQ5ZmNjYzllOGFhNzg3YjhiOTFhNmQ2ZTQ2NGJmZDczZjU5Y2Q0NmI3OGI3ZDdiOTFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRW1FK0FvYW9HYkhHb0ZkWUZwMDFucVpCZDBqYVJLelNWZ3hsUWU1U04zd09LKzhCZE1YTGR6S0dIMkdpRHJHNGJFb25mSWh3Wkp1OU9xc0VvZExiVEVnPT0ifX0BAIi0MGv509ewzuQcTTGaXlKVMCJ8D7zliOgOx01j2ryMyIHg_T52PHYV4L8hBo0ByOvlzDrq28ROBFCUuxF6jDfZZLwgBSIQXSdkCGJgpBgO6JcDfAEKWecMR4JEKrWu4_fGzTrHqY2GGjQhXP6-fjGRSkYanurI0yYvsQOi7VMIGvu0o7edWgqTentohFSTimDCSmjazg_M2Uka1IG1dLvEcuJGXmyG4vYIoYvtXb4SBcn-VT3VHX6K__EkdB0iEfTlU0lsp4JGOoSCXkPdX4LG2cfMTTbWRf6wqnz-rNQUIHM05UVPVgkVbEK25eZCkrCOeZ2gOpBu91P98ytR638jw_pg2wtxJod-0mCOPwbr0x0aMHtZpmV223bQ0pGHiPTtBQjLTtF-wLP8GEzRvHHwPrx73bmPe6V3uw8H0cQ0at4OLHVvn412V6FLTS2MySJhV6x4K4ggPrlksfdASAH6flKfYi8_6gxBNoVIUCISADXEifalt0Iy5d33s1TAzF9s-9tI-U0Lydpt1Xy3Nsd58maACHep0C5OjX2G0hebeLKQN6rbnMwFZUE0vSfmoSVEUcbCNdbudoyGwXkjfR2TJ-XCTixPJf-Skes2G4PoVVcXs9u6pgl_6bn1LvCkL8ZPrmBMEuQTIuLazN732QqnAVkEsp6um7MIiaUx8S2CnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAADAEAAAAAAAANkAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtRGlnZXN0gAEyM2ZiN2YzNzkyNTVkOTY5Njc4ZTlhMTBjNmM2MjZkODc3YWRhMmUwZTg3MTQ0ZTA4MzRjMGU4YjQ0NGY1NDhiHENvbnRlbnQtQXV0aG9yGHBtaDVoM2E4bzhuYQ5DaGFpbklkBDU2DFNvdXJjZQhhdGVtFENvbnRlbnQtSWSAATIzZmI3ZjM3OTI1NWQ5Njk2NzhlOWExMGM2YzYyNmQ4NzdhZGEyZTBlODcxNDRlMDgzNGMwZThiNDQ0ZjU0OGIAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4MGQ1NTIyNGZhM2QxZGRjNjVkZjYzYjMwYmYwZTkzYWQ1OGVlNTI5NlwiLFwidHNcIjoxNjkxNDYwNjIwMzAxLFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJwbWg1aDNhOG84bmFcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiMjNmYjdmMzc5MjU1ZDk2OTY3OGU5YTEwYzZjNjI2ZDg3N2FkYTJlMGU4NzE0NGUwODM0YzBlOGI0NDRmNTQ4YiIsInNpZ25hdHVyZSI6IjB4YTNlMWM0MDVkZDdhZmNlMzNmZDRlMTU0YzA2NDEzOTNiM2EwODJiYjBmNWMzZTk0MTM2MzZmM2Q3MzYwZmE4YTY5ZTgxMjgyNWI5N2E2MzYyNmFjNDFiOTBmZjk0MGMyMTZiYTY1NTIwODYwNDk0Mzc3ZTY1NDY2Zjc1MGI4ZTIiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXpXSlE3c1dtRHg4RTQxNHBUOHhmOTI5eTdQVkk5ckNVeTlzcGVDRlc1RDFpNjJoVTNsZGZnS3pJT1hNN1pSbnBPV1FYZWV2UW5BZGsvWCs1bnI3a1d3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDBkNTUyMjRmYTNkMWRkYzY1ZGY2M2IzMGJmMGU5M2FkNThlZTUyOTYiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHhjMTQ3MzE5YTI2MzYwYjIxMWFiNjM5NDlhNjZjOTgxMGZmYzVkM2JmZmU3MzgyZGU4ZTg2ZGUyZWJhY2JhYTEwNTQ5MjU2YjJjY2M4OGEzYWZlMGMwMjk5ODYzODU4Y2Q2ZjExYWRjZWQ5OWM4YTljODBkZDYzNGUwZGIyZWI5MzFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV6V0pRN3NXbUR4OEU0MTRwVDh4ZjkyOXk3UFZJOXJDVXk5c3BlQ0ZXNUQxaTYyaFUzbGRmZ0t6SU9YTTdaUm5wT1dRWGVldlFuQWRrL1grNW5yN2tXdz09In19AQBDNk_te6kOKW6sliJ6ugnnlvgZSpFs53SEw3XjmeOhZSg8Ox_xUZ7RCAY2LTIugNiWJ7Vr-IGJu2j9uXvijgfWnDFTy5GRHJUfdFFa7Ug6PQocdLtLODz4CSewe23RZvuToof5QlUqC0YJQ7k_2TppYTjlO1s2SKZEiCi_ls-0BkPMauPf9-8i9aBlKiCbrlVPMYkg1daAgpJG5BqQmqUBXfY5AMwk5_Sp1JukIaigGAGLoAkQRlMBXF-PJ05NCeeooPVLHt05P3JbXmow96OmH2bKAr_Oq_wysRBsLft3Dz2rddZCIaRO3gKFNHAW3fpjirXGW8zr4PC7HeUPJ0cBn4uiZNFrgz8dVWWyuRoyD6SnxWOdcehqBmvXktAzb-6iB6Nkg4oPI5I-g_MBtKciwesQUnQ6k7DpDDnqpNr3Yn9l7r1OaelL-iz3omerVFGcAgV-MHu6rXTSeScGzMy_V73O03BFM2Hs2mZZUnPFaVykqAsh5rFwFIZjZ3ZzFrFd9uDZ1TCnAHLDnji1r_PiT-7Hxo_svPoKs2H-Wt9ONYWLTDJ7fITuR598o5Yclp_DTOJHg3w_9pIiYszm7fz-eEOU1Hll_2LNbZDk-EuATvJ-bcT6H9qTI7-9zNZ4fF_fkg3Y5Q59Rx-wKbG2fxc2-Opiyyxq1FmXH9y1MkN7zpz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAH0BAAAAAAAAD_IFGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAE0N2I3OGYyYjdiYTAwZjg1ZWYyYzFmMTRiNzk5OTRiOWY2NGI5ZjA1YzBjODYxODEwZmZiMzNiNGMwZWE1YmI5HENvbnRlbnQtRGlnZXN0gAE0N2I3OGYyYjdiYTAwZjg1ZWYyYzFmMTRiNzk5OTRiOWY2NGI5ZjA1YzBjODYxODEwZmZiMzNiNGMwZWE1YmI5HENvbnRlbnQtQXV0aG9yGGtlczZnYzllY2NlZA5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4YjQyOTY4NGNmNDRkMzhiYTAxOTk0ZGNmOWY5MzQ5YWRkNmUyZGZlZVwiLFwidHNcIjoxNjkxNDYwNjE5NjY2LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJrZXM2Z2M5ZWNjZWRcIixcInRhcmdldFwiOlwiMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZVwiLFwidGl0bGVcIjpcIkZsYXBweU1vb25iaXJkXCIsXCJib2R5XCI6XCJTbyBmdW4gdG8gcGxheSBpbiBteSBzcGFyZSB0aW1lLlwifSIsImRpZ2VzdCI6IjQ3Yjc4ZjJiN2JhMDBmODVlZjJjMWYxNGI3OTk5NGI5ZjY0YjlmMDVjMGM4NjE4MTBmZmIzM2I0YzBlYTViYjkiLCJzaWduYXR1cmUiOiIweDE4ZDYwZjM1YmMzMmEzOGRlYjZkODg2M2I3NmE2MzNkN2NjZGI5OGU0YTBiYTdkOTUxYTk3Zjg0MWFhYzE3ZDM5OTIwZThjNjVhMGRhNjU0NDRlZWIwZjM2ZTJiMzZiZTg4NDVhYTNhYzg4NTY3Y2EzY2U4MmE5MGQ0MGUzMmY2Iiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVOS1RaR3dXUzV0U0prakVkOEMzVXpZWEdnNHVaSzlheWJBV0hQd3RUSE52NHVtanZ0SzR2WkVTUFRFY015OFZxc2dtN3k2dlA1b2RmeFJycnVXVVJYZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhiNDI5Njg0Y2Y0NGQzOGJhMDE5OTRkY2Y5ZjkzNDlhZGQ2ZTJkZmVlIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4ZjdhOTZhMDEyYjFjNzkwOWMxYjYwOGMwYjQyYTI3NDJiMmJjNmViMjlhNDE5NTQxNTE1MjllZDVkMGIyNjZjMjRkMzcxZjY4OTZlNDEwNTQ5ZWQ1MWY1ZGU2ZjUzZGEzNjhkYjJiMzg4OTU2ZDE2OTdjZmM2ODkwZTc5ODc2NWMxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVOS1RaR3dXUzV0U0prakVkOEMzVXpZWEdnNHVaSzlheWJBV0hQd3RUSE52NHVtanZ0SzR2WkVTUFRFY015OFZxc2dtN3k2dlA1b2RmeFJycnVXVVJYZz09In19AQACXtWtuiKouB5IRrgTDUyqxLcRdtTzC3oOQbINn-Ij4knOvd8O7jjcBSjrplTaSU5_q9N53c_DpqSjBYl_aw4rAINgpN4wl_06iyv0baYCR-Dw4aDoQtoiy-ue00uAUfcVINTvqUYgalB0f6wiI4hnsixTFSHzYrvlmPuJN1OFzzRiqbTOByRMS9DVIcnMHbPkgaWgm7IS1GflEHdembPTMRpKz5taW1N-QqPNNCNbwl7P1TK9dmf0AJtDkmg7WC6oHbxBBYqt0Kzrlt5RQaWpYI1TsVWjTsfxBHcUAp0fzkQ2Tsg0d8XwNf-qReAeD1SFmdWIwoeDssCLsmYHeeUw5GKwR-S_UFkk8dKlYpu2oS7XODcX-PAgtTE7X2EXrtOhpNaIE49h-JUXD9AE-Z0rofzj69O5K8TpcQVrA3Q-uS4hsUV5XVEGferuCR8nHoyzKoIOqxQqncJj3dXN48Z91w5zcNK8KLkRAHhc_IA5SqPtVlU8jFpS3HUcIWxUPdz85ZKUpSuulvX6xa5Le9xp4iFQ3AcvqjQ-4Vqm_-cNV9JuVlPmJ88DsWgfVWYcZEhHmh408UR52hEhJjH5ArQ8V2hMFUvUNhdAfhpRevU403b_Ak-wHpdaEjdhV3AEVGY7vcHQnudUR6PmuTagkI0i57Gl2pPeskc6YB0MfPom15z4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAAwBAAAAAAAADZAEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAE5MTBkYjRjN2YyMDY5MTU3ZTQ4OGM3MmU3NjUwMjRkNDRiY2RjY2U5NTBhYjg5YWFjYWE2NWMzYzAyNmJjMTYwHENvbnRlbnQtRGlnZXN0gAE5MTBkYjRjN2YyMDY5MTU3ZTQ4OGM3MmU3NjUwMjRkNDRiY2RjY2U5NTBhYjg5YWFjYWE2NWMzYzAyNmJjMTYwHENvbnRlbnQtQXV0aG9yGGh3eWx2c29yNTV3cA5DaGFpbklkBDU2DFNvdXJjZQhhdGVtAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweDBhYTJjMmRhOGJkNWYzZGQ2NzBmMzhjMzAyYTU1NTYxY2JmMzNmZDJcIixcInRzXCI6MTY5MTQ2MDYyMDAzOCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiaHd5bHZzb3I1NXdwXCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6IjkxMGRiNGM3ZjIwNjkxNTdlNDg4YzcyZTc2NTAyNGQ0NGJjZGNjZTk1MGFiODlhYWNhYTY1YzNjMDI2YmMxNjAiLCJzaWduYXR1cmUiOiIweDUxNjVhMzUyODVjN2Q5Yzg4NmM4ZWJlOWI3MmU2ZmE0ZTYwZWI2ZmY4YzMzMGQ1MGM2MTM0M2I1NzFmODBlOTIwM2I2ZGI5MWVjYmRiNjIwMjY3MWVlNWM2ZDE2OWM3NzA2OTk3YzJhNzJjZmM3M2Y3YjA3OWJkMjVlYmJmYmI4Iiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVacVQvREMzdGRPMXRZeXdIb0pDMG9ibHRkSXl0djJKd1pwQXZEZnAvMnRtUVZrOVBhOEp0a2FSZTFEeHVWc2RjbXE0SlhwYmYvSHdDRFRJNW5zNmV1QT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHgwYWEyYzJkYThiZDVmM2RkNjcwZjM4YzMwMmE1NTU2MWNiZjMzZmQyIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4Yzc3YThjMWJlZTM0OTZiMjBjNDFhYTlkNTUwMWQ5MDg4M2Y1YWViYTNjMTc4NTk2ZWZmNTY1NzA0MDVhOTMwYTcwZjgyZWFmNDBkYjI4YTA2MjkwMTU2NTViN2M2MWI4NjBhZTdhMDMwNzU4NGZiZDVkMmQ4ZjgxM2UzYWVmYmUxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWnFUL0RDM3RkTzF0WXl3SG9KQzBvYmx0ZEl5dHYySndacEF2RGZwLzJ0bVFWazlQYThKdGthUmUxRHh1VnNkY21xNEpYcGJmL0h3Q0RUSTVuczZldUE9PSJ9fQEAYdoiny8bNp2mBpuPgFI4dxe1xOytTztoYskYCv9ESAELdknF00jjtyM5OjtfFfPqey8FhWPzhIHXZ8_JK8lp79mKN2lXnj6McJ5X4OrBWNLL4Aq3orvvqwSr_-8VCFoEKPT2_bY8bSSzFeOa1CE9wRitJJXqunGp0GZkdoklwfWU0APTjbBm2vFVP7W5_wIq_dflFzRkZm4oXsgyNgYucelDzi5fWplUzlqWO9jtK0ymBuCqrUg827uwB8Ytnp41PObmIKNP-RRyj3mDonSdTVRLVFFApImGQb2TRl0wxKLc1aAf-krgVv5o6Aa_1IoUdKet4O8kpJCElq1zGoIDHBpo7QHL8BCl_VNMf9C-3edmdtK6SpNdfwUZTtk2q3x5fvmjNfeGtu-QqJtsoORy3J6Y2qKD8kbBFbX-_OdYkDUrUs_T6xTFcEe71q2YpLz4LaE-HtcdYuaXdyLqSuee2-fmPd_F7NGs5ERe86G7Cke11o7_lYyDoZwKJEh3yxJbWWdaA-m_tcV5-S3z27XHhp878SfovxX7xuYiMCMK72L8yHmsBxa328xLwk_PiDD11AIB4bls_TzaNnZIhfTgwYRy21qw_cREJ-ox5m3Z2_WIcTNP5S9Yx5wP7VKJ71_cFWxgdNf3JTm140JXh9V62sesPmt3Dg4jd7FPiwBbxRWc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABMWQ0ODcxMWEwZTEwZjg5MTQ1YmRiZjI1NWM1NjY5NDdkY2M5OWY5YjU0NDU4ZDM5NmY1MTEyN2MwOWQ1M2ZhYhxDb250ZW50LURpZ2VzdIABMWQ0ODcxMWEwZTEwZjg5MTQ1YmRiZjI1NWM1NjY5NDdkY2M5OWY5YjU0NDU4ZDM5NmY1MTEyN2MwOWQ1M2ZhYhxDb250ZW50LUF1dGhvchhxMTkzNTY3MjM0NHoOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg2Y2YxNjc2YTQ3ZWI2MDk2ODhkZDVjMzZhYzg4ZGYxM2EyYWUwNDQ2XCIsXCJ0c1wiOjE2OTE0NjA2MjEyOTUsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcInExOTM1NjcyMzQ0elwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiIxZDQ4NzExYTBlMTBmODkxNDViZGJmMjU1YzU2Njk0N2RjYzk5ZjliNTQ0NThkMzk2ZjUxMTI3YzA5ZDUzZmFiIiwic2lnbmF0dXJlIjoiMHg3ZjgyZTcyNTJjYzgwOWE3MTQ5ZWU5Y2QzZTY0ZDZmMTBhMjQxZGI4NzVjYzRhMjUzNDRiMzA5MzlhZmI3NmI5N2FmZWMxN2I3NThmYjJkMWJhYzhhNTgxNDQ3OTVhYzM3M2E0MWZiYjA4N2Q0YWQ5Y2E3NTc3MmM0ZjQzYzY1MyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWTJzY1VoTUp6Z29mOWZ0TW03NXFIVDJnK0t1cStVRVMyOWl3RW9KblpOWGllNS8zUmt3NWg1OVpFZ2tUU29yUVRlRzNpd2k2QlEwU0wvYzNjbXZQdEE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NmNmMTY3NmE0N2ViNjA5Njg4ZGQ1YzM2YWM4OGRmMTNhMmFlMDQ0NiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGM4ZTU1ZmE4ODQzZDMzOTJhMzRiNzMwYTA3MjcyZTVhZTQ0YzhlMTUwNjc5ZGZlMDZjMDIwYzQ3ZTFhMDIzNWI3NjlmYzFiYmQ4NTJmNzAyNDIyYWZiZjk0NTllZjRkOWVlZDRjODMzNWI0ZmIxY2Y1ZDNlZDQzY2IyOGEwODIyMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVkyc2NVaE1KemdvZjlmdE1tNzVxSFQyZytLdXErVUVTMjlpd0VvSm5aTlhpZTUvM1JrdzVoNTlaRWdrVFNvclFUZUczaXdpNkJRMFNML2MzY212UHRBPT0ifX0BAIoyS3XQ3X_zYHbIdzVPV9sRp9C1h0Lr-VGjuzTM5G1XjgDUK9WYd_drz9IuqlufuV8cSQJZKyIVcfNi7wfkDD0mU8RiNiyZLNedXYsHMV6812n97lX6gBGY9eSIcaL7vRdpepd9GfUVndo82vb20Ygl1p_R9o3zJDM2s6WPgWugCWF_yPf2W216s_Wi2GdnhQTSjLVblJOeWL8okKE_BXH0qfJrgBCn4KtxBi_9pX7KKYiiuooPFE4qgb5sN2iVy8f3dDz418doxdumibpn4bImnhYs_xFmSEEoWDHrtk19BWEhpDmdAp48KqTEkWv9FiFvGjGFWB-vKTRkWPR18nv3BgpCDnl34cZo-nubHnVqd5MqFg6e8grO7ve2ChBqZU1s0i3kPn3cAkOXRFAFT9CDZRGOpcpsgqiX5yVaAjwT2-5H3w0VfAhtt6T_8QM3BYN3PQ2VbAFm8yuuYjxeug0n6zQNdgxQJB0cybbUeZdm24j5mYTkdmryKSGseaoAmwDH81G-h557ZeODvddnH_0PEsWi4oWsgQpLOerW1STnWN0VQTDxXhsYZSpPOsOOZAPS9gdmsRPuayjnMosZ9s3i6lcBnNQ9B8UGuF6lYY3yk1zbwD1Hb0dsmH5DCatSnXD-PJ2ZVgclyJgTVpt-QVBpVN1gv3PNR2A54LbGuuInnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAAWFiZjI4YzQyYjg1ZTA2OTE3NTAzNGE3MmZhNmFkMzQ2NDhjYWJhNTA3ZjY2OGEyOGM1YmEwZGE5YzQzYzc4MjkcQ29udGVudC1EaWdlc3SAAWFiZjI4YzQyYjg1ZTA2OTE3NTAzNGE3MmZhNmFkMzQ2NDhjYWJhNTA3ZjY2OGEyOGM1YmEwZGE5YzQzYzc4MjkcQ29udGVudC1BdXRob3IYMWV3OHZxaDVvcDU4DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNwB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg0NzY1NjBjYTIzM2Q1NGEwYzdiZDI4ZTIwMmNhNThmZDFiZWYyY2ZhXCIsXCJ0c1wiOjE2OTE0NjA2MjAwNjIsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjFldzh2cWg1b3A1OFwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiYWJmMjhjNDJiODVlMDY5MTc1MDM0YTcyZmE2YWQzNDY0OGNhYmE1MDdmNjY4YTI4YzViYTBkYTljNDNjNzgyOSIsInNpZ25hdHVyZSI6IjB4YTI4MjIyZTkyY2IzNTQ3YjAyNjUwY2RiZmI3NGYyYjIyZWVkYTRhODY1YTY5MzgwZWNmMDk5MDM4M2FkYWUyNDQyODllNzJhNzA4OTM5MzEwZjdjZDg4YWIwYjhlMzk1NDg1ZDIyZWI3MTFkYjFkOTU1OWRlODBkMzA5MDNjY2QiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWJ3cUkzbExUWHVRMFJBWXB5NUkzeURzUUFETlFKTXMxTXluTVBuVE9SQm9OUVptWkQvQWdwUDRZOXhGUDdHaXVNSzVOUVRiR1ZMdEYrMDVnT2t2L2R3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDQ3NjU2MGNhMjMzZDU0YTBjN2JkMjhlMjAyY2E1OGZkMWJlZjJjZmEiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg1ZDRjYjAyMzIxYjQzN2UwMWZkNTQwZTkwNmNkODFkN2MxMzg0M2M3YTYxYjQ5ODE1MTE2ODEwMDMwOTY4YTk0NWFjZTlmNGU2Njc1OWUzNDI2NWYxNGJlN2QyZWRiZDZhNjM1YTdhMDMzNmVhMjU0MTgxN2JlOTMwNDY0OTRkOTFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWJ3cUkzbExUWHVRMFJBWXB5NUkzeURzUUFETlFKTXMxTXluTVBuVE9SQm9OUVptWkQvQWdwUDRZOXhGUDdHaXVNSzVOUVRiR1ZMdEYrMDVnT2t2L2R3PT0ifX0BAAKu4nPohUvcoowMHUi45LioARdvgBiVGQvfxKNYFHxaGqi4CxUkmcGVvsgCNjKHVmaIR4X0695utyvzv0DgeHmwHRHTvutW-i0QKIHmtjSX0jxpbkzzviTrzQDGE5Ps-J_8JchuKMKlcnHlnpXMbwIRWayjiBSu4P60qJ1ceXmB7oFyM-2YdctSzAlojTbabzteRZlMu-A2LBwADFAl2T2KJYt8zwYMaVwgwb3tlJAp9_cDjfT499abpYIdur-D_cKX0fET_HV-10cc4ooqzCK0_VByvj2N-K0_5yS_xj8YigSekVYXzo-nMm1xmH3NIfR-O2NjQsjREkWftMDdsgXiFNokCCIqxItvPeAluLeWZoWobVxzcCP0Gsx93UrfXw4vDeS0C1ygqPwkKwp8GKI4Tf2pv7uo8wyDMLHQvIeGhurCwIYsGGMKI72FNCWvMSuzNiyC-W-ujsHMESqkMQAhF02Ps_5ChVU1hnJLUYFN2uStC51qXaY1WdFHM-bO__DHz61mXeAYA3QKv94tZm3PGWEaB7TcLT8jm9gxqxZG06OCaCTne_qfcR4yyB4ExQxvxYzmw22R7OZBXSdyVSj-qNBsURfUA1PeeSfRrxMJxmoN8cXoShgn_02ApfnP0EqOgSw9iezq2RpRsdA6AOPPVsXKS4LHHYMAfOXkyYR9nPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAADAEAAAAAAAANkAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DFNvdXJjZQhhdGVtFENvbnRlbnQtSWSAATc0MDJhZDdhMWMyNmE4YjQzMjcxNmNkYTk5ZDNmM2U2Mzk2MDNkODdkNjk1NThlNWQ5NmQwY2I5YTM1ZTdlNDkcQ29udGVudC1EaWdlc3SAATc0MDJhZDdhMWMyNmE4YjQzMjcxNmNkYTk5ZDNmM2U2Mzk2MDNkODdkNjk1NThlNWQ5NmQwY2I5YTM1ZTdlNDkcQ29udGVudC1BdXRob3IYdzBkZ2VjZ2t0a3FoDkNoYWluSWQENTYAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4ZDM3ODVmY2E0OTc1ZDU3M2M3MjU3YTliMmQ2NTMxOTI5MjhhMjZjYlwiLFwidHNcIjoxNjkxNDYwNjIwNzc1LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJ3MGRnZWNna3RrcWhcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiNzQwMmFkN2ExYzI2YThiNDMyNzE2Y2RhOTlkM2YzZTYzOTYwM2Q4N2Q2OTU1OGU1ZDk2ZDBjYjlhMzVlN2U0OSIsInNpZ25hdHVyZSI6IjB4MmJiOGU0NDc5MDY2MWRkYWZkMTdkMWM1ZTNiM2U3MmU1MjgzYTk1OWNlMGVmNDY1MjQ1MmMwMDAzNmZlODU1MDY0MDJmMzMzNzhkNjI5NThhMmQ2OTZiNTI0YjIwMWJiYmUyN2Q2YzlmMWRhMmIzMGM4Zjc2OWZkYjFjYzg5OGIiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXY0L3lYOVRLbEpVSlcwWXJLT2pUUzBrNGNVTEZDZWF0M1l0Y3AzNUl1cW1rb01sV0lzMTUyeVNicFFZZzBZb3lnOGxLdHdOL3U4MU1henZBeG1sM2dRPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGQzNzg1ZmNhNDk3NWQ1NzNjNzI1N2E5YjJkNjUzMTkyOTI4YTI2Y2IiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg0MDA4YTM3NzJkZjQ1ZTdjZjI0OWZiNWEyY2E5NjlmMWE1YmM2MDJlNGQxYTM2ZDI2MzZmMGM3OTJjODg0OTU2NzU1MDU1MWJlYmFjMDM2NGI1Y2FiMjBjOWEzNWQ1YmRlMWZhODRjYTViOThlMjBjOWUxNjZjODNmM2RiOWYwZjFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV2NC95WDlUS2xKVUpXMFlyS09qVFMwazRjVUxGQ2VhdDNZdGNwMzVJdXFta29NbFdJczE1MnlTYnBRWWcwWW95ZzhsS3R3Ti91ODFNYXp2QXhtbDNnUT09In19AQB8DaCbETQYlL4njto1gWedEMabsyaFvm5Iv5LijWq0Of-mG8ULPZzqPAx9yl8cXXbO0wHENgTK1FY1rI_9BxulXHGQPfbzXghzTyV0DGfrukKugNMZhuyoQxmTtIorxnl-DANa09EahkeCpC8J4iUMu6x4neCMhpXHNxNLvACyR95-uQC0Bca5xFRv8KGBbOA2VF_QxZYP1F3AB-7q62DuF1rnv8hQDJJ8e9tN3dW4QDxZHuu8kAP4I4jENe5apGf4qzeB5NRIIzRP4odgq8Gshqszpk1j4g8Vnl-bGCI8-KmyS9B7i88k_nCQg4akq_2nR2YS7Edw5vnAVCatK8nsuIPCeRPGYsLs8jGRQaD_cYZrYYriUEPN69ICZp4rPteD6dTRMXbMF5bzVDNeKHqZhfpGNA-6i6_4VEkAA4b5bC25nKU2yibo9aINbdcoDeNF3dP21jOd7bveknyGITAhxrpXUElAqSj8usVXw3WCGRUV73k8jOCE4EExHPdm50C0LyP8ALhzzNICoE3F0rCY7SAromVoJC2QpmIjV4lKBV69x5qjhmp-e6hheWvfJSUTqTp2Z4Zh9OUntYng3dpiEfh1KNuhWiP6C9zz8dgVh0434oadfGCZdGoKJbVUabGxA-JMdVR71m5vks7GTvykHZrr_Ix5vBbD9slQX4E2dpz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAABQBAAAAAAAADaAEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAFlODRlMDI5NmJjMzYzOWY4YjdjODA2NDI4MDk4OTMwODgzMGU1YjZmYmE2NWIxMzFlYmQ1OGRkM2Y0NmRjN2RkHENvbnRlbnQtRGlnZXN0gAFlODRlMDI5NmJjMzYzOWY4YjdjODA2NDI4MDk4OTMwODgzMGU1YjZmYmE2NWIxMzFlYmQ1OGRkM2Y0NmRjN2RkHENvbnRlbnQtQXV0aG9yHnNzcmxnZWt1YXdybnQ5NQ5DaGFpbklkBDU2DFNvdXJjZRJjeWJlcnR1bmUAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4MzNkZjFjYTdhZGQ5NWM4OWJiOTNjNTRjMWJiNGNmZDYyNGNmM2ZlZlwiLFwidHNcIjoxNjkxNDYwNjIxODU0LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJzc3JsZ2VrdWF3cm50OTVcIixcInRpdGxlXCI6XCJUaGUgSW1wb3J0YW5jZSBvZiBQaGlsb3NvcGh5XCIsXCJib2R5XCI6XCJEZXNpcmFibGUgSXQgbG9va3MgbGlrZSB5b3UndmUgcHV0IGEgbG90IG9mIHdvcmsgaW50byB0aGlzLlwifSIsImRpZ2VzdCI6ImU4NGUwMjk2YmMzNjM5ZjhiN2M4MDY0MjgwOTg5MzA4ODMwZTViNmZiYTY1YjEzMWViZDU4ZGQzZjQ2ZGM3ZGQiLCJzaWduYXR1cmUiOiIweGZiZmRmM2Y5YmEzODUzNDMxNTdhM2JlYjVjNzNhZmFjMzgwYWIyZmQ1NjcyYTBhOGNiMDUxOTI0NjgyMmVlYWJiZjgzODcxZDIzZjFlYjNiNTNmZDRjZTJhZDNlZjc5YmNlZmE2MGVlOWZhZjM2NmRlZTdiOWIyNTRjOWNkYjNhIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVPNmFVeGlMQjdGME1EWngyb3cwWlZ1MUc1aEpaS1c1aW1JUXJZWitrUlBaZU5YUWpZNVowaTJrK1FVTGp1Q3l6bFArZHAwZytvTitCaU0vamtCSWxLdz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHgzM2RmMWNhN2FkZDk1Yzg5YmI5M2M1NGMxYmI0Y2ZkNjI0Y2YzZmVmIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4MGJhZmQ4NTczOTJiMTBlZDhjOWQxMzY2MzFmMWVhMjE1NTA0MjE1NGVkYWViY2MzOWFjNjZjNjhmZTY3MDgxYzU5N2M1ZDEwYTYwMWU2Y2Y1NWFkNmVhZDM5YWViZGI3ODliYzg2NGEyMGFlMGQzOGQ4OWQ0MDhkMGUyZDYwYjgxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgSSBhdXRob3JpemUgQ3liZXJUdW5lLnh5eiBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFTzZhVXhpTEI3RjBNRFp4Mm93MFpWdTFHNWhKWktXNWltSVFyWVora1JQWmVOWFFqWTVaMGkyaytRVUxqdUN5emxQK2RwMGcrb04rQmlNL2prQklsS3c9PSJ9fQEAY3XRz37xo66Wxb-PbuVK_IohtrxvPd1pTx1FCqKYT4h0peZk6Nrm4VCPjAsw5ahY7S0ffGflnDo4CX6ZxTL-CvClHwFpLmcFjnOF18YaANv2xOIS6FPJph745ck4RjxO2pSyTCKQEKsAJhueSOWo-anFPoFNDuOBYhrgWEeJRsRmpV3XbeWLnLT7En44e42jyf9eG1tJ_zNTrBlyk67dLgkaCvzA0sab6Q2WjI4GOuHBT8kMACEfisFK_qp18YA02IG9SKFr47vCA0kbF_IhgYJxRcnIR7t1cJz0ybJZ7aXwvWsKuBaG-hM0pCIIRy7nyY7RxxITyeE8M8uh3nPXoej2-M3iXSJAh3OMUYEdjgCn_zJQhqzNcS2MdWeOkehqPrmDJJddssm5aUUE1WqkX5U1WNajNXkAmiDjQHy0TMr6Tcv2TRzm9Kj8nn89tdMYdOM8QCwi71jTMMnSeuT-C40Z_fEkZ8tDdLTAMf-Aq6aCNrlSQ6PCDH5ekw5an7HPrHen_bLUBi22VydQeaGDGTM0-0CTxRWa4FpWhO9frB6iSk2mLOdRCVm0wUijTlH_mK5HQsJZhoMG9Q72vRAN_FpKBkZfQuvjmU9v7BCoHpe7KcNHdS_sk_DLT03O_qqMZxFz0HB1iW0kXt8IXpCBdkzxh3UNYLC-rNPMjpwZIyWc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbRRDb250ZW50LUlkgAE1ZTI3YzAwNTdlMjljODlmYzI3YWZlOGRiZDZmYTdjYWY4NTU4ODIxM2QzMGYwZDUwZTEzNTc2ODM5Yjk3NzAzHENvbnRlbnQtRGlnZXN0gAE1ZTI3YzAwNTdlMjljODlmYzI3YWZlOGRiZDZmYTdjYWY4NTU4ODIxM2QzMGYwZDUwZTEzNTc2ODM5Yjk3NzAzHENvbnRlbnQtQXV0aG9yGG1hd212czFyaXdscQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg2MTMwODEyMjVhMTRiNDhmMzFhZmZiMzczYWEwNGEwZWQ5OWMwMTQ3XCIsXCJ0c1wiOjE2OTE0NjA2MjE2NzUsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIm1hd212czFyaXdscVwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiI1ZTI3YzAwNTdlMjljODlmYzI3YWZlOGRiZDZmYTdjYWY4NTU4ODIxM2QzMGYwZDUwZTEzNTc2ODM5Yjk3NzAzIiwic2lnbmF0dXJlIjoiMHhiMGQ4YTgwMDY3ODM4MTViYzM5N2ViMzJlZDdiZjQxYWJhNDIwNTE1ZmMxZjRjYTUxMzU4ZmI2NjlhZGYyZTEwZTY0ZmZlZDBkMmUzNTViN2UyYTRkODgyZGYzYzc4ODQ2MDlhYTVmYWQwMzU0NWU4YWJhOWVmYWQ2Nzg1ZDBkOSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFZFNaOHNvdmRuQWcvWmJkeVkySlZEK1IwYXg0OXdZSWc3Rk5mZ2FaNElRdlR4b01QT0lEWjVpRG1LTVd2TjFiazQyU3k5Sm53d0VUUTBGYjJqQyt3V2c9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NjEzMDgxMjI1YTE0YjQ4ZjMxYWZmYjM3M2FhMDRhMGVkOTljMDE0NyIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDUxNDkwMTFlYzcyMTRlNzYzZWE3Njg2ZmNjMWZiZjgyZjkyN2Q5MGNiNzU0MzgwMWRlZjNiOGZlNDk2NjY5NGUxYzM2OGQxOTI1YWZlYzZiZTAxMTI2YTM3YmIzNTRjYzA2MzM2ZDFiNzZjN2M4MWZiYmE3YTFkYzQ2YTVlMjQ2MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWRTWjhzb3ZkbkFnL1piZHlZMkpWRCtSMGF4NDl3WUlnN0ZOZmdhWjRJUXZUeG9NUE9JRFo1aURtS01Xdk4xYms0MlN5OUpud3dFVFEwRmIyakMrd1dnPT0ifX0BAD82HT2KAijAa1SfS8oPyOhKNYoW_tE5nHWu4jn_6PvCDfq3P21k5ol34rA3b7sYDy35r1Z8jhzmYJiZiMMKtjr9hXwZAIc0miD7Kq92xXmGCsi7sdmkYiWANyeKE81wjicaeH0BPVh6nDaKZg_Kz7Z7dO-sTjMLu2o3BETxIN7G_mY1AqVu8WbQJAWMI1Xl4jLofUtnD9RcYQc4v1oBqD00r6fiIeYRjdopY6ayG0GCruccywkkmr7xh5wf-ofKHwMliP2R7FveohG63QdkENwBvzCEMocx6R5Hinu2G_d01Gw49ZjY9_nKnC2dFveW8ugaTqlwoTNg6mNXlYHamOXlyDVa8TJ6RCEkpRME8RFJWam4S215VPym-g4Yfe8nDWTvfLI2CNqv4aPKj6r23seWdQCfVU7_owBX1SutzT17ZdTG5SiinJwdga6TQ27ZX6fOcG8bdgUmPMoetxtOtUcFn4JDzYGPLcYUt8A_H4XblnpMaAS-5ULmrxNFs1MdbNL3snZsluk92JyD44dvqbMl-_NexgjHkwfN4uOKcuYWlMR5HAe4R_UK3wVBpT6G8JgZdyl50JKPQtcrJp8zPW4VXtrd-zJSBpdd9z3WkY1bAfypxTbe8Q0ydyA9WuoYBL0bR4Xwbwa_jYXixdLABfHAkNsmQHF4vnbbnHx7lVyPnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAAGAEAAAAAAAANqAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtQXV0aG9yJnF1aWRlbXhvZG9sb3JfY3liZXIOQ2hhaW5JZAQ1NgxTb3VyY2USY3liZXJ0dW5lFENvbnRlbnQtSWSAAWE2N2E5MmQ4YTA1ZGJkZTcwMWU3NjlkMDc1MGI3OWY5OGIyNjkxYjBhMjc0ZDlmOGM4NTQyNWJjYjA2ZTEzMWYcQ29udGVudC1EaWdlc3SAAWE2N2E5MmQ4YTA1ZGJkZTcwMWU3NjlkMDc1MGI3OWY5OGIyNjkxYjBhMjc0ZDlmOGM4NTQyNWJjYjA2ZTEzMWYAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4NjVlY2VmMWM2ZDEzM2E1YjUwOTAxYjZlMDgyMTZiNjlhNWM4YTFlMVwiLFwidHNcIjoxNjkxNDYwNjIxMDc4LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJxdWlkZW14b2RvbG9yX2N5YmVyXCIsXCJ0aXRsZVwiOlwiVGhlIFNlY3JldHMgb2YgdGhlIE1lcm1haWQncyBMYWdvb25cIixcImJvZHlcIjpcIlRoYXQncyBjb21pbmcgYWxvbmcgbmljZWx5LiBZb3UgcmVhbGx5IHNjb3JlZCBoZXJlLlwifSIsImRpZ2VzdCI6ImE2N2E5MmQ4YTA1ZGJkZTcwMWU3NjlkMDc1MGI3OWY5OGIyNjkxYjBhMjc0ZDlmOGM4NTQyNWJjYjA2ZTEzMWYiLCJzaWduYXR1cmUiOiIweDM2YmQ5YWNjNjY3ZTQ5NDhkY2FiZWNlNGEzNDUzMTc0N2YzZjNhZDM1Y2Q0MzU4NGVmY2M5NDJiMDcxODdhYjIyYjc4YjM3ZTliZTk3YjQ3NzkxMzUyOTRiYmI0MmFmYjIzOWRmYTUzMWYxNjgxZDQyODM4ZWI4ODYyNTE0MmYyIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVja0hRUm5vZ2p3L3VhbjM4eDBRQTNDdk1vMXM0aSt5ZTJjNHpPR1BNSDQxSTUwWVZMREZkblo0TUxOVURGZjVSSThLVllGK3czbGVBVFZpdldWLzlpZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHg2NWVjZWYxYzZkMTMzYTViNTA5MDFiNmUwODIxNmI2OWE1YzhhMWUxIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4OTI3NDY3MzVmNTI0YjBhZTZjOTY2MWZhYjVjMDI1MWQ1NzA1Zjg2NWNkYTY4YmJiZGQ3OTI3ZTE4NmQ0NTkxYzU3ZGEzM2MzNjM0MWMzYzM2NTM4N2Y0M2EwZjNiM2FmMzkyM2QwY2E3NTNlYzg2NjZkNjIyZjRhNzUwOGMyOTQxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgSSBhdXRob3JpemUgQ3liZXJUdW5lLnh5eiBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFY2tIUVJub2dqdy91YW4zOHgwUUEzQ3ZNbzFzNGkreWUyYzR6T0dQTUg0MUk1MFlWTERGZG5aNE1MTlVERmY1Ukk4S1ZZRit3M2xlQVRWaXZXVi85aWc9PSJ9fQEAYspOfE7CcqKHz_UTVqmBeAtZqYuri0oTJsd6kD7Zo7cFvSYD_Q8CfFZnPF9evtirvvW3zU-RFsOG6ZAVEm7tJYvWSjKoI-0PuE8aR_qx892ZZUkuPPFcU9MND8PYbSuhneS6NiyRQpvlbZr879JRurJ1wvY6dU4lqjqOx-4n9OtLxmqiDAEwrZF3xhfvj65VEZThWvMuS6wwTAo8TCROkBacW6usK9n889hgkUVuZWCM-Hu3kuK0kbOC1CMwMTfTtYkV6lg2nHjU4P8ALYs39sHAtzMYO1B3ixgBR7jAOGYX4ZnM9z6bqUyyLWpGxnykPRSiLtqKFu20miu_RC3voqWrZGgPg8-5eUISJH-PPqkwecHHvsr0aqGQsAFkxp1e7NpvUSnfJa23m2EyTE6OzOnF2Q9abXGVP4H7EBBYzCWXm8bdox0rYIzEClAzzDryBvA4paVQgvjGhUgJRue6KYNBC8p-R8ZHfMiem015V_HUpDlHadRe4PJjXvPlejzx9pzbBcgFPX7OssQ3bDqSViIfK8z81q8fDUIFqKxtwD9bshg-9YGnT1BxPjmBSAsS2CgDGRP7YbhHZkFUSaPBN57buli7x4eL85wSLkQKnvBrwm7gueYrMzsQLCaBl05eLwlLxpE-eMslsaaSfqUWzjzdEXTxYMx1yUs3q_ybAuGc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAANAQAAAAAAAA2SBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QMU291cmNlCGF0ZW0UQ29udGVudC1JZIABMWU5OTFlMzI5YWMxMmZkMTk3YTJhOThjNzU0MzI5M2UzMmQ5NGYxY2YyMzhhMzJjMzI5ZmI4MzZjZDdmZjJiZhxDb250ZW50LURpZ2VzdIABMWU5OTFlMzI5YWMxMmZkMTk3YTJhOThjNzU0MzI5M2UzMmQ5NGYxY2YyMzhhMzJjMzI5ZmI4MzZjZDdmZjJiZhxDb250ZW50LUF1dGhvchowMDY2MTA1NTk2NzMxDkNoYWluSWQENTYAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4MGYwMTIzMGYwNjVkYjljMzQ4ZDNmZTZjNThlODZkNGRlMjk1MDhlZlwiLFwidHNcIjoxNjkxNDYwNjIxOTg2LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCIwMDY2MTA1NTk2NzMxXCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6IjFlOTkxZTMyOWFjMTJmZDE5N2EyYTk4Yzc1NDMyOTNlMzJkOTRmMWNmMjM4YTMyYzMyOWZiODM2Y2Q3ZmYyYmYiLCJzaWduYXR1cmUiOiIweDc3YmJlNTc1OGZiYmU3N2E1NmUyYjIxYzdmMzRlMDUzZjZiYzBjNjk1ZDkxMmExMjU0OTI0MjNjNzdlMmM4OGE4NjA0NWY3MmMzM2YzNDMxZTFhMTIyMTBjOGU2ZDc5MDE0YjcwYzYxZTA5NDY3YTg3MDFiNjg5ZTdkNGQ5MWM4Iiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVnMGtPSjRIYW5OdENzZlhLOUFQVUdLUFhrdmg2NzJZMVhvb0krcEVRSDB2RXJLVTNrYlphcSt1bWc4bFJyZWVrNWo1bUg5ZkZKWkFmT3FLRk94c1Y2dz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHgwZjAxMjMwZjA2NWRiOWMzNDhkM2ZlNmM1OGU4NmQ0ZGUyOTUwOGVmIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4OWIxYWQ2Y2Q4OTEwYjBkZTZhOTkyZjMzYzE1ZGI3YjBkOTA5OTYwOWI1ODE5MzU4NWU0NzhjZWExZjYyYzQzMTYzYTg3Y2UwMTM3NTcyN2I5YzEyZmUwZGY4Mjg1Yzk0OTY4MGJjZTRmYmIyYjU1MWE0YzVmMDJjOTBiZjFkMTYxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFZzBrT0o0SGFuTnRDc2ZYSzlBUFVHS1BYa3ZoNjcyWTFYb29JK3BFUUgwdkVyS1Uza2JaYXErdW1nOGxScmVlazVqNW1IOWZGSlpBZk9xS0ZPeHNWNnc9PSJ9fQEAG9S9LRUuqzj37mmPTFH4_qvQxFWlsBkFwcvL4VTHwMCEzItEsR4BPVioxzam5z0un7rB_5RwS-Lzk_DHyqVF2WsEIRhhcGrV2TPFjOuFwEN71NP20cwXlwonZPmRUt6jhrqjZ3LiBGpZO-uUW-ZIo2foYIcdyaysiqTNm7jn08tPwWo1rkh7u4Lt3BmfMU-D7uLHW888akT-gXrx3l2Gj8M9HPmdhK8Nk164HBhl7CaiAqXxPK0b6KVCFT6kgBckDOl-WnOD3siP7GLYke5mZorowoooElbcq_e6vUIkrSYRexFylRpTqrRMWI4Si9mpZrF_6q3KxmTUY02bLZ0waP5OcYXomryv162FBkx_PDaNObtoNxZb065mroIfiSwTlYivbfLz1CW_4GX-c2EQ1VVSkOU7gVFlzr1dr1L2b7mnQNvfXx30FOzfcp_xNK99I4WI8MCSjc3D5sXEAjiwnTvJgyy39N2vPdnEiLpV_TTg4Z_9NRhSRxDsNYVK4fOXr3Z9-evTVsRzzheN5oct0I9nl_osEMy-kSujlVd5_x473KrhP80kw2Mjmd77gyggBhH8Rvu6BC9NjQz8mkxFKmITStblugQ8gTGZQwaeOzJV1QA3Pi-wcN24aXYBfxCoDmtzhImKiY2KlI-c2pNQh62sU74o7stOE_21Cl8KR36c-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1EaWdlc3SAATg2ZWZkZWMxNWMzNDQzZTQ5MTQyMGQ1YzE0ZjkxYWQ2ZGE1NTE0ZWYzOGNiYjMyMDgxOTJhMDViOGZiMmJiMzccQ29udGVudC1BdXRob3IYZjQwMTE2NTMxMjJ5DkNoYWluSWQENTYMU291cmNlCGF0ZW0UQ29udGVudC1JZIABODZlZmRlYzE1YzM0NDNlNDkxNDIwZDVjMTRmOTFhZDZkYTU1MTRlZjM4Y2JiMzIwODE5MmEwNWI4ZmIyYmIzNwB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg2ZGIyMjY1ZWNiYjRmNDYxNDNiNmEyNjZiNWUxNDZkMWUyOGM4MjAyXCIsXCJ0c1wiOjE2OTE0NjA2MjIxMDcsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImY0MDExNjUzMTIyeVwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiI4NmVmZGVjMTVjMzQ0M2U0OTE0MjBkNWMxNGY5MWFkNmRhNTUxNGVmMzhjYmIzMjA4MTkyYTA1YjhmYjJiYjM3Iiwic2lnbmF0dXJlIjoiMHhmYWY4OGRiODM0MTBhNjk0YzkyZjQ4NGFjMjgwMmJkMjA5MzQ0NjRjYzUyMmQxMmFhNDZkMDI1MmYxMjhiYjI0NzExOGJhNjg3ODk2ODY3NDhjMzFhODZkZDg3MDBjY2RlMDJhZDE4OTRhOTM5NjMxYTE1NzkwM2VmOGY4Y2JjMSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFSkU2dXlXYUZuZE5KK3FGZmhFVHBxMGNuWUZYTmJPaW01SlB1dGFsY3RLc2RJWEpmRk9QVFdPckF6NlU1ajNVbFdkQytucm9Ed1FTdFRkMWw5dC9OeGc9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NmRiMjI2NWVjYmI0ZjQ2MTQzYjZhMjY2YjVlMTQ2ZDFlMjhjODIwMiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDM3NTdiNjkwNjRkM2M0YWQ1MjZhNzc5YjQ5YTI5OTMwYjRmNDljN2E0MWI3YWI0ZTA3NzU2M2FmNTU5NGI3NDI3YTRmMDEwYjNmMjc2NjNhYWIyNTFlNTc4YjE4MTE3YzIzNzI5YjljODU5Mjc2ZjBiMDU2NzcwNDZkOTM4NTFlMWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUpFNnV5V2FGbmROSitxRmZoRVRwcTBjbllGWE5iT2ltNUpQdXRhbGN0S3NkSVhKZkZPUFRXT3JBejZVNWozVWxXZEMrbnJvRHdRU3RUZDFsOXQvTnhnPT0ifX0BADGpbIdM_2-30REI_Xk9lvYn7ACiaFkgX-nqBv67y_P3n_rhuIpNJztlgdtGCL3QMwoo4kFtWhbTqrKYQVePLItt99PznP32z7DwIdDt_fcpT9VxDjB_Eh3VXZrjyKgEA7nA8901NEI0P-_SWbZIX9s5plxyp-CYGzMiU3D84NGnSo19xZGqZfCVUN63y_VSFrx9tGfgUyaWibT-ywCb67CYxiHdY2b5wjBxt9kbCui_A8Qe_mbrfi_ioy5G7fARNVuHWRWGlL1hrJHgognuuq5kzCBF-N_KR50WMEM7aZIV4MXbESlmucYOz8rGS2OefU_N2ihPhBx05OrVWVqVorIeiL_a3B4dFr_KW5A1jew6Z2c6Wa4tGgYK4B3DixbwG2LfHaMNYxBbP0pF_J39yRkzBQNMYcwYmicWpCZ1mLq0NbCYk2yCZqj-UBLSPTELs5PZthAXClZSuM2YpjOCJzwQf51SKUm4Y0ziYfBmKbXZ7SdtQAMIhtCY3nnoQAxq0VybAGJOu7lIYEUYgE0niiw7pM3xv_YTMOFmOIiEMq2921o6hBvzf1Z_gcdFSlAUXIkusOUCyVEIQ2M1ezPeHCij3DFfWOV6wDdDkQJD4CHyhNNNRC4mr-5N3Dce-zjF5SIozklsVo0p_pbZxlO59vMY5WmMKecCHmeTvF-yW0TtnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAADAEAAAAAAAANkAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtQXV0aG9yGGRuNjNhN2RhN28zYg5DaGFpbklkBDU2DFNvdXJjZQhhdGVtFENvbnRlbnQtSWSAAWZhMGMzMGMwMDdlNGMzNzY3ZjI1M2Q4MDM3NWIzYjVkMWEwZTE0N2JkZDJmMTc4ZmQxNWRjYWE1ZmJjODVlMGEcQ29udGVudC1EaWdlc3SAAWZhMGMzMGMwMDdlNGMzNzY3ZjI1M2Q4MDM3NWIzYjVkMWEwZTE0N2JkZDJmMTc4ZmQxNWRjYWE1ZmJjODVlMGEAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4ZDVkOTExNzZkYjFiMjIyOThhMzM0YjljMzMyZmJhMmYzYzNkZjAyYlwiLFwidHNcIjoxNjkxNDYwNjIxMjg5LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJkbjYzYTdkYTdvM2JcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiZmEwYzMwYzAwN2U0YzM3NjdmMjUzZDgwMzc1YjNiNWQxYTBlMTQ3YmRkMmYxNzhmZDE1ZGNhYTVmYmM4NWUwYSIsInNpZ25hdHVyZSI6IjB4YzkxYWNmMzU0OTcxYTRkYTEzNjVlY2MzMThhMzIyOTUyMmUyOTI0YmJmZDA5NjRkZWE3OTRlOTdhODUxMzFkODA2NTc4OWYwZjE1Y2QzNzg2ZTIwODBjMGFkZDQyZDA0NjQ1YzM1MTY2YmYyY2UwMjUzZGIwNGYyZmY0ZjM5NDEiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUZxY2FaYW5vcDVnQU5yODRVVlU3ZTZueGRoaHQyNTdoa21qT0hvSE5IOWVvVmltdHRjTVl1VCtsNzJNZDVHNkhlT0ZsNkpmVEJ1bHdHakhSSjNZUklBPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGQ1ZDkxMTc2ZGIxYjIyMjk4YTMzNGI5YzMzMmZiYTJmM2MzZGYwMmIiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg3ZjViZmUyZTY4YjFlMTkzMDg4NzA3YjEzYzgwZjdiNTE5YjYwNTMxN2NhYzY0YWU1OGI5ODM0NjU4MzkyOTg0MGQ5ZTA2Y2UzZjFiOTQ2MzlhYjhiZWU2MDE0OTIxZjM1NGM5Zjg0NGM1MjBhNmM2M2ZkYTQ4YTZhYzRjODkyODFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVGcWNhWmFub3A1Z0FOcjg0VVZVN2U2bnhkaGh0MjU3aGttak9Ib0hOSDllb1ZpbXR0Y01ZdVQrbDcyTWQ1RzZIZU9GbDZKZlRCdWx3R2pIUkozWVJJQT09In19AQA04IhtCpwcsr9NDv3QPpwBsRv645gV4bt2UJA5kyTmJ3DxgllCk2wgGWGaNQ7iyaKVpDSnFH5f4PjGiamumA8Hdq32K5f3nW4NGmSHJEOtWMc-2szcTRHn7Txb4JWQ5TmjCximvjBTjbPdgUF0gds5ntd4tYG_kk86fiYkqbW1gxhdXvUSD3g3tKfWE5cVMBg-HG3eAJTMqz_KPGeL1CiLqGp28709FURVQWgGLcARrsN0mxU31O2SLg6izpdIRUE5MJvPxpPFVtUhJ3HwnNZOEanRV9jXrV6tYCONGouMhEwQAKycQDnDI416tH-SnMGXplG-iDr6POEIFXulmfygbuTzwO8MJVynRO0DviXAAbtx_tXjj84FyF74W_7fCuu0aM6N9CH9RriJ_UOlpRw8uFrqRddQs37611P-xwYViRQF5KQLjceZWqpdLqu48K7lH04GdJe-YkPvJQ3atqkqmwwVfe70mbh1GYOrFLdJIGk4zZNMCfeiAnJpApyW3V6xtgTVZ8tkP0b6dhsqbC--cWNwiGbt_wMIB--mkRwb-BAQDXOBQINYqxiJyCMwk_lGAlCKFwQ2QTH8JW468OB3bVZ9g2tbPqgxX4UJDrQW81L6QTrw99nb3tHmMoNkTePCK6gWdcXlAC1snhd75932gcsIe4bgKVXQfkubnGbjI5z4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAH0BAAAAAAAAD_IFGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBxDb250ZW50LUF1dGhvchh6dXVwbWtibmVwbnUOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3FENvbnRlbnQtSWSAAWMxMWMzYWExMmE2N2MyMjQzNDRiMjRjZDdkYTZkNzRmNDFjYjQ3MzIxNTBjMTM5ODg3NzNhNTU3YmEzNDUzOGEcQ29udGVudC1EaWdlc3SAAWMxMWMzYWExMmE2N2MyMjQzNDRiMjRjZDdkYTZkNzRmNDFjYjQ3MzIxNTBjMTM5ODg3NzNhNTU3YmEzNDUzOGEAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4MmQ3ZDhjOWYzMWE4OWQ5MjQ4ZjY2MjkzOTM2N2M4OTY1NzBmZTg0OFwiLFwidHNcIjoxNjkxNDYwNjIxODMwLFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJ6dXVwbWtibmVwbnVcIixcInRhcmdldFwiOlwiMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZVwiLFwidGl0bGVcIjpcIkZsYXBweU1vb25iaXJkXCIsXCJib2R5XCI6XCJTbyBmdW4gdG8gcGxheSBpbiBteSBzcGFyZSB0aW1lLlwifSIsImRpZ2VzdCI6ImMxMWMzYWExMmE2N2MyMjQzNDRiMjRjZDdkYTZkNzRmNDFjYjQ3MzIxNTBjMTM5ODg3NzNhNTU3YmEzNDUzOGEiLCJzaWduYXR1cmUiOiIweDBiNWVlYjc1YTFmZGY4N2MyOWMzOGY4YzM3OTlmYzFkMDk4YmY3NWVkMzU1M2E0NDYxOGJhNjFhNTE5NTU2MzFhYzExZTdjNjgxZWZiMTY0YmFhZjRkYWE0OTU0OTEzOGQyYTIyYmMxNTkzZmFkNmVmNjMyNWM2NzE0OTcwODFhIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpazhnRHRHZkdvdXdNbjhIOEZRNDhWSjliQVdnZWd2dmZrZWM1ckJFMFh3cjNJWTR0RGF4U0thUzRQVUpUeUUzYWFlZmVGTm4yVVhaOXBma1luU3cyZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHgyZDdkOGM5ZjMxYTg5ZDkyNDhmNjYyOTM5MzY3Yzg5NjU3MGZlODQ4Iiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4MzQ1MGNkZjdmNTIxZDA1ZDk0YTJjY2U1OTA5YTVlNTNjZjI3ZTlhMTBkZDdmNzIyOTcyMjkwZjJjNWY2ODU5ZTBhNmJiNDJlODM5YzBhNzMzNjYzODczNjE0NDUzZmRjNDNhZmVlMTRjZDliYzlkZDlhMTNmNmUxM2VhMTc2NzkxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpazhnRHRHZkdvdXdNbjhIOEZRNDhWSjliQVdnZWd2dmZrZWM1ckJFMFh3cjNJWTR0RGF4U0thUzRQVUpUeUUzYWFlZmVGTm4yVVhaOXBma1luU3cyZz09In19AQBvQmzrBVUPj7955BKIJLeBn2q_DF-fDqv-nVSWmMp5y1KVyPJWkZ07cbci9f4GHvb-YT1xZPCsNKaldhTTKdupKXVQHKqsc_yiaci-unCRqUSUplqp7dP1Vn8tHxtAXgAd1cKUBRndOguJVBZfyS8tHX7ABgybkxETH-hBL_i7he5UMwC8oiXt20WbChKdjyuMXz_EzAc6sFyTxQhDIfIBUYEXbagVk5Fg2JCGkU-dv4u5rO_VBCEMJaW89NIO66VUsgqgJWMDRG6cIEN7RKzP9thVH0Xo3AYPaa2TyaOD3j4d3oXIH7naTYx-uMLBpRsa_faoyFY4vzrzbWBJ4ARhPctQ_xZEe7H3lzHe4UgihrNDLaMN58s20_6UCV458GjhCtLDc0qguOzMuv5rdyJaynQuG6YyDgYdSqVIFL0TmqLytoEGodDbaxl-nBx9-1aXqkv6lVPN9JFWMNCWFtk-kV2JmnmERoFCXFoCBXCPvou5Z8MbUFX_zAyrRoTjfWipCSdDjb9glWsC5IDYDtltxEGT74CQXGjRZEjsTMqYrFi-DFPBc0pYjtfsaMuHiYYhvUqB94dmIi-umumcxxxBiwm0qVtbW2h18B4a_aP9qWPWAMjIS2UpuhLc4ZqZaesUdIxgMU7H8AM31ivqLjBn_uEKjIY7hJ4L6l5VM33Knpz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAAwBAAAAAAAADZAEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAExYmIxNDFmMTIxNTYxNjkxYTZkMjFlZGIxZmMxMDhkY2U2OTYwZjFiODQ4MTczZTIxZTU1MmI2ODVmYTA4NGRkHENvbnRlbnQtRGlnZXN0gAExYmIxNDFmMTIxNTYxNjkxYTZkMjFlZGIxZmMxMDhkY2U2OTYwZjFiODQ4MTczZTIxZTU1MmI2ODVmYTA4NGRkHENvbnRlbnQtQXV0aG9yGDkxaWRvcm54dmZnMw5DaGFpbklkBDU2DFNvdXJjZQhhdGVtAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweDZmNGE5Mjk5OWJhZDc0OWY5MWZlMzJhNjIyYjhlM2VmNDE2MzY3MDVcIixcInRzXCI6MTY5MTQ2MDYyMTE4MSxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiOTFpZG9ybnh2ZmczXCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6IjFiYjE0MWYxMjE1NjE2OTFhNmQyMWVkYjFmYzEwOGRjZTY5NjBmMWI4NDgxNzNlMjFlNTUyYjY4NWZhMDg0ZGQiLCJzaWduYXR1cmUiOiIweGYxOWEzOGVhNjdjNDkyNGIyMmNjNGI5NzZmNmM2N2YxNzkzOWU4OTJkZDZlMTg1NzhmNGQwMDNhMDgxYWEwMWY4MjE0ZmNiOTdmZDYyOGNmNGViY2RlYTY2ZDAwNzAxNjcwZTE1YjVjZWM3NzhlODg5MzcwMmQ0MTRiNTliNGMzIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVPSHRZYnQrSlEwUEJRTHN6UXR6Sy8yd1d6UVVLZU15K3Q1YjV0eDExZ2RaMmFYOWY5VmVGdTU3YThXT2prblo0V21lNWpLUnpvUEVsZkNPNXJYamVUZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHg2ZjRhOTI5OTliYWQ3NDlmOTFmZTMyYTYyMmI4ZTNlZjQxNjM2NzA1Iiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4MTZlMTk2ZDZjYTMzMTIzNjRlNmJmYWQ5ODE3YWJjN2QzNGNkZGZmZTExZTgyZTI4NWI2ZWIxYzY0Y2Q4ZmQ5ZDA5NjdjNmU5YTA5YWNjZTI1NjJmZWJkOTMzOTdlNjkwN2E2MTJjODhlOTlhNzhmOTVmMDJjNTMzYzhkOTVhMDYxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFT0h0WWJ0K0pRMFBCUUxzelF0eksvMndXelFVS2VNeSt0NWI1dHgxMWdkWjJhWDlmOVZlRnU1N2E4V09qa25aNFdtZTVqS1J6b1BFbGZDTzVyWGplVGc9PSJ9fQEAWmE1dz2m44BrQVKODIvQ3Dg0u7gN7UshnsvDcMoJYNzoO7f9Kijk28TcgpZNTpYxR1F64KE6UApvRfMJ4PAjhSuK-ajCq27yzRyx1BBiYMsy1Da9dOKjy9-n4t7Q5EjGaKp_ukfzsgT_BCWJVpy6PkitBIwbUza9ofdg3HyUDZExxGitFzBf1CpO98xOwp0PddglKMDFijzdPbaYVkg-lCKnSEVWKrPFbqNswusS6OkwPi8aFEy3nJM52445HWmB2jtCfnNaX4e_fD1v8ObXZaX8-iobqNrKVKWIwH_413M9vhc-HP1rguFYy9g9yU2mZA-bCAqYJCVXa705u8qkey-6ZvJTqhhGBW9SrE7ahvL6TEzTqVK_zrfDCWY4Y5WFFOM_TLo5ot-kzp2Cxx-ZRmrK-sW5Hi5RgJpZ0lHbkhPLbqtyX5DFM03Ri5JGmRs3LCGAc9tB2Npk3haOteqLhND_JYeFPgEuYbSxj3YuhtNrglIixSboWLK3Ch-XKxU_cyDrfn5s79_QdHtjyoz-TVW_0RAeqw2Ckcu_TY_iL-h5c_MVSMBgXuvZVPMe8BP395D7OzkjRdZ-IBWkmIvUaItvNf19iVxmxqayt6tDAO1oSEzj0WZKNWcQkDRHAVHWeLLhlmHTVA02SrJojTtnhREMJvkiYy8dHF51XHorFn-c-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAANAQAAAAAAAA2SBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABOWEzNTc5ZTA4MTZmNmNiOTczNGY5ODEzZWRlZTIyN2VmYzE0YmE5NTNkYWE0NDNjZTJhYjdlOTcwMmYxMjY3OBxDb250ZW50LURpZ2VzdIABOWEzNTc5ZTA4MTZmNmNiOTczNGY5ODEzZWRlZTIyN2VmYzE0YmE5NTNkYWE0NDNjZTJhYjdlOTcwMmYxMjY3OBxDb250ZW50LUF1dGhvchoxMTMyODYzMDEzOTYxDkNoYWluSWQENTYMU291cmNlCGF0ZW0AeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4NWFmMWRmMGNhMTA3OGI5MmJjYTA3NDg1NjEwNjE4YTcwYTI5NzRlMFwiLFwidHNcIjoxNjkxNDYwNjIyMzAzLFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCIxMTMyODYzMDEzOTYxXCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6IjlhMzU3OWUwODE2ZjZjYjk3MzRmOTgxM2VkZWUyMjdlZmMxNGJhOTUzZGFhNDQzY2UyYWI3ZTk3MDJmMTI2NzgiLCJzaWduYXR1cmUiOiIweGU4OTgwODIwYWQ4NzJhYWMwMmE0MGJmNjY2OWIxZWE0NjMzYmZiY2VlZGM5ZTFlZjlmN2QwZTIwMzZjZjVhNDUyNWVjZTY4Mjg1NDQ1ZWU4ODFiZGQxODQ0OGQyY2FhODRlZTAwMjA5Y2Y1ZjMwZjQ3MmViMTQyNmRhOWE1MWEwIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUU1bFZkZU90N1o1VVlQaXY3QkJwVVZtMXExS0pVZUd1aVZBOWpKZTRWTzBhYUUwV3dSNDhNRHlyWWxKUjJsTWpJT1A2V1JOdzR5Wlc0dHBvaFBqcnVCQT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHg1YWYxZGYwY2ExMDc4YjkyYmNhMDc0ODU2MTA2MThhNzBhMjk3NGUwIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4MGU2YzhiMWM3YThkYWNjY2Q5OTU1YzkyODg3MzlmM2JmZDRmNDJlZTBlMGExMGRlOTFhYjllZGNjMTQzMTg4NTNmZTQ3N2MxZGNiZWM2MDM2NTQwMmRlZjUwOTMyZGJjMmE4MWFmNDg0YWQ2NDJkNWFkODRkMGU0MjRmNDUyYmExYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFNWxWZGVPdDdaNVVZUGl2N0JCcFVWbTFxMUtKVWVHdWlWQTlqSmU0Vk8wYWFFMFd3UjQ4TUR5cllsSlIybE1qSU9QNldSTnc0eVpXNHRwb2hQanJ1QkE9PSJ9fQEAAreUb4_33w2BnhKS4WGiaAQTaki3RzwB_TKJ8hrPXD3GM6JbHTQtqEacgmaaYmA2HyU5TzpYF-K10WQLXoOUVFTNmr09cIlcJV4ztKaVf0rvbT6dGUgukCuEC_qmgoHAWdYukmgscsOgG3_D8_zRgeVoa-p6MA_E5L1bsS_08RqyxMM79LZtDpTWMIhB_YUOh_d6iXnf1odDgJIB7X9AK_irRdOQ-N-RcQ1ZNpQ9zoODWcdzOTdL_t502ckExEaZXAtPk0WqoD7P6ikF88THg9MJXnPOjSvS4XGBi9UHethJJ7uaAXVg6G9qY6yyhfBNZgUVPQF0OQ1JcSageG7HN3LsgEbNLsNbnw9eRtflhFtxn8T-5UXDh-TJyq4DQepDLCDF6NbhVSsWK6x8O_Jv9G0XUyaf70Cq5aIg5J-QFbLUPAq_q1akP_DSMloSDldrB6fd033bVEyxzXJBqEaGR-Du2Xchhd4tC9orlDFQ73YBgeKZZJ359VzB7gk_F8_dN-XiaquouJY1M0M9akUxS02JQKn3zbvK47X5HWXW53goSKxLIw62lVH_LKckez0cJWTqAcyzsW4T0YAp3yEzYV5qEEXnN0qfIbWy6Q5phaQmfsMCckMC1UR_uecislRkZPg04jZlGbvnrS0PmCKZreXNwVcB7BdGxWmqdd1WaDuc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1EaWdlc3SAAWRlZDc0ZTFkNjlmZDAyMjc5YWQzYjdiZGJhZGNiNDhlMWVkY2ExYWE2OGE4ZjBiOWM2ZTBhOGRhYzZhZGJlY2EcQ29udGVudC1BdXRob3IYNWkzYTU2c2Y2OTY0DkNoYWluSWQENTYMU291cmNlCGF0ZW0UQ29udGVudC1JZIABZGVkNzRlMWQ2OWZkMDIyNzlhZDNiN2JkYmFkY2I0OGUxZWRjYTFhYTY4YThmMGI5YzZlMGE4ZGFjNmFkYmVjYQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg2NzczNmIyOTBhYWViNWYzNTc2ZjlhMmRlYWM2MGE1ZTZmOGVkZTYwXCIsXCJ0c1wiOjE2OTE0NjA2MjEzMjUsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjVpM2E1NnNmNjk2NFwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiJkZWQ3NGUxZDY5ZmQwMjI3OWFkM2I3YmRiYWRjYjQ4ZTFlZGNhMWFhNjhhOGYwYjljNmUwYThkYWM2YWRiZWNhIiwic2lnbmF0dXJlIjoiMHgzYzFiMWVmNjVmYWFjYWU2MzczYWUzMzU4YzA0MTAyYTJmOTU3NTViM2VkOWI2MWFkMmVlNDUyNWVkMTc5YWJkYmZiOTJkMTE0ZWVhNmJlYzY2N2Q2OTdiMGYxNjc3ZThlZjBlZThmMTI2N2UxODBiMzA3YzUzNDE3YTM2YjBiMyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFRTVMdDdHSCtmOUFlVmlaSmZTZzM0U2NLREpmL0FQWGE1amtkZmxGU3l0VGRPeWJnVWRNUC9lcnEvZnlmTXBrL1BsTzBqTWtBVkFZTjhjazR6UWxweGc9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4Njc3MzZiMjkwYWFlYjVmMzU3NmY5YTJkZWFjNjBhNWU2ZjhlZGU2MCIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDdiNWIzMTM1ZjRkOWY1NWJiN2NjNzZkZGZjN2JjYThlZTk3MGYzZDUwNzRmMmFlNjBhZTBhZjcxNmE4NWNhZTU1MDllMzEzOTk3NTYxOTNjNjQ5NDI5ZGYzZjA1YTAzODNjZDY1ODA1MDk1MDcwZDkxM2Q2NDAxMTRjMTk2ZTg1MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUU1THQ3R0grZjlBZVZpWkpmU2czNFNjS0RKZi9BUFhhNWprZGZsRlN5dFRkT3liZ1VkTVAvZXJxL2Z5Zk1way9QbE8wak1rQVZBWU44Y2s0elFscHhnPT0ifX0BAJuDE8ohPRYf22tot4js92LN2wHw7-UmDeyHerzQbVrBKAGwqrvcLGwEEw1L_5p8FN39a3qt_J2pZ_4qCqA6vPZ7rHRqVlQXVvql3Gp2fPc5x0pDOPanzI8mtwMckII5Szfz18byyUwd9zNvhl7IY8_CEE34sBzKhGXw3j_Zz6T1QGa16ZLsgBMVMyETqxW1v_2gQjFRUzdKfLVUjHb9KE5mgnIXPBRqBe3mcZ37DuhoJpM2Spp2DeDVvdQc3LwfBap8tvfGuJY2X8bjNImUq4gYcMILU9-JRMvYlobuJJeDal7SnUhZHu_3u18P8CkmxMb7BrhEUs25g4IJsffZhPwLnh6UFo3Z1QkKvZsTC6eGqYi5WhAlLhNuezYpExHeyXFf1hz6Tu0VTw47BHarIcmzWvJLq_DXqRdYtM15L5Mf7I-sKOK1FRck5QYno_Is_j-lv09lsiSn8LOeN-vXJD-vgd-8DCRpDMVfrzLxnc677q2y_ghIZiJ0h6hAo6ALAeEU1hqF0tFd0vbz5YnnzShljhtHuf-NBgWW6_KmhPmUXv4gausxAfI5AeiqwKHgUK9NQgIzi1k252BjE88_q8NJeDetpAf7pOLgHPteMFQ2AtqsPpKb3WSV2UyqICTFxXmovpDMHSjWhCuPflFt4Ctlc-HBBMwnVZB3-l0t3k1lnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAgwEAAAAAAAAP_gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtRGlnZXN0gAE2YWZlNmVjY2MxOTQ3OWRlZmY5YzAyNDdhMDdhMzRhMmQwM2NiYWRlNWRmZWRkZmE0YjgxYTU3ZDZkYTg0NzU2HENvbnRlbnQtQXV0aG9yJGdvbGRpZWFtZXRoeXN0eGJweg5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABNmFmZTZlY2NjMTk0NzlkZWZmOWMwMjQ3YTA3YTM0YTJkMDNjYmFkZTVkZmVkZGZhNGI4MWE1N2Q2ZGE4NDc1NgB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg4NDY0MzE1YzliNjYwMDM2NGM4YWZlNjE0NTY0ZGJiOTBiMDdiM2VmXCIsXCJ0c1wiOjE2OTE0NjA2MjIwMTEsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImdvbGRpZWFtZXRoeXN0eGJwelwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIkFoYSBzbyBwcm91bmQgb2YgbXlzZWxmLiBJIGdvdCAxMDMgcG9pbnRzLlwifSIsImRpZ2VzdCI6IjZhZmU2ZWNjYzE5NDc5ZGVmZjljMDI0N2EwN2EzNGEyZDAzY2JhZGU1ZGZlZGRmYTRiODFhNTdkNmRhODQ3NTYiLCJzaWduYXR1cmUiOiIweDc5OTQwOGI1YTk1YjBjZTZhOWYxNWVmMjE2NDJmYmQxZjFjMjMxNzhhOGMzNjk5YzM0NmM0NzY4ZTE4YTBhY2RjNGNhZmEwOWZkMGQ4MTczNmY0MmY5ZGEwNGFhNTJjYWQzZDI0YzlmNjA1MzE2ZmEwNDBiMTZiMmE4ZGRhZGY2Iiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUwZEQ2Y0t0Q2Mrb2xYWDZRTVIwZEltNWtzcHkrVjFTME5wYUtQdEFvYWRSdWNiV1RDa2p4aUpJcTR1MWdyams1ODFQcnRsQldST1FYUk5oVnZzakJhQT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHg4NDY0MzE1YzliNjYwMDM2NGM4YWZlNjE0NTY0ZGJiOTBiMDdiM2VmIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4MTFkOWNhYTU4YWFhMGE3ZTI3NjZjMTE3ODNiZGFhZDdkYTY5MjMxNjMxY2E0MzI0YjRkNjEyMzc5OThhZjE2NjNlYmViZTU1MTA3ZThhYzg3MjUyNWQ0N2I3MzEzZGI5ZTA4NjNkYjgwODdkODA1ZjFkNWI2ZDA3ZTNjYzQxOWMxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUwZEQ2Y0t0Q2Mrb2xYWDZRTVIwZEltNWtzcHkrVjFTME5wYUtQdEFvYWRSdWNiV1RDa2p4aUpJcTR1MWdyams1ODFQcnRsQldST1FYUk5oVnZzakJhQT09In19AQBS_H_OqleNQKN_2ngp1IDmPY2_gqjJxfVqhxJW-hIkT1vQgb2IkLCgm8bY-7RhnMIbHA0AI65MrIt5keAEvEHwdtpT-daICN8jaHck4j-2QsXZC9TyzwewPBYbiCmazudbXkmF2sqeSqBnlFZ9SgWqxRohTscpgASMDzVXeQjAm7_tIV0ZXlI_bN7PmCG0ReH3BaooRC5fW2B-Aw8nThXwZzBwti6kT1epnPPYvJ5tNaJw0eOq41BbP5DOitGKg9702wzDcKOpuA39qEqEZ0d5mHwgT3L4fVnskCw1W4_VK-i7mVww6Gft5Au-_oz0xEO8urb_yEMaFiQBSlksVF6uAqux_dqLG4fL8g7S8CCvDNpuF4yTvPiCfjQ7VZzmuMkZ11Tt_xe8n_3ptvFubGHzeUdrZXmSbk8y_75xmuYZPn2XS6z6GyG1CqrOIolCStwzGyC8UJlOq_l-ERyeWB4aS4EDx6IEljJjlqugb4X76DtqhnWb52UEVzInKJHZayxOo_3UaGUfPOYQUPgsvRBJZfaS6A9ArO1kSYhVnVMMQGxriIpfmqOQ4-hkVphrJRMC5soqRJrGLCtk_RGPeMag1tiHMUr45-2hett3L61fUuxeycp6XcVgmOF8a47scfqlhlOTPlT99pqJ3T9W0g3BwCeWLkXPx-aRPXLiBwqyHJz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAAwBAAAAAAAADZAEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAFhZmZjNjNhZDQ4MjQxNDc2MThkODRlYzJlMTI1YTE4ZDAwN2JmNjQ4NWQ4ZjZjMGFlZDcyYTczM2U1MGYzMDE0HENvbnRlbnQtRGlnZXN0gAFhZmZjNjNhZDQ4MjQxNDc2MThkODRlYzJlMTI1YTE4ZDAwN2JmNjQ4NWQ4ZjZjMGFlZDcyYTczM2U1MGYzMDE0HENvbnRlbnQtQXV0aG9yGHcwODg4NTE2MDYzdA5DaGFpbklkBDU2DFNvdXJjZQhhdGVtAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweGM1ZWRkOWJiNjQ3ZmQ2NjI0OWZlZWEwNjYwZjUwZmUzOGIxOWUzYmVcIixcInRzXCI6MTY5MTQ2MDYyMjM5OSxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwidzA4ODg1MTYwNjN0XCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6ImFmZmM2M2FkNDgyNDE0NzYxOGQ4NGVjMmUxMjVhMThkMDA3YmY2NDg1ZDhmNmMwYWVkNzJhNzMzZTUwZjMwMTQiLCJzaWduYXR1cmUiOiIweDI1NTUxNTg3MjFjODQwNDBjNjA0N2Q1NjEzMTI2NjlmMDYxYzk3NjhiMzY0YWMxMjE2NzY0MDNlMDAyODY4M2IyYTlkYjJjOTJhZGNlNDYwMzc3NjU5YmMxMDg2ODg2ZDNkZjM3YWU5OTY4OTFlNjBhYjgwN2U2NGQyMjU0YzJmIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVDbkJqQXEzam9wd1NmMDVUNFdOaitiaE9aTnJFUVh3ZWF3S2xsYlZTcmhKZmtXL1NwbERob0FzSzZkMnl1aUo0dlA4QVBWc3FkcnM0QXRlYXhrUEdaZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhjNWVkZDliYjY0N2ZkNjYyNDlmZWVhMDY2MGY1MGZlMzhiMTllM2JlIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4MmY1MTFhMTcyYjMyMjE2OGQyZTFjNTA0MjhjNWEwODEzMmRkM2NlMjExMDIxNTllMGEwNWZkZjA1Y2JiM2ZjODQxZDVlMDdhNjg0ZDhhYTU3ZDM5NGYxY2U2ZWRlYTE1MzBhOTg3MWQ1YmRhMWQyNmIyNTliZDNkZDU2ZDU2NDgxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFQ25CakFxM2pvcHdTZjA1VDRXTmorYmhPWk5yRVFYd2Vhd0tsbGJWU3JoSmZrVy9TcGxEaG9Bc0s2ZDJ5dWlKNHZQOEFQVnNxZHJzNEF0ZWF4a1BHWmc9PSJ9fQEAfgBkiH5vPdZ0r65E2Oi7kDKq9LDY7sRJ0NNDQnKor7df0WPnjpRcpkzMJKOn9jiPLn46lD6Se4C2bgsxPvDtohUpZ0Aszwwog11vaJkW7cCggd3idbT9xCT3vBXDR_fRA1rWc7hE_TOxYnaldJhgxZrcP5zJdO2TN6LPBoOiSqN51RAzj1-5r_GhynU_GdYt2FB2aojvklQSqUJKFR8DjUR7XjrACtTmQLPhBtavmJRB04jPktskCuhEApwJXAidVmwtB36fHgeKfdqkD3jyxkS0s0ZHPtcoozn9K7wt3isYgN22QEg_KwOqTaBCMFHB_d3Q6xmK0Hj7ZE9YxF9ql0rrf5fyp_u6JO3Q4iG-9WBKxG2sa4L4Gf9ImrlQNEjb_W0eqbBAxPKVo0yj7yxXfepp2RPu2hbBJJ1AICuUoZcjOmqRLM4aSfOMn-3LnnmiTBAX95kZbIwdw-C3rha2jRXmt9EAM1TXy-jbAb0j3kvVAfNP_6lYxIpHqZYb1bI90X2763WmWmmWGTbRdt4nlwWsFX0F0owZE7_ppGANwsLqLWcw0_K5w0zIrTcPFCh6CcqHgeeLoPz9ERIO1-zex28kw5JNS_LQ844sS0UlWvb95-cxnfN2CZAR-xKp9M_9GXDStYwqNXhGs6HFos26-GFmx8N4ju0goid2QGjto8ic-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAWAQAAAAAAAA2kBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QOQ2hhaW5JZAQ1NgxTb3VyY2USY3liZXJ0dW5lFENvbnRlbnQtSWSAATU2ZWRiZGIzNjU4ZTE4Y2VkMjM1OGMxZTUyZWRiOGQ2M2Q0NTRmODJmMTAyZDEyYmFiYTllYWMwNGQwMjUxYjEcQ29udGVudC1EaWdlc3SAATU2ZWRiZGIzNjU4ZTE4Y2VkMjM1OGMxZTUyZWRiOGQ2M2Q0NTRmODJmMTAyZDEyYmFiYTllYWMwNGQwMjUxYjEcQ29udGVudC1BdXRob3Iic290eXlheXhmd3Vua2drNDYAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4NjI1YTExNzFmZGMyOGM4MzY4YWEzYzlmMWVhNGYwNTQ5YzVjNDhlMlwiLFwidHNcIjoxNjkxNDYwNjIyNTQ5LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJzb3R5eWF5eGZ3dW5rZ2s0NlwiLFwidGl0bGVcIjpcIlRoZSBTZWNyZXQgb2YgdGhlIEZvcmJpZGRlbiBUb21iXCIsXCJib2R5XCI6XCJzdXBcIn0iLCJkaWdlc3QiOiI1NmVkYmRiMzY1OGUxOGNlZDIzNThjMWU1MmVkYjhkNjNkNDU0ZjgyZjEwMmQxMmJhYmE5ZWFjMDRkMDI1MWIxIiwic2lnbmF0dXJlIjoiMHhhODY4MGY2NzUxMGZkMWE3ZGE3YmRjNDAyM2E2M2EyNmY1MTA2YjI4NzcyYTUwZDEyN2IzZDI2OWMxN2JjZWY1ZjMxYzU1NTBiMDk0YTdjOGU4M2FhMGM3NTEzOGRhYWNkNTcwMjNiYzE0MjJiMTkzNjA1NDE4MTk3YWVlZjcxYSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFYXRYKzE3NnJQN0hUZC9ncEx2Sk9tTmV4SHJXKys2TnoybXJFKy9oZW05Z3dmdDZWZU11N2pXY1FWMmpDVENaYkJTWDF4ZGxFNlYxVjdaY0ZwQ1hOTVE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NjI1YTExNzFmZGMyOGM4MzY4YWEzYzlmMWVhNGYwNTQ5YzVjNDhlMiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDBhNjk5OWIxMTY3OTBlZGE5YjIyNDQ2MzAxYmUwMDFmYWEzNmZmNzE1OGQ4ZDM4MTYxZmIxOGVlYzMxYTM4MTk0OTFmNWRlOTkyNzk0Yjg2Mjc2YjQ1NzE0ZDRmNDlhMDRjZjViZWIwMWY2NTE1OWJiNmUxYTQxYmRiZGVkNDY1MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEkgYXV0aG9yaXplIEN5YmVyVHVuZS54eXogZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWF0WCsxNzZyUDdIVGQvZ3BMdkpPbU5leEhyVysrNk56Mm1yRSsvaGVtOWd3ZnQ2VmVNdTdqV2NRVjJqQ1RDWmJCU1gxeGRsRTZWMVY3WmNGcENYTk1RPT0ifX0BADTtF4JW4WWZVrUqxmaofJDVsxjpw509k_eqB28Zp8v4VUAkOBZ6bsN4WDOKYKWUlE2h1HQbm_YuSncTNONSeKxmLAH-4ywoMgJcDemwb6iXL9PgXy_5NxUbN14geaqN2T5CWPo9Sim6mjO3NLwostccYjkvNKpfY-KfU7fLd8sFA9Y1WZKsohUMB-Exn-zYbMQYL5_A7ue34jVhHTzmXXbM2fa-2Aak0mgUpC-fNtTXf-5_vgmVOLPLgflm1yJgXj-XfzM4iWogpBhoX6l40fcmReMXCwmtGeHWEISETDAO5kDUav10EwGuMKZs6prVfRq7v1WSGXygbv1Yr7oFcAizfGqKcuniO1p5-kAm6NzeIFEFhDV4rUeMrZ5HXhoKdH9FdJ94eQvp2hiNDTVQ4mBvzfz70Zj_cYJ-s-dG9gYEis_PheHGxN9GY8BnL9824lELZTsVjHYdTjb2gQ6siV7rcIXBXp9V_jAMYLDD-lMBCPbmkkI3EK1wGCWf3cTtg5BbESQedxYW-GO3TyKnhYe-wN0crCLog_eDxW3CH_CMhqUnKLMMp7GKPz-IAiLJROYjHaPhIz-ceyb6BKr9PDTxVELYhGSevUn7ffna86MLhqlTvUm-lzaVmfZzlZY07-RiLICS1mPODIq1mCvTFXWEODpnbqzRm3ZqPyEYwA-cnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAADAEAAAAAAAANkAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAAWNkYmMzZmU2ZTNlODFjZmI0OGNmZmJlODNlYTQ4MGRkOTU3NzllMDEyNGYwMTBmNTEzODg3NTlkYThjZDk3ZDccQ29udGVudC1EaWdlc3SAAWNkYmMzZmU2ZTNlODFjZmI0OGNmZmJlODNlYTQ4MGRkOTU3NzllMDEyNGYwMTBmNTEzODg3NTlkYThjZDk3ZDccQ29udGVudC1BdXRob3IYbWg4bHZramwzYjU2DkNoYWluSWQENTYMU291cmNlCGF0ZW0AeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4MDBmYjdiY2Y0MWU5Yjc0NTBlNDFlMmIwMmQxNTNjNTA4MzNhYjkzOFwiLFwidHNcIjoxNjkxNDYwNjIxODAwLFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJtaDhsdmtqbDNiNTZcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiY2RiYzNmZTZlM2U4MWNmYjQ4Y2ZmYmU4M2VhNDgwZGQ5NTc3OWUwMTI0ZjAxMGY1MTM4ODc1OWRhOGNkOTdkNyIsInNpZ25hdHVyZSI6IjB4YWNmNTVkNzk5N2Q0MWVmYWI1ZTQ3MGJkYTZkOGExNjc2M2FjZDEwNmRlOWIyM2JhNmEzZTAwMTUxMTBiMTEzOWVmMDYzZDBlODEwNmYxZjMwNWViMDJlYjVlMGVmZDVmMTY0M2VhMDg5Mjg2MWU1M2IzMjZkYmEzM2QzMTA4NzciLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRU1vZExzTy85cHUraytOb1lCYS81bnZGQlF5c2JBV2NvVVVPWXZpNGJHMlo5S2I5SjQrZmgxUGZPWjZYNFVlWFBCZ2svYVl1Q0JKUzNNOFVBbDEvNy9RPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDAwZmI3YmNmNDFlOWI3NDUwZTQxZTJiMDJkMTUzYzUwODMzYWI5MzgiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg2MGE1MmI4YmY2YjRkYTYwY2JmNjA2ODcyYWZhNDMwZGNjNDgwZmE2ZjFhMmYxMjdhZDMyYTcxN2U4M2ExNzUxMjYwZDI4MTExNjRhNGUzYzdjZjFkMDBjMWQ3Y2ZiZGU3NzJkMjk5NWUyMjFhNjMwOGFjMjBmY2JjOTllZWYzMzFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVNb2RMc08vOXB1K2srTm9ZQmEvNW52RkJReXNiQVdjb1VVT1l2aTRiRzJaOUtiOUo0K2ZoMVBmT1o2WDRVZVhQQmdrL2FZdUNCSlMzTThVQWwxLzcvUT09In19AQAS019IaA08jnUGMaEWPqnIBInz8ezT5YHuP1DBkZM8J0Jv-O3zRAQffVzHViIwVwgtofT3B1GRI_8rkdQ_NZQj6JA31863_MK9j2xTgNS4tXWt-d9mnb2VFtpCUkyDvuoHbyEItE8L281jvg2ZfPxnmuYjj5gT6zK9MRNKMsPgziUJA61e1_nDdoWiyTiESG6_RltrKhdx0X0hJggEj_LkhJ9ZYECtsDBVhbWrZiAiacbX7UJ0a08aUNDTIKYcXP6X_Qq4Hf318_pHFvxxb7izNeAwbCLP8-AnZQNdV1_sI7J3iol5EHujHeSet9RvNGF9s4QjDlipeGP0p4dZo1TFXlil7_ptobS6MSIG3WU1rnkdK37kuCVZglBnEtPz67f4w3koxKBUTjP0JU8RLMi1o5G_R5vFooYHPTT7PCfXLBhmRzAQTbB7R4Z5_BkjA5FHY_NzLZ3I7CMeIDc_W4nmUcshsqK2K2m9ONwGLIqyvtMH-op2dhLZUrtwl0Sq-3mKBXaXOhiH7yQlN9pfOwut2nBc5wAYN_fYDSH9cM7uFhoiB3kVWPT0TKSWn_QzBAhFHc7rFodk2jdSB6u1BKqAVUDkaM6k4Hq04NzfUerPIUsKeYPFUGSdCsJxGbvpGP86R_H26_xRK42hv24S73SPavAmQBI3FWtfC3cWd7mkapz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAABYBAAAAAAAADaQEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAE5MjI3ZjBhNzMxMWRhNTg0NjU5NmQwMjlmOThlZmVhODcyMTRjN2U3ZjcwMmMzOWJhN2FhZDVmODMyYTE1NWRjHENvbnRlbnQtRGlnZXN0gAE5MjI3ZjBhNzMxMWRhNTg0NjU5NmQwMjlmOThlZmVhODcyMTRjN2U3ZjcwMmMzOWJhN2FhZDVmODMyYTE1NWRjHENvbnRlbnQtQXV0aG9yImxtaWtycGhna3VtZHFhZjU2DkNoYWluSWQENTYMU291cmNlEmN5YmVydHVuZQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHhhNDQyMDg5YmM5YWM2NjEyOThkZmQ2ZWY3ZTQ1ZjExMWI2ZWQ3ODBiXCIsXCJ0c1wiOjE2OTE0NjA2MjI2NzcsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImxtaWtycGhna3VtZHFhZjU2XCIsXCJ0aXRsZVwiOlwiVGhlIEN1cnNlIG9mIHRoZSBNdW1teSdzIFRvbWJcIixcImJvZHlcIjpcIk5pY2VcIn0iLCJkaWdlc3QiOiI5MjI3ZjBhNzMxMWRhNTg0NjU5NmQwMjlmOThlZmVhODcyMTRjN2U3ZjcwMmMzOWJhN2FhZDVmODMyYTE1NWRjIiwic2lnbmF0dXJlIjoiMHhmNGE3OGJlOTkyODViOWNmNDAxZTQ4YTg3ODAzZTgzNmYxZWVkZjE3MTFjNzhkNTZkN2Y2Mjg1NjEyNTZhNTM3NmYxZDg3MjhlOTdiYmJmMzY4ZmJkYjU1OTY5ZDNmYmM2ZTlhZGJhNTA5YmM2YWEwNTE3ZTdiZDRjMzViZTE2YyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFL2FvTnR1N3RyOGd6YnlJaEFHcEJSUUlIRHhPL0pSSGpzWWxON1R4NDRiWmhrekpSZGRJLzhRUW0vY3Z5eU5rOTJoTlhEUXNTRGJsckF6dUxLTEhRdlE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4YTQ0MjA4OWJjOWFjNjYxMjk4ZGZkNmVmN2U0NWYxMTFiNmVkNzgwYiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDY4ZDRhNzYyMjA4Y2RhYTQxZmI3NmQ5YWU5ZjJmZmYyNzBhMzJjZjExZTE4YjA2OWI5NWQ5ZWQ5MzVkYmVjYzY1NDY5M2VlZmIyODFhNTg0YmYwZDk5ODRhMWQwN2FhOGY3YWRhNmU4MmQ2NzFkOWRkNmYwOGIyN2IyMWNjNmI1MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEkgYXV0aG9yaXplIEN5YmVyVHVuZS54eXogZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRS9hb050dTd0cjhnemJ5SWhBR3BCUlFJSER4Ty9KUkhqc1lsTjdUeDQ0Ylpoa3pKUmRkSS84UVFtL2N2eXlOazkyaE5YRFFzU0RibHJBenVMS0xIUXZRPT0ifX0BAJShKIe12HCpdswlJ8x2C6x-jmn4qjA6ERYc_ZfgXFhWKatqzqTjPJVJ85Zsegv3HNROp3PqP3TdftTSJkJmYn5HzTkc8S_Wpt68bU0gmT70WL1cXsVXvFSnVli-9lxk5AGIYVgOslicRAwAOQ3A1SKvL70Lx0qbKWeROPp16a3hRkzmaHjWpRRYI7qDqVsT4WEMtLUfoorvby5Llmz-cqHRgBCDhyzYiSTB2Sbh81i77sl058RdXsRtT6V-9OqfsqXqvu8Hx78LEEgSL1UBk51nh51lCP0I90q7zJezP_8Y6xarfQ53wDrX_MpLhyQ3QDoPxBHM1NUnwUKmUe96hlON7IvkI-kxYlY83BzNJED4T1IZx0QXFQGE6nxS173NzGmy33qT9EoEqoysvhXiVRe9FB1gL7V71VvpAXeXylE2mbrajrwhdi_vAc0IrYJSut5-BmFWBxBdtlwYN0oJPSntRi7T9NhHazKTbROdvpdUQTrc2Hw2yarkR-eg_a_9GnRp5kwtz-SusYRmKhJm636fk6qNcsj0Ep6DEeqNflqu1HjB3iVMriV-mBo2k0L9YA2UhS-41tCqIOlAGso_JzYVWrNTtAPUl-Z50txbQjx_ur1xHwgqhliMW42iFRl6OK-i9Y0L8bjp5YXR3EyS8UmzngA8P_G2_seLYiVwxt68nPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfgEAAAAAAAAP9AUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAAWZlMjc4Y2MyMzkyNGM0M2NlMDIwYmUwOGViZmQ4OGEyOTIyMGQ2MjRhZDQzMTBlNTk2YmQ1Yjg3MDYxNmQyMTccQ29udGVudC1EaWdlc3SAAWZlMjc4Y2MyMzkyNGM0M2NlMDIwYmUwOGViZmQ4OGEyOTIyMGQ2MjRhZDQzMTBlNTk2YmQ1Yjg3MDYxNmQyMTccQ29udGVudC1BdXRob3IaOTI1Njc0MjYyNzI3MQ5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4ZTNhZmZmNWZlYjBmYTdlNmUzMmY5NGQxZjcwMzE1M2U4NDAzMGNjNlwiLFwidHNcIjoxNjkxNDYwNjIyNjQ3LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCI5MjU2NzQyNjI3MjcxXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiJmZTI3OGNjMjM5MjRjNDNjZTAyMGJlMDhlYmZkODhhMjkyMjBkNjI0YWQ0MzEwZTU5NmJkNWI4NzA2MTZkMjE3Iiwic2lnbmF0dXJlIjoiMHg0ZThhMWIxZmFlYjNkMjJhNDQzNGY2NTExYTBhYzc4Y2RjZWQ0MDgyNGFiYWI0NmNmYjNhNzI2MjU5ZTZhNmQyNTZiNWQzMTdjNzNmN2NlYTIxZjNmZTljYTc3NWM0YzZlYzVhMTczZmQ1NjQ2MjJjNGFjZWNmNDZkZjNkZjJlOCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFM3NQYWhoVHZMRHljYWZVRlg1TmYxSmEyK1lVK3VwUitsTlg2NTlrSmlQQk81bURrVmtKWXowYUpLRlVPemdxV1p6T1RtbE1yYXdpQ25JcHJCWlQralE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4ZTNhZmZmNWZlYjBmYTdlNmUzMmY5NGQxZjcwMzE1M2U4NDAzMGNjNiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGJlNTc5NTI5Y2E4YTIwZmNkZjYyZjE5YzYwZmVhOTBhYTkwZDY1NjM0ZDI1ZWEwYzI5YTU0MGZjZWEwNjUxYTU2OTFlZGJhYTQ4YjBlNmY4Y2JlODY3OGE3YmFjZWMxNWJiYjM5YTliNmNlNjUzZmUwY2U5YTgxZDgzM2U4ZGY2MWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFM3NQYWhoVHZMRHljYWZVRlg1TmYxSmEyK1lVK3VwUitsTlg2NTlrSmlQQk81bURrVmtKWXowYUpLRlVPemdxV1p6T1RtbE1yYXdpQ25JcHJCWlQralE9PSJ9fQEAe9bg9ajoqevO6M42KlapmJo6YgLsz9UZW-0u14ox1yBDXilX_BRf8SHn3bAnfYDYkCxQKQQA1fdd10N9n2Ah3sGrDsgvBwF-l183gsjUjZPrJgsHcY1OQGsVMayD6RDcIksmgUCyMgUa5Cqj-4cxIk7Gmuj-q8aDZFcGL_2yycCUnLOPxxTf5oz-3bf2gY1ZknI_zxU_IS3CupycIrF0hO2ZhPZ2yyvsVFsNsXYQHY_vEJ38VHgSpJF6b-imUulHsVrDiFCOiTwGxFW1tlq6P7L56bzHY30ZrB1BXTYMzElHj1KddVFr_PxUwDP5BjhOzRyFXfGpvmm5K95CCEFofDXgsy51o4gAb4S6pnL7LcnbJFd7xSmSn1nyVnKykXB3XZXPHN1VPE9Wu8dg4ErltmQCyCeGcrVZ9ff2r0WB3gKRaHCfOwjtCPYYkjjHfJb8oGfnGqdzIt2ff-0YSSpgztmkTvWQpa9KqbZ9uDKxLqaSTjuR5XT1y8Rv5Yei6JbnXZdtCpJ0WQSGFb7dckM01ALxpAKSAdTkzyNvZQ-5YiginfUBWkEdwgXEZ_xvoTxhZ9Xf3Q7endl8G38JuZuweFQVUc6zEbnGNFshLNbIhK4tvmJi1KUI2hBwpTAOqK1f3BTbfoa-_XdXUu05UQATqGcW-0TGJeTX7WWcGeBBF5-c-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABNTU2ZWU3MmZjY2Y5ZjRhY2ZiNjBkNWZhYjFkNDIxMzMzZTk3N2FhNGRkNzg0OTgyYmJiZmIwZjUwYTA5Y2Y4YRxDb250ZW50LURpZ2VzdIABNTU2ZWU3MmZjY2Y5ZjRhY2ZiNjBkNWZhYjFkNDIxMzMzZTk3N2FhNGRkNzg0OTgyYmJiZmIwZjUwYTA5Y2Y4YRxDb250ZW50LUF1dGhvchhqdnBubWF6ZTFweGEOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg1ZTliMTQ2OGIyMmFkNWM4OTM5YmRmOTJhNzI0Y2ZhZGY4NGFhOTJkXCIsXCJ0c1wiOjE2OTE0NjA2MjE2MjksXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImp2cG5tYXplMXB4YVwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiI1NTZlZTcyZmNjZjlmNGFjZmI2MGQ1ZmFiMWQ0MjEzMzNlOTc3YWE0ZGQ3ODQ5ODJiYmJmYjBmNTBhMDljZjhhIiwic2lnbmF0dXJlIjoiMHgxZGE2MzBiNWQ0MThmOGJiYjIyNmQ2ZWU0Y2MwYjNiMjU0MWNiY2RkMzY0ZGI5NTNlMTdiZDk1YzA5NDQ3YTlmZjE1Y2JlMDIyYTFjOGQxYTFjMjI4ZTVjMWExYWIzYTRlZWE4MGIyYjdjNThkZGEyNzBjYjMyZjNkZTg1YWU4NCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaTU2NzhKRURnMjAzblFpSGZMaHdxS1lGeDNzQWFWMWo1cks2d0JROHR0RHBEdHMvRXBGTEVaMHEyVnVjakZaZGhXSm1wUnMrUXFZekg1eldLa0Y5bFE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NWU5YjE0NjhiMjJhZDVjODkzOWJkZjkyYTcyNGNmYWRmODRhYTkyZCIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGIyM2YzN2E3NmY1NTI0NDhhMDU1ZDk5MGVhNTIzOTJhNzZhZjI4YzAyYTM3ZTgyMTdlNzhiMjlmOWM4MzljN2I2Njg4M2EwYjM1ZTE1OTA3OTVjMWQwYzYwMjliZGMzZTI1MjAxODZiNzUzNTFjMGM4ZjE0YmEwNzU2YzI0OTM5MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWk1Njc4SkVEZzIwM25RaUhmTGh3cUtZRngzc0FhVjFqNXJLNndCUTh0dERwRHRzL0VwRkxFWjBxMlZ1Y2pGWmRoV0ptcFJzK1FxWXpINXpXS2tGOWxRPT0ifX0BAGdu_ZMjMN1CsUnrEw5wAn_z_p5nGwk_e45Ey2UzOfxjVzeeEV2A2o0-Mrz9YEgQiNbcBOrsTylnYgVCuMvSzMG8A0EK04eLhkqkgIoZc5FloN6Gk0SFLax9ZOyaQkZ3cvESmPjwYdDtiFMEBU3Umtl3eRfC0YJCNqhPxJxvntwDq9LcMC-1nFkHx7L9Gd_yaImcLurMoxPtJO028Oq_iTRRqs_bgxRFq0qL2lKCPmDud5WpKgD0hbnWUqONca2lINGOOoQvZ1su6P0eeC_I8jbPCrq8IXN3_rstaiygMHpsimhp4RAk5_41j0KhzLSN3g1xs0dQlHq-ZZ5N0mzpOc4Bhbv-51E88EymkTBomXG_R9fmdwITbfk1GtLXUtc3CBtMYghQ29UmdafdO7RMFXxB4O5TN7xkaPaovJwBG23sSZLRV2arTacyzrLqywUKWOmK-mb4rTjZqZ3v_1zbqsf1JZ5hXG7md1Muzbcvw1eYxiiPNQBiFlWhP9ZBtcVO8k-WH0jqMHi4Xa6GGT98cTI-XxgB4uoiVRn-HCR_uDfc9j1hJLyhNiV08iNs9OsvE_6K67mnrKVnJM8LmW5CEa9RGYNEQbUbxTn1Hoe2GzbZrUh1A9bUAHPycVN6-MdQOhArGOtRV-circ0Z6ooqyaOZfM-Op2D8Vu9R2dT3FyC3nPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAATIwMmVjMTQ4ZDE3NWRjMTZmYWM4MTAxNzIyNzE2MjI5MmU5NTVjOGUzYTE0NmFhNTkzOGJjMmQ5MGZlYTE4ZGEcQ29udGVudC1EaWdlc3SAATIwMmVjMTQ4ZDE3NWRjMTZmYWM4MTAxNzIyNzE2MjI5MmU5NTVjOGUzYTE0NmFhNTkzOGJjMmQ5MGZlYTE4ZGEcQ29udGVudC1BdXRob3IYem53eHczNjF3eW1wDkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNwB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHhlMTVmYzUxMTYwZDI1YTYyMzQyZTdlZTdkNGVjMGExMDdlZDBmNWU0XCIsXCJ0c1wiOjE2OTE0NjA2MjI1NTMsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcInpud3h3MzYxd3ltcFwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiMjAyZWMxNDhkMTc1ZGMxNmZhYzgxMDE3MjI3MTYyMjkyZTk1NWM4ZTNhMTQ2YWE1OTM4YmMyZDkwZmVhMThkYSIsInNpZ25hdHVyZSI6IjB4MDViYTI0NDhmZGU3ZWYyZGIxZjlmN2NiMDczNzc0MmY1ZTU4N2M2M2Y3MDY4NWQyYTdkMjIwZjMwZmVjMGVmN2VmMjg2Y2RmZDQzM2FiZTc0YmY1ZjliNDY0NDNlYzFhNzY5NjkzZGQ4MTJlMGYyOGMxOGFiY2QxYTRmNGJlOGYiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXora0h6MHNYTTY0RHBlVGp0RXpvSE9KU2xqLzZoaFIrYWN2RUpVSlBZYXRyWTI1V0Q3c1BFdS9CcVdlUGt2dzY2MVVyUXNtMCt5QVFmOStxMm04Q21BPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGUxNWZjNTExNjBkMjVhNjIzNDJlN2VlN2Q0ZWMwYTEwN2VkMGY1ZTQiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg5ZDU3ZTU1ZTRiNTkzOGY5MGZjZTQ1NTZiMjk0OTRiNGY3OTFmOWE0NTgwMWFhMmE0YWUyMzMwZmMwN2ZkMTE1MWE4OGI3NGU2M2VlYmQ4Yjg5YTJhNmZjZDgwYjUwNDg0ZDg3NTFjMzg2MmZiMzg2ZTQwNjc1NTgzYTg0MjZkMTFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXora0h6MHNYTTY0RHBlVGp0RXpvSE9KU2xqLzZoaFIrYWN2RUpVSlBZYXRyWTI1V0Q3c1BFdS9CcVdlUGt2dzY2MVVyUXNtMCt5QVFmOStxMm04Q21BPT0ifX0BAAoNZJHqp-S-A_KX1CG2pOpRziJVbm8dQUbdBc0R_-RuKIaG1be4zziK5UFPxLdXVSlvv0CBRTePnsb8uPPY4l_0Jitn6GJUfvnfpn02Kz7HxRYVYHee-UoYTgNFMddxn2FYC2baaM1PR6DX13GLaN57icBlmqlwmR0gsp_twIgTTBdyb3DD-BZvPxjIIv87G7Z2JMXPmXrAUwKzbB8Wah4kgnDEdZIU0Vmugt6mdROPQ17GKUb6kRiOd0b86ihJxBY6skaspHz8Y7jVcSUSB5tqUnVv-p7bE3FgXrKDU__iIHlJ6xni2gQbnJvfHPvYiDQcE0K8LsjUJ7VYiSoJKXsuiem2pQHAHsrtnISxoRoNYpQCEpAIIgTfVHpjkSGyK3uQHnrpCAt14eHAaR4WgHTHEMRbOWpksQoFa3cn2j5Y8dGSff2B0_aMzRnDKpRcNO4ctHVJsbYqBlPWyTrYmgyMIoF9GVww4lvdtRmhFhTuTexOPljRdIYUCe8TSstMcoicrWsbBG5RHifKztLFhMQA-tqCQQUQV2foscL7VKrpjRyc2Swirn7UnjGcgRkmk6kJRk_2Ff83_Nf8GJz_6qfeq3UT-jsX5G9u1yM9iSB6FhgsJ3mhtrFSbrURlIZ_-7DlmdGxjUtPsAGkD4IO7bgSv-EvzKNdHXBC90kbvEC1nPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAAEgEAAAAAAAANnAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtQXV0aG9yJGRvbm5pZWFubmV0dGVhbTRhNA5DaGFpbklkBDU2DFNvdXJjZQhhdGVtFENvbnRlbnQtSWSAAWIyYmI3MGM1OTI4ZDdlNjgzNzNkZGY4Mzc3Yzc4YmZlMzA1ZTg3YzRhOTE1NzNkOTMzNzFkYjE3OTU0YWFjMzkcQ29udGVudC1EaWdlc3SAAWIyYmI3MGM1OTI4ZDdlNjgzNzNkZGY4Mzc3Yzc4YmZlMzA1ZTg3YzRhOTE1NzNkOTMzNzFkYjE3OTU0YWFjMzkAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4NzMwOWU4NDU3Nzg3MWY4YThhMDZjNTI0ODg0ODZjYjhmY2ZhNjk4ZVwiLFwidHNcIjoxNjkxNDYwNjIyNjcxLFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJkb25uaWVhbm5ldHRlYW00YTRcIixcInRpdGxlXCI6XCJUaGUgS2luZ2RvbSBvZiB0aGUgQ3J5c3RhbCBTa3VsbHNcIixcImJvZHlcIjpcIndvd1wifSIsImRpZ2VzdCI6ImIyYmI3MGM1OTI4ZDdlNjgzNzNkZGY4Mzc3Yzc4YmZlMzA1ZTg3YzRhOTE1NzNkOTMzNzFkYjE3OTU0YWFjMzkiLCJzaWduYXR1cmUiOiIweGVmOGVmODhlMjRhNjhlNTI1ODRmNjljNTg0OTUwNjNkODdiYmYwMzUwYzJjOWRhYzgyNzM0YjNkNzJmYzU1ZjY4ZmIyYjgzZDFmM2MzMmM4ZGI3YTg4ZWU2ZjExYmE4NGE2YmQ4OTRkMDEzYzdhNmYxZjkwZjg5ZGY5ZmU2ZWIyIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVucnZZNDk0ZVk1NWFha1k5ZmNJZ3FVbm4xdlEzdFBVTGFhZlZoaStyWGRVQ0RLVHVEdmJ3blZlc2VLT3drdWh2Q3hQVi9yMWlCUlZkejRQWlgrNEhCdz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHg3MzA5ZTg0NTc3ODcxZjhhOGEwNmM1MjQ4ODQ4NmNiOGZjZmE2OThlIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4YTQyYmQ2OGFmZjYyNTFhYTI3NjU3YjkzMWI0ZmE1YzFhMTYzOTdkMTM1NmFiODRhYWVlZTRmNzcwODU4YzJmYjM4NWJhZmM5YTNjOWE3OTk1NTZiNTllN2QzNmY0NDE4ZDE3MTM5ZjBiNjY5MDlmNWRhOGJjOWQzODZhYTM1YjYxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFbnJ2WTQ5NGVZNTVhYWtZOWZjSWdxVW5uMXZRM3RQVUxhYWZWaGkrclhkVUNES1R1RHZid25WZXNlS093a3VodkN4UFYvcjFpQlJWZHo0UFpYKzRIQnc9PSJ9fQEAUeNJebaG1qVcK0L8VKqXsJjn-sb13PqwXrQVCMqcbt2USjHh-EXNYMDzElaBcid56shkVQwpybcR3LTUAaVpjET-P387anS7iVCZZCo2BGz7NrI-3rZE1ctb7xzkb1BoKRSu1ds4_zWouWDBlS4JmRDYj7jnX73ZG5nfJgjGGODSVHJYXj0wA58vF-U6iqxzC6yc33I5ZHX0tbbE_HzcflBV6LPlqV9Cw6lY2VGSesYr4rkBBbIuRTYTzOoQnCAA9-EtNy7HcetCT4b-6pGAI-nV2dqpTlcFdJqCxXNb-piw5mPLzZmTZ6bLQjBzjkH0pE2b0hx8LtVzdVSxe34fUoYA_zie4WJ_oPsjm8uYfpn94KVTcAds5wIrgPoaf60eGOBiWKIOLjDwSy6Mlfrhd7JkH8Xp8rX4V9J0jZ8JBdwkRcPdeTAt9jLZgUHXiZt8I-5-V3HXSf22i9n_TJ1oFqJG6cHrycf1n_BzMQo3EqiODInJupybU865KjU0JrnqVEHAmWJ5ypuC_BQL0IIpr19zF62eyfCGBNPsq0EH8FR8VbMJLLdc9E-4vMeCV1RzDJ9UuPYbnVLz7XCp---zCKkux7uY4tlqlOvgh0enaW7FabvGCdIfIxW1s5XYlBkQggNHR9l6GioZRIGofEY69sqacB6anKrczRSYHsEYvb2c-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABMTY4YTY5Y2QxZGRjMmQ2YzJlM2RhZmU2N2ViYWU4ZDIyZWJkYjY2YmQxNDJjODI5YTI1OWZjMWYxM2JhMWQ4ORxDb250ZW50LURpZ2VzdIABMTY4YTY5Y2QxZGRjMmQ2YzJlM2RhZmU2N2ViYWU4ZDIyZWJkYjY2YmQxNDJjODI5YTI1OWZjMWYxM2JhMWQ4ORxDb250ZW50LUF1dGhvchg5Y2ExeWZteXdvMmMOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDc4M2FkMDE4ZmNjOTk5OTA5ZjQ1N2U1YjcwMDJhYzQ3YTliZWZjZWVcIixcInRzXCI6MTY5MTQ2MDYyMTkzOCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiOWNhMXlmbXl3bzJjXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiIxNjhhNjljZDFkZGMyZDZjMmUzZGFmZTY3ZWJhZThkMjJlYmRiNjZiZDE0MmM4MjlhMjU5ZmMxZjEzYmExZDg5Iiwic2lnbmF0dXJlIjoiMHhmMTM3MmVlZjExZGZkNTM1NDY0ZDdkNGRlOWVmNTM5NDkwODlmNDc5MDg5MmZiMmU4MDdkNDk3NzhkMGNjNmFjN2Q2ZWNhNTA4ZTM5ODNlNDJjMWQ4ZWIzZjM3YWQ2NTFkZWJkZDUwMjA4Yjc1YTk2NDgwNTVjNDUzZDM0OTlhMyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFQ3FGK2ZyNjFUWU1tSlZVR1VOcitNNHMrRjhRQjF3cGNJdXk0d2ZzWG5GL2lnUjlhQkZCR2xvM2ZIOWNodlRZY0dycEZLcVBzeXlmd1B1eVExM1l5dEE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NzgzYWQwMThmY2M5OTk5MDlmNDU3ZTViNzAwMmFjNDdhOWJlZmNlZSIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDI0MWE5NDNjNjdjNjFlN2UzNzUwMTNiYTAzMmJmZDUwM2NlMTEwMTcxZDIzN2NiZDg0YzkyZTczYjU1ZmE0Zjg1ZDViYTdkMDhjYjJkNGUzMTdhODcxNmEzYmQ0MTAyMTJmMTgyM2ZmOGRmNDFkMDRmNWMyNzMwMzA3ZjU5YjZlMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFQ3FGK2ZyNjFUWU1tSlZVR1VOcitNNHMrRjhRQjF3cGNJdXk0d2ZzWG5GL2lnUjlhQkZCR2xvM2ZIOWNodlRZY0dycEZLcVBzeXlmd1B1eVExM1l5dEE9PSJ9fQEAbg_RpuReM3kHXs9OJec3ZF_AzJnrQVa-i3S_Zi8ye0sVll1W6Z__h9nDo_ggIRrd4lz5sd6ER026qAbhlmO8CKkOB0EjYZnz_0_Mo9AO878kWjyarDW1jnU-ajTCGUkE7o_oHJIPe68YN4EkvRrLfhjfIsI0C98YgKZZvt3SkMV--oVcBgP2KHYykIlrMUE4YJ7JeeUy22MJ3pvRv_yE_fUaIq96FBmCiPUuw5WqCFCPn2VKjz47FV1Fh5jyzKBGFB-uYBKtxypeh8uAQ3yGdqjXOhNU4yHce8GhpfnCyf1JIP6h89A8aSic4VrU91z0jQbJpuerz8v4iqCgw6ITJe_qynvx9Zk26PQ98R8u42ZB3aSQBaJXfjhn5XXZKcHroHEJDXUsp0k82L9k8n7Y_CZVSwBb4_InVEizApziT9u89Y83VDtdasGfa0LU_1jiLQqSfYrnkLdt6ONuBgAhgtB8kc16uDtVeqqs_ebGMr1qAdVx7dFXMlJo3Bgv_-n9BNSqyhfRWhFUGLQaxtDgmORbpoDpeATeGhc56ImuOYPCpSrl-09DOadwLkUjbb0NqtSiYEt3m54cXZRP3VLr_DY439f_mSnyeM4rYyOfEURTwHtLw4P90p7Y80PqgXQIPsSRRuAAqIUimwrxasAI0dmOleliO9UHx6SixnM_vQSc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAE2ZDViYjM1M2ZiOWYyN2NmY2E5YzVjOTZkMGJmNjE3MzQ2ODhjNmU3YzZmYmM5Njc1NjI3MGVkNTliNWRmMDk4HENvbnRlbnQtRGlnZXN0gAE2ZDViYjM1M2ZiOWYyN2NmY2E5YzVjOTZkMGJmNjE3MzQ2ODhjNmU3YzZmYmM5Njc1NjI3MGVkNTliNWRmMDk4HENvbnRlbnQtQXV0aG9yGDF3ZWI4OXJrMTUwMQ5DaGFpbklkBDU2AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDEzOGM2NzQ5NmM0YTE1ZDQ5NzAxMDNlODZjZTdiNGU4YThhZjZiOGVcIixcInRzXCI6MTY5MTQ2MDYyMjA3NCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiMXdlYjg5cmsxNTAxXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiI2ZDViYjM1M2ZiOWYyN2NmY2E5YzVjOTZkMGJmNjE3MzQ2ODhjNmU3YzZmYmM5Njc1NjI3MGVkNTliNWRmMDk4Iiwic2lnbmF0dXJlIjoiMHg1MDdiZmE4YzIxZmVhN2U0Njc5OTExOGQwMjNmMTdlYmZhN2M2OTIwNjE0NjZjYWY3YTc0ZGNkZjE4YjQyMDEwMmY2YjVhZWY2NTI2YmYwYmNmYmUxNTg3ZjJiY2U1NzQxZGUzNzliOTg0NTUxNTQ0YTk4OTUwYjZiZjZiMTRiNyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFbFJyMnNaUnpuVEZ4U3FHTlUvcERJU1dMWWdHV0NmcWw5ZkRpY3hKakFjOVRKN1hOcEEyS1pTSnNMQXN4YUFMcnRIeGFXc1pqZHFIRHhhRkMrRnJTa2c9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4MTM4YzY3NDk2YzRhMTVkNDk3MDEwM2U4NmNlN2I0ZThhOGFmNmI4ZSIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDI5YjhiMGE5ZWQ4MDYyNzNkNTE5MWY1ODk2NzhhNDIzYzViYjNlMjMwMjAwNzAyNjY3ZjY1YWNlMjY3NmMzY2Y1ZjMwM2RiZGFiMDNkOGZlZTkwYWE0NjVkMTJiZjczYTgzYzBhNzRlYzUzYTkxZjBiNjc1NjEzMzBhMDk0ZDU2MWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFbFJyMnNaUnpuVEZ4U3FHTlUvcERJU1dMWWdHV0NmcWw5ZkRpY3hKakFjOVRKN1hOcEEyS1pTSnNMQXN4YUFMcnRIeGFXc1pqZHFIRHhhRkMrRnJTa2c9PSJ9fQEATJOezfk-TLwWsmTOLW3O4AfGIscO8aLPJP-KXpOk1F3p1tGiVSVbtn_1SnEu0t6C9ppsPiHi5uFDv2_g_EKBYqNr6npAFWRVWkXsUFMZPH8ZHE8ot6uIN83Mb-EHnm-YiZyGwEHZk97xpD79B3LMj1pqMsMIJ3QZcIuGlYtLS3t0GSkUExYu49OaspF2wxtxu0Z_Ey485hYdG2rHL7rzi26DyQHroPYREgyuColw5T9eSCR4YygvVpy9h5Qk3vxSPxx_wmZdWJQVMeRp2kKidyrkKaKwuY8fAnCFPiJy7w0tje9kmD8duWu3eZnQvXs7vkECCCOo4w19X0gc45MXKaWGz4FtlrQvk5x5nqCzzhGXTOwdtEC6i6MWM-SzBJrhMpOp8c06_39eDBIP3Rn8WCWCyGtR_N346IlLsCOLapqU6dNYgfHxrd1xYucQKoDBBVhHeikKwYXXM9xiJaaeQZjLi8tAeMtvX3ssEfPxRN4J4XS5DHTgQt9e1FlzHvhIgVHAghim0o6yLFecgrwDkGzmV6Gu0ea6c2mIrjPhXf4B1SjEI6HbS_SiqpLGsQgnlORwOpRZmLPzXSW4y5Gp8izF0TcpedTkZL3z4Xs53xZWkrR-uj6T89msjZU5CoHU6BVyzw4PiCyua0p4hSjZz_5uNIRhQIMRd54cW_FrMrSc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAE1NzRkYjgwNDYzMzgzNzZiY2ZmMzAxNmQ1ZDVhZmEyOTRlYmMwMmFhZTg5ZjQyZTMzODkxODFkMDgzMDgzM2RmHENvbnRlbnQtRGlnZXN0gAE1NzRkYjgwNDYzMzgzNzZiY2ZmMzAxNmQ1ZDVhZmEyOTRlYmMwMmFhZTg5ZjQyZTMzODkxODFkMDgzMDgzM2RmHENvbnRlbnQtQXV0aG9yGHEya3RmY2Ria3Rzbw5DaGFpbklkBDU2AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDFkNDIyNjJmODQ3YWQyZWU0Y2M3NjIyZjQxZDBhMTlhMzZhMDZhMmNcIixcInRzXCI6MTY5MTQ2MDYyMTk2MyxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwicTJrdGZjZGJrdHNvXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiI1NzRkYjgwNDYzMzgzNzZiY2ZmMzAxNmQ1ZDVhZmEyOTRlYmMwMmFhZTg5ZjQyZTMzODkxODFkMDgzMDgzM2RmIiwic2lnbmF0dXJlIjoiMHhiYjE0MGMzNjdiNWMwNzYxMjIwNmI2ZTYwZmU5NTczZWJmYjI2ZDQ5ZjYyMWRlOGY0ZWQ1ZTkxZDk5YzJkOGVmNDQ0NmQ2YTZiODc3N2EzZThjMTczYTc5YWZjNDM4ODA1MDVlMGEwZGVhOWU5MzhiNmM5ZDE4Nzc1NjkzNzBkZSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFV09sUVFOOHQwbWc1Yzk3a2kzMlhpUHhQNGFBQjJXTEhOV2hEWHU3TEI3TytHbGNLUTh4OHhhcW1WTEIrZGdna2V1VXVOekRSOUNoZ0ZPdXVvL2hmMmc9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4MWQ0MjI2MmY4NDdhZDJlZTRjYzc2MjJmNDFkMGExOWEzNmEwNmEyYyIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDhhNGUzMTNhYWVjNGJlODhkYmNmZjE5MDc2OGIzZGQ1ZjQ5MGE4NTQwMzhiY2NiNTMzMjUyM2UxMDQyZjVkNDE3NzNmM2VkNWUzMDI2MzIxN2Y2Y2RhNjdhOWZmZGE0NzQwODFmNDIwMDcwY2JjZTY4Mzg3MDY2MzEwOWFjNGU2MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFV09sUVFOOHQwbWc1Yzk3a2kzMlhpUHhQNGFBQjJXTEhOV2hEWHU3TEI3TytHbGNLUTh4OHhhcW1WTEIrZGdna2V1VXVOekRSOUNoZ0ZPdXVvL2hmMmc9PSJ9fQEAacb7OWaowzb99-8IB-aoF51qqEWK7yc1VYcfivj6hVeuv8N9XENwr3eiXLakQAds_rJSs2GxoHOop1byvbQr_fbaGqudiXA0cM1Uh8xnXL1BTk_9AShQm_A45qVzcIuGE2fsebBmSJLe2KpttI1pVcbFKnaBJug4lXqctZqjluQ7m9y3dOqgvdvNb7WoXDuf4nWZC1MqKkbLp1mn42z_bmVloPzzcfzXEVnjM_iBFLccwGQQ7HBhigd_FQ8ZwfKyU--7dmWwm1S7x6jN5wnrSRHRBt_u87571dHrd53J3zSXv7-f9WlU6ViRYwOHXzs2h35Nm7JrOOalY94clyphRnSCqMl-9R2tkhjMmaAMdKHH32gckS3PEQybbJnSGqqrWU43VxXoLDGpQMVGkpwZaYoAB8w000YAzlMBCIa8Zjc9fN3MIoX-Tlbs-DLEN0PGlEGcsixF_4UmYs6Tf6IwDD4-t_vwrcw8Sa2N6mRjhIWZKxCSewbgquSCpQZNZrIPA0deaCsqkureHCLSrehYRm9xa7Afw8nYaGc7Yy9Np6CAD7Dut0SlOT9f0ARI39ZAgrrXecam9MeIVESvLFcfakCeNppvX0hh6xOHH7bmP2FHUkJtwT8pYNxYG_p2JPjQfKFwwlkgw6U7_cT205JKA3QsfbOFfC-NO3ubLMWnQIqc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABZjM5NGYxZTRhYzMyOGVjMjJmZWVmMTEzNzM1MjljM2Y4ODVkYjc5MDM5YWIzYWQ4NzIxNGRjZTgxMTgyMzg3ZBxDb250ZW50LURpZ2VzdIABZjM5NGYxZTRhYzMyOGVjMjJmZWVmMTEzNzM1MjljM2Y4ODVkYjc5MDM5YWIzYWQ4NzIxNGRjZTgxMTgyMzg3ZBxDb250ZW50LUF1dGhvchg5N3NsNjd4a2R6Y3MOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweGM3MGU1NTY3NTAxYTZkMzNiZTVmY2ExY2IwZTAwMWEyYzIyN2MzODdcIixcInRzXCI6MTY5MTQ2MDYyMjI5MCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiOTdzbDY3eGtkemNzXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiJmMzk0ZjFlNGFjMzI4ZWMyMmZlZWYxMTM3MzUyOWMzZjg4NWRiNzkwMzlhYjNhZDg3MjE0ZGNlODExODIzODdkIiwic2lnbmF0dXJlIjoiMHhmZTlmZDFkZDM2YzI1YjI4MWRkYzk2NDhjMDU2ZmFiNzFkNTRiNmRhY2Y0NjhhMWNkZTc0OWU4NTZhYjZkY2QwMTAxNTNlODM0MDgyOWUzMzlhMTA0MmJmY2MyZGJlNjQ3YWY4OTIyMjZmOTRhMjZkNzg4NmNhM2QxNjA4NWQ4ZCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFeGF2YkgwTXdmb3BFajFZTFpJNHVaM1kvbGg5b3l4enZSdDdmb0c2Wk9Tc2w1UU82NmN5R0tCaW85WCtmMzNSd2hVaHZXdTJtcWY5UUU5eHExdlpQZmc9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4YzcwZTU1Njc1MDFhNmQzM2JlNWZjYTFjYjBlMDAxYTJjMjI3YzM4NyIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGViN2FhM2UwMzY2NjNlYjk5YWM0M2E4YTkzMTI0MmQxOThhMjc4MzFiZWVlMzQwNzNjMDMxN2M2YmI3Mzg1Y2M2NGJjMmZjNWQzMTBlODIzMjM3ZDg1YzM2ZDhiNzIxNTJkZTM5MzdjZjQzY2Q4MGJjN2NlYmY4MjQ3YWQ0MzdjMWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFeGF2YkgwTXdmb3BFajFZTFpJNHVaM1kvbGg5b3l4enZSdDdmb0c2Wk9Tc2w1UU82NmN5R0tCaW85WCtmMzNSd2hVaHZXdTJtcWY5UUU5eHExdlpQZmc9PSJ9fQEAVyX7qCIDiovus38Eg_CJYnbQUat1wD8hZ5HlD9ciZTObT0AnHcP4LDnwqSdosRmIC2OKVNEAW94cdJ9gF0Png-Q6Ieh6nL-3_rv3FZPQsxS_l7kvQ-QjG3tJqsAyqGWnxC2pORrfoAN84cmixrs9bZXmlQS9UTxHR8xnNdlgPkiF_TdRSd2bZr3n1XChb6XRQjjasVZ5fix3KEbYfj28nttaerPqWSY8jivgCMwDboe7bBMopqlP7MrAdlZ9W7eJXwRmv8jJlWVE4dGwCoeIreQ-pMTrRrW7SKDslkuK4nEW5wRqUb44pen2LMfwnqNnHZ8EaWRG4rU9oDCLv7IdXv5uTwKmCDb51fdVobidYRL1nAvLDrbeMhYQwqd0h_YH25IcHtw4PO4wmilFZtSJSLjFn96J_Canr2jRBHpK5nabkXNoJq3MlK9UbZQNMxo99HEkwLexeDr3GmKarv9meZQBE1PDhp6Zbsh7GfyVWCjNpWQUlviYrR-gV25h3QqjuzjZU1WTr8QWK0AcQw7dW8IgITQWtJSfjavLgT1LKxvjzOlM6-HAa4D6jgC-RuLenTXc-TkfJECk1QfW2G-nf29Xm-14zwKQ7Wuozk9flEdpvi7nfaTH52sVU0dQwiJTPR_RtxDkavm3r92FNktOfV02AcEAf9ttNAD8_MpSsFSc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABMGVmZjllYzMwMzJmZGY4NTU2N2FmZGQwYjAxOWJlNGY5NDc1N2Q5YmNmNTJmMTRiMDczOTUyZGE3Mjc3MTYyNRxDb250ZW50LURpZ2VzdIABMGVmZjllYzMwMzJmZGY4NTU2N2FmZGQwYjAxOWJlNGY5NDc1N2Q5YmNmNTJmMTRiMDczOTUyZGE3Mjc3MTYyNRxDb250ZW50LUF1dGhvchhrZXM2Z2M5ZWNjZWQOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHhiNDI5Njg0Y2Y0NGQzOGJhMDE5OTRkY2Y5ZjkzNDlhZGQ2ZTJkZmVlXCIsXCJ0c1wiOjE2OTE0NjA2MjI4OTUsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImtlczZnYzllY2NlZFwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiIwZWZmOWVjMzAzMmZkZjg1NTY3YWZkZDBiMDE5YmU0Zjk0NzU3ZDliY2Y1MmYxNGIwNzM5NTJkYTcyNzcxNjI1Iiwic2lnbmF0dXJlIjoiMHhjMjE0MGYzYjAzMmYyMmEwZTQ0NDFhYjU3YjJjYjkxZTc0OTQxY2Y0YjBlOGVlZWEyM2U3NmQ2MTg1YmM5ZmNhMzNhYjk1YTZhNTY2NTcxOWI4ZDcwM2VjOTM5YTdlOTVkMTk2MDdkOTk5MWNlNjhkN2MyNTI1NWVhMzQ5YTExZiIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFMEdjUEhRU29IZ1hHZEVwcm1vL0dWQWFGNnJaMGZibktGOTZYcEVES0V3TXlhSy9mWUJFZ1Z0TENXU25VUGFOckV1L3dUaitxeGhPSHRtMFdTWERiVGc9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4YjQyOTY4NGNmNDRkMzhiYTAxOTk0ZGNmOWY5MzQ5YWRkNmUyZGZlZSIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDE3MDUwNWVkNTM5OWVjY2JhODRkYmMwMTBiNjQzYTQyZmNlYTc3NGQ1NTUzOWE1YTAyNDZkZmI3MjViOWJhZGE0MThjODFlNzlhZWQ1NzZhNTcwNTA5MWU2MmQ4ZWMxZDVjZmI5NGFiMzNhMWFkM2IxNmRiOWY5ZDc2ODY0ZmEzMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTBHY1BIUVNvSGdYR2RFcHJtby9HVkFhRjZyWjBmYm5LRjk2WHBFREtFd015YUsvZllCRWdWdExDV1NuVVBhTnJFdS93VGorcXhoT0h0bTBXU1hEYlRnPT0ifX0BAFgnPBlnvkcbKzbaIlRg0B5vevcY3SEJeMIawUqgPerrAIkW1m6CJeb-Z_V6z-h_5JRMUBsQBWVShThD2aeB4Ro-Tuk10BBNzyFNl4U4ouU26pMTeXwSic1FjBrooShCR1Rd1c5AkVQgiWk5TZg0dGONyxJXIDROgmgG-bLDjjlzMEoosMA7V-2Ssu3Nxv7K5LmoVxuljKMJtWyJp82vgadX1dVzoXbhwRLWu7O38IC_LVvoU3g5dULz7HtV-usTXPXZzn6ZunEij0PVZ6EOIzrVvRBZcyaM--_MHkFf2ljU1FOUnP_wZpIckav6qqW2mZYbrbw63voXSB9AJg8vYU8OB4G1NAoyDDY3uDdBT110KLG9LhrE1guk1tIvqh9Fybq2n2Uu4-N6kaBBge-qHtTiAgmIU1IqJ9260HpiCqrfCDW4CVqQcot1QTScmjEYFBZ7W36uqe79MIZ6ZThUIcyYu6eyt8FiNy5FOIyFGwHiU3EcmIhpTX-lADrqzY2axekp-QFTFys4YP2dVDbRH8ME473NpV8SA_USdm_GEss0Y6UtSU3jZVUhFFD9jYTaJTL-e3kVB6vASwzryuK3uy_BYT_wk0acMOL2Aw6Yqg3qfkoz2KA9-3vt368lf1K-PjgUvMJCERtyxPpJvnf0-bMEXdZHtvR1xHLBzs1ZSDbDnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAATBkMjY1MWNiMTRkNzczMjRjNzRmZmMwODM1Yzk3ZTkyMTgyMzYwMjcyNDhkNGE5YWE3M2E3YTE0OTA5Njk2ZjkcQ29udGVudC1EaWdlc3SAATBkMjY1MWNiMTRkNzczMjRjNzRmZmMwODM1Yzk3ZTkyMTgyMzYwMjcyNDhkNGE5YWE3M2E3YTE0OTA5Njk2ZjkcQ29udGVudC1BdXRob3IYZzY2cHRobzZjaWg0DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNwB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg2NDc4MzhhOTY4ZGQ2YWQ5ZmRmN2EyMDdiNGYwMjU2ODA4MjhkZDNhXCIsXCJ0c1wiOjE2OTE0NjA2MjMwNDcsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImc2NnB0aG82Y2loNFwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiMGQyNjUxY2IxNGQ3NzMyNGM3NGZmYzA4MzVjOTdlOTIxODIzNjAyNzI0OGQ0YTlhYTczYTdhMTQ5MDk2OTZmOSIsInNpZ25hdHVyZSI6IjB4ZTk2NjYwMjhmNjRjMWQ2MDdkNWYwZDNjYWY1Yzc5Y2RiMDYxNDI4YjU2MjIzMWQ1ZTU2NGE1NGIzMDMzNTVhZTUyZGJkYzFkNzgyNjU5NDFhNTEwZWE3NmY1NTYzMGZiOWZhZjYwM2RmNzhjNmE3ZWFjMTFkNWE3YjhmMDVjY2YiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXArR3BxRForTmxkR3ptcnBhQWZHbGk1eGlFMTY3WTlzK3oxOTNtbHBteGRweGZQZkxHUE1GQTNRaEx5ZHlDaDVuQko2V3dNcW9zQVRrMWtUK2k5U2JRPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDY0NzgzOGE5NjhkZDZhZDlmZGY3YTIwN2I0ZjAyNTY4MDgyOGRkM2EiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg5MWYwNjU2ZjIzNDViNzljZjdkMjIzODY1MmIzNWE1ODRjYzIyZmViZjA5ZjliZTE5NzljZTgzMDRkNDQyOTU4MGZiNGIwYjg4NWQ3ZjMyZDU5OGIzNjdjYzRmY2IyNDdhZDg0NmMxNGI3ZGNhOGQxZmY3YTRjZWZhMWE4ZTk1NDFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXArR3BxRForTmxkR3ptcnBhQWZHbGk1eGlFMTY3WTlzK3oxOTNtbHBteGRweGZQZkxHUE1GQTNRaEx5ZHlDaDVuQko2V3dNcW9zQVRrMWtUK2k5U2JRPT0ifX0BAFTOfR3hPa5jeYmHy7-o9m9Hl8ONE_B_QDJpLUF7vSPkPw41r4qJULubDyDH1r_iOBjG9DEF2NMLOfGYtjxgRLJ2cXkoNlKr34G7s07jmMvEIMyIMOQOEG1LIXhkEnKK7CCj81Pt-wYvWzW_JPW3R5jMMQWAljIDtHMoxpgajEHJAMJiaXQ17VL_xHbe8Wh-Y_XDBDQyiZyrnjQ-cjS2vY78SaCRbUnTqgRMQ6YcdmQ9M7Nal3QRa0Qu_hiep90Q1U2XVesEBMXo7TlqKzps3BvjELb3aW1c6wTXGdm4SAiAo2L9qIeu8SM4WXb6Vs-WDGKj7wQI7vySMGDV6m8cKJOLY1cqbXAfCdqY53PxoJJmxc-809wWZtVmoQ2P4W4AK992lxf4WkuW0gdIa-45fB-SZO-k15k6jo6RCMbI3hMsf6hIp69l5-Y2O-ZFqfW12NN5XPwIONZ-lgqCV1GDkMh1fiteoV797V-eNm0gx6l0Sgho9MtJcwCgUmBSo6WXGJIXY6IIziyoJpEEIGQco2HRNUNwJLkk7Voiy1VoaY1PRBCg361JCjGbJ56BSrNhyGKkVXhGAsBAzm_z9OZVZrXir4UQ1HPcXZo0TsZLLr6o3c6q8YOwE4bLbLM2K1HxNCHa-pEJYFOO5lZG_HjRpr9CsIJV1oiK2uC58H_aFhllnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABODMyZjllYTk5MWRjNTEzYTlhYmI5MTY5MmFlYjg2YWIxYmQ2MWYzNTE0NGQ5NTI3YjFlMTFlN2EwMjFkMTVmZhxDb250ZW50LURpZ2VzdIABODMyZjllYTk5MWRjNTEzYTlhYmI5MTY5MmFlYjg2YWIxYmQ2MWYzNTE0NGQ5NTI3YjFlMTFlN2EwMjFkMTVmZhxDb250ZW50LUF1dGhvchgxaWR1azc2Y3BmZnYOQ2hhaW5JZAQ1NgB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHgyMmFmZWE4YTM3NjIyZDljZmM1NDBmNmRjNzAyNjIwYmUzMzYyYTFiXCIsXCJ0c1wiOjE2OTE0NjA2MjIyNTQsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjFpZHVrNzZjcGZmdlwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiODMyZjllYTk5MWRjNTEzYTlhYmI5MTY5MmFlYjg2YWIxYmQ2MWYzNTE0NGQ5NTI3YjFlMTFlN2EwMjFkMTVmZiIsInNpZ25hdHVyZSI6IjB4NzUyNTZkZDlmNjgwZmQ1MDQ4ZjRjNzg4N2MyMjc5NjU2MDg1YTVhYzZhNDM4OGM0MTUyMjlmZjFiYWIyNzMwNDkwODA3OTczMDAxMTVhYWNhYWMyYjI1YjY0ZjRhNWUxMzMzZWQ2OThlOWNkMTA5MTM4MzFlNzBiMGE2YjdiM2IiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWh6RjNjdVJwUG1aNDVINnZqMm5NR0hzaGttckhVSzNsSmJONVdsNnplbUx4eWlwelNseGZMRWxzSkszQ3FFMVgraWJxbjlZcVJiV3hVN1crdHIwR3V3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDIyYWZlYThhMzc2MjJkOWNmYzU0MGY2ZGM3MDI2MjBiZTMzNjJhMWIiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHgzYzQ1NDYwNzRiMjliYWY4NGNhYmY1YjVmZDk4MzlhOGM2NjQyMjUyY2UwMTllOTgyMWI4MDYyMGFhNzRkNTU1MmQ4ZjE2MTg3NGRmNWFjM2MwMWI3OWViYjczZjNhMjBkZGUzY2MxZDZjMzA5ZjQzY2NkODE1OTFhZmJiOGMyNTFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWh6RjNjdVJwUG1aNDVINnZqMm5NR0hzaGttckhVSzNsSmJONVdsNnplbUx4eWlwelNseGZMRWxzSkszQ3FFMVgraWJxbjlZcVJiV3hVN1crdHIwR3V3PT0ifX0BAJVUvQBsR5JGkfmmpkjRKmGx1CEQovuwixck1jwW6dwnC5YsDMARBjqpicv42DWEVMhcESy5uuGvt8CR7weVL2Twvt9sYhwZjrkGGRrFUbBABQ8h5FSmiLO1H21VlFU_zdLGfxmAVIytrxPN-an9vuSc2r8o8YetF1JAPtIHhcz5zkg99YTKNCQFRs4F3J3mBkZlzS7F7_ZATJkkYlE7avtHn-AWywkdRvgK9wiyo1bDUHt5k9Tx9isKrywifcPT8dkYvRO7NKgbjGPCx7O1c26v0zBqwbvyWqtpSMWMdB7i4R6pQwFfk4NHVTWfx48YhlPJf6u1acX4YxT1wWuaJ7bgfiQO8IAvwiEW5q979EczWDsrPsNln0A3C7E502DHFIwrx38aSoP8zGSgOiKZqUtyshJdXoWO-uCDE1UrXA6XnIM9EmAg3xlqhF2nliNpcd2Dzo9OuaT5QsRKKEVVfjAYgUyjSG-shzsiLnb7XDFLVJ9agk2Ya0fS-8lkASqi9xo3emvxut3x6zoT_Fsw3h1Efu_XWqI-lDezLTRs9xBxqsTPG3Colxkajr9T_seTlo14hmYIWIEgq0nYSRDfpNS_kNfLr_fXfWb5oKLi-hSoiCOcnbStrwoifzMuXmPcw3bjrCrFt5DPo3Z0I4Fc4VvOsqtfbMdKxEE4kyGO7X-onPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAAEgEAAAAAAAANnAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DkNoYWluSWQENTYMU291cmNlCGF0ZW0UQ29udGVudC1JZIABNmExNDkyNjk5Njc5YmZmNzBlOThhMDEwMDVjNDVjNDIyZDZhZjdiN2UwM2Q5OTc2YTU2YjMxN2VhZjgyZGRjYxxDb250ZW50LURpZ2VzdIABNmExNDkyNjk5Njc5YmZmNzBlOThhMDEwMDVjNDVjNDIyZDZhZjdiN2UwM2Q5OTc2YTU2YjMxN2VhZjgyZGRjYxxDb250ZW50LUF1dGhvciRmbG9yZW5jaWFhdWJyZXl3djkAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4N2Y5YTQ0OTE0YjFmYWFjMjY5MWIxMDg5ZDY2NjYwNzE3M2JiNjcxZVwiLFwidHNcIjoxNjkxNDYwNjIyNjQwLFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJmbG9yZW5jaWFhdWJyZXl3djlcIixcInRpdGxlXCI6XCJUaGUgSW1wb3J0YW5jZSBvZiBQaGlsb3NvcGh5XCIsXCJib2R5XCI6XCJEZWRpY2F0ZWQgZWZmb3J0IEluIGZpbmUgc3R5bGVcIn0iLCJkaWdlc3QiOiI2YTE0OTI2OTk2NzliZmY3MGU5OGEwMTAwNWM0NWM0MjJkNmFmN2I3ZTAzZDk5NzZhNTZiMzE3ZWFmODJkZGNjIiwic2lnbmF0dXJlIjoiMHg5NzJmODNhMTQxYzMxNjJkMzY1NTM1NzYyNjhlYzFlYmVhZTYwNjllYTc1OGExODhlNGE2YTgyMjY2MThhNGY3NTE2NmQwZjM0MzRhZTAyNzcyYTMyNmM4MGZkYWY0MjUzYThiNTY1MmYyMzgxYjljYThhZDQxMWJjNzNhNGM0MyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaWVDR0FEK2IrNGNBelBZSE44WlAzUXRua01CbUQrYXJYblc1WFM1c2JFQ1hxSDNTZWhhZFJraTJicExjRjdLR1ZrZDFYMXZYRk5SRFE0NFprcEJEWUE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4N2Y5YTQ0OTE0YjFmYWFjMjY5MWIxMDg5ZDY2NjYwNzE3M2JiNjcxZSIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDBlYTAzM2YyOGRhZGZjYzhmZGUyZmVjY2EwYWQ2NDg0NWQyOTVjZTViNjhjOGNmZmJhYTM1YWFhMjFjZjU2OGYwZDM5NWNjNzEwYTZiMjA1MDAxNjI4ZDg0N2E1MTZiZWRjOWY0NzNiYjRjODcyZTIxZGM4Y2RmNjZhNTQwNTJmMWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWllQ0dBRCtiKzRjQXpQWUhOOFpQM1F0bmtNQm1EK2FyWG5XNVhTNXNiRUNYcUgzU2VoYWRSa2kyYnBMY0Y3S0dWa2QxWDF2WEZOUkRRNDRaa3BCRFlBPT0ifX0BAHhwab4RTCdYnb5NrB2DLmZdf6CQuMKgJ8Bvzo1eucmTy8IT9II8KABKKWWUWkvx6QuUHNKSLp6oH-HG-N8coh3fWdg0EfjVWzQ43lzpHE39eFgKpa5JSXVOb1LBrtJbMcsRvGHyfeCBxaPPGWMDCUovwHGV_hm64xDrQbbu3L80VB7VKVLaYya_SCWtSGczE1mJ0LITEvG1Jjg9alC9nOYOUao7nwjkj06c91TJiecQbPNj_2-CBovXbE4Fl_jXrCARtc26hVYxyTQjdi5kYwcugB65JNA7YVz5ix8BdUy4BHzlOqnuaVHu6Sz4EUhY3sOEeBxW2PG7XDyY2uZqZuOxPEQhskIjB4ff9zqtQJ2zkSgfQI0ak0G4ncssa1wWKLnR2WvC14yX40r8jFSXBP2qalP4rh4-It-LjiEdFqOoMSSYC1D5aOp0SpjeTdMQENEgaFzmvu53Xpz9yBLnk42VCVxmS-9niQEtHrmoOESzzmuy9XdCEx3Ki-2-MrhESMHt4MVpS2AwSXPfyvdArXh2SeM8aSiLJFFR__bz50_OdUdP5ebW8j2bZY92omNL_7Som7MTq7WERHHLcolwI_j4c9v3_80fHnbfj1TJ5DLankQhyzjWCdI5td5X6DCd__yAY7lC0QkpbMy1sJQObodiiIHL2SiuwULYemZDCnibnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABYzYxZGI2ZGVhMzFlMzY5N2JlYTkwNGJhYmI5N2QyYTI4NTc3NDJlYTE1NWM4YWJhOWMyNzZlMDM5MjBkODI5NxxDb250ZW50LURpZ2VzdIABYzYxZGI2ZGVhMzFlMzY5N2JlYTkwNGJhYmI5N2QyYTI4NTc3NDJlYTE1NWM4YWJhOWMyNzZlMDM5MjBkODI5NxxDb250ZW50LUF1dGhvchhwdXJ4ZWd1dmFocGEOQ2hhaW5JZAQ1NgB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg0Yjk2ZWQ5NTlkMGMxZjJiZTQzNWU2YjM2OWM3ZTMyYmM4MWViNzRiXCIsXCJ0c1wiOjE2OTE0NjA2MjIxNzAsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcInB1cnhlZ3V2YWhwYVwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiYzYxZGI2ZGVhMzFlMzY5N2JlYTkwNGJhYmI5N2QyYTI4NTc3NDJlYTE1NWM4YWJhOWMyNzZlMDM5MjBkODI5NyIsInNpZ25hdHVyZSI6IjB4ZGZlY2I1NTgzMzAzMDYyNmRlMzdkZjY3OGM2NzdhYjZmOWU4NzJhNjE1ZWQ0M2E3ODk1ZTM5MzFiMzQwMDJmOWRiYmRlOGUwNGQ0NWM1NWQzM2E4YjgyMDM0NzQwYjE0NjcwODIxNzcyOTMyN2UyNTA1MTFhNDlhNzU5NzBkNDciLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRURBc1pQTFF6dUhHWFdKdmhabFkyN2NqMUs4RHpRMUZqMG9HT1BUTmMvV00raTMwT2hNREtZTVZDQzd0bG1uZ0R4RllWbGw2V0MxUzVwOVZ4NzMvZjl3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDRiOTZlZDk1OWQwYzFmMmJlNDM1ZTZiMzY5YzdlMzJiYzgxZWI3NGIiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHgzNzBiMWVhODcxZGIxYTQ5ZGIyY2NkNWE4MGExNTdjYWNlZTExNDc4ZDNjZTUzNjBkMTU2ZmM4OGVjNTU2Zjc0MTRjYWZkZjBmYWY3NmI2NjI3NDA4NDUzYmYzYjJjMmZkNzViODgxM2NmNDdiZTFhMDQ1ODVmOTk2ZWNmYTVlOTFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRURBc1pQTFF6dUhHWFdKdmhabFkyN2NqMUs4RHpRMUZqMG9HT1BUTmMvV00raTMwT2hNREtZTVZDQzd0bG1uZ0R4RllWbGw2V0MxUzVwOVZ4NzMvZjl3PT0ifX0BAER-LYgedGTQzG5EBqXOQfAGhWyTGp1DbT-e0-C6fTWfhMR1KJ17PYDkXy7KYI5Tfxqf55IKNuFOFC9-lBELG7qNrfRQtZuY0GaephLrTJJyAl6fqRKDWcLwi_8ZoEG66Z5wYsYGPfQXBiY71U5XhdpA9RST0EhVC6wxf9gUCSj_I1buaxgRwOAtCjzWeQTHtFDgEqnO8FSheoqJxfVy0d_dSXoUUtn6A6sRW4FzxVEZUJz6uagmZNuWk4M3jHygIlWe6fEYrqI_O3JvufZX3hDEtkBdGCvK807dnqKyrtkpNxUQ8-_0ubTvOmVHf_PZiO1_NFTyK9fXI-qcNCzIMb63BRYZzaqrjV-IPQ4kgBVkV_Rd8zJmWtLQaC6vU4mZtR4vMQCuIyqWhKCU2My58UQGJ6TUVj-JLqNRTwYy6QOKl_MsDIXiP8H7_6AGBwM8x9FZvY2G00NBFTlrXU5MYaT6IcVaysRLNtMWtRT17PXb83xA1nojwEkbtZP4sCis99Vda-s0469Lie364AYYaRj7Juiyg-oSIbv4PbD0dJilDQBGdf450kV-Y-Orn_WO0n1i74yg4fv0lR1_FB0siQeihMqeKk4fsfTn0v6yg0frD-dIIOqqpEQ1alm0DuSQIAZDIInZfvbIqGwyY3Sc0swBqGcLV4EpYr_WaNYCCQ5ynPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAggEAAAAAAAAP_AUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAATg4ZTIwZDBkYmJiYzhiOGU4YjU2OTY2MDlkNTk4Nzk4Nzk3NWM3NTk5N2EzZTNiMzgyMTRhODMwNjM0ZDUwM2YcQ29udGVudC1EaWdlc3SAATg4ZTIwZDBkYmJiYzhiOGU4YjU2OTY2MDlkNTk4Nzk4Nzk3NWM3NTk5N2EzZTNiMzgyMTRhODMwNjM0ZDUwM2YcQ29udGVudC1BdXRob3Iicmp1aXpmZm9mdmlraWVhOTQOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDc4OTRmNWYyMWRmMjljZDlmOGVjYzhiZjRhNDMxZGM5NmY4NjMwM2JcIixcInRzXCI6MTY5MTQ2MDYyMzE4NyxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwicmp1aXpmZm9mdmlraWVhOTRcIixcInRhcmdldFwiOlwiMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZVwiLFwidGl0bGVcIjpcIkZsYXBweU1vb25iaXJkXCIsXCJib2R5XCI6XCJSZXdhcmRpbmcgZ2FtZS4gSSB3b24gc29tZXRoaW5nIG9mIHZhbHVlIGhlcmVcIn0iLCJkaWdlc3QiOiI4OGUyMGQwZGJiYmM4YjhlOGI1Njk2NjA5ZDU5ODc5ODc5NzVjNzU5OTdhM2UzYjM4MjE0YTgzMDYzNGQ1MDNmIiwic2lnbmF0dXJlIjoiMHhiYjBmMTJiNDE0ODE2ZWYyNWY4NzAxMDVlODc4MDc1MmE3ZGEwZjFjOGRmNmE1NjkxZTBlYjE5ZWM0NjYyZjYzOTA4MzJhODdhNzgzYzk4NzA3MTQzMzUyZmI3MDE5MzFkYWQ4ZmRjODA4OGM0YjY0MDdhY2M5NTIxM2VmNGEyMCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFbWYwUXdFejBUemFkdnNKd0hxVm42RHhxWU0vcE00ZU9YWEJLOG95SW0wRDZBMHF5cGQ2SG9NWVNNTmJoYWtrUnRMYXJ5dWZhakMySEdXZnJEOExRTVE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4Nzg5NGY1ZjIxZGYyOWNkOWY4ZWNjOGJmNGE0MzFkYzk2Zjg2MzAzYiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGEzODMxN2VjODBkNTc2MTVlNDMzM2E0ZjY3NDllY2NmMjRjNjhiMzQ4ZDNkOGU1MDg1MzU0MWZmYmJmY2M4NDM1ODY1MzA5YWFiMjFhMGQ1NmYzZmM4ZDQzOWNmMGJkN2Y2MDNmYmZmZTM2OThiZDMyMmI3OGM2ZDJmOWZkMTQyMWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFbWYwUXdFejBUemFkdnNKd0hxVm42RHhxWU0vcE00ZU9YWEJLOG95SW0wRDZBMHF5cGQ2SG9NWVNNTmJoYWtrUnRMYXJ5dWZhakMySEdXZnJEOExRTVE9PSJ9fQEAGixt6jqbfYhMDZuaEb-iQnO244jLCtg5ByP6kKS2gJzDS7kcKwwx9Kq1wnw8lU_mBlJbtALCsSjvroQKsmnHVR4CNtiBCiAJiBg_nVxLPNsh5aJm1nTHAil3eKeD0Sj6rBKwOAPgRcse-J3i4evxRZ5SoviWCBxdyW2LTD4yMCBqbyjX9b05xfXFWbRInsil5ODU49L3Cp2dN4dy0uWYS3xgvOv9dS7FcmGH_PtTMCAdn_EYJ0ToaBHnWLt_FCn1yQ3UeKyPXCao4tmLVsLCjZCCEsbZD5qZyXg_FNsEASyhsLS4pYS0aneJc2FRG4Iss0-efgLHDYphaLVALLSelXn-DTlGunwaHZO_bv23v4VG0ehkHOds4M6zZB6KVJFwCrmCTQJ-mGlw4I3UVCU7Dxu0xiN2LEfX0nb_Dqd8TVVnjXPLeyxrtUBdXXtVLjjB5rKdGz3F8pb_05AI0vHTUqSOwnCuu02QgKvMilLcshscmlvUfpTfmh-mHGBVFZGN-H6KvcOtcR6IuEOoUkavZ23jqwOUvhOGUiXwJqQFsDCtcMBNy8Btk8P3Nw11hHUSakrr3dA_6YgrLFhhP0DT72sXO6kByCZpWQ0sa65wLk1GPShAyuF3T9ei2jtlFBDghNAm-0-VXZXi6vvmEFx3GH4x4wQr-_eb2tZSAnyQ4HGc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAACAAQAAAAAAAA_4BRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABMDIwZWUyNjZkYjVmZmI1Zjg2ODMyMWU3NzVlNTA5NzJkOTA2MWM2OWI0NDRhMzZkNDg3NGI5MmNhZGE4ZDExMhxDb250ZW50LURpZ2VzdIABMDIwZWUyNjZkYjVmZmI1Zjg2ODMyMWU3NzVlNTA5NzJkOTA2MWM2OWI0NDRhMzZkNDg3NGI5MmNhZGE4ZDExMhxDb250ZW50LUF1dGhvch50Z3Zha3hnenJiZmhiMzkOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDMxMWI0OTBhOWFkYmZlMDkxZDYxYjkxNmQyYTA0ZTE5ZWI3NTM1MWJcIixcInRzXCI6MTY5MTQ2MDYyMjc5MCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwidGd2YWt4Z3pyYmZoYjM5XCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiIwMjBlZTI2NmRiNWZmYjVmODY4MzIxZTc3NWU1MDk3MmQ5MDYxYzY5YjQ0NGEzNmQ0ODc0YjkyY2FkYThkMTEyIiwic2lnbmF0dXJlIjoiMHg1MzkyNmExYmMxZjAyNTg0YWRlNWQ3YmY0ZjMwNDRjMGZkYzBlYzA3NDk0NzdiNzlmZDZjMGIzZDUyNmUzNjBkNWZmMTE0MGFlMDI4M2QxMGM4OTY4MDNkMjQzMGM0YmQzZDM1MzBmYzdmYWZjMjExYzVlZWRmNjI5ZTViMTY5MiIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFeUg1YnBxSk00bjYrOFByVkM1SzU1KzlqWUg1Y0RSMmpDN1l0QnRpVzEwdFlzOXFJQ0MrVXdTSnJnUFJ3K2JkWTlUdTVQV3N2NWhQbDA1QUdCalIzYVE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4MzExYjQ5MGE5YWRiZmUwOTFkNjFiOTE2ZDJhMDRlMTllYjc1MzUxYiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDJjODIzZDM2Zjc1OTI1NDhlYzIwMjFmNWY5MzI5YjgwYmRjYTE5NzY3Y2E3M2ZiMzRkZDA0NThkZWNmNjA2NGU0ODQ2NTVlMzdhNjI5NmMzNzIyZjU0MDA2MmIyOGZkYTJjZjViYjQzZjI5ZWI3NzcyOGI1MjVkMWRhMDQ4Y2M1MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFeUg1YnBxSk00bjYrOFByVkM1SzU1KzlqWUg1Y0RSMmpDN1l0QnRpVzEwdFlzOXFJQ0MrVXdTSnJnUFJ3K2JkWTlUdTVQV3N2NWhQbDA1QUdCalIzYVE9PSJ9fQEAVe22xpr0te5AkkiA8f50iTw6qBGEUPe2Sm2vrdXcthcfV7pL8C27q2ON0m5CYzs137yK3kfFXxpkmEEzV1Ip17EwuNuofbdiw5uPm3HLp16N2q5uThzvz33xtv9AvcyYtb85rV9iuHdmGLv5BGZD9S333EragGxt9GTiaT-VCmDNP0g9D-FcBCJsnIBRV4ixTFJ95UBMTIXVYD6FiDh5HzeU884BMcHeo_etERYxRgT8qQbRv3um5-Cs0GYEeK7_CY3xNTrLXH4xs9QztMWzH9J9jauyPom6hH3ZhKToISrUY_cQrVeXYaVtVcaxFPEam4G4G-LNw1Y-xC6ccEOLgbxZyFk9s6F3RM7NyB_fhKHhBnKjtj6cIjVuRakTnXgi-S1p82Tr1SQFFq90HKsBdnvCAGeg4w4imxeYrRMqb9IOuHq11PLc5b4Rwzm3PUeDQ924HWcp_PKAsM9xFiBa4BE4P89mlAsK7hEF2vSqHt3vGrT-qyyM1BNS2b4_Nc5J9OijZlVrU1l_8FL7gve_p0Fw17ZoVYNQ5XiyQWyxfdlUQVwpKHvTkM9mOp64P-XIjM-VoxcaG00GvFVNTQjpASAA4_ATqt0W19hO6HnqJK6-1rYBLHu_vp46QL9oSplIud6sUu05rkyyl5a7IJ9d0CEQWDBwWMMrWSudsADSV3Oc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABMjMzNjNjNzlkYjc0ZWU3NjRmYWRjOTc4MjZmMzllYzhiZTk1ZDAxMTFhYmUwZGM0ZDQ1M2ZiOGMwY2QzNTU1YxxDb250ZW50LURpZ2VzdIABMjMzNjNjNzlkYjc0ZWU3NjRmYWRjOTc4MjZmMzllYzhiZTk1ZDAxMTFhYmUwZGM0ZDQ1M2ZiOGMwY2QzNTU1YxxDb250ZW50LUF1dGhvchh6M2JsbWs0M2R2d3AOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweGVjNTAyN2IwODgzNDQ3N2UxYWFhMGE5ZDZjYjA0ODBjNDMxY2M0OGNcIixcInRzXCI6MTY5MTQ2MDYyMjQ3NSxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiejNibG1rNDNkdndwXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiIyMzM2M2M3OWRiNzRlZTc2NGZhZGM5NzgyNmYzOWVjOGJlOTVkMDExMWFiZTBkYzRkNDUzZmI4YzBjZDM1NTVjIiwic2lnbmF0dXJlIjoiMHg2NDA3MjdhMDY3MGM4ODg3YTBlY2RkNGNiOGFlYzc3ZjYzMGQ4MGZiYmU2MTI2MzIxOGMyYjgxZjdmZTQ5ZTk3MDg4MjFlMTYzOWZjYjEyYWI2NjE2Mjg3MTQyZDkxMDgxNzE1MWNmMmQ0OGY4MTBmYjUwOWY1Yzc3ZmRhMjExNSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFMEo5VHBSczlCcWJsMkgreldzcDNYOHUxUnVVYkpNdWZ6NlRUVU9pSnpTNThhSElBaUFyMkI2emwwaElTWnRsV3VvWndTQWNlakRmTlgwUllTOGZsK1E9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4ZWM1MDI3YjA4ODM0NDc3ZTFhYWEwYTlkNmNiMDQ4MGM0MzFjYzQ4YyIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGNkMDVjODk3ODljMjZmYjgzMjFlY2RhMTVmMGU4MWI3YzYyYWQ3YTdiYzAxZmUzY2ZlNmVjYWJiODViM2M5N2UzNjg0MDBiYzEyN2RjMjcxNTVhNTExNmU0N2M5ODIxYzM3NThmNDI5OTJiZjQwNjliYzlmOTQ3YTkxMTFhOTNkMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFMEo5VHBSczlCcWJsMkgreldzcDNYOHUxUnVVYkpNdWZ6NlRUVU9pSnpTNThhSElBaUFyMkI2emwwaElTWnRsV3VvWndTQWNlakRmTlgwUllTOGZsK1E9PSJ9fQEAjS_ANDSJ9qPGYwfqRMdaCw3jgEN2Gi3vXRIOHCnwOBSr9tVwn9kF0uRmjFgDQWpupyxX0XInkS8VsnU28L2jwAsvwg48_byHq5Eic-0jarZJgb17km-g1If85F8AJ3oZnifrCr86dhSbKq9eyMHb32vLAT5pV6DLzMYgOMag5l35l3_f75CPwDJeuZauv31cM0IY98Wt7m5P_K0edrB_UaY6VmCBR7FiuzCXqsDd_wTY6ynYI11eP1p-hNgSIUvA-ObmIP9tkvdT57PSLi4NuTk3RlLSLkFEhImZGjQ_JUyVV72HuYa5txnjBQQQ-36YL2MGejSdmyJBOHBMiYvge_11_zdsH0u-kNpGRR1hITVgRWQ911IUE3kjAq-qPdlVsmajhwZ1MDGAEdt3j6yug1_x3GKwYljPe05KmkdWfj_bNtN-5Xur9FSGgnMydBCHu75RRGytjtcLxadyFxojb2vBTGSZiLNXodZ8Hn9oPWmeCsg7sDskN2EZXmJrNkDFmYs627oqo4vOSHIkIvzNCmPYeZBE0qvGNxRgj_Sr3DAVPOf4ss_YpapS29jcd_qiTlnthxj7WG0YhKrw98YhTPeypUzEXUyekrTgW6OWlUnRjlYMwfPyEAuCUDFcCBQXfFColRD0-R03Hv1YiiUGf57nnnNAsWyD00Imv0lDzkSc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABNDQ1ZjFiYjEyYmNiMGUyOTJjMmI2ODY0NWE4ZmZkOTJlMDg4NjY1ZGQ5MTQ1MzUxNzE1NDI2ZDRiMDMzNTdmMxxDb250ZW50LURpZ2VzdIABNDQ1ZjFiYjEyYmNiMGUyOTJjMmI2ODY0NWE4ZmZkOTJlMDg4NjY1ZGQ5MTQ1MzUxNzE1NDI2ZDRiMDMzNTdmMxxDb250ZW50LUF1dGhvchgxZXc4dnFoNW9wNTgOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg0NzY1NjBjYTIzM2Q1NGEwYzdiZDI4ZTIwMmNhNThmZDFiZWYyY2ZhXCIsXCJ0c1wiOjE2OTE0NjA2MjI0MDYsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjFldzh2cWg1b3A1OFwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiI0NDVmMWJiMTJiY2IwZTI5MmMyYjY4NjQ1YThmZmQ5MmUwODg2NjVkZDkxNDUzNTE3MTU0MjZkNGIwMzM1N2YzIiwic2lnbmF0dXJlIjoiMHhlMzQwZTdjNGJlOThjMGI5ZDFhMGY0MTZiN2MwZjZjMGQxNmIwYWY0ZDU5ZDA2NTBmMmEyNDUwYzlmMzczZmE3ZTJmNmMzYmIwZmY3NGQ5YzFmNmEzMGVmYzNlN2U5OWRmMjdiNzQ0MWQxMGNhNTE4YmY3NmFmNDFmZmU3NDVmMCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFZzBXZXVmSjlsVlIwbkI4UmphcTQ5Y1IvZS8zVC9tb3FrRmVUZVRwOC91MXdVMEhNYWZPQ0hiYXVQdnIxY2JQV25uc1NwRS9wRFNwaFNxM25qRGdIakE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NDc2NTYwY2EyMzNkNTRhMGM3YmQyOGUyMDJjYTU4ZmQxYmVmMmNmYSIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGRjYTM2Mzk2ZDU2YjYyOWM4YTllYzI2MmIyNjBjM2UzN2UxN2EwNjUyNDgwZmVmYTU1YjZjNjhjNzYyMGFiY2IwYThkYjU1NDU2ODU1NjQxY2FlOTQ4N2Y1MjQxNTFiZWU0MzU4NjNlNWFhMzJiNjYxNDVlNWQwMmNmNWI5YmIzMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWcwV2V1Zko5bFZSMG5COFJqYXE0OWNSL2UvM1QvbW9xa0ZlVGVUcDgvdTF3VTBITWFmT0NIYmF1UHZyMWNiUFdubnNTcEUvcERTcGhTcTNuakRnSGpBPT0ifX0BAF5tG_z6kTUSr0cm1CpC4QUD42yGABVMBxe5C1rRHTxzEe3yspvU5_PIY_ydnMRLIv3QbUUZ_GqOgd2QDiB2O-BzGtz4xqhNQAP62eEwcs0NbX9npyDvR5Xy9UMH5HI0XCQuNGyR12AxuB6J6dJxkLR18HKRGh_4sMN_VWq0zxEjexiuLkd1J0XwG5CwZPuC9tj2Cnj11P2KOluZY8X-vTFrXF3BKsJfx8oa8xwwo56863gxfkgDl3MkQJFE4r-l6if8KmRr0DBNlg8G_nLmVvyY0sOBkRf5W6wlV1Sf_8C3dJh0SjP0d5ijIyu2kL2j1PQyixUnLxz-ja7utT8fvB-2RITM1ddVrbgwv99cT1jk0nSKu_1qvYy8HyshiY6siSYrR5-8TgYIT6W72vcHqZjQATqfWg4P3uFkfx5bVVNvzc3U6ED9VZowhbdOciRxECiyeH3pljRPlVzQkyWf3m641gQaZ_6N60zOMtICO0rOkSDeB4eJvqQ8FTo67Fkntw0iQfclZI2l-WOGP4GlAfK2sk3_AkSAzXnEOEUGr05nw01XdHD9UjGukHdhSOGSTDFgY0A1kkxVX9SLG3H_ZfJ0yCfTZh-SNA9G5HMW_91RzMF5Mq4uGn-CxqOGhHMBq6w77EjS5cRGS8Y91d4RqCW-2hufD9Q_pKj4lUga1k5EnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABMTFlNTc1NGJkMmVhNzAzODhmZWQ3MzhkYjg3ZWU3NjRmZjNiNzY2ZjA2MzdhZGVjYTJhYjUyYWQzODUwMDBjMRxDb250ZW50LURpZ2VzdIABMTFlNTc1NGJkMmVhNzAzODhmZWQ3MzhkYjg3ZWU3NjRmZjNiNzY2ZjA2MzdhZGVjYTJhYjUyYWQzODUwMDBjMRxDb250ZW50LUF1dGhvchhlZm9qdXl5NGF2NncOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHgzYTAwNjVlYTI1NzA2MzA2OTUyOTI1NjI5MmQxOTQ0NmIwNTI2NDgwXCIsXCJ0c1wiOjE2OTE0NjA2MjI2MTMsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImVmb2p1eXk0YXY2d1wiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiMTFlNTc1NGJkMmVhNzAzODhmZWQ3MzhkYjg3ZWU3NjRmZjNiNzY2ZjA2MzdhZGVjYTJhYjUyYWQzODUwMDBjMSIsInNpZ25hdHVyZSI6IjB4NmIzOWM3NWE2NTJkY2RkY2MzOWI2ODRhMjE2NWQ4MDM2YjM3ZDVhMzEyNzU4Zjg2M2MyN2JlNDMxMTlmMDc1M2YzMmI0NTlhOTYwY2MyY2U4OWI0NGQ2OTQ1ZGRiMGUxZDMzZTQwZjQzMmJkZmNmYzdmMGRlYTgwZDQyMmQxMzUiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRU1RdVhEWmVoZzZ4dTVFYkIyVVhSMXNlTkdkYlVXbkQydnlSSVM5Tm42cmxLb0IzWGZSbkkyaDcybWhma2dPdlVkL0lBazRMdU5kTENoTHNKaFl1Zk53PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDNhMDA2NWVhMjU3MDYzMDY5NTI5MjU2MjkyZDE5NDQ2YjA1MjY0ODAiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg5MDNhZTI4MTc3YWY3OGIxY2Q2YTUzYmNiNDA2ZDZmMWE2YzVlYTljOTE3MWFjZGIyZjc0NWNmNzY3ZjUyYzAyMjY2YzIxNDYzZTM4Yjc3Yzk4NDA1MWQ0N2E3ZDI0NTE4NGI5MWEyYjM5ZjM2YTg2NzJlN2U1OGIxYTRmZTA0NjFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRU1RdVhEWmVoZzZ4dTVFYkIyVVhSMXNlTkdkYlVXbkQydnlSSVM5Tm42cmxLb0IzWGZSbkkyaDcybWhma2dPdlVkL0lBazRMdU5kTENoTHNKaFl1Zk53PT0ifX0BAAeYocX7Tk16BmNXXb4MzoM4xgy3COlpbKLqjP-BdHL6wGd7LecNcw7tsBs-sckTa05SVBzsnDR3t0S097ss7d3UxqqjAjf6QuR_K_UMD98mK3F1XLLWPe2WUR4SADtS8kXRRabLk45iecpe4i4hQf6R-IIw2kJKg3f54IU0pE-E0gNH-wG0YIaLfpZRLUGvkkWsHPh31bPott62_pYqeIuE9FDrlnhkUyBlkxjBVkiXe4vfduOyvQFacKOdmDtDhLcNEkKAqlW1AcdC0D-n3k9lmsTFwO2CtSZ_KSQjptGgrlK3cI_TR6jBU9c-jyh_WHYYqSDfUjxS5Cp1jFPmGDvuR8X3HiUO1vC5ipRIwB_skNV-YWNtTibdhQOeJhw8PzJbuXJ-c9UVxSn4gIr5erT1E4Ab_OKSQZQ2kOCUTw4AISSJHuKLMX1BWFagwoQumZ8BQWsjfu1x6kZwtuhrxe6GcZu9hg2QWC1sCZrgqOvJmPeYEvkP2eDPsC1Ae-YqGqrdVZmpPAWWk3OvzymtmkP2ieP3yUI3P7SiNOHKfHDQlc_cBKkFYyhj_ZOqGvundRm1KyMhaYW4EQ07mB3O2URqmT0uqiVRbTMhGeZ8mB1XmPVC3ERQa1k24ZoELn6BmcGfdtp8ISobfVYXE6CizI7xUcXIBtgvjX7LUpscpUTxnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtRGlnZXN0gAFkZjg2OWU5ZDhjYjg2ZTY0OTc5N2VkNjRlNjk3NDhhMmQyZWZkYjkzMmY2NTc5ZGUwZDdhY2JlZmJkYmZkY2EwHENvbnRlbnQtQXV0aG9yGGs2Mjk3MjcxMjk4cQ5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABZGY4NjllOWQ4Y2I4NmU2NDk3OTdlZDY0ZTY5NzQ4YTJkMmVmZGI5MzJmNjU3OWRlMGQ3YWNiZWZiZGJmZGNhMAB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg4ZDJhMzU2MWQ5OGNkMGJmYzUwNDY0NjQzNGY3OWJmMzM1NDRmOGQzXCIsXCJ0c1wiOjE2OTE0NjA2MjM1NjgsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIms2Mjk3MjcxMjk4cVwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiZGY4NjllOWQ4Y2I4NmU2NDk3OTdlZDY0ZTY5NzQ4YTJkMmVmZGI5MzJmNjU3OWRlMGQ3YWNiZWZiZGJmZGNhMCIsInNpZ25hdHVyZSI6IjB4YmU3NDljYTI2MmUyMjdiMjY2ZGVmZTU4OGU1Njk4NGQyOThjNzYwYmJlZTkwMWRmN2UyNzg2YjFmNDIwOWI3MWRiNDJkYjFmY2I4YWE4MDkxMDcwYTAzMDQ0MmM3ODk0NWUxNzhjMDkwYTUyZjViYjQ2NDU5OTgxMjJjNWZhNGIiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTJ6M3dPMlovMzZVL2VCY1hZRDRrd0E1Y1BPYTdJSHBQWXIraHNtdk9TQUczRldiOVQ2dnZvKy9VZ2hjV2RSTndldlBPSE9oKzM4aWl5a1lTZUxlbVd3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDhkMmEzNTYxZDk4Y2QwYmZjNTA0NjQ2NDM0Zjc5YmYzMzU0NGY4ZDMiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg1NTc2YWJhODg0YWZlOTQ4NGI3NDMwZmNjNWRhNTVlNWY2YzhlN2ZlZjZmNzk3MDQ3YjZjNGFiZWJjOGU3NDI5NmEwYWM3ZDg4YTI1NzZkZjFiN2EwZDQxNzFlZTRhNThlMWNhOTA3MGRkYjg4ZGY0ZDUzNjE5MzQ1OTIwODI2NDFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTJ6M3dPMlovMzZVL2VCY1hZRDRrd0E1Y1BPYTdJSHBQWXIraHNtdk9TQUczRldiOVQ2dnZvKy9VZ2hjV2RSTndldlBPSE9oKzM4aWl5a1lTZUxlbVd3PT0ifX0BACqKIykjdRZ7vVeH7oUdxMWH-OifIAKwKKcsMS1QLX5dJVfsutQyXfnJjYAK0VKxXTw5FKYEsYWYjgc7DZFL6WPVwWvMTcUA9Opmc1f7qtOwiU_4j7F8bRCpTdw8Wzx-WDX1-l35Brb24bEI-m2hV8ahMeP3DRb0lMRou22SOgzwC9E4I5vlEfak5ANSIdXznBbSs_ydGNnmnvrCwTRgBTuDVFNRX6FdV_V7DsaWumnDujmR0q6XNXwx79ZIp7x0eTvbUM0Ih0DqFPcerAZtlCNYVUdGpI3Ea9hMqiKQgjYKYi6SmwOcoq7D7WSNKXtDh6AavyFDje6SKBCWIZYh-mG3be4XUG8-niZoVgBuzdgSwXaSv_KgPOiQKH-kHK8eg1F5YqhXz3r6r42LbPpCZO1JuxaMqFK1pTRh_4jZ5PL5gjfbXjyEAApmdZf_UHZkSQ5mJ4xgBMBPSr-SXqOx3YcVIDBT_HhVaYXNT8mpsshLpo7nqir2nxdi7VROjvPZRTB3SF5T9z0JvN1_vuhNfVjTkLYWS_KfRduC3SAa5lMupv46lhMNXb4SC-Kmp3KcX7LoonkQ7Ee_qzjybeJCntpN4BMaRktf03UTU7CDhvsuxiPvDgLTBq0i3s_cuB2d2e0cN0kGgpfWxKnBhx8YgecXIXNoiM64pZNkfUpRRNjEnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAExMzgxNjQyZmEwZmVmOTE1ODZlYTIzMmU2MDEwMDcyODFmOGQ2NmU5ODBiYmE5NmEzNmYxMTMyODNjN2EwOTAxHENvbnRlbnQtRGlnZXN0gAExMzgxNjQyZmEwZmVmOTE1ODZlYTIzMmU2MDEwMDcyODFmOGQ2NmU5ODBiYmE5NmEzNmYxMTMyODNjN2EwOTAxHENvbnRlbnQtQXV0aG9yGGk3bnJsdWI2cXl2bQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHhmNTlkOTY1YTQ5ZjFlZmQxZTA2ZGVmZjUxOTRmZWE4OTQ1NzEwOWUwXCIsXCJ0c1wiOjE2OTE0NjA2MjMzNjEsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImk3bnJsdWI2cXl2bVwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiMTM4MTY0MmZhMGZlZjkxNTg2ZWEyMzJlNjAxMDA3MjgxZjhkNjZlOTgwYmJhOTZhMzZmMTEzMjgzYzdhMDkwMSIsInNpZ25hdHVyZSI6IjB4NGI5ZDgwMDlkOTk5ZDk4ZTE2OWM0OWVhZmM5YTljMWU1YTRlYThjNzM0YWIzOTMzMzUyZTM1YWM0MGM2MDkyOTc2ZDQ0NGM4NjEzNzNjY2JjMmZkMTk3NzNjNzczYjMxMzhlMTcyZmQyOWUxMTQ5MTUwZjVjMWNkNzdmNWQ5MGMiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUZMOVppSHM2YU5ram8xUGZENlEzempUZDNaWXRYaEZnaldiK1hoRUFPU3VnWEVLaG9HbnExTlZ6cVdCUmtoUzBlUVhOU2lDNFNaWEMreWdIZGZUYlNBPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGY1OWQ5NjVhNDlmMWVmZDFlMDZkZWZmNTE5NGZlYTg5NDU3MTA5ZTAiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHhmMTAxYTM2YzQyY2VkYWRiYTY5ZDgxODFiNmY3Zjk4Y2E3YTk1ZmNmYmJkZTdiODhhOWMyNWFlODU1YTllMDIwNjY2MjNkODVlN2FkZDI1NTFmNGViZDAzMzE1MTQxMTAzMWEwYzdiYTEyMGE1MGFkMDQyYWNjM2YyOTZmYTY1NzFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUZMOVppSHM2YU5ram8xUGZENlEzempUZDNaWXRYaEZnaldiK1hoRUFPU3VnWEVLaG9HbnExTlZ6cVdCUmtoUzBlUVhOU2lDNFNaWEMreWdIZGZUYlNBPT0ifX0BAJIV9ru-TGGcmlue53pB48ubXZH_Vr_DLruV4_hsFH4oZp58ukQk0Djvp6Rp_ek3UFurRO0Zd5knd-ZYPdqSnscOQmC7IU4-RALBvKPn8Qe35gg_EvBPiT542qbvY6Us9H0atkuVU78coX8U07LuOg9OUXInA6wJHqmATDSzHCfRQTHqTkZtppPhZMJZ4xvvSAU1bzpIxRA40bnARhIFnplaf1Kjv_NRX_WXl9LMbWvHz_bKa1JyMAoxaIMh8Lp_u_qr2OZXh-i7_dEClCbjsXurFoCOexZVEFaRtVLMm9c5jK4I4Q1f75KEkL-bXuEZVRKDhVgYimsjVD8Lpje16sqhg9AHqRFOJ5ahkXLxYaske-wMUMNaW48O3H0ylCqOacT9eCaNr5Ywc5oDlpFUk0nvdOVqvCTc-ybgiDfxmwykOIVvyYOHFQsUOgs_VuZEb7QsRojVkn_8sPbJ1QKMhy6ZWQN_xc3MVY-580juS-TOPZd1PAtW-2AjezkEeGdBW6J_U1KSXREUylLXczT1RP02mZp3BklCLqNWz1SmmiHRCGb4Ukl-7LKdpeLG2EvgNPOuZKcvaeUKzv0sZ4QHu-FrxCuJNupM6vAJNRCTfhAfn4nVmPNRCuFsC2QqXJkIMVfYp3hLX35HV3PiZ1c6OlbQ5tzVeVJwCuwgf85EhCfqnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAADAEAAAAAAAANkAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtQXV0aG9yGHp1dXBta2JuZXBudQ5DaGFpbklkBDU2DFNvdXJjZQhhdGVtFENvbnRlbnQtSWSAATk2MjIzMzVlNGEyZmQ4ZDZkMzM5ZmM4YzBlMzRjN2I1NWI4ODM0NzM4NjI4NDM5ZjFlYzEyYjRhZTkwYmVmNTEcQ29udGVudC1EaWdlc3SAATk2MjIzMzVlNGEyZmQ4ZDZkMzM5ZmM4YzBlMzRjN2I1NWI4ODM0NzM4NjI4NDM5ZjFlYzEyYjRhZTkwYmVmNTEAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4MmQ3ZDhjOWYzMWE4OWQ5MjQ4ZjY2MjkzOTM2N2M4OTY1NzBmZTg0OFwiLFwidHNcIjoxNjkxNDYwNjIzNjQ1LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJ6dXVwbWtibmVwbnVcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiOTYyMjMzNWU0YTJmZDhkNmQzMzlmYzhjMGUzNGM3YjU1Yjg4MzQ3Mzg2Mjg0MzlmMWVjMTJiNGFlOTBiZWY1MSIsInNpZ25hdHVyZSI6IjB4NjIxODY5YjQ5YjkwZjcyYzlmYzQyZGU3MTMyMTJhYmFiMDc3Mzc2MzA4OTA4ZmFjMjMxMjQwNmEyMWU3MzFmY2RkYzNjYjhkMDg1NTkxYmRiZDU0NWQyNzYyOWJlY2Y2NTJlNTMyZWEwODk0ZjIzM2Q2MWEwZmZmNGJiYzRlMzIiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVJ0MEVUQVNrVlN6U1BEWXFDOC9jeEpINDFmbEJpQnFqdUJuZGpYbmJZbEdiTUw5SVdIK3B4M25veXZ6a2RKSkVNbHJXRzNEVHdRNHd0SFlaZ2Y0aURnPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDJkN2Q4YzlmMzFhODlkOTI0OGY2NjI5MzkzNjdjODk2NTcwZmU4NDgiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg1MzBjMmM1NTVhNzZiNjBkOWM0ZmY1ZTJjMzI0NWFlMjEyZWE5MjU1OTRkMDZlYmNhNWRhZThhMTg2MTJkYWZhMmY3MzA0ZjU3NjcxMzMzNzg5NmUwMzNlMDNiZWM4OTQ4MTZhYWYxNGJkNjYwNjE0NDUxMmM2NmU3NzJkNzNkNjFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVSdDBFVEFTa1ZTelNQRFlxQzgvY3hKSDQxZmxCaUJxanVCbmRqWG5iWWxHYk1MOUlXSCtweDNub3l2emtkSkpFTWxyV0czRFR3UTR3dEhZWmdmNGlEZz09In19AQBePN4annyUzab45W_nr9HokFZKBc2RdXXnJeSh9LX2tvUTTdyXFSWiGf9TNeKzvZvFmddjiHlHG2l0kIbzUBoZwY6cfN2RvVviW1VqnS-Xwm7uoJb-CrDHE5qj3rG8vZcwMvC0lziU-R21RIaO7Qw8Mq8_l8q699HIr5FRqsiC2OESp9bRTURCHK0njQ2sMox--XDuDAzfVpSj1gH0PA9s0a8gmjCMHGCpBZXUtyURfUYs405fpju4YpB0An_lWe8SID1rW2oypd-HSObwEHJEVWGNFymZNZWhoKLHG4dU0ChNWOIJCO8BJfeJVNJJkvY1NKOJDa_sVKJUoCcUdAUOyZNpue2vulivrpYuvyd0URsCnWZMmrqZwFDpYpJixnYDMO7R8VrvudTzeCz93zbcwOFJi5qNi0ALAp8lvN8O-BVKicHm3mpV9fmxVWF1ij8w3b8MZO6aBr0L3wTA8oqkIhc3igyXr9n_9FstHdmoHUZy7v7S79ukECJexpakCMiJVMcZNxbb2Mc6QPdC1zDOpacuDGtLGrVJlPEGk2R5AcJhcaf_B3Jyne4weV7_m0lMtfhsljegrJgj9nPJOAXihebBlZjkGemjRmo6mZvpxNPowxE4_j09MqsOogfZNVu1h9d3NrPmEkmXGjM3YUUgrRGvg6RFgTZ2vk_zAPRd15z4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAH4BAAAAAAAAD_QFGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBxDb250ZW50LUF1dGhvcho4NDY5MjgyNjY2MDYxDkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAE0NTM3ODRjZDY0MWYzMWU1OTI4ZmY5MDkyNzRlZTE5NjM0NmJlNTAxZThlMmZiZGI1YzcxZWFkMDk3Yjc2YjNlHENvbnRlbnQtRGlnZXN0gAE0NTM3ODRjZDY0MWYzMWU1OTI4ZmY5MDkyNzRlZTE5NjM0NmJlNTAxZThlMmZiZGI1YzcxZWFkMDk3Yjc2YjNlAHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDcxNzhmODgzMDI5NzhlMWExMjMyMGNjZTU2ODZjYzFhMTYwODJkMGRcIixcInRzXCI6MTY5MTQ2MDYyMzY3NixcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiODQ2OTI4MjY2NjA2MVwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiNDUzNzg0Y2Q2NDFmMzFlNTkyOGZmOTA5Mjc0ZWUxOTYzNDZiZTUwMWU4ZTJmYmRiNWM3MWVhZDA5N2I3NmIzZSIsInNpZ25hdHVyZSI6IjB4NDdhNmVmNjFjNDU0NjA4OTk2YzJiMDYzYWY4MGZhODBmNDVjZWVlMGJhYmRjNTBjYTk0MjY4ODlmOWI1NWU2MjAzZGMwM2MyNzY5MzE1ODllNzFmMjQzMWYwNzU0MWZhOWE2ZmMyNWU5NDQ4NDViNTAzYTVlOTQwYjJkNWVjNmIiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXdJbW1pcUNzdXdMMHV0MndJNHZEejA2SklYSi9acTdNUUhLT3JFV3dWSE1FS3ZhVzBiRXArT2h2eGtwOENoUStGTHd0Zk1sTndKNDg4aXZNVlVIRWtRPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDcxNzhmODgzMDI5NzhlMWExMjMyMGNjZTU2ODZjYzFhMTYwODJkMGQiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHhkMjJiYzg4MjAzOWE0YjcxYWUwMWZkMjE1ZDk5ODNjYmFhY2NlMGI5YmQzYzM5OGVhYTNmOTdiZDFjOGUxYjc1NzhkNzU4N2VkNzVjMGQ3ZTBiMzhhODA1NjA2ZDEwZTJkZGRjOGYwMDQxNjBjNTZlNTAyY2IzZjEzMWVmODI0ZjFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXdJbW1pcUNzdXdMMHV0MndJNHZEejA2SklYSi9acTdNUUhLT3JFV3dWSE1FS3ZhVzBiRXArT2h2eGtwOENoUStGTHd0Zk1sTndKNDg4aXZNVlVIRWtRPT0ifX0BAGQvd7SMh2QAqiTW67RwRqza4qQeccXBPh4qQv7LCk5LVDcAmm9j8C1nTcn0l5e5FCEVQ-hZKl6YFAgb-0DSaeEPOxJ_HcQPmrFbDKkc8lUhxV6Czg7txyAJH8NvUsECF1YFl6kgTXAh8mCyPe8iji1DLYJMzFEqrECWIoctBw2fcYiI99dLUwTMnIy3vUN5DmlWpPaW-_ooLA1NDAUDALFFnVFeZbef54JidQ1iMxhco3hFZU1-I5ukcB_9qk-9o5mhXoLUiXKL8vDqXhavsvrfy_y-Cpo3o7czYY71wonFalrltjSxlDzqwR0QcZedxT3zLWKVEMpKOXAUVg_jUpkgio_YVMXUBRp6blK1zS7PUI4yvjzqsRKNCpICMjzRIlnemAv5ziZE3fjE6Jufn-bT-R8r3vIJsDR5CejDfgb94YgGCiOrJ4i2xogfBTwRz7HW3Iydw1XOYsFJsUpem9SYb5ORbbldnaz1IUHFIY__G9Rf-NkWgugj6OVZ8bqaP_MJmldRIemcyXCvia6HSAcwe5fyoSWRbpzavlBVVuO1XuEZ5JfKRGbaGlOwJYqrGAIBH4s9Yw9qOgWJ7aaZeARQiZOpIYSz7J2zqig2bItoyTJC_rV9W5pQ0Hxe5fNZT-rNu46afVSVq3RrtzdSwWWmGo6PevD4xveQy_lWnjSnnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtRGlnZXN0gAFjZWY5MDM4ZjI4NzM3OTc3YWJhODc0Yzc5MGE2YTQzNjQzMWEyMmMwOTZiN2Y5MmM3YWQxODM4Zjg4MjYzMGZiHENvbnRlbnQtQXV0aG9yGDd3bWFwbnEwbjE0bA5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABY2VmOTAzOGYyODczNzk3N2FiYTg3NGM3OTBhNmE0MzY0MzFhMjJjMDk2YjdmOTJjN2FkMTgzOGY4ODI2MzBmYgB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHhkNGE5ODA5ODIxMTJmNDQ2YTVjMjgwNzhiMGNiZWZhMzRhNmRlNjllXCIsXCJ0c1wiOjE2OTE0NjA2MjI4NTMsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjd3bWFwbnEwbjE0bFwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiY2VmOTAzOGYyODczNzk3N2FiYTg3NGM3OTBhNmE0MzY0MzFhMjJjMDk2YjdmOTJjN2FkMTgzOGY4ODI2MzBmYiIsInNpZ25hdHVyZSI6IjB4YzhiNTkyNTRhYjUxZWZmNzRkMzJlODU3M2FmNjViMDA1NzZhYzg0OGI5YTEwMjUxNTU2M2YxYjVjMTI0ZmViZDYwMjI4OWZmYTFiZTY3ZGEwODY5OGQ1YTUwNDE5NmM4M2UxYTgwN2ZlYmM4YTA2NDlkODhjNDFlMzE0ZjIyM2UiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXZ4U2FHQVloVzF0ZGZTUDdJZmxhbXd3UExGdnYzT2xrSEdGU2V5d0tLUko5Mm94Vkx3ZThqNTY0T0Iwb2F1SDBXcjJIRm5GK3AwNDVlc2NtNUVkcHR3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGQ0YTk4MDk4MjExMmY0NDZhNWMyODA3OGIwY2JlZmEzNGE2ZGU2OWUiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg4NzUwYjBmODIzMzUyNzY3YzFkYTEwN2I3ZmY3ZDk2YTYzMTgwZmExOTcxMjAzZDgxZTdkMjc4YTdmMDhlMmM3MzFmY2JlM2Q0ZTg0N2IwY2MxNjZkYTM1YTAyODM3NThkNTBhOGNmNzdjMjYxZDZkZGFmNzdiY2ZhM2RjYmExYjFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXZ4U2FHQVloVzF0ZGZTUDdJZmxhbXd3UExGdnYzT2xrSEdGU2V5d0tLUko5Mm94Vkx3ZThqNTY0T0Iwb2F1SDBXcjJIRm5GK3AwNDVlc2NtNUVkcHR3PT0ifX0BAEvksf3R-DXnHvsecVlMPdcBsF3WUFwlVRhDrXo_5mhQwMWzG0q4q9qUhjy3IUoRh1hnQTG0taHHqZl12x8VhDPUPiAsGY06fMqfAdGoyB8rqyudy8aPPhX_1_II8gP5xkh7yc8pJ48ZtF8jp2hQ0Ynw8NTfyUJg26YUlBOQ5zVFknFdidfRjbV4SrCXt8lpUHq6bfqGHU0iYQukownPIDzXCgok3Aqszo10ghBDuTAldmqHkMx-TqB-kDRn62kVppnmo0xvQodA_xcnIqZ1z4tjE1dJW0A38qPCAgYQ3UGsnawG0wDsUmEKz1hVbRFWdK5UNGN9E67Uysh0RSJpx4YJ5xoMS9_MLMaLUAkFF6Ghhx7HEDfEUoI1GVS12KtRwlG_qmx-FkdHxdac25rhvgvWkKNKFAbJH4XlSm9yLa-zdvfOZwFmziByoOM6dvOfc_sd-jbTicZKP9eiMdrP26Y9XlNk3iag7-TJENSUhJ4QCuoUgUdre-R9JknQ-ftwY63YyMKelmb8XofTXqGyL3uN0kdUUuDjlurzKm_A9BQLT8Cf6844VcpQR3K_hzNCo0DFEEPLgQRLjrJyO1_BSgOu_ghXWaEn16EbZRgVi3odWhZGns7yVfzGbJ_F2-VwxS1a7r5Yj4fQhNVDM3JtmXvxySh0Cqghjp7oHnbxPBFonPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtQXV0aG9yGGhsbmpvb3VxYmd5aA5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABMGEzY2VhNjIxZjUyMGM2NDlkZGI4Mzg0Y2ExOWQ1YTJjYjAwOWIyYjhlNzUwZjA0OTNlOTMwYmFkOGY4NjdlMRxDb250ZW50LURpZ2VzdIABMGEzY2VhNjIxZjUyMGM2NDlkZGI4Mzg0Y2ExOWQ1YTJjYjAwOWIyYjhlNzUwZjA0OTNlOTMwYmFkOGY4NjdlMQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg2YWY5NDViM2U0MjZlMmFhMjZjYmMzOTU2NjQ2ZTA4MDk5OTMzOWNlXCIsXCJ0c1wiOjE2OTE0NjA2MjI5NzQsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImhsbmpvb3VxYmd5aFwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiMGEzY2VhNjIxZjUyMGM2NDlkZGI4Mzg0Y2ExOWQ1YTJjYjAwOWIyYjhlNzUwZjA0OTNlOTMwYmFkOGY4NjdlMSIsInNpZ25hdHVyZSI6IjB4MzFiOWFlMjJjNWM3MzUyZjk2ZmU0ODM0OGU2MDk5OTkyNWU1ZDZkNjkzNDA3ZWIzZTQ4NmY3ZDdmZDA5ZGM3MDQ0NmU5OTY3MjA3NDE0ZjNjNzJmNDAyMWFjMzY0MGJmODg1NmEyYWE5YTgxNjZiNjYzYjBjYTY0NjRhNDdlNDUiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVNuNzNkYWN0MURFc0VPK1ZHNlQzMnk2c0FBalJjNm9SMW9zNlNyWGUyYVJYNllZVXhhRWdKZ1V0VmdlMjBKWHRzRTlreGJmSzl2bnptWWtYVENxWllnPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDZhZjk0NWIzZTQyNmUyYWEyNmNiYzM5NTY2NDZlMDgwOTk5MzM5Y2UiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHhlMWIxZTFlZjQ5YjMxYWEyMGE5ZWFmNzQxOGE5NjBjNjgyNGJkYWM2YjM1YzZiYjFhNzVmZDM1ODJkOGMxOWZhNWU0YWRhMDFjZjU1ODM2MGM2NDgxNTI4Y2E4Mzk1YjAyNTA4MzIyNzNkNTgwYWI4YTBlZmNiZWM5Njk2YzU5YTFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVNuNzNkYWN0MURFc0VPK1ZHNlQzMnk2c0FBalJjNm9SMW9zNlNyWGUyYVJYNllZVXhhRWdKZ1V0VmdlMjBKWHRzRTlreGJmSzl2bnptWWtYVENxWllnPT0ifX0BABpCO_NC8mLOdI46arZ0-STrdU4zWKHwwnXZ1ZFeq56Y7FBR30QUFCCotKXPeV1XGzXWCcLbeteuJlQm7s_4aJQ_wOLwjxLGIqd8zG2ZteJYabA7OOEsrBFzDUbU5w_K5y5PW-KtwTYmzL3G701UvAHavp_8wA-qtbvNn1eTsqhSl8fqJAHQox6Yp5Qkp0H-2QuIOXeU_fapIFV5Ht2XurHXy9map33ivQqTMQt7HgsRJtWLwlhN9Y_ewTErNQLqdhtP5g0A96KpfCg9Lo6uYgcsVfnLW7uvrJpctTya5ukCThmsZVaTr7pny2y7cEczvvOIbug1LmUYsrtnKni9t5mJHQWlfsHPd0MdvfVv1byh2CsvBDhXzL6eYmXzZ5VZlPqFsfp0Srxhg0t_u3Mxqh4Hq4iB_o7kx4WqadQuue12s_QN97c0KZzVbxvxstQ-moAZ-jVQ7_JXLb3uCGTX22sKISYgov8VF3YS82T0xtB8zMdGjSb0NZE8D5zu8xjPWsvyDNWVPkwyvYtIdfKW2eQK7AdLg76OkPMcxNOno8sHQM2V7OGPP5opk_NRJTSnx_CgMdxdji_oXArWWWvLXMY-yBru1lQq7IDkXPU3hSyhww7oHFclUCOnDIMlHX9-slwtYW4Db89s-kiUsyxL8LBX3vW2j16eIzQ16qo_L6BPnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAEwZTQzM2VlZDM2ZDNmYzBhMjJmZjNmNDgyMTg0NTNhM2EwYjYwMTJkZGU2MjgxNWRhNjJlMzEwODU3ZTIyNDlhHENvbnRlbnQtRGlnZXN0gAEwZTQzM2VlZDM2ZDNmYzBhMjJmZjNmNDgyMTg0NTNhM2EwYjYwMTJkZGU2MjgxNWRhNjJlMzEwODU3ZTIyNDlhHENvbnRlbnQtQXV0aG9yGGZvdnVleXA0cm1tYgB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHhmMTcwMTg3Yzk4NTMwOGRkZTMwN2ZjODdjMmQzNTU4ZjZmNmNlMTQwXCIsXCJ0c1wiOjE2OTE0NjA2MjI5NTIsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImZvdnVleXA0cm1tYlwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiMGU0MzNlZWQzNmQzZmMwYTIyZmYzZjQ4MjE4NDUzYTNhMGI2MDEyZGRlNjI4MTVkYTYyZTMxMDg1N2UyMjQ5YSIsInNpZ25hdHVyZSI6IjB4MmJiMTk1N2Q0MmUxNzgwNzA4YzFkMDRhNjg0OGY2YjU2YzcxYzJmZGI1MDY5MjVmMDNmNWM4ZDVkZjQ4M2Q1NjBmZTk4ODhiNTc2ZTllZWRiNWE0Yzg1ODNmNjI5ZDk0Y2NhMTJmYjUxOGU0N2ViMjE1YmI4MTdhYjc3YmMyNWEiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTZwRGNSYXRnZHZCSHVGazYzRG1HRUw3emVWeEltSW0yeFUvd1NWTFZRZEhwQVExN0pUN2psRFhtL2RZdlNSb2NMcnNGVE1mRkxmMWtUUVlnZWVEMUF3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGYxNzAxODdjOTg1MzA4ZGRlMzA3ZmM4N2MyZDM1NThmNmY2Y2UxNDAiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg1Yjc3MWQ1YWQwNDZmZDFkOTEyN2RmOTc2YzY4NDQ2ZTA4Zjg4YTg0ZTFjODc1ZTE1ODljMTMxN2JlNzRlNGNiMzljNzM1OTYyZWM1OTk0NzljNWNhZDViODZmY2JiZGU3N2Q4MDRiNDFlMzZjNDUwNmFiYTEyNjM5NzI3YmQ2NzFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTZwRGNSYXRnZHZCSHVGazYzRG1HRUw3emVWeEltSW0yeFUvd1NWTFZRZEhwQVExN0pUN2psRFhtL2RZdlNSb2NMcnNGVE1mRkxmMWtUUVlnZWVEMUF3PT0ifX0BAIkNboJ9ZLi0IgofVN5eZBqya5mlAHCVfKbvfcz8HSRzir_PQtc6ZUbjJL5sFd4mp-OQcLDZSnUUc3LItV77_2Bwy94Bod2TAD1b8Vb1_p42LTtwWIlPBLvRL9sy6GHuD9NeIABdUszbYnFrSUV6sPPfJtG_iKPzwykUMNOqqLp70HJMpPLI0hlXSfxAg_GE-zgye77c18dw6TC0Q-08c3jjjJ45e9CZ9c90IzRLyXYePuehqdoJBXJi0re41ONQDDyTzsfDu7wNjXiAphT7DOWIJyvs14D_7LSD7U7jFATygl4GCkJQz6VU9wY3OvCbbUnwp0Ed9vD3iyAy_sxlCBdI4JPNja9cYt3sEXOFOpQDRZ9vMQB3k7ha6DQ6C9nZEcw-pqKCr3a_YcevEiCrYas7elyxrM0qcTTfBWBk4v8pgHwgOt0G73nhmeWXa2cc0T4Xy6luutMU3xLvar5IMDD4vYUIXRDLNeuGtnDLyylUYiX1TtUgdeaLuzuZK2-paVxi2gVp1IKpcpJEjGTQlMHVtXhqQeB9XLBrzT_Ar-LHujsLzt-2YCD1xkzC2KA2-kcDtc302VRNfT_qIqHmvnjaj5A81O65ivwx-TNk-ELdpeqob5JW296xmMySYhf5KZ-iapF7wN-83tWQmFTSz_EQLH75P9fiIiDeVm4zOH3nnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAAEgEAAAAAAAANnAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAAWEzZWZkZGJkOGQxNjcxMTYzOGUwMzQzOTEyMmQzMjk4OGM2NzIyNTZhODk1MmUzMDcxMTg4NzUxZTY3MDhiYjkcQ29udGVudC1EaWdlc3SAAWEzZWZkZGJkOGQxNjcxMTYzOGUwMzQzOTEyMmQzMjk4OGM2NzIyNTZhODk1MmUzMDcxMTg4NzUxZTY3MDhiYjkcQ29udGVudC1BdXRob3IaaGllbjI3MTEwMjQ2Ng5DaGFpbklkBDU2DFNvdXJjZRJjeWJlcnR1bmUAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4Nzg1YWE4M2E4ZDUwN2E2NzYyZjM0ZWM0MmY5MzU3YjhmYTYwMGQ0NFwiLFwidHNcIjoxNjkxNDYwNjI0MjM1LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJoaWVuMjcxMTAyNDY2XCIsXCJ0aXRsZVwiOlwiNjc2N1wiLFwiYm9keVwiOlwiNjc2XCJ9IiwiZGlnZXN0IjoiYTNlZmRkYmQ4ZDE2NzExNjM4ZTAzNDM5MTIyZDMyOTg4YzY3MjI1NmE4OTUyZTMwNzExODg3NTFlNjcwOGJiOSIsInNpZ25hdHVyZSI6IjB4Njk1NDA0YmJhNmJjMGVhYTM3OTcxN2MwMzRjOGYyZWI0ZmU2M2IwNTg5NmFjNGQwOTZkOTQxNTUxOTcwNTk2NTM4MDE0NzU1OWQxODljZjAwMDdiYmYyNWI3YzRkZTBjYWM2YWFmMzU5OWJiOTcwYmVkMWE3NzNiOTFhNWYyYzEiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXdUb3o5VDhjdE9iaE1saGdKK3dwaHpiTXlqbkFRdlM1K2dTb2ZvaWtPQ3ZibVd4akEzcTRxZEVzWEViVmRYanBZeGJtRHF0b0JHTytRKytNdDJOakxRPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDc4NWFhODNhOGQ1MDdhNjc2MmYzNGVjNDJmOTM1N2I4ZmE2MDBkNDQiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHhiOTRhNGRlMDcxMzk5ODYzYWMzMzczMjdkN2E1MmJhNjhmMmE3ZWM4Y2UwZjg4Zjc3NWQ4YWYwYzBmOTVjMTRmN2I0MjBjM2NjOGQzNTUzMjBiNjJiZGFiMGUxZjk4ZTAyMzY4N2IzYzBlYTE1NWVkNDE3MjFiOGI2ZjU0ZjM4ZTFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBJIGF1dGhvcml6ZSBDeWJlclR1bmUueHl6IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6ICBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFd1RvejlUOGN0T2JoTWxoZ0ord3BoemJNeWpuQVF2UzUrZ1NvZm9pa09DdmJtV3hqQTNxNHFkRXNYRWJWZFhqcFl4Ym1EcXRvQkdPK1ErK010Mk5qTFE9PSJ9fQEAP6QuvbRAOOGNUzGn7Ef_YJu6lY6nWT6lYYiqbiC5Yk9wK5zpLvdtbI6j4-1BVIvS_traTxw4KxsKRHms5Tkr3Bx1t9kNWiLrMOgmx6NnqTNdSM-WEsQlKl9t0-PXcuEAwjcmX8JUgV91rMskDv6EPeW2OPoaZPdZY9z2P2qXdZqVy_WKNZr02Sp3X5MNmuCTnLO4ouuKnGB2n46tHuZOVtuW2HWICHCfQWXlJhfrxI0EbrJBo_PfyInGCwUl26QnBvxIVuk0RhBOGoAG-5E0Eo0ZrUMQ6cU6NBIu7g73OyMuMPLjpEEUWJ7BsqxZ28MQ_-vhkpPPVVsC_a5cD5_8UhcxSZfrYBp4XE6622eJWdaWXNMvVSYXWyrdJe0JoeMIrCk3D6Bq3xP8Baht45R19914FKNoaZ6JtvPVj1EScIhOMCKLrbA_Fu2FR979AR0DmAVMOxMhoVDU8yyOtpaLFinDBlNFw5MUKoU3FPqs4l3eJhV05e3fBZwC_0hwezwand1P4aUx6GPgEToyM1gwR1n94NpSIya3Ca3wiQ_D9KZgyCdCu6PiGtZAwQMW9OsPBbfC6XqKEXlRRZ_VNpySgX1SAhW79UNg-LIKFX0xoPS28Ec5FZ9aTZIsHQHs7q37l--B9mwwpSH3Ap8XZWiwySOtOGsyFzRhHFrTaRY85pSc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAEwZGZkNzE2NjE4OTcyN2I1M2Q3NGUwOTA2MTQzZGYyNDMyNjVjNjE5NzNlZGNkY2NmOGEwZDhiNjAxMmM3MzU2HENvbnRlbnQtRGlnZXN0gAEwZGZkNzE2NjE4OTcyN2I1M2Q3NGUwOTA2MTQzZGYyNDMyNjVjNjE5NzNlZGNkY2NmOGEwZDhiNjAxMmM3MzU2HENvbnRlbnQtQXV0aG9yGDU3d2x2aW44bHJjZw5DaGFpbklkBDU2AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweGMzY2YwZjI4MjIxODJmMWU2NTdjNzkyNjEzOTUxZWUwMzZlYmFjMTJcIixcInRzXCI6MTY5MTQ2MDYyMzY5NSxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiNTd3bHZpbjhscmNnXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiIwZGZkNzE2NjE4OTcyN2I1M2Q3NGUwOTA2MTQzZGYyNDMyNjVjNjE5NzNlZGNkY2NmOGEwZDhiNjAxMmM3MzU2Iiwic2lnbmF0dXJlIjoiMHhiZDU0MmFiZDIwM2RiMjJmMjQ3MTg2ZTI4ZGM4NmEwMjA4NmJlZjViNjU2YWViMTY1ZTEyYzYwMjJlYTQ1YzY1MmE3NjE3OGNlNzRlYTVlNDFiNGIzZGUyZmNiNjQyNGU0ODc2YTdiZDU4ZTI0NTlkYTk4MTdkYWY4NWFiNmFlZiIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdUVoMTVab0Q0OG1SMWtBVGFsSHZiVGhFU3BpWGRnS3A2T25HZHlUdXJZRzlJV2pYYnc2blJENGwyZ2JjZStNUDdoS1NuSndWdWkydlhucUU0VEZpckE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4YzNjZjBmMjgyMjE4MmYxZTY1N2M3OTI2MTM5NTFlZTAzNmViYWMxMiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDkzODYyMWY2MDM2YmNlNWZiMDhiMzNmYzg4YjM0ZmExY2JmYjdiMDcyNDU2YjQ3MzM4MDYwYzI0ZTE1NmQ2NDE2OTI3MzgyZTQwZTEzZGRkYzdlNjJkYTYyYTEzZjQ4MTliYzZiMWZmZDgwZjUxMmM3YjAwM2I5ODc3NjIxMzNkMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdUVoMTVab0Q0OG1SMWtBVGFsSHZiVGhFU3BpWGRnS3A2T25HZHlUdXJZRzlJV2pYYnc2blJENGwyZ2JjZStNUDdoS1NuSndWdWkydlhucUU0VEZpckE9PSJ9fQEADfd1ZVEZmpRxGvpMWRHc7u4ooyqxUN1KI4kzo-85Qq2QEbcxztyo1WvVG5y1Y_WGUccYRxmTe8XDD9rBOPoC7HEmAox-v47YZGsjl_NPxpoKoiD6WpD6bnqSIQcR6rt0-WcL48UKwlLh1s-HZwNQC57QZFWvSAHhXXjz_ibrtXjGDGqG6n-fXELkjSOAshW6zLF0RjTM8sZIOCPK7O8lJFtEBMJxoSyn_RU1lChu6sICJrebFbXZfUe8sagYyaLd8V5ASJa455oESbzsLRQVY4FAExpsYO-s9Dx-5-DCz924AVfLUeEgYvhI77SW9sOFhoAiHBEZNxcG1X_Wh05UpSA-KyKvOTTggs83zHzQi_j7w1u4xkoc1oUXuOurgdyO_RQUEt8bEbZVa7-4W0wYiwgXQ8H8ZLi-1IsYNy4xYjybIieY1yI2WKpmVYkriKR3dXwtWta3iFY1EaUVnjeR7H3qpH3gJzS4hgQIi3tIeg6frwpeshsDjVAVJDEQVmMQ3apxexldirXAd4NJIR1KohvN47JhhB0qJhAXjYShrQBb2IJ2mSG31cEm_kc3fHdfFwj72NIUGZHLS6wIpheOfzlavLvItnumxjXBBVnqLh1Am2FUypaybe_nv8VzzchvfTNuGSLRjYQ2j4nhz0Xfnmekz2Ka6VP2KfxU3-MLiDqc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAANAQAAAAAAAA2SBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QMU291cmNlCGF0ZW0UQ29udGVudC1JZIABODYwOTM0NmI1ZTU4ZjczMmZlYWYxOGIzNWUzZmNkY2M3NTJlNjhjNzAwM2UxMzY3OGFmZTg0NTAxMjNiMDAwMRxDb250ZW50LURpZ2VzdIABODYwOTM0NmI1ZTU4ZjczMmZlYWYxOGIzNWUzZmNkY2M3NTJlNjhjNzAwM2UxMzY3OGFmZTg0NTAxMjNiMDAwMRxDb250ZW50LUF1dGhvcho5MjU2NzQyNjI3MjcxDkNoYWluSWQENTYAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4ZTNhZmZmNWZlYjBmYTdlNmUzMmY5NGQxZjcwMzE1M2U4NDAzMGNjNlwiLFwidHNcIjoxNjkxNDYwNjI0MTgxLFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCI5MjU2NzQyNjI3MjcxXCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6Ijg2MDkzNDZiNWU1OGY3MzJmZWFmMThiMzVlM2ZjZGNjNzUyZTY4YzcwMDNlMTM2NzhhZmU4NDUwMTIzYjAwMDEiLCJzaWduYXR1cmUiOiIweDc1OTIxMjBjN2EyMDAxMTQ3MzA4MjM3MTc5Y2QxYmUyNGUxOTYyOTc3MjMwY2ViMTBiN2QzOGIyMmVlOTAxZWFkYjExN2ZjMDM2MmQ0YTEyNWNjYmY0N2NmOTVlZGI5ZDIyYzRiZjZiMDM3M2M2ZTdlZmE5YmJhZGVkOTAwYTYwIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxSml5MzYwVkVTOWZ5WCs3aHFpNjJ5Z2c0SSsyOFdKdlRTSW9xZDBPSzFWcGJKVFJ0bmtIcGRQZTdHampVek9UMDY2VGNJSVVlbmZkMFd5bmZUU2RSZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhlM2FmZmY1ZmViMGZhN2U2ZTMyZjk0ZDFmNzAzMTUzZTg0MDMwY2M2Iiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4NDA5NzE5Y2IzMTBmYTgwZDE2MWUyOTU2NzQ5M2RlZTBkMWExNGFlZjM1MmMxY2JkZWQzNjgzZWJmZDQ2M2M0NjM5NWM3YmVlMWY5ZWFlYzAyODg3MzZiNDFmN2ExMjVjZTA2MjU0NzZjNTk4ZDI1NWI2NmViOTQ4NjRmN2VmYWIxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFMUppeTM2MFZFUzlmeVgrN2hxaTYyeWdnNEkrMjhXSnZUU0lvcWQwT0sxVnBiSlRSdG5rSHBkUGU3R2pqVXpPVDA2NlRjSUlVZW5mZDBXeW5mVFNkUmc9PSJ9fQEAXueKfIFm0B5wVLin_odyUWvtNpzfS67PsxWTKgiC0uBdfPCm-GL07Kdsr3sbWjPrEsceZDKXDbTuSUVL0MjW3JRtkZ2gE765gF8dL4fhMS1ckzq7SXtLG4OYdoA8RODK5ewgyMGvYE9-NthTf5WhN82XO0_Cu5ib48QF0qiO98owVoZKNPzUF359snsIFpcwL2Cjt2elYsTKBsJxt2A2dInwZo1nMvM2scuckXTLy1r7gtmOT8d9z9aIQxmGntTMgu6tGjCuXcqba0V6sv4qzGrvs_hhKtSXOXCVbg2xyvQsn5JQ384dZIYk070eGTZISNfTEK18BR4wTp6axv8Wmd59h985YMODIanwV-BQF-WieI4mrr1VkbNIldfGBv6pr85u5slk_74wFnIEHpAKOsXk_e8WhctQ9fvFG-I2GdCFn8FQ7qIdc_H0wdAFXvDSMjgDl6LINwBGhWLHWUpfgem9lkgzIObaG_gc9bAZGISrrULiBnLxhqqU66_QNaRbq2xClYU1XXcBNoub0N8NUlnWbsRowecsSz7r3nnDzoIjYJX4ryOULd2LAH9kpJ_2khwgpuTIuKMB1BrgkPF7WrGHGpBJT9eizieT5WUxsJcIZXkbjZNjwH9X2NFigrgWFTIhBJfBKgAWo1bVhRoAWMcpF1i8_amRLO0rpsgPy_Wc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1BdXRob3IYNWptemFlN3M4aDJ4DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAE3ZGZkY2RhMDI0OTE1ZDE5MDg4YTgwY2VlNmE5MjkxYTY2NDVjNjAxN2NlMDE3ZDJlMTcxZGNkZWViZWI4YTk0HENvbnRlbnQtRGlnZXN0gAE3ZGZkY2RhMDI0OTE1ZDE5MDg4YTgwY2VlNmE5MjkxYTY2NDVjNjAxN2NlMDE3ZDJlMTcxZGNkZWViZWI4YTk0AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDVkZWExMDIzYWE1ODU0YzUzNWJlYjkyYzg4ZGI4MWRjMDI0NzEyY2FcIixcInRzXCI6MTY5MTQ2MDYyMzM2NixcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiNWptemFlN3M4aDJ4XCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiI3ZGZkY2RhMDI0OTE1ZDE5MDg4YTgwY2VlNmE5MjkxYTY2NDVjNjAxN2NlMDE3ZDJlMTcxZGNkZWViZWI4YTk0Iiwic2lnbmF0dXJlIjoiMHgzMGE0NDA3ZGM2YjMzZWVlY2Q5OGFkNWI4NWQzY2MxNThhOTEyMWYxM2U1MjdiNDU2NzM1ZWQwYzk4MWQwODZmOWJiMzM1MDU1OTE0ZDc5NjYzYjFhM2U1NGMyYzAxNzZiNjQ4NzIyNDdjMDAzZDY1N2U2MzkzMGM3OTJjMDVmZiIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaTVZTjA1RkhTeEVtQlNIMU5xRmxFQlo5Znc0Sm1xdWFneGM3SGY2eWZUcHVCbDZpUXkxais4K3lLYUxKSWhvQm5RU0NNS2pWS2RlMXk5cGxKVFdGSkE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NWRlYTEwMjNhYTU4NTRjNTM1YmViOTJjODhkYjgxZGMwMjQ3MTJjYSIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDU1NTJmNDVjN2M2YWZhYzJjZDJmMzA0YTU5OGU0ZmVkNzNkOWQ4NzU5NDc4ZDBkYTEwMmJjZWY5NzQxMWU1N2EwZDg2NjMxNGZkM2UxNTFhMmFmZjJhNDQyYmM0YTUxODkzNTE0MjVjYjYzYTIwM2ZiZTI2MWJiMTY1NTU4ODRkMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaTVZTjA1RkhTeEVtQlNIMU5xRmxFQlo5Znc0Sm1xdWFneGM3SGY2eWZUcHVCbDZpUXkxais4K3lLYUxKSWhvQm5RU0NNS2pWS2RlMXk5cGxKVFdGSkE9PSJ9fQEAkvMnAGqxxX1jZbZbVddDRuGu31Pgimdv6nrTQOFaTbGrQTFKHnyPGtaPGkhaAoc11xQ-oWbDfYqRRaEfGVchnJHiRoEOmJxp1vHGvvOfFma7x7BipHdXo7uaXOiC0Iq5E190eNG81iTWU9pnUWg-luT8YP3WNb_tWrMZ2dhOBAiIvuVR81kkMrooOJp_LoiOabujIoSW0oFo0vJ1PzvmCp9B9UVRTzqkurV8TQVWMltIuNeD1x0nB495UFwmuE94VG1R-JW7SUvF4WewNoLHwVonpIoHKGOhoFDhcfEDMVFLP6LpCXbSOrQnNdKRj1GOmLaw-6SJ5ZOPCGn1keVk8VDfcYBrR_pDB2wrBpBlwp2SltF6dil3S3vSO6KJrcqX83MGITMjMjhFjgzoXVgxVHhu4F3UGhhSFcdeHufY75OWZdOaVBT3dI_22cT1jA2rQI24PU3nrhh-cMbfgZAKjJyh6SWc-0mJfrpydyOkTarjDP2E5VnME5-SIJh84UpiEQLRQz0u3Yq8tr6IvHhpDHNoxWk7XWpI85HZySPYS5n3TTJLvwRDFfNqDwwSKkAWvCRD2dvdz_tmFxC1hiK53IgVEMc5qS3-HMACUJDAR0DG2Bb5XJ8SQQB371z7d3K17P3BcX9AZ0Ij9u5dCY2PrDF9SitXyf1j0xU00AjAa_qc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1BdXRob3IYMGkxemQ1b3A0YjZ3DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAEyYmQyY2JkYmUzMzMxYWQ3ZDJmMTE3NjNlMTU3M2I5ZGFlZWQ4MTA4MTJhYTc3ZjFlNjE5MWRmZWMyZTM1MzM1HENvbnRlbnQtRGlnZXN0gAEyYmQyY2JkYmUzMzMxYWQ3ZDJmMTE3NjNlMTU3M2I5ZGFlZWQ4MTA4MTJhYTc3ZjFlNjE5MWRmZWMyZTM1MzM1AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweDZjNmY3ZTBlZjRkZDZjNTUyNjE3MjQ2ZTAzZTYxMzM4Y2M2NGJiYjJcIixcInRzXCI6MTY5MTQ2MDYyMzM5OCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiMGkxemQ1b3A0YjZ3XCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiIyYmQyY2JkYmUzMzMxYWQ3ZDJmMTE3NjNlMTU3M2I5ZGFlZWQ4MTA4MTJhYTc3ZjFlNjE5MWRmZWMyZTM1MzM1Iiwic2lnbmF0dXJlIjoiMHhkZGI3NzlkZjY2MTMxODlkMDFhOWY3YzlmYzdjYzY3MzA4MDlkNzA1YTgzNDE5YTdlZmNlY2VhM2I0OWQ4Y2U5NGVmZjUyOTRkMGQ1YWJkZmM2OGNkM2QyNzRiMDRiZGU5ZGQyMTA5ZDIyODQ3ZTU3MjcwYTIzNGM0N2JmZjliMSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFMlhCeTdjNGF1dmpCMUJ6MndaTkhyQWlTa3RualFiRnh3VlI4UTVMQTJtbDFwdnZCTHFWM3ZRV3hxLzBuUVZ2Ykt6dWRxQzMzMjU4WEtveEVDV2hIa3c9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NmM2ZjdlMGVmNGRkNmM1NTI2MTcyNDZlMDNlNjEzMzhjYzY0YmJiMiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGQ1ODMzYWM3ZTUyMDQ3ZjJiNDBhNDIzZjNjN2IzZGVkYmUwMTBkNjUzNjU5MTExYjYxMmNkMTQxZjY3OGZmY2ExN2ZkNGNlMWZmY2Y0Nzc0YzI3YmY3NTJjNzc1OWI2ODc5NDEzYjg2MzRlYTA4MmQxNWI5Mzg0NjViY2UxMGRiMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFMlhCeTdjNGF1dmpCMUJ6MndaTkhyQWlTa3RualFiRnh3VlI4UTVMQTJtbDFwdnZCTHFWM3ZRV3hxLzBuUVZ2Ykt6dWRxQzMzMjU4WEtveEVDV2hIa3c9PSJ9fQEAj6MA9o_vKkqo-mi60v7jqRU0usrHypgP85hp4OnKUWGGdrCmTfagUf3xnvD2vY7aTRma_EM-dPukCZLGCxnjgzV792QP3YNIWyjUve2RcLCIvrYTpxZFoc9DY7qYzebyTu0e2M80mc5R8IPLbhtyv7qq7B9ORrcs2cpDCJUkl8FbhXZkKeBevq_AdbotHmy4_js6wu5EsnREwk3fbNDPH3cAbTNlLcNGYrsAwyDXGnaoi3N5_Qrz5WJ5RmU9stMKbNvF426A2nY8mAMisg1Yvvsdk8Xp2TBJ6PIRYNBo6iFDvw38mhH000xBNwqW3ih76CkrnfbbLBEzCIYXG3VeHPUY0J_jAwlFzHlmEtGLPnPM43EZwZ_cKEyOtRXErhz68N9rkhp1JdRSPcGEYP1SBUmWLgcHuLG5UtsEpe6iAV9AXNx5SPLOKRfLJhzLv8C9w8C9txdDoy-df7H6GKtHOVe0qQ_s7Ah9dc3750qkLawZc2eTFBp4_6VLeLwCkwzQMxXkpP7XNHu4iVofcygZZgU8Yl3igrpM-a5jg7VXDtorLjS3yUmcn5ZKXd-q5eAvEd1qFx6W4iz80ilueAblDZD4alMt9tL3PukRoWSYFWTGD3VCM1JjnFeRyjfu5UvhIK4mtLEKW5UzKqeTQwuSEjygZgKvl9RgKIL3ca47L7Kc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNxRDb250ZW50LUlkgAE3NzM1NzUxZGE3NWQ1ODI1MjdkN2FkMjA2YTQ5OTc1MjE4NTYzMjZhNzA2MzFhNTc5MmEyOThmMzc1ZTRhNmYyHENvbnRlbnQtRGlnZXN0gAE3NzM1NzUxZGE3NWQ1ODI1MjdkN2FkMjA2YTQ5OTc1MjE4NTYzMjZhNzA2MzFhNTc5MmEyOThmMzc1ZTRhNmYyHENvbnRlbnQtQXV0aG9yGHJ2bTBqMHcxZjZ0bA5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlAHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweGU0OTBlZTNjNGM3ZWRlNGMzNWRjMDExYzZlNGM2ZjkwYTUyNGMyZDRcIixcInRzXCI6MTY5MTQ2MDYyNDM1MCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwicnZtMGowdzFmNnRsXCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiI3NzM1NzUxZGE3NWQ1ODI1MjdkN2FkMjA2YTQ5OTc1MjE4NTYzMjZhNzA2MzFhNTc5MmEyOThmMzc1ZTRhNmYyIiwic2lnbmF0dXJlIjoiMHg5ODY1NDljMWRjZDQ4MTNiYjRkZmVkZjQ0NmE1MWRiMWI5MTg5ZjZkZTVhOWE4ZWI5N2QyYmY2NzAxYWNiZTI1OWMyMjA4ZDZkZDE2ODUxOGI0NjY0MTIwZDUyOGMzNzJlOTM0NjA0ZGZlN2MzZDE3MWQxNjBhYjYyMzMxMGY2YiIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFREJRWE9UN2xmL05ueDlqNkhSejROUzM3ajVVYkFvYzJtV0pUYTkvaE95TGtObGRsaDdRSFYyRnAvWU10emQyVDBEOStoWHBrUmtQR0xMeWdrUWUyTEE9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4ZTQ5MGVlM2M0YzdlZGU0YzM1ZGMwMTFjNmU0YzZmOTBhNTI0YzJkNCIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGJhZWYyMzRiMTFmMDg1NTc2MmZkOTg3OGRiMWM2MDVkNGUwOGE3YjIxNDRiZjNiM2M0YmI5ZTc5NTRkM2ZmZWM2NjE0MGU5NzVjNGM5NDdjM2E0YzdhMmUzY2Y2MjAzODFmMmE2MTIzNDFiYzc1NjNmMmRhNGQ1MzViZDEyMzMxMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFREJRWE9UN2xmL05ueDlqNkhSejROUzM3ajVVYkFvYzJtV0pUYTkvaE95TGtObGRsaDdRSFYyRnAvWU10emQyVDBEOStoWHBrUmtQR0xMeWdrUWUyTEE9PSJ9fQEACM7s6Tr7rDyKzchgY4qVdyRZYnArKLF71Vy465VtLp18MOJ9Nuj1oP2uwHWmLsnFg5Gifcr9YIsqLtOCqcmSOrsZGKDOnGvaXjHI7suHs7Qmo2uCXbcxZCbC0VSB3kB2M4uM_zvGjfr4FZk6_b2TBLND4EuXllycDgXnewaR3qskG7BjjQMn16rKjRa-Hax7IBVoQNddpqRTeQQwip0W95xI0JK6CcVyu-76ZVHt3mQMrv0v3NjBSlaWx2gebEopLAw9B8b5cJWtxI75A8o6sTBbQXeDwYP3a7mr_jVA1H_eDVPfp5sU7BKu3CPoVTE3AoWupR_i-naERzT0XekIEdZYbdaVen9Wdu_uwgGuXku_tZSPpn_6YYbSfuJ42Ph4Ov8Wldu4sRAReas4Fw7xPnB9DqzpIXw5lZxnnLDn04xt4M-nJlh3mdDTVJdG8UdhIZoV9eT-3YPLytPKzNwlNKKeqR_N6PzHVBtocok-fHEJ-jv_8h5fnr4pNNgX22F3U6XijffzgrWY-0i-qpvX0s0secrtbyinsU1jZamWd6gxpQBOGjTBRSY5Hc756FW4b5dSaLFi7wokqJPhQ9G7XEblrf_EaV-EoQVxkMv6FZAm60VawZLxCE_25uJiA-ac1F05dJL2p7MdTTq_Uh1pB2R4A14qXWjtswhECNgAJ02c-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1BdXRob3IYem53eHczNjF3eW1wDkNoYWluSWQENTYMU291cmNlCGF0ZW0UQ29udGVudC1JZIABOGZhYjViNDExMDJiMTFhNDhkZWJiYzViNjg0NDIxMTI5MjM5NTYzZjA4YzRhYWJmOWMzNmYyZmJjMzc2Mzg2ZRxDb250ZW50LURpZ2VzdIABOGZhYjViNDExMDJiMTFhNDhkZWJiYzViNjg0NDIxMTI5MjM5NTYzZjA4YzRhYWJmOWMzNmYyZmJjMzc2Mzg2ZQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHhlMTVmYzUxMTYwZDI1YTYyMzQyZTdlZTdkNGVjMGExMDdlZDBmNWU0XCIsXCJ0c1wiOjE2OTE0NjA2MjQ0MDYsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcInpud3h3MzYxd3ltcFwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiI4ZmFiNWI0MTEwMmIxMWE0OGRlYmJjNWI2ODQ0MjExMjkyMzk1NjNmMDhjNGFhYmY5YzM2ZjJmYmMzNzYzODZlIiwic2lnbmF0dXJlIjoiMHhmM2YyYTRhNzJmNDY3MGNhYWI4MmQ1ZTRiYzgxYjRkYWU2YzNiNWQ3NDMzYzJkNWNjNWJmMjc2ODk0MzYwNjFiZTVkNjk4YTE0NzAyNzJjMTI0ZjcwNDI2MTQyN2E1MmExYTJlYTE4MzQyZTI2NGYxODhmYWJjMmM5OWIwMTUyZCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdnppZFJsTllIdEUrazR5R2Q5bjJOVWNPajJLeGZ3T2J3T1doLzdwVnR5OXlQYnBTb3hOQUIvdnBPODFCdFZpN0t3U3UxcVNWRXhCT1lmZ05VTW1kR3c9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4ZTE1ZmM1MTE2MGQyNWE2MjM0MmU3ZWU3ZDRlYzBhMTA3ZWQwZjVlNCIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDliNDc1OWMyNTZkNjNiYzM1M2RlYmEzMmViMDE5NWEzMWE3NDg1MTNiMjM1ZWYxOTJlOTAyNGI3N2E0ZGFiM2YzYTA4MDcyYzI4MGY0MTAyNzJhMDBmYjI5YWY1MTg1YjE4OGYwZDQzZjg5MDExYzE4ZDk1NzI0MDA1OTZkZmEzMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXZ6aWRSbE5ZSHRFK2s0eUdkOW4yTlVjT2oyS3hmd09id09XaC83cFZ0eTl5UGJwU294TkFCL3ZwTzgxQnRWaTdLd1N1MXFTVkV4Qk9ZZmdOVU1tZEd3PT0ifX0BABKPnmUhWwx73U3CW5F5_WN2OH3MQnMv8MtTntOnWZw2BlC9fLWc7SZkotSsM4ZaQiPmWww_bg6aa6mqgr2sBqBODmXErwZs4z8xe0bpmx7B2rDrmOjYM6cfkg2L-u04maT9eQVJTMk_SP_EMz8VC1KhXHfd1ZV-CB5uuJ8GWh6Sr-L5_Hb4ghYmnu1174MEXWpvhSE3qHQRkaJne1eReQtaFAjvmotUHDMSFYir7FwtddaVa4uF4oT60_9_5ffMmgdzz2o3ZB5_nFaEAMIibdTJemgubDkFyaYepNBbnUX7zfmeYuXRLy-zewC9yqyRLayXlgfHtFMoTTBrwXG8cDLyZlXiRGUtOyWFcl0eVA_4Y5Vr8gxzV7Id4BlLPC_OLugTnQJ4bCNq-boxhsz8hXEXb9h6olOI2lnMe5ge4VprDote4uKqjCdGvGK_IVdLZQDtSdKtV-v6_4Wi9_tbeb9jdVY_GBzyuv-HVMm9dBcL5dBS14rmHEegejwObxx-N0ekst3R6N_G5ldne6TtNQ0XgSvRsOehORloDbsDFyUWiwk84Pw0ag4fIjDt-AsqcYmBxA_H_-hSlZ6BnnGvmydz6H6iajbS563FVImbCkovEAuQNaVrZ0xxhYoOi0N-CiZ8QUMXPGIm_CRYSiQ2m94BMU-FFwOLcHeOLBedtkhHnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAATU5ODAzNmZiYTkxYjBlOTMxMDExODg1MmRhY2VlMDBjM2ZhYTdkMWM3MDI0MGI1ZTI2NDYxMDM0ZDRkNDZlNzIcQ29udGVudC1EaWdlc3SAATU5ODAzNmZiYTkxYjBlOTMxMDExODg1MmRhY2VlMDBjM2ZhYTdkMWM3MDI0MGI1ZTI2NDYxMDM0ZDRkNDZlNzIcQ29udGVudC1BdXRob3IYOXRvdHVpaHA3MTh2DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UMU291cmNlSDE1NTMxZmEyLTEyMDUtNGY2MS1iNmU0LWM5ZjY4ZWNmODFmNwB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHhlZDIwMDc1ZThiMTZlMWNmNTE0NzdlM2Y3OTc5ZmQ5MTliZDI5NzYzXCIsXCJ0c1wiOjE2OTE0NjA2MjM2NjUsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjl0b3R1aWhwNzE4dlwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiNTk4MDM2ZmJhOTFiMGU5MzEwMTE4ODUyZGFjZWUwMGMzZmFhN2QxYzcwMjQwYjVlMjY0NjEwMzRkNGQ0NmU3MiIsInNpZ25hdHVyZSI6IjB4NzNmOGNmZGZiNmM1ZTZiYTNmZmU3ZDQ0ODI0Y2M0ZmRjYTM0MWM3Y2VkMmIwMjcwNzFiODlhYWE3MTc1YTVmMGFkM2E4MzVmY2Q3MjVkMzg1ZTcyMjU0YTZjOTY1ZDA4YThmMDAyZjNjN2Y2MzViZjVmM2VhMGExMDMzNjVhMTUiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRStSbEk0VWM1WW8rQ05sWWw5WFBaUjdZampzVVAvSXFTRjlmSC9tLzZyeTJUdTBlS2c5cS9yaXpyTVhRQ2FhcksxQ0djZXZMcFZPa00wRXhpSkkxNDVBPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGVkMjAwNzVlOGIxNmUxY2Y1MTQ3N2UzZjc5NzlmZDkxOWJkMjk3NjMiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHhjNmE0NWU3ZjgxMzY1YzQ3ODljMWQ2MzMyOTkyNjI3Njk2MzYzZWNlNTlhZjc4ZWE5YmZjMmFhZDUyNjViYWU1MzFlOWVjZGY3ZGU0NDUzMmRmMWQ0MGM2YTZhNDdlMTA4MWRjMmZkZTAzMzFmNWMwMGJhYzgwZDZlM2ZmNWU4NTFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRStSbEk0VWM1WW8rQ05sWWw5WFBaUjdZampzVVAvSXFTRjlmSC9tLzZyeTJUdTBlS2c5cS9yaXpyTVhRQ2FhcksxQ0djZXZMcFZPa00wRXhpSkkxNDVBPT0ifX0BAIdVIKxewDm5EmGscWsx72pr8JQxgU_vaOz1iHDDw1_JDdOvRy95cKhzDkdsb4TNt2txMomjypMiueTfg8-OpcveaasTuuG7ymu5BkjEQDaO1EC1lMLhuY5cGoT0Mv5zMDhHBHY023Ydef_mCkNj5I8eFSZllSojA3OJSR6Mu3_rhZEs-BxPbFOJarSNMCjhg2wRzGXqF8OMVgbq2GF4LxYKnsD-ZHIdLN-fkFmhvytMiwhWhF6WFIko9rUvFeuNBNdkSD1gN2GWiZsVrhcN4gsYGpzoIi0OImhAg_hgROK5NFuH4yQH-94Zxi9pJYhSMGFkS_xG1R1VfqY3j_Xlc3gqHyEPcGpOpcUQb0s1-hK5n5izi2jH9AUy_PAfSTlJ6P_OOyr14I65NA0RykGt2cATSQ7_zW_FdgO0yhPFSGMTUi-C57vK2wf9i5geOkUwO9VZZqArkupYKqYk4YeeDcI7eBYR4lNQWQ5htB_IsT1jGSHgwhpT0EN4t5CCQJygeZnwqvsoTTmqSE08vnwqOxMJDnuWva-wjMMmT3iii3AGGiDFKHrdo_fCnZn0wa_lIQ5lc1WTcIufp8L5lTR-EuLPicDjXn25RRS2np5qf-t9QDcORmfqZGMxRlW7DEM1jEhUqjvUBt816ded3Q9F_OsIGxi-v4JoCv33hjhRJ45SnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAAFgEAAAAAAAANpAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAATA0Y2NhOGFmOGQ3YzM4NzgyNjY2Y2JiZTYwNGIzY2NmOTU2MDI1MjkwMjY2YjkxNmI3MDAwYzdjMTk2OTgzYjgcQ29udGVudC1EaWdlc3SAATA0Y2NhOGFmOGQ3YzM4NzgyNjY2Y2JiZTYwNGIzY2NmOTU2MDI1MjkwMjY2YjkxNmI3MDAwYzdjMTk2OTgzYjgcQ29udGVudC1BdXRob3IiY3Voa3RkcHNxY2xoZnlhODYOQ2hhaW5JZAQ1NgxTb3VyY2USY3liZXJ0dW5lAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweDExNGNlMTNiMzJmZGY4MjEzM2YxNTUzMTAyYTc0Y2U5NGQ3ZGEyODVcIixcInRzXCI6MTY5MTQ2MDYyNDY3NCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiY3Voa3RkcHNxY2xoZnlhODZcIixcInRpdGxlXCI6XCJUaGUgUG9ydHJhaXQgb2YgdGhlIEludmlzaWJsZSBXb21hblwiLFwiYm9keVwiOlwiWW91ciBwb3N0IHdhcyBib3RoIGluZm9ybWF0aXZlIGFuZCB3ZWxsLXdyaXR0ZW4uIFRoYW5rcyBmb3Igc2hhcmluZyB5b3VyIGV4cGVydGlzZS5cIn0iLCJkaWdlc3QiOiIwNGNjYThhZjhkN2MzODc4MjY2NmNiYmU2MDRiM2NjZjk1NjAyNTI5MDI2NmI5MTZiNzAwMGM3YzE5Njk4M2I4Iiwic2lnbmF0dXJlIjoiMHhlOGZhOWY5ODViNDUxZDdmZjAyNTVjNzdmZjNlNzc1YmIxYmVkYWQwYWY3ZDg4MTkxM2NmMDk5ZmU1NjNmODljZjYwZTg1MWNjMmZhNTVmMTJiMjFhZDBlMGEzNGU5NGQzYWU4MjYzYmRlZjBlM2EzNWM4Yzc0NjgzNmM5MmMxOCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFckVNR3E5VW1XazdXa05OY3ZlVUJaUS92NnhabmdtMWp0Ky9nQVU3ZVI0L2hxZWxyQkN2K2FBNGpyMHA2MUxiTTBlcVl5ZGpydndCcXNBNDR2VEFYSmc9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4MTE0Y2UxM2IzMmZkZjgyMTMzZjE1NTMxMDJhNzRjZTk0ZDdkYTI4NSIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGQ4ODlkMzIwMGNlYTlmMjVkMDgyZjliOTM2ZWI1OWNkYmQ3NTYzMGUzNGJjNDU5YmRiMzAzNzBkYTk0NWUyYjk1NDAwMTcwYjY2NTE3OWMzNWUxMzI1YjIyNWQwNGVjY2NjNTcwYzkwZmE0NjkyNGFhNGY4MTMxYzQ4NDdlMDBkMWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEkgYXV0aG9yaXplIEN5YmVyVHVuZS54eXogZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXJFTUdxOVVtV2s3V2tOTmN2ZVVCWlEvdjZ4Wm5nbTFqdCsvZ0FVN2VSNC9ocWVsckJDdithQTRqcjBwNjFMYk0wZXFZeWRqcnZ3QnFzQTQ0dlRBWEpnPT0ifX0BADM3VeePELZ5yBNHp0RVcIcMNmvI5q0Lbup0LWRpa1rtVx3YNajlS2ysmOJbdwZ21HIDnbYQ8y6KSbvO4S4J_ArD_wHhatpfZ0teY_Vi-QeXoeHjcVpDN5X3ovuzMpKvvULaFcjVfmm4gZKmffVz-AHYjj7ZeQLY1tBoEGoADuuCkGt91wRdqg5gnBHcvt4cm14xzarUFwQF2ZeDcnWz-UG5kLILgW_Drm2-J1L697-AO9tvInXdWAnkZLS8tm3pJQaO2VZDmA0VEeUiyFwIlAgPByQyjJ4cyjI5CJu0FlkiX8a5SyZKVDEVXpdrCYwCUihHKI9Y2k-cMXSkhiuZU58dhsjIQ6PSkSgZm5gUkog4iRC3g9qEIoTOQkJY3h2gQjOArhKmVq6tE9U05grCRCN6TprygbocjG815fBUHSDkGHKxj5kf7bKpIc3_jsSMVznwS8W6E-hlfhzUJv6GLleLFWpkq3mezqIgLhcygDc6sJfAyKRbmC9STe9O3CbtmLHIsz1YMDQVOsrn7FEvEnvOCOMaW3q7jx5tNefMFLBTQx9bIzUbhxfG6CeDVOZwpdzzy-qtvOkSAY9H4X9lmdwtfg1EjaHqyX1qoKwXfPcpzNJytXccL5_NRCy0uvC2732rvwCgTo1YY25gCf5vGpQy4kuOvQBsvz1JWH6Rm_sdnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtQXV0aG9yGGJmbTdmaWk0NHNyeA5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABN2UwNjU4YzYxZmNkMzkwNTVhZGJlZmE1MWU3YzJjNGNiODVhZTVjNjc0OWI5ZDM5ZTYwNWIyNGNkMDkzYTY1YhxDb250ZW50LURpZ2VzdIABN2UwNjU4YzYxZmNkMzkwNTVhZGJlZmE1MWU3YzJjNGNiODVhZTVjNjc0OWI5ZDM5ZTYwNWIyNGNkMDkzYTY1YgB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHgzODE0ZWYxZjQyNWVmMzFiYmI0MzEyY2IyMjAwODA1YTgzZGQwMjE3XCIsXCJ0c1wiOjE2OTE0NjA2MjM2NTQsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImJmbTdmaWk0NHNyeFwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiN2UwNjU4YzYxZmNkMzkwNTVhZGJlZmE1MWU3YzJjNGNiODVhZTVjNjc0OWI5ZDM5ZTYwNWIyNGNkMDkzYTY1YiIsInNpZ25hdHVyZSI6IjB4MmI4ZGVmY2IyNDZmZDI3YjdmODQxMDQ0MDJiNzI2YzEyNjlhYzdlZjgxYzE3NDg4YzcwZGY1ZmM0NjcxMTYwYjYyZWUwZGI0MWUxZDY2ZWQ2OGRkN2FlN2UzYmIyMmJjMDVmMDI3ZjE0MjY5YTZiMGVjYTZmNWViMjJjODgxMzAiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTRLcHh5YVVFeHc5aXFaMit3L0FBcWFPOUFZRVd2aWp3RlEybjNXZGk5dHVleUlPZkRVZ1lwbHpES2o3cTh4aXJGWUZ4R0haZC9KZ2d5RDZmUkNWRXJnPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDM4MTRlZjFmNDI1ZWYzMWJiYjQzMTJjYjIyMDA4MDVhODNkZDAyMTciLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHgwNDQ2MjQ0ZDJhODQ0MTQ0MzRjZGZkNThkZTlkNjUwZGY2NDdmY2FlZWNkMmFjN2JkNmE3OWQzYTYyMWJiNWRlNDNlZGYzOGU2YjllNjg5OTNjZDFjYmVkOWI1Nzk1NTkyN2M0YTYzZjM0ODM5NWRlY2VkOGU0MDJmY2EwNDYwYTFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTRLcHh5YVVFeHc5aXFaMit3L0FBcWFPOUFZRVd2aWp3RlEybjNXZGk5dHVleUlPZkRVZ1lwbHpES2o3cTh4aXJGWUZ4R0haZC9KZ2d5RDZmUkNWRXJnPT0ifX0BAFJpEsI7e5Kzo0XFLHqa1JupQ4vf9KwLZnumpS9BY8Cjkz93YirNnUhYIEM_-CADChI3Z-PS9A2EtaNH_CVpN2fEyPduTTRIsTDBljahKg_OlzAcKkOGrkreitW290n5YQIDa-8h9bmSUE1HYPyDvquvcAgAuO_bZBKerU5P8-abLR0IQBxXbbc2F6Ic-kLIbAr32tAr-NcRmUgMddrR2muDPmththOmoBBynPQT5c3Wm_mF0fAdJpgQWCcEj2iexXP79bZFnzDPnH8lVzrLc9E9I8LiLbxhJbhLg34hhijDTZjCsWaQo8r772ns8IUf47U-6l4sQKRGNO6Zj80XynlpVaZobDzIw-1Jmh2btyZVCp3VSWdh4TsFoWIL0JDSvnJ85d_VKrgkWuc9uCBQuWcSNsnGqAcUzXsHnuUCvZtcy5-YD02eNNKRel0jIk-mp3VjlL1_9kzjj4ykkLtOGet67l5bj2tNJ8OKuQGQAN2lpmNqoltGDGcHiCRlyFgFOYNadNzCWhRu69Y0QOtrI_upTKbG3c3UYd8LigzXSAlstU5pLmkQ8DhY8RLaPJjGQOfJqTpWPGEzGFPgdkJFiNPPuflwaGwjaTxtBQwMxsrpOGMIv-aSzjf-dYdF0cRgO-mFbisWUB7FN5IMZU3IAfRTaE30DaE57qDeXPxQYoj1nPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABZjA5NTM2MDQ1YzhkNDZhMDEyMWM3NjgwNTBjNGE2MWQ1NDhjYmRhNjJmNGQ5MmE4M2ZkYzA4MTdiNTFhN2RhOBxDb250ZW50LURpZ2VzdIABZjA5NTM2MDQ1YzhkNDZhMDEyMWM3NjgwNTBjNGE2MWQ1NDhjYmRhNjJmNGQ5MmE4M2ZkYzA4MTdiNTFhN2RhOBxDb250ZW50LUF1dGhvchh1YjV6ZTd4ZGp1NWwOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHg2NjhiYjhiYWFkMThhZDA5ODEwYzRmMjlhZjBmNjVjZDQyZmZlMGU0XCIsXCJ0c1wiOjE2OTE0NjA2MjQ2ODQsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcInViNXplN3hkanU1bFwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiZjA5NTM2MDQ1YzhkNDZhMDEyMWM3NjgwNTBjNGE2MWQ1NDhjYmRhNjJmNGQ5MmE4M2ZkYzA4MTdiNTFhN2RhOCIsInNpZ25hdHVyZSI6IjB4OTIwZDgzNzJjZDk1YWE2OGQyY2Y3N2VkNTFkYjUzNzZhMjc5NzI4NmYyYzczYzUzOTA3OTI4ZGMzNWU0ODg0MDNiNjQ5ZWU5YTQxZGQyMWE0ZjZmMWQ3NmNhY2RlZWIzMzMzYmIwYTQ2ZDdlOGRhZmQ3NWRlOTIxN2ZlOTRhYzIiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWJWVnF2T0FLcUdYelBYbVNza1lPam9vbzlxdzBYdjRvMnVzNWV4U1VsQlpLLzFVY3NpdDZuYVNNaVBBNFRlZkRMUjZlbzFEQllDOW5HQUIwM2ZZSjlRPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDY2OGJiOGJhYWQxOGFkMDk4MTBjNGYyOWFmMGY2NWNkNDJmZmUwZTQiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHgwMGQ2NGM5YTBiNDI1ZDcyM2JmYmQ4NTZjZWVhYjQwZmE2YTdjZjY4ZWE0YmNkZDAzOGQ1NzRlNDM2NjMzNmQwMDA5MTRjNDRjODM2MWZjZDJjYmMyZDRmYTFlOThhZTA1ZjdkYWU3MTVjODliN2YzYzc3NTBhNmViOTVjOWY2MDFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWJWVnF2T0FLcUdYelBYbVNza1lPam9vbzlxdzBYdjRvMnVzNWV4U1VsQlpLLzFVY3NpdDZuYVNNaVBBNFRlZkRMUjZlbzFEQllDOW5HQUIwM2ZZSjlRPT0ifX0BABMkeQvdumydQyKZV-F0qd9bw4bZABzqYAfEhORY-LqUefbREjlD6Qk5c0mBy_IKbhfvToRrTCE-HP_Qp9a_WTTwItoW7iRvQk0yGSiLr7AN2PkdWlXkxkBNo2E9e0mcUri2RYFKGSfwt3t-wvJFNxFvMyZ_vIkouIGprYsr_ue0RWYM2iLGdoHaqSpwG93DBGnm4Jttx2MTF8g5HOA47uNimOMEJpEBAs9CWfE-DLPQsEVxJbefEqms3RPt1dpdxip7qohi4cBVeY1Vjg9wBiIzRi36bQOJRnMw_C2zupu0HnVXsRLUH8jhk_qyT7nlLdWtr_X9ZZWxIeZuXeDyMQnMn02LDqyW3k0Ohaybsp_nPN2I8dMX0P-Q0tr5eaF8bEF2Q_gqsMepAniC9MUktIN4auus30sgKlu5l3OcgTb-HfG1Zpeqv1VVzum9nytxiwjqFPtK82Kd_gjbsYP5_pc9KU7upbVtQbXhvDiKHciiicsIT-2zd3YgZKemorlzlh7MzAmgABBoKC9kfgigVhrY7cgLib2uWScfiIRuA8BPVymeCZju8BYeHvWpG1bXIzkQDd4FBwze2RgcqmIpGXG5M0yaOjo7WuvnwHVRlmbVuj1MRr1z8NogpmgbS-hgpusHY2U1nYIsOMQGXzO5RfmZiQgC54OfFtF-GnDpx82XnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAADAEAAAAAAAANkAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtQXV0aG9yGDF3ZWI4OXJrMTUwMQ5DaGFpbklkBDU2DFNvdXJjZQhhdGVtFENvbnRlbnQtSWSAAWE4NWQwMTM4ZDU0Yjc0MDdmOTM0ZmExOTlhYzA5YzQwN2E3ZTI3NTc1YzNmOWVjODUxMjczNDVkZTFlMTNmMDAcQ29udGVudC1EaWdlc3SAAWE4NWQwMTM4ZDU0Yjc0MDdmOTM0ZmExOTlhYzA5YzQwN2E3ZTI3NTc1YzNmOWVjODUxMjczNDVkZTFlMTNmMDAAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4MTM4YzY3NDk2YzRhMTVkNDk3MDEwM2U4NmNlN2I0ZThhOGFmNmI4ZVwiLFwidHNcIjoxNjkxNDYwNjIzOTUyLFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCIxd2ViODlyazE1MDFcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiYTg1ZDAxMzhkNTRiNzQwN2Y5MzRmYTE5OWFjMDljNDA3YTdlMjc1NzVjM2Y5ZWM4NTEyNzM0NWRlMWUxM2YwMCIsInNpZ25hdHVyZSI6IjB4OWFlOTk3NjRiYTlmNjRkYjE2YmExNGNhMDI3ZmVjMzRjNzJlOWIyOWYyYmM2ZDNmODBhMjVmYTBmNTEwZjM5OGQzMmM1ZDE4NDU0MzAzZjc4MzVmMzMxYTBjZGQ2YjVlYmRjNGZhNGYyYzBkNzRkYzBjNzkzZDBjZTI2OTcxODgiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXhMREk3VG42ckl2M1lGK01NMFdSNVdKOHZZbThsNXkrSGZicHFuOHF5cXdHMTducDl2dEVuMFNzNDUxZFZHeFRXU3VOSE9rdEhLU3I4cnRidWhPVmVRPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDEzOGM2NzQ5NmM0YTE1ZDQ5NzAxMDNlODZjZTdiNGU4YThhZjZiOGUiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHhiMGIxNjc4NzY4ZTEwNjBmZmY0ZTExNWRlNTY5NzkyNjQ1NmEyZTkzNWZiYjA1N2ZiMTdhMmU5YjY3ZWMyN2Q0MzA1N2Q1OWRlY2FhYTZhZjdkNGM1MWY0NWRlMWU3ZDllMGYxOTQzMmUxYjI2MjAyNjBhNzAxZGJiYmYwZjEzZDFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV4TERJN1RuNnJJdjNZRitNTTBXUjVXSjh2WW04bDV5K0hmYnBxbjhxeXF3RzE3bnA5dnRFbjBTczQ1MWRWR3hUV1N1TkhPa3RIS1NyOHJ0YnVoT1ZlUT09In19AQCX4Oc9jt3xVNvGe7dPhAunWiIf6LyME6ogapDlhPU1X5Us6dvjfyKbsYsUnYHeILugGRksRCwfSdwgu1dPv_Jn_BDAwxJMJi1lw5OO3UmkG-jB96Qo28jft2w0Z1ljHr_qZrVYTQCSc8cKhYddDgkw0YflDckpuMEGQMEQTKRaqrQ-TaOHlLMHq6LHZQ6VpIaGv9uBfHe-A1eZJEhBbQAuNIGnTeHSPGh4dAkvL_kBLz9QvvJkWnWbVPG9JamjDCG6qqkTNKpbaryPdhjCO1u_kJ0Pt8ZsHRW3o9_43_ZNpm6zeKDtoSuPA1bv58SK_tELLljs3evw3UkSIJyEKDmTe0pzpWoqha7__HIMqswK1N77-eNScEVE1CAq_mYveEaslIJ1KCt5-8Zpsp7rMtZCFp9qwsbum0XZOQ61sjllWIWpXN2fW5z5WJ7JTPR9KUm9wKcp-n-rsPgzNmPTwKlGu0Ui38AXrfaG_3_-_KMAPtt8wQpvWghqYMECQefURz7Zapps915_Nsq7-mn57GzTEvjxo6-bBRyNGA93C-l8sum0RlyGP0Mhn8ILSp7UYvfngQCfaHtputoITKiNnT0Zz6h9pDxzy-xkmLjNVmzRBa984PssyPsjYcMaY5Mw4Z6yR_XCr-DZ6aEq-_e2JyChg9aUTmM3xwrIrHbcomoijJz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAAwBAAAAAAAADZAEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdA5DaGFpbklkBDU2DFNvdXJjZQhhdGVtFENvbnRlbnQtSWSAAWU1NjEzMDViMDY4YzJmNjZhY2U4MWE0ZDEyM2M4YTQxYWY3M2NjYjcxNmQ1M2FjNTI5ZjI3YTM3ZGQ3ODY4MTYcQ29udGVudC1EaWdlc3SAAWU1NjEzMDViMDY4YzJmNjZhY2U4MWE0ZDEyM2M4YTQxYWY3M2NjYjcxNmQ1M2FjNTI5ZjI3YTM3ZGQ3ODY4MTYcQ29udGVudC1BdXRob3IYcTJrdGZjZGJrdHNvAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweDFkNDIyNjJmODQ3YWQyZWU0Y2M3NjIyZjQxZDBhMTlhMzZhMDZhMmNcIixcInRzXCI6MTY5MTQ2MDYyNDE2NCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwicTJrdGZjZGJrdHNvXCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6ImU1NjEzMDViMDY4YzJmNjZhY2U4MWE0ZDEyM2M4YTQxYWY3M2NjYjcxNmQ1M2FjNTI5ZjI3YTM3ZGQ3ODY4MTYiLCJzaWduYXR1cmUiOiIweDdlMjZhNzlkNzMyYjdkMzQ3M2NlZDlkYTlhZDNlYzZkZTIxNGFiZTU3YTFlYWJmZDA4MjM4Zjg0NWI1NDgzMTA3NmU4ZWVmODJiMWE0OTZmZmJmMWI4ZTA3MDhiZmYzMzNjZTQ5NjI1MmU0ZjI3NjBiNGU3ZTJhNWVhMjIyMWM5Iiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVaSlk2UHJGN1BzRTZxYUcyL3N2Q2hTVGZnZkkreVZ4ZTlSaVhMUW5EOUREUklUOFJHQkhqL1c0SUxDNVM2dXNJZ1dhUUllSGtKK3poWEllVmJiU08xQT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHgxZDQyMjYyZjg0N2FkMmVlNGNjNzYyMmY0MWQwYTE5YTM2YTA2YTJjIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4OGZmMGFlYWM5MTE2Y2JlMTRlNTlmNzkyMmFjMGM2NzMyYTNhMjZjOTUxNzcwMjhjOTRlZDg0ZTk2ZmQ2YWQ5NzY1NGJmY2JhNTQ3MDA1YWQxODA0ZDM5MDFhMDBmMjZhZjNkOTgwNmQ3YWVjM2RmZjAwMzgyNjEwYjU5NTMxMzYxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWkpZNlByRjdQc0U2cWFHMi9zdkNoU1RmZ2ZJK3lWeGU5UmlYTFFuRDlERFJJVDhSR0JIai9XNElMQzVTNnVzSWdXYVFJZUhrSit6aFhJZVZiYlNPMUE9PSJ9fQEADtIAjH3_Ut5OtJGcmjrv4d42U7Nz4ruA-4184ESk6Zm1FQk85P5aHevcq4AiZlHP6HGdW7CtIJgOQIQXPFLdGZO8y8mdgO-tQUbiXjMFYkwX4IDtX1hK239Z8WdT3_s4USHYXLx3kTOiqXJPu8r48V6GWxEJn-jYgYjeViGrxZggQEq-WLrXEfVnj46ndeh4TlpIiWoi0gNixmuIYhCkrGvtNxpUD__FOu7HBRiZ-0MB_AVKA3PKBpnkWgu1ni38S4Cx6Y0CkxANGYmWQPrK-gZHfzeatO3_8OtJ6i6bvnwUB0htBl4rUm7Z7QCOstp_UAfR03ACGKfmvrqJ59sPCcFCBj36VH4M7qLd1xzEdExClYa9WrukewlBxSu7Bm33aF6poIw3XLr9GkxKvBbQM7GvJizPAjlWsLm_SB8_IZFYCE9fSh6UifE9faBeVU5J5kZbakhwmaxeemjfUaoIp_c6ZuP39Wrm3eC82CdCMpuoB3rhaydaBPDaIP4tKt5sjdH_TY3rBF2W39ipytP-pygctVXXCmhgRsqQmJRgh-3T01WxELPGyJOBC-U-MhhqqMZF1ehHvnWjFmOoxyBUzC1qdXq6DlB0EbeyUtWskYmixnYF6ZduHaYhZiiqlCZPKxLk28RqMSkAKFTA9yofZ0dPp9MDNW5Mq3vgcrmD_JKc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABZjI2NDQxZjc5MDVmYjA3M2ZlMTM2OTE3ZWU2Y2EwYmVkMmU5MTUxNjgzMmFiN2JmNTQ4MDc0Mjk5Y2QxOTcyZBxDb250ZW50LURpZ2VzdIABZjI2NDQxZjc5MDVmYjA3M2ZlMTM2OTE3ZWU2Y2EwYmVkMmU5MTUxNjgzMmFiN2JmNTQ4MDc0Mjk5Y2QxOTcyZBxDb250ZW50LUF1dGhvchg5N3NsNjd4a2R6Y3MOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHhjNzBlNTU2NzUwMWE2ZDMzYmU1ZmNhMWNiMGUwMDFhMmMyMjdjMzg3XCIsXCJ0c1wiOjE2OTE0NjA2MjQwMjgsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjk3c2w2N3hrZHpjc1wiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiJmMjY0NDFmNzkwNWZiMDczZmUxMzY5MTdlZTZjYTBiZWQyZTkxNTE2ODMyYWI3YmY1NDgwNzQyOTljZDE5NzJkIiwic2lnbmF0dXJlIjoiMHg4MzMxYzBlODAzOTUwN2VkNjAwMzY4M2Q1ODVmZTZlOGU5MjU2NTFhMWY5MzJhZmMyZWEzZTE2ODQwMmQ4ZWIzOGE5YWQxZmIwNmNlMjMzZTljMjVkYWE1MzVhZDc4YTcwZDk2NjE4YzE0NGM5M2FhMjUyM2Y3ZWYxODgzNGEwYyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFTlRpaEpWRStxeHFqZXJycVAxMFlNTG1FUFduNUZ5cUF3bzhpajZmWFQwZVE1Ky8vd29tbk05VWFpWGdHWFNzMmFVT081eUwxa0dtdUxaQ0dBQXVNWnc9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4YzcwZTU1Njc1MDFhNmQzM2JlNWZjYTFjYjBlMDAxYTJjMjI3YzM4NyIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDBjZDE2NjZiMWFjY2RiMzc0Mjk5MzQ4NmViNGMyZDc4MGMyMjdjNzViYTA5YzE3NTZhMWQyZDk2OGNjMWE1ZGIyYjA3ODk0NjQyZjhiNDdjOGRkMWYwMjU5YTRhYjRlZmJiNzU4MmMyOTNkNDliY2QyOTAwMDgxNTlhNGY3ZDRlMWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRU5UaWhKVkUrcXhxamVycnFQMTBZTUxtRVBXbjVGeXFBd284aWo2ZlhUMGVRNSsvL3dvbW5NOVVhaVhnR1hTczJhVU9PNXlMMWtHbXVMWkNHQUF1TVp3PT0ifX0BAHJEnd9y_pDL64eMfDztNRaN64cm-8kMDLSl08Eyt_UjpmDoG0mG-47fX3HHnwJr4Ey2JDw8d9xZ37Dtn88D4B1xtY01Ei1UJRVRanarF0hvGvugGSUkw_pDEOOE11PZ7n2_IwMDbFO2A5aHQUMaILhLxPjfdEDk3UWYRBCKqMSBn5eVPspYktc2EfHIQCUjFimp45jDyxiUtRKqV-ockK6f5-HM7kroG4OKdc8ZWguO47zQQTgCtiapkZ0qyVUQ5lwkYOaUFpGGCrTYVZl_1kdR_YdAGvAWhEU5ezQufjMT4-Eq77BySFxoZbjIi5fUZEH49evlFln3pq7BvAvRf3FdzkpYdZQyh7LD2tafSE4bJ8NdRubfehNgsYO5__qg1hOnZK3TSjtzPt8BnNceVyfFkqdLoW71aUfSJq8jzjuC3sWZgcNIG3SWDhgxmPcHxGqPxy88wR65HMB9Jzoa6vdtCqUPQcMu3q-v-C5Cbduran7xhrt2wXGtTVbkR_dPkAg8HyEp3kRpOGHBnbq4t-IP-SH_wjtCgoWoVVBcIlzJa-f0pjNkcj85g5dYqEJKdEjRLjRyUEC67piC6Anq0PtOUGx3tuHq0KsUIH7H5eU8Y_YO1lHd728nxSLvRKaLvBNp93nbPl4N3ucuFVxGwTZLnQFvYikC5uZN0Rgi38FTnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAADAEAAAAAAAANkAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DkNoYWluSWQENTYMU291cmNlCGF0ZW0UQ29udGVudC1JZIABYjVjNmQ1OGJmMDQyZDdiOTM5NzQ3NDA1OTAyNTViZWMzM2VjOGZlODQyZmI5Yzg4NjFmNDc4YzE1MTUwMmI5MBxDb250ZW50LURpZ2VzdIABYjVjNmQ1OGJmMDQyZDdiOTM5NzQ3NDA1OTAyNTViZWMzM2VjOGZlODQyZmI5Yzg4NjFmNDc4YzE1MTUwMmI5MBxDb250ZW50LUF1dGhvchg5Y2ExeWZteXdvMmMAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4NzgzYWQwMThmY2M5OTk5MDlmNDU3ZTViNzAwMmFjNDdhOWJlZmNlZVwiLFwidHNcIjoxNjkxNDYwNjI0MDk4LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCI5Y2ExeWZteXdvMmNcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiYjVjNmQ1OGJmMDQyZDdiOTM5NzQ3NDA1OTAyNTViZWMzM2VjOGZlODQyZmI5Yzg4NjFmNDc4YzE1MTUwMmI5MCIsInNpZ25hdHVyZSI6IjB4ZDdlYjY3YmQxNGJlNTBkMTEzNzVkYzEwZWU5ZmI3NmRiZDhiMzJhNjAzYTgwYmI2MjU5ZWFjMjlhZDY0NzA5Yzc5MmI0YTlkODAzMjAzNjViMmE4MTAwY2YzYTk3NGViNTEzMzNlNmJiZjAwNjgzOWQwNzk3NTI2YWY1NmY4M2IiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUgxNlR0emM0Znd1dTIvWTFBZUs2cHNvTlpTek9lTEV1TFNOMy9IUW5rMUswL0JsOThicnJnZFdIckVBY1ZqMHg2TmRpMTFlSVdEMDl1b0l3WEpobktBPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDc4M2FkMDE4ZmNjOTk5OTA5ZjQ1N2U1YjcwMDJhYzQ3YTliZWZjZWUiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHgzNWUyNzMwOGI3MjcwYWZmNTg3OThhZmI2NTQ3MTNjMmE4ZWQ1YTlkYjAwNGI4ZTkwZGQ0NWQwNGE0Zjk1OTJkNzZkMDg1OWY5OGMwNGNlNGRhZTUxNTMzNjI0Nzk0NTYzMmE1NTc0MDgzNWNiNWUzZGQ2MTQ1NjczMmFiNjdjMzFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVIMTZUdHpjNGZ3dXUyL1kxQWVLNnBzb05aU3pPZUxFdUxTTjMvSFFuazFLMC9CbDk4YnJyZ2RXSHJFQWNWajB4Nk5kaTExZUlXRDA5dW9Jd1hKaG5LQT09In19AQBxhpl8y0ozf5WWfEVZ84ZG04LDhATmwWm-yoZ_B_tNYr2801oGNkRFt9NdgvoKRISgguKgDT7CVS3Gz5h-ko0rGEH5drgJKfHdBda4iVv0ygGut5EQxmMkYTqmJCnhxytF1mub9B_R3KqtVPhP24lwndDBZ6U1IVWbH_19lCTmd2lERWLzxlONBh39y84klGd1fWCYsNKOvjIvB9X7opR8Wqm8NjrhWACTCBY6BSC1bZYRBAKMVG1vZgHXB4OjlbdVGKkkLrrbwLVKr8TRLeKyy2eMhbYH7N-aN_Qz0ghPlGHwfk5c9KP-_Zi8xSTLrVaPm9iHysRyxRyWaKzGtbyEmR6R6M3pF5GdIdCzU7RrCfwXDrdCEkcG1FZ6r3ZlCIp2Vamv-6xQI283BbS_lQk_X4dLx7H9tWJRGASSN5en52HryAxux_PKpAQcy4nYR2RuNVW31ls8tGayrxiyoSNHOmCX9fbt1I09BltymCGYNJ11x7ewpJdWMaf6iWa45ogR1rQQkIBHhKGvmEfkF_0ZHJe9WgH6TCWzpM5li313QzZNoa-K12YyRu1rtUM1UVV3OgHYqyt9GK3HkBzelTP_xcWf_9nTjtkzzq4LeZG8iZ7XlmIsIPLbN4JYEPr4h3W2pzRCOLWdejC7kwQWTFs0UVpIwaeQIrbPYhnRiGcvRJz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAH0BAAAAAAAAD_IFGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdAxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3FENvbnRlbnQtSWSAAWFjMGRiMmMyZGJiMWRiYTg4NGNkMTE5YmU3OWViYjRiMjJiZjg3MjZiN2JiNGRiNWE5M2U5NzE4MzUzYjA1MTUcQ29udGVudC1EaWdlc3SAAWFjMGRiMmMyZGJiMWRiYTg4NGNkMTE5YmU3OWViYjRiMjJiZjg3MjZiN2JiNGRiNWE5M2U5NzE4MzUzYjA1MTUcQ29udGVudC1BdXRob3IYZzdzZDA3cmk4ZXc5DkNoYWluSWQENTYcQ29udGVudC1UYXJnZXSAATM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2UAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4Y2VhNDk4MTA5OGVmMDc5MWMxYmFiMmUyYWM4MTQxNGYzYmRjMTdmN1wiLFwidHNcIjoxNjkxNDYwNjI0MTc3LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJnN3NkMDdyaThldzlcIixcInRhcmdldFwiOlwiMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZVwiLFwidGl0bGVcIjpcIkZsYXBweU1vb25iaXJkXCIsXCJib2R5XCI6XCJTbyBmdW4gdG8gcGxheSBpbiBteSBzcGFyZSB0aW1lLlwifSIsImRpZ2VzdCI6ImFjMGRiMmMyZGJiMWRiYTg4NGNkMTE5YmU3OWViYjRiMjJiZjg3MjZiN2JiNGRiNWE5M2U5NzE4MzUzYjA1MTUiLCJzaWduYXR1cmUiOiIweDY2MTRmOGFhNDE2NzgyZGMyYzY0NWE2MjBhYjk4NGMzNjAxNTc1MThlMjg3ZTUwMzYxOWQ3NjI5ZDI5OTBhNGM1NDVjNjNmNTFhMWY0ZWIyN2I3NzM1OTYwMGZkY2Y5Nzk5YzYxOGQ5MGM2ZTQwYmMxYjg1ZjZlNzE5ZDAyMDZjIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVWWE93Z2RhVFEveXZGTXQ5emI3em5LeTBlbURhZis3aXdMR0V1ZEc4SHZLWCtlaUE1Yk9XMmc2c3BqaVdUaDJIUnFPZ0Z4QkNOMGtidnltd2c3NDl2UT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhjZWE0OTgxMDk4ZWYwNzkxYzFiYWIyZTJhYzgxNDE0ZjNiZGMxN2Y3Iiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4ZWJkYjdjMmM1MmU2NDhjMmViOWJmNjcyZDVjNWY1NDRiMzAyYWFkMzNjZWNjNzg5NTA0YTA0NzdhMzgwM2ZjZDY0NGRiNTE5YzhhY2RiZjdmN2UyYzU3YTM2MTAxNTczNjFjMzQ3OTFlODUyODhhYWM5ZmVmNzMyMWM5ZWFiY2IxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVWWE93Z2RhVFEveXZGTXQ5emI3em5LeTBlbURhZis3aXdMR0V1ZEc4SHZLWCtlaUE1Yk9XMmc2c3BqaVdUaDJIUnFPZ0Z4QkNOMGtidnltd2c3NDl2UT09In19AQBt-Ss9rOo3E7ACINl8XRf-Qyhdtb4cvvYWXPWNSg06NRAhAsLOuHBTw3cVSEAWAWywNsIQ_IsauJG1pv81nv_Uq7enrCGnUy3yCr9oFonD0dWxDU2mNaBEzJkDM73YhoRWRsTDNixdeRqBOEoQZIM02PoNnJJ2_2YRZgHXmNX6YG_WI_4gwEjyfyEIbKh8M8dOlw7XPTTE_8ONiQ_YixwsJIjAFwHWUEefQgzVEohlSzKUl7OIsHSnxxCe6xS24UqSD6Zne8SSGl9DU4oj9b9jc0_V8umJfCngMzYxab4lYKcGLuJTHZK0dS-TsiR0eaeMXecVrU8sK9SlGI8TmGyGq-stT9lWYyI52Ky73N9tQn5XbkH1DYg7g9o1HiPnede-N5Wperxfiz6WD4qerY103KCAZMFJdg6MX3FLTwh07G-4QJqXbsTRrPbOOM0Kz3N0njp-1bYngKuV8sQf5bx8jIN0uErlW_O6_0k4B6vs9lbmpLcWeTI50wQzDQlhQFmwHw_OiPSk_pJ5vJHT75KzQAnV8Nd2EpRvC7FNUBaLx55vgTj5BNfgVwPlMn3QTd11tnz39gXjLOMX3Dr6JZscdv8hvW0GerJK8wWTftxD5qXAFtDqGCPm8mrlSrANqbqjhlqVgJEeLPOrqnVW4zDgJ6aOOGaHsP1A9uloN1TUnZz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAABIBAAAAAAAADZwEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAEzN2ZjODkzNDNkMmFhNzVlYTc4MTlhNGNlM2M5NDU0MDg4ZmQ1NGY5MjRiZDdjMmMzYjNiZDI5OTQ2MDg0ZDg1HENvbnRlbnQtRGlnZXN0gAEzN2ZjODkzNDNkMmFhNzVlYTc4MTlhNGNlM2M5NDU0MDg4ZmQ1NGY5MjRiZDdjMmMzYjNiZDI5OTQ2MDg0ZDg1HENvbnRlbnQtQXV0aG9yJGphaXJvYmVybmFyZGI4YWpnNA5DaGFpbklkBDU2DFNvdXJjZQhhdGVtAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweDc4OTRjYTBkYWYzODA1YTFhNTk3NmZjNWU4YWY5NThlZTBlNTIwMzZcIixcInRzXCI6MTY5MTQ2MDYyNDkzMyxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiamFpcm9iZXJuYXJkYjhhamc0XCIsXCJ0aXRsZVwiOlwiVGhlIElzbGFuZCBvZiB0aGUgQmx1ZSBEb2xwaGluc1wiLFwiYm9keVwiOlwiU3VwZXIgVG9wLW5vdGNoXCJ9IiwiZGlnZXN0IjoiMzdmYzg5MzQzZDJhYTc1ZWE3ODE5YTRjZTNjOTQ1NDA4OGZkNTRmOTI0YmQ3YzJjM2IzYmQyOTk0NjA4NGQ4NSIsInNpZ25hdHVyZSI6IjB4MmZiMjU5OGI4Zjc0MmU0YmYxZjZhZDNiMmY5NWQyZjQ0NTViYWNlZmZjNzdiYjUyNDU3ODNjNmQ4NzZhYTY1NmVmZmNmYzgyN2E2NTVlMDVmMmUwNjZhZjRkZmZiNmM4NWM5YjBlMzMyNjU1OWExNzExODkzZWI5N2ZhN2I1YzYiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWxCdTZXK2hEZmtId2FTOEdKaXkybURHZHlwdFlUdmhUV3BJR3VsTWtZSTV3UDhJNWYrZGs0N2RHeTQySnVTQkhHOWFzK2pWUzl0NEZBbHV6d01IT05RPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDc4OTRjYTBkYWYzODA1YTFhNTk3NmZjNWU4YWY5NThlZTBlNTIwMzYiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHgyNDU4ZGY1MmViZjE5ZGVlYzlkMjQyYzJhODI0NTBmNDE3YWNlMjljYWY0ZDg2ODlhNmI0ZGU1OTQ3MjJjOTk2NzBkYzM3OTdjZTczMWEwOTM4NGQ3YTU4NWFjNmZhOGU3Y2Y3N2Y1NjYzNmFiNTE2ODA1ZjA1OGE2YTgyYjJmZTFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVsQnU2VytoRGZrSHdhUzhHSml5Mm1ER2R5cHRZVHZoVFdwSUd1bE1rWUk1d1A4STVmK2RrNDdkR3k0Mkp1U0JIRzlhcytqVlM5dDRGQWx1endNSE9OUT09In19AQCKY755ww4SGy2v6rU36pvHqHGXe5tjRr1thowZhxqlR2iz07nFrECVHmBaCr_vyn-tLx7917SmutWAaxB8Vyd5a9dgluO1cJ7rH1KYEs8Zjg6kv-f3l8vAsUhHhk4QHPIr0ju8Rdg77Z4fSPhlRQ4cEJ6fDyjdnwSrlUCCqbSo_eb_rRFn6imjxPf16RRZzusxtoAm2_zd_R34_0I9zaz7dmkTUXdf20jDa4R28t5uAXPlTf7xT9wJU-va11Y7dSp7kCAmQjBBE3UlnT8eCbILX8LpJu8J3_76ZnAI8DqPrYOCS0l4Q1Glk7UvTllhTupZ9xbj65YGZRy3OENxJeOF719FV50_LFj0II-McU1F1SIAmyvSAbAITef3b7VN3Br_AGfdSZhN-Cjaqv1Yo4ye5Mnr_LaU-gE2xDZayb0ufxdLXR2K0SN5OzwyW99_o6rdaXjkpOWWnkikAk5_R3Qy5Y-didNLMm67R7axxKWSoNpUELTRajHlr-0gonrSuSqcJnt30VQF_bpVg1TptZOmxDwf9j1gC4fIFo4PTLWJGGl35ehwdQxm5xUq1Q5WzVwi3LAdbRTrih_aQthbX9cGlaUe6002UH3W74MWxRU52dXiOKlLBzRkt-LGNz6RE_0TiY5G8ydGyf7vjQ-qpAud8t56AtZjtdH-gXV4EVTZ7Jz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAA0BAAAAAAAADZIEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAE3ZDAwMGNiNTI5NTc4N2I3MWU5YThhM2M1NGY5MjdjNGRkZDA2MTg1MGMxYzMwYTU0MWEyMzlhNmQwYTlmNDdlHENvbnRlbnQtRGlnZXN0gAE3ZDAwMGNiNTI5NTc4N2I3MWU5YThhM2M1NGY5MjdjNGRkZDA2MTg1MGMxYzMwYTU0MWEyMzlhNmQwYTlmNDdlHENvbnRlbnQtQXV0aG9yGjg0NjkyODI2NjYwNjEOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg3MTc4Zjg4MzAyOTc4ZTFhMTIzMjBjY2U1Njg2Y2MxYTE2MDgyZDBkXCIsXCJ0c1wiOjE2OTE0NjA2MjUxOTIsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIjg0NjkyODI2NjYwNjFcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiN2QwMDBjYjUyOTU3ODdiNzFlOWE4YTNjNTRmOTI3YzRkZGQwNjE4NTBjMWMzMGE1NDFhMjM5YTZkMGE5ZjQ3ZSIsInNpZ25hdHVyZSI6IjB4YjRjNTRiNzFjZWE0NGE2ZjBhNTUyMzlhNTEzYmU1NTg2ZWQyMDY2N2M0M2UxYjU1MTJlY2ZiMDFmMWI3ZWM5OWIzYzM3NzlmMjU1NGE2YTNlNzBmYTEzYTQ4YzAyYmM5ZjQyYjRhODljNGEyMTY3ZGFjMzQwMTcxMzllMWE3OTciLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUpTMXM5MHBTVlFnWWRYOTJIZGVXaDJjWnA0WHVvNjRmRERYVnF6QWtvb1NJeXhzVmkrRU54a1RINHVDckhuSVpGZ244c1hpQXdaSHVDTWp6bjRZVkp3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDcxNzhmODgzMDI5NzhlMWExMjMyMGNjZTU2ODZjYzFhMTYwODJkMGQiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHhlMzhhMWE1OGY3Y2ViMDI1NDA5OTkwYmYxYTk1NzVlMmEyNWZmODZlMjBkOTA4N2I0ZWMzMzQ1ZWE3NjBkOTUzMGM1Y2IzNDA2ZTFiOTE2Mjk5MjcxZDczOWVhZDFhYTgyYmRiMTllNzVmMDVhZjZlZDY4NTJlNjliN2UyNTA1OTFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVKUzFzOTBwU1ZRZ1lkWDkySGRlV2gyY1pwNFh1bzY0ZkREWFZxekFrb29TSXl4c1ZpK0VOeGtUSDR1Q3JIbklaRmduOHNYaUF3Wkh1Q01qem40WVZKdz09In19AQB3a49J0vHj4Q-1T7Rz-8moRKNbXX9gw0IpzLTuxog0ckxHr6JHo1H_meRPKX_kFUJoqBgZw2eVoirnXcE1rCKFaMAqY8fK10_w8eTWogoBuHqO6GP3iHS868TNIkSuZh9KCZ61bX2sOwOKQWWA681EQCMvjZELkOrAhzPwT93p3cErQmcc1jm9gv9LcACSI46uxTvv_glmWSXWgyozti9lXQmiEmeGuUP5bS8pbFKR155XogDOmoBrns4EgP4GJypBABX80UEgtJyfLC-yBM49W9nSkyxLJZ7hIsZIwSdULWhRhqVtrSJY-R38JJLeu16WitQJiCmgGo3H_6Rpg5rI08wagVWJMM9RX8QL_4w6D9j0wdguT5xzzVM0Xaw2WV50pM1INErpW3at0odfIkuFeN1NGkZYmecnZwzbXjeioUerQfuVmBqBwfB5UskJdDTZfpXgAKLk_VcZsnre1P53Pae8JvFUFheqs_NUkwTe2dMCtLntYynntF3vt-HJVaEok7pfr7SZFJe50-ReUCQvTTSKXW1Nv-oOwCBlhY0Uy2_6cMjybeuBnVkPLy0M8IBUhYH4bjH8os-asOrKtW9qRevFwedxvx7zlAZOMjzpyTZ6aWQu5e1mvmPgzc-VEQJzPv2YlHaK0o0LGO0RnyST9ZSQs-Fybs3jxxdlJA6pO5z4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAAwBAAAAAAAADZAEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBxDb250ZW50LUF1dGhvchgxaWR1azc2Y3BmZnYOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbRRDb250ZW50LUlkgAE0OWE5ZGFkM2UzNWY0YmE4ZGJlYmQ2ZTRhNDIyMmI4MjhhNDcwZDE5YzNjNjk4ODNiNTBlMmE2MjEzNzYxZjIxHENvbnRlbnQtRGlnZXN0gAE0OWE5ZGFkM2UzNWY0YmE4ZGJlYmQ2ZTRhNDIyMmI4MjhhNDcwZDE5YzNjNjk4ODNiNTBlMmE2MjEzNzYxZjIxAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweDIyYWZlYThhMzc2MjJkOWNmYzU0MGY2ZGM3MDI2MjBiZTMzNjJhMWJcIixcInRzXCI6MTY5MTQ2MDYyNDM2MCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiMWlkdWs3NmNwZmZ2XCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6IjQ5YTlkYWQzZTM1ZjRiYThkYmViZDZlNGE0MjIyYjgyOGE0NzBkMTljM2M2OTg4M2I1MGUyYTYyMTM3NjFmMjEiLCJzaWduYXR1cmUiOiIweDM4OTM1OTk4NjBlZjc2ZTRmMWRhZTI5Yzg5YjI4ZDZmNjk5Njc2NzA4MjhiYjAyYmEyY2FhZmUxMjllNTZjNTk2MDI5OTg0OTUwYTc1NDY3YWRiN2I2ZmVhZTQxMTVkZTllYjM2ZmNhMzQ4ODEyYmJmMDZkMTRiNDEzOWU0NWJjIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVvKzQ0d0tBVWp4SkVtZWRLY2NvUXMwTG5LWnlOU1FiRXdoVzloTEFPMnBKdnFpcHgwREdSRVFMd1VCalNQNy9Bb0JCdkVRV1ltRWptd01JTlF1Z3NlUT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHgyMmFmZWE4YTM3NjIyZDljZmM1NDBmNmRjNzAyNjIwYmUzMzYyYTFiIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4ZTMzYThlOTZlZDY5ZTgzM2QyOGRkY2VlM2UxM2ZkZjg0ZjIwNDAyMmVhNzhhMjNhMjkzOGNkOTdlMDRlMjYwYjA3MTczYTBlZWQ5ODJhNmM2NzU4M2JmYjhkYTViOWYzMTQwN2UyMjVhMjdmZjYxNzMwNjkxYWY1OTU0ZmU4Y2IxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFbys0NHdLQVVqeEpFbWVkS2Njb1FzMExuS1p5TlNRYkV3aFc5aExBTzJwSnZxaXB4MERHUkVRTHdVQmpTUDcvQW9CQnZFUVdZbUVqbXdNSU5RdWdzZVE9PSJ9fQEAJwJV3hib-IwMbV1jamYLZYLWtpxOqf_GiSGXG4UD0xYsTvPNFwE2w3mvKU8m4-pIFjKqSKxaduOj8ZHbXpDLAZBL_o6UUZiWqr6bz_r3btFS4WZ52F9eM6jICx5ahMbnbKsMTPfAY5q4653HuYgs51g4BAH0OPA0yhMR_mXkQemFF0uf1s2s7WLjbehBmnTMI_fXXIwe-dauJfWlSu6pyzqZLAC3YgqEm6vPTdlW0jdw7OGeVakBCVxYsNq8O9Rznojkn0lpW5hNIpVD6nfCMqJL1uj0cH2vJ_t6wkGSBmUbSbPuedVyAMdCszSu1dK_r6ryqM3Bn1T3qGO4hBphKUnJb5j4-2gAzSibZDFp5sCHpaxdt92VlAbhDMh1skcHuJ2vc49j06k4KA4fOv9pxrruZ-QW_dLkKBjdlPq1GW3Fx5coEB5bNNd635nmK2Q6xp-zLgikQ-0ACb9SO1EedLfApZra8uNOzIHZx2ZQ4h-W5hzo31Ad2XQrz6XhUwVZ3iNNeTvAgZLVM2wS1jtohSiv_lphCXFcgnrOYT0uRSzdsx9ctE4Ry2X5oDgPGR96vxdX43Roj2jQ3Wa-CZtLXI_8Vinx2RskpClvyRC37iaMVAvSTZgL68WYFy9YcirXS6sDj_GD7a0FScQ2r32vQG5J2-cDoPp3MAZ0LMoZMrmc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAUAQAAAAAAAA2gBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1BdXRob3Ieamxnb3Fua3huYXBiczM3DkNoYWluSWQENTYMU291cmNlEmN5YmVydHVuZRRDb250ZW50LUlkgAE3OWEzMDgxMTVmMTVhY2MxOWY2NjE0ZDZkMWMzYjFhN2JiM2M3ZTA3YWYyMDg5MzYzMjE0NzNjZDBhNmMwMjhmHENvbnRlbnQtRGlnZXN0gAE3OWEzMDgxMTVmMTVhY2MxOWY2NjE0ZDZkMWMzYjFhN2JiM2M3ZTA3YWYyMDg5MzYzMjE0NzNjZDBhNmMwMjhmAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweGI4NTAzYWM1YWJhMWMzNDZjNGVkZjRhNDNlNjUxZGRlOTg5YzNjODVcIixcInRzXCI6MTY5MTQ2MDYyNTEwNCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiamxnb3Fua3huYXBiczM3XCIsXCJ0aXRsZVwiOlwiVGhlIFNlY3JldCBvZiB0aGUgSGlkZGVuIFRlbXBsZVwiLFwiYm9keVwiOlwiVGhpcyBwb3N0IGlzIHNvIGluZm9ybWF0aXZlLCBpdCdzIGEgZ3JlYXQgcmVzb3VyY2UgZm9yIGFueW9uZVwifSIsImRpZ2VzdCI6Ijc5YTMwODExNWYxNWFjYzE5ZjY2MTRkNmQxYzNiMWE3YmIzYzdlMDdhZjIwODkzNjMyMTQ3M2NkMGE2YzAyOGYiLCJzaWduYXR1cmUiOiIweDhmYjJkMTE3MDZmZjliNjMzZTc0YWY1YmZhNWM5OTczYjNkZWEzMGFmNDEwMmZhM2VlMDg5MWY3ODMzZTIyNDk3ZDg4MDJjZWE4YWZkMjIxNjhiZDIwYmRhMmQ2YjM5ODZhNDY1NDg4ZjMyMzAwYTdjNGIxMzE4MjU0ZmEwNzhkIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVLU1FFQ1pESlNYdXMvZWMzcWp0My9uVmFPYW9YT2QwdTJnUFpMZDlvNThoRnR5cFRXU3hWVWFyWkpSUnNtaDdYT3RucXZ5Wk93YTFkYnlrWnpmdEdtZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhiODUwM2FjNWFiYTFjMzQ2YzRlZGY0YTQzZTY1MWRkZTk4OWMzYzg1Iiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4Mjc0ZmI4YmE4N2Y5YmI5OGQ2ZTNkZTRjYzY0ZWMyM2E4ZDE0OGRiZjEwZWMxYjlhMjhlOWE1OWZkMWNkZjZiYzQ4YjU5ODljZTY1ZTI2YmE1YzY5ZGZmZmZmMTZiODU1YTYzMWFmZWEyN2E3MzYyZjk0NDMzMGM1MzJkMTliYTcxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgSSBhdXRob3JpemUgQ3liZXJUdW5lLnh5eiBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFS1NRRUNaREpTWHVzL2VjM3FqdDMvblZhT2FvWE9kMHUyZ1BaTGQ5bzU4aEZ0eXBUV1N4VlVhclpKUlJzbWg3WE90bnF2eVpPd2ExZGJ5a1p6ZnRHbWc9PSJ9fQEAI1xudZk174FLDQ2lzbA5-NskHBM435n5AUULzVDYVEJgCP9zfbkrkpeqcAP7XJe7VwQo9_07yVOEns0PaH-jJXwCKxi195D6-5a7sVf8HTgCRY0dtlv0-3Zbnij16vRvbfY08CFQ8Oq1qqOPpgP58fm3sRVoT2j-1TvCSrdjwFUFVcjSk07P3JkdvpLMXfEZ9O58rIAU4ILnMKQlCEy5_xcur8mGthP0VwRYimR5Te-RlLRe-6IrTVLR3RgnKItwzcd7nRjgZZPgcJxbp_eb_07MSmGeXS7B5Ndpp2TgPVRe--wZIEOTD0rCBctdUHioeuyk_08oi3b3bKcYBxVTq-IP0reVy3CygDdAsfy7mebH2uHplhB3aHWB5JY2brNyps2PP-yLRenVg0LwnnDK9k9eLc65zgvuR-9OWffRgch19RssLpXykJ8Ov2OG2JBONn9KeJiIJNh0MzTJzDH3lUAh1eTsw5LxfdP_gx_Nr7ARQrYaxBe26urVzOlhn9CWFEOR30bkD3raPvOXjRZwgf6iKNTvgBtnryvSgPBI5Jg2hK_xfTB6Jqn8ihc_Ri7YAJhtFwXWoZYLpqeL2bhUZjwnt1oP1-Q7bBXQ--H2PsbJPwxdREFZJ-sl9BbGXWd3RG4LHJ69RqDG3LRDGBYagFHIqb4sTSCM8yinxkXVTKWc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAAB9AQAAAAAAAA_yBRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABNjkwZTc4YWUwM2ZhMjFhZGQyY2E1YjA1ZGFlNjg3YTc1OWRkODFkN2U3YzljM2MzOTA0YzQ0ZjFkZjFiOTUwNxxDb250ZW50LURpZ2VzdIABNjkwZTc4YWUwM2ZhMjFhZGQyY2E1YjA1ZGFlNjg3YTc1OWRkODFkN2U3YzljM2MzOTA0YzQ0ZjFkZjFiOTUwNxxDb250ZW50LUF1dGhvchg5a3dsZ3ViZXd3aXcOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3AHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweGFlOWM4MmZhMTk2NjU4YjRjOGE5ZmMyZjc1MTUyN2U1YmUzZWY3ZjJcIixcInRzXCI6MTY5MTQ2MDYyNDQ2NCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiOWt3bGd1YmV3d2l3XCIsXCJ0YXJnZXRcIjpcIjM5ZjAyMTg4MWU3Mzg2ZjhkNzNkNmVmMjU1MzNlNjA5MWYyYTAyNTZlNDIyYjRiM2M0ZTNkMzM1Y2NhZTE0N2VcIixcInRpdGxlXCI6XCJGbGFwcHlNb29uYmlyZFwiLFwiYm9keVwiOlwiU28gZnVuIHRvIHBsYXkgaW4gbXkgc3BhcmUgdGltZS5cIn0iLCJkaWdlc3QiOiI2OTBlNzhhZTAzZmEyMWFkZDJjYTViMDVkYWU2ODdhNzU5ZGQ4MWQ3ZTdjOWMzYzM5MDRjNDRmMWRmMWI5NTA3Iiwic2lnbmF0dXJlIjoiMHg2NzU5MzkwNzIzZDRkNjllZjNhZTk5MGNiMDcyNDA0M2RiNjlkNDA0MTZmMTExNmMxMGFhYWI5OTYxNzJjYjAyMmIyMDVmYTk4ODVlZTVkZWY0NDU1ZmI4ZjFkYTVkZGZkMjgwY2U0MzhlYTgwMjFmN2U4N2VmNzQxYTc1YWFkNyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdDdxY1N3MXdpSlMrUUJhRy9CWjRnM2JBWE1DOE1UUWhNcWhKZTNpLzJnSGlsdlpocHk5YnkzQ0JoZmxTQm12WDdVT0xhTVA5OGtNTDV1L1ROV2p5S0E9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4YWU5YzgyZmExOTY2NThiNGM4YTlmYzJmNzUxNTI3ZTViZTNlZjdmMiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDNmZDhmNzVlMzRhNzcwYmEyYTBkYmU0NzcyZWVjZmIxNWMwZGYyYzRjMTI0NTZmNzc4ZmE1NjdmM2UwNmRlMTY3Njg2OTM5MWU5NzY0MGU5MDkyYWEzMWZhMzUyNGZlYWIxYzZkMzQ1MDU0M2RjYTUwNTQ4MjdmN2M2OGM4NzllMWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdDdxY1N3MXdpSlMrUUJhRy9CWjRnM2JBWE1DOE1UUWhNcWhKZTNpLzJnSGlsdlpocHk5YnkzQ0JoZmxTQm12WDdVT0xhTVA5OGtNTDV1L1ROV2p5S0E9PSJ9fQEAdrY2G6okB1SF17TjOpTTJhh6QluX1bafe4D2fYsw1hJ_FmfJoTfsC9CzJ1_5cSlHd4j5CFTOqXO_J94oz8ZdNNd7zDGloi-q4w9cDNdUutFWGNuwdAZm-f-L01W32c3T_euDCIwmSnr2eBMSDsx31pMpFldFSB1NNndiuiaL55wKes0YC2xcVGXt--K_TQgB-qk9087J5hB8FNuH-4x8NteLvb7xCQcFGOjyjXmJnrIRqqAylYwXfQUeOsgIHfCAaUnEsKssRpUG_93w5Wx60PXjWn_wv86r08Q331vasbiJoLydWLrRl8ANEKPLmfmJSSf3oUPRN2jOH8B8iZZA3R0GrrZ4JFcgFMtEs6dHxG09cHJu_RXBhqt3n3YyhRxJAh8EJdBorlPQbIjrmgQW3ZVk9xbZexdIIRmpUyPEuAOPgAHBYTWPMhQa4XHUw-8J6VrhCiQAhEFRnnc20N0UncCTcFZCYZS7qBFvTsjMq3_OQF4FsR-c-8Z2-7n9u8lscFGra-3ojYHHDXDXmeNXS-Dy18CDtx-LdQ2cBIygBDaM3x2zpr8H3ikDbBDX5jRnnoJmNNIKaKWje2VnQREkUIbMEod8aa0keOfA7WyU_wuFGIPr6VpQ3ZPOBuSjY_kiOLhWrcwBPcYhF0TxxQ1QS64MkD98QKJ5pfuX3V7DF4ic-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABYzZmZDM1ZTY4MDlkNWY2MGNjZDMyOTgyMWFjNWM5ODAxODI1YjlhYWYzMGM0ZDdlYTk1OGRhYzg3Mjk5MTAxZRxDb250ZW50LURpZ2VzdIABYzZmZDM1ZTY4MDlkNWY2MGNjZDMyOTgyMWFjNWM5ODAxODI1YjlhYWYzMGM0ZDdlYTk1OGRhYzg3Mjk5MTAxZRxDb250ZW50LUF1dGhvchhpN25ybHViNnF5dm0OQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHhmNTlkOTY1YTQ5ZjFlZmQxZTA2ZGVmZjUxOTRmZWE4OTQ1NzEwOWUwXCIsXCJ0c1wiOjE2OTE0NjA2MjUxNTEsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImk3bnJsdWI2cXl2bVwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiJjNmZkMzVlNjgwOWQ1ZjYwY2NkMzI5ODIxYWM1Yzk4MDE4MjViOWFhZjMwYzRkN2VhOTU4ZGFjODcyOTkxMDFlIiwic2lnbmF0dXJlIjoiMHg1YzRmMzJjNjczZjhlNDlmNzRiYTRkNGI4MDA5NThiMDM2N2JhMWNlMWZlMDRjZWYxNzAxY2IyZmIzZmMzNDg4OGE2YWZkY2MzNDU0MzkxZTRlNzQ4ZmY3ODU3MWQ0YTRmYTg5Y2IwOGNhNjQyZDdmMzg5YjE1MGZiOTJlYmMyYSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFcTJtRWR6TGNRZ2RKQitLZ3VZYWJKOXkyNzRnYTlNeGpuR3RmSGpZbjdNZHFIM2xvc1pNYmR4L3ZnN3ZoVHNJTm1MSWNscmNvV2VLMHl0NDd1V2FkQ3c9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4ZjU5ZDk2NWE0OWYxZWZkMWUwNmRlZmY1MTk0ZmVhODk0NTcxMDllMCIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDFmMGVmNTgyYjU2ZGM3NWVjMjVmZDUyNWY3OWNkZTA2Yzg2ZDg2MTI0ZGYwZmQxYjA2NzE1ZDhhOTQxN2RlMjA1NWUwM2E1YmVjNGQ4OGUxYmVmMTRkMWM1ZWY5YTNmZjUzYjNkZmNmM2NjNjUxNDY1OTQxNDJhMmUxNTExNTM5MWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXEybUVkekxjUWdkSkIrS2d1WWFiSjl5Mjc0Z2E5TXhqbkd0ZkhqWW43TWRxSDNsb3NaTWJkeC92Zzd2aFRzSU5tTEljbHJjb1dlSzB5dDQ3dVdhZEN3PT0ifX0BAEN3lSFhRWQTLbY50NrVDdAoJs1sJl2j1XRaF1Y97l5CDGnRgobkpIA5zeOcA6573rJ_dNrklZdGiHq4UF16_SJWIwkcyi8yJzRTgHC7ipCC8ZVPyAVW6qYX6LVQoRjgKrwcpTIR5nSsIV7aBpZCS4BUfh_SL0yv-zkWLTDGw38jHJOhUlt-TneBe7RW2eGsHzHUoC00zUXmnvjx0liUQmSoZ3VELO-6Jd7clG8oqnY5g36gTdhJT4NSDAuG56I4kpL8ZQuamdbuTImNqnlgoZg9a2nS6YdANyMUmL84yK-zV8DFQ9Kvea_RjYAF3Sy0hYXddmmwRziBDPMzb1GRhGDrDSSrVR0UFRC6oRKqxv2G0JoLgrzFDFi3vsPgjGB5EtMjkhH_Q3iGMUhGXkIduAAU_qnH1BayZLLp1QrEjDlvMMePw-eXG6ringwB7-9vbDDDVsbSZ32ZKfOuXGJ1RngM65zuFMaMMNux8p3rHLsMvT9EbcAnPDJNut2g_4Ev9h6aiPzp-yNSDX1C0s8fwzRPOrizTYEl5m0lbwjhOGOcioO438UnN4rGd7lNO6_nE0fTlgeWcT6laxtN8sz6_gEkciggQNPu8TdAecSddJHDnY_OYPqdM0VQOmor9gV92ZbNEyMVNxB_YMjH4wX2cQg1mh7_b2ssKhLGr-lzJoBNnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAADAEAAAAAAAANkAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0DFNvdXJjZQhhdGVtFENvbnRlbnQtSWSAAWQzNTAyYThmODQzZmRkZDg3MTFmZThhOThhNzM2MTI2ODNlZWRkZmI5NjgzYTJlZmY0YzJjNDk0NjM5ZDQ3YTMcQ29udGVudC1EaWdlc3SAAWQzNTAyYThmODQzZmRkZDg3MTFmZThhOThhNzM2MTI2ODNlZWRkZmI5NjgzYTJlZmY0YzJjNDk0NjM5ZDQ3YTMcQ29udGVudC1BdXRob3IYejNibG1rNDNkdndwDkNoYWluSWQENTYAeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4ZWM1MDI3YjA4ODM0NDc3ZTFhYWEwYTlkNmNiMDQ4MGM0MzFjYzQ4Y1wiLFwidHNcIjoxNjkxNDYwNjI0MjM4LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJ6M2JsbWs0M2R2d3BcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiZDM1MDJhOGY4NDNmZGRkODcxMWZlOGE5OGE3MzYxMjY4M2VlZGRmYjk2ODNhMmVmZjRjMmM0OTQ2MzlkNDdhMyIsInNpZ25hdHVyZSI6IjB4ODY1OWM3OGI5ZmE5ZWYwNGYxNGZjN2MzNDIyOWI1MmE4YjQ2ZGY5ZDc0OWNiZTViZTg2MDIwODY2MzY0MDE3NWEzNzFhY2RjOWE0ZTA3NmVmMDBlZTIyMWFjYzRkMjBjMGZjYTI4ODExMzFjODYxNjNmZmEwZDMwODBiZDlkOTMiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRStLaUJBbWlOeEo1M1psbmk0Z2xDUFhTd2F6MmlNU0xVUURIOVhJS3J6aGpoKzdiQVZVZys1U0dIZzVxRXdsajBuRlUxcVkxcTJaQnpMZlVIMmZhblFBPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGVjNTAyN2IwODgzNDQ3N2UxYWFhMGE5ZDZjYjA0ODBjNDMxY2M0OGMiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHgxZTk2ZGExMWNjNjgzMTlkMTBhZTEzMWEwOTk0OWYxMThjZWMwNjhiYWM5ZTRhOWE0NThkYTkzN2IwYzQ4ZGVlNWQ2YmJhOGFkMGFhY2M3MjlhYTFhNzIxOGUzOTljZDMzM2JlYTAwMWYzZTFlODJkOGU0M2Q5MDU1OTJlZTgzYjFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUrS2lCQW1pTnhKNTNabG5pNGdsQ1BYU3dhejJpTVNMVVFESDlYSUtyemhqaCs3YkFWVWcrNVNHSGc1cUV3bGowbkZVMXFZMXEyWkJ6TGZVSDJmYW5RQT09In19AQAAP1Ftt9FdlOx7JsKC9l6OnE1iz5Mys04Nk40kwpS-lXb_lQNELUDep4BY1VO1d3Ebm58WNwcVy8qVFmQkmO66LosN9eCq_cMBFw3AFc4ogD0qHlnRq6QiEm6YWJvHyiXKrb7Eymes8T39SJz09ryu0aoipe686GejZDeJ2k-FYs-LBoIejfYVm5bUfqz8_bB6oSebZJqNWeuKq42ghxJQDqDOHCPg7PWHKZrYg61rmIfnVFKHTHHspzMesZgXOtm2jGz2n1oOucQXc9AVb1NCnCV7N4QNQ3xbdATEErzdZfcZoRquvbYl-GLEKqy0hO6b57YbbV_TocfC53QVk-Xk3W9omRER9BaBqo5Iji7Ge1Ju2t-cAlMQzEoN_w5Bf3PVAnwgejFGAmry2N_GpWR7hXz-pjdtrMoCJKfQJc0dwN6y129PZjL2V6TJa4mDIPjs-TcM-Z0wtQ-sHW8bKbQucjPSABHQlEM0nsxZWDD0Xh9yFWbAzq91iar3GvFzr4fJ60FBI829hhhLedq16HiWNcEMsy3XLT3RsK3ADQUxfkNbDQOxOsh5Us7S8dLkpjycPdpqG5H23Dwc0XG3Kvqdl0t_o-K-FbNN-zb_2jzTV41yGngPeKirqGtqEYWuotjIEyyXPnr_hEFKuroknx5UAHsjoJyuJHrqHiBr4iyb5Jz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAH4BAAAAAAAAD_QFGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdAxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3FENvbnRlbnQtSWSAATIzNzVmNjg5ZmY1YWI2Yjg3ZWY0YzQ1MTU1YjY3OWE0ZmU5OTY0YTVlZTZkYzUyOWFhMWVkODBiNjM1MWNkNTAcQ29udGVudC1EaWdlc3SAATIzNzVmNjg5ZmY1YWI2Yjg3ZWY0YzQ1MTU1YjY3OWE0ZmU5OTY0YTVlZTZkYzUyOWFhMWVkODBiNjM1MWNkNTAcQ29udGVudC1BdXRob3IaNDA4NTQ5NjE0ODM1MQ5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlAHsiY29udGVudCI6IntcIm9wXCI6XCJjb21tZW50XCIsXCJhZGRyZXNzXCI6XCIweGNmNDY0MGE1N2M1NzI3Y2U4MWE5ODg3NmMyMjE5Yjg0Mjk4ZTA5ODdcIixcInRzXCI6MTY5MTQ2MDYyNTI5NixcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiNDA4NTQ5NjE0ODM1MVwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiMjM3NWY2ODlmZjVhYjZiODdlZjRjNDUxNTViNjc5YTRmZTk5NjRhNWVlNmRjNTI5YWExZWQ4MGI2MzUxY2Q1MCIsInNpZ25hdHVyZSI6IjB4OWYwNjE5Y2ZmMTJlOWI1MWJkMTg5NTA0YjdmMGY4Yjc3ODY0YjhjZTc5ZWU0MDEwZWRjZjRiZmM3ODg0ZWEzZWFlZTFmYjM0OWE4NGU2MGJlMGQ4ZTEwZGI0ZDE5OTNmMGZmY2RhMzFiZTY0MDIyZGE4MDcwMmZlNzY4YTljMTAiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTBBRWNKbHgzdS8wTk9kUWxxWmN3UExwd0NRWkdMUUs0OEN0TzFmanFSMk8vRTdsQUE3RGNHcVNNQ2lJTlhkKzdIQ203dzUvZGl6T3ZoSmNZU0s5NENnPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGNmNDY0MGE1N2M1NzI3Y2U4MWE5ODg3NmMyMjE5Yjg0Mjk4ZTA5ODciLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg1NTQ0NzkzZjU0Nzg4OTcxMTI3ZTI4Y2QzY2EyYjI3NTczOGQwNzZhYTIxZjQ3MmM4Y2E0NzMxNDQwYzdlYjkwMjljNjAzOWUyMTg4ZWE4NzQ3ZGE3MGJhOGRjNzQzZWQ4NjY1ZjNhN2YzZWY1MWIzYzZiNmU0MDYxMzQ1ZDc2NzFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTBBRWNKbHgzdS8wTk9kUWxxWmN3UExwd0NRWkdMUUs0OEN0TzFmanFSMk8vRTdsQUE3RGNHcVNNQ2lJTlhkKzdIQ203dzUvZGl6T3ZoSmNZU0s5NENnPT0ifX0BADnYqxaB1rm_Sszh4zu92BwhN-9msI6_sfUosEnCfA9hnpjr81Gi5C5JMoUZi9yath1Vf72Tw0Y2huq83wdPQ7DXm_6YfnP7KfOQ5XkQfcX81raV1fXz_Lq5PIFE5E2Cc1Omwt1eJ1eOHtQokVTS__OIm13ne00lRrw-LW3_iRWwNFSMobjBZE0gDORgxlDW43yN_QJKKl0VjXcvRbWrdp8LAEG40UjNIb_oXT7S_fxsPJbn_IPVHl_w2JkLMCWCXNoqEtb1av-xjuTyP-oRw5k5npr-HzE9AND1V9wIq41iiumKrQCyHyl3Oo_-rj5o705xSZxOrlCXBdqzOkv2Dgl7XFahrbnUV-RuHE9SBr7akzZBmeaCEBgW_UO6WoJxy3BsRf4aSfIM9dl4x5aiAJTkwMi2CYhfmrSL2-oVn9QdBiwj4LTFSKGlLxypDbW_k8DNlioWgb6FWEgdQtzh8kjlj-IlTOZGgbgJTy7tFkQXJ5nOuFORG8n_9eYWA-SyIm1l6P6v15MOB5wYyuc25YRV6MgVTvyxw-Y6TpOtT4S7gVe5IG0EnL_-Sr_uX35IBtU-vEVvFIezad4oRfax1PItdy76RSS4aMvIEPmTlwqK0m8SUbH4t_pn8eB3ngUruU9f4HmfGN2M60qbAzRCNsEWlveaknilVGPAUsJuSKJnnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAAEgEAAAAAAAANnAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAAWE0MzI2ZGU4Y2EzOWY5Nzg1YThkNzczNjRkNDJiZjlmOGRlOTRmMWE3ZGZhZmFhYWFiMmY4NDQ3YTkwZTI0MWQcQ29udGVudC1EaWdlc3SAAWE0MzI2ZGU4Y2EzOWY5Nzg1YThkNzczNjRkNDJiZjlmOGRlOTRmMWE3ZGZhZmFhYWFiMmY4NDQ3YTkwZTI0MWQcQ29udGVudC1BdXRob3IkZGFyY2lhbWJlcnBmdGRjNGl0DkNoYWluSWQENTYMU291cmNlCGF0ZW0AeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4NmE2MWFmNzc4OTYzODhkNDQ0ZDRlOTA0NjdkNmIxMDQxZDQ1NGVkMlwiLFwidHNcIjoxNjkxNDYwNjI1MzQ0LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJkYXJjaWFtYmVycGZ0ZGM0aXRcIixcInRpdGxlXCI6XCJUaGUgTWVtb2lycyBvZiBhIFJlbHVjdGFudCBTcHlcIixcImJvZHlcIjpcIlRoaXMgcG9zdCB3YXMgYSBncmVhdCByZWFkISBJIGFwcHJlY2lhdGUgdGhlIGVmZm9ydCB5b3UgcHV0IGludG8gaXQuXCJ9IiwiZGlnZXN0IjoiYTQzMjZkZThjYTM5Zjk3ODVhOGQ3NzM2NGQ0MmJmOWY4ZGU5NGYxYTdkZmFmYWFhYWIyZjg0NDdhOTBlMjQxZCIsInNpZ25hdHVyZSI6IjB4ZDcwMmM5Mjg1YzYyMWZkYjk2ZTE0YWMxMjc0MDAzYmJlZGM1ODZhYmNlODc3ZjU0MzE0ZmJlMDRlYjY5MzZjZGE5NDljYjM5NDNkZDgwMDdiZmY1ZDIzMTY4MmNjZTkxNGFhZWM2N2RkOTUwOTcxZjFmNTU0YTM0N2Y5NDcyNWQiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVFsWFFtSGZLNU8rbDZkRGNsYWdoOHBvMDdnajFVRFdocTJjTk5ja21mY2hoeVBkSkFHYTZ1Z1pXRTFXcmZnRUR2R1p3bG5zcFRXYTNUcGpmVENkRlN3PT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweDZhNjFhZjc3ODk2Mzg4ZDQ0NGQ0ZTkwNDY3ZDZiMTA0MWQ0NTRlZDIiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHgzMzk3MDJiZGM4ZTdjMTY1M2VlZWE0ODk0NzMzNDdhNzg3MzViYjQzNjM5NTFmMTYyMmY1ZTAxZTUwY2NiNzllMjUzN2QwMDVlMjMxMjI0ODNmNWUxYzA4ZTUxOTNjMDkyYjJmM2NkOWE5MWUyMGFmY2ZmYjU2Mzg4OTQ2MWFkYTFiIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVRbFhRbUhmSzVPK2w2ZERjbGFnaDhwbzA3Z2oxVURXaHEyY05OY2ttZmNoaHlQZEpBR2E2dWdaV0UxV3JmZ0VEdkdad2xuc3BUV2EzVHBqZlRDZEZTdz09In19AQCHPMikfO8Yby2Og-Xzj6XEFbdl_jRLlmwU99wXcrI3yuiK7v70lpQGMprWhY4d4vF3RlKI7sMToEEVFlsmg9MsRx43g06dC8r-ZCE3m018Qtw4kU8yld5dVIj5IUlcexd2MtkFt4JnJNuKMNPD0vQCaCIyjHZW4z1yW74idHvTgTAAdUWsUKgqpMGFUKsejb41_QVfgqFHRmIum6tbMvzehKkqYCTbLPwN20-NjLpoUCgSdYY8YZTzevuG3llQikc99RqfAl149ODHGfzv9GIIhiQyHGZzxh873PT1u61N5AvmrEt8v6prmJZn_UhGGx-nHpVEH2zAqHILtW-2tBoSskQjNCgrhhB0Gy6fSsBQbjlkCYRm8lxoDFIBHDc6yEELuQHieepUTY8RPyFYhZwM_nHzJsV6trbV62433wCJ5P88cdcjxr5vPvq1bFOxlDMH8fP3fGs06ycdea9wD1Iy1q2cRxVqmK_X5YPY-PhB__5E_A7-7OTRYCkovPEzSKHkhPrzZP-sUaku320vQsDxl1s1-Eg8-8eqYRUiQOwRLm9bpaMKOzqS70I_gBCt9xDULQeZj0gujgqrJoFOfZRkFa3KQIEyiHqtV-R3l_YVS4LFkWAXWocXLlwVnmgMi6RRV6BW0eDeGFa0NxFdSAM5zym35nibQAO88qYsl4WlcZz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAAwBAAAAAAAADZAEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBxDb250ZW50LURpZ2VzdIABMjhiZjU3NWU4YTQxYmRjYmQxN2E1NGVmZGU0ODQ2MTUwODQyZTFkYjExNjNhZTJjZTkyNzAzMDU5YTc2ZTNkNxxDb250ZW50LUF1dGhvchhlZm9qdXl5NGF2NncOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbRRDb250ZW50LUlkgAEyOGJmNTc1ZThhNDFiZGNiZDE3YTU0ZWZkZTQ4NDYxNTA4NDJlMWRiMTE2M2FlMmNlOTI3MDMwNTlhNzZlM2Q3AHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweDNhMDA2NWVhMjU3MDYzMDY5NTI5MjU2MjkyZDE5NDQ2YjA1MjY0ODBcIixcInRzXCI6MTY5MTQ2MDYyNDQ1NCxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiZWZvanV5eTRhdjZ3XCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6IjI4YmY1NzVlOGE0MWJkY2JkMTdhNTRlZmRlNDg0NjE1MDg0MmUxZGIxMTYzYWUyY2U5MjcwMzA1OWE3NmUzZDciLCJzaWduYXR1cmUiOiIweDE0NGM0OGQ4YjBlMWQyZWEwNDdkN2E4YTExOTRjZTBiNDlhNWU0Mzk2NTU0ZTVlOTFhYjZiOTY3NTNiNGZiNTExMjY5NjJhZDc0Y2RjOGQyNzdiOGQxMmNlM2I4ZWQ2ZGUyODYzODMyM2QxNTViODkzZTA0NjkzZDk0MzgwYzRlIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVzZVp4Rnlkd2tOOVFOOEI0T3E3Ump1aUhRWnc3R1ZiYWIzcjh3ZWlwU1hrUXkrTDVwTm5KMXgwbEExS25RWGExb3NhNDVNRzMxVXYzclBldlF1Y1VLZz09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHgzYTAwNjVlYTI1NzA2MzA2OTUyOTI1NjI5MmQxOTQ0NmIwNTI2NDgwIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4YzhlMDFiMjcwNWVkNTM4MjAwNTRjYjlhZGFhMGE1N2VhZjk3NmJlMjIwNDNkZmE5YmEyMWFjMjczMjg1MmFhYTY3ZDYwNGIzMmE0OThkOWQ1NDg2Y2JhMjllZjE4ZWFlYjMyYmQ3ZjFlZmEzOTg1ODRlOThkZjI4YTA5NDQ0OWExYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFc2VaeEZ5ZHdrTjlRTjhCNE9xN1JqdWlIUVp3N0dWYmFiM3I4d2VpcFNYa1F5K0w1cE5uSjF4MGxBMUtuUVhhMW9zYTQ1TUczMVV2M3JQZXZRdWNVS2c9PSJ9fQEAWWXuHeBgyqNLL1XKiT35u5qGkKSggiQgkqe1j92w802RFG8OUjTx_ST6YfubfF8E23Y1rZHtzgEjRIrTep9Ju0kvQ52o0GQrzIdyGGPqrz240G5MAn-tUR1BEZSM6pa7AqXVyt8OJU5zFHTYxLmGeCiv1UXJeWAZr-o-PokyDe0-c3XKcjQ6dvntr2Z8tSNSbYpbx8pd32QZxXQEHCqC7QQ1wuSFN0kX-TsNFamUkk6NcPbPds6WgIUNNi22G64Dw2Fsmq40g4RdviUglxrfGSPq2xprPKCvN8Rtnji8Ja1hXl_PNhskd0L-jBp_XtTLgHvET6tjieAfOAd3fYQh0LqFlqanl6NzqdkK50wkiDdUJIFdJNmbVoby_0FnyFyWkoPD0ixSvcK9bQjTiXSlTtWfoYv9kpWx7iGKEhOpO4N7uHm9qQVILR2e7ProiFubEiyl3aV70OQA7rE2kYBcw31apWoA_07gYmawaenCxUINXcbz_u003MKpRKc05D37QBQYHlYXkmWsmOWsB2BAAtdp1tpQOEYixP_0GeU8uIibmv39_ur3nyYrbU_86QPouJXuDmnRnshdb1O1gEq7PFTuJCWW3p4HRJg7SMaG2CxlAssw3FexhoBs-S0Su9-JTOYVhtB3ZfeP2qKdfbCPH8Y3Iy7S3ctSadMDw_WJWNKc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAACAAAAAAAAACCAQAAAAAAAA_8BRhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1EaWdlc3SAAWRjNjM4NjgwZTE0ZTcxNGM2NjM1MDk3OGI2Zjc0YzJkMmI4ZTQwNDU4YjkzYzMxYTFkZWQyMWMzNjNhOWIzMTYcQ29udGVudC1BdXRob3IiYWRnbXRxcG1vaXVjc2h0NzMOQ2hhaW5JZAQ1NhxDb250ZW50LVRhcmdldIABMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZQxTb3VyY2VIMTU1MzFmYTItMTIwNS00ZjYxLWI2ZTQtYzlmNjhlY2Y4MWY3FENvbnRlbnQtSWSAAWRjNjM4NjgwZTE0ZTcxNGM2NjM1MDk3OGI2Zjc0YzJkMmI4ZTQwNDU4YjkzYzMxYTFkZWQyMWMzNjNhOWIzMTYAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4YzNkMDczYzI0NTZhMWJmNTc5ZjAyOTAyZWY0YzgyNDQ4MDhhNzc0MlwiLFwidHNcIjoxNjkxNDYwNjI1NjQ1LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJhZGdtdHFwbW9pdWNzaHQ3M1wiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIldvbnQgYmxpbmsgd2hpbGUgcGxheWluZyBoYWhhaGFcIn0iLCJkaWdlc3QiOiJkYzYzODY4MGUxNGU3MTRjNjYzNTA5NzhiNmY3NGMyZDJiOGU0MDQ1OGI5M2MzMWExZGVkMjFjMzYzYTliMzE2Iiwic2lnbmF0dXJlIjoiMHgzMjlkNjM0ODg4ODljMDhkZmMxMjJhMjlkM2Y2NTQ4MjdiMzExMjhhZWZlNjY3NzZkYzU5Mzg4OTJlY2UzMTJjNDlmZTRiMjFiMjdmMTFlNDdmZDU2MGZhMTA0MzQ3ZTgzYTRhNjYyNTNiMTI1NTFkYTY5OGVkZTU2YmExYmVmZSIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFZzZFelhDUjVKZzVJV05OTnhrZ1piMks3cTQ2YzZvRndnOHJCb0Z6S0FPekhoWFUvYlQ3L04xL3FPL2dLQkg5NU9TR3F6UFdWVWNsby9ISnJEUUgwK1E9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4YzNkMDczYzI0NTZhMWJmNTc5ZjAyOTAyZWY0YzgyNDQ4MDhhNzc0MiIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDEyNmRlNmE0MTJhMDgxNTU1ZDU3MTNmN2RkYmZiN2U2NTYzNTExNTQ2NzE5MzhjYTkzYzYyYTcyMTY4YWIwMGQwZjFhMDZlYjNmNmNmNDE5OTIyNTg5OGUyODJlMzYzOWE0MmQ1ZDAwYTkwZDljODg0Zjg5MzQ5MDkzZDZmYzE1MWIiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEN5YmVyQ29ubmVjdCBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFZzZFelhDUjVKZzVJV05OTnhrZ1piMks3cTQ2YzZvRndnOHJCb0Z6S0FPekhoWFUvYlQ3L04xL3FPL2dLQkg5NU9TR3F6UFdWVWNsby9ISnJEUUgwK1E9PSJ9fQEAI-gvC4U3JMxA6Mg2xTs3oAuPx1nfChQvPt6xrxFiKPPMUXhSziDAsB1OfdKFOq9YXGghXVhoRqAELh_PTZj0_MjWvEcF0RZ-gB4eSawzt3u3DzEHlL1g6B8P1Ilml2l-1hj2NE1Ycn-2_zET2LoUSEPPokO7uIWbFPnI6Tkt3pP7J_CA3R_3xcJW1_8iXNSxIrwFFjIEdv34Ti80rI-6QwXIbkfgSNj-LAmsEWKp-zgwx52OOp5RkCQal9SXBIfhnbFlGfd5CfmxpXjQVfS3G5wfwvK-vPFLFQh1js4uU84A7zfAGBYV2OSUUU-vWldmvskxs2kLtZWoHQthCMphE4KlHQKKnjlZaprsbVx8-Lbv5p7t-6eNmlAM1MsFJ2HwXkBF_GtrKdd9DjeoCvoyws2nEEwCC8Ux_cB-4VRgM1DcpZSsqtzp5HmZkt3VxLzQCB_DU5BYhoqtHwOfpqudBXdU-wJnrM5kkOosM4ibN-Ai22UiFDWEACOxMUR7rvOahvCdotYBFVayVQiyGUpXISmqg5hMIvXURAmNYlSIgoiyeUYFp3C5vAmIKPHcqzUyvm28xookr7fZbKkck8Bz-Kuy5KvRdBtDXjmBPma_voiGVW9d44g8deOLQy6JZKd5P953uOxOXspxR27xR8Q3ShVKz9ohOStMQjvngMYcJYCc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QUQ29udGVudC1JZIABZjFkMmQ1NzJkZGRlZjNjYzRlZDNkZWI3MzY0MmE2YmMzOTBiOGVmNTJkMWQ3YjViNzc2MWMxYWI0MjFmZTIzMhxDb250ZW50LURpZ2VzdIABZjFkMmQ1NzJkZGRlZjNjYzRlZDNkZWI3MzY0MmE2YmMzOTBiOGVmNTJkMWQ3YjViNzc2MWMxYWI0MjFmZTIzMhxDb250ZW50LUF1dGhvchhrNjI5NzI3MTI5OHEOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbQB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg4ZDJhMzU2MWQ5OGNkMGJmYzUwNDY0NjQzNGY3OWJmMzM1NDRmOGQzXCIsXCJ0c1wiOjE2OTE0NjA2MjUxMDQsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcIms2Mjk3MjcxMjk4cVwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiJmMWQyZDU3MmRkZGVmM2NjNGVkM2RlYjczNjQyYTZiYzM5MGI4ZWY1MmQxZDdiNWI3NzYxYzFhYjQyMWZlMjMyIiwic2lnbmF0dXJlIjoiMHhjNDZkZGE2ZWQ1ZTk0OTI5Y2E0NWExYWU0MGFmY2YzMTFmYzQyOWViOTQ3OGNmNzBmMTBkMTAzZWMyODgxNTFjMmJkNzllNzgwNjBlMDZmMGY3MDlhNmQyY2E4YTBmYmEwY2ViMWNiYjVmNmFlOTY3YzE1ZDJhNWQ5NDNhYmZlNyIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFRm1nRDNhT1dCbmVUNXh6bHJVcGxQQ1lsSHhvdnhUc0MrSk9UNDErWWVSeHZya2lrcEZWck9mb25WQUFXbyt1T1cxNDBTemdEWFhjUjM3NStLRHhuV1E9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4OGQyYTM1NjFkOThjZDBiZmM1MDQ2NDY0MzRmNzliZjMzNTQ0ZjhkMyIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweDNlYmU4NWJjZDY5YTc1M2RiMDdmYzdkMTQ3MmI5YzQ4OTY1ZmE1YzEyODI0MTlhZDMzMjJhZWJjYjc1ZmExMDU0ZDBlMjljODU5MzMwMDMyZDYzMDhiM2M5YmEwODFhYWQxOWUwZmJlYmU4YTFkYjczYjk3ZGNhMWI2Njg2NGQ1MWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUZtZ0QzYU9XQm5lVDV4emxyVXBsUENZbEh4b3Z4VHNDK0pPVDQxK1llUnh2cmtpa3BGVnJPZm9uVkFBV28rdU9XMTQwU3pnRFhYY1IzNzUrS0R4bldRPT0ifX0BAIPqwBXWj3YR0HZqZCbrsjzIsLo57TYIStspGZ0AJHAGOCa5A_xrd-nk33NOT4lKButT8bfyNynEfsSBkEsIK1XGKGi9CvVPKuCu7ZpBoIORLYwyM-YvJBwuiLyVaixmVGEZAYhSsiOUjHbMwJATccLKSUrmqz7UX_tVe5DwLqeBgd-UDT9sy8RjTmFsU4fMVgZoyj8k0OpXBy1iJHmJGOuW2LoMe5rr3OUVXucaXjFLXuo4A5bEbldbd3hotfhMiPu_3gB75zsbVm8T4c-J4g-x8b2XUT-in8tsX7jRQ1TS53quXio8zBmGcspuY8ohm-E7S6L93FTmf1P3Qr0n4qL_Vkw7KFExou9PyeYOMpVVBjjN8xDLm8FdM45BbKjChvI_pi8DOmLV2WjtV3qDBC45WSLYLOHY_LmOc1X5zbgcAAVhhr9rd4jp7pb0-1lFZSO2T29UXuQ3uTwTbEKIQPJ_m2B2YsFoDS6nGmNLk70AHo77DQCj2WPeijOxxkTNfwHT_aIPwVVwU7h96vxIeXO9jjwfB69Pn-RnC59tFEMi-6T0e9zpo6l0Hez3Hdi_XjaehYu-FjQChkoERvP95CNikjx5QEFV2g7Y12M1Iftk-630krEu-GswmXPyw3OxgMcnN1-iDjxOuu8ZPDmx2FnE7xUKZ_Y--l8ZNIcyOf74nPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAgAAAAAAAAAfQEAAAAAAAAP8gUYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcUQ29udGVudC1JZIABN2FmZmViZjg3M2E5NzUyYWY5ODYxMDVhYjE0MmE4ZWJiZTZkODIzMGM3YjMzYjAxNjFlNzdhMjVmOWNiZGRlZRxDb250ZW50LURpZ2VzdIABN2FmZmViZjg3M2E5NzUyYWY5ODYxMDVhYjE0MmE4ZWJiZTZkODIzMGM3YjMzYjAxNjFlNzdhMjVmOWNiZGRlZRxDb250ZW50LUF1dGhvchhya3pjaWhkdXJoeWwOQ2hhaW5JZAQ1NgB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwiY29tbWVudFwiLFwiYWRkcmVzc1wiOlwiMHhlOTg0NjE1ODI2ZmNjMmEwY2IxODJlZjE5OWQ5OGZiOTU4MDMzOTEzXCIsXCJ0c1wiOjE2OTE0NjA2MjQ5MzEsXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcInJremNpaGR1cmh5bFwiLFwidGFyZ2V0XCI6XCIzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlXCIsXCJ0aXRsZVwiOlwiRmxhcHB5TW9vbmJpcmRcIixcImJvZHlcIjpcIlNvIGZ1biB0byBwbGF5IGluIG15IHNwYXJlIHRpbWUuXCJ9IiwiZGlnZXN0IjoiN2FmZmViZjg3M2E5NzUyYWY5ODYxMDVhYjE0MmE4ZWJiZTZkODIzMGM3YjMzYjAxNjFlNzdhMjVmOWNiZGRlZSIsInNpZ25hdHVyZSI6IjB4MWE4OGQ3OTAwMjRmNDQ3YTFhNjkzZjNiZWFlNTViMTVjOWI1ZTQ3YzIwMDljMTYwNDdlYmNiMmUxOTQ4ZGVjMWVlYWRmODUzNmM3ZDJmNzk1NzQ3MzA0N2ZkZGZmMWI2OTJkYTQ1YjM5NjVjMTM4OTE0YjJjY2NmYWE2NzhlODQiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVV1MDNFVmJnVkRZdGRZYmxZeHY3NHNxMXpqZTZQTXdUQkxSK1ErckJDWURNb0t1TlFXR2FtdjkxdHdGWUx6VUxBT2pMUmxTOTlQYXlqM3J1RmFqVmdBPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGU5ODQ2MTU4MjZmY2MyYTBjYjE4MmVmMTk5ZDk4ZmI5NTgwMzM5MTMiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg2MTFiYjRlMzIzOGRhYTQ5ZTgyNzQ3NjM1MjQzZjhmMWY2ZjkyYTZjODI0MTI1MTFjNjg5YzhiMjhiMTllODBiMDFjN2Q1OWMyOWY5MDMyYjYxODlhZjc4OTk4NzdhYmE5YzQwNjk0OWQwNzc2NjQ1ZWJkNzc5NDdmYzNjYmY4MjFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBDeWJlckNvbm5lY3QgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVV1MDNFVmJnVkRZdGRZYmxZeHY3NHNxMXpqZTZQTXdUQkxSK1ErckJDWURNb0t1TlFXR2FtdjkxdHdGWUx6VUxBT2pMUmxTOTlQYXlqM3J1RmFqVmdBPT0ifX0BAAf3gikvLrCOlnI0HMhzN4uSuS6LKsTTDSROVpUFVR-P97E3EAoB-6G9qKq5ksGmj0kWARn8I-Tih6SYcAy5sfVghMGKcXhjCyCTAUbu9oxl_xYE8cVzGwwNwjEAp52k_SWG6p1IJtmWkStZsxlCUIZCBW9g-iJvT1ctKeZSIXRwP6HiiaZskZqgqoypw-0KVdOdf2PKfQooVmblB8jfyZjBbnE62NpJCbbWbWVoQcyRsgfjGV84bD2Y07fZlh1S0gJYdbh7doc19wa7MtWSL0nwVHTqP-R5y2qTwnfmMIHoiSgPYbl-Ivfxkng9vFe8LXsQcWOoJtmhMqDzTKlVUqxjie_CoXnLoaKyrqdT9JTBaRRawrsWU8EjNn_5L6ryo__LZVC6mwSOLFTlmTsqM048yAknAgypkdziSJC5Bpq1NjyMDksYizY5GsoLf7WELkTLctzU99a0hc6VYmcU203jHx2MuelIgRLHEqkE3K9YsxCxWaSOiIHdekoYILtZJOFQHMDa3ujP_aM1dKHXHDX1yLDp7GmFHJrzKK5Pc8zxbxr2m5VXm4W3nUI0I0MHqrd-zJFOHBIQV2JsOapzD9QFgjn3iHvQJXemZWVt2gqDOzlr-K-pT3RfM2hTvctx6JHG9ElANt_N94jHU9hgTjeORvQfpnhzfZrxZtv5gu5NnPgX7WyVoTnTxFtyMHzK_iyQ9jKTuTNvPZDvpKXyraIujN7xcC4NvJ3aJ8zssULFQNgqiC5cQ2opbFOhg0A7GLIBkXNwSVwD5BBfHHCsiV-mwjjqdujllzy-pR5BCvvV2FZ4PlVAgsxX8hCEQUNVpO5_gISSE_SeLuRWXlhdSRRI4dGFNWm7E75ZJzeOn_C5hZCuQjIdgS_a-O__5v2MqBQlKDUdtw54pXniUkZA4UhPXNgcGwVvdBDsybCJeM__akVDhDWrY6nqGOozHfrIUS1VR_Cdo4LP57DlSkPOwfb81MDBkYjzPu1HYNTLEUCcWiNtw0-YV7j4eDx_a5p6esNiIZInXK3DJGw2a4Na7e9FyRLWzSNPtd54Ys0qjcGYTVwJJvl4e6oE7bMPXKSptAieiO3jhCnDFROl4Wm3NX2a1IE4DZYfk1hRjhi47p9TgbZmBkw8_1y5runeAb4ZmOyO1jiOxQ6mQCBO-AQpooHnacNlQtghy05lRR5kqdJsDEcZZuSpp4nuQJT7fkBjmRObw1lOqnpyDBwrEFKQ_3ct12toPLKN6jfTdYU7naOY0xe9N_DuWrVlzWZDjvkuciLZ25P6VI4I4rrRbJuwVAk5RXBPV4RcXuH-8SZPluilQ6tfygLDEVQeF8ltlrRMxEmjoUN9GKkPjfmyZzselmkAAAcAAAAAAAAADAEAAAAAAAANkAQYQ29udGVudC1UeXBlIGFwcGxpY2F0aW9uL2pzb24WQXBwbGljYXRpb24YQ3liZXJDb25uZWN0FENvbnRlbnQtSWSAAWEwMTBjODJlZGU2OTliZjFkZDIwMWQ3YjU0ZTZmYjQ5Y2Y4OTJmOTljMTRmNjMzZTM3ZTY3YzRhY2FiYjk4M2McQ29udGVudC1EaWdlc3SAAWEwMTBjODJlZGU2OTliZjFkZDIwMWQ3YjU0ZTZmYjQ5Y2Y4OTJmOTljMTRmNjMzZTM3ZTY3YzRhY2FiYjk4M2McQ29udGVudC1BdXRob3IYN3dtYXBucTBuMTRsDkNoYWluSWQENTYMU291cmNlCGF0ZW0AeyJjb250ZW50Ijoie1wib3BcIjpcInBvc3RcIixcImFkZHJlc3NcIjpcIjB4ZDRhOTgwOTgyMTEyZjQ0NmE1YzI4MDc4YjBjYmVmYTM0YTZkZTY5ZVwiLFwidHNcIjoxNjkxNDYwNjI0NzE5LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCI3d21hcG5xMG4xNGxcIixcInRpdGxlXCI6XCIxMTExMlwiLFwiYm9keVwiOlwiMjIyMjIyMjIyMjIyMjIyMjIyXCJ9IiwiZGlnZXN0IjoiYTAxMGM4MmVkZTY5OWJmMWRkMjAxZDdiNTRlNmZiNDljZjg5MmY5OWMxNGY2MzNlMzdlNjdjNGFjYWJiOTgzYyIsInNpZ25hdHVyZSI6IjB4NDllYTU3NmJhYzViNTc4ZmE0MWZlODY4N2ViZTlkYjY0ZjY2N2Q1YTNlY2M4ZmQ2NThkNjlmM2ZiMzExYzlmODE0MWY0NzcwZDU2ZWI0YmU4YzI0ZWQ1MmUwOThjNDc2YmFiNzRjMjgwYTQ3NTc4MDdmYTYxOWFlM2QyMGI3NjIiLCJzaWduaW5nS2V5Ijp7InB1YmxpY0tleSI6Ik1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXdDR2N2Q3llQkRoM2F1Tm5Na0RjNWNkQm8zVTdyNlc4ZHl2SGNWRTVQaS9LeU5LVHdwcHYrOVJvMFdaM0ZmK0hGUzlqQ1crdGhrNDZMbTF5NW9EaHFRPT0iLCJmb3JtYXQiOiJTdWJqZWN0UHVibGljS2V5SW5mbyIsImFsZ29yaXRobSI6IkVTMjU2In0sInNpZ25pbmdLZXlBdXRoIjp7ImFkZHJlc3MiOiIweGQ0YTk4MDk4MjExMmY0NDZhNWMyODA3OGIwY2JlZmEzNGE2ZGU2OWUiLCJzaWduaW5nS2V5U2lnbmF0dXJlIjoiMHg1Njg4ZWUwOThiOGYwOTc2NGNhMzkyMTEyZTM2ZmU0NjQ4ZjEzMWM0OTZmMzk4Njg0MjM3MDVkMmZjMDgyNjA2NmMwY2E1ODkxN2E5YzhiZTJjMDQ3NTE1NDEwYzVmYTlmNjEzNWUxZjM2ZWE0YjBmZTE4OGE5OTdmNWExODYyZTFjIiwic2lnbmluZ0tleU1lc3NhZ2UiOiJJIGF1dGhvcml6ZSBBdGVtUmV2aWV3IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV3Q0djdkN5ZUJEaDNhdU5uTWtEYzVjZEJvM1U3cjZXOGR5dkhjVkU1UGkvS3lOS1R3cHB2KzlSbzBXWjNGZitIRlM5akNXK3RoazQ2TG0xeTVvRGhxUT09In19AQAa7WfTjI3NOCSe0ZSb57FWgXmeXB-0tBxPOQm0PZc_LWx_O3OiQk8aFUkpN2idbvkwl8QZru0TXu_yhYTJcseEvVcZdqMS-isNmKFa6F9wkqZHcUBXL5gKlH9DrY4rx61G60xV-w-DVu19Xb8QXmo3go2vhcZn_TekS-VReBGiJUb2HiCM8r1swXAbg4fwII6SvlXcqF-U5RUfD3lFt33lj_POR98qCDIW5TjEVtiAQFm2KvNVjoqgJeJo8k4I7kc8yh-xnzwPBZcVxZRVU_HTnvO5ILqarrn8Mho6Klz5_n-uibw2Jc6NTfBFkKMSFfBOkBQmFgIfetxhLPYKX7ecd6x-5kL9K79cVbhtroJq3aPxV_NMc91en_XFR3gdxloUwQcO5GY08t_DFMCvzsYTPYvpuxHi1zp9eV9ayfJ4o3L6cZAk10Y5m_m2H954mD2vW3iBeMeX59zFNbkA3oiUeKrwBH2s3FVhugig4tADmrKV5K83NoWdJd4A4g3qo4vthDgR1hT__b91ayYlw1GkacJpubkkFOYCE4b07oV-AGjyYgFgU8tI7thORlax9i7qRc1Y3-6I4tEy0odz_Fd9lO_HBvVkDyoVHGgAds_oAQB-NRvW1xrNQN6tkL_MqRc5HkREBTc47Y3-Eld5aqDF4KnbzWzER3YEwlKYYcJa7Zz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAIAAAAAAAAAH0BAAAAAAAAD_IFGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBRDb250ZW50LUlkgAE4YWYwOTQwNzNiZTFjMTI0ZjQ0OTlkMmY0NDA4MDAzZjgzZDQ2MDczNThkZDY4OTRhMmRmMTMzMjc4M2Y3MjYxHENvbnRlbnQtRGlnZXN0gAE4YWYwOTQwNzNiZTFjMTI0ZjQ0OTlkMmY0NDA4MDAzZjgzZDQ2MDczNThkZDY4OTRhMmRmMTMzMjc4M2Y3MjYxHENvbnRlbnQtQXV0aG9yGG8zcHRwbzI3aWZnaQ5DaGFpbklkBDU2HENvbnRlbnQtVGFyZ2V0gAEzOWYwMjE4ODFlNzM4NmY4ZDczZDZlZjI1NTMzZTYwOTFmMmEwMjU2ZTQyMmI0YjNjNGUzZDMzNWNjYWUxNDdlDFNvdXJjZUgxNTUzMWZhMi0xMjA1LTRmNjEtYjZlNC1jOWY2OGVjZjgxZjcAeyJjb250ZW50Ijoie1wib3BcIjpcImNvbW1lbnRcIixcImFkZHJlc3NcIjpcIjB4OGYzZDIwNDE5ODczZDRkZTE2NzI4NTc3MTA0NWE5NmRhODc5NzVjOVwiLFwidHNcIjoxNjkxNDYwNjI0ODg3LFwiY2hhaW5JZFwiOjU2LFwiaGFuZGxlXCI6XCJvM3B0cG8yN2lmZ2lcIixcInRhcmdldFwiOlwiMzlmMDIxODgxZTczODZmOGQ3M2Q2ZWYyNTUzM2U2MDkxZjJhMDI1NmU0MjJiNGIzYzRlM2QzMzVjY2FlMTQ3ZVwiLFwidGl0bGVcIjpcIkZsYXBweU1vb25iaXJkXCIsXCJib2R5XCI6XCJTbyBmdW4gdG8gcGxheSBpbiBteSBzcGFyZSB0aW1lLlwifSIsImRpZ2VzdCI6IjhhZjA5NDA3M2JlMWMxMjRmNDQ5OWQyZjQ0MDgwMDNmODNkNDYwNzM1OGRkNjg5NGEyZGYxMzMyNzgzZjcyNjEiLCJzaWduYXR1cmUiOiIweGM0YTY4MTJiODBmNjNjZmVmNDAzODFkYmQ3MzMxNTM5MmFmZThiNmZmMWFiMzM3YWFjOTIzMDhmYjExN2QzNDA0MWQwNzFjZWM1OTc2NDk5YTdkNTc4NmZkZDJlNDY2NDBkMDExYTUyMWIwNjk0MTAzZDRlMzMzZTAxNDM5ODc1Iiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVaMG5CaW15bVNJbEpnTUZOTjA4Z0FsWngxRkFnOFUwbFIwU3RHUEtvVTFzbVlVS2psYzd4TVA2ZUNyRU1DVzVQZFZrbVZqTmN6dUkzSXo5dlB4aTVkUT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHg4ZjNkMjA0MTk4NzNkNGRlMTY3Mjg1NzcxMDQ1YTk2ZGE4Nzk3NWM5Iiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4ODVjOGI5NDc2NjRkM2IyZGJlNDliMTYyNDM5ZmQ1YTAyOWE3ZGZmYWQ4OTMxYzNjMjY2MmU0ODNkMGFhZGY4ZTExMWMyNzAzYzU3YzAzOGI1OWU5MjdiNDIzYmU1MWM3OWFlYzFjMmU5NDYyZjM0ZDhlOWY0ODczODQxOTJhMzUxYyIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQ3liZXJDb25uZWN0IGZyb20gdGhpcyBkZXZpY2UgdXNpbmcgc2lnbmluZyBrZXk6XG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVaMG5CaW15bVNJbEpnTUZOTjA4Z0FsWngxRkFnOFUwbFIwU3RHUEtvVTFzbVlVS2psYzd4TVA2ZUNyRU1DVzVQZFZrbVZqTmN6dUkzSXo5dlB4aTVkUT09In19AQBcXgn35qFYN5wckxB6DU_D3y5r57M8F8ySSJwA5GE1LUK-C_qZyiie5QajnZ-M0TAeJO5TtjNEoiQhMloDJJ4iRdgLLJAs0EmbBkEfu829ub-FlP-LHiOFhlzuV2uiATiA83RvGNEAPQoDyLoh3mPtN9avpSual3AQtbmpQYOHA40bnJTojSG6vnTnmqLQdaas3SaXoBSWczuTOEPXEbPnDISsnBGjxAy9niBq2FV5FaMCyunXt_OJ4jStgDkrHWpvYPzYRCE0Pcq2nlnufQIXAQWs9qZHSZbv71lL47pCUPNObVn_-_4NG5m5P5o-boZIlrCAV5-1f4gX75PFPU5aU1oOeJ3EZ_dVSECgGJVKQbGVNisDdpTTtZI03-e1B8uJXfu7K0FSm0dLPTA8JkqBKEYTrSXNOdHi5QPvcFmWpY6tFrSJYgs0fj1a-ZUhqvFLt-EmjfCrPaCYf7aLn4RZsBbsGdR_OagitCG3jpQjoE8j8WInh4j5hLCL-JgRcw1b3UTVMWjByhnw5FDqR_9Y56ix-UkSFkApZbWABhYIC5zHkJFPtygo7Io7X8QEjwUWPMAOA7ZBAF5vamzv6Ui8ItIj5Kf8SMRSGsx_QCOMakZXsdufxA717Q2I3pQ2Z7E-ExtgsBnQjWU-sO5EIBbZsQrY4A57D_ORbeJ9qk_lFJz4F-1slaE508RbcjB8yv4skPYyk7kzbz2Q76Sl8q2iLoze8XAuDbyd2ifM7LFCxUDYKoguXENqKWxToYNAOxiyAZFzcElcA-QQXxxwrIlfpsI46nbo5Zc8vqUeQQr71dhWeD5VQILMV_IQhEFDVaTuf4CEkhP0ni7kVl5YXUkUSOHRhTVpuxO-WSc3jp_wuYWQrkIyHYEv2vjv_-b9jKgUJSg1HbcOeKV54lJGQOFIT1zYHBsFb3QQ7MmwiXjP_2pFQ4Q1q2Op6hjqMx36yFEtVUfwnaOCz-ew5UpDzsH2_NTAwZGI8z7tR2DUyxFAnFojbcNPmFe4-Hg8f2uaenrDYiGSJ1ytwyRsNmuDWu3vRckS1s0jT7XeeGLNKo3BmE1cCSb5eHuqBO2zD1ykqbQInojt44QpwxUTpeFptzV9mtSBOA2WH5NYUY4YuO6fU4G2ZgZMPP9cua7p3gG-GZjsjtY4jsUOpkAgTvgEKaKB52nDZULYIctOZUUeZKnSbAxHGWbkqaeJ7kCU-35AY5kTm8NZTqp6cgwcKxBSkP93LddraDyyjeo303WFO52jmNMXvTfw7lq1Zc1mQ475LnIi2duT-lSOCOK60WybsFQJOUVwT1eEXF7h_vEmT5bopUOrX8oCwxFUHhfJbZa0TMRJo6FDfRipD435smc7HpZpAAAHAAAAAAAAAAwBAAAAAAAADZAEGENvbnRlbnQtVHlwZSBhcHBsaWNhdGlvbi9qc29uFkFwcGxpY2F0aW9uGEN5YmVyQ29ubmVjdBxDb250ZW50LUF1dGhvchhmb3Z1ZXlwNHJtbWIOQ2hhaW5JZAQ1NgxTb3VyY2UIYXRlbRRDb250ZW50LUlkgAFkMmFmYzM0ZGQwZTMwNjI2MTVlOGE4ODMwNDRjZmQyZjNhNzNjYWNlYTcyNTA0Y2ViZGE3ZmNmYTJiMjBiNjIxHENvbnRlbnQtRGlnZXN0gAFkMmFmYzM0ZGQwZTMwNjI2MTVlOGE4ODMwNDRjZmQyZjNhNzNjYWNlYTcyNTA0Y2ViZGE3ZmNmYTJiMjBiNjIxAHsiY29udGVudCI6IntcIm9wXCI6XCJwb3N0XCIsXCJhZGRyZXNzXCI6XCIweGYxNzAxODdjOTg1MzA4ZGRlMzA3ZmM4N2MyZDM1NThmNmY2Y2UxNDBcIixcInRzXCI6MTY5MTQ2MDYyNDg2NyxcImNoYWluSWRcIjo1NixcImhhbmRsZVwiOlwiZm92dWV5cDRybW1iXCIsXCJ0aXRsZVwiOlwiMTExMTJcIixcImJvZHlcIjpcIjIyMjIyMjIyMjIyMjIyMjIyMlwifSIsImRpZ2VzdCI6ImQyYWZjMzRkZDBlMzA2MjYxNWU4YTg4MzA0NGNmZDJmM2E3M2NhY2VhNzI1MDRjZWJkYTdmY2ZhMmIyMGI2MjEiLCJzaWduYXR1cmUiOiIweDczMDZmYTE1Nzg0NjAxNzhkNjJkZDFmZDJjNGE1YTIyMDZmZDdmOTBkYTVlZDA4M2U2NGUyNzU4ZDllNDQ1OGEzM2ExZTBhNTQ2ZDVhYTM5Y2YxODg0ZGU1ZDI1OWRlNGJjZmUzMzc3NDRiYTYyNzgwNzVkOTlkOTA1MTcxMjliIiwic2lnbmluZ0tleSI6eyJwdWJsaWNLZXkiOiJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVoNTRBT29tamV2dml0QXlIb1BvVDAxa1o5enkvK0lNS3FMVE9wdFpJUHpLcm84SjhOd1dlalBFWUFrYkkrdEg4MEJNYkNGSmo5ZndOMUF5dkNkekp5QT09IiwiZm9ybWF0IjoiU3ViamVjdFB1YmxpY0tleUluZm8iLCJhbGdvcml0aG0iOiJFUzI1NiJ9LCJzaWduaW5nS2V5QXV0aCI6eyJhZGRyZXNzIjoiMHhmMTcwMTg3Yzk4NTMwOGRkZTMwN2ZjODdjMmQzNTU4ZjZmNmNlMTQwIiwic2lnbmluZ0tleVNpZ25hdHVyZSI6IjB4ZjYwNjlkYmU5MTUzNjQ2MzNhNjc1OTE3ZDdmYzRhZmFkNjZmMWYxMDc2YjRjZTk4NWE3ODQwNjNlYmNhMjAyYjFjNTYxNGUzMzMyMGJjYzFmZjA4OTQ2ZGIzMjAzMGI2ODAwOTU4YjgxMzY0YWFlM2FjZjY2YmVkNmNkZTYwZjkxYiIsInNpZ25pbmdLZXlNZXNzYWdlIjoiSSBhdXRob3JpemUgQXRlbVJldmlldyBmcm9tIHRoaXMgZGV2aWNlIHVzaW5nIHNpZ25pbmcga2V5OlxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaDU0QU9vbWpldnZpdEF5SG9Qb1QwMWtaOXp5LytJTUtxTFRPcHRaSVB6S3JvOEo4TndXZWpQRVlBa2JJK3RIODBCTWJDRkpqOWZ3TjFBeXZDZHpKeUE9PSJ9fQEAZOuIFNeBPIkEQwmUi4F-zHD11WpZ6skQqlK5FzKbhGBeWybzl59exXVhF46dcEo20Rt5Sq3L6ybSwODQGPo0R9p0AK7_rciV6wgk6nIhFQo-LkRZoCIvwvkcZNol1IoGYSdWsy54WnLyhdThY9dZtK2SQ5pHWZtgDBBVJF6m1L4HcGYTyFI69hWa3E4aHzWY7ZNHMTkU6LX2BhPXodCHE-L8IM1IG7m-XyCG9NOjzfx0y1q7amaoF8vMcRheqX7lUcK6rUftYk1QhcXjJO3YhQLzB11d6ByASjpohQ-35aZG6FH46hLOdREaHVvWQrCuzPSlux9HuqOJq9SXc7gT67j4bJsSKGiuq3X0hF5iOuky6HcQiUUFc6tpyR-gZy0mvt9hBqPD3aztzYSeNaY7RGkwmithwqF0Ey9-eMk-vG-dHuxQHf2zfiRtDzxQKQcUUBMgDMDZcvTliJmRrrT9GCsPE9t-qkFhlAww3dvjjJXCwrDTe7yzVasNVqpnTvVMOKtwOBkYjLkRoreqWxn_kwZebP6WzXwxiVFbIm-iXls--8ftnY2dgrYRSfr7aV6Mr3SybsiGtokQLUa9oDiqXZhVp71PWcevKwaImcKHiEW05xjNUeqBoPpoAQEuuFct2VynT2ZIsqVXSAkt2Mbc5efIKd6FxZqx4bzob6NxGKSc-BftbJWhOdPEW3IwfMr-LJD2MpO5M289kO-kpfKtoi6M3vFwLg28ndonzOyxQsVA2CqILlxDailsU6GDQDsYsgGRc3BJXAPkEF8ccKyJX6bCOOp26OWXPL6lHkEK-9XYVng-VUCCzFfyEIRBQ1Wk7n-AhJIT9J4u5FZeWF1JFEjh0YU1absTvlknN46f8LmFkK5CMh2BL9r47__m_YyoFCUoNR23DnileeJSRkDhSE9c2BwbBW90EOzJsIl4z_9qRUOENatjqeoY6jMd-shRLVVH8J2jgs_nsOVKQ87B9vzUwMGRiPM-7Udg1MsRQJxaI23DT5hXuPh4PH9rmnp6w2IhkidcrcMkbDZrg1rt70XJEtbNI0-13nhizSqNwZhNXAkm-Xh7qgTtsw9cpKm0CJ6I7eOEKcMVE6Xhabc1fZrUgTgNlh-TWFGOGLjun1OBtmYGTDz_XLmu6d4BvhmY7I7WOI7FDqZAIE74BCmigedpw2VC2CHLTmVFHmSp0mwMRxlm5Kmnie5AlPt-QGOZE5vDWU6qenIMHCsQUpD_dy3Xa2g8so3qN9N1hTudo5jTF7038O5atWXNZkOO-S5yItnbk_pUjgjiutFsm7BUCTlFcE9XhFxe4f7xJk-W6KVDq1_KAsMRVB4XyW2WtEzESaOhQ30YqQ-N-bJnOx6WaQAABwAAAAAAAAAMAQAAAAAAAA2QBBhDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbhZBcHBsaWNhdGlvbhhDeWJlckNvbm5lY3QcQ29udGVudC1BdXRob3IYaGxuam9vdXFiZ3loDkNoYWluSWQENTYMU291cmNlCGF0ZW0UQ29udGVudC1JZIABMDQ2NjFlMzYzYTJhNjdiNDU2NDcyNTEzZGVjNmIxYzg2ZmYzZDFjZmYyM2UyYTQ3YTYxNzg4ZGE1YzVmMzZkYxxDb250ZW50LURpZ2VzdIABMDQ2NjFlMzYzYTJhNjdiNDU2NDcyNTEzZGVjNmIxYzg2ZmYzZDFjZmYyM2UyYTQ3YTYxNzg4ZGE1YzVmMzZkYwB7ImNvbnRlbnQiOiJ7XCJvcFwiOlwicG9zdFwiLFwiYWRkcmVzc1wiOlwiMHg2YWY5NDViM2U0MjZlMmFhMjZjYmMzOTU2NjQ2ZTA4MDk5OTMzOWNlXCIsXCJ0c1wiOjE2OTE0NjA2MjQ4NDksXCJjaGFpbklkXCI6NTYsXCJoYW5kbGVcIjpcImhsbmpvb3VxYmd5aFwiLFwidGl0bGVcIjpcIjExMTEyXCIsXCJib2R5XCI6XCIyMjIyMjIyMjIyMjIyMjIyMjJcIn0iLCJkaWdlc3QiOiIwNDY2MWUzNjNhMmE2N2I0NTY0NzI1MTNkZWM2YjFjODZmZjNkMWNmZjIzZTJhNDdhNjE3ODhkYTVjNWYzNmRjIiwic2lnbmF0dXJlIjoiMHg3YWY2MjU4MzY3Yzc0MDFjOWE4NmI1MzU4OGU0ZDMwYTE2ZDY4ZjY1NWQzYzViY2ZjYjVlZjE4N2ViMGQ2YWVlYTExMThkMDhmYjg2OWM5YTk4MTY2NTliYWFkNjk5ZjI4NGM4NjI5OTAzM2I0OWQyMjNhNzdhYjUwMGRjYTlkNCIsInNpZ25pbmdLZXkiOnsicHVibGljS2V5IjoiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFNURwMHRQUVZwb1NERmJIelhlT29sTnR3MUMzbTFISHVPeCswMVZWNXFLbUFZNEdGZHNaZUNEY08ra3FkT242Q3dWNWQ1V2hrY1pUSVVTT0RBK011aXc9PSIsImZvcm1hdCI6IlN1YmplY3RQdWJsaWNLZXlJbmZvIiwiYWxnb3JpdGhtIjoiRVMyNTYifSwic2lnbmluZ0tleUF1dGgiOnsiYWRkcmVzcyI6IjB4NmFmOTQ1YjNlNDI2ZTJhYTI2Y2JjMzk1NjY0NmUwODA5OTkzMzljZSIsInNpZ25pbmdLZXlTaWduYXR1cmUiOiIweGEwZjkxY2I5NDE3ODU0Y2JhNDEzYTk2MjM3NWI0NTRmM2YxNjBjNmJjYTA2N2M3N2RkYmRkNDcyNTQwZDQ0ZWU0Zjc0YjRkZGNmYmY1ODY4ZWQyYjdlOWMxYzAwN2RhMDg5OGVjOTAyZDZhZTYyNjI0ODYyMTY4OWExMTViYzYzMWMiLCJzaWduaW5nS2V5TWVzc2FnZSI6IkkgYXV0aG9yaXplIEF0ZW1SZXZpZXcgZnJvbSB0aGlzIGRldmljZSB1c2luZyBzaWduaW5nIGtleTpcbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTVEcDB0UFFWcG9TREZiSHpYZU9vbE50dzFDM20xSEh1T3grMDFWVjVxS21BWTRHRmRzWmVDRGNPK2txZE9uNkN3VjVkNVdoa2NaVElVU09EQStNdWl3PT0ifX0"}
     
    - + diff --git a/gateways/ar-io-node/overview/index.html b/gateways/ar-io-node/overview/index.html index 52d3fec4..d435c911 100644 --- a/gateways/ar-io-node/overview/index.html +++ b/gateways/ar-io-node/overview/index.html @@ -13,11 +13,11 @@ - + -

    # Overview

    Easy setup guides have been designed to get your AR.IO Gateway up and running correctly and quickly. These guides only go through some basic configurations, while more advanced options can be found here

    - +

    # Overview

    Easy setup guides have been designed to get your AR.IO Gateway up and running correctly and quickly. These guides only go through some basic configurations, while more advanced options can be found here

    + diff --git a/gateways/ar-io-node/release-notes.html b/gateways/ar-io-node/release-notes.html index cbc27901..652d0a7d 100644 --- a/gateways/ar-io-node/release-notes.html +++ b/gateways/ar-io-node/release-notes.html @@ -13,15 +13,15 @@ - + -

    # ar.io Release Notes

    # Overview

    Welcome to the documentation page for the ar.io gateway release notes. Here, you will find detailed information about each version of the ar.io gateway, including the enhancements, bug fixes, and any other changes introduced in every release. This page serves as a comprehensive resource to keep you informed about the latest developments and updates in the ar.io gateway. For those interested in exploring the source code, each release's code is readily accessible at our GitHub repository: ar.io gateway change logs (opens new window). Stay updated with the continuous improvements and advancements in the ar.io gateway by referring to this page for all release-related information.

    # [Release 6] - 2024-01-29

    • Fixed
      • Update observer to improve reliability of contract state synchronization and evaluation.

    # [Release 5] - 2024-01-25

    • Added

      • Added transaction offset indexing to support future data retrieval capabilities.
      • Enabled IPv6 support in Envoy config.
      • Added ability to configure observer report generation interval via the REPORT_GENERATION_INTERVAL_MS environmental variable. (Intended primarily for development and testing)
    • Changed

      • Updated observer to properly handle FQDN conflicts.
      • Renamed most created_at columns to index to indexed_at for consistency and clarity.
    • Fixed

      • Updated LMDB version to remove Buffer workaround and fix occasional block cache errors.

    # [Release 4] - 2024-01-11

    • Added

      • Added circuit breakers around data index access to reduce impact of DB access contention under heavy requests loads.
      • Added support for configuring data source priority via the ON_DEMAND_RETRIEVAL_ORDER environment variable.
      • Updated observer to a version that retrieves epoch start and duration from contract state.
    • Changed

      • Set the Redis max memory eviction policy to allkeys-lru.
      • Reduced default Redis max memory from 2GB to 256MB.
      • Improved predictability and performance of GraphQL queries.
      • Eliminated unbundling worker threads when filters are configured to skip indexing ANS-104 bundles.
      • Reduced the default number of ANS-104 worker threads from 2 to 1 when unbundling is enabled to conserve memory.
      • Increased nodejs max old space size to 8GB when ANS-104 workers > 1.
    • Fixed

      • Adjusted paths for chunks indexed by data root to include the full data root.

    # [Release 3] - 2023-12-05

    • Added

      • Support range requests (PR 61 (opens new window), PR 64 (opens new window)) +

        # ar.io Release Notes

        # Overview

        Welcome to the documentation page for the ar.io gateway release notes. Here, you will find detailed information about each version of the ar.io gateway, including the enhancements, bug fixes, and any other changes introduced in every release. This page serves as a comprehensive resource to keep you informed about the latest developments and updates in the ar.io gateway. For those interested in exploring the source code, each release's code is readily accessible at our GitHub repository: ar.io gateway change logs (opens new window). Stay updated with the continuous improvements and advancements in the ar.io gateway by referring to this page for all release-related information.

        # [Release 6] - 2024-01-29

        • Fixed
          • Update observer to improve reliability of contract state synchronization and evaluation.

        # [Release 5] - 2024-01-25

        • Added

          • Added transaction offset indexing to support future data retrieval capabilities.
          • Enabled IPv6 support in Envoy config.
          • Added ability to configure observer report generation interval via the REPORT_GENERATION_INTERVAL_MS environmental variable. (Intended primarily for development and testing)
        • Changed

          • Updated observer to properly handle FQDN conflicts.
          • Renamed most created_at columns to index to indexed_at for consistency and clarity.
        • Fixed

          • Updated LMDB version to remove Buffer workaround and fix occasional block cache errors.

        # [Release 4] - 2024-01-11

        • Added

          • Added circuit breakers around data index access to reduce impact of DB access contention under heavy requests loads.
          • Added support for configuring data source priority via the ON_DEMAND_RETRIEVAL_ORDER environment variable.
          • Updated observer to a version that retrieves epoch start and duration from contract state.
        • Changed

          • Set the Redis max memory eviction policy to allkeys-lru.
          • Reduced default Redis max memory from 2GB to 256MB.
          • Improved predictability and performance of GraphQL queries.
          • Eliminated unbundling worker threads when filters are configured to skip indexing ANS-104 bundles.
          • Reduced the default number of ANS-104 worker threads from 2 to 1 when unbundling is enabled to conserve memory.
          • Increased nodejs max old space size to 8GB when ANS-104 workers > 1.
        • Fixed

          • Adjusted paths for chunks indexed by data root to include the full data root.

        # [Release 3] - 2023-12-05

        • Added

        • Changed

          • Used pinned container images tags for releases.
          • Default to Redis header cache when running via docker-compose.
          • Default to LMDB header cache when running via yarn start.
        • Fixed

          • Correct GraphQL pagination for transactions with duplicate tags.
        - + diff --git a/gateways/ar-io-node/windows-setup.html b/gateways/ar-io-node/windows-setup.html index 5d133b22..aca0deba 100644 --- a/gateways/ar-io-node/windows-setup.html +++ b/gateways/ar-io-node/windows-setup.html @@ -13,11 +13,11 @@ - + -

        # Windows Installation Instructions

        # Overview

        This guide provides step-by-step instructions for setting up the AR.IO node on a Windows computer. It covers installing necessary software, cloning the repository, creating an environment file, starting the Docker container, setting up networking, and installing and configuring NGINX Docker. No prior coding experience is required.

        # Prerequisites

        Before starting the installation process, ensure you have the following:

        • A Windows computer
        • Administrative privileges on the computer

        # Install Required Packages

        1. Install Docker:

          • Download Docker Desktop for Windows from here (opens new window).
          • Run the installer and follow the prompts.
          • During installation, make sure to select the option to use WSL (Windows Subsystem for Linux) rather than Hyper-V.
          • Restart your PC.
          • Update Windows Subsystem for Linux (WSL): +

            # Windows Installation Instructions

            # Overview

            This guide provides step-by-step instructions for setting up the AR.IO node on a Windows computer. It covers installing necessary software, cloning the repository, creating an environment file, starting the Docker container, setting up networking, and installing and configuring NGINX Docker. No prior coding experience is required.

            # Prerequisites

            Before starting the installation process, ensure you have the following:

            • A Windows computer
            • Administrative privileges on the computer

            # Install Required Packages

            1. Install Docker:

              • Download Docker Desktop for Windows from here (opens new window).
              • Run the installer and follow the prompts.
              • During installation, make sure to select the option to use WSL (Windows Subsystem for Linux) rather than Hyper-V.
              • Restart your PC.
              • Update Windows Subsystem for Linux (WSL):
                • Open the command prompt as an administrator:
                  • Press Windows Key + R.
                  • Type cmd and press Enter.
                  • Right-click on the "Command Prompt" application in the search results.
                  • Select "Run as administrator" from the context menu.
                • Run the following commands:
                  wsl --update
                   wsl --shutdown
                  @@ -49,6 +49,6 @@
                   
                  • Use the cd command to change directories. For example, to navigate to the Documents directory:
                    cd Documents
                     
                • Run the following command:
                  git clone -b main https://github.com/bobinstein/dockerized-nginx
                   

                Note: This NGINX container was designed to easily automate many of the more technical aspects of setting up NGNIX and obtaining an ssl certificate so your node can be accessed with https. However, wildcard domain certifications cannot be universally automated due to significant security concerns. Be sure to follow the instructions in this project for obtaining wildcard domain certificates in order for your node to function properly.

              • Follow the instructions provided in the repository for setting up NGINX Docker.

            Congratulations! Your AR.IO node is now running and connected to the internet. Test it by entering https://<your-domain>/3lyxgbgEvqNSvJrTX2J7CfRychUD5KClFhhVLyTPNCQ in your browser.

            Note: If you encounter any issues during the installation process, please seek assistance from the AR.IO community (opens new window).

            - + diff --git a/gateways/index.html b/gateways/index.html index 6fdc8845..c9c9e3d9 100644 --- a/gateways/index.html +++ b/gateways/index.html @@ -13,11 +13,11 @@ - + -

            # Gateway Architecture

            # Overview

            A gateway’s primary role in the Arweave ecosystem is to act as a bridge between the Arweave network and the outside world. This means that a gateway's main task is to make it easier for users to interact with the Arweave network by simplifying the technical processes of writing, reading, and discovering data on the blockweave in a trust-minimized fashion.

            The core functions of a general Arweave gateway are broken down into the following areas.

            Writing data involves:

            • Proxying Layer 1 transaction headers to one or more healthy and active Arweave nodes (miners) to facilitate inclusion in the mempools of as many nodes as possible.

            • Proxying chunks for Layer 1 Arweave transactions to Arweave nodes to help facilitate storage and replication of the chunks on the blockweave.

            • Receiving and bundling so-called Layer 2 data items (e.g., ANS-104 spec) as Layer 1 transactions.

            Reading involves retrieving:

            • Transaction headers for a Layer 1 Arweave transaction.

            • Individual data chunks for a Layer 1 Arweave transaction.

            • Blocks from the blockweave.

            • Storage pricing rates for data from the Arweave node network.

            • Contiguous streams of chunks representing an entire Layer 1 transaction.

            • Layer 2 bundled data items (e.g., ANS-104).

            • Wallet information (e.g., token balance).

            Discovering data involves:

            • Facilitating efficient, structured queries for Layer 1 and Layer 2 transaction and wallet data by:

              • examining incoming streams of data (i.e., directly ingested transactions and data items, blocks emitted by the chain, etc.).

              • managing index data in a database or analogous data store.

            • Parsing and executing user queries.

            • Facilitating friendly-path routing via Arweave manifest indexing.

            # AR.IO Gateway Benefits

            AR.IO gateways provide many new benefits and capabilities beyond general Arweave gateways:

            • Providing the modularity and configurability necessary for operating extensible gateways that can be deployed at small or large scales to meet the needs of specific applications, use cases, communities, or business models.

            • Providing pluggable means for consuming telemetry data for internal and external monitoring and alerting.

            • Facilitating friendly-subdomain-name routing to Arweave transactions via a direct integration with the Arweave Name System (ArNS).

            • Facilitating configurable content moderation policies.

            • Providing connectivity to a decentralized network of other AR.IO gateways, enabling data sharing and other shared workloads.

            # Gateway Modularity

            A design principle of AR.IO gateways is that their core components should be interchangeable with compatible implementations.

            The core services in the gateway are written in Typescript, with flexible interfaces to the various subsystems and databases. This allows operators to customize their gateway to meet their specific requirements. Gateway services can be turned on or off depending on the operator's needs. For example, an operator might choose to have their gateway serve data, but not actively index Layer 2 bundled data.

            This flexibility also allows operators to utilize the technologies that are appropriate for the scale and environments in which they operate.

            For example, small scale operators might want to use low-overhead relational databases to power their indexing while larger scale operators might opt to use cloud-native, horizontally scalable databases. Analogous examples for storage and caching exist as well.

            Gateway Tech Stack Options
            Topology Chain Index Bundle Index Data Index Data Store
            Small SQLite SQLite SQLite Local File System
            Large PostgreSQL Cassandra Cassandra S3 Compatible

            # ARNS Indexing and Routing

            The Arweave Name System’s (ArNS) state is managed by the IO token’s SmartWeave smart contract. AR.IO gateways shall perform the following minimum functions relative to ArNS:

            • Actively track state changes in the contract.

            • Maintain up-to-date indexes for routing configurations based on the state of the IO contract as well as the states of the Arweave Name Token (ANT) contracts to which each name is affiliated.

            • Manage the expiration of stale records.

            • Facilitate ArNS routing based on the subdomains specified on incoming requests where appropriate.

            • Provide a custom HTTP response header for ArNS requests indicating the corresponding Arweave transaction ID.

            # Content Moderation

            The AR.IO Network will adopt Arweave’s voluntary content moderation model whereby every participant of the network has the autonomy to decide which content they want to (or can legally) store, serve, and see. Each gateway operating on the network has the right and ability to blocklist any content (or address) that is deemed in violation of its content policies or non-compliant with local regulations.

            - +

            # Gateway Architecture

            # Overview

            A gateway’s primary role in the Arweave ecosystem is to act as a bridge between the Arweave network and the outside world. This means that a gateway's main task is to make it easier for users to interact with the Arweave network by simplifying the technical processes of writing, reading, and discovering data on the blockweave in a trust-minimized fashion.

            The core functions of a general Arweave gateway are broken down into the following areas.

            Writing data involves:

            • Proxying Layer 1 transaction headers to one or more healthy and active Arweave nodes (miners) to facilitate inclusion in the mempools of as many nodes as possible.

            • Proxying chunks for Layer 1 Arweave transactions to Arweave nodes to help facilitate storage and replication of the chunks on the blockweave.

            • Receiving and bundling so-called Layer 2 data items (e.g., ANS-104 spec) as Layer 1 transactions.

            Reading involves retrieving:

            • Transaction headers for a Layer 1 Arweave transaction.

            • Individual data chunks for a Layer 1 Arweave transaction.

            • Blocks from the blockweave.

            • Storage pricing rates for data from the Arweave node network.

            • Contiguous streams of chunks representing an entire Layer 1 transaction.

            • Layer 2 bundled data items (e.g., ANS-104).

            • Wallet information (e.g., token balance).

            Discovering data involves:

            • Facilitating efficient, structured queries for Layer 1 and Layer 2 transaction and wallet data by:

              • examining incoming streams of data (i.e., directly ingested transactions and data items, blocks emitted by the chain, etc.).

              • managing index data in a database or analogous data store.

            • Parsing and executing user queries.

            • Facilitating friendly-path routing via Arweave manifest indexing.

            # AR.IO Gateway Benefits

            AR.IO gateways provide many new benefits and capabilities beyond general Arweave gateways:

            • Providing the modularity and configurability necessary for operating extensible gateways that can be deployed at small or large scales to meet the needs of specific applications, use cases, communities, or business models.

            • Providing pluggable means for consuming telemetry data for internal and external monitoring and alerting.

            • Facilitating friendly-subdomain-name routing to Arweave transactions via a direct integration with the Arweave Name System (ArNS).

            • Facilitating configurable content moderation policies.

            • Providing connectivity to a decentralized network of other AR.IO gateways, enabling data sharing and other shared workloads.

            # Gateway Modularity

            A design principle of AR.IO gateways is that their core components should be interchangeable with compatible implementations.

            The core services in the gateway are written in Typescript, with flexible interfaces to the various subsystems and databases. This allows operators to customize their gateway to meet their specific requirements. Gateway services can be turned on or off depending on the operator's needs. For example, an operator might choose to have their gateway serve data, but not actively index Layer 2 bundled data.

            This flexibility also allows operators to utilize the technologies that are appropriate for the scale and environments in which they operate.

            For example, small scale operators might want to use low-overhead relational databases to power their indexing while larger scale operators might opt to use cloud-native, horizontally scalable databases. Analogous examples for storage and caching exist as well.

            Gateway Tech Stack Options
            Topology Chain Index Bundle Index Data Index Data Store
            Small SQLite SQLite SQLite Local File System
            Large PostgreSQL Cassandra Cassandra S3 Compatible

            # ARNS Indexing and Routing

            The Arweave Name System’s (ArNS) state is managed by the IO token’s SmartWeave smart contract. AR.IO gateways shall perform the following minimum functions relative to ArNS:

            • Actively track state changes in the contract.

            • Maintain up-to-date indexes for routing configurations based on the state of the IO contract as well as the states of the Arweave Name Token (ANT) contracts to which each name is affiliated.

            • Manage the expiration of stale records.

            • Facilitate ArNS routing based on the subdomains specified on incoming requests where appropriate.

            • Provide a custom HTTP response header for ArNS requests indicating the corresponding Arweave transaction ID.

            # Content Moderation

            The AR.IO Network will adopt Arweave’s voluntary content moderation model whereby every participant of the network has the autonomy to decide which content they want to (or can legally) store, serve, and see. Each gateway operating on the network has the right and ability to blocklist any content (or address) that is deemed in violation of its content policies or non-compliant with local regulations.

            + diff --git a/gateways/testnet/index.html b/gateways/testnet/index.html index 441808c9..18a61209 100644 --- a/gateways/testnet/index.html +++ b/gateways/testnet/index.html @@ -13,11 +13,11 @@ - + -

            # Join the AR.IO Testnet

            # Prerequisites

            1. Must have a fully functional AR.IO gateway.

            2. Gateway must be associated with an Arweave Wallet.

            3. Arweave wallet must be funded with enough AR tokens to pay for transaction gas.

            # Submit an Application

            Joining the ar.io Testnet requires staking a minimum of 10,000 Test IO Tokens. You must have Test IO Tokens before you are able to join. Test IO Tokens are currently distributed through an application system in the ar.io Discord (opens new window).

            New applications for joining the Testnet are not currently being accepted. Be sure to join the ar.io Discord (opens new window) to stay up to date on Testnet status and possible future availability prior to the launch of the Mainnet.

            # Setting up and Running the Join Script

            Joining the ar.io Testnet is currently completed by manually running a script. The process for doing so is as follows:

            # Clone the Repo

            In a terminal (Powershell or Command Line on Windows) navigate to the location where you want to clone the repo, then run the following command

            git clone https://github.com/ar-io/testnet-contract
            +    

            # Join the AR.IO Testnet

            # Prerequisites

            1. Must have a fully functional AR.IO gateway.

            2. Gateway must be associated with an Arweave Wallet.

            3. Arweave wallet must be funded with enough AR tokens to pay for transaction gas.

            # Submit an Application

            Joining the ar.io Testnet requires staking a minimum of 10,000 Test IO Tokens. You must have Test IO Tokens before you are able to join. Test IO Tokens are currently distributed through an application system in the ar.io Discord (opens new window).

            New applications for joining the Testnet are not currently being accepted. Be sure to join the ar.io Discord (opens new window) to stay up to date on Testnet status and possible future availability prior to the launch of the Mainnet.

            # Setting up and Running the Join Script

            Joining the ar.io Testnet is currently completed by manually running a script. The process for doing so is as follows:

            # Clone the Repo

            In a terminal (Powershell or Command Line on Windows) navigate to the location where you want to clone the repo, then run the following command

            git clone https://github.com/ar-io/testnet-contract
             

            # Install dependencies

            cd testnet-contract
             yarn install
             

            # Provide Wallet Keys

            Joining the testnet requires signing and funding a transaction that interacts with the Testnet smart contract. This means the script needs access to your wallet. There are two ways this can be done:

            1. Copy your wallet's JWK into a .env file in testnet-contract root directory.

            2. Save a copy of your wallet JSON keyfile in the testnet-contract root directory as "key.json".

            # Configure your settings

            You will need to provide some information specific to your gateway before running the join script. You can do this by opening the script file in any code or text editor. The file is located at testnet-contract > tools > join-network.ts

            Each line that needs to be edited begins with "const", followed by a variable name, and "=" sign, and its value. Each line is accompanied by a note to inform you of its purpose. The following variables MUST be changed in order to successfully join the ar.io Testnet:

            • qty: Quantity of Test IO Tokens to stake to join the Testnet. This value must be at least 10,000, and not greater than the number of Test IO tokens in your wallet.
            • label: A friendly label for your Gateway. There currently a 16 character limit for this value.
            • fqdn: Fully Qualified Domain Name - This is the domain name you have pointed at your Gateway.
            • observerWallet: The public address of the wallet used for Observer.

            There are also several variables you may edit, but are not required:

            • port: The port used to access your Gateway, defaults to 443 (https).
            • protocol: Set this to "http" if your Gateway is not configured to allow https connections.
            • properties: This variable allows you to reference the TxId of any additional Gateway settings you've previously uploaded to Arweave. While we'll provide more detailed instructions and schema for doing so soon, it's safe to leave this unchanged for the time being.
            • note: A note containing additional information you would like known about your Gateway.

            These settings can be updated after joining the Testnet.

            # Run the Script

            Once you have Test IO Tokens and all of your settings configured properly, it's time to run the script and join the network. From the testnet-contract root directory, run the following command in your terminal:

            yarn ts-node tools/join-network.ts
            @@ -33,6 +33,6 @@
                   // note
                 },
             

            Make sure that any settings you want to update are not commented in this section, and any settings you don't want to change are commented.

            Once this is done, run the script with yarn ts-node tools/update-gateway-settings.ts

            - + diff --git a/gateways/upgrade/index.html b/gateways/upgrade/index.html index f4549c58..78b90792 100644 --- a/gateways/upgrade/index.html +++ b/gateways/upgrade/index.html @@ -13,11 +13,11 @@ - + -

            # Upgrading your Gateway

            To ensure the optimal performance and security of your AR.IO Gateway, it's essential to regularly upgrade to the latest version. Notably, indexed data resides separate from Docker. As a result, neither upgrading the Gateway nor pruning Docker will erase your data or progress. Here's how you can perform the upgrade:

            # Prerequisites

            • Your Gateway should have been cloned using git. If you haven't, follow the installation instructions for windows or linux.

            # Checking your Release Number

            Effective with release 3, you can view the currently implemented release on any gateway by visiting https://<gateway>/ar-io/info in a browser. Be sure to replace <gateway> with the domain of the gateway you are checking.

            If the release number displayed includes -pre it means that your gateway is using the develop branch of the github repo for the gateway code. Follow steps in our troubleshooting guide to switch over to the more stable main branch.

            Announcements will be made in our discord server (opens new window) showing each new release.

            # Upgrade Steps

            1. Pull the latest changes from the repository

              Navigate to your cloned repository directory and execute the following command:

              git pull
              +    

              # Upgrading your Gateway

              To ensure the optimal performance and security of your AR.IO Gateway, it's essential to regularly upgrade to the latest version. Notably, indexed data resides separate from Docker. As a result, neither upgrading the Gateway nor pruning Docker will erase your data or progress. Here's how you can perform the upgrade:

              # Prerequisites

              • Your Gateway should have been cloned using git. If you haven't, follow the installation instructions for windows or linux.

              # Checking your Release Number

              Effective with release 3, you can view the currently implemented release on any gateway by visiting https://<gateway>/ar-io/info in a browser. Be sure to replace <gateway> with the domain of the gateway you are checking.

              If the release number displayed includes -pre it means that your gateway is using the develop branch of the github repo for the gateway code. Follow steps in our troubleshooting guide to switch over to the more stable main branch.

              Announcements will be made in our discord server (opens new window) showing each new release.

              # Upgrade Steps

              1. Pull the latest changes from the repository

                Navigate to your cloned repository directory and execute the following command:

                git pull
                 
              2. Shut down Docker

                Depending on your operating system, use the respective commands:

                Linux
                sudo docker-compose down -v
                 
                Windows
                
                 docker-compose down -v
                @@ -31,6 +31,6 @@
                 
              3. Check for New Environmental Variables

                Read the update release change logs and community announcements to see if the new version includes any new environmental variables that you should set before restarting your gateway.

              4. Restart the Docker container

                Finally, start the Docker container again to implement the changes:

                Linux
                sudo docker-compose up -d
                 
                Windows
                docker-compose up -d
                 

                NOTE: Effective with Release #3, it is no longer required to include the --build flag when starting your gateway. Docker will automatically build using the image specified in the docker-commpose.yaml file.

              That's it! Your AR.IO Gateway is now upgraded to the latest version. Ensure to test and verify that everything is functioning as expected. If you encounter any issues, reach out to the AR.IO community (opens new window) for assistance.

              - + diff --git a/glossary.html b/glossary.html index dd1fa46f..afa643a7 100644 --- a/glossary.html +++ b/glossary.html @@ -13,11 +13,11 @@ - + -

              # Glossary

              Many novel terms and acronyms are used by the Arweave ecosystem as well as some new ones introduced by AR.IO. The list below is intended to serve as a non-exhaustive reference of those terms:

              • Arweave Name System (ArNS): a decentralized and censorship-resistant naming system enabled by AR.IO gateways which connects friendly names to permaweb applications, pages, and data.

              • Arweave Name Token (ANT), “Name Token”: a SmartWeave based token, that is connected to each registered ArNS Name. Each ANT gives the owner the ability to update the subdomains and Arweave transaction IDs used by the registered name as well as transfer ownership and other functions.

              • Arweave Network Standards (ANS): Drafts and finalized standards for data formats, tag formats, data protocols, custom gateway features and anything that is built on top the Arweave Network. Specific standards are denoted by an associated number, e.g., ANS-###.

              • Base Layer Transaction: refers to one of up to 1,000 transactions that make up a single Arweave block. A base layer transaction may contain bundled data items.

              • Bundle, bundling: an Arweave concept introduced in ANS-104 that allows for a way of writing multiple independent data transactions into one base layer transaction. Bundled transactions contain multiple independent transactions, called data items, wrapped into one larger transaction. This offers two major network benefits:

                • A scaling solution for increasing the throughput of uploads to the Arweave network,

                • Allows delegation of payment for an upload to a third party, while maintaining the identity and signature of the person who created the upload, without them needing to have a wallet with funds.

              • Bundled Data Item (BDI): A data item / transaction nested within an ANS-104 bundled transaction.

              • Bundler: a third-party service that bundles data files on a user’s behalf.

              • Chunk: A chunk is a unit of data that is stored on the Arweave network. It represents a piece of a larger file that has been split into smaller, manageable segments for efficient storage and retrieval.

              • Decentralized, decentralization, etc: a nonbinary, many axis scale enabling a system or platform to be: permissionless, trustless, verifiable, transparent, open-source, composable, resilient, and censorship resistant. Ultimately, something that is decentralized is not prone to single points of failure or influence.

              • Epoch: a specific duration (e.g., one block-week) during which network activities and evaluations are conducted. It serves as a key time frame for processes such as observation duties, performance assessments, and reward distributions within the network's protocols.

              • Gateway: a node operating on the Arweave network that provides services for reading from, writing to, and indexing the data stored on the permaweb. Sometimes referred to as “permaweb nodes”.

              • Gateway Address Registry (GAR): a decentralized directory maintained in the AR.IO SmartWeave Contract. It serves as the authoritative list of all registered gateways on the AR.IO Network. The registry provides detailed metadata about each gateway to facilitate discovery, health monitoring, and data sharing among permaweb apps and users. The GAR is designed to be easily queryable, sortable, and filterable by end users and clients, allowing for tailored selections based on various criteria to meet specific use cases.

              • Indexing: The act of organizing transaction data tags into queryable databases.

              • Layer 2 Infrastructure: Layer 2 refers to the technology / infrastructure stack built “above” a base layer. In this use, the AR.IO Network would be considered Layer 2 infrastructure to the base Arweave protocol.

              • Manifest (aka Path Manifest, Arweave Manifest): special “aggregate” files uploaded to Arweave that map user-definable sub-paths with other Arweave transaction IDs. This allows users to create logical groups of content, for example a directory of related files, or the files and assets that make up a web page or application. Instead of having to manually collate these assets, manifests group them together so that an entire website or app can be launched from a single manifest file. Gateways can interpret this structure, so that users can then reference individual transactions by their file name and/or path.

              • Mempool: short for "memory pool," is a component of Arweave mining nodes that temporarily stores valid transactions that have been broadcasted to the network but have not yet been added to a block.

              • Miner (aka Arweave Node): a node operating on the Arweave network responsible for data storage and recall.

              • Observer: a gateway selected to evaluate the performance of peer gateways in resolving ArNS names. Observers assess and report on the operational efficacy of other gateways.

              • Period: refers to a predefined time span (e.g., a block-day) that serves as a cycle for network activities such as dynamic pricing. It is a fundamental unit of time for operational and protocol processes within the network.

              • Permaweb: The permaweb is the permanent and decentralized web of files and applications built on top of Arweave.

              • Permaweb Service Token (PST): An alternate term used within the Arweave ecosystem to denote a SmartWeave Token (SWT).

              • Protocol Balance: The primary sink and source of IO tokens circulating through the AR.IO Network. This balance is akin to a central vault or wallet programmatically encoded into the network’s smart contract from which ArNS revenue is accumulated and incentive rewards are distributed.

              • Protocol Rewards: IO Token incentive rewards distributed by the protocol to the network’s eligible users and gateway operators.

              • Seeding: Refers to the act of propagating new data throughout the network. Miner nodes seed Arweave base layer transaction data to other miners, while gateways ensure that the transactions they receive reach the Arweave nodes. Both gateways and Arweave nodes seed base layer transactions and data chunks.

              • Staking (of tokens): Refers to the process of locking IO tokens into a protocol-facilitated vault, temporarily removing them from circulation until unlocked. This action represents an opportunity cost for the gateway operator and serves as a motivator to prioritize the network's collective interests.

              • SmartWeave: Arweave’s smart contract protocol.

              • SmartWeave Token (SWT): A smart contract token built on SmartWeave.

              • Transaction ID (txID): Every transaction and data file uploaded to Arweave is assigned a unique identifier code known as the Transaction ID. These txID’s can be referenced by users to easily locate and retrieve files.

              • Trust-minimization: Relates to enacting network security by minimizing the number of entities and the degree to which they must be trusted to achieve reliable network interactions. A network with trust-minimizing mechanisms means that it has reduced exposure to undesirable third-party actions and built-in incentives to reward good behavior while punishing bad behavior.

              • Vault: Token vaults are protocol level mechanisms used to contain staked tokens over time. Each vault contains a starting block height, ending block height (if applicable), along with a balance of tokens.

              - +

              # Glossary

              Many novel terms and acronyms are used by the Arweave ecosystem as well as some new ones introduced by AR.IO. The list below is intended to serve as a non-exhaustive reference of those terms:

              • Arweave Name System (ArNS): a decentralized and censorship-resistant naming system enabled by AR.IO gateways which connects friendly names to permaweb applications, pages, and data.

              • Arweave Name Token (ANT), “Name Token”: a SmartWeave based token, that is connected to each registered ArNS Name. Each ANT gives the owner the ability to update the subdomains and Arweave transaction IDs used by the registered name as well as transfer ownership and other functions.

              • Arweave Network Standards (ANS): Drafts and finalized standards for data formats, tag formats, data protocols, custom gateway features and anything that is built on top the Arweave Network. Specific standards are denoted by an associated number, e.g., ANS-###.

              • Base Layer Transaction: refers to one of up to 1,000 transactions that make up a single Arweave block. A base layer transaction may contain bundled data items.

              • Bundle, bundling: an Arweave concept introduced in ANS-104 that allows for a way of writing multiple independent data transactions into one base layer transaction. Bundled transactions contain multiple independent transactions, called data items, wrapped into one larger transaction. This offers two major network benefits:

                • A scaling solution for increasing the throughput of uploads to the Arweave network,

                • Allows delegation of payment for an upload to a third party, while maintaining the identity and signature of the person who created the upload, without them needing to have a wallet with funds.

              • Bundled Data Item (BDI): A data item / transaction nested within an ANS-104 bundled transaction.

              • Bundler: a third-party service that bundles data files on a user’s behalf.

              • Chunk: A chunk is a unit of data that is stored on the Arweave network. It represents a piece of a larger file that has been split into smaller, manageable segments for efficient storage and retrieval.

              • Decentralized, decentralization, etc: a nonbinary, many axis scale enabling a system or platform to be: permissionless, trustless, verifiable, transparent, open-source, composable, resilient, and censorship resistant. Ultimately, something that is decentralized is not prone to single points of failure or influence.

              • Epoch: a specific duration (e.g., one block-week) during which network activities and evaluations are conducted. It serves as a key time frame for processes such as observation duties, performance assessments, and reward distributions within the network's protocols.

              • Gateway: a node operating on the Arweave network that provides services for reading from, writing to, and indexing the data stored on the permaweb. Sometimes referred to as “permaweb nodes”.

              • Gateway Address Registry (GAR): a decentralized directory maintained in the AR.IO SmartWeave Contract. It serves as the authoritative list of all registered gateways on the AR.IO Network. The registry provides detailed metadata about each gateway to facilitate discovery, health monitoring, and data sharing among permaweb apps and users. The GAR is designed to be easily queryable, sortable, and filterable by end users and clients, allowing for tailored selections based on various criteria to meet specific use cases.

              • Indexing: The act of organizing transaction data tags into queryable databases.

              • Layer 2 Infrastructure: Layer 2 refers to the technology / infrastructure stack built “above” a base layer. In this use, the AR.IO Network would be considered Layer 2 infrastructure to the base Arweave protocol.

              • Manifest (aka Path Manifest, Arweave Manifest): special “aggregate” files uploaded to Arweave that map user-definable sub-paths with other Arweave transaction IDs. This allows users to create logical groups of content, for example a directory of related files, or the files and assets that make up a web page or application. Instead of having to manually collate these assets, manifests group them together so that an entire website or app can be launched from a single manifest file. Gateways can interpret this structure, so that users can then reference individual transactions by their file name and/or path.

              • Mempool: short for "memory pool," is a component of Arweave mining nodes that temporarily stores valid transactions that have been broadcasted to the network but have not yet been added to a block.

              • Miner (aka Arweave Node): a node operating on the Arweave network responsible for data storage and recall.

              • Observer: a gateway selected to evaluate the performance of peer gateways in resolving ArNS names. Observers assess and report on the operational efficacy of other gateways.

              • Period: refers to a predefined time span (e.g., a block-day) that serves as a cycle for network activities such as dynamic pricing. It is a fundamental unit of time for operational and protocol processes within the network.

              • Permaweb: The permaweb is the permanent and decentralized web of files and applications built on top of Arweave.

              • Permaweb Service Token (PST): An alternate term used within the Arweave ecosystem to denote a SmartWeave Token (SWT).

              • Protocol Balance: The primary sink and source of IO tokens circulating through the AR.IO Network. This balance is akin to a central vault or wallet programmatically encoded into the network’s smart contract from which ArNS revenue is accumulated and incentive rewards are distributed.

              • Protocol Rewards: IO Token incentive rewards distributed by the protocol to the network’s eligible users and gateway operators.

              • Seeding: Refers to the act of propagating new data throughout the network. Miner nodes seed Arweave base layer transaction data to other miners, while gateways ensure that the transactions they receive reach the Arweave nodes. Both gateways and Arweave nodes seed base layer transactions and data chunks.

              • Staking (of tokens): Refers to the process of locking IO tokens into a protocol-facilitated vault, temporarily removing them from circulation until unlocked. This action represents an opportunity cost for the gateway operator and serves as a motivator to prioritize the network's collective interests.

              • SmartWeave: Arweave’s smart contract protocol.

              • SmartWeave Token (SWT): A smart contract token built on SmartWeave.

              • Transaction ID (txID): Every transaction and data file uploaded to Arweave is assigned a unique identifier code known as the Transaction ID. These txID’s can be referenced by users to easily locate and retrieve files.

              • Trust-minimization: Relates to enacting network security by minimizing the number of entities and the degree to which they must be trusted to achieve reliable network interactions. A network with trust-minimizing mechanisms means that it has reduced exposure to undesirable third-party actions and built-in incentives to reward good behavior while punishing bad behavior.

              • Vault: Token vaults are protocol level mechanisms used to contain staked tokens over time. Each vault contains a starting block height, ending block height (if applicable), along with a balance of tokens.

              + diff --git a/guides/arns/managing.html b/guides/arns/managing.html index 3ff13d6f..89a3e8a1 100644 --- a/guides/arns/managing.html +++ b/guides/arns/managing.html @@ -13,13 +13,13 @@ - + -

              # Managing ArNS Assets

              # Overview

              From the Manage Assets page of arns.app, you can view details about your registered names, assign new Target IDs for your names to resolve to, or register new undernames for your ArNS names.

              Access the Manage Assets page by connecting your Arweave wallet, and clicking on the account button displaying your wallet address (the connect button if you are not connected), then selecting "Manage Assets" from the menu.