ETH Price: $3,340.97 (-1.02%)

Contract

0xf5e92BBCf7DD9CceFacEBD4a20792cFb6DBc1F60
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
__Withdraw All E...197851262024-05-02 21:30:11204 days ago1714685411IN
0xf5e92BBC...b6DBc1F60
0 ETH0.000225815.58010918
__Start Fixed Pr...196964792024-04-20 11:59:23216 days ago1713614363IN
0xf5e92BBC...b6DBc1F60
0 ETH0.002687996.73147306
Purchase Fixed P...192987002024-02-24 16:41:23272 days ago1708792883IN
0xf5e92BBC...b6DBc1F60
1 ETH0.0067737939.91955875
Purchase Fixed P...192982022024-02-24 15:00:23272 days ago1708786823IN
0xf5e92BBC...b6DBc1F60
1 ETH0.0059015328.94525662
__Start Fixed Pr...192900352024-02-23 11:36:35273 days ago1708688195IN
0xf5e92BBC...b6DBc1F60
0 ETH0.0124482736.74734399
__Withdraw All E...192418902024-02-16 17:18:59280 days ago1708103939IN
0xf5e92BBC...b6DBc1F60
0 ETH0.0013770834.02890784
__Withdraw ETH F...192417952024-02-16 16:59:35280 days ago1708102775IN
0xf5e92BBC...b6DBc1F60
0 ETH0.0020884832.41079799
Purchase Fixed P...192417912024-02-16 16:58:47280 days ago1708102727IN
0xf5e92BBC...b6DBc1F60
3 ETH0.0064764732.52140597
Purchase Fixed P...192417262024-02-16 16:45:47280 days ago1708101947IN
0xf5e92BBC...b6DBc1F60
0.9 ETH0.0043221835
Purchase Fixed P...192417162024-02-16 16:43:47280 days ago1708101827IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0045876532.33042186
Purchase Fixed P...192416292024-02-16 16:26:23280 days ago1708100783IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0048989234.52404547
Purchase Fixed P...192415932024-02-16 16:19:11280 days ago1708100351IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0036147233.5632578
Purchase Fixed P...192415852024-02-16 16:17:35280 days ago1708100255IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0037746935.04854642
Purchase Fixed P...192415522024-02-16 16:10:59280 days ago1708099859IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0042486739.44956222
Purchase Fixed P...192415392024-02-16 16:08:23280 days ago1708099703IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0049227245.70815054
Purchase Fixed P...192415342024-02-16 16:07:23280 days ago1708099643IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0043986240.84186917
Purchase Fixed P...192415302024-02-16 16:06:23280 days ago1708099583IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0044857541.65082294
Purchase Fixed P...192415162024-02-16 16:03:35280 days ago1708099415IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0052612348.85133394
Purchase Fixed P...192415072024-02-16 16:01:47280 days ago1708099307IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.007914855.77776367
Purchase Fixed P...192414852024-02-16 15:56:59280 days ago1708099019IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0041291838.34003031
Purchase Fixed P...192414722024-02-16 15:54:23280 days ago1708098863IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0052427536.94711416
Purchase Fixed P...192414692024-02-16 15:53:47280 days ago1708098827IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0041532338.5634002
Purchase Fixed P...192414542024-02-16 15:50:47280 days ago1708098647IN
0xf5e92BBC...b6DBc1F60
0.4 ETH0.0059992740.58475155
Purchase Fixed P...192414532024-02-16 15:50:35280 days ago1708098635IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0042301639.2776599
Purchase Fixed P...192414492024-02-16 15:49:47280 days ago1708098587IN
0xf5e92BBC...b6DBc1F60
0.1 ETH0.0041507638.54042955
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
197851262024-05-02 21:30:11204 days ago1714685411
0xf5e92BBC...b6DBc1F60
2 ETH
192418902024-02-16 17:18:59280 days ago1708103939
0xf5e92BBC...b6DBc1F60
75.5107 ETH
192417952024-02-16 16:59:35280 days ago1708102775
0xf5e92BBC...b6DBc1F60
10.6893 ETH
188099522023-12-18 2:37:59341 days ago1702867079
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188099522023-12-18 2:37:59341 days ago1702867079
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188099522023-12-18 2:37:59341 days ago1702867079
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188098242023-12-18 2:12:23341 days ago1702865543
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188098242023-12-18 2:12:23341 days ago1702865543
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188098242023-12-18 2:12:23341 days ago1702865543
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188094672023-12-18 1:00:23341 days ago1702861223
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188094672023-12-18 1:00:23341 days ago1702861223
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188094672023-12-18 1:00:23341 days ago1702861223
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188094142023-12-18 0:49:23341 days ago1702860563
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188094142023-12-18 0:49:23341 days ago1702860563
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188094142023-12-18 0:49:23341 days ago1702860563
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188093492023-12-18 0:36:23341 days ago1702859783
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188093492023-12-18 0:36:23341 days ago1702859783
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188093492023-12-18 0:36:23341 days ago1702859783
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188092442023-12-18 0:15:23341 days ago1702858523
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188092442023-12-18 0:15:23341 days ago1702858523
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188092442023-12-18 0:15:23341 days ago1702858523
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188090882023-12-17 23:44:11341 days ago1702856651
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188090882023-12-17 23:44:11341 days ago1702856651
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188090882023-12-17 23:44:11341 days ago1702856651
0xf5e92BBC...b6DBc1F60
0.0333 ETH
188085212023-12-17 21:49:11341 days ago1702849751
0xf5e92BBC...b6DBc1F60
0.0333 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Marketplace

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 7 : Marketplace.sol
//SPDX-License-Identifier: MIT
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@          @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@              @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@              @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
/**
 * @dev: @brougkr
 */
