ETH Price: $3,471.77 (+2.09%)

Token

2112.run rootPasses (2112RP)
 

Overview

Max Total Supply

4,050 2112RP

Holders

1,209

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x2a93E999816c9826aDe0B51AAa2d83240d8F4596
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

2112.run is a transmedia narrative project set in an emerging cyberpunk universe shaped along side the community. The year is 2112. Corporations brutally control a dystopic world heavily altered by climate and technological change.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MintPassFactory

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 15 of 18: MintPassFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

//··········································
//··········································
//········_________·___·___····_________····
//······/  ______  \\  \\  \·/  ______  \···
//·····/__/·····/  //  //  //__/·····/  /···
//····_________/  //  //  /_________/  /····
//···/  _________//  //  //  _________/·····
//··/  /________ /  //  //  /________·······
//·/__/\_______//__//__//__/\_______/·∅·RUN·
//··········································
//··········································

import "./ERC1155.sol";
import "./AbstractMintPassFactory.sol";
import "./PaymentSplitter.sol";
import "./MerkleProof.sol";


contract MintPassFactory is AbstractMintPassFactory, PaymentSplitter  {
    uint private mpCounter = 1; 
    uint private bCounter = 1; 

    // root hash of merkle tree generated offchain of all whitelisted addresses
    // provide as byte32 type, not string. 0x prefix required.
    bytes32 public merkleRoot1;
    bytes32 public merkleRoot2;
    bytes32 public merkleRoot3;
    bytes32 public merkleRoot4;
  
    // new mint passes can be added to support future collections
    mapping(uint256 => MintPass) public MintPasses;
    mapping(uint256 => Bundle) public Bundles;

    // track claimed whitelist ==> bundles minted
    mapping(address => uint) public Whitelist;

    // sale state 
    uint public saleState = 0;
    uint public promoClaims = 60;
    uint public claimMax = 2;   //wl max
    uint public publicMax = 5;  // public max

    struct MintPass {
        uint256 quantity;
        string name;
        address redeemableContract; 
        string uri;
    }

    struct Bundle {
        uint256 price;
        uint256 quantity;
        string name;
    }    

    constructor(
        string memory _name, 
        string memory _symbol,
        address[] memory _payees,
        uint256[] memory _paymentShares
    ) ERC1155("https://mint.2112.run/tokens/") PaymentSplitter(_payees, _paymentShares) {
        name_ = _name;
        symbol_ = _symbol;
        // add the bundles
        addBundle(.2112 ether, 7000, "LOW"); //only 7000 not 7060 so promos are extra
        addBundle(.6 ether,    3000, "MID");
        addBundle(1.2 ether,   500, "HIGH");
        // add the MP
        addMintPass(10560, "Cryptorunner", msg.sender,          "https://mint.2112.run/tokens/1.json");
        addMintPass(7060,  "Land Standared Tier", msg.sender,   "https://mint.2112.run/tokens/2.json");
        addMintPass(3000,  "Land Rare Tier", msg.sender,        "https://mint.2112.run/tokens/3.json");
        addMintPass(500,   "Land Epic Tier ", msg.sender,       "https://mint.2112.run/tokens/4.json");
        addMintPass(7060,  "Console Standard Tier", msg.sender, "https://mint.2112.run/tokens/5.json");
        addMintPass(3000,  "Console Rare Tier", msg.sender,     "https://mint.2112.run/tokens/6.json");
        addMintPass(500,   "Console Epic Tier", msg.sender,     "https://mint.2112.run/tokens/7.json");

    } 

    function addMintPass(
        uint256  _quantity, 
        string memory _name,
        address _redeemableContract,
        string memory _uri

    ) public onlyOwner {

        MintPass storage mp = MintPasses[mpCounter];
        mp.quantity = _quantity;
        mp.redeemableContract = _redeemableContract;
        mp.name = _name;
        mp.uri = _uri;
        mpCounter += 1;
    }

    function editMintPass(
        uint256 _quantity, 
        string memory _name,        
        address _redeemableContract, 
        uint256 _mpIndex,
        string memory _uri
    ) external onlyOwner {

        MintPasses[_mpIndex].quantity = _quantity;    
        MintPasses[_mpIndex].name = _name;    
        MintPasses[_mpIndex].redeemableContract = _redeemableContract;  
        MintPasses[_mpIndex].uri = _uri;    
    }     


    function addBundle (
        uint256 _bundlePrice,
        uint256 _bundleQty,
        string memory _name
    ) public onlyOwner {
        require(_bundlePrice > 0, "addBundle: bundle price must be greater than 0");
        require(_bundleQty > 0, "addBundle: bundle quantity must be greater than 0");

        Bundle storage b = Bundles[bCounter];
        b.price = _bundlePrice;
        b.quantity = _bundleQty;
        b.name = _name;

        bCounter += 1;
    }

    function editBundle (
        uint256 _bundlePrice,
        uint256 _bundleQty,
        string memory _name,
        uint256 _bundleIndex
    ) external onlyOwner {
        require(_bundlePrice > 0, "editBundle: bundle price must be greater than 0");
        require(_bundleQty > 0, "editBundle: bundle quantity must be greater than 0");

        Bundles[_bundleIndex].price = _bundlePrice;
        Bundles[_bundleIndex].quantity = _bundleQty;
        Bundles[_bundleIndex].name = _name;
    }

    function burnFromRedeem(
        address account, 
        uint256[] calldata ids, 
        uint256[] calldata amounts
    ) external {
        for (uint i = 0; i < ids.length; i++) {
            require(MintPasses[ids[i]].redeemableContract == msg.sender, "Burnable: Only allowed from redeemable contract");
        }
        _burnBatch(account, ids, amounts);
    }  


    // mint a pass
    function claim(
        // list of quantities for each bundle [b1,b2,b3]
        // eg. [0,2,1]
        uint[] calldata _quantities,
        bytes32[] calldata _merkleProof
    ) external payable {
        // verify contract is not paused
        require(saleState > 0, "Claim: claiming is paused");
        // Verify minting price
        require(msg.value >= 
            (Bundles[1].price * _quantities[0])
            + (Bundles[2].price * _quantities[1])
            + (Bundles[3].price * _quantities[2])
            , "Claim: Insufficient ether submitted.");

        // Verify quantity is within remaining available 
        require(Bundles[1].quantity - _quantities[0] >= 0, "Claim: Not enough bundle1 quantity");
        require(Bundles[2].quantity - _quantities[1] >= 0, "Claim: Not enough bundle2 quantity");
        require(Bundles[3].quantity - _quantities[2] >= 0, "Claim: Not enough bundle3 quantity");

        // Verify on whitelist if not public sale
        // warning: Whitelist[msg.sender] will return 0 if not on whitelist
        if (saleState > 0 && saleState < 5) {

            require(
                Whitelist[msg.sender] 
                    + _quantities[0] +  _quantities[1] + _quantities[2]
                    <= claimMax
            
                , "Claim: Quantites exceed whitelist max allowed."
            );
            // verify the provided _merkleProof matches
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            if (saleState == 1){
                require(MerkleProof.verify(_merkleProof, merkleRoot1, leaf), 'Not on whitelist (Merkle Proof 1 fail).');
            } else if (saleState == 2) {
                require(MerkleProof.verify(_merkleProof, merkleRoot2, leaf), 'Not on whitelist (Merkle Proof 2 fail).');
            } else if (saleState == 3) {
                require(MerkleProof.verify(_merkleProof, merkleRoot3, leaf), 'Not on whitelist (Merkle Proof 3 fail).');
            } else if (saleState == 4) {
                require(MerkleProof.verify(_merkleProof, merkleRoot4, leaf), 'Not on whitelist (Merkle Proof 4 fail).');
            }

            // passed; update Whitelist qty
            Whitelist[msg.sender] = Whitelist[msg.sender] + _quantities[0] +  _quantities[1] + _quantities[2];
        }
        else if (saleState == 5) {
            // block proxy contract minting
            require(msg.sender == tx.origin, 'msg.sender does not match tx.origin');
            // public sale, max mint per txn
            require(_quantities[0] +  _quantities[1] + _quantities[2] 
            <= publicMax, "Claim: Quantities exceed mint max allowed.");
        }
        
        // pass ==> mint
        // memory arrays can only be fixed size
        uint size = 1;
        for (uint i = 0; i < 3; i++) {
            if(_quantities[i] > 0) {
                size = size + 2;
            }
        }

        uint256[] memory qtys = new uint256[](size);
        uint256[] memory ids = new uint256[](size);
        ids[0] = 1;
        uint next = 1;

        // bundle1 gets MPs 1,2,5
        if (_quantities[0] > 0) {
            qtys[0] = qtys[0] + _quantities[0];
            qtys[next] = _quantities[0];
            ids[next] = 2;
            next += 1;
            qtys[next] = _quantities[0];
            ids[next] = 5;
            next += 1;
            Bundles[1].quantity -= _quantities[0];
            
        }
        // bundle2 gets MPs 1, 3, 6
        if (_quantities[1] > 0) {
            qtys[0] = qtys[0] + _quantities[1];
            qtys[next] = _quantities[1];
            ids[next] = 3;
            next += 1;
            qtys[next] = _quantities[1];
            ids[next] = 6;
            next += 1;
            Bundles[2].quantity -= _quantities[1];

        }

        // bundle3 gets MPS 1, 4, 7
        if (_quantities[2] > 0) {
            qtys[0] = qtys[0] + _quantities[2];
            qtys[next] = _quantities[2];
            ids[next] = 4;
            next += 1;
            qtys[next] = _quantities[2];
            ids[next] = 7;
            next += 1;
            Bundles[3].quantity -= _quantities[2];

        }
        
        _mintBatch(msg.sender, ids, qtys, "");

    }

    // owner can send up to 60 promo bundle1
    // we bypass bundle1.quantity so we get 60 EXTRA!
    function promoClaim(address _to, uint _quantity) external onlyOwner {
        require(promoClaims - _quantity >= 0, "Quantity exceeds available promos remaining. ");
        promoClaims -= _quantity;
        // one cryptorunner, one land, one item
        uint256[] memory y = new uint256[](3);
        y[0] = 1;
        y[1] = 2;
        y[2] = 5;
        uint256[] memory x = new uint256[](3);
        x[0] = _quantity;
        x[1] = _quantity;
        x[2] = _quantity;
        _mintBatch(_to, y, x, "");
    }

    // owner can update sale state
    function updateSaleStatus(uint _saleState) external onlyOwner {
        require(_saleState <= 5, "updateSaleStatus: saleState must be between 0 and 5");
        saleState = _saleState;
    }

    // owner can update wl claimMax
    function updateClaimMax(uint _claimMax) external onlyOwner {
        require(_claimMax >= 0, "claimMax: claimMax must be greater than, or equal to 0");
        claimMax = _claimMax;
    }

    // owner can update public claimMax
    function updatePublicMax(uint _publicMax) external onlyOwner {
        require(_publicMax >= 0, "publicMax: publicMax must be greater than, or equal to 0");
        publicMax = _publicMax; 
    }

    // token uri
    function uri(uint256 _id) public view override returns (string memory) {
        //require(MintPasses[_id] >= 0, "URI: nonexistent token");
        return string(MintPasses[_id].uri);
    }    

    // owner can update the merkleRoot;
    // 0x prepend required
    function updateMerkleRoot(bytes32 _merkleRoot, uint number) external onlyOwner {
        if (number == 1 ) {
            merkleRoot1 = _merkleRoot;
        } else if (number == 2) {
            merkleRoot2 = _merkleRoot;
        } else if (number == 3) {
            merkleRoot3 = _merkleRoot;
        } else if (number == 4) {
            merkleRoot4 = _merkleRoot;
        }
        else {
            require(false, "updateMerkleRoot: number must be between 1 and 4");
        }
    }
}

File 1 of 18: AbstractMintPassFactory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import './Ownable.sol';
import './ERC1155Burnable.sol'; 

abstract contract AbstractMintPassFactory is ERC1155Burnable, Ownable {
    
    string public name_;
    string public symbol_;     

    function setURI(string memory baseURI) external onlyOwner {
        _setURI(baseURI);
    }    

    function name() public view returns (string memory) {
        return name_;
    }

    function symbol() public view returns (string memory) {
        return symbol_;
    }          

    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual override(ERC1155) {
        super._mint(account, id, amount, data);
    }

    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155) {
        super._mintBatch(to, ids, amounts, data);
    }

    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual override(ERC1155) {
        super._burn(account, id, amount);
    }

    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual override(ERC1155) {
        super._burnBatch(account, ids, amounts);
    }  

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }  

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}

File 2 of 18: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 18: Context.sol
// SPDX-License-Identifier: MIT

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 4 of 18: ERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][account] = accountBalance - amount;
            }
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 5 of 18: ERC1155Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

File 6 of 18: ERC1155Holder.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.0;

import "./ERC1155Receiver.sol";