pragma solidity 0.8.19;
import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { IMinter } from "./IMinter.sol";
import { DelegateCashEnabled } from "./DelegateCashEnabled.sol";
contract Marketplace is Ownable, ReentrancyGuard, DelegateCashEnabled
{
    struct SaleTypeFixedPrice
    {
        string _Name;                 // [0] -> _Name
        uint _Price;                  // [1] -> _Price
        uint _MintPassProjectID;      // [2] -> _MintPassProjectID
        uint _Type;                   // [3] -> _Type (The Type Of Sale) (Must Be Configured To One Of The Following Options)
                                      // { ----------------------------------------------- }
                                      // |  0 = _MintToFactory() Single Mint               |
                                      // |  1 = _MintToFactory() Mint Pack                 |
                                      // |  2 = _LiveMintMarketplace() Single Mint         |
                                      // |  3 = _LiveMintMarketplace() Mint Pack           |
                                      // |  4 = purchaseTo() ArtBlocks Direct Sale         |
                                      // |  5 = transferFrom() Already-Minted ERC721 Sale  |
                                      // |  6 = purchaseTo() ArtBlocks Direct Sale /w ETH  |
                                      // { ----------------------------------------------- }
        uint _MinterProjectID;        // [4] -> _MinterProjectID (ArtBlocks or LiveMint)
        uint _AmountForSale;          // [5] -> _AmountForSale
        uint _TimestampStart;         // [6] -> _TimestampStart
        uint _CurrentIndex;           // [7] -> _CurrentIndex
        uint _BatchPurchaseAmount;    // [8] -> _BatchPurchaseAmount (Transfer Amount Per Purchase) (MintPack or Direct Mint)
        address _NFT;                 // [9] -> _NFT
        address _Operator;            // [10] -> _Operator
        bytes32[] _RootEligibilities; // [11] -> _RootEligibilities
        bytes32[] _RootAmounts;       // [12] -> _RootAmounts
        uint[] _LiveMintProjectIDs;   // [13] -> _LiveMintProjectIDs
    }

    struct FixedPriceSaleInfo
    {
        string _Name;                        // [0] -> _Price
        uint _Price;                         // [1] -> _Price
        uint _MintPassProjectID;             // [2] -> _MintPassProjectID
        uint _Type;                          // [3] -> _Type (The Type Of Sale) (Must Be Configured To One Of These Options)
                                             // { ----------------------------------------------- }
                                             // |  0 = _MintToFactory() Single Mint               |
                                             // |  1 = _MintToFactory() Mint Pack                 |
                                             // |  2 = _LiveMintMarketplace() Single Mint         |
                                             // |  3 = _LiveMintMarketplace() Mint Pack           |
                                             // |  4 = purchaseTo() ArtBlocks Direct Sale         |
                                             // |  5 = transferFrom() Already-Minted ERC721 Sale  |
                                             // |  6 = purchaseTo() ArtBlocks Direct Sale /w ETH  |
                                             // { ----------------------------------------------- }
        uint _MinterProjectID;               // [4] -> _MinterProjectID (ArtBlocks or LiveMint)
        uint _AmountForSale;                 // [5] -> _AmountForSale
        uint _TimestampStart;                // [6] -> _TimestampStart
        uint _CurrentIndex;                  // [7] -> _CurrentIndex
        uint _BatchPurchaseAmount;           // [8] -> _BatchPurchaseAmount (Transfer Amount Per Purchase)
        address _NFT;                        // [9] -> _NFT
        address _Operator;                   // [10] -> _Operator
        bytes32[] _RootEligibilities;        // [11] -> _RootEligibilities
        bytes32[] _RootAmounts;              // [12] -> _RootAmounts
        uint[] _LiveMintProjectIDs;          // [13] -> _LiveMintProjectIDs
        uint[] _DiscountAmountWEIValues;     // [14] -> _DiscountAmountWEIValues
        uint _ETHRevenue;                    // [15] -> _ETHRevenue
        uint _AmountRemaining;               // [16] -> _AmountRemaining
        uint _Priority;                      // [17] -> _Priority
        uint _AmountRemainingMerklePriority; // [18] -> _AmountRemainingMerklePriority
        uint _AmountPurchasedUser;           // [19] -> _AmountPurchasedUser
        bool _BrightListEligible;            // [20] -> _BrightListEligible
        bool _BrightListAmounts;             // [21] -> _BrightListAmounts
    }
    
    struct SaleTypePresale 
    {
        string _Name;              // [0] -> _Name
        address _Operator;         // [1] -> _Operator
        address _NFT;              // [2] -> _NFT
        uint _MaxForSale;          // [3] -> _MaxForSale
        uint _MaxPerPurchase;      // [4] -> _MaxPerPurchase
        uint _PricePresale;        // [5] -> _PricePresale
        uint _PricePublic;         // [6] -> _PricePublic
        uint _TimestampEndFullSet; // [7] -> _TimestampEndFullSet
        uint _TimestampEndCitizen; // [8] -> _TimestampEndCitizen
        uint _TimestampSaleStart;  // [9] -> _TimestampSaleStart
        uint _Type;                // [10] -> _Type
        uint _ProjectID;           // [11] -> _ProjectID
    }

    struct InternalPresaleSale
    {
        bool _Active;                 // [0] -> _Active
        uint _AmountSold;             // [1] -> _AmountSold
        uint _ETHRevenue;             // [2] -> _ETHRevenue
        uint _GlobalPurchasesFullSet; // [3] -> _GlobalPurchasesFullSet
        uint _GlobalPurchasesCitizen; // [4] -> _GlobalPurchasesCitizen
        uint _GlobalPurchasesPublic;  // [5] -> _GlobalPurchasesPublic
        uint _CurrentTokenIndex;      // [6] -> _CurrentTokenIndex
        uint _AmountSoldFullSet;      // [7] -> _AmountSoldFullSet
        uint _AmountSoldCitizen;      // [8] -> _AmountSoldCitizen
        uint _AmountSoldPublic;       // [9] -> _AmountSoldPublic
    }

    struct InternalPresaleSaleRoots
    {
        bytes32 _RootEligibilityFullSet; // [0] -> _RootEligibilityFullSet
        bytes32 _RootEligibilityCitizen; // [1] -> _RootEligibilityCitizen
        bytes32 _RootAmountFullSet;      // [2] -> _RootAmountFullSet
        bytes32 _RootAmountCitizen;      // [3] -> _RootAmountCitizen
    }

    struct InternalPresaleWalletInfo    
    {
        uint _AmountPurchasedFullSetWindow; // [0] -> _AmountPurchasedFullSetWindow
        uint _AmountPurchasedCitizenWindow; // [1] -> _AmountPurchasedCitizenWindow
        uint _AmountPurchasedWallet;        // [2] -> _AmountPurchasedWallet
    }

    struct SaleInfoPresale
    {
        uint _ETHRevenue;                   // [0] -> _ETHRevenue
        uint _PricePresale;                 // [1] -> _PricePresale
        uint _PricePublic;                  // [2] -> _PricePublic
        uint _MaxForSale;                   // [3] -> _MaxForSale
        uint _AmountRemaining;              // [4] -> _AmountRemaining
        uint _TimestampEndFullSet;          // [5] -> _TimestampEndFullSet
        uint _TimestampEndCitizen;          // [6] -> _TimestampEndCitizen
        uint _TimestampSaleStart;           // [7] -> _TimestampSaleStart
        uint _AmountPurchasableFullSet;     // [8] -> _AmountPurchasableFullSet
        uint _AmountPurchasableCitizen;     // [9] -> _AmountPurchasableCitizen
        uint _AmountPurchasedFullSetWindow; // [10] -> _AmountPurchasedFullSetWindow
        uint _AmountPurchasedCitizenWindow; // [11] -> _AmountPurchasedCitizenWindow
        uint _GlobalPurchasesFullSet;       // [12] -> _GlobalPurchasesFullSet
        uint _GlobalPurchasesCitizen;       // [13] -> _GlobalPurchasesCitizen
        uint _GlobalPurchasesPublic;        // [14] -> _GlobalPurchasesPublic
        uint _AmountPurchasedWallet;        // [15] -> _AmountPurchasedWallet
        bool _EligibleFullSet;              // [16] -> _EligibleFullSet
        bool _EligibleCitizen;              // [17] -> _EligibleCitizen
        bool _ValidMaxAmountFullSet;        // [18] -> _ValidMaxAmountFullSet
        bool _ValidMaxAmountCitizen;        // [19] -> _ValidMaxAmountCitizen
    }

    /*------------------
     * STATE VARIABLES *
    -------------------*/

    uint public _TOTAL_UNIQUE_PRESALE_SALES; // Total Unique Presale Sales                
    uint public _TOTAL_UNIQUE_FIXED_SALES; // Total Unique Fixed Price Sales
    address private constant _BRT_MULTISIG = 0x0BC56e3c1397e4570069e89C07936A5c6020e3BE; // `sales.brightmoments.eth`a
    
    /*-----------
     * MAPPINGS *
    ------------*/

    mapping(uint=>SaleTypeFixedPrice) public FixedPriceSales;                                 // [SaleIndex] -> SaleTypeFixedPrice
    mapping(uint=>SaleTypePresale) public PresaleSales;                                       // [SaleIndex] -> SaleTypePresale
    mapping(uint=>InternalPresaleSale) public PresaleSalesInternal;                           // [SaleIndex] -> InternalPresaleSale
    mapping(uint=>uint) public AmountSoldFixedPrice;                                          // [SaleIndex] -> Amount Sold
    mapping(uint=>uint[]) public DiscountAmounts;                                             // [SaleIndex] -> Discount Amounts
    mapping(uint=>InternalPresaleSaleRoots) public InternalRoots;                             // [SaleIndex] -> InternalPresaleSaleRoots
    mapping(uint=>mapping(address=>InternalPresaleWalletInfo)) public InternalSaleWalletInfo; // [SaleIndex][Wallet] -> InternalPresaleWalletInfo
    mapping(uint=>uint) public ETHRevenueFixedPriceSale;                                      // [SaleIndex] -> ETH Amount
    mapping(uint=>uint) public ETHRevenueWithdrawn;                                           // [SaleIndex] -> ETH Amount Withdrawn
    mapping(uint=>mapping(address=>mapping(uint=>uint))) public PriorityPurchaseAmount;       // [SaleIndex][Wallet][Priority] => Purchased Amount For Priority Level
    mapping(address=>bool) public Admin;                                                      // [Address] -> Admin Status
    mapping(uint=>mapping(address=>uint)) public UserPurchasedAmount;                         // [SaleIndex][Wallet] -> Purchased Amount

    /*---------
     * EVENTS *
    ----------*/

    event PurchasedPresale(uint SaleIndex, address Purchaser, uint DesiredAmount, uint MessageValue, bool PresaleEnded);    
    event SaleStarted(uint SaleIndex);
    event Refunded(address Refundee, uint Amount);
    event Purchased(uint SaleIndex, address Purchaser, uint Amount, uint Priority);
    event Fullset();
    event Citizen();
    event Public();

    constructor() 
    { 
        Admin[msg.sender] = true; 
        Admin[0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700] = true;
        Admin[0x90D98d5A1fD21B7cEa4D5c18341607ed1a8345c0] = true;
        Admin[0x18B7511938FBe2EE08ADf3d4A24edB00A5C9B783] = true;
        _transferOwnership(0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700);
    }

    /*---------------------
     * EXTERNAL FUNCTIONS *
    ----------------------*/

    /**
     * @dev Purchases One Fixed Price Sale
     * @param SaleIndex The Sale Index To Purchase
     * @param DesiredAmount The Desired Amount To Purchase
     * @param MaxAmount The Maximum Merkle Priority To Purchase
     * @param Vault Delegate Vault Address
     * @param ProofEligibility Merkle Proof For Eligibility
     * @param ProofAmount Merkle Proof For MaxAmount
     */
    function PurchaseFixedPrice (
        uint SaleIndex,
        uint DesiredAmount,
        uint MaxAmount,
        address Vault,
        bytes32[] calldata ProofEligibility,
        bytes32[] calldata ProofAmount
    ) external payable nonReentrant {
        __FinalizeFixedPriceSale(
            SaleIndex, 
            DesiredAmount, 
            MaxAmount, 
            Vault, 
            ProofEligibility, 
            ProofAmount, 
            msg.value,
            msg.sender
        );
    }

    /**
     * @dev Purchases Multiple Fixed Price Sales
     * @param SaleIndexes The Sale Indexes To Purchase
     * @param DesiredAmounts The Desired Amounts To Purchase
     * @param MaxAmounts The Maximum Merkle Priority To Purchase
     * @param Vaults Delegate Vault Addresses
     * @param ProofEligibilities Merkle Proofs For Eligibility
     * @param ProofAmounts Merkle Proofs For MaxAmount
     * @param MessageValues The Amounts To Purchase Per Sale
     */
    function PurchaseFixedPriceMulti (
        uint[] calldata SaleIndexes,
        uint[] calldata DesiredAmounts,
        uint[] calldata MaxAmounts,
        address[] calldata Vaults,
        bytes32[][] calldata ProofEligibilities,
        bytes32[][] calldata ProofAmounts,
        uint[] calldata MessageValues
    ) external payable nonReentrant {
        uint MessageValueSum;
        require(
            SaleIndexes.length == DesiredAmounts.length 
            &&
            DesiredAmounts.length == MaxAmounts.length
            &&
            MaxAmounts.length == Vaults.length
            &&
            Vaults.length == ProofEligibilities.length
            &&
            ProofEligibilities.length == ProofAmounts.length
            && 
            ProofAmounts.length == MessageValues.length,
            "Marketplace: Incorrect Array Lengths"
        );
        for(uint x; x < SaleIndexes.length; x++)
        {
            __FinalizeFixedPriceSale(
                SaleIndexes[x], 
                DesiredAmounts[x], 
                MaxAmounts[x], 
                Vaults[x], 
                ProofEligibilities[x], 
                ProofAmounts[x],
                MessageValues[x],
                msg.sender
            );
            MessageValueSum += MessageValues[x];
        }
        require(MessageValueSum == msg.value, "Marketplace: `msg.value` & `MessageValues` Input Incorrect");
    }

    /**
     * @dev Presale Purchase
     * @param SaleIndex The Sale Index To Purchase
     * @param DesiredAmount The Desired Amount To Purchase
     * @param MaxAmount The Maximum Amount For Merkle Priority Purchase
     * @param Vault Delegate Vault Address
     * @param ProofEligibility Merkle Proof For Eligibility
     * @param ProofAmount Merkle Proof For MaxAmount
     */
    function PurchasePresale (
        uint SaleIndex,                      
        uint DesiredAmount,                  
        uint MaxAmount,                      
        address Vault,                       
        bytes32[] calldata ProofEligibility, 
        bytes32[] calldata ProofAmount 
    ) external payable nonReentrant {
        __FinalizePresale(
            SaleIndex, 
            DesiredAmount, 
            MaxAmount, 
            Vault, 
            ProofEligibility, 
            ProofAmount,
            msg.value,
            msg.sender
        );
    }

    /*------------------
     * ADMIN FUNCTIONS *
    -------------------*/

    /**
     * @dev Instantiates A New Presale Sale
     * @param _Sale The Presale Sale Struct
     * @param _Roots The Presale Sale Roots Struct
     */
    function __StartPresaleSale(SaleTypePresale memory _Sale, InternalPresaleSaleRoots memory _Roots) external onlyAdmin 
    {
        PresaleSales[_TOTAL_UNIQUE_PRESALE_SALES] = _Sale; 
        PresaleSalesInternal[_TOTAL_UNIQUE_PRESALE_SALES]._Active = true;
        InternalRoots[_TOTAL_UNIQUE_PRESALE_SALES] = _Roots;
        emit SaleStarted(_TOTAL_UNIQUE_PRESALE_SALES);
        _TOTAL_UNIQUE_PRESALE_SALES++;
    }

    /**
     * @dev Overwrites A Presale Sale
     * @param SaleIndex The Sale Index To Edit
     * @param _Sale The Fixed Price Sale Struct
     */
    function __OverwritePresaleSale(uint SaleIndex, SaleTypePresale memory _Sale) external onlyAdmin { PresaleSales[SaleIndex] = _Sale; }
    
    /**
     * @dev Changes The Presale Sale Type
     * @param SaleIndex The Sale Index To Edit
     * @param Type The Sale Type (0 = _MintToFactory() | 1 = purchaseTo() | 2 = transferFrom())
     */
    function __ChangePresaleType(uint SaleIndex, uint Type) external onlyAdmin
    {
        PresaleSales[SaleIndex]._Type = Type;
    }

    /**
     * @dev Changes Presale ArtBlocks ProjectID
     * @param SaleIndex The Sale Index To Edit
     * @param ProjectID ArtBlocks ProjectID
     */
    function __ChangePresaleProjectID(uint SaleIndex, uint ProjectID) external onlyAdmin
    {
        PresaleSales[SaleIndex]._ProjectID = ProjectID;
    }

    /**
     * @dev Changes Presale Times
     * @param SaleIndex The Sale Index To Edit
     * @param TimestampSaleStart The Unix Timestamp For Sale Start
     * @param TimestampFullSetEnd The Unix Timestamp When Full Set Window Ends
     * @param TimestampCitizenEnd The Unix Timestamp When Citizen Window Ends (Public Begins)
     */
    function __ChangePresaleTimes (
        uint SaleIndex,
        uint TimestampSaleStart,
        uint TimestampFullSetEnd,
        uint TimestampCitizenEnd
    ) external onlyAdmin {
        PresaleSales[SaleIndex]._TimestampSaleStart = TimestampSaleStart;
        PresaleSales[SaleIndex]._TimestampEndFullSet = TimestampFullSetEnd;
        PresaleSales[SaleIndex]._TimestampEndCitizen = TimestampCitizenEnd;
    }

    /**
     * @dev Changes All Presale Roots
     * @param SaleIndex The Sale Index To Edit
     * @param RootEligibilityFullSet The Merkle Eligibility Root For Full Set
     * @param RootAmountsFullSet The Merkle Amounts Root For Full Set
     * @param RootEligibilityCitizen The Merkle Eligibility Root For Citizens
     * @param RootAmountsCitizen The Merkle Amounts Root For Citizens
     */
    function __ChangePresaleRootsAll (
        uint SaleIndex,
        bytes32 RootEligibilityFullSet,
        bytes32 RootAmountsFullSet,
        bytes32 RootEligibilityCitizen,
        bytes32 RootAmountsCitizen
    ) external onlyAdmin { 
        InternalRoots[SaleIndex]._RootEligibilityFullSet = RootEligibilityFullSet;
        InternalRoots[SaleIndex]._RootEligibilityCitizen = RootEligibilityCitizen;
        InternalRoots[SaleIndex]._RootAmountFullSet = RootAmountsFullSet;
        InternalRoots[SaleIndex]._RootAmountCitizen = RootAmountsCitizen;
    }

    /**
     * @dev Changes The Presale Roots For Merkle Eligibility
     * @param SaleIndex The Sale Index To Edit
     * @param RootCitizen The Merkle Eligibility Root For Citizens
     * @param RootFullSet The Merkle Eligibility Root For Full Set Holders
     */
    function __ChangePresaleRootsEligibility (
        uint SaleIndex, 
        bytes32 RootCitizen,
        bytes32 RootFullSet
    ) external onlyAdmin {
        InternalRoots[SaleIndex]._RootEligibilityCitizen = RootCitizen;
        InternalRoots[SaleIndex]._RootEligibilityFullSet = RootFullSet;
    }

    /**
     * @dev Changes The Presale Roots For Merkle Amounts
     * @param SaleIndex The Sale Index To Edit
     * @param RootCitizen The Merkle Amount Root For Citizens
     * @param RootFullSet The Merkle Amount Root For Full Set Holders
     */
    function __ChangePresaleRootsAmounts (
        uint SaleIndex,
        bytes32 RootCitizen,
        bytes32 RootFullSet
    ) external onlyAdmin {
        InternalRoots[SaleIndex]._RootAmountCitizen = RootCitizen;
        InternalRoots[SaleIndex]._RootAmountFullSet = RootFullSet;
    }

    /**
     * @dev Changes Presale Sale Max For Sale
     * @param SaleIndex The Sale Index To Edit
     * @param MaxForSale The Total Amount For Sale
     */
    function __ChangePresaleSaleMaxForSale(uint SaleIndex, uint MaxForSale) external onlyAdmin 
    {   
        require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active");
        PresaleSales[SaleIndex]._MaxForSale = MaxForSale; 
    }

    /**
     * @dev Change Presale Sale Max Per Purchase
     * @param SaleIndex The Sale Index To Edit
     * @param MaxPerPurchase The Maximum Purchase Amount Per Transaction
     */
    function __ChangePresaleSaleMaxPerPurchase(uint SaleIndex, uint MaxPerPurchase) external onlyAdmin 
    {   
        require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active");
        PresaleSales[SaleIndex]._MaxPerPurchase = MaxPerPurchase; 
    }

    /**
     * @dev Changes Presale Sale Mint Pass Price
     * @param SaleIndex The Sale Index To Edit
     * @param Price The Sale Presale Price Input In WEI
     */
    function __ChangePresaleSalePresalePrice(uint SaleIndex, uint Price) external onlyAdmin 
    {   
        require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active");
        PresaleSales[SaleIndex]._PricePresale = Price; 
    }

    /**
     * @dev Changes Presale Sale Public Price
     * @param SaleIndex The Sale Index To Edit
     * @param Price The Sale Public Price Input In WEI
     */
    function __ChangePresaleSalePublicPrice(uint SaleIndex, uint Price) external onlyAdmin 
    {   
        require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active");
        PresaleSales[SaleIndex]._PricePublic = Price; 
    }

    /**
     * @dev Changes Timestamp End Full Set
     * @param SaleIndex The Sale Index To Edit
     * @param Timestamp The Unix Timestamp Of The End Of Full Set Window (1st Priority)
     */
    function __ChangePresaleSaleEndFullSet(uint SaleIndex, uint Timestamp) external onlyAdmin 
    {   
        require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active");
        PresaleSales[SaleIndex]._TimestampEndFullSet = Timestamp; 
    }

    /**
     * @dev Changes Timestamp End Citizen
     * @param SaleIndex The Sale Index To Edit
     * @param Timestamp The Unix Timestamp Of The End Of Citizen Window (2nd Priority)
     */
    function __ChangePresaleSaleEndCitizen(uint SaleIndex, uint Timestamp) external onlyAdmin
    {
        require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active");
        PresaleSales[SaleIndex]._TimestampEndCitizen = Timestamp; 
    }

    /**
     * @dev Changes Timestamp Sale Start
     * @param SaleIndex The Sale Index To Edit
     * @param Timestamp The Unix Timestamp For Sale Start
     */
    function __ChangePresaleSaleStart(uint SaleIndex, uint Timestamp) external onlyAdmin
    {
        require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active");
        PresaleSales[SaleIndex]._TimestampSaleStart = Timestamp; 
    }

    /**
     * @dev Changes Presale Sale Full Set Root
     * @param SaleIndex The Sale Index To Edit
     * @param RootFullSet The Full Set Priority Root
     */
    function __ChangePresaleSaleRootFullSet(uint SaleIndex, bytes32 RootFullSet) external onlyAdmin 
    { 
        InternalRoots[SaleIndex]._RootEligibilityFullSet = RootFullSet; 
    }

    /**
     * @dev Changes Presale Sale Citizen Root
     * @param SaleIndex The Sale Index To Edit
     * @param RootCitizen The Citizen Priority Root
     */
    function __ChangePresaleSaleRootCitizen(uint SaleIndex, bytes32 RootCitizen) external onlyAdmin
    {
        InternalRoots[SaleIndex]._RootAmountCitizen = RootCitizen; 
    }

    /**
     * @dev Initializes A Sale Via A Struct
     * @param _Sale The Sale Struct
     * @param Discounts The Array Of Discount Amounts ([80,90] = [20%,10%]) Discounts
     */
    function __StartFixedPriceSale (
        SaleTypeFixedPrice memory _Sale, 
        uint[] calldata Discounts
    ) external onlyAdmin returns (uint SaleIndex) { return __FixedPriceSaleInit(_Sale, Discounts); }

    /**
     * @dev Starts Multiple Fixed Price Sales
     * @param _Sales The Sale Struct
     * @param Discounts The Array Of Discount Amounts ([80,90] = [20%,10%]) Discounts
     */
    function __StartFixedPriceSales (
        SaleTypeFixedPrice[] memory _Sales,
        uint[][] calldata Discounts
    ) external onlyAdmin returns (uint[] memory SaleIndexes) {
        SaleIndexes = new uint[](_Sales.length);
        for(uint x; x < _Sales.length; x++) { SaleIndexes[x] = __FixedPriceSaleInit(_Sales[x], Discounts[x]); }
        return SaleIndexes;
    }

    /**
     * @dev Changes The Price Of A Fixed Price Sale
     * @param SaleIndex The Sale Index To Edit
     * @param Price The Sale Price (IN WEI)
     */
    function __ChangeFixedPrice(uint SaleIndex, uint Price) external onlyAdmin { FixedPriceSales[SaleIndex]._Price = Price; }

    /**
     * @dev Changes The MintPass ProjectID
     * @param SaleIndex The Sale Index To Edit
     * @param MintPassProjectID The Mint Pass ProjectID
     */
    function __ChangeFixedPriceMintPassProjectID(uint SaleIndex, uint MintPassProjectID) external onlyAdmin 
    { 
        FixedPriceSales[SaleIndex]._MintPassProjectID = MintPassProjectID; 
    }

    /**
     * @dev Changes The Type Of A Sale
     * @param SaleIndex The Sale Index To Edit
     * @param Type The Sale Type (0 = _MintToFactory() | 1 = purchaseTo() | 2 = transferFrom())
     */
    function __ChangeFixedPriceType(uint SaleIndex, uint Type) external onlyAdmin { FixedPriceSales[SaleIndex]._Type = Type; }

    /**
     * @dev Changes The ArtBlocks ProjectID
     * @param SaleIndex The Sale Index To Edit
     * @param ABProjectID ArtBlocks ProjectID
     */
    function __ChangeFixedPriceABProjectID(uint SaleIndex, uint ABProjectID) external onlyAdmin { FixedPriceSales[SaleIndex]._MinterProjectID = ABProjectID; }

    /**
     * @dev Changes The Amount Of NFTs For Sale
     * @param SaleIndex The Sale Index To Edit
     * @param AmountForSale The Total Amount For Sale
     */
    function __ChangeFixedPriceAmountForSale(uint SaleIndex, uint AmountForSale) external onlyAdmin { FixedPriceSales[SaleIndex]._AmountForSale = AmountForSale; }

    /**
     * @dev Changes A Fixed Price Sale's Unix Start Time
     * @param SaleIndex The Sale Index To Edit
     * @param UnixTimestamp The Unix Timestamp To Store
     */
    function __ChangeFixedPriceStartTimestamp(uint SaleIndex, uint UnixTimestamp) external onlyAdmin { FixedPriceSales[SaleIndex]._TimestampStart = UnixTimestamp; }
   
   /**
     * @dev Changes A Fixed Price Sale's Unix Start Time
     * @param SaleIndex The Sale Index To Edit
     * @param CurrentIndex The Current TokenID To Disperse
     */
    function __ChangeFixedPriceCurrentIndex(uint SaleIndex, uint CurrentIndex) external onlyAdmin { FixedPriceSales[SaleIndex]._CurrentIndex = CurrentIndex; }

    /**
     * @dev Changes The NFT Address Of A Fixed Price Sale
     * @param SaleIndex The Sale Index To Edit
     * @param NewAddress The NFT Contract Address To Store
     */
    function __ChangeFixedPriceNFTAddress(uint SaleIndex, address NewAddress) external onlyAdmin { FixedPriceSales[SaleIndex]._NFT = NewAddress; }

    /**
     * @dev Changes The NFT Address Of A Fixed Price Sale
     * @param SaleIndex The Sale Index To Edit
     * @param Operator The Operator Holding The NFTs To Disperse
     */
    function __ChangeFixedPriceOperator(uint SaleIndex, address Operator) external onlyAdmin { FixedPriceSales[SaleIndex]._Operator = Operator; }

    /**
     * @dev Changes The Fixed Price Merkle Root For Merkle Eligibility
     * @param SaleIndex The Sale Index To Edit
     * @param NewRoots The Merkle Roots To Store
     */
    function __ChangeFixedPriceRootEligibility(uint SaleIndex, bytes32[] calldata NewRoots) external onlyAdmin { FixedPriceSales[SaleIndex]._RootEligibilities = NewRoots; }

    /**
     * @dev Changes The Fixed Price Merkle Root For Merkle Eligibility
     * @param SaleIndex The Sale Index To Edit
     * @param NewRoots The Merkle Root To Store
     */
    function __ChangeFixedPriceRootAmounts(uint SaleIndex, bytes32[] calldata NewRoots) external onlyAdmin { FixedPriceSales[SaleIndex]._RootAmounts = NewRoots; }

    /**
     * @dev Changes The Fixed Price Sale Roots
     * @param SaleIndex The Sale Index To Edit
     * @param RootEligibilities The Merkle Root For Merkle Eligibility
     * @param RootAmounts The Merkle Root For Amounts
     */
    function __ChangeFixedPriceSaleRoots(uint SaleIndex, bytes32[] calldata RootEligibilities, bytes32[] calldata RootAmounts) external onlyAdmin
    {
        FixedPriceSales[SaleIndex]._RootEligibilities = RootEligibilities;
        FixedPriceSales[SaleIndex]._RootAmounts = RootAmounts;
    }

    /**
     * @dev Changes Fixed Price Sale Discount Amounts (IN BIPS)
     * @param SaleIndex The Sale Index To Edit
     * @param Discounts The Array Of Discount Amounts ([80,90] = 20%, 10% Discount) To Seed
     */
    function __ChangeFixedPriceDiscountAmounts(uint SaleIndex, uint[] calldata Discounts) external onlyAdmin
    {
        for(uint x; x < Discounts.length; x++) { require(Discounts[x] <= 100, "Marketplace: Invalid Discount Amounts");}
        DiscountAmounts[SaleIndex] = Discounts;
    }

    /**
     * @dev Changes The Fixed Price LiveMint ProjectIDs
     * @param SaleIndex The Sale Index To Edit
     * @param LiveMintProjectIDs The LiveMint ProjectIDs To Seed
     */
    function __ChangeFixedPriceLiveMintProjecIDs(uint SaleIndex, uint[] calldata LiveMintProjectIDs) external onlyAdmin
    {
        FixedPriceSales[SaleIndex]._LiveMintProjectIDs = LiveMintProjectIDs;
    }

    /**
     * @dev Changes The Fixed Price Sale Mint Pack Amount
     * @param SaleIndex The Sale Index To Edit
     * @param MintPackAmount The Mint Pack Amount To Seed
     */
    function __ChangeFixedPriceMintPackAmount(uint SaleIndex, uint MintPackAmount) external onlyAdmin
    {
        FixedPriceSales[SaleIndex]._BatchPurchaseAmount = MintPackAmount;
    }

    /**
     * @dev Sweeps Proceeds From A Sale Index To Multisig
     * @param SaleIndex The Sale Index To Withdraw From
     */
    function __WithdrawETHFromSaleIndex(uint SaleIndex) external onlyAdmin
    {
        require(ETHRevenueFixedPriceSale[SaleIndex] - ETHRevenueWithdrawn[SaleIndex] > 0, "Marketplace: No ETH To Withdraw");
        uint WithdrawAmount = ETHRevenueFixedPriceSale[SaleIndex] - ETHRevenueWithdrawn[SaleIndex];
        ETHRevenueWithdrawn[SaleIndex] += WithdrawAmount;
        (bool success,) = _BRT_MULTISIG.call { value: WithdrawAmount }(""); 
        require(success, "Marketplace: ETH Withdraw Failed"); 
    }

    /*--------------*/
    /*  ONLY OWNER  */
    /*--------------*/

    /**
     * @dev onlyOwner: Grants Admin Role
     * @param Wallet The Admin To Add
     */
    function ____AddressAuthorize(address Wallet) external onlyOwner { Admin[Wallet] = true; }

    /**
     * @dev onlyOwner: Removes Admin Role
     * @param Wallet The Admin To Remove
     */
    function ____DeuthorizeAddress(address Wallet) external onlyOwner { Admin[Wallet] = false; }

    /**
     * @dev onlyOwner: Withdraws Ether From Contract To Address With A Specified Amount
     * @param Recipient The Recipient Of The Ether
     * @param Amount The Amount Of Ether To Withdraw
     */
    function ____WithdrawEtherToAddress(address payable Recipient, uint Amount) external onlyOwner
    {
        require(Amount > 0 && Amount <= address(this).balance, "Invalid Amount");
        (bool Success, ) = Recipient.call{value: Amount}("");
        require(Success, "Unable to Withdraw, Recipient May Have Reverted");
    }

    /**
     * @dev Withdraws ETH In Contract To Multisig
     */
    function __WithdrawAllETHToMultisig() external onlyOwner 
    {
        (bool success,) = _BRT_MULTISIG.call { value: address(this).balance }(""); 
        require(success, "Marketplace: ETH Withdraw Failed"); 
    }

    /*-----------------
     * VIEW FUNCTIONS *
    ------------------*/

    /**
     * @dev Returns The Fixed Price Merkle Roots
     */
    function ViewFixedPriceRoots(uint SaleIndex) external view returns (bytes32[] memory, bytes32[] memory)
    {
        return (FixedPriceSales[SaleIndex]._RootEligibilities, FixedPriceSales[SaleIndex]._RootAmounts);
    }

    /**
     * @dev Verifies BrightList For Presale
     */
    function VerifyBrightList(address _Wallet, bytes32 _RootEligibilities, bytes32[] calldata _Proof) public pure returns(bool)
    {
        bytes32 _Leaf = keccak256(abi.encodePacked(_Wallet));
        return MerkleProof.verify(_Proof, _RootEligibilities, _Leaf);
    }

    /**
     * @dev Verifies BrightList For Presale Fixed Price Sale
     */
    function VerifyBrightListWithPriority (
        uint SaleIndex, 
        address _Wallet, 
        bytes32[] calldata _ProofEligibility
    ) public view returns (bool, uint) {
        bytes32 _Leaf = keccak256(abi.encodePacked(_Wallet));
        for(uint x; x < DiscountAmounts[SaleIndex].length; x++) 
        { 
            if(MerkleProof.verify(_ProofEligibility, FixedPriceSales[SaleIndex]._RootEligibilities[x], _Leaf)) { return (true, x); } 
        }
        return (false, 69420);
    }

    /**
     * @dev Verifies Merkle Amount Is Passed Correctly
     */
    function VerifyBrightListAmount (
        address _Wallet,
        uint _Amount,
        bytes32 _RootAmounts,
        bytes32[] calldata _ProofAmount
    ) public pure returns (bool) {
        bytes32 _Leaf = (keccak256(abi.encodePacked(_Wallet, _Amount)));
        return MerkleProof.verify(_ProofAmount, _RootAmounts, _Leaf);
    }

    /**
     * @dev Verifies Maximum Purchase Amount Being Passed Is Valid
     */
    function VerifyAmount(address _Wallet, uint _Amount, bytes32 _RootEligibilities, bytes32[] calldata _Proof) public pure returns(bool)
    {
        bytes32 _Leaf = (keccak256(abi.encodePacked(_Wallet, _Amount)));
        return MerkleProof.verify(_Proof, _RootEligibilities, _Leaf);
    }

    /**
     * @dev Returns Information Of A Fixed Price Sale
     */
    function ViewSaleInfoFixedPrice (
        uint SaleIndex,
        address Wallet,
        uint MaxAmount,
        bytes32[] calldata ProofEligibility,
        bytes32[] calldata ProofAmount
    ) public view returns (FixedPriceSaleInfo memory) {
        return __ViewSaleInfoFixedPrice(
            SaleIndex,
            Wallet,
            MaxAmount,
            ProofEligibility,
            ProofAmount
        );
    }

    /**
     * @dev Returns Information Of Multiple Fixed Price Sales
     */
    function ViewSaleInfosFixedPrice(
        uint[] calldata SaleIndexes,
        address[] calldata Wallets,
        uint[] calldata MaxAmounts,
        bytes32[][] calldata ProofEligibilities,
        bytes32[][] calldata ProofAmounts
    ) public view returns (FixedPriceSaleInfo[] memory _Sales)
    {
        _Sales = new FixedPriceSaleInfo[](SaleIndexes.length);
        for(uint x; x < SaleIndexes.length; x++)
        {
            _Sales[x] = __ViewSaleInfoFixedPrice(
                SaleIndexes[x],
                Wallets[x],
                MaxAmounts[x],
                ProofEligibilities[x],
                ProofAmounts[x]
            );
        }
        return _Sales;
    }
    
    /**
     * @dev Returns A Wallet's Sale Information For A Presale Sale
     */
    function ViewSaleInfoPresale (
        uint SaleIndex,
        address Wallet,
        uint MaxAmountFullSet,
        uint MaxAmountCitizen,
        bytes32[] calldata FullsetProof, 
        bytes32[] calldata CitizenProof,
        bytes32[] calldata ProofAmountFullSet,
        bytes32[] calldata ProofAmountCitizen
    ) public view returns (SaleInfoPresale memory) {
        uint AmountPurchaseableFullset;
        uint AmountPurchaseableCitizen;
        SaleTypePresale memory _Sale = PresaleSales[SaleIndex];
        InternalPresaleSale memory _SaleInternal = PresaleSalesInternal[SaleIndex];
        InternalPresaleWalletInfo memory _WalletInfo = InternalSaleWalletInfo[SaleIndex][Wallet];
        uint AmountRemaining = _Sale._MaxForSale - _SaleInternal._AmountSold;
        uint ETHRevenue = _SaleInternal._ETHRevenue;
        if(_WalletInfo._AmountPurchasedFullSetWindow >= MaxAmountFullSet) { AmountPurchaseableFullset = 0; }
        else { AmountPurchaseableFullset = MaxAmountFullSet - _WalletInfo._AmountPurchasedFullSetWindow; }
        if(_WalletInfo._AmountPurchasedCitizenWindow >= MaxAmountCitizen) { AmountPurchaseableCitizen = 0; }
        else { AmountPurchaseableCitizen = MaxAmountCitizen - _WalletInfo._AmountPurchasedCitizenWindow; }
        return SaleInfoPresale (
            ETHRevenue, // ETHRevenue
            _Sale._PricePresale, // _PricePresale
            _Sale._PricePublic, // _PricePublic
            _Sale._MaxForSale, // _MintPassesAvailable
            AmountRemaining, // _AmountRemaining
            _Sale._TimestampEndFullSet, // _TimestampEndFullSet
            _Sale._TimestampEndCitizen, // _TimestampEndCitizen
            _Sale._TimestampSaleStart, // _TimestampSaleStart
            AmountPurchaseableFullset, // _AmountPurchasableFullSet
            AmountPurchaseableCitizen, // _AmountPurchasableCitizen
            _WalletInfo._AmountPurchasedFullSetWindow, // _AmountPurchasedFullSetWindow
            _WalletInfo._AmountPurchasedCitizenWindow, // _AmountPurchasedCitizenWindow
            _SaleInternal._GlobalPurchasesFullSet, // _GlobalPurchasesFullSet
            _SaleInternal._GlobalPurchasesCitizen, // _GlobalPurchasesCitizen
            _SaleInternal._GlobalPurchasesPublic, // _GlobalPurchasesPublic
            _WalletInfo._AmountPurchasedWallet, // _AmountPurchasedWallet
            VerifyBrightList(Wallet, InternalRoots[SaleIndex]._RootEligibilityFullSet, FullsetProof), // _EligibleFullSet
            VerifyBrightList(Wallet, InternalRoots[SaleIndex]._RootEligibilityCitizen, CitizenProof), // _EligibleCitizen
            VerifyAmount(Wallet, MaxAmountFullSet, InternalRoots[SaleIndex]._RootAmountFullSet, ProofAmountFullSet), // _ValidMaxAmountFullSet
            VerifyAmount(Wallet, MaxAmountCitizen, InternalRoots[SaleIndex]._RootAmountCitizen, ProofAmountCitizen) // _ValidMaxAmountCitizen
        );
    }
  
    /*-----------
     * INTERNAL *
    ------------*/  

    /**
     * @dev Refunds `Recipient` ETH Amount `Value`
     */
    function __Refund(address Recipient, uint Value) internal
    {
        (bool Confirmed,) = Recipient.call{value: Value}(""); 
        require(Confirmed, "Marketplace: Refund failed");
        emit Refunded(Recipient, Value);
    }

    /**
     * @dev Initializes A Sale Via A Struct
     */
    function __FixedPriceSaleInit(SaleTypeFixedPrice memory _Sale, uint[] calldata Discounts) internal returns (uint SaleIndex) { 
        require(
            _Sale._RootEligibilities.length == _Sale._RootAmounts.length
            &&
            _Sale._RootAmounts.length == Discounts.length,
            "Marketplace: All Array Lengths Must Match"
        );
        for(uint x; x < Discounts.length; x++) { require(Discounts[x] <= 100 && Discounts[x] > 0, "Marketplace: Discount Amounts Must Be <= 100 & > 0"); }
        SaleIndex = _TOTAL_UNIQUE_FIXED_SALES;
        FixedPriceSales[SaleIndex] = _Sale; 
        DiscountAmounts[SaleIndex] = Discounts;
        _TOTAL_UNIQUE_FIXED_SALES += 1;
        return SaleIndex;
    }

    /**
     * @dev Finalizes A Fixed Price Sale
     */
    function __FinalizeFixedPriceSale(
        uint SaleIndex,
        uint DesiredAmount,
        uint MaxAmount,
        address Vault,
        bytes32[] calldata ProofEligibility,
        bytes32[] calldata ProofAmount,
        uint MessageValue,
        address Purchaser
    ) internal {
        require(tx.origin == Purchaser, "Marketplace: EOA Only");
        address MerkleRecipient = Purchaser;
        if(Vault != address(0)) { if(DelegateCash.checkDelegateForAll(Purchaser, Vault)) { MerkleRecipient = Vault; } }
        require(block.timestamp >= FixedPriceSales[SaleIndex]._TimestampStart, "Marketplace: Sale Not Started");
        (bool BrightList, uint Priority) = VerifyBrightListWithPriority(SaleIndex, MerkleRecipient, ProofEligibility);
        if(BrightList)  
        {
            require(
                VerifyBrightListAmount( 
                    MerkleRecipient, 
                    MaxAmount, 
                    FixedPriceSales[SaleIndex]._RootAmounts[Priority], 
                    ProofAmount
                ), 
                "DutchMarketplace: Invalid Max Amount Merkle Proof For Provided Merkle Priority"
            );
            require(
                MessageValue
                == 
                (((FixedPriceSales[SaleIndex]._Price * DesiredAmount) * DiscountAmounts[SaleIndex][Priority]) / 100), 
                "Marketplace: Incorrect BrightList ETH Sent"
            );
            require(
                DesiredAmount + PriorityPurchaseAmount[SaleIndex][MerkleRecipient][Priority] 
                <= 
                MaxAmount, 
                "Marketplace: Desired Purchase Amount Exceeds Purchase Allocation"
            );
            PriorityPurchaseAmount[SaleIndex][MerkleRecipient][Priority] += DesiredAmount;
        }
        else { require(MessageValue == FixedPriceSales[SaleIndex]._Price * DesiredAmount, "Marketplace: Incorrect ETH Amount Sent"); }
        require(AmountSoldFixedPrice[SaleIndex] + DesiredAmount <= FixedPriceSales[SaleIndex]._AmountForSale, "Marketplace: Not Enough NFTs Left For Sale");
        AmountSoldFixedPrice[SaleIndex] = AmountSoldFixedPrice[SaleIndex] + DesiredAmount;
        if(FixedPriceSales[SaleIndex]._Type == 0) // Factory MintPass Direct Mint
        { 
            IMinter(FixedPriceSales[SaleIndex]._NFT)._MintToFactory(
                Purchaser, 
                DesiredAmount
            ); 
        }
        else if (FixedPriceSales[SaleIndex]._Type == 1) // Factory MintPass MintPack Direct Mint
        {
            for(uint x; x < DesiredAmount; x++)
            {
                IMinter(FixedPriceSales[SaleIndex]._NFT)._MintToFactory(
                    Purchaser, 
                    FixedPriceSales[SaleIndex]._BatchPurchaseAmount
                ); 
            }
        }
        else if (FixedPriceSales[SaleIndex]._Type == 2) // LiveMint Direct Mint
        {
            ILiveMint(FixedPriceSales[SaleIndex]._NFT)._LiveMintMarketplace(
                Purchaser, 
                FixedPriceSales[SaleIndex]._MinterProjectID, 
                DesiredAmount
            );
        }
        else if (FixedPriceSales[SaleIndex]._Type == 3) // LiveMint Direct Mint Pack
        {
            for(uint x; x < FixedPriceSales[SaleIndex]._LiveMintProjectIDs.length; x++)
            {
                ILiveMint(FixedPriceSales[SaleIndex]._NFT)._LiveMintMarketplace(
                    Purchaser, 
                    FixedPriceSales[SaleIndex]._LiveMintProjectIDs[x], 
                    DesiredAmount
                );
            }
        }
        else if(FixedPriceSales[SaleIndex]._Type == 4) // ArtBlocks purchaseTo() Mint
        { 
            uint ProjectID = FixedPriceSales[SaleIndex]._MinterProjectID;
            for(uint x; x < DesiredAmount; x++) { IMinter(FixedPriceSales[SaleIndex]._NFT).purchaseTo(Purchaser, ProjectID); }
        } 
        else if (FixedPriceSales[SaleIndex]._Type == 5) // ERC721 transferFrom() Sale
        {
            IERC721 _NFT = IERC721(FixedPriceSales[SaleIndex]._NFT);
            address _Operator = FixedPriceSales[SaleIndex]._Operator;
            uint _StartingIndex = FixedPriceSales[SaleIndex]._CurrentIndex;
            for(uint Index; Index < DesiredAmount; Index++) { _NFT.transferFrom(_Operator, Purchaser, _StartingIndex + Index); }
            FixedPriceSales[SaleIndex]._CurrentIndex += DesiredAmount;
        }
        else if (FixedPriceSales[SaleIndex]._Type == 6)
        {
            IMinter _NFT = IMinter(FixedPriceSales[SaleIndex]._NFT);
            uint _BatchPurchaseAmount = FixedPriceSales[SaleIndex]._BatchPurchaseAmount;
            uint _ETHValue = FixedPriceSales[SaleIndex]._Price / _BatchPurchaseAmount;
            uint _MinterProjectID = FixedPriceSales[SaleIndex]._MinterProjectID;
            for(uint x; x < DesiredAmount; x++) // Iterates Over The Desired Units Of Purchase
            {
                for(uint y; y < _BatchPurchaseAmount; y++) // Mints Configured Amount Of NFTs Per Unit Purchased
                { 
                    _NFT.purchaseTo{value: _ETHValue}(Purchaser, _MinterProjectID); 
                }
            }
        }
        else { revert('Marketplace: Incorrect Sale Configuration'); }
        UserPurchasedAmount[SaleIndex][Purchaser] += DesiredAmount;
        ETHRevenueFixedPriceSale[SaleIndex] += MessageValue;
        emit Purchased(SaleIndex, Purchaser, DesiredAmount, Priority);
    }

    /**
     * @dev Finalizes A Presale Purchase
     * @param SaleIndex The Sale Index To Purchase
     * @param DesiredAmount The Desired Amount To Purchase
     * @param MaxAmount The Maximum Amount For Merkle Priority Purchase
     * @param Vault Delegate Vault Address
     * @param Proof Merkle Proof For Eligibility
     * @param ProofAmount Merkle Proof For MaxAmount
     */
    function __FinalizePresale(
        uint SaleIndex,
        uint DesiredAmount,
        uint MaxAmount,
        address Vault,
        bytes32[] calldata Proof,
        bytes32[] calldata ProofAmount,
        uint MessageValue,
        address Purchaser
    ) internal {
        require(tx.origin == Purchaser, "Marketplace: EOA Only");
        require(block.timestamp >= PresaleSales[SaleIndex]._TimestampSaleStart, "Marketplace: Sale Not Started");
        address MerkleRecipient = Purchaser;
        if(Vault != address(0)) { if(DelegateCash.checkDelegateForAll(Purchaser, Vault)) { MerkleRecipient = Vault; } }
        InternalPresaleSale memory _InternalPresaleSale = PresaleSalesInternal[SaleIndex];
        SaleTypePresale memory _PresaleSale = PresaleSales[SaleIndex];
        bool PresaleEnded;
        uint _Price;
        uint _MaxPerPurchase = _PresaleSale._MaxPerPurchase;
        if(_InternalPresaleSale._AmountSold + DesiredAmount > _PresaleSale._MaxForSale) 
        { 
            DesiredAmount = _PresaleSale._MaxForSale - _InternalPresaleSale._AmountSold; // Partial Fill
        } 
        if(block.timestamp <= _PresaleSale._TimestampEndCitizen) // Presale
        {
            if(block.timestamp <= _PresaleSale._TimestampEndFullSet) // Full Set Window
            { 
                require ( // Eligible For Full Set Window
                    VerifyBrightList(MerkleRecipient, InternalRoots[SaleIndex]._RootEligibilityFullSet, Proof), 
                    "Full Set Window: Not Eligible For Presale Window Or Block Pending, Please Try Again In A Few Seconds..."
                ); 
                require(VerifyAmount(MerkleRecipient, MaxAmount, InternalRoots[SaleIndex]._RootAmountFullSet, ProofAmount), "Invalid Full Set Amount Proof");
                require(InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedWallet + DesiredAmount <= MaxAmount, "All Full Set Allocation Used");
                InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedFullSetWindow += DesiredAmount;
                PresaleSalesInternal[SaleIndex]._GlobalPurchasesFullSet += DesiredAmount;
                emit Fullset();
            }
            else // Citizen Window
            { 
                require ( // Eligible For Citizen Window
                    VerifyBrightList(MerkleRecipient, InternalRoots[SaleIndex]._RootEligibilityCitizen, Proof), 
                    "Citizen Window: Not Eligible For Presale Window Or Block Pending, Please Try Again In A Few Seconds..."
                ); 
                require(VerifyAmount(MerkleRecipient, MaxAmount, InternalRoots[SaleIndex]._RootAmountCitizen, ProofAmount), "Invalid Citizen Amount Proof");
                require(InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedCitizenWindow + DesiredAmount <= MaxAmount, "All Citizen Allocation Used");
                InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedWallet += DesiredAmount;
                PresaleSalesInternal[SaleIndex]._GlobalPurchasesCitizen += DesiredAmount;
                emit Citizen();
            }
            _Price = _PresaleSale._PricePresale * DesiredAmount;
        }
        else // Public Sale
        { 
            _Price = _PresaleSale._PricePublic * DesiredAmount;
            PresaleSalesInternal[SaleIndex]._GlobalPurchasesPublic += DesiredAmount;
            PresaleEnded = true; 
            emit Public();
        }
        require(DesiredAmount <= _MaxPerPurchase, "Invalid Desired Purchase Amount. Must Be <= Max Purchase Limit"); // Purchase Limiter
        require(_InternalPresaleSale._AmountSold + DesiredAmount <= _PresaleSale._MaxForSale, "Sale Ended"); // Sale End State
        require(DesiredAmount > 0 && _Price > 0, "Sale Ended"); // Sale End State
        require(MessageValue >= _Price, "Invalid ETH Amount"); // Ensures ETH Amount Sent Is Correct
        if(MessageValue > _Price) { __Refund(Purchaser, MessageValue - _Price); } // Refunds The Difference
        if(_PresaleSale._Type == 0) { IMinter(_PresaleSale._NFT)._MintToFactory(0, Purchaser, DesiredAmount); }
        else if (_PresaleSale._Type == 1) 
        { 
            for(uint x; x < DesiredAmount; x++) { IMinter(_PresaleSale._NFT).purchaseTo(Purchaser, _PresaleSale._ProjectID); }
        }
        PresaleSalesInternal[SaleIndex]._AmountSold += DesiredAmount;
        PresaleSalesInternal[SaleIndex]._CurrentTokenIndex += DesiredAmount;
        PresaleSalesInternal[SaleIndex]._ETHRevenue += _Price;
        InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedWallet += DesiredAmount;
        emit PurchasedPresale(SaleIndex, Purchaser, DesiredAmount, MessageValue, PresaleEnded);
    }

    /**
     * @dev Returns The Sale Info For A Fixed Price Sale
     */
    function __ViewSaleInfoFixedPrice (
        uint SaleIndex,
        address Wallet,
        uint MaxAmount,
        bytes32[] calldata ProofEligibility,
        bytes32[] calldata ProofAmount
    ) internal view returns (FixedPriceSaleInfo memory) {
        uint Price = FixedPriceSales[SaleIndex]._Price;
        uint AmountForSale = FixedPriceSales[SaleIndex]._AmountForSale;
        uint AmountRemaining = AmountForSale - AmountSoldFixedPrice[SaleIndex];
        uint ETHRevenue = ETHRevenueFixedPriceSale[SaleIndex];
        uint AmountPurchasedUser = UserPurchasedAmount[SaleIndex][Wallet];
        uint AmountRemainingMerklePriority;
        uint PurchasedAmountMerklePriority;
        bool BrightListMerkleAmount;
        uint[] memory DiscountAmountWEIValues = new uint[](FixedPriceSales[SaleIndex]._RootEligibilities.length);
        for(uint x; x < FixedPriceSales[SaleIndex]._RootEligibilities.length; x++)
        {
            DiscountAmountWEIValues[x] = (Price * DiscountAmounts[SaleIndex][x]) / 100;
        }
        (bool BrightListEligible, uint Priority) = VerifyBrightListWithPriority(
            SaleIndex, 
            Wallet, 
            ProofEligibility
        );
        if(BrightListEligible)
        {
            BrightListMerkleAmount = VerifyBrightListAmount(Wallet, MaxAmount, FixedPriceSales[SaleIndex]._RootAmounts[Priority], ProofAmount);
            PurchasedAmountMerklePriority = PriorityPurchaseAmount[SaleIndex][Wallet][Priority];
            if(MaxAmount > PurchasedAmountMerklePriority)
            {
                AmountRemainingMerklePriority = MaxAmount - PurchasedAmountMerklePriority;
            }
        }
        return FixedPriceSaleInfo(
            FixedPriceSales[SaleIndex]._Name,
            Price, 
            FixedPriceSales[SaleIndex]._MintPassProjectID,
            FixedPriceSales[SaleIndex]._Type,
            FixedPriceSales[SaleIndex]._MinterProjectID,
            AmountForSale, 
            FixedPriceSales[SaleIndex]._TimestampStart,
            FixedPriceSales[SaleIndex]._CurrentIndex,
            FixedPriceSales[SaleIndex]._BatchPurchaseAmount,
            FixedPriceSales[SaleIndex]._NFT,
            FixedPriceSales[SaleIndex]._Operator,
            FixedPriceSales[SaleIndex]._RootEligibilities,
            FixedPriceSales[SaleIndex]._RootAmounts,
            FixedPriceSales[SaleIndex]._LiveMintProjectIDs,
            DiscountAmountWEIValues,
            ETHRevenue, 
            AmountRemaining, 
            Priority, 
            AmountRemainingMerklePriority,
            AmountPurchasedUser,
            BrightListEligible, 
            BrightListMerkleAmount
        );
    }

    /*-----------
     * MODIFIER *
    ------------*/

    /**
     * @dev onlyAdmin Modifier
     */
    modifier onlyAdmin
    {
        require(Admin[msg.sender], "Marketplace | onlyAdmin | Caller Is Not Admin");
        _;
    }
}

interface IERC20 { function approve(address From, address To, uint Amount) external; }
interface IERC721 { function transferFrom(address From, address To, uint TokenID) external; }
interface ILiveMint { function _LiveMintMarketplace(address Recipient, uint ArtistID, uint Amount) external; }

File 2 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 7 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

File 4 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 5 of 7 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            require(proofPos == proofLen, "MerkleProof: invalid multiproof");
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            require(proofPos == proofLen, "MerkleProof: invalid multiproof");
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 6 of 7 : DelegateCashEnabled.sol
//SPDX-License-Identifier: MIT
/**
 * @title DelegateCashEnabled
 * @author @brougkr
 * @notice For Easily Integrating `delegate.cash`
 */
pragma solidity ^0.8.19;
abstract contract DelegateCashEnabled
{
    address private constant _DN = 0x00000000000076A84feF008CDAbe6409d2FE638B;
    IDelegation public constant DelegateCash = IDelegation(_DN);
}

interface IDelegation
{
    /**
     * @dev Returns If A Vault Has Delegated To The Delegate
     */
    function checkDelegateForAll(address delegate, address vault) external view returns (bool);
}

File 7 of 7 : IMinter.sol
// SPDX-License-Identifier: MIT
/**
 * @title IMinter Minter Interface
 * @author @brougkr
 */