/**
 * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.
 *
 * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
 * stuck.
 *
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

File 7 of 18: ERC1155Receiver.sol
   
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC1155Receiver.sol";
import "./ERC165.sol";

/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}

File 8 of 18: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 9 of 18: IERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 10 of 18: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 11 of 18: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 18: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 13 of 18: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 14 of 18: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 16 of 18: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./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() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 17 of 18: PaymentSplitter.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;

import "./SafeERC20.sol";
import "./Address.sol";
import "./Context.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

File 18 of 18: SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_paymentShares","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","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":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Bundles","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MintPasses","outputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"redeemableContract","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bundlePrice","type":"uint256"},{"internalType":"uint256","name":"_bundleQty","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"addBundle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_redeemableContract","type":"address"},{"internalType":"string","name":"_uri","type":"string"}],"name":"addMintPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnFromRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_quantities","type":"uint256[]"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bundlePrice","type":"uint256"},{"internalType":"uint256","name":"_bundleQty","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_bundleIndex","type":"uint256"}],"name":"editBundle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_redeemableContract","type":"address"},{"internalType":"uint256","name":"_mpIndex","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"editMintPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot1","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot2","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot3","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot4","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"promoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"promoClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimMax","type":"uint256"}],"name":"updateClaimMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"number","type":"uint256"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMax","type":"uint256"}],"name":"updatePublicMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleState","type":"uint256"}],"name":"updateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600d556001600e556000601655603c601755600260185560056019553480156200002f57600080fd5b5060405162005a2a38038062005a2a833981016040819052620000529162000b5a565b81816040518060400160405280601d81526020017f68747470733a2f2f6d696e742e323131322e72756e2f746f6b656e732f0000008152506200009b816200050660201b60201c565b50620000a7336200051f565b8051825114620001195760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b60008251116200016c5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000110565b60005b8251811015620001d857620001c383828151811062000192576200019262000d6e565b6020026020010151838381518110620001af57620001af62000d6e565b60200260200101516200057160201b60201c565b80620001cf8162000d3a565b9150506200016f565b50508451620001f091506004906020870190620009a5565b50825162000206906005906020860190620009a5565b506200023f6702ee5547f0900000611b58604051806040016040528060038152602001624c4f5760e81b8152506200075f60201b60201c565b62000277670853a0d2313c0000610bb86040518060400160405280600381526020016213525160ea1b8152506200075f60201b60201c565b620002b06710a741a4627800006101f460405180604001604052806004815260200163090928e960e31b8152506200075f60201b60201c565b620002fd6129406040518060400160405280600c81526020016b21b93cb83a37b93ab73732b960a11b81525033604051806060016040528060238152602001620059e460239139620008d5565b6200035b611b946040518060400160405280601381526020017f4c616e64205374616e6461726564205469657200000000000000000000000000815250336040518060600160405280602381526020016200591560239139620008d5565b620003aa610bb86040518060400160405280600e81526020016d2630b732102930b932902a34b2b960911b815250336040518060600160405280602381526020016200597e60239139620008d5565b620003fa6101f46040518060400160405280600f81526020016e02630b7321022b834b1902a34b2b91608d1b8152503360405180606001604052806023815260200162005a0760239139620008d5565b62000458611b946040518060400160405280601581526020017f436f6e736f6c65205374616e6461726420546965720000000000000000000000815250336040518060600160405280602381526020016200595b60239139620008d5565b620004aa610bb86040518060400160405280601181526020017021b7b739b7b632902930b932902a34b2b960791b815250336040518060600160405280602381526020016200593860239139620008d5565b620004fc6101f46040518060400160405280601181526020017021b7b739b7b6329022b834b1902a34b2b960791b81525033604051806060016040528060238152602001620059a160239139620008d5565b5050505062000d9a565b80516200051b906002906020840190620009a5565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620005de5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000110565b60008111620006305760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000110565b6001600160a01b03821660009081526008602052604090205415620006ac5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000110565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b03841690811790915560009081526008602052604090208190556006546200071690829062000ce2565b600655604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6003546001600160a01b03163314620007aa5760405162461bcd60e51b81526020600482018190526024820152600080516020620059c4833981519152604482015260640162000110565b60008311620008135760405162461bcd60e51b815260206004820152602e60248201527f61646442756e646c653a2062756e646c65207072696365206d7573742062652060448201526d067726561746572207468616e20360941b606482015260840162000110565b600082116200087f5760405162461bcd60e51b815260206004820152603160248201527f61646442756e646c653a2062756e646c65207175616e74697479206d75737420604482015270062652067726561746572207468616e203607c1b606482015260840162000110565b600e5460009081526014602090815260409091208481556001810184905582519091620008b4916002840191850190620009a5565b506001600e6000828254620008ca919062000ce2565b909155505050505050565b6003546001600160a01b03163314620009205760405162461bcd60e51b81526020600482018190526024820152600080516020620059c4833981519152604482015260640162000110565b600d5460009081526013602090815260409091208581556002810180546001600160a01b0319166001600160a01b038616179055845190916200096b916001840191870190620009a5565b508151620009839060038301906020850190620009a5565b506001600d600082825462000999919062000ce2565b90915550505050505050565b828054620009b39062000cfd565b90600052602060002090601f016020900481019282620009d7576000855562000a22565b82601f10620009f257805160ff191683800117855562000a22565b8280016001018555821562000a22579182015b8281111562000a2257825182559160200191906001019062000a05565b5062000a3092915062000a34565b5090565b5b8082111562000a30576000815560010162000a35565b600082601f83011262000a5d57600080fd5b8151602062000a7662000a708362000cbc565b62000c89565b80838252828201915082860187848660051b890101111562000a9757600080fd5b60005b8581101562000ab85781518452928401929084019060010162000a9a565b5090979650505050505050565b600082601f83011262000ad757600080fd5b81516001600160401b0381111562000af35762000af362000d84565b602062000b09601f8301601f1916820162000c89565b828152858284870101111562000b1e57600080fd5b60005b8381101562000b3e57858101830151828201840152820162000b21565b8381111562000b505760008385840101525b5095945050505050565b6000806000806080858703121562000b7157600080fd5b84516001600160401b038082111562000b8957600080fd5b62000b978883890162000ac5565b955060209150818701518181111562000baf57600080fd5b62000bbd89828a0162000ac5565b95505060408701518181111562000bd357600080fd5b8701601f8101891362000be557600080fd5b805162000bf662000a708262000cbc565b8082825285820191508584018c878560051b870101111562000c1757600080fd5b600094505b8385101562000c525780516001600160a01b038116811462000c3d57600080fd5b83526001949094019391860191860162000c1c565b5060608b015190975094505050508082111562000c6e57600080fd5b5062000c7d8782880162000a4b565b91505092959194509250565b604051601f8201601f191681016001600160401b038111828210171562000cb45762000cb462000d84565b604052919050565b60006001600160401b0382111562000cd85762000cd862000d84565b5060051b60200190565b6000821982111562000cf85762000cf862000d58565b500190565b600181811c9082168062000d1257607f821691505b6020821081141562000d3457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000d515762000d5162000d58565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b614b6b8062000daa6000396000f3fe6080604052600436106102b15760003560e01c806373025b2011610175578063ce7c2ac2116100dc578063e64710e611610095578063f242432a1161006f578063f242432a14610907578063f2fde38b14610927578063f4bba2f514610947578063f5298aca1461096757600080fd5b8063e64710e61461087b578063e985e9c514610891578063eb73900b146108da57600080fd5b8063ce7c2ac2146107a0578063d79779b2146107d6578063d7d6f3b51461080c578063e2b9e1861461083b578063e33b7de314610850578063e527c6dd1461086557600080fd5b806395e0f8c71161012e57806395e0f8c7146106df5780639852595c146106ff578063a22cb46514610735578063af17dea614610755578063b747172a1461076a578063ca34adf01461078a57600080fd5b806373025b201461062857806374b23e461461063e5780637d3a2bb41461065e5780638b83209b146106745780638da5cb5b146106ac57806395d89b41146106ca57600080fd5b806337c349dc116102195780634e1273f4116101d25780634e1273f41461056a5780635c58355d14610597578063603f4d52146105ad578063622f3a46146105c35780636b20c454146105f3578063715018a61461061357600080fd5b806337c349dc1461049957806339304c5e146104af5780633a98ef39146104cf578063406072a9146104e457806348b750441461052a5780634a32d7b51461054a57600080fd5b80630e89341c1161026b5780630e89341c146103e657806319165587146104065780632eb2c2d6146104265780632fc2d57b1461044657806331afeb311461046657806335b36c441461047957600080fd5b8062fdd58e146102ff57806301ffc9a71461033257806302fe53051461036257806303c15957146103845780630551f3c7146103a457806306fdde03146103c457600080fd5b366102fa577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561030b57600080fd5b5061031f61031a366004614044565b610987565b6040519081526020015b60405180910390f35b34801561033e57600080fd5b5061035261034d366004614221565b610a1e565b6040519015158152602001610329565b34801561036e57600080fd5b5061038261037d36600461425b565b610a49565b005b34801561039057600080fd5b5061038261039f3660046141ff565b610a7f565b3480156103b057600080fd5b506103826103bf366004613f1f565b610b4a565b3480156103d057600080fd5b506103d9610c7f565b60405161032991906145b3565b3480156103f257600080fd5b506103d9610401366004614297565b610d11565b34801561041257600080fd5b50610382610421366004613db4565b610db6565b34801561043257600080fd5b50610382610441366004613e0a565b610ee4565b34801561045257600080fd5b5061038261046136600461434a565b610f74565b610382610474366004614177565b611011565b34801561048557600080fd5b50610382610494366004614297565b611f38565b3480156104a557600080fd5b5061031f60185481565b3480156104bb57600080fd5b506103826104ca366004614297565b611fd4565b3480156104db57600080fd5b5060065461031f565b3480156104f057600080fd5b5061031f6104ff366004613dd1565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801561053657600080fd5b50610382610545366004613dd1565b612003565b34801561055657600080fd5b50610382610565366004614044565b6121eb565b34801561057657600080fd5b5061058a6105853660046140a5565b6123cb565b6040516103299190614572565b3480156105a357600080fd5b5061031f60125481565b3480156105b957600080fd5b5061031f60165481565b3480156105cf57600080fd5b506105e36105de366004614297565b6124f4565b604051610329949392919061487b565b3480156105ff57600080fd5b5061038261060e366004613fa1565b61263c565b34801561061f57600080fd5b50610382612684565b34801561063457600080fd5b5061031f60115481565b34801561064a57600080fd5b506103826106593660046142c9565b6126ba565b34801561066a57600080fd5b5061031f60175481565b34801561068057600080fd5b5061069461068f366004614297565b612763565b6040516001600160a01b039091168152602001610329565b3480156106b857600080fd5b506003546001600160a01b0316610694565b3480156106d657600080fd5b506103d9612793565b3480156106eb57600080fd5b506103826106fa366004614400565b6127a2565b34801561070b57600080fd5b5061031f61071a366004613db4565b6001600160a01b031660009081526009602052604090205490565b34801561074157600080fd5b50610382610750366004614016565b6128ce565b34801561076157600080fd5b506103d96129a5565b34801561077657600080fd5b50610382610785366004614297565b612a33565b34801561079657600080fd5b5061031f60105481565b3480156107ac57600080fd5b5061031f6107bb366004613db4565b6001600160a01b031660009081526008602052604090205490565b3480156107e257600080fd5b5061031f6107f1366004613db4565b6001600160a01b03166000908152600b602052604090205490565b34801561081857600080fd5b5061082c610827366004614297565b612a62565b604051610329939291906148b5565b34801561084757600080fd5b506103d9612b0d565b34801561085c57600080fd5b5060075461031f565b34801561087157600080fd5b5061031f60195481565b34801561088757600080fd5b5061031f600f5481565b34801561089d57600080fd5b506103526108ac366004613dd1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156108e657600080fd5b5061031f6108f5366004613db4565b60156020526000908152604090205481565b34801561091357600080fd5b50610382610922366004613eb7565b612b1a565b34801561093357600080fd5b50610382610942366004613db4565b612b5f565b34801561095357600080fd5b506103826109623660046143bb565b612bf7565b34801561097357600080fd5b50610382610982366004614070565b612d44565b60006001600160a01b0383166109f85760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216630271189760e51b1480610a435750610a4382612d87565b92915050565b6003546001600160a01b03163314610a735760405162461bcd60e51b81526004016109ef906147fe565b610a7c81612dd7565b50565b6003546001600160a01b03163314610aa95760405162461bcd60e51b81526004016109ef906147fe565b8060011415610ab85750600f55565b8060021415610ac75750601055565b8060031415610ad65750601155565b8060041415610ae55750601255565b60405162461bcd60e51b815260206004820152603060248201527f7570646174654d65726b6c65526f6f743a206e756d626572206d75737420626560448201526f0818995d1dd9595b880c48185b99080d60821b60648201526084016109ef565b5050565b60005b83811015610c09573360136000878785818110610b6c57610b6c614a2b565b60209081029290920135835250810191909152604001600020600201546001600160a01b031614610bf75760405162461bcd60e51b815260206004820152602f60248201527f4275726e61626c653a204f6e6c7920616c6c6f7765642066726f6d207265646560448201526e195b58589b194818dbdb9d1c9858dd608a1b60648201526084016109ef565b80610c01816149fa565b915050610b4d565b50610c788585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250612dea92505050565b5050505050565b606060048054610c8e90614993565b80601f0160208091040260200160405190810160405280929190818152602001828054610cba90614993565b8015610d075780601f10610cdc57610100808354040283529160200191610d07565b820191906000526020600020905b815481529060010190602001808311610cea57829003601f168201915b5050505050905090565b6000818152601360205260409020600301805460609190610d3190614993565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5d90614993565b8015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b50505050509050919050565b6001600160a01b038116600090815260086020526040902054610deb5760405162461bcd60e51b81526004016109ef9061469b565b6000610df660075490565b610e0090476148f7565b90506000610e2d8383610e28866001600160a01b031660009081526009602052604090205490565b612df5565b905080610e4c5760405162461bcd60e51b81526004016109ef906146e1565b6001600160a01b03831660009081526009602052604081208054839290610e749084906148f7565b925050819055508060076000828254610e8d91906148f7565b90915550610e9d90508382612e3d565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6001600160a01b038516331480610f005750610f0085336108ac565b610f675760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109ef565b610c788585858585612f56565b6003546001600160a01b03163314610f9e5760405162461bcd60e51b81526004016109ef906147fe565b60008281526013602090815260409091208681558551610fc692600190920191870190613be6565b5060008281526013602090815260409091206002810180546001600160a01b0319166001600160a01b038716179055825161100992600390920191840190613be6565b505050505050565b6000601654116110635760405162461bcd60e51b815260206004820152601960248201527f436c61696d3a20636c61696d696e67206973207061757365640000000000000060448201526064016109ef565b8383600281811061107657611076614a2b565b6003600052601460209081527f63d87a887046e0430be80fdeb014107d7198c879cbf2cddf39a6df195c86cb38546110b5949190920201359150614931565b848460018181106110c8576110c8614a2b565b6002600052601460209081527fa1930aa930426c54c34daad2b9ada7c5d0ef0c96078a3c5bb79f6fa6602c4a7a54611107949190920201359150614931565b8585600081811061111a5761111a614a2b565b6001600052601460209081527fb6c61a840592cc84133e4b25bd509abf4659307c57b160799b38490a5aa48f2c54611159949190920201359150614931565b61116391906148f7565b61116d91906148f7565b3410156111c85760405162461bcd60e51b8152602060048201526024808201527f436c61696d3a20496e73756666696369656e74206574686572207375626d69746044820152633a32b21760e11b60648201526084016109ef565b6000848460008181106111dd576111dd614a2b565b6001600052601460209081527fb6c61a840592cc84133e4b25bd509abf4659307c57b160799b38490a5aa48f2d5461121c949190920201359150614950565b10156112755760405162461bcd60e51b815260206004820152602260248201527f436c61696d3a204e6f7420656e6f7567682062756e646c6531207175616e7469604482015261747960f01b60648201526084016109ef565b60008484600181811061128a5761128a614a2b565b6002600052601460209081527fa1930aa930426c54c34daad2b9ada7c5d0ef0c96078a3c5bb79f6fa6602c4a7b546112c9949190920201359150614950565b10156113225760405162461bcd60e51b815260206004820152602260248201527f436c61696d3a204e6f7420656e6f7567682062756e646c6532207175616e7469604482015261747960f01b60648201526084016109ef565b60008484600281811061133757611337614a2b565b6003600052601460209081527f63d87a887046e0430be80fdeb014107d7198c879cbf2cddf39a6df195c86cb3954611376949190920201359150614950565b10156113cf5760405162461bcd60e51b815260206004820152602260248201527f436c61696d3a204e6f7420656e6f7567682062756e646c6533207175616e7469604482015261747960f01b60648201526084016109ef565b60006016541180156113e357506005601654105b1561184257601854848460028181106113fe576113fe614a2b565b905060200201358585600181811061141857611418614a2b565b905060200201358686600081811061143257611432614a2b565b336000908152601560209081526040909120546114569491909202013591506148f7565b61146091906148f7565b61146a91906148f7565b11156114cf5760405162461bcd60e51b815260206004820152602e60248201527f436c61696d3a205175616e7469746573206578636565642077686974656c697360448201526d3a1036b0bc1030b63637bbb2b21760911b60648201526084016109ef565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050601654600114156115b55761155483838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f5491508490506130f8565b6115b05760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2077686974656c69737420284d65726b6c652050726f6f662031604482015266103330b4b6149760c91b60648201526084016109ef565b6117ad565b6016546002141561165d576116018383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060105491508490506130f8565b6115b05760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2077686974656c69737420284d65726b6c652050726f6f662032604482015266103330b4b6149760c91b60648201526084016109ef565b60165460031415611705576116a98383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060115491508490506130f8565b6115b05760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2077686974656c69737420284d65726b6c652050726f6f662033604482015266103330b4b6149760c91b60648201526084016109ef565b601654600414156117ad576117518383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506130f8565b6117ad5760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2077686974656c69737420284d65726b6c652050726f6f662034604482015266103330b4b6149760c91b60648201526084016109ef565b848460028181106117c0576117c0614a2b565b90506020020135858560018181106117da576117da614a2b565b90506020020135868660008181106117f4576117f4614a2b565b336000908152601560209081526040909120546118189491909202013591506148f7565b61182291906148f7565b61182c91906148f7565b336000908152601560205260409020555061196e565b6016546005141561196e573332146118a85760405162461bcd60e51b815260206004820152602360248201527f6d73672e73656e64657220646f6573206e6f74206d617463682074782e6f726960448201526233b4b760e91b60648201526084016109ef565b601954848460028181106118be576118be614a2b565b90506020020135858560018181106118d8576118d8614a2b565b90506020020135868660008181106118f2576118f2614a2b565b9050602002013561190391906148f7565b61190d91906148f7565b111561196e5760405162461bcd60e51b815260206004820152602a60248201527f436c61696d3a205175616e74697469657320657863656564206d696e74206d616044820152693c1030b63637bbb2b21760b11b60648201526084016109ef565b600160005b60038110156119bd57600086868381811061199057611990614a2b565b9050602002013511156119ab576119a88260026148f7565b91505b806119b5816149fa565b915050611973565b506000816001600160401b038111156119d8576119d8614a41565b604051908082528060200260200182016040528015611a01578160200160208202803683370190505b5090506000826001600160401b03811115611a1e57611a1e614a41565b604051908082528060200260200182016040528015611a47578160200160208202803683370190505b509050600181600081518110611a5f57611a5f614a2b565b60209081029190910101526001600088888281611a7e57611a7e614a2b565b905060200201351115611bf75787876000818110611a9e57611a9e614a2b565b9050602002013583600081518110611ab857611ab8614a2b565b6020026020010151611aca91906148f7565b83600081518110611add57611add614a2b565b60200260200101818152505087876000818110611afc57611afc614a2b565b90506020020135838281518110611b1557611b15614a2b565b6020026020010181815250506002828281518110611b3557611b35614a2b565b6020908102919091010152611b4b6001826148f7565b905087876000818110611b6057611b60614a2b565b90506020020135838281518110611b7957611b79614a2b565b6020026020010181815250506005828281518110611b9957611b99614a2b565b6020908102919091010152611baf6001826148f7565b905087876000818110611bc457611bc4614a2b565b9050602002013560146000600181526020019081526020016000206001016000828254611bf19190614950565b90915550505b600088886001818110611c0c57611c0c614a2b565b905060200201351115611d855787876001818110611c2c57611c2c614a2b565b9050602002013583600081518110611c4657611c46614a2b565b6020026020010151611c5891906148f7565b83600081518110611c6b57611c6b614a2b565b60200260200101818152505087876001818110611c8a57611c8a614a2b565b90506020020135838281518110611ca357611ca3614a2b565b6020026020010181815250506003828281518110611cc357611cc3614a2b565b6020908102919091010152611cd96001826148f7565b905087876001818110611cee57611cee614a2b565b90506020020135838281518110611d0757611d07614a2b565b6020026020010181815250506006828281518110611d2757611d27614a2b565b6020908102919091010152611d3d6001826148f7565b905087876001818110611d5257611d52614a2b565b9050602002013560146000600281526020019081526020016000206001016000828254611d7f9190614950565b90915550505b600088886002818110611d9a57611d9a614a2b565b905060200201351115611f135787876002818110611dba57611dba614a2b565b9050602002013583600081518110611dd457611dd4614a2b565b6020026020010151611de691906148f7565b83600081518110611df957611df9614a2b565b60200260200101818152505087876002818110611e1857611e18614a2b565b90506020020135838281518110611e3157611e31614a2b565b6020026020010181815250506004828281518110611e5157611e51614a2b565b6020908102919091010152611e676001826148f7565b905087876002818110611e7c57611e7c614a2b565b90506020020135838281518110611e9557611e95614a2b565b6020026020010181815250506007828281518110611eb557611eb5614a2b565b6020908102919091010152611ecb6001826148f7565b905087876002818110611ee057611ee0614a2b565b9050602002013560146000600381526020019081526020016000206001016000828254611f0d9190614950565b90915550505b611f2e3383856040518060200160405280600081525061310e565b5050505050505050565b6003546001600160a01b03163314611f625760405162461bcd60e51b81526004016109ef906147fe565b6005811115611fcf5760405162461bcd60e51b815260206004820152603360248201527f75706461746553616c655374617475733a2073616c655374617465206d757374604482015272206265206265747765656e203020616e64203560681b60648201526084016109ef565b601655565b6003546001600160a01b03163314611ffe5760405162461bcd60e51b81526004016109ef906147fe565b601855565b6001600160a01b0381166000908152600860205260409020546120385760405162461bcd60e51b81526004016109ef9061469b565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c891906142b0565b6120d291906148f7565b9050600061210b8383610e2887876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b90508061212a5760405162461bcd60e51b81526004016109ef906146e1565b6001600160a01b038085166000908152600c60209081526040808320938716835292905290812080548392906121619084906148f7565b90915550506001600160a01b0384166000908152600b60205260408120805483929061218e9084906148f7565b9091555061219f905084848361311a565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6003546001600160a01b031633146122155760405162461bcd60e51b81526004016109ef906147fe565b6000816017546122259190614950565b10156122895760405162461bcd60e51b815260206004820152602d60248201527f5175616e74697479206578636565647320617661696c61626c652070726f6d6f60448201526c039903932b6b0b4b734b733971609d1b60648201526084016109ef565b806017600082825461229b9190614950565b909155505060408051600380825260808201909252600091602082016060803683370190505090506001816000815181106122d8576122d8614a2b565b6020026020010181815250506002816001815181106122f9576122f9614a2b565b60200260200101818152505060058160028151811061231a5761231a614a2b565b602090810291909101015260408051600380825260808201909252600091816020016020820280368337019050509050828160008151811061235e5761235e614a2b565b602002602001018181525050828160018151811061237e5761237e614a2b565b602002602001018181525050828160028151811061239e5761239e614a2b565b6020026020010181815250506123c58483836040518060200160405280600081525061310e565b50505050565b606081518351146124305760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016109ef565b600083516001600160401b0381111561244b5761244b614a41565b604051908082528060200260200182016040528015612474578160200160208202803683370190505b50905060005b84518110156124ec576124bf85828151811061249857612498614a2b565b60200260200101518583815181106124b2576124b2614a2b565b6020026020010151610987565b8282815181106124d1576124d1614a2b565b60209081029190910101526124e5816149fa565b905061247a565b509392505050565b6013602052600090815260409020805460018201805491929161251690614993565b80601f016020809104026020016040519081016040528092919081815260200182805461254290614993565b801561258f5780601f106125645761010080835404028352916020019161258f565b820191906000526020600020905b81548152906001019060200180831161257257829003601f168201915b505050600284015460038501805494956001600160a01b039092169491935091506125b990614993565b80601f01602080910402602001604051908101604052809291908181526020018280546125e590614993565b80156126325780601f1061260757610100808354040283529160200191612632565b820191906000526020600020905b81548152906001019060200180831161261557829003601f168201915b5050505050905084565b6001600160a01b038316331480612658575061265883336108ac565b6126745760405162461bcd60e51b81526004016109ef90614652565b61267f838383612dea565b505050565b6003546001600160a01b031633146126ae5760405162461bcd60e51b81526004016109ef906147fe565b6126b8600061316c565b565b6003546001600160a01b031633146126e45760405162461bcd60e51b81526004016109ef906147fe565b600d5460009081526013602090815260409091208581556002810180546001600160a01b0319166001600160a01b0386161790558451909161272d916001840191870190613be6565b5081516127439060038301906020850190613be6565b506001600d600082825461275791906148f7565b90915550505050505050565b6000600a828154811061277857612778614a2b565b6000918252602090912001546001600160a01b031692915050565b606060058054610c8e90614993565b6003546001600160a01b031633146127cc5760405162461bcd60e51b81526004016109ef906147fe565b600084116128345760405162461bcd60e51b815260206004820152602f60248201527f6564697442756e646c653a2062756e646c65207072696365206d75737420626560448201526e02067726561746572207468616e203608c1b60648201526084016109ef565b6000831161289f5760405162461bcd60e51b815260206004820152603260248201527f6564697442756e646c653a2062756e646c65207175616e74697479206d75737460448201527102062652067726561746572207468616e20360741b60648201526084016109ef565b6000818152601460209081526040909120858155600181018590558351610c7892600290920191850190613be6565b336001600160a01b03831614156129395760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016109ef565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600580546129b290614993565b80601f01602080910402602001604051908101604052809291908181526020018280546129de90614993565b8015612a2b5780601f10612a0057610100808354040283529160200191612a2b565b820191906000526020600020905b815481529060010190602001808311612a0e57829003601f168201915b505050505081565b6003546001600160a01b03163314612a5d5760405162461bcd60e51b81526004016109ef906147fe565b601955565b60146020526000908152604090208054600182015460028301805492939192612a8a90614993565b80601f0160208091040260200160405190810160405280929190818152602001828054612ab690614993565b8015612b035780601f10612ad857610100808354040283529160200191612b03565b820191906000526020600020905b815481529060010190602001808311612ae657829003601f168201915b5050505050905083565b600480546129b290614993565b6001600160a01b038516331480612b365750612b3685336108ac565b612b525760405162461bcd60e51b81526004016109ef90614652565b610c7885858585856131be565b6003546001600160a01b03163314612b895760405162461bcd60e51b81526004016109ef906147fe565b6001600160a01b038116612bee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ef565b610a7c8161316c565b6003546001600160a01b03163314612c215760405162461bcd60e51b81526004016109ef906147fe565b60008311612c885760405162461bcd60e51b815260206004820152602e60248201527f61646442756e646c653a2062756e646c65207072696365206d7573742062652060448201526d067726561746572207468616e20360941b60648201526084016109ef565b60008211612cf25760405162461bcd60e51b815260206004820152603160248201527f61646442756e646c653a2062756e646c65207175616e74697479206d75737420604482015270062652067726561746572207468616e203607c1b60648201526084016109ef565b600e5460009081526014602090815260409091208481556001810184905582519091612d25916002840191850190613be6565b506001600e6000828254612d3991906148f7565b909155505050505050565b6001600160a01b038316331480612d605750612d6083336108ac565b612d7c5760405162461bcd60e51b81526004016109ef90614652565b61267f8383836132ea565b60006001600160e01b03198216636cdb3d1360e11b1480612db857506001600160e01b031982166303a24d0760e21b145b80610a4357506301ffc9a760e01b6001600160e01b0319831614610a43565b8051610b46906002906020840190613be6565b61267f8383836132f5565b6006546001600160a01b03841660009081526008602052604081205490918391612e1f9086614931565b612e29919061490f565b612e339190614950565b90505b9392505050565b80471015612e8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612eda576040519150601f19603f3d011682016040523d82523d6000602084013e612edf565b606091505b505090508061267f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ef565b8151835114612f775760405162461bcd60e51b81526004016109ef90614833565b6001600160a01b038416612f9d5760405162461bcd60e51b81526004016109ef9061472c565b33612fac818787878787613483565b60005b8451811015613092576000858281518110612fcc57612fcc614a2b565b602002602001015190506000858381518110612fea57612fea614a2b565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561303a5760405162461bcd60e51b81526004016109ef906147b4565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906130779084906148f7565b925050819055505050508061308b906149fa565b9050612faf565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516130e2929190614585565b60405180910390a4611009818787878787613488565b60008261310585846135f3565b14949350505050565b6123c58484848461365f565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261267f9084906137f3565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166131e45760405162461bcd60e51b81526004016109ef9061472c565b336132038187876131f4886138c5565b6131fd886138c5565b87613483565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156132445760405162461bcd60e51b81526004016109ef906147b4565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906132819084906148f7565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46132e1828888888888613910565b50505050505050565b61267f8383836139da565b6001600160a01b03831661331b5760405162461bcd60e51b81526004016109ef90614771565b805182511461333c5760405162461bcd60e51b81526004016109ef90614833565b600033905061335f81856000868660405180602001604052806000815250613483565b60005b835181101561342457600084828151811061337f5761337f614a2b565b60200260200101519050600084838151811061339d5761339d614a2b565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156133ed5760405162461bcd60e51b81526004016109ef9061460e565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061341c816149fa565b915050613362565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051613475929190614585565b60405180910390a450505050565b611009565b6001600160a01b0384163b156110095760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906134cc90899089908890889088906004016144da565b602060405180830381600087803b1580156134e657600080fd5b505af1925050508015613516575060408051601f3d908101601f191682019092526135139181019061423e565b60015b6135c357613522614a57565b806308c379a0141561355c5750613537614a73565b80613542575061355e565b8060405162461bcd60e51b81526004016109ef91906145b3565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016109ef565b6001600160e01b0319811663bc197c8160e01b146132e15760405162461bcd60e51b81526004016109ef906145c6565b600081815b84518110156124ec57600085828151811061361557613615614a2b565b6020026020010151905080831161363b576000838152602082905260409020925061364c565b600081815260208490526040902092505b5080613657816149fa565b9150506135f8565b6001600160a01b0384166136bf5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109ef565b81518351146136e05760405162461bcd60e51b81526004016109ef90614833565b336136f081600087878787613483565b60005b845181101561378b5783818151811061370e5761370e614a2b565b602002602001015160008087848151811061372b5761372b614a2b565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461377391906148f7565b90915550819050613783816149fa565b9150506136f3565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516137dc929190614585565b60405180910390a4610c7881600087878787613488565b6000613848826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613adb9092919063ffffffff16565b80519091501561267f578080602001905181019061386691906141e2565b61267f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109ef565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106138ff576138ff614a2b565b602090810291909101015292915050565b6001600160a01b0384163b156110095760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906139549089908990889088908890600401614538565b602060405180830381600087803b15801561396e57600080fd5b505af192505050801561399e575060408051601f3d908101601f1916820190925261399b9181019061423e565b60015b6139aa57613522614a57565b6001600160e01b0319811663f23a6e6160e01b146132e15760405162461bcd60e51b81526004016109ef906145c6565b6001600160a01b038316613a005760405162461bcd60e51b81526004016109ef90614771565b33613a2f81856000613a11876138c5565b613a1a876138c5565b60405180602001604052806000815250613483565b6000838152602081815260408083206001600160a01b038816845290915290205482811015613a705760405162461bcd60e51b81526004016109ef9061460e565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6060612e33848460008585843b613b345760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ef565b600080866001600160a01b03168587604051613b5091906144be565b60006040518083038185875af1925050503d8060008114613b8d576040519150601f19603f3d011682016040523d82523d6000602084013e613b92565b606091505b5091509150613ba2828286613bad565b979650505050505050565b60608315613bbc575081612e36565b825115613bcc5782518084602001fd5b8160405162461bcd60e51b81526004016109ef91906145b3565b828054613bf290614993565b90600052602060002090601f016020900481019282613c145760008555613c5a565b82601f10613c2d57805160ff1916838001178555613c5a565b82800160010185558215613c5a579182015b82811115613c5a578251825591602001919060010190613c3f565b50613c66929150613c6a565b5090565b5b80821115613c665760008155600101613c6b565b60008083601f840112613c9157600080fd5b5081356001600160401b03811115613ca857600080fd5b6020830191508360208260051b8501011115613cc357600080fd5b9250929050565b600082601f830112613cdb57600080fd5b81356020613ce8826148d4565b604051613cf582826149ce565b8381528281019150858301600585901b87018401881015613d1557600080fd5b60005b85811015613d3457813584529284019290840190600101613d18565b5090979650505050505050565b600082601f830112613d5257600080fd5b81356001600160401b03811115613d6b57613d6b614a41565b604051613d82601f8301601f1916602001826149ce565b818152846020838601011115613d9757600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215613dc657600080fd5b8135612e3681614afc565b60008060408385031215613de457600080fd5b8235613def81614afc565b91506020830135613dff81614afc565b809150509250929050565b600080600080600060a08688031215613e2257600080fd5b8535613e2d81614afc565b94506020860135613e3d81614afc565b935060408601356001600160401b0380821115613e5957600080fd5b613e6589838a01613cca565b94506060880135915080821115613e7b57600080fd5b613e8789838a01613cca565b93506080880135915080821115613e9d57600080fd5b50613eaa88828901613d41565b9150509295509295909350565b600080600080600060a08688031215613ecf57600080fd5b8535613eda81614afc565b94506020860135613eea81614afc565b9350604086013592506060860135915060808601356001600160401b03811115613f1357600080fd5b613eaa88828901613d41565b600080600080600060608688031215613f3757600080fd5b8535613f4281614afc565b945060208601356001600160401b0380821115613f5e57600080fd5b613f6a89838a01613c7f565b90965094506040880135915080821115613f8357600080fd5b50613f9088828901613c7f565b969995985093965092949392505050565b600080600060608486031215613fb657600080fd5b8335613fc181614afc565b925060208401356001600160401b0380821115613fdd57600080fd5b613fe987838801613cca565b93506040860135915080821115613fff57600080fd5b5061400c86828701613cca565b9150509250925092565b6000806040838503121561402957600080fd5b823561403481614afc565b91506020830135613dff81614b11565b6000806040838503121561405757600080fd5b823561406281614afc565b946020939093013593505050565b60008060006060848603121561408557600080fd5b833561409081614afc565b95602085013595506040909401359392505050565b600080604083850312156140b857600080fd5b82356001600160401b03808211156140cf57600080fd5b818501915085601f8301126140e357600080fd5b813560206140f0826148d4565b6040516140fd82826149ce565b8381528281019150858301600585901b870184018b101561411d57600080fd5b600096505b8487101561414957803561413581614afc565b835260019690960195918301918301614122565b509650508601359250508082111561416057600080fd5b5061416d85828601613cca565b9150509250929050565b6000806000806040858703121561418d57600080fd5b84356001600160401b03808211156141a457600080fd5b6141b088838901613c7f565b909650945060208701359150808211156141c957600080fd5b506141d687828801613c7f565b95989497509550505050565b6000602082840312156141f457600080fd5b8151612e3681614b11565b6000806040838503121561421257600080fd5b50508035926020909101359150565b60006020828403121561423357600080fd5b8135612e3681614b1f565b60006020828403121561425057600080fd5b8151612e3681614b1f565b60006020828403121561426d57600080fd5b81356001600160401b0381111561428357600080fd5b61428f84828501613d41565b949350505050565b6000602082840312156142a957600080fd5b5035919050565b6000602082840312156142c257600080fd5b5051919050565b600080600080608085870312156142df57600080fd5b8435935060208501356001600160401b03808211156142fd57600080fd5b61430988838901613d41565b94506040870135915061431b82614afc565b9092506060860135908082111561433157600080fd5b5061433e87828801613d41565b91505092959194509250565b600080600080600060a0868803121561436257600080fd5b8535945060208601356001600160401b038082111561438057600080fd5b61438c89838a01613d41565b95506040880135915061439e82614afc565b9093506060870135925060808701359080821115613e9d57600080fd5b6000806000606084860312156143d057600080fd5b833592506020840135915060408401356001600160401b038111156143f457600080fd5b61400c86828701613d41565b6000806000806080858703121561441657600080fd5b843593506020850135925060408501356001600160401b0381111561443a57600080fd5b61444687828801613d41565b949793965093946060013593505050565b600081518084526020808501945080840160005b838110156144875781518752958201959082019060010161446b565b509495945050505050565b600081518084526144aa816020860160208601614967565b601f01601f19169290920160200192915050565b600082516144d0818460208701614967565b9190910192915050565b6001600160a01b0386811682528516602082015260a06040820181905260009061450690830186614457565b82810360608401526145188186614457565b9050828103608084015261452c8185614492565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613ba290830184614492565b602081526000612e366020830184614457565b6040815260006145986040830185614457565b82810360208401526145aa8185614457565b95945050505050565b602081526000612e366020830184614492565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b8481526080602082015260006148946080830186614492565b6001600160a01b03851660408401528281036060840152613ba28185614492565b8381528260208201526060604082015260006145aa6060830184614492565b60006001600160401b038211156148ed576148ed614a41565b5060051b60200190565b6000821982111561490a5761490a614a15565b500190565b60008261492c57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561494b5761494b614a15565b500290565b60008282101561496257614962614a15565b500390565b60005b8381101561498257818101518382015260200161496a565b838111156123c55750506000910152565b600181811c908216806149a757607f821691505b602082108114156149c857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b03811182821017156149f3576149f3614a41565b6040525050565b6000600019821415614a0e57614a0e614a15565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115614a705760046000803e5060005160e01c5b90565b600060443d1015614a815790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715614ab057505050505090565b8285019150815181811115614ac85750505050505090565b843d8701016020828501011115614ae25750505050505090565b614af1602082860101876149ce565b509095945050505050565b6001600160a01b0381168114610a7c57600080fd5b8015158114610a7c57600080fd5b6001600160e01b031981168114610a7c57600080fdfea26469706673582212207a5841cbfa628809987a6f14af662fc6ba3924d3621c236e3f869dc90dbd6b8264736f6c6343000807003368747470733a2f2f6d696e742e323131322e72756e2f746f6b656e732f322e6a736f6e68747470733a2f2f6d696e742e323131322e72756e2f746f6b656e732f362e6a736f6e68747470733a2f2f6d696e742e323131322e72756e2f746f6b656e732f352e6a736f6e68747470733a2f2f6d696e742e323131322e72756e2f746f6b656e732f332e6a736f6e68747470733a2f2f6d696e742e323131322e72756e2f746f6b656e732f372e6a736f6e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657268747470733a2f2f6d696e742e323131322e72756e2f746f6b656e732f312e6a736f6e68747470733a2f2f6d696e742e323131322e72756e2f746f6b656e732f342e6a736f6e000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000013323131322e72756e20726f6f745061737365730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063231313252500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000b67cff4856e87a4c72eb709c39e905496aa1d58e000000000000000000000000881ff3dadfb3fcf5caf7126bb563eea69a06d190000000000000000000000000d06d724318477c4e35acff3a8eff08b47b1264fc0000000000000000000000005f0486ef247e87294351a6d4084d3905c4782c5900000000000000000000000049ab91da7377baa4781b93962567f3761938bb3a00000000000000000000000099b02494e79669a1b868fc376f03fe83ff99072b0000000000000000000000006702098b322dd40e737fe865c863c0b1b3773b8b00000000000000000000000086c7aaac741e4febd00ac21166840aef16bdaace0000000000000000000000003a3c4fc711e046f97a111b6f98a3f99558a2c5b5000000000000000000000000ac163e163ba61451faf11029816686819b3cd1e5000000000000000000000000982e09ebd5bf6f4f9cce5d0c84514fb96d91c5f9000000000000000000000000a442ddf27063320789b59a8fdca5b849cd2cdeac000000000000000000000000a9c1afd0e18737fa1bb902ea067bff1c2e0d4a25000000000000000000000000583b3f844e296b8cbce95d5dc49c84f5d07c92e6000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001d

Deployed Bytecode

0x6080604052600436106102b15760003560e01c806373025b2011610175578063ce7c2ac2116100dc578063e64710e611610095578063f242432a1161006f578063f242432a14610907578063f2fde38b14610927578063f4bba2f514610947578063f5298aca1461096757600080fd5b8063e64710e61461087b578063e985e9c514610891578063eb73900b146108da57600080fd5b8063ce7c2ac2146107a0578063d79779b2146107d6578063d7d6f3b51461080c578063e2b9e1861461083b578063e33b7de314610850578063e527c6dd1461086557600080fd5b806395e0f8c71161012e57806395e0f8c7146106df5780639852595c146106ff578063a22cb46514610735578063af17dea614610755578063b747172a1461076a578063ca34adf01461078a57600080fd5b806373025b201461062857806374b23e461461063e5780637d3a2bb41461065e5780638b83209b146106745780638da5cb5b146106ac57806395d89b41146106ca57600080fd5b806337c349dc116102195780634e1273f4116101d25780634e1273f41461056a5780635c58355d14610597578063603f4d52146105ad578063622f3a46146105c35780636b20c454146105f3578063715018a61461061357600080fd5b806337c349dc1461049957806339304c5e146104af5780633a98ef39146104cf578063406072a9146104e457806348b750441461052a5780634a32d7b51461054a57600080fd5b80630e89341c1161026b5780630e89341c146103e657806319165587146104065780632eb2c2d6146104265780632fc2d57b1461044657806331afeb311461046657806335b36c441461047957600080fd5b8062fdd58e146102ff57806301ffc9a71461033257806302fe53051461036257806303c15957146103845780630551f3c7146103a457806306fdde03146103c457600080fd5b366102fa577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561030b57600080fd5b5061031f61031a366004614044565b610987565b6040519081526020015b60405180910390f35b34801561033e57600080fd5b5061035261034d366004614221565b610a1e565b6040519015158152602001610329565b34801561036e57600080fd5b5061038261037d36600461425b565b610a49565b005b34801561039057600080fd5b5061038261039f3660046141ff565b610a7f565b3480156103b057600080fd5b506103826103bf366004613f1f565b610b4a565b3480156103d057600080fd5b506103d9610c7f565b60405161032991906145b3565b3480156103f257600080fd5b506103d9610401366004614297565b610d11565b34801561041257600080fd5b50610382610421366004613db4565b610db6565b34801561043257600080fd5b50610382610441366004613e0a565b610ee4565b34801561045257600080fd5b5061038261046136600461434a565b610f74565b610382610474366004614177565b611011565b34801561048557600080fd5b50610382610494366004614297565b611f38565b3480156104a557600080fd5b5061031f60185481565b3480156104bb57600080fd5b506103826104ca366004614297565b611fd4565b3480156104db57600080fd5b5060065461031f565b3480156104f057600080fd5b5061031f6104ff366004613dd1565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801561053657600080fd5b50610382610545366004613dd1565b612003565b34801561055657600080fd5b50610382610565366004614044565b6121eb565b34801561057657600080fd5b5061058a6105853660046140a5565b6123cb565b6040516103299190614572565b3480156105a357600080fd5b5061031f60125481565b3480156105b957600080fd5b5061031f60165481565b3480156105cf57600080fd5b506105e36105de366004614297565b6124f4565b604051610329949392919061487b565b3480156105ff57600080fd5b5061038261060e366004613fa1565b61263c565b34801561061f57600080fd5b50610382612684565b34801561063457600080fd5b5061031f60115481565b34801561064a57600080fd5b506103826106593660046142c9565b6126ba565b34801561066a57600080fd5b5061031f60175481565b34801561068057600080fd5b5061069461068f366004614297565b612763565b6040516001600160a01b039091168152602001610329565b3480156106b857600080fd5b506003546001600160a01b0316610694565b3480156106d657600080fd5b506103d9612793565b3480156106eb57600080fd5b506103826106fa366004614400565b6127a2565b34801561070b57600080fd5b5061031f61071a366004613db4565b6001600160a01b031660009081526009602052604090205490565b34801561074157600080fd5b50610382610750366004614016565b6128ce565b34801561076157600080fd5b506103d96129a5565b34801561077657600080fd5b50610382610785366004614297565b612a33565b34801561079657600080fd5b5061031f60105481565b3480156107ac57600080fd5b5061031f6107bb366004613db4565b6001600160a01b031660009081526008602052604090205490565b3480156107e257600080fd5b5061031f6107f1366004613db4565b6001600160a01b03166000908152600b602052604090205490565b34801561081857600080fd5b5061082c610827366004614297565b612a62565b604051610329939291906148b5565b34801561084757600080fd5b506103d9612b0d565b34801561085c57600080fd5b5060075461031f565b34801561087157600080fd5b5061031f60195481565b34801561088757600080fd5b5061031f600f5481565b34801561089d57600080fd5b506103526108ac366004613dd1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156108e657600080fd5b5061031f6108f5366004613db4565b60156020526000908152604090205481565b34801561091357600080fd5b50610382610922366004613eb7565b612b1a565b34801561093357600080fd5b50610382610942366004613db4565b612b5f565b34801561095357600080fd5b506103826109623660046143bb565b612bf7565b34801561097357600080fd5b50610382610982366004614070565b612d44565b60006001600160a01b0383166109f85760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216630271189760e51b1480610a435750610a4382612d87565b92915050565b6003546001600160a01b03163314610a735760405162461bcd60e51b81526004016109ef906147fe565b610a7c81612dd7565b50565b6003546001600160a01b03163314610aa95760405162461bcd60e51b81526004016109ef906147fe565b8060011415610ab85750600f55565b8060021415610ac75750601055565b8060031415610ad65750601155565b8060041415610ae55750601255565b60405162461bcd60e51b815260206004820152603060248201527f7570646174654d65726b6c65526f6f743a206e756d626572206d75737420626560448201526f0818995d1dd9595b880c48185b99080d60821b60648201526084016109ef565b5050565b60005b83811015610c09573360136000878785818110610b6c57610b6c614a2b565b60209081029290920135835250810191909152604001600020600201546001600160a01b031614610bf75760405162461bcd60e51b815260206004820152602f60248201527f4275726e61626c653a204f6e6c7920616c6c6f7765642066726f6d207265646560448201526e195b58589b194818dbdb9d1c9858dd608a1b60648201526084016109ef565b80610c01816149fa565b915050610b4d565b50610c788585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250612dea92505050565b5050505050565b606060048054610c8e90614993565b80601f0160208091040260200160405190810160405280929190818152602001828054610cba90614993565b8015610d075780601f10610cdc57610100808354040283529160200191610d07565b820191906000526020600020905b815481529060010190602001808311610cea57829003601f168201915b5050505050905090565b6000818152601360205260409020600301805460609190610d3190614993565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5d90614993565b8015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b50505050509050919050565b6001600160a01b038116600090815260086020526040902054610deb5760405162461bcd60e51b81526004016109ef9061469b565b6000610df660075490565b610e0090476148f7565b90506000610e2d8383610e28866001600160a01b031660009081526009602052604090205490565b612df5565b905080610e4c5760405162461bcd60e51b81526004016109ef906146e1565b6001600160a01b03831660009081526009602052604081208054839290610e749084906148f7565b925050819055508060076000828254610e8d91906148f7565b90915550610e9d90508382612e3d565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6001600160a01b038516331480610f005750610f0085336108ac565b610f675760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109ef565b610c788585858585612f56565b6003546001600160a01b03163314610f9e5760405162461bcd60e51b81526004016109ef906147fe565b60008281526013602090815260409091208681558551610fc692600190920191870190613be6565b5060008281526013602090815260409091206002810180546001600160a01b0319166001600160a01b038716179055825161100992600390920191840190613be6565b505050505050565b6000601654116110635760405162461bcd60e51b815260206004820152601960248201527f436c61696d3a20636c61696d696e67206973207061757365640000000000000060448201526064016109ef565b8383600281811061107657611076614a2b565b6003600052601460209081527f63d87a887046e0430be80fdeb014107d7198c879cbf2cddf39a6df195c86cb38546110b5949190920201359150614931565b848460018181106110c8576110c8614a2b565b6002600052601460209081527fa1930aa930426c54c34daad2b9ada7c5d0ef0c96078a3c5bb79f6fa6602c4a7a54611107949190920201359150614931565b8585600081811061111a5761111a614a2b565b6001600052601460209081527fb6c61a840592cc84133e4b25bd509abf4659307c57b160799b38490a5aa48f2c54611159949190920201359150614931565b61116391906148f7565b61116d91906148f7565b3410156111c85760405162461bcd60e51b8152602060048201526024808201527f436c61696d3a20496e73756666696369656e74206574686572207375626d69746044820152633a32b21760e11b60648201526084016109ef565b6000848460008181106111dd576111dd614a2b565b6001600052601460209081527fb6c61a840592cc84133e4b25bd509abf4659307c57b160799b38490a5aa48f2d5461121c949190920201359150614950565b10156112755760405162461bcd60e51b815260206004820152602260248201527f436c61696d3a204e6f7420656e6f7567682062756e646c6531207175616e7469604482015261747960f01b60648201526084016109ef565b60008484600181811061128a5761128a614a2b565b6002600052601460209081527fa1930aa930426c54c34daad2b9ada7c5d0ef0c96078a3c5bb79f6fa6602c4a7b546112c9949190920201359150614950565b10156113225760405162461bcd60e51b815260206004820152602260248201527f436c61696d3a204e6f7420656e6f7567682062756e646c6532207175616e7469604482015261747960f01b60648201526084016109ef565b60008484600281811061133757611337614a2b565b6003600052601460209081527f63d87a887046e0430be80fdeb014107d7198c879cbf2cddf39a6df195c86cb3954611376949190920201359150614950565b10156113cf5760405162461bcd60e51b815260206004820152602260248201527f436c61696d3a204e6f7420656e6f7567682062756e646c6533207175616e7469604482015261747960f01b60648201526084016109ef565b60006016541180156113e357506005601654105b1561184257601854848460028181106113fe576113fe614a2b565b905060200201358585600181811061141857611418614a2b565b905060200201358686600081811061143257611432614a2b565b336000908152601560209081526040909120546114569491909202013591506148f7565b61146091906148f7565b61146a91906148f7565b11156114cf5760405162461bcd60e51b815260206004820152602e60248201527f436c61696d3a205175616e7469746573206578636565642077686974656c697360448201526d3a1036b0bc1030b63637bbb2b21760911b60648201526084016109ef565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050601654600114156115b55761155483838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f5491508490506130f8565b6115b05760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2077686974656c69737420284d65726b6c652050726f6f662031604482015266103330b4b6149760c91b60648201526084016109ef565b6117ad565b6016546002141561165d576116018383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060105491508490506130f8565b6115b05760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2077686974656c69737420284d65726b6c652050726f6f662032604482015266103330b4b6149760c91b60648201526084016109ef565b60165460031415611705576116a98383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060115491508490506130f8565b6115b05760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2077686974656c69737420284d65726b6c652050726f6f662033604482015266103330b4b6149760c91b60648201526084016109ef565b601654600414156117ad576117518383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506130f8565b6117ad5760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2077686974656c69737420284d65726b6c652050726f6f662034604482015266103330b4b6149760c91b60648201526084016109ef565b848460028181106117c0576117c0614a2b565b90506020020135858560018181106117da576117da614a2b565b90506020020135868660008181106117f4576117f4614a2b565b336000908152601560209081526040909120546118189491909202013591506148f7565b61182291906148f7565b61182c91906148f7565b336000908152601560205260409020555061196e565b6016546005141561196e573332146118a85760405162461bcd60e51b815260206004820152602360248201527f6d73672e73656e64657220646f6573206e6f74206d617463682074782e6f726960448201526233b4b760e91b60648201526084016109ef565b601954848460028181106118be576118be614a2b565b90506020020135858560018181106118d8576118d8614a2b565b90506020020135868660008181106118f2576118f2614a2b565b9050602002013561190391906148f7565b61190d91906148f7565b111561196e5760405162461bcd60e51b815260206004820152602a60248201527f436c61696d3a205175616e74697469657320657863656564206d696e74206d616044820152693c1030b63637bbb2b21760b11b60648201526084016109ef565b600160005b60038110156119bd57600086868381811061199057611990614a2b565b9050602002013511156119ab576119a88260026148f7565b91505b806119b5816149fa565b915050611973565b506000816001600160401b038111156119d8576119d8614a41565b604051908082528060200260200182016040528015611a01578160200160208202803683370190505b5090506000826001600160401b03811115611a1e57611a1e614a41565b604051908082528060200260200182016040528015611a47578160200160208202803683370190505b509050600181600081518110611a5f57611a5f614a2b565b60209081029190910101526001600088888281611a7e57611a7e614a2b565b905060200201351115611bf75787876000818110611a9e57611a9e614a2b565b9050602002013583600081518110611ab857611ab8614a2b565b6020026020010151611aca91906148f7565b83600081518110611add57611add614a2b565b60200260200101818152505087876000818110611afc57611afc614a2b565b90506020020135838281518110611b1557611b15614a2b565b6020026020010181815250506002828281518110611b3557611b35614a2b565b6020908102919091010152611b4b6001826148f7565b905087876000818110611b6057611b60614a2b565b90506020020135838281518110611b7957611b79614a2b565b6020026020010181815250506005828281518110611b9957611b99614a2b565b6020908102919091010152611baf6001826148f7565b905087876000818110611bc457611bc4614a2b565b9050602002013560146000600181526020019081526020016000206001016000828254611bf19190614950565b90915550505b600088886001818110611c0c57611c0c614a2b565b905060200201351115611d855787876001818110611c2c57611c2c614a2b565b9050602002013583600081518110611c4657611c46614a2b565b6020026020010151611c5891906148f7565b83600081518110611c6b57611c6b614a2b565b60200260200101818152505087876001818110611c8a57611c8a614a2b565b90506020020135838281518110611ca357611ca3614a2b565b6020026020010181815250506003828281518110611cc357611cc3614a2b565b6020908102919091010152611cd96001826148f7565b905087876001818110611cee57611cee614a2b565b90506020020135838281518110611d0757611d07614a2b565b6020026020010181815250506006828281518110611d2757611d27614a2b565b6020908102919091010152611d3d6001826148f7565b905087876001818110611d5257611d52614a2b565b9050602002013560146000600281526020019081526020016000206001016000828254611d7f9190614950565b90915550505b600088886002818110611d9a57611d9a614a2b565b905060200201351115611f135787876002818110611dba57611dba614a2b565b9050602002013583600081518110611dd457611dd4614a2b565b6020026020010151611de691906148f7565b83600081518110611df957611df9614a2b565b60200260200101818152505087876002818110611e1857611e18614a2b565b90506020020135838281518110611e3157611e31614a2b565b6020026020010181815250506004828281518110611e5157611e51614a2b565b6020908102919091010152611e676001826148f7565b905087876002818110611e7c57611e7c614a2b565b90506020020135838281518110611e9557611e95614a2b565b6020026020010181815250506007828281518110611eb557611eb5614a2b565b6020908102919091010152611ecb6001826148f7565b905087876002818110611ee057611ee0614a2b565b9050602002013560146000600381526020019081526020016000206001016000828254611f0d9190614950565b90915550505b611f2e3383856040518060200160405280600081525061310e565b5050505050505050565b6003546001600160a01b03163314611f625760405162461bcd60e51b81526004016109ef906147fe565b6005811115611fcf5760405162461bcd60e51b815260206004820152603360248201527f75706461746553616c655374617475733a2073616c655374617465206d757374604482015272206265206265747765656e203020616e64203560681b60648201526084016109ef565b601655565b6003546001600160a01b03163314611ffe5760405162461bcd60e51b81526004016109ef906147fe565b601855565b6001600160a01b0381166000908152600860205260409020546120385760405162461bcd60e51b81526004016109ef9061469b565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c891906142b0565b6120d291906148f7565b9050600061210b8383610e2887876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b90508061212a5760405162461bcd60e51b81526004016109ef906146e1565b6001600160a01b038085166000908152600c60209081526040808320938716835292905290812080548392906121619084906148f7565b90915550506001600160a01b0384166000908152600b60205260408120805483929061218e9084906148f7565b9091555061219f905084848361311a565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6003546001600160a01b031633146122155760405162461bcd60e51b81526004016109ef906147fe565b6000816017546122259190614950565b10156122895760405162461bcd60e51b815260206004820152602d60248201527f5175616e74697479206578636565647320617661696c61626c652070726f6d6f60448201526c039903932b6b0b4b734b733971609d1b60648201526084016109ef565b806017600082825461229b9190614950565b909155505060408051600380825260808201909252600091602082016060803683370190505090506001816000815181106122d8576122d8614a2b565b6020026020010181815250506002816001815181106122f9576122f9614a2b565b60200260200101818152505060058160028151811061231a5761231a614a2b565b602090810291909101015260408051600380825260808201909252600091816020016020820280368337019050509050828160008151811061235e5761235e614a2b565b602002602001018181525050828160018151811061237e5761237e614a2b565b602002602001018181525050828160028151811061239e5761239e614a2b565b6020026020010181815250506123c58483836040518060200160405280600081525061310e565b50505050565b606081518351146124305760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016109ef565b600083516001600160401b0381111561244b5761244b614a41565b604051908082528060200260200182016040528015612474578160200160208202803683370190505b50905060005b84518110156124ec576124bf85828151811061249857612498614a2b565b60200260200101518583815181106124b2576124b2614a2b565b6020026020010151610987565b8282815181106124d1576124d1614a2b565b60209081029190910101526124e5816149fa565b905061247a565b509392505050565b6013602052600090815260409020805460018201805491929161251690614993565b80601f016020809104026020016040519081016040528092919081815260200182805461254290614993565b801561258f5780601f106125645761010080835404028352916020019161258f565b820191906000526020600020905b81548152906001019060200180831161257257829003601f168201915b505050600284015460038501805494956001600160a01b039092169491935091506125b990614993565b80601f01602080910402602001604051908101604052809291908181526020018280546125e590614993565b80156126325780601f1061260757610100808354040283529160200191612632565b820191906000526020600020905b81548152906001019060200180831161261557829003601f168201915b5050505050905084565b6001600160a01b038316331480612658575061265883336108ac565b6126745760405162461bcd60e51b81526004016109ef90614652565b61267f838383612dea565b505050565b6003546001600160a01b031633146126ae5760405162461bcd60e51b81526004016109ef906147fe565b6126b8600061316c565b565b6003546001600160a01b031633146126e45760405162461bcd60e51b81526004016109ef906147fe565b600d5460009081526013602090815260409091208581556002810180546001600160a01b0319166001600160a01b0386161790558451909161272d916001840191870190613be6565b5081516127439060038301906020850190613be6565b506001600d600082825461275791906148f7565b90915550505050505050565b6000600a828154811061277857612778614a2b565b6000918252602090912001546001600160a01b031692915050565b606060058054610c8e90614993565b6003546001600160a01b031633146127cc5760405162461bcd60e51b81526004016109ef906147fe565b600084116128345760405162461bcd60e51b815260206004820152602f60248201527f6564697442756e646c653a2062756e646c65207072696365206d75737420626560448201526e02067726561746572207468616e203608c1b60648201526084016109ef565b6000831161289f5760405162461bcd60e51b815260206004820152603260248201527f6564697442756e646c653a2062756e646c65207175616e74697479206d75737460448201527102062652067726561746572207468616e20360741b60648201526084016109ef565b6000818152601460209081526040909120858155600181018590558351610c7892600290920191850190613be6565b336001600160a01b03831614156129395760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016109ef565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600580546129b290614993565b80601f01602080910402602001604051908101604052809291908181526020018280546129de90614993565b8015612a2b5780601f10612a0057610100808354040283529160200191612a2b565b820191906000526020600020905b815481529060010190602001808311612a0e57829003601f168201915b505050505081565b6003546001600160a01b03163314612a5d5760405162461bcd60e51b81526004016109ef906147fe565b601955565b60146020526000908152604090208054600182015460028301805492939192612a8a90614993565b80601f0160208091040260200160405190810160405280929190818152602001828054612ab690614993565b8015612b035780601f10612ad857610100808354040283529160200191612b03565b820191906000526020600020905b815481529060010190602001808311612ae657829003601f168201915b5050505050905083565b600480546129b290614993565b6001600160a01b038516331480612b365750612b3685336108ac565b612b525760405162461bcd60e51b81526004016109ef90614652565b610c7885858585856131be565b6003546001600160a01b03163314612b895760405162461bcd60e51b81526004016109ef906147fe565b6001600160a01b038116612bee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ef565b610a7c8161316c565b6003546001600160a01b03163314612c215760405162461bcd60e51b81526004016109ef906147fe565b60008311612c885760405162461bcd60e51b815260206004820152602e60248201527f61646442756e646c653a2062756e646c65207072696365206d7573742062652060448201526d067726561746572207468616e20360941b60648201526084016109ef565b60008211612cf25760405162461bcd60e51b815260206004820152603160248201527f61646442756e646c653a2062756e646c65207175616e74697479206d75737420604482015270062652067726561746572207468616e203607c1b60648201526084016109ef565b600e5460009081526014602090815260409091208481556001810184905582519091612d25916002840191850190613be6565b506001600e6000828254612d3991906148f7565b909155505050505050565b6001600160a01b038316331480612d605750612d6083336108ac565b612d7c5760405162461bcd60e51b81526004016109ef90614652565b61267f8383836132ea565b60006001600160e01b03198216636cdb3d1360e11b1480612db857506001600160e01b031982166303a24d0760e21b145b80610a4357506301ffc9a760e01b6001600160e01b0319831614610a43565b8051610b46906002906020840190613be6565b61267f8383836132f5565b6006546001600160a01b03841660009081526008602052604081205490918391612e1f9086614931565b612e29919061490f565b612e339190614950565b90505b9392505050565b80471015612e8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612eda576040519150601f19603f3d011682016040523d82523d6000602084013e612edf565b606091505b505090508061267f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ef565b8151835114612f775760405162461bcd60e51b81526004016109ef90614833565b6001600160a01b038416612f9d5760405162461bcd60e51b81526004016109ef9061472c565b33612fac818787878787613483565b60005b8451811015613092576000858281518110612fcc57612fcc614a2b565b602002602001015190506000858381518110612fea57612fea614a2b565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561303a5760405162461bcd60e51b81526004016109ef906147b4565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906130779084906148f7565b925050819055505050508061308b906149fa565b9050612faf565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516130e2929190614585565b60405180910390a4611009818787878787613488565b60008261310585846135f3565b14949350505050565b6123c58484848461365f565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261267f9084906137f3565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166131e45760405162461bcd60e51b81526004016109ef9061472c565b336132038187876131f4886138c5565b6131fd886138c5565b87613483565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156132445760405162461bcd60e51b81526004016109ef906147b4565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906132819084906148f7565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46132e1828888888888613910565b50505050505050565b61267f8383836139da565b6001600160a01b03831661331b5760405162461bcd60e51b81526004016109ef90614771565b805182511461333c5760405162461bcd60e51b81526004016109ef90614833565b600033905061335f81856000868660405180602001604052806000815250613483565b60005b835181101561342457600084828151811061337f5761337f614a2b565b60200260200101519050600084838151811061339d5761339d614a2b565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156133ed5760405162461bcd60e51b81526004016109ef9061460e565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061341c816149fa565b915050613362565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051613475929190614585565b60405180910390a450505050565b611009565b6001600160a01b0384163b156110095760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906134cc90899089908890889088906004016144da565b602060405180830381600087803b1580156134e657600080fd5b505af1925050508015613516575060408051601f3d908101601f191682019092526135139181019061423e565b60015b6135c357613522614a57565b806308c379a0141561355c5750613537614a73565b80613542575061355e565b8060405162461bcd60e51b81526004016109ef91906145b3565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016109ef565b6001600160e01b0319811663bc197c8160e01b146132e15760405162461bcd60e51b81526004016109ef906145c6565b600081815b84518110156124ec57600085828151811061361557613615614a2b565b6020026020010151905080831161363b576000838152602082905260409020925061364c565b600081815260208490526040902092505b5080613657816149fa565b9150506135f8565b6001600160a01b0384166136bf5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109ef565b81518351146136e05760405162461bcd60e51b81526004016109ef90614833565b336136f081600087878787613483565b60005b845181101561378b5783818151811061370e5761370e614a2b565b602002602001015160008087848151811061372b5761372b614a2b565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461377391906148f7565b90915550819050613783816149fa565b9150506136f3565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516137dc929190614585565b60405180910390a4610c7881600087878787613488565b6000613848826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613adb9092919063ffffffff16565b80519091501561267f578080602001905181019061386691906141e2565b61267f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109ef565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106138ff576138ff614a2b565b602090810291909101015292915050565b6001600160a01b0384163b156110095760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906139549089908990889088908890600401614538565b602060405180830381600087803b15801561396e57600080fd5b505af192505050801561399e575060408051601f3d908101601f1916820190925261399b9181019061423e565b60015b6139aa57613522614a57565b6001600160e01b0319811663f23a6e6160e01b146132e15760405162461bcd60e51b81526004016109ef906145c6565b6001600160a01b038316613a005760405162461bcd60e51b81526004016109ef90614771565b33613a2f81856000613a11876138c5565b613a1a876138c5565b60405180602001604052806000815250613483565b6000838152602081815260408083206001600160a01b038816845290915290205482811015613a705760405162461bcd60e51b81526004016109ef9061460e565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6060612e33848460008585843b613b345760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ef565b600080866001600160a01b03168587604051613b5091906144be565b60006040518083038185875af1925050503d8060008114613b8d576040519150601f19603f3d011682016040523d82523d6000602084013e613b92565b606091505b5091509150613ba2828286613bad565b979650505050505050565b60608315613bbc575081612e36565b825115613bcc5782518084602001fd5b8160405162461bcd60e51b81526004016109ef91906145b3565b828054613bf290614993565b90600052602060002090601f016020900481019282613c145760008555613c5a565b82601f10613c2d57805160ff1916838001178555613c5a565b82800160010185558215613c5a579182015b82811115613c5a578251825591602001919060010190613c3f565b50613c66929150613c6a565b5090565b5b80821115613c665760008155600101613c6b565b60008083601f840112613c9157600080fd5b5081356001600160401b03811115613ca857600080fd5b6020830191508360208260051b8501011115613cc357600080fd5b9250929050565b600082601f830112613cdb57600080fd5b81356020613ce8826148d4565b604051613cf582826149ce565b8381528281019150858301600585901b87018401881015613d1557600080fd5b60005b85811015613d3457813584529284019290840190600101613d18565b5090979650505050505050565b600082601f830112613d5257600080fd5b81356001600160401b03811115613d6b57613d6b614a41565b604051613d82601f8301601f1916602001826149ce565b818152846020838601011115613d9757600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215613dc657600080fd5b8135612e3681614afc565b60008060408385031215613de457600080fd5b8235613def81614afc565b91506020830135613dff81614afc565b809150509250929050565b600080600080600060a08688031215613e2257600080fd5b8535613e2d81614afc565b94506020860135613e3d81614afc565b935060408601356001600160401b0380821115613e5957600080fd5b613e6589838a01613cca565b94506060880135915080821115613e7b57600080fd5b613e8789838a01613cca565b93506080880135915080821115613e9d57600080fd5b50613eaa88828901613d41565b9150509295509295909350565b600080600080600060a08688031215613ecf57600080fd5b8535613eda81614afc565b94506020860135613eea81614afc565b9350604086013592506060860135915060808601356001600160401b03811115613f1357600080fd5b613eaa88828901613d41565b600080600080600060608688031215613f3757600080fd5b8535613f4281614afc565b945060208601356001600160401b0380821115613f5e57600080fd5b613f6a89838a01613c7f565b90965094506040880135915080821115613f8357600080fd5b50613f9088828901613c7f565b969995985093965092949392505050565b600080600060608486031215613fb657600080fd5b8335613fc181614afc565b925060208401356001600160401b0380821115613fdd57600080fd5b613fe987838801613cca565b93506040860135915080821115613fff57600080fd5b5061400c86828701613cca565b9150509250925092565b6000806040838503121561402957600080fd5b823561403481614afc565b91506020830135613dff81614b11565b6000806040838503121561405757600080fd5b823561406281614afc565b946020939093013593505050565b60008060006060848603121561408557600080fd5b833561409081614afc565b95602085013595506040909401359392505050565b600080604083850312156140b857600080fd5b82356001600160401b03808211156140cf57600080fd5b818501915085601f8301126140e357600080fd5b813560206140f0826148d4565b6040516140fd82826149ce565b8381528281019150858301600585901b870184018b101561411d57600080fd5b600096505b8487101561414957803561413581614afc565b835260019690960195918301918301614122565b509650508601359250508082111561416057600080fd5b5061416d85828601613cca565b9150509250929050565b6000806000806040858703121561418d57600080fd5b84356001600160401b03808211156141a457600080fd5b6141b088838901613c7f565b909650945060208701359150808211156141c957600080fd5b506141d687828801613c7f565b95989497509550505050565b6000602082840312156141f457600080fd5b8151612e3681614b11565b6000806040838503121561421257600080fd5b50508035926020909101359150565b60006020828403121561423357600080fd5b8135612e3681614b1f565b60006020828403121561425057600080fd5b8151612e3681614b1f565b60006020828403121561426d57600080fd5b81356001600160401b0381111561428357600080fd5b61428f84828501613d41565b949350505050565b6000602082840312156142a957600080fd5b5035919050565b6000602082840312156142c257600080fd5b5051919050565b600080600080608085870312156142df57600080fd5b8435935060208501356001600160401b03808211156142fd57600080fd5b61430988838901613d41565b94506040870135915061431b82614afc565b9092506060860135908082111561433157600080fd5b5061433e87828801613d41565b91505092959194509250565b600080600080600060a0868803121561436257600080fd5b8535945060208601356001600160401b038082111561438057600080fd5b61438c89838a01613d41565b95506040880135915061439e82614afc565b9093506060870135925060808701359080821115613e9d57600080fd5b6000806000606084860312156143d057600080fd5b833592506020840135915060408401356001600160401b038111156143f457600080fd5b61400c86828701613d41565b6000806000806080858703121561441657600080fd5b843593506020850135925060408501356001600160401b0381111561443a57600080fd5b61444687828801613d41565b949793965093946060013593505050565b600081518084526020808501945080840160005b838110156144875781518752958201959082019060010161446b565b509495945050505050565b600081518084526144aa816020860160208601614967565b601f01601f19169290920160200192915050565b600082516144d0818460208701614967565b9190910192915050565b6001600160a01b0386811682528516602082015260a06040820181905260009061450690830186614457565b82810360608401526145188186614457565b9050828103608084015261452c8185614492565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613ba290830184614492565b602081526000612e366020830184614457565b6040815260006145986040830185614457565b82810360208401526145aa8185614457565b95945050505050565b602081526000612e366020830184614492565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b8481526080602082015260006148946080830186614492565b6001600160a01b03851660408401528281036060840152613ba28185614492565b8381528260208201526060604082015260006145aa6060830184614492565b60006001600160401b038211156148ed576148ed614a41565b5060051b60200190565b6000821982111561490a5761490a614a15565b500190565b60008261492c57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561494b5761494b614a15565b500290565b60008282101561496257614962614a15565b500390565b60005b8381101561498257818101518382015260200161496a565b838111156123c55750506000910152565b600181811c908216806149a757607f821691505b602082108114156149c857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b03811182821017156149f3576149f3614a41565b6040525050565b6000600019821415614a0e57614a0e614a15565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115614a705760046000803e5060005160e01c5b90565b600060443d1015614a815790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715614ab057505050505090565b8285019150815181811115614ac85750505050505090565b843d8701016020828501011115614ae25750505050505090565b614af1602082860101876149ce565b509095945050505050565b6001600160a01b0381168114610a7c57600080fd5b8015158114610a7c57600080fd5b6001600160e01b031981168114610a7c57600080fdfea26469706673582212207a5841cbfa628809987a6f14af662fc6ba3924d3621c236e3f869dc90dbd6b8264736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000013323131322e72756e20726f6f745061737365730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063231313252500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000b67cff4856e87a4c72eb709c39e905496aa1d58e000000000000000000000000881ff3dadfb3fcf5caf7126bb563eea69a06d190000000000000000000000000d06d724318477c4e35acff3a8eff08b47b1264fc0000000000000000000000005f0486ef247e87294351a6d4084d3905c4782c5900000000000000000000000049ab91da7377baa4781b93962567f3761938bb3a00000000000000000000000099b02494e79669a1b868fc376f03fe83ff99072b0000000000000000000000006702098b322dd40e737fe865c863c0b1b3773b8b00000000000000000000000086c7aaac741e4febd00ac21166840aef16bdaace0000000000000000000000003a3c4fc711e046f97a111b6f98a3f99558a2c5b5000000000000000000000000ac163e163ba61451faf11029816686819b3cd1e5000000000000000000000000982e09ebd5bf6f4f9cce5d0c84514fb96d91c5f9000000000000000000000000a442ddf27063320789b59a8fdca5b849cd2cdeac000000000000000000000000a9c1afd0e18737fa1bb902ea067bff1c2e0d4a25000000000000000000000000583b3f844e296b8cbce95d5dc49c84f5d07c92e6000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001d

-----Decoded View---------------
Arg [0] : _name (string): 2112.run rootPasses
Arg [1] : _symbol (string): 2112RP
Arg [2] : _payees (address[]): 0xb67cfF4856e87A4c72eB709c39e905496aA1D58E,0x881FF3dadfb3fCf5cAf7126BB563eEa69A06d190,0xD06D724318477C4e35ACFf3A8eff08b47b1264fc,0x5F0486ef247e87294351A6D4084d3905c4782c59,0x49ab91dA7377bAa4781b93962567f3761938bb3A,0x99B02494e79669a1b868Fc376F03fe83FF99072b,0x6702098b322dD40e737FE865C863c0B1b3773b8B,0x86C7aaac741E4FeBd00Ac21166840aef16bDaacE,0x3a3C4fc711E046f97a111b6f98A3F99558a2C5B5,0xAc163E163ba61451fAF11029816686819B3cd1e5,0x982E09EBd5Bf6F4f9cCe5d0c84514fb96d91c5F9,0xA442dDf27063320789B59A8fdcA5b849Cd2CDeAC,0xa9c1aFd0e18737fa1bB902ea067bFF1c2E0D4A25,0x583b3F844E296b8cbce95D5Dc49C84F5d07c92e6
Arg [3] : _paymentShares (uint256[]): 10,10,10,10,5,5,3,3,3,3,3,3,3,29

-----Encoded View---------------
38 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [5] : 323131322e72756e20726f6f7450617373657300000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 3231313252500000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [9] : 000000000000000000000000b67cff4856e87a4c72eb709c39e905496aa1d58e
Arg [10] : 000000000000000000000000881ff3dadfb3fcf5caf7126bb563eea69a06d190
Arg [11] : 000000000000000000000000d06d724318477c4e35acff3a8eff08b47b1264fc
Arg [12] : 0000000000000000000000005f0486ef247e87294351a6d4084d3905c4782c59
Arg [13] : 00000000000000000000000049ab91da7377baa4781b93962567f3761938bb3a
Arg [14] : 00000000000000000000000099b02494e79669a1b868fc376f03fe83ff99072b
Arg [15] : 0000000000000000000000006702098b322dd40e737fe865c863c0b1b3773b8b
Arg [16] : 00000000000000000000000086c7aaac741e4febd00ac21166840aef16bdaace
Arg [17] : 0000000000000000000000003a3c4fc711e046f97a111b6f98a3f99558a2c5b5
Arg [18] : 000000000000000000000000ac163e163ba61451faf11029816686819b3cd1e5
Arg [19] : 000000000000000000000000982e09ebd5bf6f4f9cce5d0c84514fb96d91c5f9
Arg [20] : 000000000000000000000000a442ddf27063320789b59a8fdca5b849cd2cdeac
Arg [21] : 000000000000000000000000a9c1afd0e18737fa1bb902ea067bff1c2e0d4a25
Arg [22] : 000000000000000000000000583b3f844e296b8cbce95d5dc49c84f5d07c92e6
Arg [23] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [24] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [25] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [26] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [27] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [37] : 000000000000000000000000000000000000000000000000000000000000001d


Deployed Bytecode Sourcemap

924:10848:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3216:40:16;665:10:2;3216:40:16;;;-1:-1:-1;;;;;15997:32:18;;;15979:51;;3246:9:16;16061:2:18;16046:18;;16039:34;15952:18;3216:40:16;;;;;;;924:10848:14;;;;;2054:228:3;;;;;;;;;;-1:-1:-1;2054:228:3;;;;;:::i;:::-;;:::i;:::-;;;18833:25:18;;;18821:2;18806:18;2054:228:3;;;;;;;;1707:213:0;;;;;;;;;;-1:-1:-1;1707:213:0;;;;;:::i;:::-;;:::i;:::-;;;18660:14:18;;18653:22;18635:41;;18623:2;18608:18;1707:213:0;18495:187:18;255:91:0;;;;;;;;;;-1:-1:-1;255:91:0;;;;;:::i;:::-;;:::i;:::-;;11283:487:14;;;;;;;;;;-1:-1:-1;11283:487:14;;;;;:::i;:::-;;:::i;5074:367::-;;;;;;;;;;-1:-1:-1;5074:367:14;;;;;:::i;:::-;;:::i;356:81:0:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11017:189:14:-;;;;;;;;;;-1:-1:-1;11017:189:14;;;;;:::i;:::-;;:::i;4944:553:16:-;;;;;;;;;;-1:-1:-1;4944:553:16;;;;;:::i;:::-;;:::i;4082:430:3:-;;;;;;;;;;-1:-1:-1;4082:430:3;;;;;:::i;:::-;;:::i;3657:432:14:-;;;;;;;;;;-1:-1:-1;3657:432:14;;;;;:::i;:::-;;:::i;5469:4205::-;;;;;;:::i;:::-;;:::i;10334:190::-;;;;;;;;;;-1:-1:-1;10334:190:14;;;;;:::i;:::-;;:::i;1688:24::-;;;;;;;;;;;;;;;;10566:187;;;;;;;;;;-1:-1:-1;10566:187:14;;;;;:::i;:::-;;:::i;3341:89:16:-;;;;;;;;;;-1:-1:-1;3411:12:16;;3341:89;;4433:133;;;;;;;;;;-1:-1:-1;4433:133:16;;;;;:::i;:::-;-1:-1:-1;;;;;4529:21:16;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;5758:628;;;;;;;;;;-1:-1:-1;5758:628:16;;;;;:::i;:::-;;:::i;9779:514:14:-;;;;;;;;;;-1:-1:-1;9779:514:14;;;;;:::i;:::-;;:::i;2439:508:3:-;;;;;;;;;;-1:-1:-1;2439:508:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1305:26:14:-;;;;;;;;;;;;;;;;1623:25;;;;;;;;;;;;;;;;1406:46;;;;;;;;;;-1:-1:-1;1406:46:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;628:342:4:-;;;;;;;;;;-1:-1:-1;628:342:4;;;;;:::i;:::-;;:::i;1598:92:15:-;;;;;;;;;;;;;:::i;1273:26:14:-;;;;;;;;;;;;;;;;3264:387;;;;;;;;;;-1:-1:-1;3264:387:14;;;;;:::i;:::-;;:::i;1654:28::-;;;;;;;;;;;;;;;;4652:98:16;;;;;;;;;;-1:-1:-1;4652:98:16;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;15753:32:18;;;15735:51;;15723:2;15708:18;4652:98:16;15589:203:18;966:85:15;;;;;;;;;;-1:-1:-1;1038:6:15;;-1:-1:-1;;;;;1038:6:15;966:85;;443::0;;;;;;;;;;;;;:::i;4575:493:14:-;;;;;;;;;;-1:-1:-1;4575:493:14;;;;;:::i;:::-;;:::i;4163:107:16:-;;;;;;;;;;-1:-1:-1;4163:107:16;;;;;:::i;:::-;-1:-1:-1;;;;;4245:18:16;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;3015:306:3;;;;;;;;;;-1:-1:-1;3015:306:3;;;;;:::i;:::-;;:::i;222:21:0:-;;;;;;;;;;;;;:::i;10799:195:14:-;;;;;;;;;;-1:-1:-1;10799:195:14;;;;;:::i;:::-;;:::i;1241:26::-;;;;;;;;;;;;;;;;3966:103:16;;;;;;;;;;-1:-1:-1;3966:103:16;;;;;:::i;:::-;-1:-1:-1;;;;;4046:16:16;4020:7;4046:16;;;:7;:16;;;;;;;3966:103;3763:117;;;;;;;;;;-1:-1:-1;3763:117:16;;;;;:::i;:::-;-1:-1:-1;;;;;3847:26:16;3821:7;3847:26;;;:19;:26;;;;;;;3763:117;1458:41:14;;;;;;;;;;-1:-1:-1;1458:41:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;197:19:0:-;;;;;;;;;;;;;:::i;3519:93:16:-;;;;;;;;;;-1:-1:-1;3591:14:16;;3519:93;;1729:25:14;;;;;;;;;;;;;;;;1209:26;;;;;;;;;;;;;;;;3388:166:3;;;;;;;;;;-1:-1:-1;3388:166:3;;;;;:::i;:::-;-1:-1:-1;;;;;3510:27:3;;;3487:4;3510:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3388:166;1556:41:14;;;;;;;;;;-1:-1:-1;1556:41:14;;;;;:::i;:::-;;;;;;;;;;;;;;3621:389:3;;;;;;;;;;-1:-1:-1;3621:389:3;;;;;:::i;:::-;;:::i;1839:189:15:-;;;;;;;;;;-1:-1:-1;1839:189:15;;;;;:::i;:::-;;:::i;4101:468:14:-;;;;;;;;;;-1:-1:-1;4101:468:14;;;;;:::i;:::-;;:::i;312:310:4:-;;;;;;;;;;-1:-1:-1;312:310:4;;;;;:::i;:::-;;:::i;2054:228:3:-;2140:7;-1:-1:-1;;;;;2167:21:3;;2159:77;;;;-1:-1:-1;;;2159:77:3;;22196:2:18;2159:77:3;;;22178:21:18;22235:2;22215:18;;;22208:30;22274:34;22254:18;;;22247:62;-1:-1:-1;;;22325:18:18;;;22318:41;22376:19;;2159:77:3;;;;;;;;;-1:-1:-1;2253:9:3;:13;;;;;;;;;;;-1:-1:-1;;;;;2253:22:3;;;;;;;;;;;;2054:228::o;1707:213:0:-;1801:4;-1:-1:-1;;;;;;1824:49:0;;-1:-1:-1;;;1824:49:0;;:89;;;1877:36;1901:11;1877:23;:36::i;:::-;1817:96;1707:213;-1:-1:-1;;1707:213:0:o;255:91::-;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;323:16:0::1;331:7;323;:16::i;:::-;255:91:::0;:::o;11283:487:14:-;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;11376:6:14::1;11386:1;11376:11;11372:392;;;-1:-1:-1::0;11404:11:14::1;:25:::0;11283:487::o;11372:392::-:1;11450:6;11460:1;11450:11;11446:318;;;-1:-1:-1::0;11477:11:14::1;:25:::0;11283:487::o;11446:318::-:1;11523:6;11533:1;11523:11;11519:245;;;-1:-1:-1::0;11550:11:14::1;:25:::0;11283:487::o;11519:245::-:1;11596:6;11606:1;11596:11;11592:172;;;-1:-1:-1::0;11623:11:14::1;:25:::0;11283:487::o;11592:172::-:1;11687:66;::::0;-1:-1:-1;;;11687:66:14;;21779:2:18;11687:66:14::1;::::0;::::1;21761:21:18::0;21818:2;21798:18;;;21791:30;21857:34;21837:18;;;21830:62;-1:-1:-1;;;21908:18:18;;;21901:46;21964:19;;11687:66:14::1;21577:412:18::0;11687:66:14::1;11283:487:::0;;:::o;5074:367::-;5223:6;5218:174;5235:14;;;5218:174;;;5319:10;5278;:18;5289:3;;5293:1;5289:6;;;;;;;:::i;:::-;;;;;;;;;;5278:18;;-1:-1:-1;5278:18:14;;;;;;;;-1:-1:-1;5278:18:14;:37;;;-1:-1:-1;;;;;5278:37:14;:51;5270:111;;;;-1:-1:-1;;;5270:111:14;;25066:2:18;5270:111:14;;;25048:21:18;25105:2;25085:18;;;25078:30;25144:34;25124:18;;;25117:62;-1:-1:-1;;;25195:18:18;;;25188:45;25250:19;;5270:111:14;24864:411:18;5270:111:14;5251:3;;;;:::i;:::-;;;;5218:174;;;;5401:33;5412:7;5421:3;;5401:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5401:33:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5426:7:14;;-1:-1:-1;5426:7:14;;;;5401:33;;;5426:7;;5401:33;5426:7;5401:33;;;;;;;;;-1:-1:-1;5401:10:14;;-1:-1:-1;;;5401:33:14:i;:::-;5074:367;;;;;:::o;356:81:0:-;393:13;425:5;418:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;356:81;:::o;11017:189:14:-;11179:15;;;;:10;:15;;;;;:19;;11165:34;;11073:13;;11179:19;11165:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11017:189;;;:::o;4944:553:16:-;-1:-1:-1;;;;;5019:16:16;;5038:1;5019:16;;;:7;:16;;;;;;5011:71;;;;-1:-1:-1;;;5011:71:16;;;;;;;:::i;:::-;5093:21;5141:15;3591:14;;;3519:93;5141:15;5117:39;;:21;:39;:::i;:::-;5093:63;;5166:15;5184:58;5200:7;5209:13;5224:17;5233:7;-1:-1:-1;;;;;4245:18:16;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;5224:17;5184:15;:58::i;:::-;5166:76;-1:-1:-1;5261:12:16;5253:68;;;;-1:-1:-1;;;5253:68:16;;;;;;;:::i;:::-;-1:-1:-1;;;;;5332:18:16;;;;;;:9;:18;;;;;:29;;5354:7;;5332:18;:29;;5354:7;;5332:29;:::i;:::-;;;;;;;;5389:7;5371:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;5407:35:16;;-1:-1:-1;5425:7:16;5434;5407:17;:35::i;:::-;5457:33;;;-1:-1:-1;;;;;15997:32:18;;15979:51;;16061:2;16046:18;;16039:34;;;5457:33:16;;15952:18:18;5457:33:16;;;;;;;5001:496;;4944:553;:::o;4082:430:3:-;-1:-1:-1;;;;;4307:20:3;;665:10:2;4307:20:3;;:60;;-1:-1:-1;4331:36:3;4348:4;665:10:2;3388:166:3;:::i;4331:36::-;4286:157;;;;-1:-1:-1;;;4286:157:3;;29510:2:18;4286:157:3;;;29492:21:18;29549:2;29529:18;;;29522:30;29588:34;29568:18;;;29561:62;-1:-1:-1;;;29639:18:18;;;29632:48;29697:19;;4286:157:3;29308:414:18;4286:157:3;4453:52;4476:4;4482:2;4486:3;4491:7;4500:4;4453:22;:52::i;3657:432:14:-;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;3872:20:14::1;::::0;;;:10:::1;:20;::::0;;;;;;;:41;;;3927:33;;::::1;::::0;:25:::1;::::0;;::::1;::::0;:33;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;3974:20:14::1;::::0;;;:10:::1;:20;::::0;;;;;;;:39:::1;::::0;::::1;:61:::0;;-1:-1:-1;;;;;;3974:61:14::1;-1:-1:-1::0;;;;;3974:61:14;::::1;;::::0;;4047:31;;::::1;::::0;:24:::1;::::0;;::::1;::::0;:31;::::1;::::0;::::1;:::i;:::-;;3657:432:::0;;;;;:::o;5469:4205::-;5736:1;5724:9;;:13;5716:51;;;;-1:-1:-1;;;5716:51:14;;28325:2:18;5716:51:14;;;28307:21:18;28364:2;28344:18;;;28337:30;28403:27;28383:18;;;28376:55;28448:18;;5716:51:14;28123:349:18;5716:51:14;5963:11;;5975:1;5963:14;;;;;;;:::i;:::-;5952:1;5944:10;;:7;5963:14;5944:10;;;;:16;:33;;5963:14;;;;;;;-1:-1:-1;5944:33:14;:::i;:::-;5913:11;;5925:1;5913:14;;;;;;;:::i;:::-;5902:1;5894:10;;:7;5913:14;5894:10;;;;:16;:33;;5913:14;;;;;;;-1:-1:-1;5894:33:14;:::i;:::-;5863:11;;5875:1;5863:14;;;;;;;:::i;:::-;5852:1;5844:10;;:7;5863:14;5844:10;;;;:16;:33;;5863:14;;;;;;;-1:-1:-1;5844:33:14;:::i;:::-;5843:85;;;;:::i;:::-;:135;;;;:::i;:::-;5817:9;:161;;5809:223;;;;-1:-1:-1;;;5809:223:14;;34329:2:18;5809:223:14;;;34311:21:18;34368:2;34348:18;;;34341:30;34407:34;34387:18;;;34380:62;-1:-1:-1;;;34458:18:18;;;34451:34;34502:19;;5809:223:14;34127:400:18;5809:223:14;6149:1;6131:11;;6143:1;6131:14;;;;;;;:::i;:::-;6117:1;6109:10;;:7;6131:14;6109:10;;;:19;;:36;;6131:14;;;;;;;-1:-1:-1;6109:36:14;:::i;:::-;:41;;6101:88;;;;-1:-1:-1;;;6101:88:14;;33926:2:18;6101:88:14;;;33908:21:18;33965:2;33945:18;;;33938:30;34004:34;33984:18;;;33977:62;-1:-1:-1;;;34055:18:18;;;34048:32;34097:19;;6101:88:14;33724:398:18;6101:88:14;6247:1;6229:11;;6241:1;6229:14;;;;;;;:::i;:::-;6215:1;6207:10;;:7;6229:14;6207:10;;;:19;;:36;;6229:14;;;;;;;-1:-1:-1;6207:36:14;:::i;:::-;:41;;6199:88;;;;-1:-1:-1;;;6199:88:14;;32331:2:18;6199:88:14;;;32313:21:18;32370:2;32350:18;;;32343:30;32409:34;32389:18;;;32382:62;-1:-1:-1;;;32460:18:18;;;32453:32;32502:19;;6199:88:14;32129:398:18;6199:88:14;6345:1;6327:11;;6339:1;6327:14;;;;;;;:::i;:::-;6313:1;6305:10;;:7;6327:14;6305:10;;;:19;;:36;;6327:14;;;;;;;-1:-1:-1;6305:36:14;:::i;:::-;:41;;6297:88;;;;-1:-1:-1;;;6297:88:14;;31928:2:18;6297:88:14;;;31910:21:18;31967:2;31947:18;;;31940:30;32006:34;31986:18;;;31979:62;-1:-1:-1;;;32057:18:18;;;32050:32;32099:19;;6297:88:14;31726:398:18;6297:88:14;6538:1;6526:9;;:13;:30;;;;;6555:1;6543:9;;:13;6526:30;6522:1604;;;6716:8;;6678:11;;6690:1;6678:14;;;;;;;:::i;:::-;;;;;;;6661:11;;6673:1;6661:14;;;;;;;:::i;:::-;;;;;;;6643:11;;6655:1;6643:14;;;;;;;:::i;:::-;6608:10;6598:21;;;;:9;6643:14;6598:21;;;;;;;;:59;;6643:14;;;;;;;-1:-1:-1;6598:59:14;:::i;:::-;:77;;;;:::i;:::-;:94;;;;:::i;:::-;:126;;6573:245;;;;-1:-1:-1;;;6573:245:14;;31152:2:18;6573:245:14;;;31134:21:18;31191:2;31171:18;;;31164:30;31230:34;31210:18;;;31203:62;-1:-1:-1;;;31281:18:18;;;31274:44;31335:19;;6573:245:14;30950:410:18;6573:245:14;6913:28;;-1:-1:-1;;6930:10:14;15015:2:18;15011:15;15007:53;6913:28:14;;;14995:66:18;6888:12:14;;15077::18;;6913:28:14;;;;;;;;;;;;6903:39;;;;;;6888:54;;6960:9;;6973:1;6960:14;6956:641;;;7001:51;7020:12;;7001:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7034:11:14;;;-1:-1:-1;7047:4:14;;-1:-1:-1;7001:18:14;:51::i;:::-;6993:103;;;;-1:-1:-1;;;6993:103:14;;27509:2:18;6993:103:14;;;27491:21:18;27548:2;27528:18;;;27521:30;27587:34;27567:18;;;27560:62;-1:-1:-1;;;27638:18:18;;;27631:37;27685:19;;6993:103:14;27307:403:18;6993:103:14;6956:641;;;7121:9;;7134:1;7121:14;7117:480;;;7163:51;7182:12;;7163:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7196:11:14;;;-1:-1:-1;7209:4:14;;-1:-1:-1;7163:18:14;:51::i;:::-;7155:103;;;;-1:-1:-1;;;7155:103:14;;36776:2:18;7155:103:14;;;36758:21:18;36815:2;36795:18;;;36788:30;36854:34;36834:18;;;36827:62;-1:-1:-1;;;36905:18:18;;;36898:37;36952:19;;7155:103:14;36574:403:18;7117:480:14;7283:9;;7296:1;7283:14;7279:318;;;7325:51;7344:12;;7325:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7358:11:14;;;-1:-1:-1;7371:4:14;;-1:-1:-1;7325:18:14;:51::i;:::-;7317:103;;;;-1:-1:-1;;;7317:103:14;;27917:2:18;7317:103:14;;;27899:21:18;27956:2;27936:18;;;27929:30;27995:34;27975:18;;;27968:62;-1:-1:-1;;;28046:18:18;;;28039:37;28093:19;;7317:103:14;27715:403:18;7279:318:14;7445:9;;7458:1;7445:14;7441:156;;;7487:51;7506:12;;7487:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7520:11:14;;;-1:-1:-1;7533:4:14;;-1:-1:-1;7487:18:14;:51::i;:::-;7479:103;;;;-1:-1:-1;;;7479:103:14;;30333:2:18;7479:103:14;;;30315:21:18;30372:2;30352:18;;;30345:30;30411:34;30391:18;;;30384:62;-1:-1:-1;;;30462:18:18;;;30455:37;30509:19;;7479:103:14;30131:403:18;7479:103:14;7738:11;;7750:1;7738:14;;;;;;;:::i;:::-;;;;;;;7721:11;;7733:1;7721:14;;;;;;;:::i;:::-;;;;;;;7703:11;;7715:1;7703:14;;;;;;;:::i;:::-;7689:10;7679:21;;;;:9;7703:14;7679:21;;;;;;;;:38;;7703:14;;;;;;;-1:-1:-1;7679:38:14;:::i;:::-;:56;;;;:::i;:::-;:73;;;;:::i;:::-;7665:10;7655:21;;;;:9;:21;;;;;:97;-1:-1:-1;6522:1604:14;;;7781:9;;7794:1;7781:14;7777:349;;;7863:10;7877:9;7863:23;7855:71;;;;-1:-1:-1;;;7855:71:14;;20541:2:18;7855:71:14;;;20523:21:18;20580:2;20560:18;;;20553:30;20619:34;20599:18;;;20592:62;-1:-1:-1;;;20670:18:18;;;20663:33;20713:19;;7855:71:14;20339:399:18;7855:71:14;8059:9;;8028:11;;8040:1;8028:14;;;;;;;:::i;:::-;;;;;;;8011:11;;8023:1;8011:14;;;;;;;:::i;:::-;;;;;;;7993:11;;8005:1;7993:14;;;;;;;:::i;:::-;;;;;;;:32;;;;:::i;:::-;:49;;;;:::i;:::-;:75;;7985:130;;;;-1:-1:-1;;;7985:130:14;;23420:2:18;7985:130:14;;;23402:21:18;23459:2;23439:18;;;23432:30;23498:34;23478:18;;;23471:62;-1:-1:-1;;;23549:18:18;;;23542:40;23599:19;;7985:130:14;23218:406:18;7985:130:14;8229:1;8217:9;8240:124;8261:1;8257;:5;8240:124;;;8303:1;8286:11;;8298:1;8286:14;;;;;;;:::i;:::-;;;;;;;:18;8283:71;;;8331:8;:4;8338:1;8331:8;:::i;:::-;8324:15;;8283:71;8264:3;;;;:::i;:::-;;;;8240:124;;;;8374:21;8412:4;-1:-1:-1;;;;;8398:19:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8398:19:14;;8374:43;;8427:20;8464:4;-1:-1:-1;;;;;8450:19:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8450:19:14;;8427:42;;8488:1;8479:3;8483:1;8479:6;;;;;;;;:::i;:::-;;;;;;;;;;:10;8511:1;8499:9;8561:11;;8499:9;8561:14;;;;;:::i;:::-;;;;;;;:18;8557:329;;;8615:11;;8627:1;8615:14;;;;;;;:::i;:::-;;;;;;;8605:4;8610:1;8605:7;;;;;;;;:::i;:::-;;;;;;;:24;;;;:::i;:::-;8595:4;8600:1;8595:7;;;;;;;;:::i;:::-;;;;;;:34;;;;;8656:11;;8668:1;8656:14;;;;;;;:::i;:::-;;;;;;;8643:4;8648;8643:10;;;;;;;;:::i;:::-;;;;;;:27;;;;;8696:1;8684:3;8688:4;8684:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;8711:9;8719:1;8711:9;;:::i;:::-;;;8747:11;;8759:1;8747:14;;;;;;;:::i;:::-;;;;;;;8734:4;8739;8734:10;;;;;;;;:::i;:::-;;;;;;:27;;;;;8787:1;8775:3;8779:4;8775:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;8802:9;8810:1;8802:9;;:::i;:::-;;;8848:11;;8860:1;8848:14;;;;;;;:::i;:::-;;;;;;;8825:7;:10;8833:1;8825:10;;;;;;;;;;;:19;;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;;8557:329:14;8952:1;8935:11;;8947:1;8935:14;;;;;;;:::i;:::-;;;;;;;:18;8931:317;;;8989:11;;9001:1;8989:14;;;;;;;:::i;:::-;;;;;;;8979:4;8984:1;8979:7;;;;;;;;:::i;:::-;;;;;;;:24;;;;:::i;:::-;8969:4;8974:1;8969:7;;;;;;;;:::i;:::-;;;;;;:34;;;;;9030:11;;9042:1;9030:14;;;;;;;:::i;:::-;;;;;;;9017:4;9022;9017:10;;;;;;;;:::i;:::-;;;;;;:27;;;;;9070:1;9058:3;9062:4;9058:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;9085:9;9093:1;9085:9;;:::i;:::-;;;9121:11;;9133:1;9121:14;;;;;;;:::i;:::-;;;;;;;9108:4;9113;9108:10;;;;;;;;:::i;:::-;;;;;;:27;;;;;9161:1;9149:3;9153:4;9149:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;9176:9;9184:1;9176:9;;:::i;:::-;;;9222:11;;9234:1;9222:14;;;;;;;:::i;:::-;;;;;;;9199:7;:10;9207:1;9199:10;;;;;;;;;;;:19;;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;;8931:317:14;9315:1;9298:11;;9310:1;9298:14;;;;;;;:::i;:::-;;;;;;;:18;9294:317;;;9352:11;;9364:1;9352:14;;;;;;;:::i;:::-;;;;;;;9342:4;9347:1;9342:7;;;;;;;;:::i;:::-;;;;;;;:24;;;;:::i;:::-;9332:4;9337:1;9332:7;;;;;;;;:::i;:::-;;;;;;:34;;;;;9393:11;;9405:1;9393:14;;;;;;;:::i;:::-;;;;;;;9380:4;9385;9380:10;;;;;;;;:::i;:::-;;;;;;:27;;;;;9433:1;9421:3;9425:4;9421:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;9448:9;9456:1;9448:9;;:::i;:::-;;;9484:11;;9496:1;9484:14;;;;;;;:::i;:::-;;;;;;;9471:4;9476;9471:10;;;;;;;;:::i;:::-;;;;;;:27;;;;;9524:1;9512:3;9516:4;9512:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;9539:9;9547:1;9539:9;;:::i;:::-;;;9585:11;;9597:1;9585:14;;;;;;;:::i;:::-;;;;;;;9562:7;:10;9570:1;9562:10;;;;;;;;;;;:19;;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;;9294:317:14;9629:37;9640:10;9652:3;9657:4;9629:37;;;;;;;;;;;;:10;:37::i;:::-;5665:4009;;;;5469:4205;;;;:::o;10334:190::-;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;10428:1:14::1;10414:10;:15;;10406:79;;;::::0;-1:-1:-1;;;10406:79:14;;21359:2:18;10406:79:14::1;::::0;::::1;21341:21:18::0;21398:2;21378:18;;;21371:30;21437:34;21417:18;;;21410:62;-1:-1:-1;;;21488:18:18;;;21481:49;21547:19;;10406:79:14::1;21157:415:18::0;10406:79:14::1;10495:9;:22:::0;10334:190::o;10566:187::-;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;10726:8:14::1;:20:::0;10566:187::o;5758:628:16:-;-1:-1:-1;;;;;5839:16:16;;5858:1;5839:16;;;:7;:16;;;;;;5831:71;;;;-1:-1:-1;;;5831:71:16;;;;;;;:::i;:::-;-1:-1:-1;;;;;3847:26:16;;5913:21;3847:26;;;:19;:26;;;;;;5937:30;;-1:-1:-1;;;5937:30:16;;5961:4;5937:30;;;15735:51:18;-1:-1:-1;;;;;5937:15:16;;;;;15708:18:18;;5937:30:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;5913:77;;6000:15;6018:65;6034:7;6043:13;6058:24;6067:5;6074:7;-1:-1:-1;;;;;4529:21:16;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;6018:65;6000:83;-1:-1:-1;6102:12:16;6094:68;;;;-1:-1:-1;;;6094:68:16;;;;;;;:::i;:::-;-1:-1:-1;;;;;6173:21:16;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;6207:7;;6173:21;:41;;6207:7;;6173:41;:::i;:::-;;;;-1:-1:-1;;;;;;;6224:26:16;;;;;;:19;:26;;;;;:37;;6254:7;;6224:26;:37;;6254:7;;6224:37;:::i;:::-;;;;-1:-1:-1;6272:47:16;;-1:-1:-1;6295:5:16;6302:7;6311;6272:22;:47::i;:::-;6334:45;;;-1:-1:-1;;;;;15997:32:18;;;15979:51;;16061:2;16046:18;;16039:34;;;6334:45:16;;;;;15952:18:18;6334:45:16;;;;;;;5821:565;;5758:628;;:::o;9779:514:14:-;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;9892:1:14::1;9879:9;9865:11;;:23;;;;:::i;:::-;:28;;9857:86;;;::::0;-1:-1:-1;;;9857:86:14;;20945:2:18;9857:86:14::1;::::0;::::1;20927:21:18::0;20984:2;20964:18;;;20957:30;21023:34;21003:18;;;20996:62;-1:-1:-1;;;21074:18:18;;;21067:43;21127:19;;9857:86:14::1;20743:409:18::0;9857:86:14::1;9968:9;9953:11;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;10056:16:14::1;::::0;;10070:1:::1;10056:16:::0;;;;;::::1;::::0;;;10035:18:::1;::::0;10056:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;10056:16:14::1;10035:37;;10089:1;10082;10084;10082:4;;;;;;;;:::i;:::-;;;;;;:8;;;::::0;::::1;10107:1;10100;10102;10100:4;;;;;;;;:::i;:::-;;;;;;:8;;;::::0;::::1;10125:1;10118;10120;10118:4;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:8;10157:16:::1;::::0;;10171:1:::1;10157:16:::0;;;;;::::1;::::0;;;10136:18:::1;::::0;10157:16:::1;;;;;;;;;;;::::0;-1:-1:-1;10157:16:14::1;10136:37;;10190:9;10183:1;10185;10183:4;;;;;;;;:::i;:::-;;;;;;:16;;;::::0;::::1;10216:9;10209:1;10211;10209:4;;;;;;;;:::i;:::-;;;;;;:16;;;::::0;::::1;10242:9;10235:1;10237;10235:4;;;;;;;;:::i;:::-;;;;;;:16;;;::::0;::::1;10261:25;10272:3;10277:1;10280;10261:25;;;;;;;;;;;::::0;:10:::1;:25::i;:::-;9847:446;;9779:514:::0;;:::o;2439:508:3:-;2590:16;2649:3;:10;2630:8;:15;:29;2622:83;;;;-1:-1:-1;;;2622:83:3;;35555:2:18;2622:83:3;;;35537:21:18;35594:2;35574:18;;;35567:30;35633:34;35613:18;;;35606:62;-1:-1:-1;;;35684:18:18;;;35677:39;35733:19;;2622:83:3;35353:405:18;2622:83:3;2716:30;2763:8;:15;-1:-1:-1;;;;;2749:30:3;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2749:30:3;;2716:63;;2795:9;2790:120;2814:8;:15;2810:1;:19;2790:120;;;2869:30;2879:8;2888:1;2879:11;;;;;;;;:::i;:::-;;;;;;;2892:3;2896:1;2892:6;;;;;;;;:::i;:::-;;;;;;;2869:9;:30::i;:::-;2850:13;2864:1;2850:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2831:3;;;:::i;:::-;;;2790:120;;;-1:-1:-1;2927:13:3;2439:508;-1:-1:-1;;;2439:508:3:o;1406:46:14:-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1406:46:14;;;;;;;;;;;-1:-1:-1;;;;;1406:46:14;;;;;;-1:-1:-1;1406:46:14;-1:-1:-1;1406:46:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;628:342:4:-;-1:-1:-1;;;;;787:23:4;;665:10:2;787:23:4;;:66;;-1:-1:-1;814:39:4;831:7;665:10:2;3388:166:3;:::i;814:39:4:-;766:154;;;;-1:-1:-1;;;766:154:4;;;;;;;:::i;:::-;931:32;942:7;951:3;956:6;931:10;:32::i;:::-;628:342;;;:::o;1598:92:15:-;1038:6;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;3264:387:14:-;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;3476:9:14::1;::::0;3443:19:::1;3465:21:::0;;;:10:::1;:21;::::0;;;;;;;3496:23;;;3529:21:::1;::::0;::::1;:43:::0;;-1:-1:-1;;;;;;3529:43:14::1;-1:-1:-1::0;;;;;3529:43:14;::::1;;::::0;;3582:15;;3465:21;;3582:15:::1;::::0;-1:-1:-1;3582:7:14;::::1;::::0;:15;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;3607:13:14;;::::1;::::0;:6:::1;::::0;::::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;3643:1;3630:9;;:14;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;3264:387:14:o;4652:98:16:-;4703:7;4729;4737:5;4729:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4729:14:16;;4652:98;-1:-1:-1;;4652:98:16:o;443:85:0:-;482:13;514:7;507:14;;;;;:::i;4575:493:14:-;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;4771:1:14::1;4756:12;:16;4748:76;;;::::0;-1:-1:-1;;;4748:76:14;;20125:2:18;4748:76:14::1;::::0;::::1;20107:21:18::0;20164:2;20144:18;;;20137:30;20203:34;20183:18;;;20176:62;-1:-1:-1;;;20254:18:18;;;20247:45;20309:19;;4748:76:14::1;19923:411:18::0;4748:76:14::1;4855:1;4842:10;:14;4834:77;;;::::0;-1:-1:-1;;;4834:77:14;;33507:2:18;4834:77:14::1;::::0;::::1;33489:21:18::0;33546:2;33526:18;;;33519:30;33585:34;33565:18;;;33558:62;-1:-1:-1;;;33636:18:18;;;33629:48;33694:19;;4834:77:14::1;33305:414:18::0;4834:77:14::1;4922:21;::::0;;;:7:::1;:21;::::0;;;;;;;:42;;;4974:30:::1;::::0;::::1;:43:::0;;;5027:34;;::::1;::::0;:26:::1;::::0;;::::1;::::0;:34;::::1;::::0;::::1;:::i;3015:306:3:-:0;665:10:2;-1:-1:-1;;;;;3117:24:3;;;;3109:78;;;;-1:-1:-1;;;3109:78:3;;34734:2:18;3109:78:3;;;34716:21:18;34773:2;34753:18;;;34746:30;34812:34;34792:18;;;34785:62;-1:-1:-1;;;34863:18:18;;;34856:39;34912:19;;3109:78:3;34532:405:18;3109:78:3;665:10:2;3198:32:3;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;3198:42:3;;;;;;;;;;;;:53;;-1:-1:-1;;3198:53:3;;;;;;;;;;3266:48;;18635:41:18;;;3198:42:3;;665:10:2;3266:48:3;;18608:18:18;3266:48:3;;;;;;;3015:306;;:::o;222:21:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10799:195:14:-;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;10964:9:14::1;:22:::0;10799:195::o;1458:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;197:19:0:-;;;;;;;:::i;3621:389:3:-;-1:-1:-1;;;;;3821:20:3;;665:10:2;3821:20:3;;:60;;-1:-1:-1;3845:36:3;3862:4;665:10:2;3388:166:3;:::i;3845:36::-;3800:148;;;;-1:-1:-1;;;3800:148:3;;;;;;;:::i;:::-;3958:45;3976:4;3982:2;3986;3990:6;3998:4;3958:17;:45::i;1839:189:15:-;1038:6;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:15;::::1;1919:73;;;::::0;-1:-1:-1;;;1919:73:15;;22608:2:18;1919:73:15::1;::::0;::::1;22590:21:18::0;22647:2;22627:18;;;22620:30;22686:34;22666:18;;;22659:62;-1:-1:-1;;;22737:18:18;;;22730:36;22783:19;;1919:73:15::1;22406:402:18::0;1919:73:15::1;2002:19;2012:8;2002:9;:19::i;4101:468:14:-:0;1038:6:15;;-1:-1:-1;;;;;1038:6:15;665:10:2;1178:23:15;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;4264:1:14::1;4249:12;:16;4241:75;;;::::0;-1:-1:-1;;;4241:75:14;;32734:2:18;4241:75:14::1;::::0;::::1;32716:21:18::0;32773:2;32753:18;;;32746:30;32812:34;32792:18;;;32785:62;-1:-1:-1;;;32863:18:18;;;32856:44;32917:19;;4241:75:14::1;32532:410:18::0;4241:75:14::1;4347:1;4334:10;:14;4326:76;;;::::0;-1:-1:-1;;;4326:76:14;;23831:2:18;4326:76:14::1;::::0;::::1;23813:21:18::0;23870:2;23850:18;;;23843:30;23909:34;23889:18;;;23882:62;-1:-1:-1;;;23960:18:18;;;23953:47;24017:19;;4326:76:14::1;23629:413:18::0;4326:76:14::1;4440:8;::::0;4413:16:::1;4432:17:::0;;;:7:::1;:17;::::0;;;;;;;4459:22;;;4491:10:::1;::::0;::::1;:23:::0;;;4524:14;;4432:17;;4524:14:::1;::::0;:6:::1;::::0;::::1;::::0;:14;::::1;::::0;::::1;:::i;:::-;;4561:1;4549:8;;:13;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;4101:468:14:o;312:310:4:-;-1:-1:-1;;;;;446:23:4;;665:10:2;446:23:4;;:66;;-1:-1:-1;473:39:4;490:7;665:10:2;3388:166:3;:::i;473:39:4:-;425:154;;;;-1:-1:-1;;;425:154:4;;;;;;;:::i;:::-;590:25;596:7;605:2;609:5;590;:25::i;1105:305:3:-;1207:4;-1:-1:-1;;;;;;1242:41:3;;-1:-1:-1;;;1242:41:3;;:109;;-1:-1:-1;;;;;;;1299:52:3;;-1:-1:-1;;;1299:52:3;1242:109;:161;;;-1:-1:-1;;;;;;;;;;871:40:7;;;1367:36:3;763:155:7;7973:86:3;8039:13;;;;:4;;:13;;;;;:::i;1172:206:0:-;1332:39;1349:7;1358:3;1363:7;1332:16;:39::i;6558:242:16:-;6763:12;;-1:-1:-1;;;;;6743:16:16;;6700:7;6743:16;;;:7;:16;;;;;;6700:7;;6778:15;;6727:32;;:13;:32;:::i;:::-;6726:49;;;;:::i;:::-;:67;;;;:::i;:::-;6719:74;;6558:242;;;;;;:::o;2012:312:1:-;2126:6;2101:21;:31;;2093:73;;;;-1:-1:-1;;;2093:73:1;;25909:2:18;2093:73:1;;;25891:21:18;25948:2;25928:18;;;25921:30;25987:31;25967:18;;;25960:59;26036:18;;2093:73:1;25707:353:18;2093:73:1;2178:12;2196:9;-1:-1:-1;;;;;2196:14:1;2218:6;2196:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2177:52;;;2247:7;2239:78;;;;-1:-1:-1;;;2239:78:1;;25482:2:18;2239:78:1;;;25464:21:18;25521:2;25501:18;;;25494:30;25560:34;25540:18;;;25533:62;25631:28;25611:18;;;25604:56;25677:19;;2239:78:1;25280:422:18;6105:1045:3;6325:7;:14;6311:3;:10;:28;6303:81;;;;-1:-1:-1;;;6303:81:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;6402:16:3;;6394:66;;;;-1:-1:-1;;;6394:66:3;;;;;;;:::i;:::-;665:10:2;6513:60:3;665:10:2;6544:4:3;6550:2;6554:3;6559:7;6568:4;6513:20;:60::i;:::-;6589:9;6584:411;6608:3;:10;6604:1;:14;6584:411;;;6639:10;6652:3;6656:1;6652:6;;;;;;;;:::i;:::-;;;;;;;6639:19;;6672:14;6689:7;6697:1;6689:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6714:19;6736:13;;;;;;;;;;-1:-1:-1;;;;;6736:19:3;;;;;;;;;;;;6689:10;;-1:-1:-1;6777:21:3;;;;6769:76;;;;-1:-1:-1;;;6769:76:3;;;;;;;:::i;:::-;6887:9;:13;;;;;;;;;;;-1:-1:-1;;;;;6887:19:3;;;;;;;;;;6909:20;;;6887:42;;6957:17;;;;;;;:27;;6909:20;;6887:9;6957:27;;6909:20;;6957:27;:::i;:::-;;;;;;;;6625:370;;;6620:3;;;;:::i;:::-;;;6584:411;;;;7040:2;-1:-1:-1;;;;;7010:47:3;7034:4;-1:-1:-1;;;;;7010:47:3;7024:8;-1:-1:-1;;;;;7010:47:3;;7044:3;7049:7;7010:47;;;;;;;:::i;:::-;;;;;;;;7068:75;7104:8;7114:4;7120:2;7124:3;7129:7;7138:4;7068:35;:75::i;847:184:13:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;;847:184;-1:-1:-1;;;;847:184:13:o;757:229:0:-;939:40;956:2;960:3;965:7;974:4;939:16;:40::i;687:205:17:-;826:58;;;-1:-1:-1;;;;;15997:32:18;;826:58:17;;;15979:51:18;16046:18;;;;16039:34;;;826:58:17;;;;;;;;;;15952:18:18;;;;826:58:17;;;;;;;;-1:-1:-1;;;;;826:58:17;-1:-1:-1;;;826:58:17;;;799:86;;819:5;;799:19;:86::i;2034:169:15:-;2108:6;;;-1:-1:-1;;;;;2124:17:15;;;-1:-1:-1;;;;;;2124:17:15;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2079:124;2034:169;:::o;4962:797:3:-;-1:-1:-1;;;;;5143:16:3;;5135:66;;;;-1:-1:-1;;;5135:66:3;;;;;;;:::i;:::-;665:10:2;5254:96:3;665:10:2;5285:4:3;5291:2;5295:21;5313:2;5295:17;:21::i;:::-;5318:25;5336:6;5318:17;:25::i;:::-;5345:4;5254:20;:96::i;:::-;5361:19;5383:13;;;;;;;;;;;-1:-1:-1;;;;;5383:19:3;;;;;;;;;;5420:21;;;;5412:76;;;;-1:-1:-1;;;5412:76:3;;;;;;;:::i;:::-;5522:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5522:19:3;;;;;;;;;;5544:20;;;5522:42;;5584:17;;;;;;;:27;;5544:20;;5522:9;5584:27;;5544:20;;5584:27;:::i;:::-;;;;-1:-1:-1;;5627:46:3;;;37894:25:18;;;37950:2;37935:18;;37928:34;;;-1:-1:-1;;;;;5627:46:3;;;;;;;;;;;;;;37867:18:18;5627:46:3;;;;;;;5684:68;5715:8;5725:4;5731:2;5735;5739:6;5747:4;5684:30;:68::i;:::-;5125:634;;4962:797;;;;;:::o;992:174:0:-;1127:32;1139:7;1148:2;1152:6;1127:11;:32::i;11190:894:3:-;-1:-1:-1;;;;;11340:21:3;;11332:69;;;;-1:-1:-1;;;11332:69:3;;;;;;;:::i;:::-;11433:7;:14;11419:3;:10;:28;11411:81;;;;-1:-1:-1;;;11411:81:3;;;;;;;:::i;:::-;11503:16;665:10:2;11503:31:3;;11545:69;11566:8;11576:7;11593:1;11597:3;11602:7;11545:69;;;;;;;;;;;;:20;:69::i;:::-;11630:9;11625:379;11649:3;:10;11645:1;:14;11625:379;;;11680:10;11693:3;11697:1;11693:6;;;;;;;;:::i;:::-;;;;;;;11680:19;;11713:14;11730:7;11738:1;11730:10;;;;;;;;:::i;:::-;;;;;;;;;;;;11755:22;11780:13;;;;;;;;;;-1:-1:-1;;;;;11780:22:3;;;;;;;;;;;;11730:10;;-1:-1:-1;11824:24:3;;;;11816:73;;;;-1:-1:-1;;;11816:73:3;;;;;;;:::i;:::-;11931:9;:13;;;;;;;;;;;-1:-1:-1;;;;;11931:22:3;;;;;;;;;;11956:23;;11931:48;;11661:3;;;;:::i;:::-;;;;11625:379;;;;12060:1;-1:-1:-1;;;;;12019:58:3;12043:7;-1:-1:-1;;;;;12019:58:3;12033:8;-1:-1:-1;;;;;12019:58:3;;12064:3;12069:7;12019:58;;;;;;;:::i;:::-;;;;;;;;11322:762;11190:894;;;:::o;1386:313:0:-;1626:66;3657:432:14;13973:796:3;-1:-1:-1;;;;;14205:13:3;;1034:20:1;1080:8;14201:562:3;;14240:79;;-1:-1:-1;;;14240:79:3;;-1:-1:-1;;;;;14240:43:3;;;;;:79;;14284:8;;14294:4;;14300:3;;14305:7;;14314:4;;14240:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14240:79:3;;;;;;;;-1:-1:-1;;14240:79:3;;;;;;;;;;;;:::i;:::-;;;14236:517;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14629:6;14622:14;;-1:-1:-1;;;14622:14:3;;;;;;;;:::i;14236:517::-;;;14676:62;;-1:-1:-1;;;14676:62:3;;19295:2:18;14676:62:3;;;19277:21:18;19334:2;19314:18;;;19307:30;19373:34;19353:18;;;19346:62;-1:-1:-1;;;19424:18:18;;;19417:50;19484:19;;14676:62:3;19093:416:18;14236:517:3;-1:-1:-1;;;;;;14398:64:3;;-1:-1:-1;;;14398:64:3;14394:161;;14486:50;;-1:-1:-1;;;14486:50:3;;;;;;;:::i;1383:662:13:-;1466:7;1508:4;1466:7;1522:488;1546:5;:12;1542:1;:16;1522:488;;;1579:20;1602:5;1608:1;1602:8;;;;;;;;:::i;:::-;;;;;;;1579:31;;1644:12;1628;:28;1624:376;;2119:13;2167:15;;;2202:4;2195:15;;;2248:4;2232:21;;1754:57;;1624:376;;;2119:13;2167:15;;;2202:4;2195:15;;;2248:4;2232:21;;1928:57;;1624:376;-1:-1:-1;1560:3:13;;;;:::i;:::-;;;;1522:488;;9375:715:3;-1:-1:-1;;;;;9547:16:3;;9539:62;;;;-1:-1:-1;;;9539:62:3;;36374:2:18;9539:62:3;;;36356:21:18;36413:2;36393:18;;;36386:30;36452:34;36432:18;;;36425:62;-1:-1:-1;;;36503:18:18;;;36496:31;36544:19;;9539:62:3;36172:397:18;9539:62:3;9633:7;:14;9619:3;:10;:28;9611:81;;;;-1:-1:-1;;;9611:81:3;;;;;;;:::i;:::-;665:10:2;9745:66:3;665:10:2;9703:16:3;9788:2;9792:3;9797:7;9806:4;9745:20;:66::i;:::-;9827:9;9822:101;9846:3;:10;9842:1;:14;9822:101;;;9902:7;9910:1;9902:10;;;;;;;;:::i;:::-;;;;;;;9877:9;:17;9887:3;9891:1;9887:6;;;;;;;;:::i;:::-;;;;;;;9877:17;;;;;;;;;;;:21;9895:2;-1:-1:-1;;;;;9877:21:3;-1:-1:-1;;;;;9877:21:3;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;9858:3:3;;-1:-1:-1;9858:3:3;;;:::i;:::-;;;;9822:101;;;;9974:2;-1:-1:-1;;;;;9938:53:3;9970:1;-1:-1:-1;;;;;9938:53:3;9952:8;-1:-1:-1;;;;;9938:53:3;;9978:3;9983:7;9938:53;;;;;;;:::i;:::-;;;;;;;;10002:81;10038:8;10056:1;10060:2;10064:3;10069:7;10078:4;10002:35;:81::i;3193:706:17:-;3612:23;3638:69;3666:4;3638:69;;;;;;;;;;;;;;;;;3646:5;-1:-1:-1;;;;;3638:27:17;;;:69;;;;;:::i;:::-;3721:17;;3612:95;;-1:-1:-1;3721:21:17;3717:176;;3816:10;3805:30;;;;;;;;;;;;:::i;:::-;3797:85;;;;-1:-1:-1;;;3797:85:17;;35144:2:18;3797:85:17;;;35126:21:18;35183:2;35163:18;;;35156:30;35222:34;35202:18;;;35195:62;-1:-1:-1;;;35273:18:18;;;35266:40;35323:19;;3797:85:17;34942:406:18;14775:193:3;14894:16;;;14908:1;14894:16;;;;;;;;;14841;;14869:22;;14894:16;;;;;;;;;;;;-1:-1:-1;14894:16:3;14869:41;;14931:7;14920:5;14926:1;14920:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;14956:5;14775:193;-1:-1:-1;;14775:193:3:o;13238:729::-;-1:-1:-1;;;;;13445:13:3;;1034:20:1;1080:8;13441:520:3;;13480:72;;-1:-1:-1;;;13480:72:3;;-1:-1:-1;;;;;13480:38:3;;;;;:72;;13519:8;;13529:4;;13535:2;;13539:6;;13547:4;;13480:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13480:72:3;;;;;;;;-1:-1:-1;;13480:72:3;;;;;;;;;;;;:::i;:::-;;;13476:475;;;;:::i;:::-;-1:-1:-1;;;;;;13601:59:3;;-1:-1:-1;;;13601:59:3;13597:156;;13684:50;;-1:-1:-1;;;13684:50:3;;;;;;;:::i;10339:657::-;-1:-1:-1;;;;;10464:21:3;;10456:69;;;;-1:-1:-1;;;10456:69:3;;;;;;;:::i;:::-;665:10:2;10578:105:3;665:10:2;10609:7:3;10536:16;10630:21;10648:2;10630:17;:21::i;:::-;10653:25;10671:6;10653:17;:25::i;:::-;10578:105;;;;;;;;;;;;:20;:105::i;:::-;10694:22;10719:13;;;;;;;;;;;-1:-1:-1;;;;;10719:22:3;;;;;;;;;;10759:24;;;;10751:73;;;;-1:-1:-1;;;10751:73:3;;;;;;;:::i;:::-;10858:9;:13;;;;;;;;;;;-1:-1:-1;;;;;10858:22:3;;;;;;;;;;;;10883:23;;;10858:48;;10932:57;;37894:25:18;;;37935:18;;;37928:34;;;10858:22:3;;10932:57;;;;;;37867:18:18;10932:57:3;;;;;;;10446:550;;10339:657;;;:::o;3461:223:1:-;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3594;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:1;;33149:2:18;4828:60:1;;;33131:21:18;33188:2;33168:18;;;33161:30;33227:31;33207:18;;;33200:59;33276:18;;4828:60:1;32947:353:18;4828:60:1;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:1;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:52;5007:7;5016:10;5028:12;4989:17;:52::i;:::-;4982:59;4548:500;-1:-1:-1;;;;;;;4548:500:1:o;6950:692::-;7096:12;7124:7;7120:516;;;-1:-1:-1;7154:10:1;7147:17;;7120:516;7265:17;;:21;7261:365;;7459:10;7453:17;7519:15;7506:10;7502:2;7498:19;7491:44;7261:365;7598:12;7591:20;;-1:-1:-1;;;7591:20:1;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:367:18;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:18;;-1:-1:-1;;;;;214:30:18;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:735::-;440:5;493:3;486:4;478:6;474:17;470:27;460:55;;511:1;508;501:12;460:55;547:6;534:20;573:4;596:43;636:2;596:43;:::i;:::-;668:2;662:9;680:31;708:2;700:6;680:31;:::i;:::-;746:18;;;780:15;;;;-1:-1:-1;815:15:18;;;865:1;861:10;;;849:23;;845:32;;842:41;-1:-1:-1;839:61:18;;;896:1;893;886:12;839:61;918:1;928:163;942:2;939:1;936:9;928:163;;;999:17;;987:30;;1037:12;;;;1069;;;;960:1;953:9;928:163;;;-1:-1:-1;1109:6:18;;386:735;-1:-1:-1;;;;;;;386:735:18:o;1126:555::-;1168:5;1221:3;1214:4;1206:6;1202:17;1198:27;1188:55;;1239:1;1236;1229:12;1188:55;1275:6;1262:20;-1:-1:-1;;;;;1297:2:18;1294:26;1291:52;;;1323:18;;:::i;:::-;1372:2;1366:9;1384:67;1439:2;1420:13;;-1:-1:-1;;1416:27:18;1445:4;1412:38;1366:9;1384:67;:::i;:::-;1475:2;1467:6;1460:18;1521:3;1514:4;1509:2;1501:6;1497:15;1493:26;1490:35;1487:55;;;1538:1;1535;1528:12;1487:55;1602:2;1595:4;1587:6;1583:17;1576:4;1568:6;1564:17;1551:54;1649:1;1625:15;;;1642:4;1621:26;1614:37;;;;1629:6;1126:555;-1:-1:-1;;;1126:555:18:o;1686:247::-;1745:6;1798:2;1786:9;1777:7;1773:23;1769:32;1766:52;;;1814:1;1811;1804:12;1766:52;1853:9;1840:23;1872:31;1897:5;1872:31;:::i;2198:388::-;2266:6;2274;2327:2;2315:9;2306:7;2302:23;2298:32;2295:52;;;2343:1;2340;2333:12;2295:52;2382:9;2369:23;2401:31;2426:5;2401:31;:::i;:::-;2451:5;-1:-1:-1;2508:2:18;2493:18;;2480:32;2521:33;2480:32;2521:33;:::i;:::-;2573:7;2563:17;;;2198:388;;;;;:::o;2591:1071::-;2745:6;2753;2761;2769;2777;2830:3;2818:9;2809:7;2805:23;2801:33;2798:53;;;2847:1;2844;2837:12;2798:53;2886:9;2873:23;2905:31;2930:5;2905:31;:::i;:::-;2955:5;-1:-1:-1;3012:2:18;2997:18;;2984:32;3025:33;2984:32;3025:33;:::i;:::-;3077:7;-1:-1:-1;3135:2:18;3120:18;;3107:32;-1:-1:-1;;;;;3188:14:18;;;3185:34;;;3215:1;3212;3205:12;3185:34;3238:61;3291:7;3282:6;3271:9;3267:22;3238:61;:::i;:::-;3228:71;;3352:2;3341:9;3337:18;3324:32;3308:48;;3381:2;3371:8;3368:16;3365:36;;;3397:1;3394;3387:12;3365:36;3420:63;3475:7;3464:8;3453:9;3449:24;3420:63;:::i;:::-;3410:73;;3536:3;3525:9;3521:19;3508:33;3492:49;;3566:2;3556:8;3553:16;3550:36;;;3582:1;3579;3572:12;3550:36;;3605:51;3648:7;3637:8;3626:9;3622:24;3605:51;:::i;:::-;3595:61;;;2591:1071;;;;;;;;:::o;3667:734::-;3771:6;3779;3787;3795;3803;3856:3;3844:9;3835:7;3831:23;3827:33;3824:53;;;3873:1;3870;3863:12;3824:53;3912:9;3899:23;3931:31;3956:5;3931:31;:::i;:::-;3981:5;-1:-1:-1;4038:2:18;4023:18;;4010:32;4051:33;4010:32;4051:33;:::i;:::-;4103:7;-1:-1:-1;4157:2:18;4142:18;;4129:32;;-1:-1:-1;4208:2:18;4193:18;;4180:32;;-1:-1:-1;4263:3:18;4248:19;;4235:33;-1:-1:-1;;;;;4280:30:18;;4277:50;;;4323:1;4320;4313:12;4277:50;4346:49;4387:7;4378:6;4367:9;4363:22;4346:49;:::i;4406:908::-;4537:6;4545;4553;4561;4569;4622:2;4610:9;4601:7;4597:23;4593:32;4590:52;;;4638:1;4635;4628:12;4590:52;4677:9;4664:23;4696:31;4721:5;4696:31;:::i;:::-;4746:5;-1:-1:-1;4802:2:18;4787:18;;4774:32;-1:-1:-1;;;;;4855:14:18;;;4852:34;;;4882:1;4879;4872:12;4852:34;4921:70;4983:7;4974:6;4963:9;4959:22;4921:70;:::i;:::-;5010:8;;-1:-1:-1;4895:96:18;-1:-1:-1;5098:2:18;5083:18;;5070:32;;-1:-1:-1;5114:16:18;;;5111:36;;;5143:1;5140;5133:12;5111:36;;5182:72;5246:7;5235:8;5224:9;5220:24;5182:72;:::i;:::-;4406:908;;;;-1:-1:-1;4406:908:18;;-1:-1:-1;5273:8:18;;5156:98;4406:908;-1:-1:-1;;;4406:908:18:o;5319:730::-;5446:6;5454;5462;5515:2;5503:9;5494:7;5490:23;5486:32;5483:52;;;5531:1;5528;5521:12;5483:52;5570:9;5557:23;5589:31;5614:5;5589:31;:::i;:::-;5639:5;-1:-1:-1;5695:2:18;5680:18;;5667:32;-1:-1:-1;;;;;5748:14:18;;;5745:34;;;5775:1;5772;5765:12;5745:34;5798:61;5851:7;5842:6;5831:9;5827:22;5798:61;:::i;:::-;5788:71;;5912:2;5901:9;5897:18;5884:32;5868:48;;5941:2;5931:8;5928:16;5925:36;;;5957:1;5954;5947:12;5925:36;;5980:63;6035:7;6024:8;6013:9;6009:24;5980:63;:::i;:::-;5970:73;;;5319:730;;;;;:::o;6054:382::-;6119:6;6127;6180:2;6168:9;6159:7;6155:23;6151:32;6148:52;;;6196:1;6193;6186:12;6148:52;6235:9;6222:23;6254:31;6279:5;6254:31;:::i;:::-;6304:5;-1:-1:-1;6361:2:18;6346:18;;6333:32;6374:30;6333:32;6374:30;:::i;6441:315::-;6509:6;6517;6570:2;6558:9;6549:7;6545:23;6541:32;6538:52;;;6586:1;6583;6576:12;6538:52;6625:9;6612:23;6644:31;6669:5;6644:31;:::i;:::-;6694:5;6746:2;6731:18;;;;6718:32;;-1:-1:-1;;;6441:315:18:o;6761:383::-;6838:6;6846;6854;6907:2;6895:9;6886:7;6882:23;6878:32;6875:52;;;6923:1;6920;6913:12;6875:52;6962:9;6949:23;6981:31;7006:5;6981:31;:::i;:::-;7031:5;7083:2;7068:18;;7055:32;;-1:-1:-1;7134:2:18;7119:18;;;7106:32;;6761:383;-1:-1:-1;;;6761:383:18:o;7149:1288::-;7267:6;7275;7328:2;7316:9;7307:7;7303:23;7299:32;7296:52;;;7344:1;7341;7334:12;7296:52;7384:9;7371:23;-1:-1:-1;;;;;7454:2:18;7446:6;7443:14;7440:34;;;7470:1;7467;7460:12;7440:34;7508:6;7497:9;7493:22;7483:32;;7553:7;7546:4;7542:2;7538:13;7534:27;7524:55;;7575:1;7572;7565:12;7524:55;7611:2;7598:16;7633:4;7656:43;7696:2;7656:43;:::i;:::-;7728:2;7722:9;7740:31;7768:2;7760:6;7740:31;:::i;:::-;7806:18;;;7840:15;;;;-1:-1:-1;7875:11:18;;;7917:1;7913:10;;;7905:19;;7901:28;;7898:41;-1:-1:-1;7895:61:18;;;7952:1;7949;7942:12;7895:61;7974:1;7965:10;;7984:238;7998:2;7995:1;7992:9;7984:238;;;8069:3;8056:17;8086:31;8111:5;8086:31;:::i;:::-;8130:18;;8016:1;8009:9;;;;;8168:12;;;;8200;;7984:238;;;-1:-1:-1;8241:6:18;-1:-1:-1;;8285:18:18;;8272:32;;-1:-1:-1;;8316:16:18;;;8313:36;;;8345:1;8342;8335:12;8313:36;;8368:63;8423:7;8412:8;8401:9;8397:24;8368:63;:::i;:::-;8358:73;;;7149:1288;;;;;:::o;8442:773::-;8564:6;8572;8580;8588;8641:2;8629:9;8620:7;8616:23;8612:32;8609:52;;;8657:1;8654;8647:12;8609:52;8697:9;8684:23;-1:-1:-1;;;;;8767:2:18;8759:6;8756:14;8753:34;;;8783:1;8780;8773:12;8753:34;8822:70;8884:7;8875:6;8864:9;8860:22;8822:70;:::i;:::-;8911:8;;-1:-1:-1;8796:96:18;-1:-1:-1;8999:2:18;8984:18;;8971:32;;-1:-1:-1;9015:16:18;;;9012:36;;;9044:1;9041;9034:12;9012:36;;9083:72;9147:7;9136:8;9125:9;9121:24;9083:72;:::i;:::-;8442:773;;;;-1:-1:-1;9174:8:18;-1:-1:-1;;;;8442:773:18:o;9220:245::-;9287:6;9340:2;9328:9;9319:7;9315:23;9311:32;9308:52;;;9356:1;9353;9346:12;9308:52;9388:9;9382:16;9407:28;9429:5;9407:28;:::i;9470:248::-;9538:6;9546;9599:2;9587:9;9578:7;9574:23;9570:32;9567:52;;;9615:1;9612;9605:12;9567:52;-1:-1:-1;;9638:23:18;;;9708:2;9693:18;;;9680:32;;-1:-1:-1;9470:248:18:o;9723:245::-;9781:6;9834:2;9822:9;9813:7;9809:23;9805:32;9802:52;;;9850:1;9847;9840:12;9802:52;9889:9;9876:23;9908:30;9932:5;9908:30;:::i;9973:249::-;10042:6;10095:2;10083:9;10074:7;10070:23;10066:32;10063:52;;;10111:1;10108;10101:12;10063:52;10143:9;10137:16;10162:30;10186:5;10162:30;:::i;10902:321::-;10971:6;11024:2;11012:9;11003:7;10999:23;10995:32;10992:52;;;11040:1;11037;11030:12;10992:52;11080:9;11067:23;-1:-1:-1;;;;;11105:6:18;11102:30;11099:50;;;11145:1;11142;11135:12;11099:50;11168:49;11209:7;11200:6;11189:9;11185:22;11168:49;:::i;:::-;11158:59;10902:321;-1:-1:-1;;;;10902:321:18:o;11228:180::-;11287:6;11340:2;11328:9;11319:7;11315:23;11311:32;11308:52;;;11356:1;11353;11346:12;11308:52;-1:-1:-1;11379:23:18;;11228:180;-1:-1:-1;11228:180:18:o;11413:184::-;11483:6;11536:2;11524:9;11515:7;11511:23;11507:32;11504:52;;;11552:1;11549;11542:12;11504:52;-1:-1:-1;11575:16:18;;11413:184;-1:-1:-1;11413:184:18:o;11602:745::-;11708:6;11716;11724;11732;11785:3;11773:9;11764:7;11760:23;11756:33;11753:53;;;11802:1;11799;11792:12;11753:53;11838:9;11825:23;11815:33;;11899:2;11888:9;11884:18;11871:32;-1:-1:-1;;;;;11963:2:18;11955:6;11952:14;11949:34;;;11979:1;11976;11969:12;11949:34;12002:49;12043:7;12034:6;12023:9;12019:22;12002:49;:::i;:::-;11992:59;;12101:2;12090:9;12086:18;12073:32;12060:45;;12114:31;12139:5;12114:31;:::i;:::-;12164:5;;-1:-1:-1;12222:2:18;12207:18;;12194:32;;12238:16;;;12235:36;;;12267:1;12264;12257:12;12235:36;;12290:51;12333:7;12322:8;12311:9;12307:24;12290:51;:::i;:::-;12280:61;;;11602:745;;;;;;;:::o;12352:814::-;12467:6;12475;12483;12491;12499;12552:3;12540:9;12531:7;12527:23;12523:33;12520:53;;;12569:1;12566;12559:12;12520:53;12605:9;12592:23;12582:33;;12666:2;12655:9;12651:18;12638:32;-1:-1:-1;;;;;12730:2:18;12722:6;12719:14;12716:34;;;12746:1;12743;12736:12;12716:34;12769:49;12810:7;12801:6;12790:9;12786:22;12769:49;:::i;:::-;12759:59;;12868:2;12857:9;12853:18;12840:32;12827:45;;12881:31;12906:5;12881:31;:::i;:::-;12931:5;;-1:-1:-1;12983:2:18;12968:18;;12955:32;;-1:-1:-1;13040:3:18;13025:19;;13012:33;;13057:16;;;13054:36;;;13086:1;13083;13076:12;13171:457;13258:6;13266;13274;13327:2;13315:9;13306:7;13302:23;13298:32;13295:52;;;13343:1;13340;13333:12;13295:52;13379:9;13366:23;13356:33;;13436:2;13425:9;13421:18;13408:32;13398:42;;13491:2;13480:9;13476:18;13463:32;-1:-1:-1;;;;;13510:6:18;13507:30;13504:50;;;13550:1;13547;13540:12;13504:50;13573:49;13614:7;13605:6;13594:9;13590:22;13573:49;:::i;13633:526::-;13729:6;13737;13745;13753;13806:3;13794:9;13785:7;13781:23;13777:33;13774:53;;;13823:1;13820;13813:12;13774:53;13859:9;13846:23;13836:33;;13916:2;13905:9;13901:18;13888:32;13878:42;;13971:2;13960:9;13956:18;13943:32;-1:-1:-1;;;;;13990:6:18;13987:30;13984:50;;;14030:1;14027;14020:12;13984:50;14053:49;14094:7;14085:6;14074:9;14070:22;14053:49;:::i;:::-;13633:526;;;;-1:-1:-1;14043:59:18;;14149:2;14134:18;14121:32;;-1:-1:-1;;;13633:526:18:o;14164:435::-;14217:3;14255:5;14249:12;14282:6;14277:3;14270:19;14308:4;14337:2;14332:3;14328:12;14321:19;;14374:2;14367:5;14363:14;14395:1;14405:169;14419:6;14416:1;14413:13;14405:169;;;14480:13;;14468:26;;14514:12;;;;14549:15;;;;14441:1;14434:9;14405:169;;;-1:-1:-1;14590:3:18;;14164:435;-1:-1:-1;;;;;14164:435:18:o;14604:257::-;14645:3;14683:5;14677:12;14710:6;14705:3;14698:19;14726:63;14782:6;14775:4;14770:3;14766:14;14759:4;14752:5;14748:16;14726:63;:::i;:::-;14843:2;14822:15;-1:-1:-1;;14818:29:18;14809:39;;;;14850:4;14805:50;;14604:257;-1:-1:-1;;14604:257:18:o;15100:274::-;15229:3;15267:6;15261:13;15283:53;15329:6;15324:3;15317:4;15309:6;15305:17;15283:53;:::i;:::-;15352:16;;;;;15100:274;-1:-1:-1;;15100:274:18:o;16084:826::-;-1:-1:-1;;;;;16481:15:18;;;16463:34;;16533:15;;16528:2;16513:18;;16506:43;16443:3;16580:2;16565:18;;16558:31;;;16406:4;;16612:57;;16649:19;;16641:6;16612:57;:::i;:::-;16717:9;16709:6;16705:22;16700:2;16689:9;16685:18;16678:50;16751:44;16788:6;16780;16751:44;:::i;:::-;16737:58;;16844:9;16836:6;16832:22;16826:3;16815:9;16811:19;16804:51;16872:32;16897:6;16889;16872:32;:::i;:::-;16864:40;16084:826;-1:-1:-1;;;;;;;;16084:826:18:o;16915:560::-;-1:-1:-1;;;;;17212:15:18;;;17194:34;;17264:15;;17259:2;17244:18;;17237:43;17311:2;17296:18;;17289:34;;;17354:2;17339:18;;17332:34;;;17174:3;17397;17382:19;;17375:32;;;17137:4;;17424:45;;17449:19;;17441:6;17424:45;:::i;17759:261::-;17938:2;17927:9;17920:21;17901:4;17958:56;18010:2;17999:9;17995:18;17987:6;17958:56;:::i;18025:465::-;18282:2;18271:9;18264:21;18245:4;18308:56;18360:2;18349:9;18345:18;18337:6;18308:56;:::i;:::-;18412:9;18404:6;18400:22;18395:2;18384:9;18380:18;18373:50;18440:44;18477:6;18469;18440:44;:::i;:::-;18432:52;18025:465;-1:-1:-1;;;;;18025:465:18:o;18869:219::-;19018:2;19007:9;19000:21;18981:4;19038:44;19078:2;19067:9;19063:18;19055:6;19038:44;:::i;19514:404::-;19716:2;19698:21;;;19755:2;19735:18;;;19728:30;19794:34;19789:2;19774:18;;19767:62;-1:-1:-1;;;19860:2:18;19845:18;;19838:38;19908:3;19893:19;;19514:404::o;22813:400::-;23015:2;22997:21;;;23054:2;23034:18;;;23027:30;23093:34;23088:2;23073:18;;23066:62;-1:-1:-1;;;23159:2:18;23144:18;;23137:34;23203:3;23188:19;;22813:400::o;24047:405::-;24249:2;24231:21;;;24288:2;24268:18;;;24261:30;24327:34;24322:2;24307:18;;24300:62;-1:-1:-1;;;24393:2:18;24378:18;;24371:39;24442:3;24427:19;;24047:405::o;24457:402::-;24659:2;24641:21;;;24698:2;24678:18;;;24671:30;24737:34;24732:2;24717:18;;24710:62;-1:-1:-1;;;24803:2:18;24788:18;;24781:36;24849:3;24834:19;;24457:402::o;26472:407::-;26674:2;26656:21;;;26713:2;26693:18;;;26686:30;26752:34;26747:2;26732:18;;26725:62;-1:-1:-1;;;26818:2:18;26803:18;;26796:41;26869:3;26854:19;;26472:407::o;28902:401::-;29104:2;29086:21;;;29143:2;29123:18;;;29116:30;29182:34;29177:2;29162:18;;29155:62;-1:-1:-1;;;29248:2:18;29233:18;;29226:35;29293:3;29278:19;;28902:401::o;29727:399::-;29929:2;29911:21;;;29968:2;29948:18;;;29941:30;30007:34;30002:2;29987:18;;29980:62;-1:-1:-1;;;30073:2:18;30058:18;;30051:33;30116:3;30101:19;;29727:399::o;30539:406::-;30741:2;30723:21;;;30780:2;30760:18;;;30753:30;30819:34;30814:2;30799:18;;30792:62;-1:-1:-1;;;30885:2:18;30870:18;;30863:40;30935:3;30920:19;;30539:406::o;31365:356::-;31567:2;31549:21;;;31586:18;;;31579:30;31645:34;31640:2;31625:18;;31618:62;31712:2;31697:18;;31365:356::o;35763:404::-;35965:2;35947:21;;;36004:2;35984:18;;;35977:30;36043:34;36038:2;36023:18;;36016:62;-1:-1:-1;;;36109:2:18;36094:18;;36087:38;36157:3;36142:19;;35763:404::o;37164:551::-;37417:6;37406:9;37399:25;37460:3;37455:2;37444:9;37440:18;37433:31;37380:4;37487:45;37527:3;37516:9;37512:19;37504:6;37487:45;:::i;:::-;-1:-1:-1;;;;;37568:32:18;;37563:2;37548:18;;37541:60;37637:22;;;37632:2;37617:18;;37610:50;37677:32;37641:6;37694;37677:32;:::i;37973:361::-;38178:6;38167:9;38160:25;38221:6;38216:2;38205:9;38201:18;38194:34;38264:2;38259;38248:9;38244:18;38237:30;38141:4;38284:44;38324:2;38313:9;38309:18;38301:6;38284:44;:::i;38339:183::-;38399:4;-1:-1:-1;;;;;38424:6:18;38421:30;38418:56;;;38454:18;;:::i;:::-;-1:-1:-1;38499:1:18;38495:14;38511:4;38491:25;;38339:183::o;38527:128::-;38567:3;38598:1;38594:6;38591:1;38588:13;38585:39;;;38604:18;;:::i;:::-;-1:-1:-1;38640:9:18;;38527:128::o;38660:217::-;38700:1;38726;38716:132;;38770:10;38765:3;38761:20;38758:1;38751:31;38805:4;38802:1;38795:15;38833:4;38830:1;38823:15;38716:132;-1:-1:-1;38862:9:18;;38660:217::o;38882:168::-;38922:7;38988:1;38984;38980:6;38976:14;38973:1;38970:21;38965:1;38958:9;38951:17;38947:45;38944:71;;;38995:18;;:::i;:::-;-1:-1:-1;39035:9:18;;38882:168::o;39055:125::-;39095:4;39123:1;39120;39117:8;39114:34;;;39128:18;;:::i;:::-;-1:-1:-1;39165:9:18;;39055:125::o;39185:258::-;39257:1;39267:113;39281:6;39278:1;39275:13;39267:113;;;39357:11;;;39351:18;39338:11;;;39331:39;39303:2;39296:10;39267:113;;;39398:6;39395:1;39392:13;39389:48;;;-1:-1:-1;;39433:1:18;39415:16;;39408:27;39185:258::o;39448:380::-;39527:1;39523:12;;;;39570;;;39591:61;;39645:4;39637:6;39633:17;39623:27;;39591:61;39698:2;39690:6;39687:14;39667:18;39664:38;39661:161;;;39744:10;39739:3;39735:20;39732:1;39725:31;39779:4;39776:1;39769:15;39807:4;39804:1;39797:15;39661:161;;39448:380;;;:::o;39833:249::-;39943:2;39924:13;;-1:-1:-1;;39920:27:18;39908:40;;-1:-1:-1;;;;;39963:34:18;;39999:22;;;39960:62;39957:88;;;40025:18;;:::i;:::-;40061:2;40054:22;-1:-1:-1;;39833:249:18:o;40087:135::-;40126:3;-1:-1:-1;;40147:17:18;;40144:43;;;40167:18;;:::i;:::-;-1:-1:-1;40214:1:18;40203:13;;40087:135::o;40227:127::-;40288:10;40283:3;40279:20;40276:1;40269:31;40319:4;40316:1;40309:15;40343:4;40340:1;40333:15;40359:127;40420:10;40415:3;40411:20;40408:1;40401:31;40451:4;40448:1;40441:15;40475:4;40472:1;40465:15;40491:127;40552:10;40547:3;40543:20;40540:1;40533:31;40583:4;40580:1;40573:15;40607:4;40604:1;40597:15;40623:179;40658:3;40700:1;40682:16;40679:23;40676:120;;;40746:1;40743;40740;40725:23;-1:-1:-1;40783:1:18;40777:8;40772:3;40768:18;40676:120;40623:179;:::o;40807:671::-;40846:3;40888:4;40870:16;40867:26;40864:39;;;40807:671;:::o;40864:39::-;40930:2;40924:9;-1:-1:-1;;40995:16:18;40991:25;;40988:1;40924:9;40967:50;41046:4;41040:11;41070:16;-1:-1:-1;;;;;41176:2:18;41169:4;41161:6;41157:17;41154:25;41149:2;41141:6;41138:14;41135:45;41132:58;;;41183:5;;;;;40807:671;:::o;41132:58::-;41220:6;41214:4;41210:17;41199:28;;41256:3;41250:10;41283:2;41275:6;41272:14;41269:27;;;41289:5;;;;;;40807:671;:::o;41269:27::-;41373:2;41354:16;41348:4;41344:27;41340:36;41333:4;41324:6;41319:3;41315:16;41311:27;41308:69;41305:82;;;41380:5;;;;;;40807:671;:::o;41305:82::-;41396:57;41447:4;41438:6;41430;41426:19;41422:30;41416:4;41396:57;:::i;:::-;-1:-1:-1;41469:3:18;;40807:671;-1:-1:-1;;;;;40807:671:18:o;41483:131::-;-1:-1:-1;;;;;41558:31:18;;41548:42;;41538:70;;41604:1;41601;41594:12;41619:118;41705:5;41698:13;41691:21;41684:5;41681:32;41671:60;;41727:1;41724;41717:12;41742:131;-1:-1:-1;;;;;;41816:32:18;;41806:43;;41796:71;;41863:1;41860;41853:12

Swarm Source

ipfs://7a5841cbfa628809987a6f14af662fc6ba3924d3621c236e3f869dc90dbd6b82
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.