pragma solidity ^0.8.19;
interface IMinter 
{ 
    function purchase(uint256 _projectId) payable external returns (uint tokenID); // Custom
    function purchaseTo(address _to, uint _projectId) payable external returns (uint tokenID); // ArtBlocks Standard Minter
    // function purchaseTo(address _to) external returns (uint tokenID); // Custom
    // function purchaseTo(address _to, uint _projectId, address _ownedNFTAddress, uint _ownedNFTTokenID) payable external returns (uint tokenID); // ArtBlocks PolyMinter
    function tokenURI(uint256 _tokenId) external view returns (string memory);
    function _MintToFactory(uint ProjectID, address To, uint Amount) external; // MintPassFactory
    function _MintToFactory(address To, uint Amount) external; // MintPassBespoke
}

Settings
{
  "viaIR": true,
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Citizen","type":"event"},{"anonymous":false,"inputs":[],"name":"Fullset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Public","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"Purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"Priority","type":"uint256"}],"name":"Purchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"Purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"DesiredAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"MessageValue","type":"uint256"},{"indexed":false,"internalType":"bool","name":"PresaleEnded","type":"bool"}],"name":"PurchasedPresale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Refundee","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"SaleStarted","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Admin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"AmountSoldFixedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DelegateCash","outputs":[{"internalType":"contract IDelegation","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"DiscountAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ETHRevenueFixedPriceSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ETHRevenueWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"FixedPriceSales","outputs":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"InternalRoots","outputs":[{"internalType":"bytes32","name":"_RootEligibilityFullSet","type":"bytes32"},{"internalType":"bytes32","name":"_RootEligibilityCitizen","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmountFullSet","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmountCitizen","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"InternalSaleWalletInfo","outputs":[{"internalType":"uint256","name":"_AmountPurchasedFullSetWindow","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedCitizenWindow","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PresaleSales","outputs":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"uint256","name":"_MaxForSale","type":"uint256"},{"internalType":"uint256","name":"_MaxPerPurchase","type":"uint256"},{"internalType":"uint256","name":"_PricePresale","type":"uint256"},{"internalType":"uint256","name":"_PricePublic","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndFullSet","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndCitizen","type":"uint256"},{"internalType":"uint256","name":"_TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_ProjectID","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PresaleSalesInternal","outputs":[{"internalType":"bool","name":"_Active","type":"bool"},{"internalType":"uint256","name":"_AmountSold","type":"uint256"},{"internalType":"uint256","name":"_ETHRevenue","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesFullSet","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesCitizen","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesPublic","type":"uint256"},{"internalType":"uint256","name":"_CurrentTokenIndex","type":"uint256"},{"internalType":"uint256","name":"_AmountSoldFullSet","type":"uint256"},{"internalType":"uint256","name":"_AmountSoldCitizen","type":"uint256"},{"internalType":"uint256","name":"_AmountSoldPublic","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"PriorityPurchaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"DesiredAmount","type":"uint256"},{"internalType":"uint256","name":"MaxAmount","type":"uint256"},{"internalType":"address","name":"Vault","type":"address"},{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"}],"name":"PurchaseFixedPrice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"DesiredAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"MaxAmounts","type":"uint256[]"},{"internalType":"address[]","name":"Vaults","type":"address[]"},{"internalType":"bytes32[][]","name":"ProofEligibilities","type":"bytes32[][]"},{"internalType":"bytes32[][]","name":"ProofAmounts","type":"bytes32[][]"},{"internalType":"uint256[]","name":"MessageValues","type":"uint256[]"}],"name":"PurchaseFixedPriceMulti","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"DesiredAmount","type":"uint256"},{"internalType":"uint256","name":"MaxAmount","type":"uint256"},{"internalType":"address","name":"Vault","type":"address"},{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"}],"name":"PurchasePresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"UserPurchasedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_Wallet","type":"address"},{"internalType":"uint256","name":"_Amount","type":"uint256"},{"internalType":"bytes32","name":"_RootEligibilities","type":"bytes32"},{"internalType":"bytes32[]","name":"_Proof","type":"bytes32[]"}],"name":"VerifyAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_Wallet","type":"address"},{"internalType":"bytes32","name":"_RootEligibilities","type":"bytes32"},{"internalType":"bytes32[]","name":"_Proof","type":"bytes32[]"}],"name":"VerifyBrightList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_Wallet","type":"address"},{"internalType":"uint256","name":"_Amount","type":"uint256"},{"internalType":"bytes32","name":"_RootAmounts","type":"bytes32"},{"internalType":"bytes32[]","name":"_ProofAmount","type":"bytes32[]"}],"name":"VerifyBrightListAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"_Wallet","type":"address"},{"internalType":"bytes32[]","name":"_ProofEligibility","type":"bytes32[]"}],"name":"VerifyBrightListWithPriority","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"ViewFixedPriceRoots","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"},{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Wallet","type":"address"},{"internalType":"uint256","name":"MaxAmount","type":"uint256"},{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"}],"name":"ViewSaleInfoFixedPrice","outputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"bytes32[]","name":"_RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_RootAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"_LiveMintProjectIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"_DiscountAmountWEIValues","type":"uint256[]"},{"internalType":"uint256","name":"_ETHRevenue","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"uint256","name":"_AmountRemainingMerklePriority","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedUser","type":"uint256"},{"internalType":"bool","name":"_BrightListEligible","type":"bool"},{"internalType":"bool","name":"_BrightListAmounts","type":"bool"}],"internalType":"struct Marketplace.FixedPriceSaleInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Wallet","type":"address"},{"internalType":"uint256","name":"MaxAmountFullSet","type":"uint256"},{"internalType":"uint256","name":"MaxAmountCitizen","type":"uint256"},{"internalType":"bytes32[]","name":"FullsetProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"CitizenProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmountFullSet","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmountCitizen","type":"bytes32[]"}],"name":"ViewSaleInfoPresale","outputs":[{"components":[{"internalType":"uint256","name":"_ETHRevenue","type":"uint256"},{"internalType":"uint256","name":"_PricePresale","type":"uint256"},{"internalType":"uint256","name":"_PricePublic","type":"uint256"},{"internalType":"uint256","name":"_MaxForSale","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndFullSet","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndCitizen","type":"uint256"},{"internalType":"uint256","name":"_TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasableFullSet","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasableCitizen","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedFullSetWindow","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedCitizenWindow","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesFullSet","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesCitizen","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesPublic","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedWallet","type":"uint256"},{"internalType":"bool","name":"_EligibleFullSet","type":"bool"},{"internalType":"bool","name":"_EligibleCitizen","type":"bool"},{"internalType":"bool","name":"_ValidMaxAmountFullSet","type":"bool"},{"internalType":"bool","name":"_ValidMaxAmountCitizen","type":"bool"}],"internalType":"struct Marketplace.SaleInfoPresale","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"},{"internalType":"address[]","name":"Wallets","type":"address[]"},{"internalType":"uint256[]","name":"MaxAmounts","type":"uint256[]"},{"internalType":"bytes32[][]","name":"ProofEligibilities","type":"bytes32[][]"},{"internalType":"bytes32[][]","name":"ProofAmounts","type":"bytes32[][]"}],"name":"ViewSaleInfosFixedPrice","outputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"bytes32[]","name":"_RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_RootAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"_LiveMintProjectIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"_DiscountAmountWEIValues","type":"uint256[]"},{"internalType":"uint256","name":"_ETHRevenue","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"uint256","name":"_AmountRemainingMerklePriority","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedUser","type":"uint256"},{"internalType":"bool","name":"_BrightListEligible","type":"bool"},{"internalType":"bool","name":"_BrightListAmounts","type":"bool"}],"internalType":"struct Marketplace.FixedPriceSaleInfo[]","name":"_Sales","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TOTAL_UNIQUE_FIXED_SALES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TOTAL_UNIQUE_PRESALE_SALES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Price","type":"uint256"}],"name":"__ChangeFixedPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"ABProjectID","type":"uint256"}],"name":"__ChangeFixedPriceABProjectID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"AmountForSale","type":"uint256"}],"name":"__ChangeFixedPriceAmountForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"CurrentIndex","type":"uint256"}],"name":"__ChangeFixedPriceCurrentIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256[]","name":"Discounts","type":"uint256[]"}],"name":"__ChangeFixedPriceDiscountAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256[]","name":"LiveMintProjectIDs","type":"uint256[]"}],"name":"__ChangeFixedPriceLiveMintProjecIDs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"MintPackAmount","type":"uint256"}],"name":"__ChangeFixedPriceMintPackAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"MintPassProjectID","type":"uint256"}],"name":"__ChangeFixedPriceMintPassProjectID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"NewAddress","type":"address"}],"name":"__ChangeFixedPriceNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Operator","type":"address"}],"name":"__ChangeFixedPriceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32[]","name":"NewRoots","type":"bytes32[]"}],"name":"__ChangeFixedPriceRootAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32[]","name":"NewRoots","type":"bytes32[]"}],"name":"__ChangeFixedPriceRootEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32[]","name":"RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"RootAmounts","type":"bytes32[]"}],"name":"__ChangeFixedPriceSaleRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"UnixTimestamp","type":"uint256"}],"name":"__ChangeFixedPriceStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Type","type":"uint256"}],"name":"__ChangeFixedPriceType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"ProjectID","type":"uint256"}],"name":"__ChangePresaleProjectID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootEligibilityFullSet","type":"bytes32"},{"internalType":"bytes32","name":"RootAmountsFullSet","type":"bytes32"},{"internalType":"bytes32","name":"RootEligibilityCitizen","type":"bytes32"},{"internalType":"bytes32","name":"RootAmountsCitizen","type":"bytes32"}],"name":"__ChangePresaleRootsAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootCitizen","type":"bytes32"},{"internalType":"bytes32","name":"RootFullSet","type":"bytes32"}],"name":"__ChangePresaleRootsAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootCitizen","type":"bytes32"},{"internalType":"bytes32","name":"RootFullSet","type":"bytes32"}],"name":"__ChangePresaleRootsEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Timestamp","type":"uint256"}],"name":"__ChangePresaleSaleEndCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Timestamp","type":"uint256"}],"name":"__ChangePresaleSaleEndFullSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"MaxForSale","type":"uint256"}],"name":"__ChangePresaleSaleMaxForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"MaxPerPurchase","type":"uint256"}],"name":"__ChangePresaleSaleMaxPerPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Price","type":"uint256"}],"name":"__ChangePresaleSalePresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Price","type":"uint256"}],"name":"__ChangePresaleSalePublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootCitizen","type":"bytes32"}],"name":"__ChangePresaleSaleRootCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootFullSet","type":"bytes32"}],"name":"__ChangePresaleSaleRootFullSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Timestamp","type":"uint256"}],"name":"__ChangePresaleSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"TimestampFullSetEnd","type":"uint256"},{"internalType":"uint256","name":"TimestampCitizenEnd","type":"uint256"}],"name":"__ChangePresaleTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Type","type":"uint256"}],"name":"__ChangePresaleType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"uint256","name":"_MaxForSale","type":"uint256"},{"internalType":"uint256","name":"_MaxPerPurchase","type":"uint256"},{"internalType":"uint256","name":"_PricePresale","type":"uint256"},{"internalType":"uint256","name":"_PricePublic","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndFullSet","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndCitizen","type":"uint256"},{"internalType":"uint256","name":"_TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_ProjectID","type":"uint256"}],"internalType":"struct Marketplace.SaleTypePresale","name":"_Sale","type":"tuple"}],"name":"__OverwritePresaleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"bytes32[]","name":"_RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_RootAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"_LiveMintProjectIDs","type":"uint256[]"}],"internalType":"struct Marketplace.SaleTypeFixedPrice","name":"_Sale","type":"tuple"},{"internalType":"uint256[]","name":"Discounts","type":"uint256[]"}],"name":"__StartFixedPriceSale","outputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"bytes32[]","name":"_RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_RootAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"_LiveMintProjectIDs","type":"uint256[]"}],"internalType":"struct Marketplace.SaleTypeFixedPrice[]","name":"_Sales","type":"tuple[]"},{"internalType":"uint256[][]","name":"Discounts","type":"uint256[][]"}],"name":"__StartFixedPriceSales","outputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"uint256","name":"_MaxForSale","type":"uint256"},{"internalType":"uint256","name":"_MaxPerPurchase","type":"uint256"},{"internalType":"uint256","name":"_PricePresale","type":"uint256"},{"internalType":"uint256","name":"_PricePublic","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndFullSet","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndCitizen","type":"uint256"},{"internalType":"uint256","name":"_TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_ProjectID","type":"uint256"}],"internalType":"struct Marketplace.SaleTypePresale","name":"_Sale","type":"tuple"},{"components":[{"internalType":"bytes32","name":"_RootEligibilityFullSet","type":"bytes32"},{"internalType":"bytes32","name":"_RootEligibilityCitizen","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmountFullSet","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmountCitizen","type":"bytes32"}],"internalType":"struct Marketplace.InternalPresaleSaleRoots","name":"_Roots","type":"tuple"}],"name":"__StartPresaleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__WithdrawAllETHToMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"__WithdrawETHFromSaleIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Wallet","type":"address"}],"name":"____AddressAuthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Wallet","type":"address"}],"name":"____DeuthorizeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"Recipient","type":"address"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"____WithdrawEtherToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608080604052346100f45760008054336001600160a01b03198083168217845592917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0916001600160a01b03918216838580a3600193848055338452600e6020526040842060ff1990868282541617905573e06f5fae754e81bc050215ff89b03d9e9ff20700958686526040862081838254161790557390d98d5a1fd21b7cea4d5c18341607ed1a8345c086526040862081838254161790557318b7511938fbe2ee08adf3d4a24edb00a5c9b78386526040862091825416179055848454918216178455169180a3615f219081620000fa8239f35b600080fdfe610440604052600436101561001357600080fd5b60006102605260003560e01c80630404157314613a075780630a595192146139bc5780630ade686b146138b25780630c0d44751461382e57806312cb2565146137fe578063145e28701461377157806316ffa2e21461370c578063171459a61461369057806319f656861461362a5780631ae3b93a14613513578063228dd2b5146134b35780632dbef8e91461292a57806333b005d0146128e75780634314d55f146125f657806343fa0329146125915780634710a06c1461254a5780634852590e146123de5780634a850fbd146123975780634ab4e832146123325780634d1280e1146122eb5780634ec7a65b146120cd57806350fe6add1461206857806352d635f614611fdb57806358e2b34c14611fa95780635a23785d14611e865780635b80402814611e655780635fc99e3014611e215780636213195814611dbc5780636569f4c714611d8c578063665ccfaa14611d455780636915fed614611cfe5780636a95cc0814611cd2578063715018a614611c595780637826817d14611bf45780637b0c805614611b675780637bfd7f2214611add578063800c42d114611a595780638da5cb5b14611a305780639366ca6b146119c8578063953ba9ee146119635780639e05fd301461191c578063a038ad6e146118b7578063a297684314611869578063a761f7a1146117a5578063b7e96e6014611760578063ba0eebe41461173f578063bae24f91146116f8578063c4e5ae72146116b1578063c5f44dd41461165f578063cc557cab14611547578063cd5936cb146114e3578063d002ae641461148d578063d13091f91461142e578063d347ab2f1461135e578063d63fe42a14611317578063d93c9c4f1461111e578063e204591c14610db7578063e857270514610b6e578063ea0fd98514610d70578063ec38035414610d1a578063eef8959814610ccd578063f2fde38b14610bd8578063f3290bfe14610b73578063f7e8528a14610b6e578063f8a5bd2914610b27578063f8dec46d14610a8e578063fb61f5a914610a5e5763ff6014ba1461030f57600080fd5b34610a5757610100600319360112610a5757610329613a75565b60843567ffffffffffffffff8111610a5757610349903690600401613a9f565b60a49291923567ffffffffffffffff8111610a575761036c903690600401613a9f565b610120526103605260c43567ffffffffffffffff8111610a5757610394903690600401613a9f565b60805260e43567ffffffffffffffff8111610a57576103b7903690600401613a9f565b919060a0526040516103c881613b6c565b6102605181526102605160208201526102605160408201526102605160608201526102605160808201526102605160a08201526102605160c08201526102605160e08201526102605161010082015261026051610120820152610260516101408201526102605161016082015261026051610180820152610260516101a0820152610260516101c0820152610260516101e08201526102605161020082015261026051610220820152610260516102408201526102608051910152610260518061016052806101c05260043590526005602052600b604061026051206104b46040518061034052613b3b565b6104bd81614167565b61034051526001600160a01b0360018201541660206103405101526001600160a01b0360028201541660406103405101526003810154606061034051015260048101546080610340510152600581015460a0610340510152600681015460c0610340510152600781015460e061034051015260088101546101006103405101526009810154610120610340510152600a81015461014061034051015201546101606103405101526004356102605152600660205260096040610260512061058a6040518061010052613b1e565b60ff8154161515610100515260018101546020610100510152600281015460406101005101526003810154606061010051015260048101546080610100510152600581015460a0610100510152600681015460c0610100510152600781015460e061010051015260088101546101008051015201546101206101005101526004356102605152600a602052604061026051206001600160a01b038516600052602052604060002060405190816102005281606081011067ffffffffffffffff606084011117610a2857816060600293016040528154905260018101546020610200510152015460406102005101526107de61069460606103405101516020610100510151906145f6565b61010051604001516102205261020051519093906044358110610a13575061026051610160525b610200516020015160643581106109fe5750610260516101c0525b610340519560a08701516102405260c0870151610140526107b460608801519461075f60e08a0151986101206101008c01519b01519b604061020051805161038052602081015160c05260a06101005160608101516102a05260808101516102805201516103005201516101e052600435610260515260096020526040610260512054866146cd565b60e0526004356102605152600960205261078b61012051610360516001604061026051200154866146cd565b6102e0526004356102605152600960205260805190600260406102605120015460443585614834565b6102c0526004356102605152600960205260a0519060036040610260512001549060643590614834565b610320526107f2604051806101a052613b6c565b610220516101a051526102405160206101a05101526101405160406101a051015260606101a051015260806101a051015260a06101a051015260c06101a051015260e06101a0510152610160516101006101a05101526101c0516101206101a0510152610380516101406101a051015260c0516101606101a05101526102a0516101806101a0510152610280516101a080510152610300516101c06101a05101526101e0516101e06101a051015260e05115156102006101a05101526102e05115156102206101a05101526102c05115156102406101a05101526103205115156102606101a051015261028060405161022051815260206101a0510151602082015260406101a0510151604082015260606101a0510151606082015260806101a0510151608082015260a06101a051015160a082015260c06101a051015160c082015260e06101a051015160e08201526101006101a05101516101008201526101206101a05101516101208201526101406101a05101516101408201526101606101a05101516101608201526101806101a05101516101808201526101a0805101516101a08201526101c06101a05101516101c08201526101e06101a05101516101e08201526102006101a051015115156102008201526102206101a051015115156102208201526102406101a051015115156102408201526102606101a05101511515610260820152f35b610a0a906064356145f6565b6101c0526106d6565b610a1f906044356145f6565b610160526106bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102605180fd5b34610a57576020600319360112610a57576004356102605152600760205260206040610260512054604051908152f35b34610a57576020600319360112610a5757600435610260515260066020526101406040610260512060ff8154169060018101549060028101546003820154600483015460058401549060068501549260078601549460096008880154970154976040519915158a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152f35b34610a5757610b3536613e96565b90336102605152600e602052610b5460ff60406102605120541661444a565b610260515260046020526102605190600360408320015580f35b614273565b34610a5757610b8136613e96565b90336102605152600e602052610ba060ff60406102605120541661444a565b8061026051526006602052610bbe60ff6040610260512054166144d2565b610260515260056020526102605190600760408320015580f35b34610a57576020600319360112610a5757610bf1613a5f565b610bf96142cb565b6001600160a01b03809116908115610c6357600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36102605180f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b34610a57576040600319360112610a5757610ce6613a75565b6004356102605152600f6020526001600160a01b036040610260512091166000526020526020604060002054604051908152f35b34610a57576102605180600319360112610d6d57610d366142cb565b610d666102605180808047730bc56e3c1397e4570069e89c07936a5c6020e3be5af1610d60614603565b50614633565b6102605180f35b80fd5b34610a5757610d7e36613e96565b90336102605152600e602052610d9d60ff60406102605120541661444a565b610260515260056020526102605190600b60408320015580f35b34610a575760a0600319360112610a575767ffffffffffffffff600435818111610a5757610de9903690600401613eac565b9060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360112610a5757604051916080830183811083821117610a28576040526024358352604435602084015260643560408401526084356060840152336102605152600e602052610e6560ff60406102605120541661444a565b600254610260515260056020526102605191604083209282519081519283116110ee5750610e938454614114565b601f81116110ad575b50610260519084602092601f851160011461103e5750509180600b9492610160946102605192611033575b50506000198260011b9260031b1c19161784555b600184016001600160a01b039081602084015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501556101208101516009850155610140810151600a850155015191015560025461026051526006602052610260516040812060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556002549052600960205260036060604061026051209280518455602081015160018501556040810151600285015501519101556110296002547fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf586020604051838152a1614378565b6002556102605180f35b015190508780610ec7565b5261026051602081209291905b601f1985168110611095575092600b94926001926101609583601f1981161061107c575b505050811b018455610edb565b015160001960f88460031b161c1916905587808061106f565b9192602060018192868501518155019401920161104b565b6110de9085610260515260206102605120601f850160051c810191602086106110e4575b601f0160051c01906144bb565b85610e9c565b90915081906110d1565b7f4e487b710000000000000000000000000000000000000000000000000000000090526041600452602461026051fd5b34610a575760a0600319360112610a575767ffffffffffffffff600435818111610a5757611150903690600401613a9f565b91602435818111610a5757611169903690600401613a9f565b604435838111610a5757611181903690600401613a9f565b919093606435818111610a575761119c903690600401613a9f565b9091608435908111610a57576111b6903690600401613a9f565b9490936111c28a613c48565b996111d06040519b8c613bc2565b808b52601f196111df82613c48565b01610260515b8181106112ff5750508a610260515b82811061127d575060405160209182820192808352815180945260408301938160408260051b86010193019161026051955b8287106112335785850386f35b90919293828061126d837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a600196030186528851613fdd565b9601920196019592919092611226565b6112f2816112f8936112e28f8f908f908f908f908f908f8f8f8f926112cb8d6112d2946112c56112c0838099976112b982809a6112da9e6143b6565b359f6143b6565b6143c6565b9c6143b6565b35956143da565b9590946143da565b959094615bb2565b6112ec838361454e565b5261454e565b50614378565b8b906111f4565b808d6020809361130d61489e565b92010152016111e5565b34610a575761132536613e96565b90336102605152600e60205261134460ff60406102605120541661444a565b610260515260046020526102605190600260408320015580f35b34610a57576020600319360112610a5757600435610260515260056020526113ee6040610260512061138f81614167565b906001600160a01b03908160018201541691600282015416906003810154600482015460058301546006840154600785015491600886015493600987015495600b600a890154980154986040519c8d9c8d610180908181520190613f9d565b9a60208d015260408c015260608b015260808a015260a089015260c088015260e08701526101008601526101208501526101408401526101608301520390f35b34610a57576080600319360112610a5757336102605152600e60205261145d60ff60406102605120541661444a565b60043561026051526005602052610260516040812060243560098201556044356007820155600860643591015580f35b34610a57576060600319360112610a57576114a6613a75565b60443567ffffffffffffffff8111610a57576040916114cc6114d5923690600401613a9f565b9160043561477a565b825191151582526020820152f35b34610a575760a0600319360112610a5757336102605152600e60205261151260ff60406102605120541661444a565b600435610260515260096020526102605160408120602435815560643560018201556044356002820155600360843591015580f35b34610a57576060600319360112610a575767ffffffffffffffff600435602435828111610a575761157c903690600401613a9f565b9290604435828111610a5757611596903690600401613a9f565b939091336102605152602095600e87526115b960ff60406102605120541661444a565b826102605152600487526102605191600b6040842001928683116110ee57506115e28284614575565b9161026051526102605191878320835b83811061164d5750505050526004845261026051600c60408220019284116110ee575061161f8383614575565b906102605152610260519280842090845b84811061163b578580f35b83358382015592810192600101611630565b823582820155918901916001016115f2565b34610a57576020600319360112610a5757600435610260515260096020526080604061026051208054906001810154906003600282015491015491604051938452602084015260408301526060820152f35b34610a57576116bf36613e96565b90336102605152600e6020526116de60ff60406102605120541661444a565b610260515260046020526102605190600660408320015580f35b34610a575761170636613e96565b90336102605152600e60205261172560ff60406102605120541661444a565b610260515260046020526102605190600560408320015580f35b34610a57576102605180600319360112610d6d576020600354604051908152f35b34610a575761176e36613e96565b90610260515260086020526102605160408120908154831015610d6d576020611797848461422c565b90546040519160031b1c8152f35b34610a57576020600319360112610a57576004356102605152600460205261182f604061026051206117d681614167565b906001810154906002810154906003810154600482015460058301546006840154906007850154926008860154946001600160a01b03600a8160098a01541698015416976040519b8c9b8c6101608091528d0190613f9d565b9960208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301520390f35b34610a575761187736613ad0565b9091336102605152600e60205261189760ff60406102605120541661444a565b610260515260096020526002610260519260408420906003820155015580f35b34610a57576118c536613e96565b90336102605152600e6020526118e460ff60406102605120541661444a565b806102605152600660205261190260ff6040610260512054166144d2565b610260515260056020526102605190600660408320015580f35b34610a575761192a36613e96565b90336102605152600e60205261194960ff60406102605120541661444a565b610260515260046020526102605190600760408320015580f35b34610a575761197136613e96565b90336102605152600e60205261199060ff60406102605120541661444a565b80610260515260066020526119ae60ff6040610260512054166144d2565b610260515260056020526102605190600360408320015580f35b34610a57576020600319360112610a57576001600160a01b036119e9613a5f565b6119f16142cb565b166102605152600e602052610260516040812060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905580f35b34610a57576102605180600319360112610d6d576001600160a01b036020915416604051908152f35b34610a57576040600319360112610a5757611a72613a75565b336102605152600e602052611a9060ff60406102605120541661444a565b6004356102605152600460205261026051906001600160a01b036009604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b34610a575760a0600319360112610a5757611af6613a75565b67ffffffffffffffff606435818111610a5757611b17903690600401613a9f565b92608435928311610a5757611b6393611b37611b4f943690600401613a9f565b939092611b4261489e565b5060443590600435615bb2565b604051918291602083526020830190613fdd565b0390f35b34610a5757611b7536613aea565b90336102605152602092600e8452611b9660ff60406102605120541661444a565b6102605152600483526102605190600d60408320019167ffffffffffffffff84116110ee5750611bc683836145bd565b906102605152610260519280842090845b848110611be2578580f35b83358382015592810192600101611bd7565b34610a5757611c0236613e96565b90336102605152600e602052611c2160ff60406102605120541661444a565b8061026051526006602052611c3f60ff6040610260512054166144d2565b610260515260056020526102605190600460408320015580f35b34610a57576102605180600319360112610d6d57611c756142cb565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a36102605180f35b34610a57576102605180600319360112610d6d5760206040516d76a84fef008cdabe6409d2fe638b8152f35b34610a5757611d0c36613e96565b90336102605152600e602052611d2b60ff60406102605120541661444a565b610260515260046020526102605190600860408320015580f35b34610a5757611d5336613e96565b90336102605152600e602052611d7260ff60406102605120541661444a565b610260515260046020526102605190600160408320015580f35b34610a57576020600319360112610a57576004356102605152600c60205260206040610260512054604051908152f35b34610a57576020600319360112610a575760043561026051526004602052611e1360406102605120611b63611dff600c611df8600b850161467e565b930161467e565b604051938493604085526040850190613f69565b908382036020850152613f69565b34610a5757611e2f36613e96565b90336102605152600e602052611e4e60ff60406102605120541661444a565b610260515260096020526102605190604082205580f35b34610a57576102605180600319360112610d6d576020600254604051908152f35b34610a5757611e9436613aea565b90336102605152602092600e8452611eb560ff60406102605120541661444a565b610260515b838110611f1d57506102605152600883526102605190604082209167ffffffffffffffff84116110ee5750611eef83836145bd565b906102605152610260519280842090845b848110611f0b578580f35b83358382015592810192600101611f00565b606480611f2b8387876143b6565b3511611f405750611f3b90614378565b611eba565b857f6f756e74730000000000000000000000000000000000000000000000000000006084926040519262461bcd60e51b84526004840152602560248401527f4d61726b6574706c6163653a20496e76616c696420446973636f756e7420416d6044840152820152fd5b611fd0611fb536613e2f565b94611fc7979697949194939293614323565b33973497614f18565b600180556102605180f35b34610a5757611fe936613aea565b90336102605152602092600e845261200a60ff60406102605120541661444a565b6102605152600483526102605190600b60408320019167ffffffffffffffff84116110ee575061203a8383614575565b906102605152610260519280842090845b848110612056578580f35b8335838201559281019260010161204b565b34610a575761207636613e96565b90336102605152600e60205261209560ff60406102605120541661444a565b80610260515260066020526120b360ff6040610260512054166144d2565b610260515260056020526102605190600560408320015580f35b34610a57576040600319360112610a575767ffffffffffffffff602435818111610a57576120ff903690600401613eac565b3361026051526020600e815261211e60ff60406102605120541661444a565b6004356102605152600581526102605192604084209383519081519283116110ee575061214b8554614114565b601f81116122b7575b5061026051908391601f8411600114612249575091806101609492600b9694610260519261223e575b50506000198260011b9260031b1c19161785555b600185016001600160a01b03809284015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501556101208101516009850155610140810151600a85015501519101556102605180f35b01519050878061217d565b919086601f19851693526102605192858420935b8181106122a05750926001928592600b9896610160989610612287575b505050811b018555612191565b015160001960f88460031b161c1916905587808061227a565b92938660018192878601518155019501930161225d565b6122e590866102605152846102605120601f850160051c8101918686106110e457601f0160051c01906144bb565b85612154565b34610a57576122f936613e96565b90336102605152600e60205261231860ff60406102605120541661444a565b610260515260096020526102605190600360408320015580f35b34610a575761234036613e96565b90336102605152600e60205261235f60ff60406102605120541661444a565b806102605152600660205261237d60ff6040610260512054166144d2565b610260515260056020526102605190600860408320015580f35b34610a57576123a536613e96565b90336102605152600e6020526123c460ff60406102605120541661444a565b610260515260046020526102605190600460408320015580f35b34610a57576040600319360112610a575767ffffffffffffffff600435818111610a575736602382011215610a575780600401359161241c83613c48565b9261242a6040519485613bc2565b8084526020928385016024809360051b83010191368311610a5757838101915b838310612524575050505035908111610a575761246b903690600401613a9f565b929092336102605152600e835261248b60ff60406102605120541661444a565b612495825161451d565b91610260515b81518110156124dc57806124c76124b56124d7938561454e565b516124c183878b6143da565b9161493f565b6124d1828761454e565b52614378565b61249b565b5050509060405191818392830181845282518091528160408501930191610260515b82811061250d57505050500390f35b8351855286955093810193928101926001016124fe565b8235868111610a5757879161253f8392883691870101613ccc565b81520192019161244a565b34610a575761255836613e96565b90336102605152600e60205261257760ff60406102605120541661444a565b610260515260056020526102605190600a60408320015580f35b34610a575761259f36613e96565b90336102605152600e6020526125be60ff60406102605120541661444a565b80610260515260066020526125dc60ff6040610260512054166144d2565b610260515260056020526102605190600960408320015580f35b60e0600319360112610a575767ffffffffffffffff600435818111610a5757612623903690600401613a9f565b919061018052602435818111610a5757612641903690600401613a9f565b604435838111610a5757612659903690600401613a9f565b606492919235858111610a5757612674903690600401613a9f565b608435878111610a575761268c903690600401613a9f565b9260a435898111610a57576126a5903690600401613a9f565b92909160c4359a8b11610a57576126c18c9b3690600401613a9f565b99909a6126cc614323565b89610260519d14806128de575b806128d5575b806128cc575b806128c3575b806128ba575b156128515799979593918d9b9997959391610260519b5b8d8d1061278b578e340361272157600180556102605180f35b608460405162461bcd60e51b815260206004820152603a60248201527f4d61726b6574706c6163653a20606d73672e76616c756560202620604d65737360448201527f61676556616c7565736020496e70757420496e636f72726563740000000000006064820152fd5b909192939495969798999a9b9c809e8d8f8e8e818f8f8f8f8f8f8f908f8f928f8d94928580948180948161018051916127c3926143b6565b359f6127ce926143b6565b359b6127d9926143b6565b35976127e4926143b6565b6127ed906143c6565b966127f7926143da565b936128039291936143da565b9490938b8b3399612813926143b6565b359661281e99614f18565b612827926143b6565b356128319161443d565b9d61283b90614378565b9c9b9a99989796959493929190509d9c9d612708565b608460405162461bcd60e51b8152602060048201526024808201527f4d61726b6574706c6163653a20496e636f7272656374204172726179204c656e60448201527f67746873000000000000000000000000000000000000000000000000000000006064820152fd5b508a86146126f1565b508588146126eb565b508787146126e5565b508689146126df565b50888a146126d9565b34610a57576020600319360112610a57576001600160a01b03612908613a5f565b166102605152600e602052602060ff6040610260512054166040519015158152f35b61293336613e2f565b909295939694612941614323565b849361294e333214614e6a565b866102605152600560205261296f6009604061026051200154421015614ecd565b33986001600160a01b038116613411575b50866102605152600660205260406102605120926009604051946129a386613b1e565b60ff8154161515865260018101546020870152600281015460408701526003810154606087015260048101546080870152600581015460a0870152600681015460c0870152600781015460e0870152600881015461010087015201546101208501528761026051526005602052604061026051209860405195612a2587613b3b565b612a2e8b614167565b87526001600160a01b0360018c01541660208801526001600160a01b0360028c015416604088015260038b01546060880152600b60048c01549b8c60808a0152600581015460a08a0152600681015460c08a0152600781015460e08a015260088101546101008a015260098101546101208a0152600a8101546101408a01520154610160880152612ac76102605199602088015161443d565b60608801518091116133f9575b5061010087015142116133915760e0870151421161314457612b09918a6102605152600960205260406102605120548d6146cd565b1561308e57612b2f9188610260515260096020526002604061026051200154848c614834565b1561304a57856102605152600a6020526102605160408120906001600160a01b038a169052602052612b6b84600260406102605120015461443d565b1161300657846102605152600a6020526102605160408120906001600160a01b038916905260205260406102605120612ba584825461443d565b9055846102605152600660205260036040610260512001612bc784825461443d565b90557fcbd36e4b86009c473bacdb97bc58ae30b265d96734b308ad24c36382379f94356102605180a15b612bff8360a0840151614562565b955b8311612f9c57612c18836020612c2493015161443d565b60608301511015615b67565b81151580612f93575b612c3690615b67565b843410612f4f57843411612eb1575b61014081015180612dc55750604001516001600160a01b031694853b15610a5757604051957fe0d92a76000000000000000000000000000000000000000000000000000000008752610260516004880152336024880152826044880152866064816102605180945af1948515612db7577fd5d459cc9b45dfab2f92481f9ea36d39dde808a205e3a267e0ceff084ac80a0a9660a096612da8575b505b846102605152600660205260016040610260512001612d0184825461443d565b9055846102605152600660205260066040610260512001612d2384825461443d565b90558461026051526006602052612d456002604061026051200191825461443d565b9055836102605152600a6020526001600160a01b036040610260512091166000526020526002604060002001612d7c82825461443d565b9055604051928352336020840152604083015234606083015215156080820152a1600180556102605180f35b612db190613b58565b87612cdf565b6040513d61026051823e3d90fd5b939592949193600114612e01575b509160a093917fd5d459cc9b45dfab2f92481f9ea36d39dde808a205e3a267e0ceff084ac80a0a9593612ce1565b610260515b848110612e135750612dd3565b60408281015161016084015191517f891407c000000000000000000000000000000000000000000000000000000000815233600482015260248101929092526102605160209183916044918391906001600160a01b03165af18015612db757612e86575b50612e8190614378565b612e06565b602090813d8311612eaa575b612e9c8183613bc2565b81010312610a575787612e77565b503d612e92565b612ebb85346145f6565b6102605180808084335af1612ece614603565b5015612f0b576040805133815260208101929092527fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d065191a1612c45565b606460405162461bcd60e51b815260206004820152601a60248201527f4d61726b6574706c6163653a20526566756e64206661696c65640000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601260248201527f496e76616c69642045544820416d6f756e7400000000000000000000000000006044820152fd5b50841515612c2d565b608460405162461bcd60e51b815260206004820152603e60248201527f496e76616c6964204465736972656420507572636861736520416d6f756e742e60448201527f204d757374204265203c3d204d6178205075726368617365204c696d697400006064820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f416c6c2046756c6c2053657420416c6c6f636174696f6e2055736564000000006044820152fd5b606460405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642046756c6c2053657420416d6f756e742050726f6f660000006044820152fd5b60c460405162461bcd60e51b815260206004820152606760248201527f46756c6c205365742057696e646f773a204e6f7420456c696769626c6520466f60448201527f722050726573616c652057696e646f77204f7220426c6f636b2050656e64696e60648201527f672c20506c656173652054727920416761696e20496e2041204665772053656360848201527f6f6e64732e2e2e0000000000000000000000000000000000000000000000000060a4820152fd5b613164918a6102605152600960205260016040610260512001548d6146cd565b156132db5761318a9188610260515260096020526003604061026051200154848c614834565b1561329757856102605152600a6020526102605160408120906001600160a01b038a1690526020526131c684600160406102605120015461443d565b1161325357846102605152600a6020526102605160408120906001600160a01b03891690526020526002604061026051200161320384825461443d565b905584610260515260066020526004604061026051200161322584825461443d565b90557f77f1809049936567b54d52228d4d8a59319ce7e2d559dab971b18249c7195a0b6102605180a1612bf1565b606460405162461bcd60e51b815260206004820152601b60248201527f416c6c20436974697a656e20416c6c6f636174696f6e205573656400000000006044820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f496e76616c696420436974697a656e20416d6f756e742050726f6f66000000006044820152fd5b60c460405162461bcd60e51b815260206004820152606660248201527f436974697a656e2057696e646f773a204e6f7420456c696769626c6520466f7260448201527f2050726573616c652057696e646f77204f7220426c6f636b2050656e64696e6760648201527f2c20506c656173652054727920416761696e20496e204120466577205365636f60848201527f6e64732e2e2e000000000000000000000000000000000000000000000000000060a4820152fd5b50505050509492506133a78260c0830151614562565b948461026051526006602052600560406102605120016133c884825461443d565b90556001937f5097e51fc343963a2820a2e342a74873349a82c853e17dca54fb14846bec0a436102605180a1612c01565b61340a9198506020870151906145f6565b968c612ad4565b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038b81166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115612db7576102605191613484575b501561298057985089612980565b6134a6915060203d6020116134ac575b61349e8183613bc2565b810190614eb5565b8b613476565b503d613494565b34610a57576060600319360112610a57576134cc613a75565b6004356102605152600d602052610260516001600160a01b036040822092169052602052610260516040812090604435905260205260206040610260512054604051908152f35b34610a57576040600319360112610a57576004356001600160a01b038116809103610a5757602435906135446142cb565b81151580613620575b156135dc576102605180809381935af1613565614603565b5015613572576102605180f35b608460405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2057697468647261772c20526563697069656e74204d6160448201527f79204861766520526576657274656400000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e740000000000000000000000000000000000006044820152fd5b504782111561354d565b34610a57576040600319360112610a5757613643613a75565b6004356102605152600a602052610260516001600160a01b036040822092169052602052606060406102605120805490600260018201549101549060405192835260208301526040820152f35b34610a57576040600319360112610a575767ffffffffffffffff600435818111610a57576136c2903690600401613ccc565b90602435908111610a57576020916136e1613704923690600401613a9f565b91336102605152600e85526136ff60ff60406102605120541661444a565b61493f565b604051908152f35b34610a57576020600319360112610a57576001600160a01b0361372d613a5f565b6137356142cb565b166102605152600e60205261026051604081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905580f35b34610a575761377f36613aea565b90336102605152602092600e84526137a060ff60406102605120541661444a565b6102605152600483526102605190600c60408320019167ffffffffffffffff84116110ee57506137d08383614575565b906102605152610260519280842090845b8481106137ec578580f35b833583820155928101926001016137e1565b34610a57576020600319360112610a57576004356102605152600b60205260206040610260512054604051908152f35b34610a57576040600319360112610a5757613847613a75565b336102605152600e60205261386560ff60406102605120541661444a565b6004356102605152600460205261026051906001600160a01b03600a604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b34610a5757602080600319360112610a5757600435336102605152600e82526138e460ff60406102605120541661444a565b806102605152600b82526139086102605160408082205491600c86522054906145f6565b1561397857600c610d6692826102605152600b815261393661026051604080822054918585522054906145f6565b926102605152526040610260512061394f82825461443d565b90556102605180808093730bc56e3c1397e4570069e89c07936a5c6020e3be5af1610d60614603565b6064826040519062461bcd60e51b82526004820152601f60248201527f4d61726b6574706c6163653a204e6f2045544820546f205769746864726177006044820152fd5b34610a57576139ca36613ad0565b9091336102605152600e6020526139ea60ff60406102605120541661444a565b610260515260096020526102605191604083209060018201555580f35b34613a5a576060600319360112613a5a57613a20613a5f565b60443567ffffffffffffffff8111613a5a57602091613a46613a50923690600401613a9f565b91602435906146cd565b6040519015158152f35b600080fd5b600435906001600160a01b0382168203613a5a57565b602435906001600160a01b0382168203613a5a57565b35906001600160a01b0382168203613a5a57565b9181601f84011215613a5a5782359167ffffffffffffffff8311613a5a576020808501948460051b010111613a5a57565b6003196060910112613a5a57600435906024359060443590565b906040600319830112613a5a57600435916024359067ffffffffffffffff8211613a5a57613b1a91600401613a9f565b9091565b610140810190811067ffffffffffffffff821117610a2857604052565b610180810190811067ffffffffffffffff821117610a2857604052565b67ffffffffffffffff8111610a2857604052565b610280810190811067ffffffffffffffff821117610a2857604052565b6102c0810190811067ffffffffffffffff821117610a2857604052565b6040810190811067ffffffffffffffff821117610a2857604052565b90601f601f19910116810190811067ffffffffffffffff821117610a2857604052565b67ffffffffffffffff8111610a2857601f01601f191660200190565b81601f82011215613a5a57803590613c1882613be5565b92613c266040519485613bc2565b82845260208383010111613a5a57816000926020809301838601378301015290565b67ffffffffffffffff8111610a285760051b60200190565b9291613c6b82613c48565b91613c796040519384613bc2565b829481845260208094019160051b8101928311613a5a57905b828210613c9f5750505050565b81358152908301908301613c92565b9080601f83011215613a5a57816020613cc993359101613c60565b90565b91906101c0928381830312613a5a5760405167ffffffffffffffff94810185811182821017610a285760405280948235818111613a5a5784613d0f918501613c01565b8252602090818401358284015260408401356040840152606084013560608401526080840135608084015260a084013560a084015260c084013560c084015260e084013560e08401526101008085013590840152610120613d71818601613a8b565b90840152610140613d83818601613a8b565b9084015261016080850135828111613a5a5786613da1918701613cae565b9084015261018080850135828111613a5a5786613dbf918701613cae565b908401526101a09384810135918211613a5a57019380601f86011215613a5a578435613dea81613c48565b95613df86040519788613bc2565b818752838088019260051b820101928311613a5a578301905b828210613e2057505050500152565b81358152908301908301613e11565b60c0600319820112613a5a576004359160243591604435916064356001600160a01b0381168103613a5a579167ffffffffffffffff91608435838111613a5a5782613e7c91600401613a9f565b9390939260a435918211613a5a57613b1a91600401613a9f565b6003196040910112613a5a576004359060243590565b91909161018081840312613a5a5760405190613ec782613b3b565b819381359067ffffffffffffffff8211613a5a57613ee6918301613c01565b8252613ef460208201613a8b565b6020830152613f0560408201613a8b565b6040830152606081013560608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e083015261010080820135908301526101208082013590830152610140808201359083015261016080910135910152565b90815180825260208080930193019160005b828110613f89575050505090565b835185529381019392810192600101613f7b565b919082519283825260005b848110613fc9575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201613fa8565b906140c06140ac614098614084613ffd86516102c0808852870190613f9d565b6020870151602087015260408701516040870152606087015160608701526080870151608087015260a087015160a087015260c087015160c087015260e087015160e087015261010080880151908701526001600160a01b0361012081818a0151169088015261014090818901511690870152610160808801519087830390880152613f69565b610180808701519086830390870152613f69565b6101a0808601519085830390860152613f69565b6101c0808501519084830390850152613f69565b916101e080820151908301526102008082015190830152610220808201519083015261024080820151908301526102608082015190830152610280808201511515908301526102a080910151151591015290565b90600182811c9216801561415d575b602083101461412e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691614123565b906040519182600082549261417b84614114565b9081845260019485811690816000146141ea57506001146141a7575b50506141a592500383613bc2565b565b9093915060005260209081600020936000915b8183106141d25750506141a593508201013880614197565b855488840185015294850194879450918301916141ba565b90506141a59550602093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013880614197565b80548210156142445760005260206000200190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b34613a5a576080600319360112613a5a576004356001600160a01b0381168103613a5a5760643567ffffffffffffffff8111613a5a576020916142bd613a50923690600401613a9f565b916044359060243590614834565b6001600160a01b036000541633036142df57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b600260015414614334576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b60001981146143875760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908110156142445760051b0190565b356001600160a01b0381168103613a5a5790565b91908110156142445760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215613a5a57019081359167ffffffffffffffff8311613a5a576020018260051b36038113613a5a579190565b9190820180921161438757565b1561445157565b608460405162461bcd60e51b815260206004820152602d60248201527f4d61726b6574706c616365207c206f6e6c7941646d696e207c2043616c6c657260448201527f204973204e6f742041646d696e000000000000000000000000000000000000006064820152fd5b8181106144c6575050565b600081556001016144bb565b156144d957565b606460405162461bcd60e51b815260206004820152601c60248201527f4d61726b6574706c6163653a2053616c65204e6f7420416374697665000000006044820152fd5b9061452782613c48565b6145346040519182613bc2565b828152601f196145448294613c48565b0190602036910137565b80518210156142445760209160051b010190565b8181029291811591840414171561438757565b680100000000000000008211610a285780549180825582811061459757505050565b60009182526020822092830192015b8281106145b257505050565b8181556001016145a6565b90680100000000000000008111610a28578154908083558181106145e057505050565b6141a592600052602060002091820191016144bb565b9190820391821161438757565b3d1561462e573d9061461482613be5565b916146226040519384613bc2565b82523d6000602084013e565b606090565b1561463a57565b606460405162461bcd60e51b815260206004820152602060248201527f4d61726b6574706c6163653a20455448205769746864726177204661696c65646044820152fd5b9060405191828154918282526020928383019160005283600020936000905b8282106146b3575050506141a592500383613bc2565b85548452600195860195889550938101939091019061469d565b613cc9939261471d916040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b1682526014815261471281613ba6565b519020933691613c60565b929091906000915b845183101561477257614738838661454e565b5190600082821015614760575060005260205261475a60406000205b92614378565b91614725565b60409161475a93825260205220614754565b915092501490565b9392909160408051936020947fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008682019260601b168252601481526147be81613ba6565b5190209360005b876000526008825282600020548110156148225760048252614803866147f183600b876000200161422c565b90549060031b1c61471d368989613c60565b6148155761481090614378565b6147c5565b9650505050505060019190565b505050505050905060009062010f2c90565b909392604051947fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602087019360601b168352603486015260348552606085019185831067ffffffffffffffff841117610a2857613cc99561471d93604052519020933691613c60565b604051906148ab82613b89565b816102a060609182815260009283602083015283604083015283818301528360808301528360a08301528360c08301528360e08301528361010083015283610120830152836101408301528061016083015280610180830152806101a08301526101c0820152826101e082015282610200820152826102208201528261024082015282610260820152826102808201520152565b9161016083019182515191610180850192818451518092149182614e60575b505015614df65760005b818110614d4d5750600392835495866000526004936020918583526040600020815194855167ffffffffffffffff96878211614c2e5781906149aa8554614114565b601f8111614d1d575b508790601f8311600114614ca757600092614c9c575b50506000198260011b928c1b1c19161782555b848301519960019a8b8401556040840151600284015560608401518a84015560808401518984015560a0840151600584015560c0840151600684015560e084015160078401556101008401516008840155600983016001600160a01b03908161012087015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600a8501916101408701511690825416179055600b8301905190815191888311614c6e578790614a9c8484614575565b0190600052866000208c60005b848110614c5c575050505050600c8201905190815191878311614c2e578690614ad28484614575565b0190600052856000208b60005b848110614c1c575050505050600d6101a0910191015190815191858311614bee578490614b0c84846145bd565b0190600052836000208960005b848110614bdc57505050505087600052600882526040600020928411614bae57614b4384846145bd565b9160005280600020908660005b858110614b9c575050505050508154928301809311614b6e57505590565b6011907f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b82853595019481850155018790614b50565b6041857f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b86845194019381840155018a90614b19565b6041887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b88845194019381840155018c90614adf565b60418a7f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b89845194019381840155018d90614aa9565b60418b7f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b0151905038806149c9565b92601f198d91169186600052896000209260005b8b828210614cfb57505094848060019710614ce0575b5050505050811b0182556149dc565b6000199260f8920151931b161c19169055388b818084614cd1565b91929596935093600182918786015181550195019301908e9295949391614cbb565b614d47908660005289600020601f850160051c8101918b86106110e457601f0160051c01906144bb565b386149b3565b606480614d5b8385876143b6565b35111580614de2575b15614d785750614d7390614378565b614968565b6084907f7374204265203c3d203130302026203e203000000000000000000000000000006040519162461bcd60e51b835260206004840152603260248401527f4d61726b6574706c6163653a20446973636f756e7420416d6f756e7473204d756044840152820152fd5b50614dee8284866143b6565b351515614d64565b608460405162461bcd60e51b815260206004820152602960248201527f4d61726b6574706c6163653a20416c6c204172726179204c656e67746873204d60448201527f757374204d6174636800000000000000000000000000000000000000000000006064820152fd5b149050813861495e565b15614e7157565b606460405162461bcd60e51b815260206004820152601560248201527f4d61726b6574706c6163653a20454f41204f6e6c7900000000000000000000006044820152fd5b90816020910312613a5a57518015158103613a5a5790565b15614ed457565b606460405162461bcd60e51b815260206004820152601d60248201527f4d61726b6574706c6163653a2053616c65204e6f7420537461727465640000006044820152fd5b989495979392919096976001600160a01b0396614f388888163214614e6a565b8693888116615aca575b50614f6c906000958c87526004602052614f656006604089200154421015614ecd565b858d61477a565b999015615a3d57614f9d918b86526004602052614f8f8b600c604089200161422c565b90549060031b1c8486614834565b156159ad5788835260046020526064614fe2614fc0896001604088200154614562565b8b86526008602052614fd58b6040882061422c565b90549060031b1c90614562565b04840361594357888352600d60205285604084209216918284526020526040832088845260205261501760408420548861443d565b116158d957878252600d60205260408220908252602052604081208682526020526040812061504786825461443d565b90555b868152600760205261506085604083205461443d565b878252600460205260056040832001541061586f57868152600760205261508b85604083205461443d565b8782526007602052604082205560046020526003806040832001549081156000146151c0575050868152600460205283600960408320015416803b156151bc576040517f86a4fd730000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602481018790529082908290604490829084905af180156151b15760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d499979593608099979593615187936151a2575b505b888152600f602052818120868616825260205281812061517488825461443d565b9055888152600b6020522091825461443d565b905560405194855216602084015260408301526060820152a1565b6151ab90613b58565b38615151565b6040513d84823e3d90fd5b5080fd5b6001918083036152ae57505050805b85811061520b575091608095939161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795615153565b878252600460205260408220600886600983015416910154813b156152aa576040517f86a4fd730000000000000000000000000000000000000000000000000000000081526001600160a01b038716600482015260248101919091529083908290604490829084905af1801561529f579061528b92916152905750614378565b6151cf565b61529990613b58565b386112f2565b6040513d85823e3d90fd5b8380fd5b6002810361537f57505050868152600460205260408120600485600983015416910154813b1561537b576040517fb35fadc20000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810191909152604481018790529082908290606490829084905af180156151b15760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795936080999795936151879361536c575b50615153565b61537590613b58565b38615366565b8280fd5b949897969594808203615488575082825b6153cc575b505050956080959493929161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d499615153565b888452600460205260408420600d810190815483101561548157828860096153f7930154169261422c565b905490841b1c813b1561547d576040517fb35fadc20000000000000000000000000000000000000000000000000000000081526001600160a01b038d1660048201526024810191909152604481018990529085908290606490829084905af18015615472579061546c92916152905750614378565b82615390565b6040513d87823e3d90fd5b8580fd5b5050615395565b929998939290506004810361559a57505085885260046020526004604089200154885b8581106154e9575050906080959493929161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999a615153565b878a52600460208181526040808d206009015490517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0388169381019390935260248301859052829060449082908f908b165af1801561558f57615560575b5061555b90614378565b6154ab565b602090813d8311615588575b6155768183613bc2565b810103126155845738615551565b8980fd5b503d61556c565b6040513d8d823e3d90fd5b6005819a939495969798999a146000146156a657505086815260046020526040812084600982015416600786600a8401541692015491835b88811061562c57505050509160809593916151876040858a7f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d49b999752600460205260078282200161562588825461443d565b9055615153565b615636818561443d565b833b1561547d57604051907f23b872dd00000000000000000000000000000000000000000000000000000000825283600483015289891660248301526044820152858160648183885af1801561569b579061569692916152905750614378565b6155d2565b6040513d88823e3d90fd5b60060361580557878252600460205260408220908560098301541690600883015492015482156157d8578290049189845260046020526004604085200154845b89811061572657505050505091608095939161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795615153565b855b83811061573e575061573990614378565b6156e6565b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602481018490526020816044818a8a5af180156157cd5761579e575b5061579990614378565b615728565b602090813d83116157c6575b6157b48183613bc2565b810103126157c2573861578f565b8680fd5b503d6157aa565b6040513d8a823e3d90fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b608460405162461bcd60e51b815260206004820152602960248201527f4d61726b6574706c6163653a20496e636f72726563742053616c6520436f6e6660448201527f696775726174696f6e00000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574706c6163653a204e6f7420456e6f756768204e465473204c656660448201527f7420466f722053616c65000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152604060248201527f4d61726b6574706c6163653a204465736972656420507572636861736520416d60448201527f6f756e74204578636565647320507572636861736520416c6c6f636174696f6e6064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574706c6163653a20496e636f7272656374204272696768744c697360448201527f74204554482053656e74000000000000000000000000000000000000000000006064820152fd5b60a460405162461bcd60e51b815260206004820152604e60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d617820416d60448201527f6f756e74204d65726b6c652050726f6f6620466f722050726f7669646564204d60648201527f65726b6c65205072696f726974790000000000000000000000000000000000006084820152fd5b505050508681526004602052615a5a856001604084200154614562565b821461504a57608460405162461bcd60e51b815260206004820152602660248201527f4d61726b6574706c6163653a20496e636f72726563742045544820416d6f756e60448201527f742053656e7400000000000000000000000000000000000000000000000000006064820152fd5b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115615b5b57600091615b3d575b5015614f42579350614f6c614f42565b615b55915060203d81116134ac5761349e8183613bc2565b38615b2d565b6040513d6000823e3d90fd5b15615b6e57565b606460405162461bcd60e51b815260206004820152600a60248201527f53616c6520456e646564000000000000000000000000000000000000000000006044820152fd5b9492959190969396615bc261489e565b5085600052600460205260406000209560056001880154970154906007602052615bf1604060002054836145f6565b9381600052600b60205260406000205493600f60205260406000206001600160a01b0382166000526020526040600020546104205260009760006103e052836000526004602052615c49600b6040600020015461451d565b9c60005b856000526004602052600b60406000200154811015615c9557808f6124d18f936064615c89615c90966008602052614fd584604060002061422c565b049261454e565b615c4d565b50615cad9192939495979a9d989b96999c848761477a565b9a90806103a052615e68575b5050505090600d9291600052600460205260406000209160028301546104005260038301549060048401549060068501546007860154916008870154936001600160a01b03600989015416956001600160a01b03600a8a01541697615d24604051806103c052613b89565b615d2d8a614167565b6103c0515260206103c05101526104005160406103c051015260606103c051015260806103c051015260a06103c051015260c06103c051015260e06103c05101526101006103c05101526101206103c05101526101406103c0510152615d95600b820161467e565b6101606103c0510152615daa600c820161467e565b6101806103c05101526040519081928391016020815493848152019060005260206000209260005b818110615e4f575050615de792500382613bc2565b6101a06103c05101526101c06103c05101526101e06103c05101526102006103c05101526102206103c05101526102406103c0510152610420516102606103c05101526103a05115156102806103c05101526103e05115156102a06103c05101526103c05190565b8454835260019485019486945060209093019201615dd2565b615e9491856000526004602052615e868c600c60406000200161422c565b90549060031b1c8585614834565b6103e05282600052600d6020526001600160a01b036040600020911660005260205260406000208860005260205260406000205490818111615ed8575b8080615cb9565b615ee39299506145f6565b963880615ed156fea26469706673582212200832c781463a02ce7cecfad20d2d917d7d42c61ef1e42bd17611136d9d474f5164736f6c63430008130033

Deployed Bytecode

0x610440604052600436101561001357600080fd5b60006102605260003560e01c80630404157314613a075780630a595192146139bc5780630ade686b146138b25780630c0d44751461382e57806312cb2565146137fe578063145e28701461377157806316ffa2e21461370c578063171459a61461369057806319f656861461362a5780631ae3b93a14613513578063228dd2b5146134b35780632dbef8e91461292a57806333b005d0146128e75780634314d55f146125f657806343fa0329146125915780634710a06c1461254a5780634852590e146123de5780634a850fbd146123975780634ab4e832146123325780634d1280e1146122eb5780634ec7a65b146120cd57806350fe6add1461206857806352d635f614611fdb57806358e2b34c14611fa95780635a23785d14611e865780635b80402814611e655780635fc99e3014611e215780636213195814611dbc5780636569f4c714611d8c578063665ccfaa14611d455780636915fed614611cfe5780636a95cc0814611cd2578063715018a614611c595780637826817d14611bf45780637b0c805614611b675780637bfd7f2214611add578063800c42d114611a595780638da5cb5b14611a305780639366ca6b146119c8578063953ba9ee146119635780639e05fd301461191c578063a038ad6e146118b7578063a297684314611869578063a761f7a1146117a5578063b7e96e6014611760578063ba0eebe41461173f578063bae24f91146116f8578063c4e5ae72146116b1578063c5f44dd41461165f578063cc557cab14611547578063cd5936cb146114e3578063d002ae641461148d578063d13091f91461142e578063d347ab2f1461135e578063d63fe42a14611317578063d93c9c4f1461111e578063e204591c14610db7578063e857270514610b6e578063ea0fd98514610d70578063ec38035414610d1a578063eef8959814610ccd578063f2fde38b14610bd8578063f3290bfe14610b73578063f7e8528a14610b6e578063f8a5bd2914610b27578063f8dec46d14610a8e578063fb61f5a914610a5e5763ff6014ba1461030f57600080fd5b34610a5757610100600319360112610a5757610329613a75565b60843567ffffffffffffffff8111610a5757610349903690600401613a9f565b60a49291923567ffffffffffffffff8111610a575761036c903690600401613a9f565b610120526103605260c43567ffffffffffffffff8111610a5757610394903690600401613a9f565b60805260e43567ffffffffffffffff8111610a57576103b7903690600401613a9f565b919060a0526040516103c881613b6c565b6102605181526102605160208201526102605160408201526102605160608201526102605160808201526102605160a08201526102605160c08201526102605160e08201526102605161010082015261026051610120820152610260516101408201526102605161016082015261026051610180820152610260516101a0820152610260516101c0820152610260516101e08201526102605161020082015261026051610220820152610260516102408201526102608051910152610260518061016052806101c05260043590526005602052600b604061026051206104b46040518061034052613b3b565b6104bd81614167565b61034051526001600160a01b0360018201541660206103405101526001600160a01b0360028201541660406103405101526003810154606061034051015260048101546080610340510152600581015460a0610340510152600681015460c0610340510152600781015460e061034051015260088101546101006103405101526009810154610120610340510152600a81015461014061034051015201546101606103405101526004356102605152600660205260096040610260512061058a6040518061010052613b1e565b60ff8154161515610100515260018101546020610100510152600281015460406101005101526003810154606061010051015260048101546080610100510152600581015460a0610100510152600681015460c0610100510152600781015460e061010051015260088101546101008051015201546101206101005101526004356102605152600a602052604061026051206001600160a01b038516600052602052604060002060405190816102005281606081011067ffffffffffffffff606084011117610a2857816060600293016040528154905260018101546020610200510152015460406102005101526107de61069460606103405101516020610100510151906145f6565b61010051604001516102205261020051519093906044358110610a13575061026051610160525b610200516020015160643581106109fe5750610260516101c0525b610340519560a08701516102405260c0870151610140526107b460608801519461075f60e08a0151986101206101008c01519b01519b604061020051805161038052602081015160c05260a06101005160608101516102a05260808101516102805201516103005201516101e052600435610260515260096020526040610260512054866146cd565b60e0526004356102605152600960205261078b61012051610360516001604061026051200154866146cd565b6102e0526004356102605152600960205260805190600260406102605120015460443585614834565b6102c0526004356102605152600960205260a0519060036040610260512001549060643590614834565b610320526107f2604051806101a052613b6c565b610220516101a051526102405160206101a05101526101405160406101a051015260606101a051015260806101a051015260a06101a051015260c06101a051015260e06101a0510152610160516101006101a05101526101c0516101206101a0510152610380516101406101a051015260c0516101606101a05101526102a0516101806101a0510152610280516101a080510152610300516101c06101a05101526101e0516101e06101a051015260e05115156102006101a05101526102e05115156102206101a05101526102c05115156102406101a05101526103205115156102606101a051015261028060405161022051815260206101a0510151602082015260406101a0510151604082015260606101a0510151606082015260806101a0510151608082015260a06101a051015160a082015260c06101a051015160c082015260e06101a051015160e08201526101006101a05101516101008201526101206101a05101516101208201526101406101a05101516101408201526101606101a05101516101608201526101806101a05101516101808201526101a0805101516101a08201526101c06101a05101516101c08201526101e06101a05101516101e08201526102006101a051015115156102008201526102206101a051015115156102208201526102406101a051015115156102408201526102606101a05101511515610260820152f35b610a0a906064356145f6565b6101c0526106d6565b610a1f906044356145f6565b610160526106bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102605180fd5b34610a57576020600319360112610a57576004356102605152600760205260206040610260512054604051908152f35b34610a57576020600319360112610a5757600435610260515260066020526101406040610260512060ff8154169060018101549060028101546003820154600483015460058401549060068501549260078601549460096008880154970154976040519915158a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152f35b34610a5757610b3536613e96565b90336102605152600e602052610b5460ff60406102605120541661444a565b610260515260046020526102605190600360408320015580f35b614273565b34610a5757610b8136613e96565b90336102605152600e602052610ba060ff60406102605120541661444a565b8061026051526006602052610bbe60ff6040610260512054166144d2565b610260515260056020526102605190600760408320015580f35b34610a57576020600319360112610a5757610bf1613a5f565b610bf96142cb565b6001600160a01b03809116908115610c6357600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36102605180f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b34610a57576040600319360112610a5757610ce6613a75565b6004356102605152600f6020526001600160a01b036040610260512091166000526020526020604060002054604051908152f35b34610a57576102605180600319360112610d6d57610d366142cb565b610d666102605180808047730bc56e3c1397e4570069e89c07936a5c6020e3be5af1610d60614603565b50614633565b6102605180f35b80fd5b34610a5757610d7e36613e96565b90336102605152600e602052610d9d60ff60406102605120541661444a565b610260515260056020526102605190600b60408320015580f35b34610a575760a0600319360112610a575767ffffffffffffffff600435818111610a5757610de9903690600401613eac565b9060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360112610a5757604051916080830183811083821117610a28576040526024358352604435602084015260643560408401526084356060840152336102605152600e602052610e6560ff60406102605120541661444a565b600254610260515260056020526102605191604083209282519081519283116110ee5750610e938454614114565b601f81116110ad575b50610260519084602092601f851160011461103e5750509180600b9492610160946102605192611033575b50506000198260011b9260031b1c19161784555b600184016001600160a01b039081602084015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501556101208101516009850155610140810151600a850155015191015560025461026051526006602052610260516040812060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556002549052600960205260036060604061026051209280518455602081015160018501556040810151600285015501519101556110296002547fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf586020604051838152a1614378565b6002556102605180f35b015190508780610ec7565b5261026051602081209291905b601f1985168110611095575092600b94926001926101609583601f1981161061107c575b505050811b018455610edb565b015160001960f88460031b161c1916905587808061106f565b9192602060018192868501518155019401920161104b565b6110de9085610260515260206102605120601f850160051c810191602086106110e4575b601f0160051c01906144bb565b85610e9c565b90915081906110d1565b7f4e487b710000000000000000000000000000000000000000000000000000000090526041600452602461026051fd5b34610a575760a0600319360112610a575767ffffffffffffffff600435818111610a5757611150903690600401613a9f565b91602435818111610a5757611169903690600401613a9f565b604435838111610a5757611181903690600401613a9f565b919093606435818111610a575761119c903690600401613a9f565b9091608435908111610a57576111b6903690600401613a9f565b9490936111c28a613c48565b996111d06040519b8c613bc2565b808b52601f196111df82613c48565b01610260515b8181106112ff5750508a610260515b82811061127d575060405160209182820192808352815180945260408301938160408260051b86010193019161026051955b8287106112335785850386f35b90919293828061126d837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a600196030186528851613fdd565b9601920196019592919092611226565b6112f2816112f8936112e28f8f908f908f908f908f908f8f8f8f926112cb8d6112d2946112c56112c0838099976112b982809a6112da9e6143b6565b359f6143b6565b6143c6565b9c6143b6565b35956143da565b9590946143da565b959094615bb2565b6112ec838361454e565b5261454e565b50614378565b8b906111f4565b808d6020809361130d61489e565b92010152016111e5565b34610a575761132536613e96565b90336102605152600e60205261134460ff60406102605120541661444a565b610260515260046020526102605190600260408320015580f35b34610a57576020600319360112610a5757600435610260515260056020526113ee6040610260512061138f81614167565b906001600160a01b03908160018201541691600282015416906003810154600482015460058301546006840154600785015491600886015493600987015495600b600a890154980154986040519c8d9c8d610180908181520190613f9d565b9a60208d015260408c015260608b015260808a015260a089015260c088015260e08701526101008601526101208501526101408401526101608301520390f35b34610a57576080600319360112610a5757336102605152600e60205261145d60ff60406102605120541661444a565b60043561026051526005602052610260516040812060243560098201556044356007820155600860643591015580f35b34610a57576060600319360112610a57576114a6613a75565b60443567ffffffffffffffff8111610a57576040916114cc6114d5923690600401613a9f565b9160043561477a565b825191151582526020820152f35b34610a575760a0600319360112610a5757336102605152600e60205261151260ff60406102605120541661444a565b600435610260515260096020526102605160408120602435815560643560018201556044356002820155600360843591015580f35b34610a57576060600319360112610a575767ffffffffffffffff600435602435828111610a575761157c903690600401613a9f565b9290604435828111610a5757611596903690600401613a9f565b939091336102605152602095600e87526115b960ff60406102605120541661444a565b826102605152600487526102605191600b6040842001928683116110ee57506115e28284614575565b9161026051526102605191878320835b83811061164d5750505050526004845261026051600c60408220019284116110ee575061161f8383614575565b906102605152610260519280842090845b84811061163b578580f35b83358382015592810192600101611630565b823582820155918901916001016115f2565b34610a57576020600319360112610a5757600435610260515260096020526080604061026051208054906001810154906003600282015491015491604051938452602084015260408301526060820152f35b34610a57576116bf36613e96565b90336102605152600e6020526116de60ff60406102605120541661444a565b610260515260046020526102605190600660408320015580f35b34610a575761170636613e96565b90336102605152600e60205261172560ff60406102605120541661444a565b610260515260046020526102605190600560408320015580f35b34610a57576102605180600319360112610d6d576020600354604051908152f35b34610a575761176e36613e96565b90610260515260086020526102605160408120908154831015610d6d576020611797848461422c565b90546040519160031b1c8152f35b34610a57576020600319360112610a57576004356102605152600460205261182f604061026051206117d681614167565b906001810154906002810154906003810154600482015460058301546006840154906007850154926008860154946001600160a01b03600a8160098a01541698015416976040519b8c9b8c6101608091528d0190613f9d565b9960208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301520390f35b34610a575761187736613ad0565b9091336102605152600e60205261189760ff60406102605120541661444a565b610260515260096020526002610260519260408420906003820155015580f35b34610a57576118c536613e96565b90336102605152600e6020526118e460ff60406102605120541661444a565b806102605152600660205261190260ff6040610260512054166144d2565b610260515260056020526102605190600660408320015580f35b34610a575761192a36613e96565b90336102605152600e60205261194960ff60406102605120541661444a565b610260515260046020526102605190600760408320015580f35b34610a575761197136613e96565b90336102605152600e60205261199060ff60406102605120541661444a565b80610260515260066020526119ae60ff6040610260512054166144d2565b610260515260056020526102605190600360408320015580f35b34610a57576020600319360112610a57576001600160a01b036119e9613a5f565b6119f16142cb565b166102605152600e602052610260516040812060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905580f35b34610a57576102605180600319360112610d6d576001600160a01b036020915416604051908152f35b34610a57576040600319360112610a5757611a72613a75565b336102605152600e602052611a9060ff60406102605120541661444a565b6004356102605152600460205261026051906001600160a01b036009604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b34610a575760a0600319360112610a5757611af6613a75565b67ffffffffffffffff606435818111610a5757611b17903690600401613a9f565b92608435928311610a5757611b6393611b37611b4f943690600401613a9f565b939092611b4261489e565b5060443590600435615bb2565b604051918291602083526020830190613fdd565b0390f35b34610a5757611b7536613aea565b90336102605152602092600e8452611b9660ff60406102605120541661444a565b6102605152600483526102605190600d60408320019167ffffffffffffffff84116110ee5750611bc683836145bd565b906102605152610260519280842090845b848110611be2578580f35b83358382015592810192600101611bd7565b34610a5757611c0236613e96565b90336102605152600e602052611c2160ff60406102605120541661444a565b8061026051526006602052611c3f60ff6040610260512054166144d2565b610260515260056020526102605190600460408320015580f35b34610a57576102605180600319360112610d6d57611c756142cb565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a36102605180f35b34610a57576102605180600319360112610d6d5760206040516d76a84fef008cdabe6409d2fe638b8152f35b34610a5757611d0c36613e96565b90336102605152600e602052611d2b60ff60406102605120541661444a565b610260515260046020526102605190600860408320015580f35b34610a5757611d5336613e96565b90336102605152600e602052611d7260ff60406102605120541661444a565b610260515260046020526102605190600160408320015580f35b34610a57576020600319360112610a57576004356102605152600c60205260206040610260512054604051908152f35b34610a57576020600319360112610a575760043561026051526004602052611e1360406102605120611b63611dff600c611df8600b850161467e565b930161467e565b604051938493604085526040850190613f69565b908382036020850152613f69565b34610a5757611e2f36613e96565b90336102605152600e602052611e4e60ff60406102605120541661444a565b610260515260096020526102605190604082205580f35b34610a57576102605180600319360112610d6d576020600254604051908152f35b34610a5757611e9436613aea565b90336102605152602092600e8452611eb560ff60406102605120541661444a565b610260515b838110611f1d57506102605152600883526102605190604082209167ffffffffffffffff84116110ee5750611eef83836145bd565b906102605152610260519280842090845b848110611f0b578580f35b83358382015592810192600101611f00565b606480611f2b8387876143b6565b3511611f405750611f3b90614378565b611eba565b857f6f756e74730000000000000000000000000000000000000000000000000000006084926040519262461bcd60e51b84526004840152602560248401527f4d61726b6574706c6163653a20496e76616c696420446973636f756e7420416d6044840152820152fd5b611fd0611fb536613e2f565b94611fc7979697949194939293614323565b33973497614f18565b600180556102605180f35b34610a5757611fe936613aea565b90336102605152602092600e845261200a60ff60406102605120541661444a565b6102605152600483526102605190600b60408320019167ffffffffffffffff84116110ee575061203a8383614575565b906102605152610260519280842090845b848110612056578580f35b8335838201559281019260010161204b565b34610a575761207636613e96565b90336102605152600e60205261209560ff60406102605120541661444a565b80610260515260066020526120b360ff6040610260512054166144d2565b610260515260056020526102605190600560408320015580f35b34610a57576040600319360112610a575767ffffffffffffffff602435818111610a57576120ff903690600401613eac565b3361026051526020600e815261211e60ff60406102605120541661444a565b6004356102605152600581526102605192604084209383519081519283116110ee575061214b8554614114565b601f81116122b7575b5061026051908391601f8411600114612249575091806101609492600b9694610260519261223e575b50506000198260011b9260031b1c19161785555b600185016001600160a01b03809284015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501556101208101516009850155610140810151600a85015501519101556102605180f35b01519050878061217d565b919086601f19851693526102605192858420935b8181106122a05750926001928592600b9896610160989610612287575b505050811b018555612191565b015160001960f88460031b161c1916905587808061227a565b92938660018192878601518155019501930161225d565b6122e590866102605152846102605120601f850160051c8101918686106110e457601f0160051c01906144bb565b85612154565b34610a57576122f936613e96565b90336102605152600e60205261231860ff60406102605120541661444a565b610260515260096020526102605190600360408320015580f35b34610a575761234036613e96565b90336102605152600e60205261235f60ff60406102605120541661444a565b806102605152600660205261237d60ff6040610260512054166144d2565b610260515260056020526102605190600860408320015580f35b34610a57576123a536613e96565b90336102605152600e6020526123c460ff60406102605120541661444a565b610260515260046020526102605190600460408320015580f35b34610a57576040600319360112610a575767ffffffffffffffff600435818111610a575736602382011215610a575780600401359161241c83613c48565b9261242a6040519485613bc2565b8084526020928385016024809360051b83010191368311610a5757838101915b838310612524575050505035908111610a575761246b903690600401613a9f565b929092336102605152600e835261248b60ff60406102605120541661444a565b612495825161451d565b91610260515b81518110156124dc57806124c76124b56124d7938561454e565b516124c183878b6143da565b9161493f565b6124d1828761454e565b52614378565b61249b565b5050509060405191818392830181845282518091528160408501930191610260515b82811061250d57505050500390f35b8351855286955093810193928101926001016124fe565b8235868111610a5757879161253f8392883691870101613ccc565b81520192019161244a565b34610a575761255836613e96565b90336102605152600e60205261257760ff60406102605120541661444a565b610260515260056020526102605190600a60408320015580f35b34610a575761259f36613e96565b90336102605152600e6020526125be60ff60406102605120541661444a565b80610260515260066020526125dc60ff6040610260512054166144d2565b610260515260056020526102605190600960408320015580f35b60e0600319360112610a575767ffffffffffffffff600435818111610a5757612623903690600401613a9f565b919061018052602435818111610a5757612641903690600401613a9f565b604435838111610a5757612659903690600401613a9f565b606492919235858111610a5757612674903690600401613a9f565b608435878111610a575761268c903690600401613a9f565b9260a435898111610a57576126a5903690600401613a9f565b92909160c4359a8b11610a57576126c18c9b3690600401613a9f565b99909a6126cc614323565b89610260519d14806128de575b806128d5575b806128cc575b806128c3575b806128ba575b156128515799979593918d9b9997959391610260519b5b8d8d1061278b578e340361272157600180556102605180f35b608460405162461bcd60e51b815260206004820152603a60248201527f4d61726b6574706c6163653a20606d73672e76616c756560202620604d65737360448201527f61676556616c7565736020496e70757420496e636f72726563740000000000006064820152fd5b909192939495969798999a9b9c809e8d8f8e8e818f8f8f8f8f8f8f908f8f928f8d94928580948180948161018051916127c3926143b6565b359f6127ce926143b6565b359b6127d9926143b6565b35976127e4926143b6565b6127ed906143c6565b966127f7926143da565b936128039291936143da565b9490938b8b3399612813926143b6565b359661281e99614f18565b612827926143b6565b356128319161443d565b9d61283b90614378565b9c9b9a99989796959493929190509d9c9d612708565b608460405162461bcd60e51b8152602060048201526024808201527f4d61726b6574706c6163653a20496e636f7272656374204172726179204c656e60448201527f67746873000000000000000000000000000000000000000000000000000000006064820152fd5b508a86146126f1565b508588146126eb565b508787146126e5565b508689146126df565b50888a146126d9565b34610a57576020600319360112610a57576001600160a01b03612908613a5f565b166102605152600e602052602060ff6040610260512054166040519015158152f35b61293336613e2f565b909295939694612941614323565b849361294e333214614e6a565b866102605152600560205261296f6009604061026051200154421015614ecd565b33986001600160a01b038116613411575b50866102605152600660205260406102605120926009604051946129a386613b1e565b60ff8154161515865260018101546020870152600281015460408701526003810154606087015260048101546080870152600581015460a0870152600681015460c0870152600781015460e0870152600881015461010087015201546101208501528761026051526005602052604061026051209860405195612a2587613b3b565b612a2e8b614167565b87526001600160a01b0360018c01541660208801526001600160a01b0360028c015416604088015260038b01546060880152600b60048c01549b8c60808a0152600581015460a08a0152600681015460c08a0152600781015460e08a015260088101546101008a015260098101546101208a0152600a8101546101408a01520154610160880152612ac76102605199602088015161443d565b60608801518091116133f9575b5061010087015142116133915760e0870151421161314457612b09918a6102605152600960205260406102605120548d6146cd565b1561308e57612b2f9188610260515260096020526002604061026051200154848c614834565b1561304a57856102605152600a6020526102605160408120906001600160a01b038a169052602052612b6b84600260406102605120015461443d565b1161300657846102605152600a6020526102605160408120906001600160a01b038916905260205260406102605120612ba584825461443d565b9055846102605152600660205260036040610260512001612bc784825461443d565b90557fcbd36e4b86009c473bacdb97bc58ae30b265d96734b308ad24c36382379f94356102605180a15b612bff8360a0840151614562565b955b8311612f9c57612c18836020612c2493015161443d565b60608301511015615b67565b81151580612f93575b612c3690615b67565b843410612f4f57843411612eb1575b61014081015180612dc55750604001516001600160a01b031694853b15610a5757604051957fe0d92a76000000000000000000000000000000000000000000000000000000008752610260516004880152336024880152826044880152866064816102605180945af1948515612db7577fd5d459cc9b45dfab2f92481f9ea36d39dde808a205e3a267e0ceff084ac80a0a9660a096612da8575b505b846102605152600660205260016040610260512001612d0184825461443d565b9055846102605152600660205260066040610260512001612d2384825461443d565b90558461026051526006602052612d456002604061026051200191825461443d565b9055836102605152600a6020526001600160a01b036040610260512091166000526020526002604060002001612d7c82825461443d565b9055604051928352336020840152604083015234606083015215156080820152a1600180556102605180f35b612db190613b58565b87612cdf565b6040513d61026051823e3d90fd5b939592949193600114612e01575b509160a093917fd5d459cc9b45dfab2f92481f9ea36d39dde808a205e3a267e0ceff084ac80a0a9593612ce1565b610260515b848110612e135750612dd3565b60408281015161016084015191517f891407c000000000000000000000000000000000000000000000000000000000815233600482015260248101929092526102605160209183916044918391906001600160a01b03165af18015612db757612e86575b50612e8190614378565b612e06565b602090813d8311612eaa575b612e9c8183613bc2565b81010312610a575787612e77565b503d612e92565b612ebb85346145f6565b6102605180808084335af1612ece614603565b5015612f0b576040805133815260208101929092527fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d065191a1612c45565b606460405162461bcd60e51b815260206004820152601a60248201527f4d61726b6574706c6163653a20526566756e64206661696c65640000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601260248201527f496e76616c69642045544820416d6f756e7400000000000000000000000000006044820152fd5b50841515612c2d565b608460405162461bcd60e51b815260206004820152603e60248201527f496e76616c6964204465736972656420507572636861736520416d6f756e742e60448201527f204d757374204265203c3d204d6178205075726368617365204c696d697400006064820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f416c6c2046756c6c2053657420416c6c6f636174696f6e2055736564000000006044820152fd5b606460405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642046756c6c2053657420416d6f756e742050726f6f660000006044820152fd5b60c460405162461bcd60e51b815260206004820152606760248201527f46756c6c205365742057696e646f773a204e6f7420456c696769626c6520466f60448201527f722050726573616c652057696e646f77204f7220426c6f636b2050656e64696e60648201527f672c20506c656173652054727920416761696e20496e2041204665772053656360848201527f6f6e64732e2e2e0000000000000000000000000000000000000000000000000060a4820152fd5b613164918a6102605152600960205260016040610260512001548d6146cd565b156132db5761318a9188610260515260096020526003604061026051200154848c614834565b1561329757856102605152600a6020526102605160408120906001600160a01b038a1690526020526131c684600160406102605120015461443d565b1161325357846102605152600a6020526102605160408120906001600160a01b03891690526020526002604061026051200161320384825461443d565b905584610260515260066020526004604061026051200161322584825461443d565b90557f77f1809049936567b54d52228d4d8a59319ce7e2d559dab971b18249c7195a0b6102605180a1612bf1565b606460405162461bcd60e51b815260206004820152601b60248201527f416c6c20436974697a656e20416c6c6f636174696f6e205573656400000000006044820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f496e76616c696420436974697a656e20416d6f756e742050726f6f66000000006044820152fd5b60c460405162461bcd60e51b815260206004820152606660248201527f436974697a656e2057696e646f773a204e6f7420456c696769626c6520466f7260448201527f2050726573616c652057696e646f77204f7220426c6f636b2050656e64696e6760648201527f2c20506c656173652054727920416761696e20496e204120466577205365636f60848201527f6e64732e2e2e000000000000000000000000000000000000000000000000000060a4820152fd5b50505050509492506133a78260c0830151614562565b948461026051526006602052600560406102605120016133c884825461443d565b90556001937f5097e51fc343963a2820a2e342a74873349a82c853e17dca54fb14846bec0a436102605180a1612c01565b61340a9198506020870151906145f6565b968c612ad4565b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038b81166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115612db7576102605191613484575b501561298057985089612980565b6134a6915060203d6020116134ac575b61349e8183613bc2565b810190614eb5565b8b613476565b503d613494565b34610a57576060600319360112610a57576134cc613a75565b6004356102605152600d602052610260516001600160a01b036040822092169052602052610260516040812090604435905260205260206040610260512054604051908152f35b34610a57576040600319360112610a57576004356001600160a01b038116809103610a5757602435906135446142cb565b81151580613620575b156135dc576102605180809381935af1613565614603565b5015613572576102605180f35b608460405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2057697468647261772c20526563697069656e74204d6160448201527f79204861766520526576657274656400000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e740000000000000000000000000000000000006044820152fd5b504782111561354d565b34610a57576040600319360112610a5757613643613a75565b6004356102605152600a602052610260516001600160a01b036040822092169052602052606060406102605120805490600260018201549101549060405192835260208301526040820152f35b34610a57576040600319360112610a575767ffffffffffffffff600435818111610a57576136c2903690600401613ccc565b90602435908111610a57576020916136e1613704923690600401613a9f565b91336102605152600e85526136ff60ff60406102605120541661444a565b61493f565b604051908152f35b34610a57576020600319360112610a57576001600160a01b0361372d613a5f565b6137356142cb565b166102605152600e60205261026051604081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905580f35b34610a575761377f36613aea565b90336102605152602092600e84526137a060ff60406102605120541661444a565b6102605152600483526102605190600c60408320019167ffffffffffffffff84116110ee57506137d08383614575565b906102605152610260519280842090845b8481106137ec578580f35b833583820155928101926001016137e1565b34610a57576020600319360112610a57576004356102605152600b60205260206040610260512054604051908152f35b34610a57576040600319360112610a5757613847613a75565b336102605152600e60205261386560ff60406102605120541661444a565b6004356102605152600460205261026051906001600160a01b03600a604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b34610a5757602080600319360112610a5757600435336102605152600e82526138e460ff60406102605120541661444a565b806102605152600b82526139086102605160408082205491600c86522054906145f6565b1561397857600c610d6692826102605152600b815261393661026051604080822054918585522054906145f6565b926102605152526040610260512061394f82825461443d565b90556102605180808093730bc56e3c1397e4570069e89c07936a5c6020e3be5af1610d60614603565b6064826040519062461bcd60e51b82526004820152601f60248201527f4d61726b6574706c6163653a204e6f2045544820546f205769746864726177006044820152fd5b34610a57576139ca36613ad0565b9091336102605152600e6020526139ea60ff60406102605120541661444a565b610260515260096020526102605191604083209060018201555580f35b34613a5a576060600319360112613a5a57613a20613a5f565b60443567ffffffffffffffff8111613a5a57602091613a46613a50923690600401613a9f565b91602435906146cd565b6040519015158152f35b600080fd5b600435906001600160a01b0382168203613a5a57565b602435906001600160a01b0382168203613a5a57565b35906001600160a01b0382168203613a5a57565b9181601f84011215613a5a5782359167ffffffffffffffff8311613a5a576020808501948460051b010111613a5a57565b6003196060910112613a5a57600435906024359060443590565b906040600319830112613a5a57600435916024359067ffffffffffffffff8211613a5a57613b1a91600401613a9f565b9091565b610140810190811067ffffffffffffffff821117610a2857604052565b610180810190811067ffffffffffffffff821117610a2857604052565b67ffffffffffffffff8111610a2857604052565b610280810190811067ffffffffffffffff821117610a2857604052565b6102c0810190811067ffffffffffffffff821117610a2857604052565b6040810190811067ffffffffffffffff821117610a2857604052565b90601f601f19910116810190811067ffffffffffffffff821117610a2857604052565b67ffffffffffffffff8111610a2857601f01601f191660200190565b81601f82011215613a5a57803590613c1882613be5565b92613c266040519485613bc2565b82845260208383010111613a5a57816000926020809301838601378301015290565b67ffffffffffffffff8111610a285760051b60200190565b9291613c6b82613c48565b91613c796040519384613bc2565b829481845260208094019160051b8101928311613a5a57905b828210613c9f5750505050565b81358152908301908301613c92565b9080601f83011215613a5a57816020613cc993359101613c60565b90565b91906101c0928381830312613a5a5760405167ffffffffffffffff94810185811182821017610a285760405280948235818111613a5a5784613d0f918501613c01565b8252602090818401358284015260408401356040840152606084013560608401526080840135608084015260a084013560a084015260c084013560c084015260e084013560e08401526101008085013590840152610120613d71818601613a8b565b90840152610140613d83818601613a8b565b9084015261016080850135828111613a5a5786613da1918701613cae565b9084015261018080850135828111613a5a5786613dbf918701613cae565b908401526101a09384810135918211613a5a57019380601f86011215613a5a578435613dea81613c48565b95613df86040519788613bc2565b818752838088019260051b820101928311613a5a578301905b828210613e2057505050500152565b81358152908301908301613e11565b60c0600319820112613a5a576004359160243591604435916064356001600160a01b0381168103613a5a579167ffffffffffffffff91608435838111613a5a5782613e7c91600401613a9f565b9390939260a435918211613a5a57613b1a91600401613a9f565b6003196040910112613a5a576004359060243590565b91909161018081840312613a5a5760405190613ec782613b3b565b819381359067ffffffffffffffff8211613a5a57613ee6918301613c01565b8252613ef460208201613a8b565b6020830152613f0560408201613a8b565b6040830152606081013560608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e083015261010080820135908301526101208082013590830152610140808201359083015261016080910135910152565b90815180825260208080930193019160005b828110613f89575050505090565b835185529381019392810192600101613f7b565b919082519283825260005b848110613fc9575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201613fa8565b906140c06140ac614098614084613ffd86516102c0808852870190613f9d565b6020870151602087015260408701516040870152606087015160608701526080870151608087015260a087015160a087015260c087015160c087015260e087015160e087015261010080880151908701526001600160a01b0361012081818a0151169088015261014090818901511690870152610160808801519087830390880152613f69565b610180808701519086830390870152613f69565b6101a0808601519085830390860152613f69565b6101c0808501519084830390850152613f69565b916101e080820151908301526102008082015190830152610220808201519083015261024080820151908301526102608082015190830152610280808201511515908301526102a080910151151591015290565b90600182811c9216801561415d575b602083101461412e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691614123565b906040519182600082549261417b84614114565b9081845260019485811690816000146141ea57506001146141a7575b50506141a592500383613bc2565b565b9093915060005260209081600020936000915b8183106141d25750506141a593508201013880614197565b855488840185015294850194879450918301916141ba565b90506141a59550602093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013880614197565b80548210156142445760005260206000200190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b34613a5a576080600319360112613a5a576004356001600160a01b0381168103613a5a5760643567ffffffffffffffff8111613a5a576020916142bd613a50923690600401613a9f565b916044359060243590614834565b6001600160a01b036000541633036142df57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b600260015414614334576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b60001981146143875760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908110156142445760051b0190565b356001600160a01b0381168103613a5a5790565b91908110156142445760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215613a5a57019081359167ffffffffffffffff8311613a5a576020018260051b36038113613a5a579190565b9190820180921161438757565b1561445157565b608460405162461bcd60e51b815260206004820152602d60248201527f4d61726b6574706c616365207c206f6e6c7941646d696e207c2043616c6c657260448201527f204973204e6f742041646d696e000000000000000000000000000000000000006064820152fd5b8181106144c6575050565b600081556001016144bb565b156144d957565b606460405162461bcd60e51b815260206004820152601c60248201527f4d61726b6574706c6163653a2053616c65204e6f7420416374697665000000006044820152fd5b9061452782613c48565b6145346040519182613bc2565b828152601f196145448294613c48565b0190602036910137565b80518210156142445760209160051b010190565b8181029291811591840414171561438757565b680100000000000000008211610a285780549180825582811061459757505050565b60009182526020822092830192015b8281106145b257505050565b8181556001016145a6565b90680100000000000000008111610a28578154908083558181106145e057505050565b6141a592600052602060002091820191016144bb565b9190820391821161438757565b3d1561462e573d9061461482613be5565b916146226040519384613bc2565b82523d6000602084013e565b606090565b1561463a57565b606460405162461bcd60e51b815260206004820152602060248201527f4d61726b6574706c6163653a20455448205769746864726177204661696c65646044820152fd5b9060405191828154918282526020928383019160005283600020936000905b8282106146b3575050506141a592500383613bc2565b85548452600195860195889550938101939091019061469d565b613cc9939261471d916040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b1682526014815261471281613ba6565b519020933691613c60565b929091906000915b845183101561477257614738838661454e565b5190600082821015614760575060005260205261475a60406000205b92614378565b91614725565b60409161475a93825260205220614754565b915092501490565b9392909160408051936020947fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008682019260601b168252601481526147be81613ba6565b5190209360005b876000526008825282600020548110156148225760048252614803866147f183600b876000200161422c565b90549060031b1c61471d368989613c60565b6148155761481090614378565b6147c5565b9650505050505060019190565b505050505050905060009062010f2c90565b909392604051947fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602087019360601b168352603486015260348552606085019185831067ffffffffffffffff841117610a2857613cc99561471d93604052519020933691613c60565b604051906148ab82613b89565b816102a060609182815260009283602083015283604083015283818301528360808301528360a08301528360c08301528360e08301528361010083015283610120830152836101408301528061016083015280610180830152806101a08301526101c0820152826101e082015282610200820152826102208201528261024082015282610260820152826102808201520152565b9161016083019182515191610180850192818451518092149182614e60575b505015614df65760005b818110614d4d5750600392835495866000526004936020918583526040600020815194855167ffffffffffffffff96878211614c2e5781906149aa8554614114565b601f8111614d1d575b508790601f8311600114614ca757600092614c9c575b50506000198260011b928c1b1c19161782555b848301519960019a8b8401556040840151600284015560608401518a84015560808401518984015560a0840151600584015560c0840151600684015560e084015160078401556101008401516008840155600983016001600160a01b03908161012087015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600a8501916101408701511690825416179055600b8301905190815191888311614c6e578790614a9c8484614575565b0190600052866000208c60005b848110614c5c575050505050600c8201905190815191878311614c2e578690614ad28484614575565b0190600052856000208b60005b848110614c1c575050505050600d6101a0910191015190815191858311614bee578490614b0c84846145bd565b0190600052836000208960005b848110614bdc57505050505087600052600882526040600020928411614bae57614b4384846145bd565b9160005280600020908660005b858110614b9c575050505050508154928301809311614b6e57505590565b6011907f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b82853595019481850155018790614b50565b6041857f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b86845194019381840155018a90614b19565b6041887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b88845194019381840155018c90614adf565b60418a7f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b89845194019381840155018d90614aa9565b60418b7f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b0151905038806149c9565b92601f198d91169186600052896000209260005b8b828210614cfb57505094848060019710614ce0575b5050505050811b0182556149dc565b6000199260f8920151931b161c19169055388b818084614cd1565b91929596935093600182918786015181550195019301908e9295949391614cbb565b614d47908660005289600020601f850160051c8101918b86106110e457601f0160051c01906144bb565b386149b3565b606480614d5b8385876143b6565b35111580614de2575b15614d785750614d7390614378565b614968565b6084907f7374204265203c3d203130302026203e203000000000000000000000000000006040519162461bcd60e51b835260206004840152603260248401527f4d61726b6574706c6163653a20446973636f756e7420416d6f756e7473204d756044840152820152fd5b50614dee8284866143b6565b351515614d64565b608460405162461bcd60e51b815260206004820152602960248201527f4d61726b6574706c6163653a20416c6c204172726179204c656e67746873204d60448201527f757374204d6174636800000000000000000000000000000000000000000000006064820152fd5b149050813861495e565b15614e7157565b606460405162461bcd60e51b815260206004820152601560248201527f4d61726b6574706c6163653a20454f41204f6e6c7900000000000000000000006044820152fd5b90816020910312613a5a57518015158103613a5a5790565b15614ed457565b606460405162461bcd60e51b815260206004820152601d60248201527f4d61726b6574706c6163653a2053616c65204e6f7420537461727465640000006044820152fd5b989495979392919096976001600160a01b0396614f388888163214614e6a565b8693888116615aca575b50614f6c906000958c87526004602052614f656006604089200154421015614ecd565b858d61477a565b999015615a3d57614f9d918b86526004602052614f8f8b600c604089200161422c565b90549060031b1c8486614834565b156159ad5788835260046020526064614fe2614fc0896001604088200154614562565b8b86526008602052614fd58b6040882061422c565b90549060031b1c90614562565b04840361594357888352600d60205285604084209216918284526020526040832088845260205261501760408420548861443d565b116158d957878252600d60205260408220908252602052604081208682526020526040812061504786825461443d565b90555b868152600760205261506085604083205461443d565b878252600460205260056040832001541061586f57868152600760205261508b85604083205461443d565b8782526007602052604082205560046020526003806040832001549081156000146151c0575050868152600460205283600960408320015416803b156151bc576040517f86a4fd730000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602481018790529082908290604490829084905af180156151b15760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d499979593608099979593615187936151a2575b505b888152600f602052818120868616825260205281812061517488825461443d565b9055888152600b6020522091825461443d565b905560405194855216602084015260408301526060820152a1565b6151ab90613b58565b38615151565b6040513d84823e3d90fd5b5080fd5b6001918083036152ae57505050805b85811061520b575091608095939161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795615153565b878252600460205260408220600886600983015416910154813b156152aa576040517f86a4fd730000000000000000000000000000000000000000000000000000000081526001600160a01b038716600482015260248101919091529083908290604490829084905af1801561529f579061528b92916152905750614378565b6151cf565b61529990613b58565b386112f2565b6040513d85823e3d90fd5b8380fd5b6002810361537f57505050868152600460205260408120600485600983015416910154813b1561537b576040517fb35fadc20000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810191909152604481018790529082908290606490829084905af180156151b15760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795936080999795936151879361536c575b50615153565b61537590613b58565b38615366565b8280fd5b949897969594808203615488575082825b6153cc575b505050956080959493929161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d499615153565b888452600460205260408420600d810190815483101561548157828860096153f7930154169261422c565b905490841b1c813b1561547d576040517fb35fadc20000000000000000000000000000000000000000000000000000000081526001600160a01b038d1660048201526024810191909152604481018990529085908290606490829084905af18015615472579061546c92916152905750614378565b82615390565b6040513d87823e3d90fd5b8580fd5b5050615395565b929998939290506004810361559a57505085885260046020526004604089200154885b8581106154e9575050906080959493929161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999a615153565b878a52600460208181526040808d206009015490517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0388169381019390935260248301859052829060449082908f908b165af1801561558f57615560575b5061555b90614378565b6154ab565b602090813d8311615588575b6155768183613bc2565b810103126155845738615551565b8980fd5b503d61556c565b6040513d8d823e3d90fd5b6005819a939495969798999a146000146156a657505086815260046020526040812084600982015416600786600a8401541692015491835b88811061562c57505050509160809593916151876040858a7f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d49b999752600460205260078282200161562588825461443d565b9055615153565b615636818561443d565b833b1561547d57604051907f23b872dd00000000000000000000000000000000000000000000000000000000825283600483015289891660248301526044820152858160648183885af1801561569b579061569692916152905750614378565b6155d2565b6040513d88823e3d90fd5b60060361580557878252600460205260408220908560098301541690600883015492015482156157d8578290049189845260046020526004604085200154845b89811061572657505050505091608095939161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795615153565b855b83811061573e575061573990614378565b6156e6565b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602481018490526020816044818a8a5af180156157cd5761579e575b5061579990614378565b615728565b602090813d83116157c6575b6157b48183613bc2565b810103126157c2573861578f565b8680fd5b503d6157aa565b6040513d8a823e3d90fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b608460405162461bcd60e51b815260206004820152602960248201527f4d61726b6574706c6163653a20496e636f72726563742053616c6520436f6e6660448201527f696775726174696f6e00000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574706c6163653a204e6f7420456e6f756768204e465473204c656660448201527f7420466f722053616c65000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152604060248201527f4d61726b6574706c6163653a204465736972656420507572636861736520416d60448201527f6f756e74204578636565647320507572636861736520416c6c6f636174696f6e6064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574706c6163653a20496e636f7272656374204272696768744c697360448201527f74204554482053656e74000000000000000000000000000000000000000000006064820152fd5b60a460405162461bcd60e51b815260206004820152604e60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d617820416d60448201527f6f756e74204d65726b6c652050726f6f6620466f722050726f7669646564204d60648201527f65726b6c65205072696f726974790000000000000000000000000000000000006084820152fd5b505050508681526004602052615a5a856001604084200154614562565b821461504a57608460405162461bcd60e51b815260206004820152602660248201527f4d61726b6574706c6163653a20496e636f72726563742045544820416d6f756e60448201527f742053656e7400000000000000000000000000000000000000000000000000006064820152fd5b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115615b5b57600091615b3d575b5015614f42579350614f6c614f42565b615b55915060203d81116134ac5761349e8183613bc2565b38615b2d565b6040513d6000823e3d90fd5b15615b6e57565b606460405162461bcd60e51b815260206004820152600a60248201527f53616c6520456e646564000000000000000000000000000000000000000000006044820152fd5b9492959190969396615bc261489e565b5085600052600460205260406000209560056001880154970154906007602052615bf1604060002054836145f6565b9381600052600b60205260406000205493600f60205260406000206001600160a01b0382166000526020526040600020546104205260009760006103e052836000526004602052615c49600b6040600020015461451d565b9c60005b856000526004602052600b60406000200154811015615c9557808f6124d18f936064615c89615c90966008602052614fd584604060002061422c565b049261454e565b615c4d565b50615cad9192939495979a9d989b96999c848761477a565b9a90806103a052615e68575b5050505090600d9291600052600460205260406000209160028301546104005260038301549060048401549060068501546007860154916008870154936001600160a01b03600989015416956001600160a01b03600a8a01541697615d24604051806103c052613b89565b615d2d8a614167565b6103c0515260206103c05101526104005160406103c051015260606103c051015260806103c051015260a06103c051015260c06103c051015260e06103c05101526101006103c05101526101206103c05101526101406103c0510152615d95600b820161467e565b6101606103c0510152615daa600c820161467e565b6101806103c05101526040519081928391016020815493848152019060005260206000209260005b818110615e4f575050615de792500382613bc2565b6101a06103c05101526101c06103c05101526101e06103c05101526102006103c05101526102206103c05101526102406103c0510152610420516102606103c05101526103a05115156102806103c05101526103e05115156102a06103c05101526103c05190565b8454835260019485019486945060209093019201615dd2565b615e9491856000526004602052615e868c600c60406000200161422c565b90549060031b1c8585614834565b6103e05282600052600d6020526001600160a01b036040600020911660005260205260406000208860005260205260406000205490818111615ed8575b8080615cb9565b615ee39299506145f6565b963880615ed156fea26469706673582212200832c781463a02ce7cecfad20d2d917d7d42c61ef1e42bd17611136d9d474f5164736f6c63430008130033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.