ETH Price: $3,321.15 (-2.02%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Safe Transfer Fr...214590952024-12-22 16:01:119 days ago1734883271IN
0x1C57a5eE...642b943b1
0 ETH0.000360297.83010019
Safe Transfer Fr...186967732023-12-02 5:56:59396 days ago1701496619IN
0x1C57a5eE...642b943b1
0 ETH0.0030519525.93720404
Set Approval For...172477802023-05-13 1:22:23599 days ago1683940943IN
0x1C57a5eE...642b943b1
0 ETH0.0035719977.25741293
Safe Transfer Fr...170838982023-04-19 23:29:47622 days ago1681946987IN
0x1C57a5eE...642b943b1
0 ETH0.0106468294.21386181
Safe Transfer Fr...169445522023-03-31 3:36:47642 days ago1680233807IN
0x1C57a5eE...642b943b1
0 ETH0.0009945221.62470275
Set Approval For...167213482023-02-27 18:35:23673 days ago1677522923IN
0x1C57a5eE...642b943b1
0 ETH0.0006822625.90712256
Set Approval For...167213382023-02-27 18:33:23673 days ago1677522803IN
0x1C57a5eE...642b943b1
0 ETH0.0013005428.12900277
Safe Transfer Fr...160773942022-11-29 18:19:47763 days ago1669745987IN
0x1C57a5eE...642b943b1
0 ETH0.000531515.70868387
Safe Transfer Fr...160414292022-11-24 17:47:59768 days ago1669312079IN
0x1C57a5eE...642b943b1
0 ETH0.000562112.21598841
Safe Transfer Fr...160074382022-11-19 23:47:11773 days ago1668901631IN
0x1C57a5eE...642b943b1
0 ETH0.0012628511.17620411
Safe Transfer Fr...158933742022-11-04 1:29:35789 days ago1667525375IN
0x1C57a5eE...642b943b1
0 ETH0.0005252111.47405647
Safe Transfer Fr...158483752022-10-28 18:32:59795 days ago1666981979IN
0x1C57a5eE...642b943b1
0 ETH0.0016008425.61974152
Safe Transfer Fr...155247362022-09-13 3:42:02841 days ago1663040522IN
0x1C57a5eE...642b943b1
0 ETH0.001087439.62270166
Set Base Uri For...154476682022-08-31 16:28:48853 days ago1661963328IN
0x1C57a5eE...642b943b1
0 ETH0.0023510920.02650478
Set Approval For...154265462022-08-28 7:38:24857 days ago1661672304IN
0x1C57a5eE...642b943b1
0 ETH0.00013873
Safe Transfer Fr...153987632022-08-23 20:33:41861 days ago1661286821IN
0x1C57a5eE...642b943b1
0 ETH0.0019419720.26019151
Set Base Uri For...153749612022-08-20 2:21:38865 days ago1660962098IN
0x1C57a5eE...642b943b1
0 ETH0.0004907211.31090948
Set Base Uri For...153749562022-08-20 2:20:13865 days ago1660962013IN
0x1C57a5eE...642b943b1
0 ETH0.0005358710.93953819
Set Royalty Addr...153546282022-08-16 21:03:18868 days ago1660683798IN
0x1C57a5eE...642b943b1
0 ETH0.0005677418.77509994
Set Base Uri For...153546252022-08-16 21:02:52868 days ago1660683772IN
0x1C57a5eE...642b943b1
0 ETH0.0019379116.50876336
Set Allowed Crea...153546232022-08-16 21:02:14868 days ago1660683734IN
0x1C57a5eE...642b943b1
0 ETH0.0007484115.64735979
Set Approval For...152028452022-07-24 3:12:00892 days ago1658632320IN
0x1C57a5eE...642b943b1
0 ETH0.000269325.8252128
Set Base Uri For...150793332022-07-05 0:43:06911 days ago1656981786IN
0x1C57a5eE...642b943b1
0 ETH0.0006305716.72561337
Set Allowed Crea...150793302022-07-05 0:42:41911 days ago1656981761IN
0x1C57a5eE...642b943b1
0 ETH0.000870618.20206706
Set Allowed Crea...150783952022-07-04 21:08:02911 days ago1656968882IN
0x1C57a5eE...642b943b1
0 ETH0.0005751518.72199999
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
147434732022-05-09 16:44:15967 days ago1652114655
0x1C57a5eE...642b943b1
 Contract Creation0 ETH
147434732022-05-09 16:44:15967 days ago1652114655
0x1C57a5eE...642b943b1
 Contract Creation0 ETH
147434732022-05-09 16:44:15967 days ago1652114655
0x1C57a5eE...642b943b1
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MementoRise

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-09
*/

// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
 EverRise Memento NFTs are awards for completing EverRise staking terms,
 participating in events and winning challenges.

  ___________      ________                              _______   __
 '._==_==_=_.'    /        |                            /       \ /  |
 .-\:      /-.   $$$$$$$$/__     __  ______    ______  $$$$$$$  |$$/   _______   ______  v3.14159265
| (|:.     |) |  $$ |__  /  \   /  |/      \  /      \ $$ |__$$ |/  | /       | /      \
 '-|:.     |-'   $$    | $$  \ /$$//$$$$$$  |/$$$$$$  |$$    $$< $$ |/$$$$$$$/ /$$$$$$  |
   \::.    /     $$$$$/   $$  /$$/ $$    $$ |$$ |  $$/ $$$$$$$  |$$ |$$      \ $$    $$ |
    '::. .'      $$ |_____ $$ $$/  $$$$$$$$/ $$ |      $$ |  $$ |$$ | $$$$$$  |$$$$$$$$/
      ) (        $$       | $$$/   $$       |$$ |      $$ |  $$ |$$ |/     $$/ $$       |
    _.' '._      $$$$$$$$/   $/     $$$$$$$/ $$/       $$/   $$/ $$/ $$$$$$$/   $$$$$$$/ Magnum opus
   `"""""""`     

Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://everrise.com
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

error NotSetup();                          // 0xb09c99c0
error WalletLocked();                      // 0xd550ed24
error FailedEthSend();                     // 0xb5747cc7
error NotZeroAddress();                    // 0x66385fa3
error CallerNotApproved();                 // 0x4014f1a5
error InvalidAddress();                    // 0xe6c4247b
error CallerNotOwner();                    // 0x5cd83192
error AmountMustBeGreaterThanZero();       // 0x5e85ae73
error AmountOutOfRange();                  // 0xc64200e9

address constant EverMigrateAddress = 0x429CA183C5f4B43F09D70580C5365a6D21ccCd47;
address constant EverRiseV1Address_BSC = 0xC7D43F2B51F44f09fBB8a691a0451E8FFCF36c0a;
address constant EverRiseV1Address_ETH = 0x8A2D988Fe2E8c6716cbCeF1B33Df626C692F7B98;
address constant EverRiseV2Address = 0x0cD022ddE27169b20895e0e2B2B8A33B25e63579;
address constant EverRiseV2Address_AVAX = 0xC3A8d300333BFfE3ddF6166F2Bc84E6d38351BED;
address constant EverRiseV3Address = 0xC17c30e98541188614dF99239cABD40280810cA3;
address constant nftRiseV3Address = 0x23cD2E6b283754Fd2340a75732f9DdBb5d11807e;

// Testnet
// address constant EverRiseV3Address = 0x1665E2b184F352d226A882281f69ccf361349CC6;
//address constant nftRiseV3Address = 0x0D3770c2318F84E33d0B0efEc8EfD2086683F0b2;
//address constant EverRiseV3Address = 0x639631Ac62abE60c4F67278f80ca3291047eFc1B;
// address constant nftRiseV3Address = 0x617cBE19e7A74dF4fb58eFE5830586c3466CC091;

address constant mintFeeAddress = 0xc3b7FfA7611C45C1245a1923065442BC94Af9757;
address constant royaltyFeeAddress = 0x0BFc8f6374028f1a61Ae3019E5C845F461575381;
bytes constant ipfsAddress = "ipfs://bafybeidj6gy62qkgwi6ww32iw2khbjcusf3xefvi2gugykdfau54mvux54/metaOutput/";

interface ICreateRecipe {
    function createTo(address account, uint256 toTokenId, uint256 toAmount) external;
}

// File: memeRISE/ITransmuteRecipe.sol

interface ITransmuteSingleRecipe {
    function transmuteSingleTo(
        address account,
        uint256 toToken,
        uint256 toAmount,
        uint256[] calldata fromIds,
        uint256[] calldata fromAmounts)
    external;
}

interface ITransmuteMultipleRecipe {
    function transmuteMultipleTo(
        address account,
        uint256[] calldata toTokenIds,
        uint256[] calldata toAmounts,
        uint256[] calldata fromIds,
        uint256[] calldata fromAmounts)
    external;
}

// File: memeRISE/Abstract/nativeCoinSender.sol

contract NativeCoinSender {
    function sendEthViaCall(address payable to, uint256 amount) internal {
        (bool sent, ) = to.call{value: amount}("");
        if (!sent) revert FailedEthSend();
    }
}

// File: memeRISE/Interfaces/IEverRoyaltySplitter.sol

interface IEverRoyaltySplitter {
    event RoyaltiesSplit(uint256 value);
    event SplitUpdated(uint256 previous, uint256 current);
    event UniswapV2RouterSet(address indexed previous, address indexed current);
    event EverRiseEcosystemSet(address indexed previous, address indexed current);
    event EverRiseTokenSet(address indexed previous, address indexed current);
    event StableCoinSet(address indexed previous, address indexed current);

    function distribute() external;
}

// File: memeRISE/Interfaces/IERC173-Ownable.sol

interface IOwnable {
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    function owner() external view returns (address);
    function transferOwnership(address newOwner) external;
}

// File: memeRISE/Abstract/Context.sol

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }
}

// File: memeRISE/Abstract/ERC173-Ownable.sol

contract Ownable is IOwnable, Context {
    address public owner;

    function _onlyOwner() private view {
        if (owner != _msgSender()) revert CallerNotOwner();
    }

    modifier onlyOwner() {
        _onlyOwner();
        _;
    }

    constructor() {
        address msgSender = _msgSender();
        owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        if (newOwner == address(0)) revert NotZeroAddress();

        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }
}

// File: memeRISE/Interfaces/IERC20-Token.sol

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function transferFromWithPermit(address sender, address recipient, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

// File: memeRISE/Interfaces/IEverRise.sol

struct ApprovalChecks {
    // Prevent permits being reused (IERC2612)
    uint64 nonce;
    // Allow revoke all spenders/operators approvals in single txn
    uint32 nftCheck;
    uint32 tokenCheck;
    // Allow auto timeout on approvals
    uint16 autoRevokeNftHours;
    uint16 autoRevokeTokenHours;
    // Allow full wallet locking of all transfers
    uint48 unlockTimestamp;
}

struct Allowance {
    uint128 tokenAmount;
    uint32 nftCheck;
    uint32 tokenCheck;
    uint48 timestamp;
    uint8 nftApproval;
    uint8 tokenApproval;
}

interface IEverRise is IERC20Metadata {
    function totalBuyVolume() external view returns (uint256);
    function totalSellVolume() external view returns (uint256);
    function holders() external view returns (uint256);
    function uniswapV2Pair() external view returns (address);
    function transferStake(address fromAddress, address toAddress, uint96 amountToTransfer) external;
    function isWalletLocked(address fromAddress) external view returns (bool);
    function setApprovalForAll(address fromAddress, address operator, bool approved) external;
    function isApprovedForAll(address account, address operator) external view returns (bool);
    function isExcludedFromFee(address account) external view returns (bool);

    function approvals(address operator) external view returns (ApprovalChecks memory);
}

// File: memeRISE/Interfaces/IERC165-SupportsInterface.sol

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: memeRISE/Abstract/ERC165-SupportsInterface.sol

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: memeRISE/Interfaces/IERC2981-Royalty.sol

interface IERC2981 is IERC165 {
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (
        address receiver,
        uint256 royaltyAmount
    );
}

// File: memeRISE/Abstract/royaltyHandler.sol

abstract contract royaltyHandler is IERC2981, Ownable {
    event RoyaltyFeeUpdated(uint256 newValue);
    event RoyaltyAddressUpdated(address indexed contractAddress);

    IEverRoyaltySplitter public royaltySplitter;
    uint256 public defaultRoyaltySplit = 5;

    function setDefaultNftRoyaltyFeePercent(uint256 royaltySplitRate) external onlyOwner {
        if (royaltySplitRate > 10) revert AmountOutOfRange();
        defaultRoyaltySplit = royaltySplitRate;

        emit RoyaltyFeeUpdated(royaltySplitRate);
    }

    function setRoyaltyAddress(address newAddress) external onlyOwner {
        if (newAddress == address(0)) revert NotZeroAddress();

        _setRoyaltyAddress(newAddress);
    }

    function _setRoyaltyAddress(address newAddress) internal {
        royaltySplitter = IEverRoyaltySplitter(newAddress);
        emit RoyaltyAddressUpdated(newAddress);
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (
        address receiver,
        uint256 royaltyAmount
    ) {
        if (_tokenId == 0) revert AmountMustBeGreaterThanZero();

        return (address(royaltySplitter), _salePrice / defaultRoyaltySplit);
    }
}

// File: memeRISE/Interfaces/IMementoRise.sol

interface IMementoRise {
    function royaltyAddress() external view returns(address payable);
    function mint(address to, uint256 tokenId, uint256 amount) external;
    function mintFee(uint16 typeId) external returns (uint256);
}

// File: memeRISE/mementoRecipe.sol

abstract contract MementoRecipe is NativeCoinSender, Ownable {
    IMementoRise public mementoRise;
    IEverRise public everRiseToken = IEverRise(EverRiseV3Address);

    event EverRiseTokenSet(address indexed tokenAddress);
    event MementoRiseSet(address indexed nftAddress);
    
    modifier onlyMementoRise() {
        require(_msgSender() == address(mementoRise), "Invalid requestor");
        _;
    }

    constructor(address _mementoRise) {
        setMementoRise(_mementoRise);
    }

    function setEverRiseToken(address tokenAddress) external onlyOwner {
        if (tokenAddress == address(0)) revert NotZeroAddress();
        
        everRiseToken = IEverRise(tokenAddress);

        emit EverRiseTokenSet(tokenAddress);
    }

    function setMementoRise(address nftAddress) public onlyOwner {
        if (nftAddress == address(0)) revert NotZeroAddress();

        mementoRise = IMementoRise(nftAddress);

        emit MementoRiseSet(nftAddress);
    }

    function krakenMintFee(uint256 baseFee, uint256 quantity) internal {
        distributeMintFee(payable(address(everRiseToken)), baseFee, quantity);
    }

    function handleMintFee(uint256 baseFee, uint256 quantity) internal {
        distributeMintFee(mementoRise.royaltyAddress(), baseFee, quantity);
    }

    function distributeMintFee(address payable receiver, uint256 baseFee, uint256 quantity) private {
        uint256 _mintFee = baseFee * quantity;
        require(_mintFee == 0 || msg.value >= _mintFee, "Mint fee not covered");

        uint256 _balance = address(this).balance;
        if (_balance > 0) {
            // Transfer everything, easier than transferring extras later
            sendEthViaCall(receiver, _balance);
        }
    }
}

// File: memeRISE/Interfaces/IERC1155-MultiToken.sol

interface IERC1155 is IERC165 {
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );
    
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);
    event URI(string value, uint256 indexed id);
    function balanceOf(address account, uint256 id) external view returns (uint256);
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);
    function setApprovalForAll(address operator, bool approved) external;
    function isApprovedForAll(address account, address operator) external view returns (bool);
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

interface IERC1155Receiver is IERC165 {
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external view returns (bytes4);
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external view returns (bytes4);
}

interface IERC1155MetadataURI {
    function uri(uint256 id) external view returns (string memory);
}

// File: memeRISE/mementoRise.sol

// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
 EverRise Memento NFTs are awards for completing EverRise staking terms,
 participating in events and winning challenges.

  ___________      ________                              _______   __
 '._==_==_=_.'    /        |                            /       \ /  |
 .-\:      /-.   $$$$$$$$/__     __  ______    ______  $$$$$$$  |$$/   _______   ______  v3.14159265
| (|:.     |) |  $$ |__  /  \   /  |/      \  /      \ $$ |__$$ |/  | /       | /      \
 '-|:.     |-'   $$    | $$  \ /$$//$$$$$$  |/$$$$$$  |$$    $$< $$ |/$$$$$$$/ /$$$$$$  |
   \::.    /     $$$$$/   $$  /$$/ $$    $$ |$$ |  $$/ $$$$$$$  |$$ |$$      \ $$    $$ |
    '::. .'      $$ |_____ $$ $$/  $$$$$$$$/ $$ |      $$ |  $$ |$$ | $$$$$$  |$$$$$$$$/
      ) (        $$       | $$$/   $$       |$$ |      $$ |  $$ |$$ |/     $$/ $$       |
    _.' '._      $$$$$$$$/   $/     $$$$$$$/ $$/       $$/   $$/ $$/ $$$$$$$/   $$$$$$$/ Magnum opus
   `"""""""`     

Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://everrise.com
*/

interface IOpenSeaCollectible {
    function contractURI() external view returns (string memory);
}

abstract contract EverRiseTokenManaged is Ownable {
    IEverRise public everRiseToken;

    function setEverRiseToken(address tokenAddress) public onlyOwner {
        if (tokenAddress == address(0)) revert NotZeroAddress();

        everRiseToken = IEverRise(tokenAddress);

        emit EverRiseTokenSet(tokenAddress);
    }

    event EverRiseTokenSet(address indexed tokenAddress);
}

interface IEverMigrate {
    function userTransaction(address sourceToken, address userAddress, uint256 position) external view returns (uint256, uint256, uint32);
}

enum Animal
{
    Plankton, 
    Seahorse, 
    Starfish, 
    Swordfish, 
    Stingray, 
    Dolphin, 
    Narwhal, 
    Shark, 
    Orca, 
    Whale, 
    Megalodon, 
    Kraken
}

contract MigrationV1V2Achievement is MementoRecipe {
    mapping (uint256 => bool) public processedTxn;
    mapping (address => uint16) public claimedReward;

    IEverMigrate public migrate = IEverMigrate(EverMigrateAddress);
    address immutable public everRiseV1;

    constructor(address _mementoRise) MementoRecipe(_mementoRise) {
        everRiseV1 = block.chainid == 1 ? 
            EverRiseV1Address_ETH :
            EverRiseV1Address_BSC;
    }

    function claimMigrationAchievement(uint256 tokenId, uint256 txnPosition)
        external payable
    {
        address from = _msgSender();
        (uint256 amount,, uint256 txnId) = migrate.userTransaction(everRiseV1, from, txnPosition);

        require(txnId > 0, "Invalid txn");
        require(!processedTxn[txnId], "Already claimed txn");
        processedTxn[txnId] = true;

        handleMintFee(mementoRise.mintFee(uint16(tokenId & 0xffff)), 1);

        Animal animal = Animal(tokenId >> 16);
        require(amount > getMinAmount(animal), "Not enough");

        uint16 flag = uint16(1 << uint8(animal));
        uint16 flags = claimedReward[from];

        require(flags & flag == 0, "Already claimed level");
        claimedReward[from] = flags | flag;

        mementoRise.mint(from, tokenId, 1);
    }

    function getMinAmount(Animal animal) private pure returns (uint256) {
        // 'Plankton', threshold: 1000 }
        if (animal == Animal.Plankton) {
            return (1_000 - 1) * 10**4 * 10**9;
        }
        // 'Seahorse', threshold: 10000 },
        if (animal == Animal.Seahorse) {
            return (10_000 - 1) * 10**4 * 10**9;
        }
        // 'Starfish', threshold: 50000 },
        if (animal == Animal.Starfish) {
            return (50_000 - 1) * 10**4 * 10**9;
        }
        // 'SwordFish', threshold: 100000 },
        if (animal == Animal.Swordfish) {
            return (100_000 - 1) * 10**4 * 10**9;
        }
        // 'Stingray', threshold: 500000 },
        if (animal == Animal.Stingray) {
            return (500_000 - 1) * 10**4 * 10**9;
        }
        // 'Dolphin', threshold: 1000000 },
        if (animal == Animal.Dolphin) {
            return (1_000_000 - 1) * 10**4 * 10**9;
        }
        // 'Narwhal', threshold: 5000000 },
        if (animal == Animal.Narwhal) {
            return (5_000_000 - 1) * 10**4 * 10**9;
        }
        // 'Shark', threshold: 10000000 },
        if (animal == Animal.Shark) {
            return (10_000_000 - 1) * 10**4 * 10**9;
        }
        // 'Orca', threshold: 25000000 },
        if (animal == Animal.Orca) {
            return (25_000_000 - 1) * 10**4 * 10**9;
        }
        // 'Whale', threshold: 50000000 },
        if (animal == Animal.Whale) {
            return (50_000_000 - 1) * 10**4 * 10**9;
        }
        // 'Megalodon', threshold: 100000000 },
        if (animal == Animal.Megalodon) {
            return (100_000_000 - 1) * 10**4 * 10**9;
        }
        // 'Kraken' threshold: 250000000
        if (animal == Animal.Kraken) {
            return (250_000_000 - 1) * 10**4 * 10**9;
        }

        require(false, "Unknown level");
        return (250_000_000_000 - 1) * 10**4 * 10**9;
    }
}

contract HolderV2Achievement is MementoRecipe, ICreateRecipe {
    IERC20 immutable public everRiseV2;
    mapping (address => bool) public processedClaim;

    constructor(address _mementoRise) MementoRecipe(_mementoRise) {
        everRiseV2 = block.chainid == 43114 ? 
            IERC20(EverRiseV2Address_AVAX) :
            IERC20(EverRiseV2Address);
    }

    function createTo(address account, uint256 toTokenId, uint256 toAmount)
        external onlyMementoRise
    {
        require(toTokenId == 3, "Nft doesn't exist");
        require(toAmount == 1, "Can only claim one per chain");

        require(everRiseV2.balanceOf(account) > 0, "Not holding RISE v2");
        require(!processedClaim[account], "Already claimed");

        processedClaim[account] = true;
    }
}

struct StakingDetails {
    uint96 initialTokenAmount;    // Max 79 Bn tokens
    uint96 withdrawnAmount;       // Max 79 Bn tokens
    uint48 depositTime;           // 8 M years
    uint8 numOfMonths;            // Max 256 month period
    uint8 achievementClaimed;
    // 256 bits, 20000 gwei gas
    address stakerAddress;        // 160 bits (96 bits remaining)
    uint32 nftId;                 // Max 4 Bn nfts issued
    uint32 lookupIndex;           // Max 4 Bn active stakes
    uint24 stakerIndex;           // Max 16 M active stakes per wallet
    uint8 isActive;
    // 256 bits, 20000 gwei gas
} // Total 768 bits, 40000 gwei gas

interface InftEverRise {
    function getNftData(uint256 id) external view returns (StakingDetails memory);
    function claimAchievement(address staker, uint256 nftId) external returns (uint32 newNftId);
}

contract StakingAchievement is MementoRecipe {
    InftEverRise public nftRise;

    constructor(address _mementoRise) MementoRecipe(_mementoRise) {
        nftRise = InftEverRise(nftRiseV3Address);
    }

    function _walletLock(address fromAddress) private view {
        if (everRiseToken.isWalletLocked(fromAddress)) revert WalletLocked();
    }

    modifier walletLock(address fromAddress) {
        _walletLock(fromAddress);
        _;
    }

    function getTokenId(uint256 chainId, uint256 animalId, uint256 months) public pure returns (uint256) {
        require(chainId <= type(uint8).max, "Chain out of range");
        require(animalId <= type(uint8).max, "AnimalId out of range");
        require(months <= type(uint8).max, "Months out of range");

        uint256 generatedTokenId = 1;

        generatedTokenId += chainId << 16;
        generatedTokenId += animalId << 24;
        generatedTokenId += months << 32;

        return generatedTokenId;
    }

    function claimStakingAchievement(uint256 tokenId, uint256 stakeNftId) external payable walletLock(_msgSender()) {
        address from = _msgSender();

        krakenMintFee(mementoRise.mintFee(uint16(tokenId & 0xffff)), 1);
        uint32 newNftId = nftRise.claimAchievement(from, stakeNftId);

        StakingDetails memory stakeDetails = nftRise.getNftData(newNftId);

        uint256 generatedTokenId = 1;

        generatedTokenId += getChain() << 16;
        generatedTokenId += getAnimal(stakeDetails.initialTokenAmount) << 24;
        generatedTokenId += getMaterial(stakeDetails.numOfMonths) << 32;

        require(generatedTokenId == tokenId, "Incorrect nft requested");

        mementoRise.mint(from, tokenId, 1);
    }

    function getMaterial(uint256 months) private pure returns (uint256) {
        if (months > 0 && months <= 12) return months;
        if (months == 24) return 14;
        if (months == 36) return 15;

        require(false, "Invalid time");
        return 0;
    }
    
    function getAnimal(uint256 threshold) private pure returns (uint256) {
      // 'Kraken' threshold: 250000000
      if (threshold > (250_000_000 - 1) * 10**18) {
          return 11;
      }
      // 'Megalodon', threshold: 100000000 },
      if (threshold > (100_000_000 - 1) * 10**18) {
          return 10;
      }
      // 'Whale', threshold: 50000000 },
      if (threshold > (50_000_000 - 1) * 10**18) {
           return 9;
      }
      // 'Orca', threshold: 25000000 },
      if (threshold > (25_000_000 - 1) * 10**18) {
          return 8;
      }
      // 'Shark', threshold: 10000000 },
      if (threshold > (10_000_000 - 1) * 10**18) {
          return 7;
      }
      // 'Narwhal', threshold: 5000000 },
      if (threshold > (5_000_000 - 1) * 10**18) {
          return 6;
      }
      // 'Dolphin', threshold: 1000000 },
      if (threshold > (1_000_000 - 1) * 10**18) {
          return 5;
      }
      // 'Stingray', threshold: 500000 },
      if (threshold > (500_000 - 1) * 10**18) {
          return 4;
      }
      // 'Swordfish', threshold: 100000 },
      if (threshold > (100_000 - 1) * 10**18) {
          return 3;
      }
      // 'Starfish', threshold: 50000 },
      if (threshold > (50_000 - 1) * 10**18) {
          return 2;
      }
      // 'Seahorse', threshold: 10000 },
      if (threshold > (10_000 - 1) * 10**18) {
          return 1;
      }
      // 'Plankton', threshold: 1000 }
      if (threshold > (1_000 - 1) * 10**18) {
          return 0;
      }
      // Smaller
      require(false, "Too small");
      return 0;
    }

    function getChain() private view returns (uint256) {
        uint256 chainId = block.chainid;
        if (chainId == 1 || chainId == 3 || chainId == 4 || chainId == 5 || chainId == 42) // Ethereum 
            return 4;
        if (chainId == 56 || chainId == 97) // BNB
            return 2;
        if (chainId == 137 || chainId == 80001) // Polygon
            return 3;
        if (chainId == 250 || chainId == 4002) // Fantom 
            return 1;
        if (chainId == 43114 || chainId == 43113) // Avalanche
            return 0;

      require(false, "Unknown chain");
      return 0;
    }
}

type BalanceKey is uint256;
type BalanceAmount is uint256;

library AmountLib {
    function add(BalanceAmount b, uint256 value) internal pure returns (BalanceAmount) {
        require(value < type(uint240).max, "Out of range");

        uint256 amountPos = BalanceAmount.unwrap(b);
        uint240 amount = uint240(amountPos >> 16);
        uint16 position = uint16(amountPos & 0xffff);

        amount += uint240(value);
        amountPos = (uint256(amount) << 16) | position;

        return BalanceAmount.wrap(amountPos);
    }

    function subtract(BalanceAmount b, uint256 value) internal pure returns (BalanceAmount) {
        require(value < type(uint240).max, "Out of range");

        uint256 amountPos = BalanceAmount.unwrap(b);
        uint240 amount = uint240(amountPos >> 16);
        uint16 position = uint16(amountPos & 0xffff);

        require (amount >= value, "Balance too low");

        unchecked {
            amount -= uint240(value);
        }
        amountPos = (uint256(amount) << 16) | position;

        return BalanceAmount.wrap(amountPos);
    }

    function Amount(BalanceAmount b) internal pure returns (uint256 value) {
        uint256 amountPos = BalanceAmount.unwrap(b);
        return uint240(amountPos >> 16);
    }
    
    function getPosition(BalanceAmount b) internal pure returns (uint16) {
        uint256 amountPos = BalanceAmount.unwrap(b);
        return uint16(amountPos & 0xffff);
    }

    function setPosition(BalanceAmount b, uint16 position) internal pure returns (BalanceAmount) {
        uint256 amountPos = BalanceAmount.unwrap(b);
        uint240 amount = uint240(amountPos >> 16);

        return BalanceAmount.wrap((uint256(amount) << 16) | position);
    }
}

contract MementoRise is EverRiseTokenManaged, royaltyHandler, NativeCoinSender, ERC165, IERC1155, IMementoRise, IERC1155MetadataURI, IOpenSeaCollectible {
    using AmountLib for BalanceAmount; 

    event BaseUriForTypeSet(uint16 indexed nftType, string uri);
    event NftBridgeSet(address bridge);
    event NftBridgedIn(address indexed contractAddress, address indexed operator, address indexed to, uint256 id, uint256 amount);
    event NftsBridgedIn(address indexed contractAddress, address indexed operator, address indexed to, uint256[] ids, uint256[] amounts);
    event NftBridgedOut(address indexed contractAddress, address indexed operator, address indexed from, uint256 id, uint256 amount);
    event NftsBridgedOut(address indexed contractAddress, address indexed operator, address indexed from, uint256[] ids, uint256[] amounts);
    
    event TransferExternalTokens(address indexed tokenAddress, address indexed to, uint256 count);
    event SetMintFee(uint16 typeId, uint256 fee);
    event SetTransmuteFee(uint16 typeId, uint256 fee);
    event SetMintFeeDefault(uint256 fee);
    event SetTransmuteFeeDefault(uint256 fee);

    event SetAllowedCreateTo(uint16 nftType, address contractAddress);
    event SetAllowedCreateFrom(uint16 nftType, address contractAddress);
    event SetAllowedTransumtateSingleTo(uint16 nftType, address contractAddress);
    event SetAllowedTransumtateMultipleTo(uint16 nftType, address contractAddress);

    address public nftBridge;
    uint256 public defaultCreateFee;
    uint256 public defaultTransmuteFee;

    mapping (uint16 => uint256) private _mintFee;
    mapping (uint16 => uint256) private _transmuteFee;

    mapping (uint16 => ICreateRecipe) public allowedCreateTo;
    mapping (uint16 => ITransmuteSingleRecipe) public allowedTransumtateSingleTo;
    mapping (uint16 => ITransmuteMultipleRecipe) public allowedTransumtateMultipleTo;
    mapping (uint16 => address) public allowedCreateFrom;
    mapping (uint16 => bytes) public baseUris;

    mapping (BalanceKey => BalanceAmount) private _balanceOf;
    mapping (address => uint96[]) public tokensHeld;

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

    StakingAchievement public stakingAchievement;
    MigrationV1V2Achievement public migrationV1V2Achievement;
    HolderV2Achievement public holderV2Achievement;

    constructor(address _owner) {
        _setRoyaltyAddress(royaltyFeeAddress);
        
        StakingAchievement _stakingAchievement = new StakingAchievement(address(this));
        MigrationV1V2Achievement _migrationV1V2Achievement = new MigrationV1V2Achievement(address(this));
        HolderV2Achievement _holderV2Achievement = new HolderV2Achievement(address(this));

        stakingAchievement = _stakingAchievement;
        migrationV1V2Achievement = _migrationV1V2Achievement;
        holderV2Achievement = _holderV2Achievement;

        allowedCreateFrom[1] = address(_stakingAchievement);
        allowedCreateFrom[2] = address(_migrationV1V2Achievement);
        allowedCreateTo[3] = _holderV2Achievement;
        uint256 _defaultCreateFee = getDefaultCreateFee();
        defaultCreateFee = _defaultCreateFee;
        uint256 _defaultTransmuteFee = _defaultCreateFee * 5 / 2; // x2.5
        defaultTransmuteFee = _defaultTransmuteFee;

        emit SetMintFeeDefault(_defaultCreateFee);
        emit SetTransmuteFeeDefault(_defaultTransmuteFee);

        setEverRiseToken(EverRiseV3Address);
        transferOwnership(_owner);
        _stakingAchievement.transferOwnership(_owner);
        _migrationV1V2Achievement.transferOwnership(_owner);
        _holderV2Achievement.transferOwnership(_owner);

        bytes memory _uri = ipfsAddress;
        baseUris[1] = _uri;
        baseUris[2] = _uri;
        baseUris[3] = _uri;

        emit TransferSingle(address(this), address(0), address(0), 4295098369, 0);
        emit TransferSingle(address(this), address(0), address(0), 2, 0);
        emit TransferSingle(address(this), address(0), address(0), 3, 0);
    }

    function name() external pure returns (string memory) {
        return "EverRise Mementos";
    }

    function symbol() external pure returns (string memory) {
        return "memeRISE";
    }

    function decimals() external pure returns (uint8) {
        return 0;
    }

    uint256 public totalSupply;

    function setMintFee(uint16 typeId, uint256 fee) external onlyOwner {
        _mintFee[typeId] = fee;

        emit SetMintFee(typeId, fee);
    }

    function setTransmuteFee(uint16 typeId, uint256 fee) external onlyOwner {
        _transmuteFee[typeId] = fee;

        emit SetTransmuteFee(typeId, fee);
    }

    function setMintFeeDefault(uint256 fee) external onlyOwner {
        defaultCreateFee = fee;

        emit SetMintFeeDefault(fee);
    }

    function setTransmuteFeeDefault(uint256 fee) external onlyOwner {
        defaultTransmuteFee = fee;

        emit SetTransmuteFeeDefault(fee);
    }

    function mintFee(uint16 typeId) public view returns (uint256) {
        uint256 fee = _mintFee[typeId];

        if (fee == 0) return defaultCreateFee;

        return fee;
    }

    function transmuteFee(uint16 typeId) public view returns (uint256) {
        uint256 fee = _transmuteFee[typeId];

        if (fee == 0) return defaultTransmuteFee;

        return fee;
    }

    function getDefaultCreateFee() private view returns (uint256) {
        uint256 chainId = block.chainid;
        if (chainId == 1) // Ethereum 
            return 10000000000000000; // 0.01
        if (chainId == 56) // BNB
            return 10000000000000000; // 0.01
        if (chainId == 137) // Polygon
            return 3000000000000000000; // 3
        if (chainId == 250) // Fantom 
            return 3000000000000000000; // 3
        if (chainId == 43114) // Avalanche
            return 50000000000000000; // 0.05

        return 3000000000000000000;
    }

    function setNftBridge(address _bridge) external onlyOwner {
        nftBridge = _bridge;

        emit NftBridgeSet(nftBridge);
    }

    function setBaseUriForType(uint16 nftType, string calldata baseUri) external onlyOwner {
        baseUris[nftType] = bytes(baseUri);

        emit BaseUriForTypeSet(nftType, baseUri);
    }

    function setAllowedCreateTo(uint16 nftType, address contractAddress) external onlyOwner {
        allowedCreateTo[nftType] = ICreateRecipe(contractAddress);

        emit SetAllowedCreateTo(nftType, contractAddress);
    }

    function setAllowedCreateFrom(uint16 nftType, address contractAddress) external onlyOwner {
        allowedCreateFrom[nftType] = contractAddress;

        emit SetAllowedCreateFrom(nftType, contractAddress);
    }

    function setAllowedTransumtateSingleTo(uint16 nftType, address contractAddress) external onlyOwner {
        allowedTransumtateSingleTo[nftType] = ITransmuteSingleRecipe(contractAddress);

        emit SetAllowedTransumtateSingleTo(nftType, contractAddress);
    }

    function setAllowedTransumtateMultipleTo(uint16 nftType, address contractAddress) external onlyOwner {
        allowedTransumtateMultipleTo[nftType] = ITransmuteMultipleRecipe(contractAddress);

        emit SetAllowedTransumtateMultipleTo(nftType, contractAddress);
    }

    function royaltyAddress() external view returns (address payable) {
        return payable(address(royaltySplitter));
    }

    function tokenURI(uint256 id) external view returns (string memory) {
        return uri(id);
    }

    function uri(uint256 id) public view returns (string memory) {
        uint16 nftType = uint16(id & 0xffff);
        bytes memory baseUri = baseUris[nftType];

        require(baseUri.length > 0, "Uri not set");

        return string(abi.encodePacked(baseUri, uint2hexstr(id), ".json"));
    }

    function uint2hexstr(uint i) public pure returns (string memory) {
        uint mask = 15;
        bytes memory bstr = new bytes(64);
        uint k = 64;
        while (k > 0) {
            uint curr = (i & mask);
            bstr[--k] = curr > 9 ?
                bytes1(uint8(55 + curr)) :
                bytes1(uint8(48 + curr)); // 55 = 65 - 10
            i = i >> 4;
        }
        return string(bstr);
    }

    function contractURI() external view returns (string memory) {
        return string(
                abi.encodePacked("https://data.everrise.com/data/memerise-",
                toString(block.chainid),
                ".json")
        );
    }

    function _walletLock(address fromAddress) private view {
        if (everRiseToken.isWalletLocked(fromAddress)) revert WalletLocked();
    }

    modifier walletLock(address fromAddress) {
        _walletLock(fromAddress);
        _;
    }

    function handleMintFee(uint256 baseFee, uint256 quantity) internal {
        uint256 totalFee = baseFee * quantity;
        require(totalFee == 0 || msg.value >= totalFee, "Mint fee not covered");

        uint256 _balance = address(this).balance;
        if (_balance > 0) {
            // Transfer everything, easier than transferring extras later
            sendEthViaCall(payable(address(royaltySplitter)), _balance);
        }
    }

    function toBalanceKey(address account, uint256 tokenId) private pure returns (BalanceKey) {
        if (tokenId > type(uint96).max) revert AmountOutOfRange();

        uint256 key = uint256(uint160(account)) << 96 | uint96(tokenId);
        return BalanceKey.wrap(key);
    }

    function balanceOf(address account, uint256 tokenId) view public returns (uint256) {
        if (account == address(0)) revert NotZeroAddress();

        return _balanceOf[toBalanceKey(account, tokenId)].Amount();
    }
    
    function mint(address to, uint256 tokenId, uint256 amount) external {
        address requestor = _msgSender();
        uint16 nftType = uint16(tokenId & 0xffff);
        require(allowedCreateFrom[nftType] == requestor, "Requestor not allowed to mint that type");

        // Mint new tokens
        AddBalance(to, tokenId, amount);
        emit TransferSingle(to, address(0), to, tokenId, amount);
    }
    
    function create(uint256 tokenId, uint256 amount) external payable {
        uint16 nftType = uint16(tokenId & 0xffff);
        ICreateRecipe creator = allowedCreateTo[nftType];

        if (address(creator) == address(0)) revert NotSetup();

        handleMintFee(mintFee(nftType), amount);

        address from = _msgSender();
        creator.createTo(from, tokenId, amount);

        // Mint new tokens
        AddBalance(from, tokenId, amount);
        emit TransferSingle(from, address(0), from, tokenId, amount);
    }

    function getAllTokensHeld(address account) external view returns (uint96[] memory tokenIds, uint256[] memory amounts) {
        uint96[] storage refTokenIds = tokensHeld[account];
        uint256 tokenIdsLength = refTokenIds.length;

        if (tokenIdsLength < 2) {
            // Position 0 is skipped
            tokenIds = new uint96[](0);
            amounts = new uint256[](0);
            return (tokenIds, amounts);
        }

        uint256 length = tokenIdsLength - 1;
        uint256 position;
        tokenIds = new uint96[](length);
        amounts = new uint256[](length);
        for (uint256 i = 1; i < tokenIdsLength;) {
            unchecked {
                position = i - 1;
            }
            uint96 tokenId = refTokenIds[i];
            tokenIds[position] = tokenId;
            amounts[position] = _balanceOf[toBalanceKey(account, tokenId)].Amount();

            unchecked {
                ++i;
            }
        }
    }

    function AddBalance(address account, uint256 tokenId, uint256 amount) private {
        require(tokenId < type(uint96).max, "Out of range");

        BalanceKey key = toBalanceKey(account, tokenId);
        BalanceAmount currentBalance = _balanceOf[key];
        if (currentBalance.getPosition() > 0) {
            // Simple add
            _balanceOf[key] = currentBalance.add(amount);
        } else {
            uint96[] storage refTokenIds = tokensHeld[account];
            uint256 length = refTokenIds.length;
            if (length == 0) {
                // Add empty zero item
                refTokenIds.push();
                refTokenIds.push(uint96(tokenId));
                _balanceOf[key] = BalanceAmount.wrap((uint256(amount) << 16) | 1);
            } else {
                require(length < type(uint16).max, "Too many types");
                uint16 position = uint16(length);

                refTokenIds.push(uint96(tokenId));
                _balanceOf[key] = BalanceAmount.wrap((uint256(amount) << 16) | position);
            }
        }

        totalSupply += amount;
    }

    function SubtractBalance(address account, uint256 tokenId, uint256 amount) private {
        require(tokenId < type(uint96).max, "Out of range");

        BalanceKey key = toBalanceKey(account, tokenId);
        BalanceAmount currentBalance = _balanceOf[key];

        uint16 position = currentBalance.getPosition();
        require (position > 0, "Non-existance");

        currentBalance = currentBalance.subtract(amount);

        if (currentBalance.Amount() > 0) {
            // Simple decrement
            _balanceOf[key] = currentBalance;
        } else {
            _balanceOf[key] = BalanceAmount.wrap(0);
            // Remove from position array
            uint96[] storage refTokenIds = tokensHeld[account];
            uint256 length = refTokenIds.length;
            require (length > 1, "Token List");

            uint256 last = length - 1;
            if (position < last) {
                uint96 lastTokenId = refTokenIds[last];
                
                key = toBalanceKey(account, lastTokenId);
                currentBalance = _balanceOf[key];

                _balanceOf[key] = currentBalance.setPosition(position);
                refTokenIds[position] = lastTokenId;
            }
            
            refTokenIds.pop();
        }

        totalSupply -= amount;
    }

    function transmuteMultiple(uint256[] calldata toTokenIds, uint256[] calldata toAmounts, uint256[] calldata fromIds, uint256[] calldata fromAmounts) external payable walletLock(_msgSender()) {
        uint256 fromIdsLength = fromIds.length;
        require(fromIdsLength > 0, "No input tokens");
        require(fromIdsLength == fromAmounts.length, "Input: ids and amounts length mismatch");
        uint256 toTokenIdsLength = toTokenIds.length;
        require(toTokenIdsLength > 0, "No output tokens");
        require(toTokenIdsLength == toAmounts.length, "Output: ids and amounts length mismatch");
        
        uint16 nftType = uint16(toTokenIds[0] & 0xffff);

        uint256 totalAmount;
        for (uint256 i = 0; i < toTokenIdsLength; i++) {
            uint256 toTokenId = toTokenIds[i];
            require(nftType == uint16(toTokenId & 0xffff), "Not same type outputs");
            uint256 toAmount = toAmounts[i];
            require(toAmount > 0, "No zero outputs");
            totalAmount += toAmount;
        }

        ITransmuteMultipleRecipe transmutator = allowedTransumtateMultipleTo[nftType];
        if (address(transmutator) == address(0)) revert NotSetup();

        handleMintFee(transmuteFee(nftType), totalAmount);

        _transmuteMultiple(transmutator, toTokenIds, toAmounts, fromIds, fromAmounts);
    }

    function _transmuteMultiple(ITransmuteMultipleRecipe transmutator, uint256[] calldata toTokenIds, uint256[] calldata toAmounts, uint256[] calldata fromIds, uint256[] calldata fromAmounts) private {
        address from = _msgSender();
        transmutator.transmuteMultipleTo(from, toTokenIds, toAmounts, fromIds, fromAmounts);

        // Burn passed in tokens
        uint256 idsLength = fromIds.length;
        for (uint256 i = 0; i < idsLength; i++) {
            uint256 fromId = fromIds[i];
            uint256 fromAmount = fromAmounts[i];

            SubtractBalance(from, fromId, fromAmount);
        }

        emit TransferBatch(from, from, address(0), fromIds, fromAmounts);

        // Mint new tokens
        idsLength = toTokenIds.length;
        for (uint256 i = 0; i < idsLength; i++) {
            uint256 toTokenId = toTokenIds[i];
            uint256 toAmount = toAmounts[i];

            AddBalance(from, toTokenId, toAmount);
        }

        emit TransferBatch(from, address(0), from, toTokenIds, toAmounts);
    }

    function transmuteSingle(uint256 toTokenId, uint256 toAmount, uint256[] calldata fromIds, uint256[] calldata fromAmounts) external payable walletLock(_msgSender()) {
        uint256 fromIdsLength = fromIds.length;
        require(fromIdsLength == fromAmounts.length, "ERC1155: ids and amounts length mismatch");
        require(toAmount > 0, "No zero output");
        
        uint16 nftType = uint16(toTokenId & 0xffff);
        ITransmuteSingleRecipe transmutator = allowedTransumtateSingleTo[nftType];
        if (address(transmutator) == address(0)) revert NotSetup();

        handleMintFee(transmuteFee(nftType), toAmount);

        address from = _msgSender();
        transmutator.transmuteSingleTo(from, toTokenId, toAmount, fromIds, fromAmounts);

        // Burn passed in tokens
        for (uint256 i = 0; i < fromIdsLength; i++) {
            uint256 tokenId = fromIds[i];
            uint256 amount = fromAmounts[i];

            SubtractBalance(from, tokenId, amount);
        }

        emit TransferBatch(from, from, address(0), fromIds, fromAmounts);

        // Mint new tokens
        AddBalance(from, toTokenId, toAmount);
        emit TransferSingle(from, address(0), from, toTokenId, toAmount);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override (ERC165, IERC165) returns (bool) {
        return 
            interfaceId == type(IERC2981).interfaceId ||
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory)
    {
        uint256 accountsLength = accounts.length;
        require(accountsLength == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accountsLength);

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

        return batchBalances;
    }

    // Approval

    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) private {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    // Transfer

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external walletLock(from) {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external walletLock(from) {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    function _safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) private {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        SubtractBalance(from, id, amount);
        AddBalance(to, id, amount);

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

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

    function _safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) private {
        uint256 idsLength = ids.length;
        require(idsLength == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

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

            SubtractBalance(from, id, amount);
            AddBalance(to, id, amount);
        }

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

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

    // Hook checks

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

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

    // Bridge functions

    function bridgeNftOut(address from, uint256 id, uint256 amount) external {
        address operator = _msgSender();
        require(operator == nftBridge, "Only bridge");
        _walletLock(from);

        if (isApprovedForAll(from, operator)) {
            revert CallerNotApproved();
        }

        SubtractBalance(from, id, amount);

        emit TransferSingle(operator, from, address(0), id, amount);
        emit NftBridgedOut(address(this), nftBridge, from, id, amount);
    }

    function bridgeNftsOut(address from, uint256[] calldata ids, uint256[] calldata amounts) external {
        address operator = _msgSender();
        require(operator == nftBridge, "Only bridge");
        _walletLock(from);

        if (isApprovedForAll(from, operator)) {
            revert CallerNotApproved();
        }
        uint256 idsLength = ids.length;
        require(idsLength == amounts.length, "ERC1155: ids and amounts length mismatch");

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

            SubtractBalance(from, id, amount);
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
        emit NftsBridgedOut(address(this), nftBridge, from, ids, amounts);
    }

    function bridgeNftIn(address to, uint256 id, uint256 amount) external {
        address operator = _msgSender();
        require(operator == nftBridge, "Only bridge");

        AddBalance(to, id, amount);

        emit TransferSingle(operator, address(0), to, id, amount);
        emit NftBridgedIn(address(this), nftBridge, to, id, amount);
    }

    function bridgeNftsIn(address to, uint256[] calldata ids, uint256[] calldata amounts) external {
        address operator = _msgSender();
        require(operator == nftBridge, "Only bridge");
        uint256 idsLength = ids.length;
        require(idsLength == amounts.length, "ERC1155: ids and amounts length mismatch");

        for (uint256 i = 0; i < idsLength; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];
            
            AddBalance(to, id, amount);
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);
        emit NftsBridgedIn(address(this), nftBridge, to, ids, amounts);
    }

    // Utility functions

    function isContract(address account) private view returns (bool) {
        return account.code.length > 0;
    }

    function toString(uint256 value) private pure returns (bytes memory output)
    {
        if (value == 0)
        {
            return "0";
        }
        uint256 remaining = value;
        uint256 length;
        while (remaining != 0)
        {
            length++;
            remaining /= 10;
        }
        output = new bytes(length);
        uint256 position = length;
        remaining = value;
        while (remaining != 0)
        {
            output[--position] = bytes1(uint8(48 + remaining % 10));
            remaining /= 10;
        }
    }

    // Remove trapped tokens

    function transferBalance(uint256 amount) external onlyOwner {
        sendEthViaCall(_msgSender(), amount);
    }

    function transferExternalTokens(address tokenAddress, address to, uint256 amount) external onlyOwner {
        if (tokenAddress == address(0)) revert NotZeroAddress();

        transferTokens(tokenAddress, to, amount);
    }

    function transferTokens(address tokenAddress, address to, uint256 amount) private {
        IERC20(tokenAddress).transfer(to, amount);

        emit TransferExternalTokens(tokenAddress, to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountMustBeGreaterThanZero","type":"error"},{"inputs":[],"name":"AmountOutOfRange","type":"error"},{"inputs":[],"name":"CallerNotApproved","type":"error"},{"inputs":[],"name":"CallerNotOwner","type":"error"},{"inputs":[],"name":"FailedEthSend","type":"error"},{"inputs":[],"name":"NotSetup","type":"error"},{"inputs":[],"name":"NotZeroAddress","type":"error"},{"inputs":[],"name":"WalletLocked","type":"error"},{"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":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"BaseUriForTypeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"EverRiseTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bridge","type":"address"}],"name":"NftBridgeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NftBridgedIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NftBridgedOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"NftsBridgedIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"NftsBridgedOut","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":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"RoyaltyAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"RoyaltyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SetAllowedCreateFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SetAllowedCreateTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SetAllowedTransumtateMultipleTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"nftType","type":"uint16"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SetAllowedTransumtateSingleTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"typeId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetMintFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetMintFeeDefault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"typeId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetTransmuteFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetTransmuteFeeDefault","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":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"TransferExternalTokens","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":"uint16","name":"","type":"uint16"}],"name":"allowedCreateFrom","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"allowedCreateTo","outputs":[{"internalType":"contract ICreateRecipe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"allowedTransumtateMultipleTo","outputs":[{"internalType":"contract ITransmuteMultipleRecipe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"allowedTransumtateSingleTo","outputs":[{"internalType":"contract ITransmuteSingleRecipe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint16","name":"","type":"uint16"}],"name":"baseUris","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bridgeNftIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bridgeNftOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"bridgeNftsIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"bridgeNftsOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"create","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultCreateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultRoyaltySplit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTransmuteFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"everRiseToken","outputs":[{"internalType":"contract IEverRise","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllTokensHeld","outputs":[{"internalType":"uint96[]","name":"tokenIds","type":"uint96[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderV2Achievement","outputs":[{"internalType":"contract HolderV2Achievement","name":"","type":"address"}],"stateMutability":"view","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":"migrationV1V2Achievement","outputs":[{"internalType":"contract MigrationV1V2Achievement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"typeId","type":"uint16"}],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"nftBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltySplitter","outputs":[{"internalType":"contract IEverRoyaltySplitter","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setAllowedCreateFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setAllowedCreateTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setAllowedTransumtateMultipleTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setAllowedTransumtateSingleTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nftType","type":"uint16"},{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseUriForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royaltySplitRate","type":"uint256"}],"name":"setDefaultNftRoyaltyFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"setEverRiseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"typeId","type":"uint16"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setMintFeeDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridge","type":"address"}],"name":"setNftBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"typeId","type":"uint16"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTransmuteFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTransmuteFeeDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAchievement","outputs":[{"internalType":"contract StakingAchievement","name":"","type":"address"}],"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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensHeld","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferExternalTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"typeId","type":"uint16"}],"name":"transmuteFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"toTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"toAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"fromIds","type":"uint256[]"},{"internalType":"uint256[]","name":"fromAmounts","type":"uint256[]"}],"name":"transmuteMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toTokenId","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"uint256[]","name":"fromIds","type":"uint256[]"},{"internalType":"uint256[]","name":"fromAmounts","type":"uint256[]"}],"name":"transmuteSingle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"uint2hexstr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405260056003553480156200001657600080fd5b50604051620073c7380380620073c783398101604081905262000039916200083f565b600080546001600160a01b03191633908117825560405190918291600080516020620073a7833981519152908290a35062000088730bfc8f6374028f1a61ae3019e5c845f46157538162000576565b60003060405162000099906200076f565b6001600160a01b039091168152602001604051809103906000f080158015620000c6573d6000803e3d6000fd5b509050600030604051620000da906200077d565b6001600160a01b039091168152602001604051809103906000f08015801562000107573d6000803e3d6000fd5b5090506000306040516200011b906200078b565b6001600160a01b039091168152602001604051809103906000f08015801562000148573d6000803e3d6000fd5b50601180546001600160a01b038087166001600160a01b0319928316811790935560128054878316908416811790915560138054928616928416831790557fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c805484169094179093557f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720805483169093179092556003600090815260096020527fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054909216909217905590915062000220620005c0565b905080600581905550600060028260056200023c919062000871565b6200024891906200089f565b60068190556040518381529091507f361f81bf9859e8ff7e84509ee6276217a23296cf8d9a95f69a795da5ba188e969060200160405180910390a16040518181527f767e110cb18739f6f7c12deb132f97152546ce38f20895371668d93aa933f8a79060200160405180910390a1620002d573c17c30e98541188614df99239cabd40280810ca362000649565b620002e086620006c5565b60405163f2fde38b60e01b81526001600160a01b03878116600483015286169063f2fde38b90602401600060405180830381600087803b1580156200032457600080fd5b505af115801562000339573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b0389811660048301528716925063f2fde38b9150602401600060405180830381600087803b1580156200038157600080fd5b505af115801562000396573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b0389811660048301528616925063f2fde38b9150602401600060405180830381600087803b158015620003de57600080fd5b505af1158015620003f3573d6000803e3d6000fd5b5050505060006040518060800160405280604e815260200162007359604e91396001600052600d6020908152815191925062000454917ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c59184019062000799565b506002600052600d6020908152815162000494917f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc249919084019062000799565b506003600052600d60209081528151620004d4917f26b4a10d0f0b04925c23bd4480ee147c916e5e87a7d68206a533dad160ac81e2919084019062000799565b50604080516401000200018152600060208201819052918291309160008051602062007339833981519152910160405180910390a46040805160028152600060208201819052918291309160008051602062007339833981519152910160405180910390a46040805160038152600060208201819052918291309160008051602062007339833981519152910160405180910390a450505050505050620008fe565b600280546001600160a01b0319166001600160a01b0383169081179091556040517fc3f6f2bdf6d9c842a3bc549613cd55a1e4949821f557b66feb8d73eb7f576d9390600090a250565b6000466001819003620005db57662386f26fc1000091505090565b80603803620005f257662386f26fc1000091505090565b806089036200060a576729a2241af62c000091505090565b8060fa0362000622576729a2241af62c000091505090565b8061a86a036200063a5766b1a2bc2ec5000091505090565b6729a2241af62c000091505090565b6200065362000741565b6001600160a01b0381166200067b576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b620006cf62000741565b6001600160a01b038116620006f7576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b0380851693921691600080516020620073a783398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146200076d57604051632e6c18c960e11b815260040160405180910390fd5b565b6110288062004c8183390190565b610e6b8062005ca983390190565b6108258062006b1483390190565b828054620007a790620008c2565b90600052602060002090601f016020900481019282620007cb576000855562000816565b82601f10620007e657805160ff191683800117855562000816565b8280016001018555821562000816579182015b8281111562000816578251825591602001919060010190620007f9565b506200082492915062000828565b5090565b5b8082111562000824576000815560010162000829565b6000602082840312156200085257600080fd5b81516001600160a01b03811681146200086a57600080fd5b9392505050565b60008160001904831182151516156200089a57634e487b7160e01b600052601160045260246000fd5b500290565b600082620008bd57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680620008d757607f821691505b602082108103620008f857634e487b7160e01b600052602260045260246000fd5b50919050565b614373806200090e6000396000f3fe6080604052600436106103965760003560e01c806379ed19b2116101dc578063c87b56dd11610102578063eda3e65d116100a0578063f2fde38b1161006f578063f2fde38b14610b4a578063f8f2096714610b6a578063ff2aafd714610ba0578063ff6916b314610bc057600080fd5b8063eda3e65d14610aca578063ef9ae33a14610aea578063efa1685f14610b0a578063f242432a14610b2a57600080fd5b8063e060ffa6116100dc578063e060ffa614610a62578063e1539f7014610a82578063e8a3d48514610a95578063e985e9c514610aaa57600080fd5b8063c87b56dd14610a0c578063d441ef4914610a2c578063dc0b748114610a4c57600080fd5b8063991940be1161017a578063ad2f852a11610149578063ad2f852a1461098e578063af91b174146109ac578063b9664101146109cc578063c27afefc146109ec57600080fd5b8063991940be146109055780639de36f3b1461093b5780639f7b45791461095b578063a22cb4651461096e57600080fd5b80638da5cb5b116101b65780638da5cb5b14610874578063908618731461089457806393676d82146108b457806395d89b41146108d457600080fd5b806379ed19b2146107fe5780638116ed72146108345780638a60c4c11461085457600080fd5b8063304d14e2116102c15780634a5846bb1161025f5780635718f41a1161022e5780635718f41a1461077e5780636d07d7121461079e578063756ff919146107be57806377e71675146107de57600080fd5b80634a5846bb146106fb5780634e1273f41461071b5780634ead47161461074857806354497f0a1461075e57600080fd5b80633c93d8be1161029b5780633c93d8be14610670578063411d8f2f146106905780634792cd55146106b057806347f7f1f4146106e857600080fd5b8063304d14e214610614578063313ce567146106345780633bd5b0f21461065057600080fd5b80630e89341c116103395780631a380b12116103085780631a380b12146105515780631f069bb8146105875780632a55205a146105b55780632eb2c2d6146105f457600080fd5b80630e89341c146104db578063156e29f6146104fb57806316f4d1121461051b57806318160ddd1461053b57600080fd5b806306d254da1161037557806306d254da1461042057806306fdde031461044057806307682fd0146104835780630779ace8146104a357600080fd5b8062fdd58e1461039b57806301ffc9a7146103ce57806303d6d110146103fe575b600080fd5b3480156103a757600080fd5b506103bb6103b6366004613564565b610bd6565b6040519081526020015b60405180910390f35b3480156103da57600080fd5b506103ee6103e93660046135a4565b610c2c565b60405190151581526020016103c5565b34801561040a57600080fd5b5061041e6104193660046135c1565b610c99565b005b34801561042c57600080fd5b5061041e61043b3660046135da565b610cdd565b34801561044c57600080fd5b506040805180820190915260118152704576657252697365204d656d656e746f7360781b60208201525b6040516103c5919061364d565b34801561048f57600080fd5b5061041e61049e366004613672565b610d18565b3480156104af57600080fd5b506011546104c3906001600160a01b031681565b6040516001600160a01b0390911681526020016103c5565b3480156104e757600080fd5b506104766104f63660046135c1565b610d8c565b34801561050757600080fd5b5061041e6105163660046136a5565b610ea7565b34801561052757600080fd5b506104766105363660046136d8565b610f6f565b34801561054757600080fd5b506103bb60145481565b34801561055d57600080fd5b506104c361056c3660046136d8565b600b602052600090815260409020546001600160a01b031681565b34801561059357600080fd5b506105a76105a23660046135da565b611009565b6040516103c592919061372e565b3480156105c157600080fd5b506105d56105d036600461378e565b6111b8565b604080516001600160a01b0390931683526020830191909152016103c5565b34801561060057600080fd5b5061041e61060f366004613835565b611204565b34801561062057600080fd5b506012546104c3906001600160a01b031681565b34801561064057600080fd5b50604051600081526020016103c5565b34801561065c57600080fd5b5061041e61066b3660046135c1565b6112ac565b34801561067c57600080fd5b5061047661068b3660046135c1565b6112e9565b34801561069c57600080fd5b506002546104c3906001600160a01b031681565b3480156106bc57600080fd5b506106d06106cb366004613564565b61138c565b6040516001600160601b0390911681526020016103c5565b61041e6106f63660046138ef565b6113d8565b34801561070757600080fd5b5061041e61071636600461399e565b6116b1565b34801561072757600080fd5b5061073b610736366004613a1e565b611805565b6040516103c59190613a89565b34801561075457600080fd5b506103bb60065481565b34801561076a57600080fd5b506103bb6107793660046136d8565b61193a565b34801561078a57600080fd5b5061041e6107993660046135da565b61195f565b3480156107aa57600080fd5b5061041e6107b9366004613a9c565b6119d8565b3480156107ca57600080fd5b5061041e6107d936600461399e565b611a42565b3480156107ea57600080fd5b5061041e6107f93660046136a5565b611bb6565b34801561080a57600080fd5b506104c36108193660046136d8565b600c602052600090815260409020546001600160a01b031681565b34801561084057600080fd5b506001546104c3906001600160a01b031681565b34801561086057600080fd5b5061041e61086f3660046135c1565b611cab565b34801561088057600080fd5b506000546104c3906001600160a01b031681565b3480156108a057600080fd5b506013546104c3906001600160a01b031681565b3480156108c057600080fd5b5061041e6108cf366004613672565b611cbd565b3480156108e057600080fd5b506040805180820190915260088152676d656d655249534560c01b6020820152610476565b34801561091157600080fd5b506104c36109203660046136d8565b600a602052600090815260409020546001600160a01b031681565b34801561094757600080fd5b5061041e610956366004613672565b611d29565b61041e61096936600461378e565b611d95565b34801561097a57600080fd5b5061041e610989366004613afc565b611e91565b34801561099a57600080fd5b506002546001600160a01b03166104c3565b3480156109b857600080fd5b506004546104c3906001600160a01b031681565b3480156109d857600080fd5b5061041e6109e7366004613672565b611ea0565b3480156109f857600080fd5b5061041e610a07366004613b33565b611f0c565b348015610a1857600080fd5b50610476610a273660046135c1565b611f4b565b348015610a3857600080fd5b5061041e610a473660046135da565b611f56565b348015610a5857600080fd5b506103bb60035481565b348015610a6e57600080fd5b5061041e610a7d366004613b6f565b611fac565b61041e610a90366004613b8b565b612000565b348015610aa157600080fd5b50610476612224565b348015610ab657600080fd5b506103ee610ac5366004613c0d565b612253565b348015610ad657600080fd5b5061041e610ae5366004613b6f565b612281565b348015610af657600080fd5b506103bb610b053660046136d8565b6122d5565b348015610b1657600080fd5b5061041e610b253660046136a5565b6122fa565b348015610b3657600080fd5b5061041e610b45366004613c29565b6123b4565b348015610b5657600080fd5b5061041e610b653660046135da565b61244f565b348015610b7657600080fd5b506104c3610b853660046136d8565b6009602052600090815260409020546001600160a01b031681565b348015610bac57600080fd5b5061041e610bbb3660046135c1565b6124d9565b348015610bcc57600080fd5b506103bb60055481565b60006001600160a01b038316610bff576040516366385fa360e01b815260040160405180910390fd5b610c25600e6000610c108686612538565b81526020019081526020016000205460101c90565b9392505050565b60006001600160e01b0319821663152a902d60e11b1480610c5d57506001600160e01b03198216636cdb3d1360e11b145b80610c7857506001600160e01b031982166303a24d0760e21b145b80610c9357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610ca1612585565b60058190556040518181527f361f81bf9859e8ff7e84509ee6276217a23296cf8d9a95f69a795da5ba188e96906020015b60405180910390a150565b610ce5612585565b6001600160a01b038116610d0c576040516366385fa360e01b815260040160405180910390fd5b610d15816125b2565b50565b610d20612585565b61ffff821660008181526009602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fdd20b1130ab22b031cb7a5d84a67429127607d602dd2c3a3c0fde1c4c7ff7fca91015b60405180910390a15050565b61ffff81166000818152600d602052604081208054606093929190610db090613c8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddc90613c8e565b8015610e295780601f10610dfe57610100808354040283529160200191610e29565b820191906000526020600020905b815481529060010190602001808311610e0c57829003601f168201915b505050505090506000815111610e745760405162461bcd60e51b815260206004820152600b60248201526a155c9a481b9bdd081cd95d60aa1b60448201526064015b60405180910390fd5b80610e7e856112e9565b604051602001610e8f929190613cc8565b60405160208183030381529060405292505050919050565b61ffff82166000818152600c60205260409020543391906001600160a01b03168214610f255760405162461bcd60e51b815260206004820152602760248201527f526571756573746f72206e6f7420616c6c6f77656420746f206d696e742074686044820152666174207479706560c81b6064820152608401610e6b565b610f308585856125fc565b60408051858152602081018590526001600160a01b03871691600091839160008051602061431e83398151915291015b60405180910390a45050505050565b600d6020526000908152604090208054610f8890613c8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb490613c8e565b80156110015780601f10610fd657610100808354040283529160200191611001565b820191906000526020600020905b815481529060010190602001808311610fe457829003601f168201915b505050505081565b6001600160a01b0381166000908152600f602052604090208054606091829160028110156110525750506040805160008082526020820190815281830190925294909350915050565b600061105f600183613d33565b90506000816001600160401b0381111561107b5761107b613d07565b6040519080825280602002602001820160405280156110a4578160200160208202803683370190505b509550816001600160401b038111156110bf576110bf613d07565b6040519080825280602002602001820160405280156110e8578160200160208202803683370190505b50945060015b838110156111ae57600181039150600085828154811061111057611110613d4a565b9060005260206000209060029182820401919006600c029054906101000a90046001600160601b031690508088848151811061114e5761114e613d4a565b60200260200101906001600160601b031690816001600160601b031681525050611188600e6000610c108c856001600160601b0316612538565b87848151811061119a5761119a613d4a565b6020908102919091010152506001016110ee565b5050505050915091565b600080836000036111dc57604051635e85ae7360e01b815260040160405180910390fd5b6002546003546001600160a01b03909116906111f89085613d76565b915091505b9250929050565b8761120e816127a2565b6001600160a01b03891633148061122a575061122a8933612253565b6112915760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610e6b565b6112a1898989898989898961282e565b505050505050505050565b6112b4612585565b60068190556040518181527f767e110cb18739f6f7c12deb132f97152546ce38f20895371668d93aa933f8a790602001610cd2565b604080518181526060818101835291600f9160009160208201818036833701905050905060405b801561138457848316600981116113345761132c816030613d8a565b60f81b611343565b61133f816037613d8a565b60f81b5b8361134d84613da2565b9350838151811061136057611360613d4a565b60200101906001600160f81b031916908160001a905350600486901c955050611310565b509392505050565b600f60205281600052604060002081815481106113a857600080fd5b9060005260206000209060029182820401919006600c02915091509054906101000a90046001600160601b031681565b336113e2816127a2565b83806114225760405162461bcd60e51b815260206004820152600f60248201526e4e6f20696e70757420746f6b656e7360881b6044820152606401610e6b565b8083146114805760405162461bcd60e51b815260206004820152602660248201527f496e7075743a2069647320616e6420616d6f756e7473206c656e677468206d696044820152650e6dac2e8c6d60d31b6064820152608401610e6b565b88806114c15760405162461bcd60e51b815260206004820152601060248201526f4e6f206f757470757420746f6b656e7360801b6044820152606401610e6b565b8088146115205760405162461bcd60e51b815260206004820152602760248201527f4f75747075743a2069647320616e6420616d6f756e7473206c656e677468206d6044820152660d2e6dac2e8c6d60cb1b6064820152608401610e6b565b60008b8b600081811061153557611535613d4a565b9050602002013561ffff169050600080600090505b838110156116425760008e8e8381811061156657611566613d4a565b9050602002013590508061ffff1661ffff168461ffff16146115c25760405162461bcd60e51b81526020600482015260156024820152744e6f742073616d652074797065206f75747075747360581b6044820152606401610e6b565b60008d8d848181106115d6576115d6613d4a565b905060200201359050600081116116215760405162461bcd60e51b815260206004820152600f60248201526e4e6f207a65726f206f75747075747360881b6044820152606401610e6b565b61162b8185613d8a565b93505050808061163a90613db9565b91505061154a565b5061ffff82166000908152600b60205260409020546001600160a01b03168061167e576040516302c2726760e61b815260040160405180910390fd5b61169061168a846122d5565b8361294a565b6116a1818f8f8f8f8f8f8f8f6129cb565b5050505050505050505050505050565b60045433906001600160a01b031681146116dd5760405162461bcd60e51b8152600401610e6b90613dd2565b838281146116fd5760405162461bcd60e51b8152600401610e6b90613df7565b60005b8181101561176057600087878381811061171c5761171c613d4a565b905060200201359050600086868481811061173957611739613d4a565b90506020020135905061174d8a83836125fc565b50508061175990613db9565b9050611700565b50866001600160a01b031660006001600160a01b0316836001600160a01b03166000805160206142fe833981519152898989896040516117a39493929190613e75565b60405180910390a46004546040516001600160a01b03808a1692169030907ff8eec0223e61fb21a9418d0f74bd406cc488700cb40adc84b4fea1ed9bcb5a87906117f4908b908b908b908b90613e75565b60405180910390a450505050505050565b6060838281146118695760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610e6b565b6000816001600160401b0381111561188357611883613d07565b6040519080825280602002602001820160405280156118ac578160200160208202803683370190505b50905060005b8281101561192f576119028888838181106118cf576118cf613d4a565b90506020020160208101906118e491906135da565b8787848181106118f6576118f6613d4a565b90506020020135610bd6565b82828151811061191457611914613d4a565b602090810291909101015261192881613db9565b90506118b2565b509695505050505050565b61ffff8116600090815260076020526040812054808203610c93575050600554919050565b611967612585565b6001600160a01b03811661198e576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b6119e0612585565b61ffff83166000908152600d602052604090206119fe9083836134af565b508261ffff167fcc9a40567cb8e27b48f1a5bfcc2110d8cceffe00200ee24ac050c39ade3fedb18383604051611a35929190613ed0565b60405180910390a2505050565b60045433906001600160a01b03168114611a6e5760405162461bcd60e51b8152600401610e6b90613dd2565b611a77866127a2565b611a818682612253565b15611a9f57604051634014f1a560e01b815260040160405180910390fd5b83828114611abf5760405162461bcd60e51b8152600401610e6b90613df7565b60005b81811015611b22576000878783818110611ade57611ade613d4a565b9050602002013590506000868684818110611afb57611afb613d4a565b905060200201359050611b0f8a8383612b98565b505080611b1b90613db9565b9050611ac2565b5060006001600160a01b0316876001600160a01b0316836001600160a01b03166000805160206142fe83398151915289898989604051611b659493929190613e75565b60405180910390a46004546040516001600160a01b03808a1692169030907f0a3fdbd3b9434e5fc9ade247da79eaf7e2d1707500d64db5b1560a764f626285906117f4908b908b908b908b90613e75565b60045433906001600160a01b03168114611be25760405162461bcd60e51b8152600401610e6b90613dd2565b611beb846127a2565b611bf58482612253565b15611c1357604051634014f1a560e01b815260040160405180910390fd5b611c1e848484612b98565b60408051848152602081018490526000916001600160a01b03878116929085169160008051602061431e833981519152910160405180910390a460045460408051858152602081018590526001600160a01b0387811693169130917fe0bf1306ae80358ba075e7e155d3d3100bd1cb7245f654f111d39453f756356a91015b60405180910390a450505050565b611cb3612585565b610d153382612df3565b611cc5612585565b61ffff82166000818152600b602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fb1d02679ca901853728f6f7c39123cda2def88f2e76a14d1a05c2935f00816059101610d80565b611d31612585565b61ffff82166000818152600a602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f1b076f90831c47b63fdc4f0786bb37b8982b57b628e166f900b25629c9241d3b9101610d80565b61ffff82166000818152600960205260409020546001600160a01b031680611dd0576040516302c2726760e61b815260040160405180910390fd5b611de2611ddc8361193a565b8461294a565b60003360405163165994d960e21b81526001600160a01b038083166004830152602482018890526044820187905291925090831690635966536490606401600060405180830381600087803b158015611e3a57600080fd5b505af1158015611e4e573d6000803e3d6000fd5b50505050611e5d8186866125fc565b60408051868152602081018690526001600160a01b03831691600091839160008051602061431e8339815191529101610f60565b611e9c338383612e67565b5050565b611ea8612585565b61ffff82166000818152600c602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f4e3bfcc5c9ecdf35191832c1fea9acb386b20abc50dd2796f7f65e6c2f385df79101610d80565b611f14612585565b6001600160a01b038316611f3b576040516366385fa360e01b815260040160405180910390fd5b611f46838383612f48565b505050565b6060610c9382610d8c565b611f5e612585565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc7ba3c390578157af9596e71002363b398c7e5294bab3e788d9df3b2251bbac290602001610cd2565b611fb4612585565b61ffff8216600081815260076020908152604091829020849055815192835282018390527f152156d1d9eb3e2fc375680993f6f491dca9c47939e35f4c06a04a43a08a2f309101610d80565b3361200a816127a2565b8382811461202a5760405162461bcd60e51b8152600401610e6b90613df7565b6000871161206b5760405162461bcd60e51b815260206004820152600e60248201526d139bc81e995c9bc81bdd5d1c1d5d60921b6044820152606401610e6b565b61ffff88166000818152600a60205260409020546001600160a01b0316806120a6576040516302c2726760e61b815260040160405180910390fd5b6120b86120b2836122d5565b8a61294a565b6040516337d415bb60e01b815233906001600160a01b038316906337d415bb906120f29084908f908f908f908f908f908f90600401613eec565b600060405180830381600087803b15801561210c57600080fd5b505af1158015612120573d6000803e3d6000fd5b5050505060005b848110156121895760008a8a8381811061214357612143613d4a565b905060200201359050600089898481811061216057612160613d4a565b905060200201359050612174848383612b98565b5050808061218190613db9565b915050612127565b5060006001600160a01b0316816001600160a01b0316826001600160a01b03166000805160206142fe8339815191528c8c8c8c6040516121cc9493929190613e75565b60405180910390a46121df818c8c6125fc565b604080518c8152602081018c90526001600160a01b03831691600091839160008051602061431e83398151915291015b60405180910390a45050505050505050505050565b606061222f46613001565b60405160200161223f9190613f3b565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b612289612585565b61ffff8216600081815260086020908152604091829020849055815192835282018390527fdd4719940454f4e3d8bc79a3d99dbc5cb7311cffee06273c4fa1a1b07f2f25809101610d80565b61ffff8116600090815260086020526040812054808203610c93575050600654919050565b60045433906001600160a01b031681146123265760405162461bcd60e51b8152600401610e6b90613dd2565b6123318484846125fc565b60408051848152602081018490526001600160a01b03808716926000929185169160008051602061431e833981519152910160405180910390a460045460408051858152602081018590526001600160a01b0387811693169130917f339e4100371ca3951325b190c421cb3c67f09635d57fc14e6aacfcb52d3873299101611c9d565b856123be816127a2565b6001600160a01b0387163314806123da57506123da8733612253565b6124385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610e6b565b612446878787878787613109565b50505050505050565b612457612585565b6001600160a01b03811661247e576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6124e1612585565b600a8111156125035760405163c64200e960e01b815260040160405180910390fd5b60038190556040518181527fd9b587d0d884e97b8e3772325d18ffc0412781f43cb5471b8eb5972667724f0190602001610cd2565b60006001600160601b038211156125625760405163c64200e960e01b815260040160405180910390fd5b506001600160601b031660609190911b6bffffffffffffffffffffffff19161790565b6000546001600160a01b031633146125b057604051632e6c18c960e11b815260040160405180910390fd5b565b600280546001600160a01b0319166001600160a01b0383169081179091556040517fc3f6f2bdf6d9c842a3bc549613cd55a1e4949821f557b66feb8d73eb7f576d9390600090a250565b6001600160601b0382106126225760405162461bcd60e51b8152600401610e6b90613fa0565b600061262e8484612538565b6000818152600e602052604090205490915061ffff8116156126685761265481846131a3565b6000838152600e6020526040902055612784565b6001600160a01b0385166000908152600f60205260408120805490918190036126e75781546000838152602080822060028085018755600194850190810490910180546001600160601b03808d16938716600c026101000a93840293021916919091179055868252600e905260409020601087901b9091179055612781565b61ffff81106127295760405162461bcd60e51b815260206004820152600e60248201526d546f6f206d616e7920747970657360901b6044820152606401610e6b565b815460018082018455600084815260208082206002850401805493909416600c026101000a6001600160601b0381810219909416938b160292909217909255858252600e90526040902061ffff8216601087901b1790555b50505b82601460008282546127969190613d8a565b90915550505050505050565b60015460405163060648d160e11b81526001600160a01b03838116600483015290911690630c0c91a290602401602060405180830381865afa1580156127ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128109190613fc6565b15610d15576040516335543b4960e21b815260040160405180910390fd5b8483811461284e5760405162461bcd60e51b8152600401610e6b90613df7565b6001600160a01b0388166128745760405162461bcd60e51b8152600401610e6b90613fe3565b3360005b828110156128e357600089898381811061289457612894613d4a565b90506020020135905060008888848181106128b1576128b1613d4a565b9050602002013590506128c58d8383612b98565b6128d08c83836125fc565b5050806128dc90613db9565b9050612878565b50886001600160a01b03168a6001600160a01b0316826001600160a01b03166000805160206142fe8339815191528b8b8b8b6040516129259493929190613e75565b60405180910390a461293e818b8b8b8b8b8b8b8b6131fc565b50505050505050505050565b60006129568284614028565b90508015806129655750803410155b6129a85760405162461bcd60e51b8152602060048201526014602482015273135a5b9d08199959481b9bdd0818dbdd995c995960621b6044820152606401610e6b565b4780156129c5576002546129c5906001600160a01b031682612df3565b50505050565b60405163b4d36d9d60e01b815233906001600160a01b038b169063b4d36d9d90612a099084908d908d908d908d908d908d908d908d90600401614047565b600060405180830381600087803b158015612a2357600080fd5b505af1158015612a37573d6000803e3d6000fd5b5086925060009150505b81811015612aa3576000878783818110612a5d57612a5d613d4a565b9050602002013590506000868684818110612a7a57612a7a613d4a565b905060200201359050612a8e858383612b98565b50508080612a9b90613db9565b915050612a41565b5060006001600160a01b0316826001600160a01b0316836001600160a01b03166000805160206142fe83398151915289898989604051612ae69493929190613e75565b60405180910390a4508760005b81811015612b555760008b8b83818110612b0f57612b0f613d4a565b90506020020135905060008a8a84818110612b2c57612b2c613d4a565b905060200201359050612b408583836125fc565b50508080612b4d90613db9565b915050612af3565b50816001600160a01b031660006001600160a01b0316836001600160a01b03166000805160206142fe8339815191528d8d8d8d60405161220f9493929190613e75565b6001600160601b038210612bbe5760405162461bcd60e51b8152600401610e6b90613fa0565b6000612bca8484612538565b6000818152600e602052604090205490915061ffff811680612c1e5760405162461bcd60e51b815260206004820152600d60248201526c4e6f6e2d6578697374616e636560981b6044820152606401610e6b565b612c28828561335b565b91506000612c368360101c90565b1115612c52576000838152600e60205260409020829055612dd4565b6000838152600e602090815260408083208390556001600160a01b0389168352600f9091529020805460018111612cb85760405162461bcd60e51b815260206004820152600a602482015269151bdad95b88131a5cdd60b21b6044820152606401610e6b565b6000612cc5600183613d33565b9050808461ffff161015612d8f576000838281548110612ce757612ce7613d4a565b600091825260209091206002820401546001909116600c026101000a90046001600160601b03169050612d1a8a82612538565b6000818152600e60205260409020805461ffff881661ffff19821681179092558654929950975082918691908110612d5457612d54613d4a565b9060005260206000209060029182820401919006600c026101000a8154816001600160601b0302191690836001600160601b03160217905550505b82805480612d9f57612d9f6140b9565b60008281526020902060026000199092019182040180546001600160601b03600c60018516026101000a021916905590555050505b8360146000828254612de69190613d33565b9091555050505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e40576040519150601f19603f3d011682016040523d82523d6000602084013e612e45565b606091505b5050905080611f465760405163b5747cc760e01b815260040160405180910390fd5b816001600160a01b0316836001600160a01b031603612eda5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610e6b565b6001600160a01b03838116600081815260106020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a3505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbb9190613fc6565b50816001600160a01b0316836001600160a01b03167ff217402c85197de87cd806653771027d1e91101ef79ab35684a580c62b91a9b583604051612f3b91815260200190565b6060816000036130285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613052578061303c81613db9565b915061304b9050600a83613d76565b915061302c565b806001600160401b0381111561306a5761306a613d07565b6040519080825280601f01601f191660200182016040528015613094576020820181803683370190505b509250839150805b8215613101576130ad600a846140cf565b6130b8906030613d8a565b60f81b846130c583613da2565b925082815181106130d8576130d8613d4a565b60200101906001600160f81b031916908160001a9053506130fa600a84613d76565b925061309c565b505050919050565b6001600160a01b03851661312f5760405162461bcd60e51b8152600401610e6b90613fe3565b3361313b878686612b98565b6131468686866125fc565b856001600160a01b0316876001600160a01b0316826001600160a01b031660008051602061431e833981519152888860405161318c929190918252602082015260400190565b60405180910390a4612446818888888888886133ea565b60006001600160f01b0382106131cb5760405162461bcd60e51b8152600401610e6b90613fa0565b82601081901c61ffff82166131e085836140e3565b61ffff1960109190911b1661ffff909116179250505092915050565b6001600160a01b0387163b156112a15760405163bc197c8160e01b81526001600160a01b0388169063bc197c8190613246908c908c908b908b908b908b908b908b9060040161410e565b602060405180830381865afa92505050801561327f575060408051601f3d908101601f1916820190925261327c91810190614172565b60015b61332b5761328b61418f565b806308c379a0036132c4575061329f6141e5565b806132aa57506132c6565b8060405162461bcd60e51b8152600401610e6b919061364d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610e6b565b6001600160e01b0319811663bc197c8160e01b1461293e5760405162461bcd60e51b8152600401610e6b9061426e565b60006001600160f01b0382106133835760405162461bcd60e51b8152600401610e6b90613fa0565b82601081901c61ffff8216848210156133d05760405162461bcd60e51b815260206004820152600f60248201526e42616c616e636520746f6f206c6f7760881b6044820152606401610e6b565b61ffff1693900360101b61ffff1916929092179392505050565b6001600160a01b0385163b156124465760405163f23a6e6160e01b81526001600160a01b0386169063f23a6e6190613430908a908a9089908990899089906004016142b6565b602060405180830381865afa925050508015613469575060408051601f3d908101601f1916820190925261346691810190614172565b60015b6134755761328b61418f565b6001600160e01b0319811663f23a6e6160e01b146134a55760405162461bcd60e51b8152600401610e6b9061426e565b5050505050505050565b8280546134bb90613c8e565b90600052602060002090601f0160209004810192826134dd5760008555613523565b82601f106134f65782800160ff19823516178555613523565b82800160010185558215613523579182015b82811115613523578235825591602001919060010190613508565b5061352f929150613533565b5090565b5b8082111561352f5760008155600101613534565b80356001600160a01b038116811461355f57600080fd5b919050565b6000806040838503121561357757600080fd5b61358083613548565b946020939093013593505050565b6001600160e01b031981168114610d1557600080fd5b6000602082840312156135b657600080fd5b8135610c258161358e565b6000602082840312156135d357600080fd5b5035919050565b6000602082840312156135ec57600080fd5b610c2582613548565b60005b838110156136105781810151838201526020016135f8565b838111156129c55750506000910152565b600081518084526136398160208601602086016135f5565b601f01601f19169290920160200192915050565b602081526000610c256020830184613621565b803561ffff8116811461355f57600080fd5b6000806040838503121561368557600080fd5b61368e83613660565b915061369c60208401613548565b90509250929050565b6000806000606084860312156136ba57600080fd5b6136c384613548565b95602085013595506040909401359392505050565b6000602082840312156136ea57600080fd5b610c2582613660565b600081518084526020808501945080840160005b8381101561372357815187529582019590820190600101613707565b509495945050505050565b604080825283519082018190526000906020906060840190828701845b828110156137705781516001600160601b03168452928401929084019060010161374b565b5050508381038285015261378481866136f3565b9695505050505050565b600080604083850312156137a157600080fd5b50508035926020909101359150565b60008083601f8401126137c257600080fd5b5081356001600160401b038111156137d957600080fd5b6020830191508360208260051b85010111156111fd57600080fd5b60008083601f84011261380657600080fd5b5081356001600160401b0381111561381d57600080fd5b6020830191508360208285010111156111fd57600080fd5b60008060008060008060008060a0898b03121561385157600080fd5b61385a89613548565b975061386860208a01613548565b965060408901356001600160401b038082111561388457600080fd5b6138908c838d016137b0565b909850965060608b01359150808211156138a957600080fd5b6138b58c838d016137b0565b909650945060808b01359150808211156138ce57600080fd5b506138db8b828c016137f4565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b03121561390b57600080fd5b88356001600160401b038082111561392257600080fd5b61392e8c838d016137b0565b909a50985060208b013591508082111561394757600080fd5b6139538c838d016137b0565b909850965060408b013591508082111561396c57600080fd5b6139788c838d016137b0565b909650945060608b013591508082111561399157600080fd5b506138db8b828c016137b0565b6000806000806000606086880312156139b657600080fd5b6139bf86613548565b945060208601356001600160401b03808211156139db57600080fd5b6139e789838a016137b0565b90965094506040880135915080821115613a0057600080fd5b50613a0d888289016137b0565b969995985093965092949392505050565b60008060008060408587031215613a3457600080fd5b84356001600160401b0380821115613a4b57600080fd5b613a57888389016137b0565b90965094506020870135915080821115613a7057600080fd5b50613a7d878288016137b0565b95989497509550505050565b602081526000610c2560208301846136f3565b600080600060408486031215613ab157600080fd5b613aba84613660565b925060208401356001600160401b03811115613ad557600080fd5b613ae1868287016137f4565b9497909650939450505050565b8015158114610d1557600080fd5b60008060408385031215613b0f57600080fd5b613b1883613548565b91506020830135613b2881613aee565b809150509250929050565b600080600060608486031215613b4857600080fd5b613b5184613548565b9250613b5f60208501613548565b9150604084013590509250925092565b60008060408385031215613b8257600080fd5b61358083613660565b60008060008060008060808789031215613ba457600080fd5b863595506020870135945060408701356001600160401b0380821115613bc957600080fd5b613bd58a838b016137b0565b90965094506060890135915080821115613bee57600080fd5b50613bfb89828a016137b0565b979a9699509497509295939492505050565b60008060408385031215613c2057600080fd5b61368e83613548565b60008060008060008060a08789031215613c4257600080fd5b613c4b87613548565b9550613c5960208801613548565b9450604087013593506060870135925060808701356001600160401b03811115613c8257600080fd5b613bfb89828a016137f4565b600181811c90821680613ca257607f821691505b602082108103613cc257634e487b7160e01b600052602260045260246000fd5b50919050565b60008351613cda8184602088016135f5565b835190830190613cee8183602088016135f5565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613d4557613d45613d1d565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613d8557613d85613d60565b500490565b60008219821115613d9d57613d9d613d1d565b500190565b600081613db157613db1613d1d565b506000190190565b600060018201613dcb57613dcb613d1d565b5060010190565b6020808252600b908201526a4f6e6c792062726964676560a81b604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b81835260006001600160fb1b03831115613e5857600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000613e89604083018688613e3f565b8281036020840152613e9c818587613e3f565b979650505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000613ee4602083018486613ea7565b949350505050565b60018060a01b038816815286602082015285604082015260a060608201526000613f1a60a083018688613e3f565b8281036080840152613f2d818587613e3f565b9a9950505050505050505050565b7f68747470733a2f2f646174612e65766572726973652e636f6d2f646174612f6d815267656d65726973652d60c01b602082015260008251613f848160288501602087016135f5565b64173539b7b760d91b6028939091019283015250602d01919050565b6020808252600c908201526b4f7574206f662072616e676560a01b604082015260600190565b600060208284031215613fd857600080fd5b8151610c2581613aee565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600081600019048311821515161561404257614042613d1d565b500290565b6001600160a01b038a16815260a06020820181905260009061406c9083018a8c613e3f565b828103604084015261407f81898b613e3f565b90508281036060840152614094818789613e3f565b905082810360808401526140a9818587613e3f565b9c9b505050505050505050505050565b634e487b7160e01b600052603160045260246000fd5b6000826140de576140de613d60565b500690565b60006001600160f01b0382811684821680830382111561410557614105613d1d565b01949350505050565b6001600160a01b0389811682528816602082015260a06040820181905260009061413b908301888a613e3f565b828103606084015261414e818789613e3f565b90508281036080840152614163818587613ea7565b9b9a5050505050505050505050565b60006020828403121561418457600080fd5b8151610c258161358e565b600060033d11156141a85760046000803e5060005160e01c5b90565b601f8201601f191681016001600160401b03811182821017156141de57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156141f35790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561422257505050505090565b828501915081518181111561423a5750505050505090565b843d87010160208285010111156142545750505050505090565b614263602082860101876141ab565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03878116825286166020820152604081018590526060810184905260a0608082018190526000906142f19083018486613ea7565b9897505050505050505056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a264697066735822122071d342dbdbbc311f858d35bc6379f16f6881f7f05921d63b12aab3660b326dfe64736f6c634300080d00336080604052600280546001600160a01b03191673c17c30e98541188614df99239cabd40280810ca317905534801561003657600080fd5b5060405161102838038061102883398101604081905261005591610172565b600080546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061009f816100cc565b5050600380546001600160a01b0319167323cd2e6b283754fd2340a75732f9ddbb5d11807e1790556101a2565b6100d4610145565b6001600160a01b0381166100fb576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b6000546001600160a01b0316331461017057604051632e6c18c960e11b815260040160405180910390fd5b565b60006020828403121561018457600080fd5b81516001600160a01b038116811461019b57600080fd5b9392505050565b610e77806101b16000396000f3fe6080604052600436106100865760003560e01c806373a225571161005957806373a22557146101385780638116ed72146101585780638da5cb5b14610178578063dfbb06dd14610198578063f2fde38b146101ab57600080fd5b806301e089dd1461008b57806328004236146100c857806333a19e2f146100f65780635718f41a14610118575b600080fd5b34801561009757600080fd5b506001546100ab906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100d457600080fd5b506100e86100e3366004610b9d565b6101cb565b6040519081526020016100bf565b34801561010257600080fd5b50610116610111366004610bde565b6102e1565b005b34801561012457600080fd5b50610116610133366004610bde565b61035a565b34801561014457600080fd5b506003546100ab906001600160a01b031681565b34801561016457600080fd5b506002546100ab906001600160a01b031681565b34801561018457600080fd5b506000546100ab906001600160a01b031681565b6101166101a6366004610c02565b6103d3565b3480156101b757600080fd5b506101166101c6366004610bde565b61067b565b600060ff8411156102185760405162461bcd60e51b8152602060048201526012602482015271436861696e206f7574206f662072616e676560701b60448201526064015b60405180910390fd5b60ff8311156102615760405162461bcd60e51b8152602060048201526015602482015274416e696d616c4964206f7574206f662072616e676560581b604482015260640161020f565b60ff8211156102a85760405162461bcd60e51b81526020600482015260136024820152724d6f6e746873206f7574206f662072616e676560681b604482015260640161020f565b60016102b8601086901b82610c3a565b90506102c8601885901b82610c3a565b90506102d8602084901b82610c3a565b95945050505050565b6102e9610705565b6001600160a01b038116610310576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b610362610705565b6001600160a01b038116610389576040516366385fa360e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b336103dd81610732565b600033600154604051632a24bf8560e11b815261ffff87166004820152919250610460916001600160a01b03909116906354497f0a906024016020604051808303816000875af1158015610435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104599190610c52565b60016107c1565b6003546040516331eee37160e21b81526001600160a01b03838116600483015260248201869052600092169063c7bb8dc4906044016020604051808303816000875af11580156104b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d89190610c84565b60035460405163a802d82b60e01b815263ffffffff831660048201529192506000916001600160a01b039091169063a802d82b9060240161014060405180830381865afa15801561052d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105519190610d38565b90506001601061055f6107dc565b61056a911b82610c3a565b9050601861058983600001516bffffffffffffffffffffffff166108c9565b610594911b82610c3a565b905060206105a8836060015160ff16610a3c565b6105b3911b82610c3a565b90508681146106045760405162461bcd60e51b815260206004820152601760248201527f496e636f7272656374206e667420726571756573746564000000000000000000604482015260640161020f565b60018054604051630ab714fb60e11b81526001600160a01b038781166004830152602482018b9052604482019390935291169063156e29f690606401600060405180830381600087803b15801561065a57600080fd5b505af115801561066e573d6000803e3d6000fd5b5050505050505050505050565b610683610705565b6001600160a01b0381166106aa576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461073057604051632e6c18c960e11b815260040160405180910390fd5b565b60025460405163060648d160e11b81526001600160a01b03838116600483015290911690630c0c91a290602401602060405180830381865afa15801561077c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a09190610e00565b156107be576040516335543b4960e21b815260040160405180910390fd5b50565b6002546107d8906001600160a01b03168383610aae565b5050565b60004660018114806107ee5750806003145b806107f95750806004145b806108045750806005145b8061080f575080602a145b1561081c57600491505090565b806038148061082b5750806061145b1561083857600291505090565b806089148061084957508062013881145b1561085657600391505090565b8060fa1480610866575080610fa2145b1561087357600191505090565b8061a86a148061088457508061a869145b1561089157600091505090565b60405162461bcd60e51b815260206004820152600d60248201526c2ab735b737bbb71031b430b4b760991b604482015260640161020f565b60006acecb8f1a13695b929c00008211156108e65750600b919050565b6a52b7d2cee7561f3c9c00008211156109015750600a919050565b6a295be960834fb5ca9c000082111561091c57506009919050565b6a14adf4a9514c81119c000082111561093757506008919050565b6a08459508334a94a29c000082111561095257506007919050565b6a0422ca7d2949f07d9c000082111561096d57506006919050565b69d3c20dee1639f99c000082111561098757506005919050565b6969e10006afc3291c00008211156109a157506004919050565b69152cf4e72a974f1c00008211156109bb57506003919050565b690a96738339f1d3dc00008211156109d557506002919050565b69021e0c0013070adc00008211156109ef57506001919050565b683627e8f712373c0000821115610a0857506000919050565b60405162461bcd60e51b8152602060048201526009602482015268151bdbc81cdb585b1b60ba1b604482015260640161020f565b60008082118015610a4e5750600c8211155b15610a57575090565b81601803610a675750600e919050565b81602403610a775750600f919050565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b604482015260640161020f565b6000610aba8284610e22565b9050801580610ac95750803410155b610b0c5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d08199959481b9bdd0818dbdd995c995960621b604482015260640161020f565b478015610b1d57610b1d8582610b24565b5050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610b71576040519150601f19603f3d011682016040523d82523d6000602084013e610b76565b606091505b5050905080610b985760405163b5747cc760e01b815260040160405180910390fd5b505050565b600080600060608486031215610bb257600080fd5b505081359360208301359350604090920135919050565b6001600160a01b03811681146107be57600080fd5b600060208284031215610bf057600080fd5b8135610bfb81610bc9565b9392505050565b60008060408385031215610c1557600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b60008219821115610c4d57610c4d610c24565b500190565b600060208284031215610c6457600080fd5b5051919050565b805163ffffffff81168114610c7f57600080fd5b919050565b600060208284031215610c9657600080fd5b610bfb82610c6b565b604051610140810167ffffffffffffffff81118282101715610cd157634e487b7160e01b600052604160045260246000fd5b60405290565b80516bffffffffffffffffffffffff81168114610c7f57600080fd5b805165ffffffffffff81168114610c7f57600080fd5b805160ff81168114610c7f57600080fd5b8051610c7f81610bc9565b805162ffffff81168114610c7f57600080fd5b60006101408284031215610d4b57600080fd5b610d53610c9f565b610d5c83610cd7565b8152610d6a60208401610cd7565b6020820152610d7b60408401610cf3565b6040820152610d8c60608401610d09565b6060820152610d9d60808401610d09565b6080820152610dae60a08401610d1a565b60a0820152610dbf60c08401610c6b565b60c0820152610dd060e08401610c6b565b60e0820152610100610de3818501610d25565b90820152610120610df5848201610d09565b908201529392505050565b600060208284031215610e1257600080fd5b81518015158114610bfb57600080fd5b6000816000190483118215151615610e3c57610e3c610c24565b50029056fea2646970667358221220c59f58d5a63256e7230820bd78e195d441968fc17564d85cca0bb5a88d48556564736f6c634300080d003360a0604052600280546001600160a01b031990811673c17c30e98541188614df99239cabd40280810ca3179091556005805490911673429ca183c5f4b43f09d70580c5365a6d21cccd4717905534801561005857600080fd5b50604051610e6b380380610e6b833981016040819052610077916101b2565b600080546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506100c18161010c565b50466001146100e45773c7d43f2b51f44f09fbb8a691a0451e8ffcf36c0a6100fa565b738a2d988fe2e8c6716cbcef1b33df626c692f7b985b6001600160a01b0316608052506101e2565b610114610185565b6001600160a01b03811661013b576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b6000546001600160a01b031633146101b057604051632e6c18c960e11b815260040160405180910390fd5b565b6000602082840312156101c457600080fd5b81516001600160a01b03811681146101db57600080fd5b9392505050565b608051610c6761020460003960008181610229015261037a0152610c676000f3fe60806040526004361061009c5760003560e01c80638116ed72116100645780638116ed72146101a45780638da5cb5b146101c45780638fd3ab80146101e4578063ac2ff9f314610204578063bdcd427f14610217578063f2fde38b1461024b57600080fd5b806301e089dd146100a15780631e6f3d8a146100de57806333a19e2f146101225780634de7b1f6146101445780635718f41a14610184575b600080fd5b3480156100ad57600080fd5b506001546100c1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ea57600080fd5b5061010f6100f9366004610b17565b60046020526000908152604090205461ffff1681565b60405161ffff90911681526020016100d5565b34801561012e57600080fd5b5061014261013d366004610b17565b61026b565b005b34801561015057600080fd5b5061017461015f366004610b3b565b60036020526000908152604090205460ff1681565b60405190151581526020016100d5565b34801561019057600080fd5b5061014261019f366004610b17565b6102e4565b3480156101b057600080fd5b506002546100c1906001600160a01b031681565b3480156101d057600080fd5b506000546100c1906001600160a01b031681565b3480156101f057600080fd5b506005546100c1906001600160a01b031681565b610142610212366004610b54565b61035d565b34801561022357600080fd5b506100c17f000000000000000000000000000000000000000000000000000000000000000081565b34801561025757600080fd5b50610142610266366004610b17565b6106c1565b61027361074b565b6001600160a01b03811661029a576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b6102ec61074b565b6001600160a01b038116610313576040516366385fa360e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b6000336005546040516369ffae4960e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528381166024830152604482018690529293506000928392169063d3ff5c9290606401606060405180830381865afa1580156103df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104039190610b76565b63ffffffff169250509150600081116104515760405162461bcd60e51b815260206004820152600b60248201526a24b73b30b634b2103a3c3760a91b60448201526064015b60405180910390fd5b60008181526003602052604090205460ff16156104a65760405162461bcd60e51b815260206004820152601360248201527220b63932b0b23c9031b630b4b6b2b2103a3c3760691b6044820152606401610448565b60008181526003602052604090819020805460ff19166001908117909155549051632a24bf8560e11b815261ffff8716600482015261053c916001600160a01b0316906354497f0a906024016020604051808303816000875af1158015610511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105359190610bb8565b6001610778565b6000601086901c600b81111561055457610554610bd1565b905061055f816107f2565b831161059a5760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610448565b600081600b8111156105ae576105ae610bd1565b6001600160a01b038616600090815260046020526040902054600160ff929092169190911b915061ffff80821691831616156106245760405162461bcd60e51b8152602060048201526015602482015274105b1c9958591e4818db185a5b5959081b195d995b605a1b6044820152606401610448565b6001600160a01b03868116600081815260046020819052604091829020805461ffff191687871761ffff16179055600180549251630ab714fb60e11b815291820193909352602481018c905260448101929092529091169063156e29f690606401600060405180830381600087803b15801561069f57600080fd5b505af11580156106b3573d6000803e3d6000fd5b505050505050505050505050565b6106c961074b565b6001600160a01b0381166106f0576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461077657604051632e6c18c960e11b815260040160405180910390fd5b565b60015460408051635697c29560e11b815290516107ee926001600160a01b03169163ad2f852a9160048083019260209291908290030181865afa1580156107c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e79190610be7565b8383610a10565b5050565b60008082600b81111561080757610807610bd1565b0361081a575066237dda214e6000919050565b600182600b81111561082e5761082e610bd1565b0361084257506701633c600f176000919050565b600282600b81111561085657610856610bd1565b0361086a57506706f05241853f6000919050565b600382600b81111561087e5761087e610bd1565b036108925750670de0ad9b58f16000919050565b600482600b8111156108a6576108a6610bd1565b036108ba57506745638869f6816000919050565b600582600b8111156108ce576108ce610bd1565b036108e25750678ac719ec3b756000919050565b600682600b8111156108f6576108f6610bd1565b0361090b57506802b5e3a5fe63156000919050565b600782600b81111561091f5761091f610bd1565b03610934575068056bc75515149d6000919050565b600882600b81111561094857610948610bd1565b0361095d5750680d8d72625929356000919050565b600982600b81111561097157610971610bd1565b036109865750681b1ae4cdcaa0dd6000919050565b600a82600b81111561099a5761099a610bd1565b036109af5750683635c9a4ad902d6000919050565b600b82600b8111156109c3576109c3610bd1565b036109d857506887867829565e1d6000919050565b60405162461bcd60e51b815260206004820152600d60248201526c155b9adb9bdddb881b195d995b609a1b6044820152606401610448565b6000610a1c8284610c04565b9050801580610a2b5750803410155b610a6e5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d08199959481b9bdd0818dbdd995c995960621b6044820152606401610448565b478015610a7f57610a7f8582610a86565b5050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ad3576040519150601f19603f3d011682016040523d82523d6000602084013e610ad8565b606091505b5050905080610afa5760405163b5747cc760e01b815260040160405180910390fd5b505050565b6001600160a01b0381168114610b1457600080fd5b50565b600060208284031215610b2957600080fd5b8135610b3481610aff565b9392505050565b600060208284031215610b4d57600080fd5b5035919050565b60008060408385031215610b6757600080fd5b50508035926020909101359150565b600080600060608486031215610b8b57600080fd5b8351925060208401519150604084015163ffffffff81168114610bad57600080fd5b809150509250925092565b600060208284031215610bca57600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b600060208284031215610bf957600080fd5b8151610b3481610aff565b6000816000190483118215151615610c2c57634e487b7160e01b600052601160045260246000fd5b50029056fea26469706673582212208f5c2ec31480b9e7419926a35e046a4e3c6901ae3770225b444c78d97b7ce7ef64736f6c634300080d003360a0604052600280546001600160a01b03191673c17c30e98541188614df99239cabd40280810ca317905534801561003657600080fd5b5060405161082538038061082583398101604081905261005591610191565b600080546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061009f816100eb565b504661a86a146100c357730cd022dde27169b20895e0e2b2b8a33b25e635796100d9565b73c3a8d300333bffe3ddf6166f2bc84e6d38351bed5b6001600160a01b0316608052506101c1565b6100f3610164565b6001600160a01b03811661011a576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b6000546001600160a01b0316331461018f57604051632e6c18c960e11b815260040160405180910390fd5b565b6000602082840312156101a357600080fd5b81516001600160a01b03811681146101ba57600080fd5b9392505050565b6080516106426101e36000396000818161012e015261039a01526106426000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638116ed72116100665780638116ed72146101035780638da5cb5b14610116578063ccc87d4914610129578063f2fde38b14610150578063f7c106ba1461016357600080fd5b806301e089dd1461009857806333a19e2f146100c85780635718f41a146100dd57806359665364146100f0575b600080fd5b6001546100ab906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100db6100d636600461059e565b610196565b005b6100db6100eb36600461059e565b61020f565b6100db6100fe3660046105c0565b610288565b6002546100ab906001600160a01b031681565b6000546100ab906001600160a01b031681565b6100ab7f000000000000000000000000000000000000000000000000000000000000000081565b6100db61015e36600461059e565b6104cb565b61018661017136600461059e565b60036020526000908152604090205460ff1681565b60405190151581526020016100bf565b61019e610555565b6001600160a01b0381166101c5576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f047bb057cb56af8c7f8b85dbf04218832f6163ba1d8f03b944083b01f977a88290600090a250565b610217610555565b6001600160a01b03811661023e576040516366385fa360e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b6001546001600160a01b0316336001600160a01b0316146102e45760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2103932b8bab2b9ba37b960791b60448201526064015b60405180910390fd5b816003146103285760405162461bcd60e51b815260206004820152601160248201527013999d08191bd95cdb89dd08195e1a5cdd607a1b60448201526064016102db565b806001146103785760405162461bcd60e51b815260206004820152601c60248201527f43616e206f6e6c7920636c61696d206f6e652070657220636861696e0000000060448201526064016102db565b6040516370a0823160e01b81526001600160a01b0384811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156103e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040791906105f3565b1161044a5760405162461bcd60e51b81526020600482015260136024820152722737ba103437b63234b733902924a9a2903b1960691b60448201526064016102db565b6001600160a01b03831660009081526003602052604090205460ff16156104a55760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016102db565b50506001600160a01b03166000908152600360205260409020805460ff19166001179055565b6104d3610555565b6001600160a01b0381166104fa576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461058057604051632e6c18c960e11b815260040160405180910390fd5b565b80356001600160a01b038116811461059957600080fd5b919050565b6000602082840312156105b057600080fd5b6105b982610582565b9392505050565b6000806000606084860312156105d557600080fd5b6105de84610582565b95602085013595506040909401359392505050565b60006020828403121561060557600080fd5b505191905056fea26469706673582212201d9fbe26287866c52ee9aab93432f3000137878b2d49faab5ce386da0541d86964736f6c634300080d0033c3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62697066733a2f2f62616679626569646a3667793632716b67776936777733326977326b68626a6375736633786566766932677567796b6466617535346d76757835342f6d6574614f75747075742f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e000000000000000000000000033280d3a65b96eb878dd711abe9b2c0dbf740579

Deployed Bytecode

0x6080604052600436106103965760003560e01c806379ed19b2116101dc578063c87b56dd11610102578063eda3e65d116100a0578063f2fde38b1161006f578063f2fde38b14610b4a578063f8f2096714610b6a578063ff2aafd714610ba0578063ff6916b314610bc057600080fd5b8063eda3e65d14610aca578063ef9ae33a14610aea578063efa1685f14610b0a578063f242432a14610b2a57600080fd5b8063e060ffa6116100dc578063e060ffa614610a62578063e1539f7014610a82578063e8a3d48514610a95578063e985e9c514610aaa57600080fd5b8063c87b56dd14610a0c578063d441ef4914610a2c578063dc0b748114610a4c57600080fd5b8063991940be1161017a578063ad2f852a11610149578063ad2f852a1461098e578063af91b174146109ac578063b9664101146109cc578063c27afefc146109ec57600080fd5b8063991940be146109055780639de36f3b1461093b5780639f7b45791461095b578063a22cb4651461096e57600080fd5b80638da5cb5b116101b65780638da5cb5b14610874578063908618731461089457806393676d82146108b457806395d89b41146108d457600080fd5b806379ed19b2146107fe5780638116ed72146108345780638a60c4c11461085457600080fd5b8063304d14e2116102c15780634a5846bb1161025f5780635718f41a1161022e5780635718f41a1461077e5780636d07d7121461079e578063756ff919146107be57806377e71675146107de57600080fd5b80634a5846bb146106fb5780634e1273f41461071b5780634ead47161461074857806354497f0a1461075e57600080fd5b80633c93d8be1161029b5780633c93d8be14610670578063411d8f2f146106905780634792cd55146106b057806347f7f1f4146106e857600080fd5b8063304d14e214610614578063313ce567146106345780633bd5b0f21461065057600080fd5b80630e89341c116103395780631a380b12116103085780631a380b12146105515780631f069bb8146105875780632a55205a146105b55780632eb2c2d6146105f457600080fd5b80630e89341c146104db578063156e29f6146104fb57806316f4d1121461051b57806318160ddd1461053b57600080fd5b806306d254da1161037557806306d254da1461042057806306fdde031461044057806307682fd0146104835780630779ace8146104a357600080fd5b8062fdd58e1461039b57806301ffc9a7146103ce57806303d6d110146103fe575b600080fd5b3480156103a757600080fd5b506103bb6103b6366004613564565b610bd6565b6040519081526020015b60405180910390f35b3480156103da57600080fd5b506103ee6103e93660046135a4565b610c2c565b60405190151581526020016103c5565b34801561040a57600080fd5b5061041e6104193660046135c1565b610c99565b005b34801561042c57600080fd5b5061041e61043b3660046135da565b610cdd565b34801561044c57600080fd5b506040805180820190915260118152704576657252697365204d656d656e746f7360781b60208201525b6040516103c5919061364d565b34801561048f57600080fd5b5061041e61049e366004613672565b610d18565b3480156104af57600080fd5b506011546104c3906001600160a01b031681565b6040516001600160a01b0390911681526020016103c5565b3480156104e757600080fd5b506104766104f63660046135c1565b610d8c565b34801561050757600080fd5b5061041e6105163660046136a5565b610ea7565b34801561052757600080fd5b506104766105363660046136d8565b610f6f565b34801561054757600080fd5b506103bb60145481565b34801561055d57600080fd5b506104c361056c3660046136d8565b600b602052600090815260409020546001600160a01b031681565b34801561059357600080fd5b506105a76105a23660046135da565b611009565b6040516103c592919061372e565b3480156105c157600080fd5b506105d56105d036600461378e565b6111b8565b604080516001600160a01b0390931683526020830191909152016103c5565b34801561060057600080fd5b5061041e61060f366004613835565b611204565b34801561062057600080fd5b506012546104c3906001600160a01b031681565b34801561064057600080fd5b50604051600081526020016103c5565b34801561065c57600080fd5b5061041e61066b3660046135c1565b6112ac565b34801561067c57600080fd5b5061047661068b3660046135c1565b6112e9565b34801561069c57600080fd5b506002546104c3906001600160a01b031681565b3480156106bc57600080fd5b506106d06106cb366004613564565b61138c565b6040516001600160601b0390911681526020016103c5565b61041e6106f63660046138ef565b6113d8565b34801561070757600080fd5b5061041e61071636600461399e565b6116b1565b34801561072757600080fd5b5061073b610736366004613a1e565b611805565b6040516103c59190613a89565b34801561075457600080fd5b506103bb60065481565b34801561076a57600080fd5b506103bb6107793660046136d8565b61193a565b34801561078a57600080fd5b5061041e6107993660046135da565b61195f565b3480156107aa57600080fd5b5061041e6107b9366004613a9c565b6119d8565b3480156107ca57600080fd5b5061041e6107d936600461399e565b611a42565b3480156107ea57600080fd5b5061041e6107f93660046136a5565b611bb6565b34801561080a57600080fd5b506104c36108193660046136d8565b600c602052600090815260409020546001600160a01b031681565b34801561084057600080fd5b506001546104c3906001600160a01b031681565b34801561086057600080fd5b5061041e61086f3660046135c1565b611cab565b34801561088057600080fd5b506000546104c3906001600160a01b031681565b3480156108a057600080fd5b506013546104c3906001600160a01b031681565b3480156108c057600080fd5b5061041e6108cf366004613672565b611cbd565b3480156108e057600080fd5b506040805180820190915260088152676d656d655249534560c01b6020820152610476565b34801561091157600080fd5b506104c36109203660046136d8565b600a602052600090815260409020546001600160a01b031681565b34801561094757600080fd5b5061041e610956366004613672565b611d29565b61041e61096936600461378e565b611d95565b34801561097a57600080fd5b5061041e610989366004613afc565b611e91565b34801561099a57600080fd5b506002546001600160a01b03166104c3565b3480156109b857600080fd5b506004546104c3906001600160a01b031681565b3480156109d857600080fd5b5061041e6109e7366004613672565b611ea0565b3480156109f857600080fd5b5061041e610a07366004613b33565b611f0c565b348015610a1857600080fd5b50610476610a273660046135c1565b611f4b565b348015610a3857600080fd5b5061041e610a473660046135da565b611f56565b348015610a5857600080fd5b506103bb60035481565b348015610a6e57600080fd5b5061041e610a7d366004613b6f565b611fac565b61041e610a90366004613b8b565b612000565b348015610aa157600080fd5b50610476612224565b348015610ab657600080fd5b506103ee610ac5366004613c0d565b612253565b348015610ad657600080fd5b5061041e610ae5366004613b6f565b612281565b348015610af657600080fd5b506103bb610b053660046136d8565b6122d5565b348015610b1657600080fd5b5061041e610b253660046136a5565b6122fa565b348015610b3657600080fd5b5061041e610b45366004613c29565b6123b4565b348015610b5657600080fd5b5061041e610b653660046135da565b61244f565b348015610b7657600080fd5b506104c3610b853660046136d8565b6009602052600090815260409020546001600160a01b031681565b348015610bac57600080fd5b5061041e610bbb3660046135c1565b6124d9565b348015610bcc57600080fd5b506103bb60055481565b60006001600160a01b038316610bff576040516366385fa360e01b815260040160405180910390fd5b610c25600e6000610c108686612538565b81526020019081526020016000205460101c90565b9392505050565b60006001600160e01b0319821663152a902d60e11b1480610c5d57506001600160e01b03198216636cdb3d1360e11b145b80610c7857506001600160e01b031982166303a24d0760e21b145b80610c9357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610ca1612585565b60058190556040518181527f361f81bf9859e8ff7e84509ee6276217a23296cf8d9a95f69a795da5ba188e96906020015b60405180910390a150565b610ce5612585565b6001600160a01b038116610d0c576040516366385fa360e01b815260040160405180910390fd5b610d15816125b2565b50565b610d20612585565b61ffff821660008181526009602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fdd20b1130ab22b031cb7a5d84a67429127607d602dd2c3a3c0fde1c4c7ff7fca91015b60405180910390a15050565b61ffff81166000818152600d602052604081208054606093929190610db090613c8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddc90613c8e565b8015610e295780601f10610dfe57610100808354040283529160200191610e29565b820191906000526020600020905b815481529060010190602001808311610e0c57829003601f168201915b505050505090506000815111610e745760405162461bcd60e51b815260206004820152600b60248201526a155c9a481b9bdd081cd95d60aa1b60448201526064015b60405180910390fd5b80610e7e856112e9565b604051602001610e8f929190613cc8565b60405160208183030381529060405292505050919050565b61ffff82166000818152600c60205260409020543391906001600160a01b03168214610f255760405162461bcd60e51b815260206004820152602760248201527f526571756573746f72206e6f7420616c6c6f77656420746f206d696e742074686044820152666174207479706560c81b6064820152608401610e6b565b610f308585856125fc565b60408051858152602081018590526001600160a01b03871691600091839160008051602061431e83398151915291015b60405180910390a45050505050565b600d6020526000908152604090208054610f8890613c8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb490613c8e565b80156110015780601f10610fd657610100808354040283529160200191611001565b820191906000526020600020905b815481529060010190602001808311610fe457829003601f168201915b505050505081565b6001600160a01b0381166000908152600f602052604090208054606091829160028110156110525750506040805160008082526020820190815281830190925294909350915050565b600061105f600183613d33565b90506000816001600160401b0381111561107b5761107b613d07565b6040519080825280602002602001820160405280156110a4578160200160208202803683370190505b509550816001600160401b038111156110bf576110bf613d07565b6040519080825280602002602001820160405280156110e8578160200160208202803683370190505b50945060015b838110156111ae57600181039150600085828154811061111057611110613d4a565b9060005260206000209060029182820401919006600c029054906101000a90046001600160601b031690508088848151811061114e5761114e613d4a565b60200260200101906001600160601b031690816001600160601b031681525050611188600e6000610c108c856001600160601b0316612538565b87848151811061119a5761119a613d4a565b6020908102919091010152506001016110ee565b5050505050915091565b600080836000036111dc57604051635e85ae7360e01b815260040160405180910390fd5b6002546003546001600160a01b03909116906111f89085613d76565b915091505b9250929050565b8761120e816127a2565b6001600160a01b03891633148061122a575061122a8933612253565b6112915760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610e6b565b6112a1898989898989898961282e565b505050505050505050565b6112b4612585565b60068190556040518181527f767e110cb18739f6f7c12deb132f97152546ce38f20895371668d93aa933f8a790602001610cd2565b604080518181526060818101835291600f9160009160208201818036833701905050905060405b801561138457848316600981116113345761132c816030613d8a565b60f81b611343565b61133f816037613d8a565b60f81b5b8361134d84613da2565b9350838151811061136057611360613d4a565b60200101906001600160f81b031916908160001a905350600486901c955050611310565b509392505050565b600f60205281600052604060002081815481106113a857600080fd5b9060005260206000209060029182820401919006600c02915091509054906101000a90046001600160601b031681565b336113e2816127a2565b83806114225760405162461bcd60e51b815260206004820152600f60248201526e4e6f20696e70757420746f6b656e7360881b6044820152606401610e6b565b8083146114805760405162461bcd60e51b815260206004820152602660248201527f496e7075743a2069647320616e6420616d6f756e7473206c656e677468206d696044820152650e6dac2e8c6d60d31b6064820152608401610e6b565b88806114c15760405162461bcd60e51b815260206004820152601060248201526f4e6f206f757470757420746f6b656e7360801b6044820152606401610e6b565b8088146115205760405162461bcd60e51b815260206004820152602760248201527f4f75747075743a2069647320616e6420616d6f756e7473206c656e677468206d6044820152660d2e6dac2e8c6d60cb1b6064820152608401610e6b565b60008b8b600081811061153557611535613d4a565b9050602002013561ffff169050600080600090505b838110156116425760008e8e8381811061156657611566613d4a565b9050602002013590508061ffff1661ffff168461ffff16146115c25760405162461bcd60e51b81526020600482015260156024820152744e6f742073616d652074797065206f75747075747360581b6044820152606401610e6b565b60008d8d848181106115d6576115d6613d4a565b905060200201359050600081116116215760405162461bcd60e51b815260206004820152600f60248201526e4e6f207a65726f206f75747075747360881b6044820152606401610e6b565b61162b8185613d8a565b93505050808061163a90613db9565b91505061154a565b5061ffff82166000908152600b60205260409020546001600160a01b03168061167e576040516302c2726760e61b815260040160405180910390fd5b61169061168a846122d5565b8361294a565b6116a1818f8f8f8f8f8f8f8f6129cb565b5050505050505050505050505050565b60045433906001600160a01b031681146116dd5760405162461bcd60e51b8152600401610e6b90613dd2565b838281146116fd5760405162461bcd60e51b8152600401610e6b90613df7565b60005b8181101561176057600087878381811061171c5761171c613d4a565b905060200201359050600086868481811061173957611739613d4a565b90506020020135905061174d8a83836125fc565b50508061175990613db9565b9050611700565b50866001600160a01b031660006001600160a01b0316836001600160a01b03166000805160206142fe833981519152898989896040516117a39493929190613e75565b60405180910390a46004546040516001600160a01b03808a1692169030907ff8eec0223e61fb21a9418d0f74bd406cc488700cb40adc84b4fea1ed9bcb5a87906117f4908b908b908b908b90613e75565b60405180910390a450505050505050565b6060838281146118695760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610e6b565b6000816001600160401b0381111561188357611883613d07565b6040519080825280602002602001820160405280156118ac578160200160208202803683370190505b50905060005b8281101561192f576119028888838181106118cf576118cf613d4a565b90506020020160208101906118e491906135da565b8787848181106118f6576118f6613d4a565b90506020020135610bd6565b82828151811061191457611914613d4a565b602090810291909101015261192881613db9565b90506118b2565b509695505050505050565b61ffff8116600090815260076020526040812054808203610c93575050600554919050565b611967612585565b6001600160a01b03811661198e576040516366385fa360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b6119e0612585565b61ffff83166000908152600d602052604090206119fe9083836134af565b508261ffff167fcc9a40567cb8e27b48f1a5bfcc2110d8cceffe00200ee24ac050c39ade3fedb18383604051611a35929190613ed0565b60405180910390a2505050565b60045433906001600160a01b03168114611a6e5760405162461bcd60e51b8152600401610e6b90613dd2565b611a77866127a2565b611a818682612253565b15611a9f57604051634014f1a560e01b815260040160405180910390fd5b83828114611abf5760405162461bcd60e51b8152600401610e6b90613df7565b60005b81811015611b22576000878783818110611ade57611ade613d4a565b9050602002013590506000868684818110611afb57611afb613d4a565b905060200201359050611b0f8a8383612b98565b505080611b1b90613db9565b9050611ac2565b5060006001600160a01b0316876001600160a01b0316836001600160a01b03166000805160206142fe83398151915289898989604051611b659493929190613e75565b60405180910390a46004546040516001600160a01b03808a1692169030907f0a3fdbd3b9434e5fc9ade247da79eaf7e2d1707500d64db5b1560a764f626285906117f4908b908b908b908b90613e75565b60045433906001600160a01b03168114611be25760405162461bcd60e51b8152600401610e6b90613dd2565b611beb846127a2565b611bf58482612253565b15611c1357604051634014f1a560e01b815260040160405180910390fd5b611c1e848484612b98565b60408051848152602081018490526000916001600160a01b03878116929085169160008051602061431e833981519152910160405180910390a460045460408051858152602081018590526001600160a01b0387811693169130917fe0bf1306ae80358ba075e7e155d3d3100bd1cb7245f654f111d39453f756356a91015b60405180910390a450505050565b611cb3612585565b610d153382612df3565b611cc5612585565b61ffff82166000818152600b602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fb1d02679ca901853728f6f7c39123cda2def88f2e76a14d1a05c2935f00816059101610d80565b611d31612585565b61ffff82166000818152600a602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f1b076f90831c47b63fdc4f0786bb37b8982b57b628e166f900b25629c9241d3b9101610d80565b61ffff82166000818152600960205260409020546001600160a01b031680611dd0576040516302c2726760e61b815260040160405180910390fd5b611de2611ddc8361193a565b8461294a565b60003360405163165994d960e21b81526001600160a01b038083166004830152602482018890526044820187905291925090831690635966536490606401600060405180830381600087803b158015611e3a57600080fd5b505af1158015611e4e573d6000803e3d6000fd5b50505050611e5d8186866125fc565b60408051868152602081018690526001600160a01b03831691600091839160008051602061431e8339815191529101610f60565b611e9c338383612e67565b5050565b611ea8612585565b61ffff82166000818152600c602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f4e3bfcc5c9ecdf35191832c1fea9acb386b20abc50dd2796f7f65e6c2f385df79101610d80565b611f14612585565b6001600160a01b038316611f3b576040516366385fa360e01b815260040160405180910390fd5b611f46838383612f48565b505050565b6060610c9382610d8c565b611f5e612585565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc7ba3c390578157af9596e71002363b398c7e5294bab3e788d9df3b2251bbac290602001610cd2565b611fb4612585565b61ffff8216600081815260076020908152604091829020849055815192835282018390527f152156d1d9eb3e2fc375680993f6f491dca9c47939e35f4c06a04a43a08a2f309101610d80565b3361200a816127a2565b8382811461202a5760405162461bcd60e51b8152600401610e6b90613df7565b6000871161206b5760405162461bcd60e51b815260206004820152600e60248201526d139bc81e995c9bc81bdd5d1c1d5d60921b6044820152606401610e6b565b61ffff88166000818152600a60205260409020546001600160a01b0316806120a6576040516302c2726760e61b815260040160405180910390fd5b6120b86120b2836122d5565b8a61294a565b6040516337d415bb60e01b815233906001600160a01b038316906337d415bb906120f29084908f908f908f908f908f908f90600401613eec565b600060405180830381600087803b15801561210c57600080fd5b505af1158015612120573d6000803e3d6000fd5b5050505060005b848110156121895760008a8a8381811061214357612143613d4a565b905060200201359050600089898481811061216057612160613d4a565b905060200201359050612174848383612b98565b5050808061218190613db9565b915050612127565b5060006001600160a01b0316816001600160a01b0316826001600160a01b03166000805160206142fe8339815191528c8c8c8c6040516121cc9493929190613e75565b60405180910390a46121df818c8c6125fc565b604080518c8152602081018c90526001600160a01b03831691600091839160008051602061431e83398151915291015b60405180910390a45050505050505050505050565b606061222f46613001565b60405160200161223f9190613f3b565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b612289612585565b61ffff8216600081815260086020908152604091829020849055815192835282018390527fdd4719940454f4e3d8bc79a3d99dbc5cb7311cffee06273c4fa1a1b07f2f25809101610d80565b61ffff8116600090815260086020526040812054808203610c93575050600654919050565b60045433906001600160a01b031681146123265760405162461bcd60e51b8152600401610e6b90613dd2565b6123318484846125fc565b60408051848152602081018490526001600160a01b03808716926000929185169160008051602061431e833981519152910160405180910390a460045460408051858152602081018590526001600160a01b0387811693169130917f339e4100371ca3951325b190c421cb3c67f09635d57fc14e6aacfcb52d3873299101611c9d565b856123be816127a2565b6001600160a01b0387163314806123da57506123da8733612253565b6124385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610e6b565b612446878787878787613109565b50505050505050565b612457612585565b6001600160a01b03811661247e576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6124e1612585565b600a8111156125035760405163c64200e960e01b815260040160405180910390fd5b60038190556040518181527fd9b587d0d884e97b8e3772325d18ffc0412781f43cb5471b8eb5972667724f0190602001610cd2565b60006001600160601b038211156125625760405163c64200e960e01b815260040160405180910390fd5b506001600160601b031660609190911b6bffffffffffffffffffffffff19161790565b6000546001600160a01b031633146125b057604051632e6c18c960e11b815260040160405180910390fd5b565b600280546001600160a01b0319166001600160a01b0383169081179091556040517fc3f6f2bdf6d9c842a3bc549613cd55a1e4949821f557b66feb8d73eb7f576d9390600090a250565b6001600160601b0382106126225760405162461bcd60e51b8152600401610e6b90613fa0565b600061262e8484612538565b6000818152600e602052604090205490915061ffff8116156126685761265481846131a3565b6000838152600e6020526040902055612784565b6001600160a01b0385166000908152600f60205260408120805490918190036126e75781546000838152602080822060028085018755600194850190810490910180546001600160601b03808d16938716600c026101000a93840293021916919091179055868252600e905260409020601087901b9091179055612781565b61ffff81106127295760405162461bcd60e51b815260206004820152600e60248201526d546f6f206d616e7920747970657360901b6044820152606401610e6b565b815460018082018455600084815260208082206002850401805493909416600c026101000a6001600160601b0381810219909416938b160292909217909255858252600e90526040902061ffff8216601087901b1790555b50505b82601460008282546127969190613d8a565b90915550505050505050565b60015460405163060648d160e11b81526001600160a01b03838116600483015290911690630c0c91a290602401602060405180830381865afa1580156127ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128109190613fc6565b15610d15576040516335543b4960e21b815260040160405180910390fd5b8483811461284e5760405162461bcd60e51b8152600401610e6b90613df7565b6001600160a01b0388166128745760405162461bcd60e51b8152600401610e6b90613fe3565b3360005b828110156128e357600089898381811061289457612894613d4a565b90506020020135905060008888848181106128b1576128b1613d4a565b9050602002013590506128c58d8383612b98565b6128d08c83836125fc565b5050806128dc90613db9565b9050612878565b50886001600160a01b03168a6001600160a01b0316826001600160a01b03166000805160206142fe8339815191528b8b8b8b6040516129259493929190613e75565b60405180910390a461293e818b8b8b8b8b8b8b8b6131fc565b50505050505050505050565b60006129568284614028565b90508015806129655750803410155b6129a85760405162461bcd60e51b8152602060048201526014602482015273135a5b9d08199959481b9bdd0818dbdd995c995960621b6044820152606401610e6b565b4780156129c5576002546129c5906001600160a01b031682612df3565b50505050565b60405163b4d36d9d60e01b815233906001600160a01b038b169063b4d36d9d90612a099084908d908d908d908d908d908d908d908d90600401614047565b600060405180830381600087803b158015612a2357600080fd5b505af1158015612a37573d6000803e3d6000fd5b5086925060009150505b81811015612aa3576000878783818110612a5d57612a5d613d4a565b9050602002013590506000868684818110612a7a57612a7a613d4a565b905060200201359050612a8e858383612b98565b50508080612a9b90613db9565b915050612a41565b5060006001600160a01b0316826001600160a01b0316836001600160a01b03166000805160206142fe83398151915289898989604051612ae69493929190613e75565b60405180910390a4508760005b81811015612b555760008b8b83818110612b0f57612b0f613d4a565b90506020020135905060008a8a84818110612b2c57612b2c613d4a565b905060200201359050612b408583836125fc565b50508080612b4d90613db9565b915050612af3565b50816001600160a01b031660006001600160a01b0316836001600160a01b03166000805160206142fe8339815191528d8d8d8d60405161220f9493929190613e75565b6001600160601b038210612bbe5760405162461bcd60e51b8152600401610e6b90613fa0565b6000612bca8484612538565b6000818152600e602052604090205490915061ffff811680612c1e5760405162461bcd60e51b815260206004820152600d60248201526c4e6f6e2d6578697374616e636560981b6044820152606401610e6b565b612c28828561335b565b91506000612c368360101c90565b1115612c52576000838152600e60205260409020829055612dd4565b6000838152600e602090815260408083208390556001600160a01b0389168352600f9091529020805460018111612cb85760405162461bcd60e51b815260206004820152600a602482015269151bdad95b88131a5cdd60b21b6044820152606401610e6b565b6000612cc5600183613d33565b9050808461ffff161015612d8f576000838281548110612ce757612ce7613d4a565b600091825260209091206002820401546001909116600c026101000a90046001600160601b03169050612d1a8a82612538565b6000818152600e60205260409020805461ffff881661ffff19821681179092558654929950975082918691908110612d5457612d54613d4a565b9060005260206000209060029182820401919006600c026101000a8154816001600160601b0302191690836001600160601b03160217905550505b82805480612d9f57612d9f6140b9565b60008281526020902060026000199092019182040180546001600160601b03600c60018516026101000a021916905590555050505b8360146000828254612de69190613d33565b9091555050505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e40576040519150601f19603f3d011682016040523d82523d6000602084013e612e45565b606091505b5050905080611f465760405163b5747cc760e01b815260040160405180910390fd5b816001600160a01b0316836001600160a01b031603612eda5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610e6b565b6001600160a01b03838116600081815260106020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a3505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbb9190613fc6565b50816001600160a01b0316836001600160a01b03167ff217402c85197de87cd806653771027d1e91101ef79ab35684a580c62b91a9b583604051612f3b91815260200190565b6060816000036130285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613052578061303c81613db9565b915061304b9050600a83613d76565b915061302c565b806001600160401b0381111561306a5761306a613d07565b6040519080825280601f01601f191660200182016040528015613094576020820181803683370190505b509250839150805b8215613101576130ad600a846140cf565b6130b8906030613d8a565b60f81b846130c583613da2565b925082815181106130d8576130d8613d4a565b60200101906001600160f81b031916908160001a9053506130fa600a84613d76565b925061309c565b505050919050565b6001600160a01b03851661312f5760405162461bcd60e51b8152600401610e6b90613fe3565b3361313b878686612b98565b6131468686866125fc565b856001600160a01b0316876001600160a01b0316826001600160a01b031660008051602061431e833981519152888860405161318c929190918252602082015260400190565b60405180910390a4612446818888888888886133ea565b60006001600160f01b0382106131cb5760405162461bcd60e51b8152600401610e6b90613fa0565b82601081901c61ffff82166131e085836140e3565b61ffff1960109190911b1661ffff909116179250505092915050565b6001600160a01b0387163b156112a15760405163bc197c8160e01b81526001600160a01b0388169063bc197c8190613246908c908c908b908b908b908b908b908b9060040161410e565b602060405180830381865afa92505050801561327f575060408051601f3d908101601f1916820190925261327c91810190614172565b60015b61332b5761328b61418f565b806308c379a0036132c4575061329f6141e5565b806132aa57506132c6565b8060405162461bcd60e51b8152600401610e6b919061364d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610e6b565b6001600160e01b0319811663bc197c8160e01b1461293e5760405162461bcd60e51b8152600401610e6b9061426e565b60006001600160f01b0382106133835760405162461bcd60e51b8152600401610e6b90613fa0565b82601081901c61ffff8216848210156133d05760405162461bcd60e51b815260206004820152600f60248201526e42616c616e636520746f6f206c6f7760881b6044820152606401610e6b565b61ffff1693900360101b61ffff1916929092179392505050565b6001600160a01b0385163b156124465760405163f23a6e6160e01b81526001600160a01b0386169063f23a6e6190613430908a908a9089908990899089906004016142b6565b602060405180830381865afa925050508015613469575060408051601f3d908101601f1916820190925261346691810190614172565b60015b6134755761328b61418f565b6001600160e01b0319811663f23a6e6160e01b146134a55760405162461bcd60e51b8152600401610e6b9061426e565b5050505050505050565b8280546134bb90613c8e565b90600052602060002090601f0160209004810192826134dd5760008555613523565b82601f106134f65782800160ff19823516178555613523565b82800160010185558215613523579182015b82811115613523578235825591602001919060010190613508565b5061352f929150613533565b5090565b5b8082111561352f5760008155600101613534565b80356001600160a01b038116811461355f57600080fd5b919050565b6000806040838503121561357757600080fd5b61358083613548565b946020939093013593505050565b6001600160e01b031981168114610d1557600080fd5b6000602082840312156135b657600080fd5b8135610c258161358e565b6000602082840312156135d357600080fd5b5035919050565b6000602082840312156135ec57600080fd5b610c2582613548565b60005b838110156136105781810151838201526020016135f8565b838111156129c55750506000910152565b600081518084526136398160208601602086016135f5565b601f01601f19169290920160200192915050565b602081526000610c256020830184613621565b803561ffff8116811461355f57600080fd5b6000806040838503121561368557600080fd5b61368e83613660565b915061369c60208401613548565b90509250929050565b6000806000606084860312156136ba57600080fd5b6136c384613548565b95602085013595506040909401359392505050565b6000602082840312156136ea57600080fd5b610c2582613660565b600081518084526020808501945080840160005b8381101561372357815187529582019590820190600101613707565b509495945050505050565b604080825283519082018190526000906020906060840190828701845b828110156137705781516001600160601b03168452928401929084019060010161374b565b5050508381038285015261378481866136f3565b9695505050505050565b600080604083850312156137a157600080fd5b50508035926020909101359150565b60008083601f8401126137c257600080fd5b5081356001600160401b038111156137d957600080fd5b6020830191508360208260051b85010111156111fd57600080fd5b60008083601f84011261380657600080fd5b5081356001600160401b0381111561381d57600080fd5b6020830191508360208285010111156111fd57600080fd5b60008060008060008060008060a0898b03121561385157600080fd5b61385a89613548565b975061386860208a01613548565b965060408901356001600160401b038082111561388457600080fd5b6138908c838d016137b0565b909850965060608b01359150808211156138a957600080fd5b6138b58c838d016137b0565b909650945060808b01359150808211156138ce57600080fd5b506138db8b828c016137f4565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b03121561390b57600080fd5b88356001600160401b038082111561392257600080fd5b61392e8c838d016137b0565b909a50985060208b013591508082111561394757600080fd5b6139538c838d016137b0565b909850965060408b013591508082111561396c57600080fd5b6139788c838d016137b0565b909650945060608b013591508082111561399157600080fd5b506138db8b828c016137b0565b6000806000806000606086880312156139b657600080fd5b6139bf86613548565b945060208601356001600160401b03808211156139db57600080fd5b6139e789838a016137b0565b90965094506040880135915080821115613a0057600080fd5b50613a0d888289016137b0565b969995985093965092949392505050565b60008060008060408587031215613a3457600080fd5b84356001600160401b0380821115613a4b57600080fd5b613a57888389016137b0565b90965094506020870135915080821115613a7057600080fd5b50613a7d878288016137b0565b95989497509550505050565b602081526000610c2560208301846136f3565b600080600060408486031215613ab157600080fd5b613aba84613660565b925060208401356001600160401b03811115613ad557600080fd5b613ae1868287016137f4565b9497909650939450505050565b8015158114610d1557600080fd5b60008060408385031215613b0f57600080fd5b613b1883613548565b91506020830135613b2881613aee565b809150509250929050565b600080600060608486031215613b4857600080fd5b613b5184613548565b9250613b5f60208501613548565b9150604084013590509250925092565b60008060408385031215613b8257600080fd5b61358083613660565b60008060008060008060808789031215613ba457600080fd5b863595506020870135945060408701356001600160401b0380821115613bc957600080fd5b613bd58a838b016137b0565b90965094506060890135915080821115613bee57600080fd5b50613bfb89828a016137b0565b979a9699509497509295939492505050565b60008060408385031215613c2057600080fd5b61368e83613548565b60008060008060008060a08789031215613c4257600080fd5b613c4b87613548565b9550613c5960208801613548565b9450604087013593506060870135925060808701356001600160401b03811115613c8257600080fd5b613bfb89828a016137f4565b600181811c90821680613ca257607f821691505b602082108103613cc257634e487b7160e01b600052602260045260246000fd5b50919050565b60008351613cda8184602088016135f5565b835190830190613cee8183602088016135f5565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613d4557613d45613d1d565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613d8557613d85613d60565b500490565b60008219821115613d9d57613d9d613d1d565b500190565b600081613db157613db1613d1d565b506000190190565b600060018201613dcb57613dcb613d1d565b5060010190565b6020808252600b908201526a4f6e6c792062726964676560a81b604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b81835260006001600160fb1b03831115613e5857600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000613e89604083018688613e3f565b8281036020840152613e9c818587613e3f565b979650505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000613ee4602083018486613ea7565b949350505050565b60018060a01b038816815286602082015285604082015260a060608201526000613f1a60a083018688613e3f565b8281036080840152613f2d818587613e3f565b9a9950505050505050505050565b7f68747470733a2f2f646174612e65766572726973652e636f6d2f646174612f6d815267656d65726973652d60c01b602082015260008251613f848160288501602087016135f5565b64173539b7b760d91b6028939091019283015250602d01919050565b6020808252600c908201526b4f7574206f662072616e676560a01b604082015260600190565b600060208284031215613fd857600080fd5b8151610c2581613aee565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600081600019048311821515161561404257614042613d1d565b500290565b6001600160a01b038a16815260a06020820181905260009061406c9083018a8c613e3f565b828103604084015261407f81898b613e3f565b90508281036060840152614094818789613e3f565b905082810360808401526140a9818587613e3f565b9c9b505050505050505050505050565b634e487b7160e01b600052603160045260246000fd5b6000826140de576140de613d60565b500690565b60006001600160f01b0382811684821680830382111561410557614105613d1d565b01949350505050565b6001600160a01b0389811682528816602082015260a06040820181905260009061413b908301888a613e3f565b828103606084015261414e818789613e3f565b90508281036080840152614163818587613ea7565b9b9a5050505050505050505050565b60006020828403121561418457600080fd5b8151610c258161358e565b600060033d11156141a85760046000803e5060005160e01c5b90565b601f8201601f191681016001600160401b03811182821017156141de57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156141f35790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561422257505050505090565b828501915081518181111561423a5750505050505090565b843d87010160208285010111156142545750505050505090565b614263602082860101876141ab565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03878116825286166020820152604081018590526060810184905260a0608082018190526000906142f19083018486613ea7565b9897505050505050505056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a264697066735822122071d342dbdbbc311f858d35bc6379f16f6881f7f05921d63b12aab3660b326dfe64736f6c634300080d0033

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

00000000000000000000000033280d3a65b96eb878dd711abe9b2c0dbf740579

-----Decoded View---------------
Arg [0] : _owner (address): 0x33280D3A65b96EB878dD711aBe9B2c0Dbf740579

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000033280d3a65b96eb878dd711abe9b2c0dbf740579


Deployed Bytecode Sourcemap

27550:27077:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37294:223;;;;;;;;;;-1:-1:-1;37294:223:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;37294:223:0;;;;;;;;45686:370;;;;;;;;;;-1:-1:-1;45686:370:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;45686:370:0;1019:187:1;32386:140:0;;;;;;;;;;-1:-1:-1;32386:140:0;;;;;:::i;:::-;;:::i;:::-;;9636:181;;;;;;;;;;-1:-1:-1;9636:181:0;;;;;:::i;:::-;;:::i;31730:99::-;;;;;;;;;;-1:-1:-1;31795:26:0;;;;;;;;;;;;-1:-1:-1;;;31795:26:0;;;;31730:99;;;;;;;:::i;34029:226::-;;;;;;;;;;-1:-1:-1;34029:226:0;;;;;:::i;:::-;;:::i;29843:44::-;;;;;;;;;;-1:-1:-1;29843:44:0;;;;-1:-1:-1;;;;;29843:44:0;;;;;;-1:-1:-1;;;;;2956:32:1;;;2938:51;;2926:2;2911:18;29843:44:0;2765:230:1;35290:301:0;;;;;;;;;;-1:-1:-1;35290:301:0;;;;;:::i;:::-;;:::i;37529:412::-;;;;;;;;;;-1:-1:-1;37529:412:0;;;;;:::i;:::-;;:::i;29543:41::-;;;;;;;;;;-1:-1:-1;29543:41:0;;;;;:::i;:::-;;:::i;32022:26::-;;;;;;;;;;;;;;;;29397:80;;;;;;;;;;-1:-1:-1;29397:80:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29397:80:0;;;38499:986;;;;;;;;;;-1:-1:-1;38499:986:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;10008:302::-;;;;;;;;;;-1:-1:-1;10008:302:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5705:32:1;;;5687:51;;5769:2;5754:18;;5747:34;;;;5660:18;10008:302:0;5513:274:1;47708:450:0;;;;;;;;;;-1:-1:-1;47708:450:0;;;;;:::i;:::-;;:::i;29894:56::-;;;;;;;;;;-1:-1:-1;29894:56:0;;;;-1:-1:-1;;;;;29894:56:0;;;31937:77;;;;;;;;;;-1:-1:-1;31937:77:0;;31980:5;8114:36:1;;8102:2;8087:18;31937:77:0;7972:184:1;32534:153:0;;;;;;;;;;-1:-1:-1;32534:153:0;;;;;:::i;:::-;;:::i;35599:431::-;;;;;;;;;;-1:-1:-1;35599:431:0;;;;;:::i;:::-;;:::i;9273:43::-;;;;;;;;;;-1:-1:-1;9273:43:0;;;;-1:-1:-1;;;;;9273:43:0;;;29656:47;;;;;;;;;;-1:-1:-1;29656:47:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8559:39:1;;;8541:58;;8529:2;8514:18;29656:47:0;8397:208:1;41979:1367:0;;;;;;:::i;:::-;;:::i;52603:672::-;;;;;;;;;;-1:-1:-1;52603:672:0;;;;;:::i;:::-;;:::i;46064:516::-;;;;;;;;;;-1:-1:-1;46064:516:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29099:34::-;;;;;;;;;;;;;;;;32695:184;;;;;;;;;;-1:-1:-1;32695:184:0;;;;;:::i;:::-;;:::i;15828:239::-;;;;;;;;;;-1:-1:-1;15828:239:0;;;;;:::i;:::-;;:::i;33828:193::-;;;;;;;;;;-1:-1:-1;33828:193:0;;;;;:::i;:::-;;:::i;51426:806::-;;;;;;;;;;-1:-1:-1;51426:806:0;;;;;:::i;:::-;;:::i;50917:501::-;;;;;;;;;;-1:-1:-1;50917:501:0;;;;;:::i;:::-;;:::i;29484:52::-;;;;;;;;;;-1:-1:-1;29484:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29484:52:0;;;15789:30;;;;;;;;;;-1:-1:-1;15789:30:0;;;;-1:-1:-1;;;;;15789:30:0;;;54057:115;;;;;;;;;;-1:-1:-1;54057:115:0;;;;;:::i;:::-;;:::i;5145:20::-;;;;;;;;;;-1:-1:-1;5145:20:0;;;;-1:-1:-1;;;;;5145:20:0;;;29957:46;;;;;;;;;;-1:-1:-1;29957:46:0;;;;-1:-1:-1;;;;;29957:46:0;;;34764:276;;;;;;;;;;-1:-1:-1;34764:276:0;;;;;:::i;:::-;;:::i;31837:92::-;;;;;;;;;;-1:-1:-1;31904:17:0;;;;;;;;;;;;-1:-1:-1;;;31904:17:0;;;;31837:92;;29314:76;;;;;;;;;;-1:-1:-1;29314:76:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29314:76:0;;;34488:268;;;;;;;;;;-1:-1:-1;34488:268:0;;;;;:::i;:::-;;:::i;37953:538::-;;;;;;:::i;:::-;;:::i;46607:155::-;;;;;;;;;;-1:-1:-1;46607:155:0;;;;;:::i;:::-;;:::i;35048:125::-;;;;;;;;;;-1:-1:-1;35148:15:0;;-1:-1:-1;;;;;35148:15:0;35048:125;;29030:24;;;;;;;;;;-1:-1:-1;29030:24:0;;;;-1:-1:-1;;;;;29030:24:0;;;34263:217;;;;;;;;;;-1:-1:-1;34263:217:0;;;;;:::i;:::-;;:::i;54180:228::-;;;;;;;;;;-1:-1:-1;54180:228:0;;;;;:::i;:::-;;:::i;35181:101::-;;;;;;;;;;-1:-1:-1;35181:101:0;;;;;:::i;:::-;;:::i;33683:137::-;;;;;;;;;;-1:-1:-1;33683:137:0;;;;;:::i;:::-;;:::i;9323:38::-;;;;;;;;;;;;;;;;32057:149;;;;;;;;;;-1:-1:-1;32057:149:0;;;;;:::i;:::-;;:::i;44426:1252::-;;;;;;:::i;:::-;;:::i;36038:251::-;;;;;;;;;;;;;:::i;47100:168::-;;;;;;;;;;-1:-1:-1;47100:168:0;;;;;:::i;:::-;;:::i;32214:164::-;;;;;;;;;;-1:-1:-1;32214:164:0;;;;;:::i;:::-;;:::i;32887:197::-;;;;;;;;;;-1:-1:-1;32887:197:0;;;;;:::i;:::-;;:::i;52240:355::-;;;;;;;;;;-1:-1:-1;52240:355:0;;;;;:::i;:::-;;:::i;47295:405::-;;;;;;;;;;-1:-1:-1;47295:405:0;;;;;:::i;:::-;;:::i;5518:214::-;;;;;;;;;;-1:-1:-1;5518:214:0;;;;;:::i;:::-;;:::i;29251:56::-;;;;;;;;;;-1:-1:-1;29251:56:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29251:56:0;;;9370:258;;;;;;;;;;-1:-1:-1;9370:258:0;;;;;:::i;:::-;;:::i;29061:31::-;;;;;;;;;;;;;;;;37294:223;37368:7;-1:-1:-1;;;;;37392:21:0;;37388:50;;37422:16;;-1:-1:-1;;;37422:16:0;;;;;;;;;;;37388:50;37458:51;:10;:42;37469:30;37482:7;37491;37469:12;:30::i;:::-;37458:42;;;;;;;;;;;;27056:2;27043:15;;26892:175;37458:51;37451:58;37294:223;-1:-1:-1;;;37294:223:0:o;45686:370::-;45789:4;-1:-1:-1;;;;;;45827:41:0;;-1:-1:-1;;;45827:41:0;;:99;;-1:-1:-1;;;;;;;45885:41:0;;-1:-1:-1;;;45885:41:0;45827:99;:168;;;-1:-1:-1;;;;;;;45943:52:0;;-1:-1:-1;;;45943:52:0;45827:168;:221;;;-1:-1:-1;;;;;;;;;;8746:40:0;;;46012:36;45806:242;45686:370;-1:-1:-1;;45686:370:0:o;32386:140::-;5318:12;:10;:12::i;:::-;32456:16:::1;:22:::0;;;32496::::1;::::0;597:25:1;;;32496:22:0::1;::::0;585:2:1;570:18;32496:22:0::1;;;;;;;;32386:140:::0;:::o;9636:181::-;5318:12;:10;:12::i;:::-;-1:-1:-1;;;;;9717:24:0;::::1;9713:53;;9750:16;;-1:-1:-1::0;;;9750:16:0::1;;;;;;;;;;;9713:53;9779:30;9798:10;9779:18;:30::i;:::-;9636:181:::0;:::o;34029:226::-;5318:12;:10;:12::i;:::-;34128:24:::1;::::0;::::1;;::::0;;;:15:::1;:24;::::0;;;;;;;;:57;;-1:-1:-1;;;;;;34128:57:0::1;-1:-1:-1::0;;;;;34128:57:0;::::1;::::0;;::::1;::::0;;;34203:44;;16845:38:1;;;16899:18;;;16892:60;34203:44:0::1;::::0;16818:18:1;34203:44:0::1;;;;;;;;34029:226:::0;;:::o;35290:301::-;35391:6;35386:11;;35362:14;35432:17;;;:8;:17;;;;;35409:40;;35336:13;;35386:11;35362:14;35432:17;35409:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35487:1;35470:7;:14;:18;35462:42;;;;-1:-1:-1;;;35462:42:0;;17550:2:1;35462:42:0;;;17532:21:1;17589:2;17569:18;;;17562:30;-1:-1:-1;;;17608:18:1;;;17601:41;17659:18;;35462:42:0;;;;;;;;;35548:7;35557:15;35569:2;35557:11;:15::i;:::-;35531:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35517:66;;;;35290:301;;;:::o;37529:412::-;37685:6;37675:16;;37608:17;37711:26;;;:17;:26;;;;;;5025:10;;37675:16;-1:-1:-1;;;;;37711:26:0;:39;;37703:91;;;;-1:-1:-1;;;37703:91:0;;18530:2:1;37703:91:0;;;18512:21:1;18569:2;18549:18;;;18542:30;18608:34;18588:18;;;18581:62;-1:-1:-1;;;18659:18:1;;;18652:37;18706:19;;37703:91:0;18328:403:1;37703:91:0;37835:31;37846:2;37850:7;37859:6;37835:10;:31::i;:::-;37882:51;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;37882:51:0;;;37909:1;;37882:51;;-1:-1:-1;;;;;;;;;;;37882:51:0;18883:18:1;37882:51:0;;;;;;;;37597:344;;37529:412;;;:::o;29543:41::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38499:986::-;-1:-1:-1;;;;;38659:19:0;;38628:28;38659:19;;;:10;:19;;;;;38714:18;;38565:24;;;;38766:1;38749:18;;38745:197;;;-1:-1:-1;;38833:15:0;;;38846:1;38833:15;;;;;;38873:16;;;;;;;;;38833:15;;;-1:-1:-1;38499:986:0;-1:-1:-1;;38499:986:0:o;38745:197::-;38954:14;38971:18;38988:1;38971:14;:18;:::i;:::-;38954:35;;39000:16;39051:6;-1:-1:-1;;;;;39038:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39038:20:0;;39027:31;;39093:6;-1:-1:-1;;;;;39079:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39079:21:0;-1:-1:-1;39069:31:0;-1:-1:-1;39128:1:0;39111:367;39135:14;39131:1;:18;39111:367;;;39211:1;39207;:5;39196:16;;39242:14;39259:11;39271:1;39259:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39259:14:0;39242:31;;39309:7;39288:8;39297;39288:18;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;39288:28:0;;;-1:-1:-1;;;;;39288:28:0;;;;;39351:51;:10;:42;39362:30;39375:7;39384;-1:-1:-1;;;;;39362:30:0;:12;:30::i;39351:51::-;39331:7;39339:8;39331:17;;;;;;;;:::i;:::-;;;;;;;;;;:71;-1:-1:-1;39448:3:0;;39111:367;;;;38617:868;;;;38499:986;;;:::o;10008:302::-;10100:16;10127:21;10171:8;10183:1;10171:13;10167:55;;10193:29;;-1:-1:-1;;;10193:29:0;;;;;;;;;;;10167:55;10251:15;;10282:19;;-1:-1:-1;;;;;10251:15:0;;;;10269:32;;:10;:32;:::i;:::-;10235:67;;;;10008:302;;;;;;:::o;47708:450::-;47910:4;36499:24;36511:11;36499;:24::i;:::-;-1:-1:-1;;;;;47949:20:0;::::1;5025:10:::0;47949:20:::1;::::0;:60:::1;;-1:-1:-1::0;47973:36:0::1;47990:4:::0;5025:10;47100:168;:::i;47973:36::-:1;47927:160;;;::::0;-1:-1:-1;;;47927:160:0;;19974:2:1;47927:160:0::1;::::0;::::1;19956:21:1::0;20013:2;19993:18;;;19986:30;20052:34;20032:18;;;20025:62;-1:-1:-1;;;20103:18:1;;;20096:48;20161:19;;47927:160:0::1;19772:414:1::0;47927:160:0::1;48098:52;48121:4;48127:2;48131:3;;48136:7;;48145:4;;48098:22;:52::i;:::-;47708:450:::0;;;;;;;;;:::o;32534:153::-;5318:12;:10;:12::i;:::-;32609:19:::1;:25:::0;;;32652:27:::1;::::0;597:25:1;;;32652:27:0::1;::::0;585:2:1;570:18;32652:27:0::1;451:177:1::0;35599:431:0;35730:2;35720:13;;;;;35649;35720;;;;;35649;35687:2;;35675:9;;35720:13;;;;;;;;;;-1:-1:-1;;35700:33:0;-1:-1:-1;35753:2:0;35766:227;35773:5;;35766:227;;35808:8;;;35851:1;35844:8;;:96;;35929:9;35934:4;35929:2;:9;:::i;:::-;35916:24;;35844:96;;;35885:9;35890:4;35885:2;:9;:::i;:::-;35872:24;;35844:96;35832:4;35837:3;;;:::i;:::-;;;;35832:9;;;;;;;;:::i;:::-;;;;:108;-1:-1:-1;;;;;35832:108:0;;;;;;;;;35980:1;35975;:6;;35971:10;;35780:213;35766:227;;;-1:-1:-1;36017:4:0;35599:431;-1:-1:-1;;;35599:431:0:o;29656:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29656:47:0;;:::o;41979:1367::-;5025:10;36499:24;36511:11;36499;:24::i;:::-;42204:7;42237:17;42229:45:::1;;;::::0;-1:-1:-1;;;42229:45:0;;20667:2:1;42229:45:0::1;::::0;::::1;20649:21:1::0;20706:2;20686:18;;;20679:30;-1:-1:-1;;;20725:18:1;;;20718:45;20780:18;;42229:45:0::1;20465:339:1::0;42229:45:0::1;42293:35:::0;;::::1;42285:86;;;::::0;-1:-1:-1;;;42285:86:0;;21011:2:1;42285:86:0::1;::::0;::::1;20993:21:1::0;21050:2;21030:18;;;21023:30;21089:34;21069:18;;;21062:62;-1:-1:-1;;;21140:18:1;;;21133:36;21186:19;;42285:86:0::1;20809:402:1::0;42285:86:0::1;42409:10:::0;42445:20;42437:49:::1;;;::::0;-1:-1:-1;;;42437:49:0;;21418:2:1;42437:49:0::1;::::0;::::1;21400:21:1::0;21457:2;21437:18;;;21430:30;-1:-1:-1;;;21476:18:1;;;21469:46;21532:18;;42437:49:0::1;21216:340:1::0;42437:49:0::1;42505:36:::0;;::::1;42497:88;;;::::0;-1:-1:-1;;;42497:88:0;;21763:2:1;42497:88:0::1;::::0;::::1;21745:21:1::0;21802:2;21782:18;;;21775:30;21841:34;21821:18;;;21814:62;-1:-1:-1;;;21892:18:1;;;21885:37;21939:19;;42497:88:0::1;21561:403:1::0;42497:88:0::1;42606:14;42630:10;;42641:1;42630:13;;;;;;;:::i;:::-;;;;;;;42646:6;42630:22;42606:47;;42666:19;42701:9:::0;42713:1:::1;42701:13;;42696:332;42720:16;42716:1;:20;42696:332;;;42758:17;42778:10;;42789:1;42778:13;;;;;;;:::i;:::-;;;;;;;42758:33;;42832:9;42844:6;42832:18;42814:37;;:7;:37;;;42806:71;;;::::0;-1:-1:-1;;;42806:71:0;;22171:2:1;42806:71:0::1;::::0;::::1;22153:21:1::0;22210:2;22190:18;;;22183:30;-1:-1:-1;;;22229:18:1;;;22222:51;22290:18;;42806:71:0::1;21969:345:1::0;42806:71:0::1;42892:16;42911:9;;42921:1;42911:12;;;;;;;:::i;:::-;;;;;;;42892:31;;42957:1;42946:8;:12;42938:40;;;::::0;-1:-1:-1;;;42938:40:0;;22521:2:1;42938:40:0::1;::::0;::::1;22503:21:1::0;22560:2;22540:18;;;22533:30;-1:-1:-1;;;22579:18:1;;;22572:45;22634:18;;42938:40:0::1;22319:339:1::0;42938:40:0::1;42993:23;43008:8:::0;42993:23;::::1;:::i;:::-;;;42743:285;;42738:3;;;;;:::i;:::-;;;;42696:332;;;-1:-1:-1::0;43080:37:0::1;::::0;::::1;43040;43080::::0;;;:28:::1;:37;::::0;;;;;-1:-1:-1;;;;;43080:37:0::1;::::0;43128:58:::1;;43176:10;;-1:-1:-1::0;;;43176:10:0::1;;;;;;;;;;;43128:58;43199:49;43213:21;43226:7;43213:12;:21::i;:::-;43236:11;43199:13;:49::i;:::-;43261:77;43280:12;43294:10;;43306:9;;43317:7;;43326:11;;43261:18;:77::i;:::-;42169:1177;;;;;41979:1367:::0;;;;;;;;;:::o;52603:672::-;52771:9;;5025:10;;-1:-1:-1;;;;;52771:9:0;52759:21;;52751:45;;;;-1:-1:-1;;;52751:45:0;;;;;;;:::i;:::-;52827:3;52856:27;;;52848:80;;;;-1:-1:-1;;;52848:80:0;;;;;;;:::i;:::-;52946:9;52941:183;52965:9;52961:1;:13;52941:183;;;52996:10;53009:3;;53013:1;53009:6;;;;;;;:::i;:::-;;;;;;;52996:19;;53030:14;53047:7;;53055:1;53047:10;;;;;;;:::i;:::-;;;;;;;53030:27;;53086:26;53097:2;53101;53105:6;53086:10;:26::i;:::-;52981:143;;52976:3;;;;:::i;:::-;;;52941:183;;;;53177:2;-1:-1:-1;;;;;53141:53:0;53173:1;-1:-1:-1;;;;;53141:53:0;53155:8;-1:-1:-1;;;;;53141:53:0;-1:-1:-1;;;;;;;;;;;53181:3:0;;53186:7;;53141:53;;;;;;;;;:::i;:::-;;;;;;;;53239:9;;53210:57;;-1:-1:-1;;;;;53210:57:0;;;;53239:9;;53232:4;;53210:57;;;;53254:3;;;;53259:7;;;;53210:57;:::i;:::-;;;;;;;;52698:577;;52603:672;;;;;:::o;46064:516::-;46164:16;46223:8;46257:28;;;46249:82;;;;-1:-1:-1;;;46249:82:0;;24637:2:1;46249:82:0;;;24619:21:1;24676:2;24656:18;;;24649:30;24715:34;24695:18;;;24688:62;-1:-1:-1;;;24766:18:1;;;24759:39;24815:19;;46249:82:0;24435:405:1;46249:82:0;46344:30;46391:14;-1:-1:-1;;;;;46377:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46377:29:0;;46344:62;;46424:9;46419:121;46443:14;46439:1;:18;46419:121;;;46498:30;46508:8;;46517:1;46508:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46521:3;;46525:1;46521:6;;;;;;;:::i;:::-;;;;;;;46498:9;:30::i;:::-;46479:13;46493:1;46479:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;46459:3;;;:::i;:::-;;;46419:121;;;-1:-1:-1;46559:13:0;46064:516;-1:-1:-1;;;;;;46064:516:0:o;32695:184::-;32782:16;;;32748:7;32782:16;;;:8;:16;;;;;;32815:8;;;32811:37;;-1:-1:-1;;32832:16:0;;;32695:184;-1:-1:-1;32695:184:0:o;15828:239::-;5318:12;:10;:12::i;:::-;-1:-1:-1;;;;;15908:26:0;::::1;15904:55;;15943:16;;-1:-1:-1::0;;;15943:16:0::1;;;;;;;;;;;15904:55;15972:13;:39:::0;;-1:-1:-1;;;;;;15972:39:0::1;-1:-1:-1::0;;;;;15972:39:0;::::1;::::0;;::::1;::::0;;;16029:30:::1;::::0;::::1;::::0;-1:-1:-1;;16029:30:0::1;15828:239:::0;:::o;33828:193::-;5318:12;:10;:12::i;:::-;33926:17:::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:34:::1;::::0;33952:7;;33926:34:::1;:::i;:::-;;33996:7;33978:35;;;34005:7;;33978:35;;;;;;;:::i;:::-;;;;;;;;33828:193:::0;;;:::o;51426:806::-;51597:9;;5025:10;;-1:-1:-1;;;;;51597:9:0;51585:21;;51577:45;;;;-1:-1:-1;;;51577:45:0;;;;;;;:::i;:::-;51633:17;51645:4;51633:11;:17::i;:::-;51667:32;51684:4;51690:8;51667:16;:32::i;:::-;51663:91;;;51723:19;;-1:-1:-1;;;51723:19:0;;;;;;;;;;;51663:91;51784:3;51813:27;;;51805:80;;;;-1:-1:-1;;;51805:80:0;;;;;;;:::i;:::-;51903:9;51898:178;51922:9;51918:1;:13;51898:178;;;51953:10;51966:3;;51970:1;51966:6;;;;;;;:::i;:::-;;;;;;;51953:19;;51987:14;52004:7;;52012:1;52004:10;;;;;;;:::i;:::-;;;;;;;51987:27;;52031:33;52047:4;52053:2;52057:6;52031:15;:33::i;:::-;51938:138;;51933:3;;;;:::i;:::-;;;51898:178;;;;52131:1;-1:-1:-1;;;;;52093:55:0;52117:4;-1:-1:-1;;;;;52093:55:0;52107:8;-1:-1:-1;;;;;52093:55:0;-1:-1:-1;;;;;;;;;;;52135:3:0;;52140:7;;52093:55;;;;;;;;;:::i;:::-;;;;;;;;52194:9;;52164:60;;-1:-1:-1;;;;;52164:60:0;;;;52194:9;;52187:4;;52164:60;;;;52211:3;;;;52216:7;;;;52164:60;:::i;50917:501::-;51063:9;;5025:10;;-1:-1:-1;;;;;51063:9:0;51051:21;;51043:45;;;;-1:-1:-1;;;51043:45:0;;;;;;;:::i;:::-;51099:17;51111:4;51099:11;:17::i;:::-;51133:32;51150:4;51156:8;51133:16;:32::i;:::-;51129:91;;;51189:19;;-1:-1:-1;;;51189:19:0;;;;;;;;;;;51129:91;51232:33;51248:4;51254:2;51258:6;51232:15;:33::i;:::-;51283:54;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;51322:1:0;;-1:-1:-1;;;;;51283:54:0;;;;;;;;-1:-1:-1;;;;;;;;;;;51283:54:0;18883:18:1;51283:54:0;;;;;;;51382:9;;51353:57;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;51353:57:0;;;;51382:9;;51375:4;;51353:57;;18883:18:1;51353:57:0;;;;;;;;50990:428;50917:501;;;:::o;54057:115::-;5318:12;:10;:12::i;:::-;54128:36:::1;5025:10:::0;54157:6:::1;54128:14;:36::i;34764:276::-:0;5318:12;:10;:12::i;:::-;34876:37:::1;::::0;::::1;;::::0;;;:28:::1;:37;::::0;;;;;;;;:81;;-1:-1:-1;;;;;;34876:81:0::1;-1:-1:-1::0;;;;;34876:81:0;::::1;::::0;;::::1;::::0;;;34975:57;;16845:38:1;;;16899:18;;;16892:60;34975:57:0::1;::::0;16818:18:1;34975:57:0::1;16673:285:1::0;34488:268:0;5318:12;:10;:12::i;:::-;34598:35:::1;::::0;::::1;;::::0;;;:26:::1;:35;::::0;;;;;;;;:77;;-1:-1:-1;;;;;;34598:77:0::1;-1:-1:-1::0;;;;;34598:77:0;::::1;::::0;;::::1;::::0;;;34693:55;;16845:38:1;;;16899:18;;;16892:60;34693:55:0::1;::::0;16818:18:1;34693:55:0::1;16673:285:1::0;37953:538:0;38064:6;38054:16;;38030:14;38106:24;;;:15;:24;;;;;;-1:-1:-1;;;;;38106:24:0;;38143:53;;38186:10;;-1:-1:-1;;;38186:10:0;;;;;;;;;;;38143:53;38209:39;38223:16;38231:7;38223;:16::i;:::-;38241:6;38209:13;:39::i;:::-;38261:12;5025:10;38299:39;;-1:-1:-1;;;38299:39:0;;-1:-1:-1;;;;;25589:32:1;;;38299:39:0;;;25571:51:1;25638:18;;;25631:34;;;25681:18;;;25674:34;;;38261:27:0;;-1:-1:-1;38299:16:0;;;;;;25544:18:1;;38299:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38379:33;38390:4;38396:7;38405:6;38379:10;:33::i;:::-;38428:55;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;38428:55:0;;;38457:1;;38428:55;;-1:-1:-1;;;;;;;;;;;38428:55:0;18883:18:1;38428:55:0;18736:248:1;46607:155:0;46702:52;5025:10;46735:8;46745;46702:18;:52::i;:::-;46607:155;;:::o;34263:217::-;5318:12;:10;:12::i;:::-;34364:26:::1;::::0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:44;;-1:-1:-1;;;;;;34364:44:0::1;-1:-1:-1::0;;;;;34364:44:0;::::1;::::0;;::::1;::::0;;;34426:46;;16845:38:1;;;16899:18;;;16892:60;34426:46:0::1;::::0;16818:18:1;34426:46:0::1;16673:285:1::0;54180:228:0;5318:12;:10;:12::i;:::-;-1:-1:-1;;;;;54296:26:0;::::1;54292:55;;54331:16;;-1:-1:-1::0;;;54331:16:0::1;;;;;;;;;;;54292:55;54360:40;54375:12;54389:2;54393:6;54360:14;:40::i;:::-;54180:228:::0;;;:::o;35181:101::-;35234:13;35267:7;35271:2;35267:3;:7::i;33683:137::-;5318:12;:10;:12::i;:::-;33752:9:::1;:19:::0;;-1:-1:-1;;;;;;33752:19:0::1;-1:-1:-1::0;;;;;33752:19:0;::::1;::::0;;::::1;::::0;;;33789:23:::1;::::0;2938:51:1;;;33789:23:0::1;::::0;2926:2:1;2911:18;33789:23:0::1;2765:230:1::0;32057:149:0;5318:12;:10;:12::i;:::-;32135:16:::1;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;;:22;;;32175:23;;25891:38:1;;;25945:18;;25938:34;;;32175:23:0::1;::::0;25864:18:1;32175:23:0::1;25719:259:1::0;44426:1252:0;5025:10;36499:24;36511:11;36499;:24::i;:::-;44625:7;44658:35;;::::1;44650:88;;;;-1:-1:-1::0;;;44650:88:0::1;;;;;;;:::i;:::-;44768:1;44757:8;:12;44749:39;;;::::0;-1:-1:-1;;;44749:39:0;;26185:2:1;44749:39:0::1;::::0;::::1;26167:21:1::0;26224:2;26204:18;;;26197:30;-1:-1:-1;;;26243:18:1;;;26236:44;26297:18;;44749:39:0::1;25983:338:1::0;44749:39:0::1;44845:6;44833:18:::0;::::1;44809:14;44901:35:::0;;;:26:::1;:35;::::0;;;;;-1:-1:-1;;;;;44901:35:0::1;::::0;44947:58:::1;;44995:10;;-1:-1:-1::0;;;44995:10:0::1;;;;;;;;;;;44947:58;45018:46;45032:21;45045:7;45032:12;:21::i;:::-;45055:8;45018:13;:46::i;:::-;45115:79;::::0;-1:-1:-1;;;45115:79:0;;5025:10;;-1:-1:-1;;;;;45115:30:0;::::1;::::0;::::1;::::0;:79:::1;::::0;5025:10;;45152:9;;45163:8;;45173:7;;;;45182:11;;;;45115:79:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45246:9;45241:200;45265:13;45261:1;:17;45241:200;;;45300:15;45318:7;;45326:1;45318:10;;;;;;;:::i;:::-;;;;;;;45300:28;;45343:14;45360:11;;45372:1;45360:14;;;;;;;:::i;:::-;;;;;;;45343:31;;45391:38;45407:4;45413:7;45422:6;45391:15;:38::i;:::-;45285:156;;45280:3;;;;;:::i;:::-;;;;45241:200;;;;45492:1;-1:-1:-1::0;;;;;45458:59:0::1;45478:4;-1:-1:-1::0;;;;;45458:59:0::1;45472:4;-1:-1:-1::0;;;;;45458:59:0::1;-1:-1:-1::0;;;;;;;;;;;45496:7:0::1;;45505:11;;45458:59;;;;;;;;;:::i;:::-;;;;;;;;45558:37;45569:4;45575:9;45586:8;45558:10;:37::i;:::-;45611:59;::::0;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;45611:59:0;::::1;::::0;45640:1:::1;::::0;45611:59;;-1:-1:-1;;;;;;;;;;;45611:59:0;18883:18:1;45611:59:0::1;;;;;;;;44590:1088;;;;44426:1252:::0;;;;;;;:::o;36038:251::-;36084:13;36220:23;36229:13;36220:8;:23::i;:::-;36142:128;;;;;;;;:::i;:::-;;;;;;;;;;;;;36110:171;;36038:251;:::o;47100:168::-;-1:-1:-1;;;;;47223:27:0;;;47199:4;47223:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;47100:168::o;32214:164::-;5318:12;:10;:12::i;:::-;32297:21:::1;::::0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;;;;:27;;;32342:28;;25891:38:1;;;25945:18;;25938:34;;;32342:28:0::1;::::0;25864:18:1;32342:28:0::1;25719:259:1::0;32887:197:0;32979:21;;;32945:7;32979:21;;;:13;:21;;;;;;33017:8;;;33013:40;;-1:-1:-1;;33034:19:0;;;32887:197;-1:-1:-1;32887:197:0:o;52240:355::-;52383:9;;5025:10;;-1:-1:-1;;;;;52383:9:0;52371:21;;52363:45;;;;-1:-1:-1;;;52363:45:0;;;;;;;:::i;:::-;52421:26;52432:2;52436;52440:6;52421:10;:26::i;:::-;52465:52;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;52465:52:0;;;;52498:1;;52465:52;;;;-1:-1:-1;;;;;;;;;;;52465:52:0;18883:18:1;52465:52:0;;;;;;;52561:9;;52533:54;;;18910:25:1;;;18966:2;18951:18;;18944:34;;;-1:-1:-1;;;;;52533:54:0;;;;52561:9;;52554:4;;52533:54;;18883:18:1;52533:54:0;18736:248:1;47295:405:0;47468:4;36499:24;36511:11;36499;:24::i;:::-;-1:-1:-1;;;;;47507:20:0;::::1;5025:10:::0;47507:20:::1;::::0;:60:::1;;-1:-1:-1::0;47531:36:0::1;47548:4:::0;5025:10;47100:168;:::i;47531:36::-:1;47485:151;;;::::0;-1:-1:-1;;;47485:151:0;;27946:2:1;47485:151:0::1;::::0;::::1;27928:21:1::0;27985:2;27965:18;;;27958:30;28024:34;28004:18;;;27997:62;-1:-1:-1;;;28075:18:1;;;28068:39;28124:19;;47485:151:0::1;27744:405:1::0;47485:151:0::1;47647:45;47665:4;47671:2;47675;47679:6;47687:4;;47647:17;:45::i;:::-;47295:405:::0;;;;;;;:::o;5518:214::-;5318:12;:10;:12::i;:::-;-1:-1:-1;;;;;5595:22:0;::::1;5591:51;;5626:16;;-1:-1:-1::0;;;5626:16:0::1;;;;;;;;;;;5591:51;5681:5;::::0;;5660:37:::1;::::0;-1:-1:-1;;;;;5660:37:0;;::::1;::::0;5681:5;::::1;::::0;5660:37:::1;::::0;::::1;5708:5;:16:::0;;-1:-1:-1;;;;;;5708:16:0::1;-1:-1:-1::0;;;;;5708:16:0;;;::::1;::::0;;;::::1;::::0;;5518:214::o;9370:258::-;5318:12;:10;:12::i;:::-;9489:2:::1;9470:16;:21;9466:52;;;9500:18;;-1:-1:-1::0;;;9500:18:0::1;;;;;;;;;;;9466:52;9529:19;:38:::0;;;9585:35:::1;::::0;597:25:1;;;9585:35:0::1;::::0;585:2:1;570:18;9585:35:0::1;451:177:1::0;37006:280:0;37084:10;-1:-1:-1;;;;;37111:26:0;;37107:57;;;37146:18;;-1:-1:-1;;;37146:18:0;;;;;;;;;;;37107:57;-1:-1:-1;;;;;;37191:49:0;37220:2;37191:31;;;;-1:-1:-1;;37191:31:0;:49;;37006:280::o;5174:104::-;5224:5;;-1:-1:-1;;;;;5224:5:0;5025:10;5224:21;5220:50;;5254:16;;-1:-1:-1;;;5254:16:0;;;;;;;;;;;5220:50;5174:104::o;9825:175::-;9893:15;:50;;-1:-1:-1;;;;;;9893:50:0;-1:-1:-1;;;;;9893:50:0;;;;;;;;9959:33;;;;-1:-1:-1;;9959:33:0;9825:175;:::o;39493:1127::-;-1:-1:-1;;;;;39590:26:0;;39582:51;;;;-1:-1:-1;;;39582:51:0;;;;;;;:::i;:::-;39646:14;39663:30;39676:7;39685;39663:12;:30::i;:::-;39704:28;39735:15;;;:10;:15;;;;;;;;-1:-1:-1;27239:6:0;27227:18;;39765:32;39761:818;;39859:26;:14;39878:6;39859:18;:26::i;:::-;39841:15;;;;:10;:15;;;;;:44;39761:818;;;-1:-1:-1;;;;;39949:19:0;;39918:28;39949:19;;;:10;:19;;;;;40000:18;;39949:19;;40037:11;;;40033:535;;40109:18;;-1:-1:-1;40109:18:0;;;;;;;;40146:33;;;;;40109:18;;;;40146:33;;;;;;;;-1:-1:-1;;;;;40146:33:0;;;;;;40109:18;40146:33;40109:18;40146:33;;;;;;;;;;;;;;40198:15;;;:10;:15;;;;;40255:2;40236:21;;;40235:27;;;40198:65;;40033:535;;;40321:16;40312:25;;40304:52;;;;-1:-1:-1;;;40304:52:0;;28697:2:1;40304:52:0;;;28679:21:1;28736:2;28716:18;;;28709:30;-1:-1:-1;;;28755:18:1;;;28748:44;28809:18;;40304:52:0;28495:338:1;40304:52:0;40428:33;;;;;;;;-1:-1:-1;40428:33:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40428:33:0;;;;;;;;;;;;;;;;;;40480:15;;;:10;:15;;;;;40517:34;;;40537:2;40518:21;;;40517:34;40480:72;;40033:535;39903:676;;39761:818;40606:6;40591:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;39493:1127:0:o;36297:142::-;36367:13;;:41;;-1:-1:-1;;;36367:41:0;;-1:-1:-1;;;;;2956:32:1;;;36367:41:0;;;2938:51:1;36367:13:0;;;;:28;;2911:18:1;;36367:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36363:68;;;36417:14;;-1:-1:-1;;;36417:14:0;;;;;;;;;;;48641:784;48811:3;48840:27;;;48832:80;;;;-1:-1:-1;;;48832:80:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48931:16:0;;48923:66;;;;-1:-1:-1;;;48923:66:0;;;;;;;:::i;:::-;5025:10;49002:16;49046:219;49070:9;49066:1;:13;49046:219;;;49101:10;49114:3;;49118:1;49114:6;;;;;;;:::i;:::-;;;;;;;49101:19;;49135:14;49152:7;;49160:1;49152:10;;;;;;;:::i;:::-;;;;;;;49135:27;;49179:33;49195:4;49201:2;49205:6;49179:15;:33::i;:::-;49227:26;49238:2;49242;49246:6;49227:10;:26::i;:::-;49086:179;;49081:3;;;;:::i;:::-;;;49046:219;;;;49312:2;-1:-1:-1;;;;;49282:47:0;49306:4;-1:-1:-1;;;;;49282:47:0;49296:8;-1:-1:-1;;;;;49282:47:0;-1:-1:-1;;;;;;;;;;;49316:3:0;;49321:7;;49282:47;;;;;;;;;:::i;:::-;;;;;;;;49342:75;49378:8;49388:4;49394:2;49398:3;;49403:7;;49412:4;;49342:35;:75::i;:::-;48780:645;;48641:784;;;;;;;;:::o;36551:447::-;36629:16;36648:18;36658:8;36648:7;:18;:::i;:::-;36629:37;-1:-1:-1;36685:13:0;;;:38;;;36715:8;36702:9;:21;;36685:38;36677:71;;;;-1:-1:-1;;;36677:71:0;;29869:2:1;36677:71:0;;;29851:21:1;29908:2;29888:18;;;29881:30;-1:-1:-1;;;29927:18:1;;;29920:50;29987:18;;36677:71:0;29667:344:1;36677:71:0;36780:21;36816:12;;36812:179;;36951:15;;36920:59;;-1:-1:-1;;;;;36951:15:0;36970:8;36920:14;:59::i;:::-;36618:380;;36551:447;;:::o;43354:1064::-;43599:83;;-1:-1:-1;;;43599:83:0;;5025:10;;-1:-1:-1;;;;;43599:32:0;;;;;:83;;5025:10;;43638;;;;43650:9;;;;43661:7;;;;43670:11;;;;43599:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43749:7:0;;-1:-1:-1;43729:17:0;;-1:-1:-1;;43774:202:0;43798:9;43794:1;:13;43774:202;;;43829:14;43846:7;;43854:1;43846:10;;;;;;;:::i;:::-;;;;;;;43829:27;;43871:18;43892:11;;43904:1;43892:14;;;;;;;:::i;:::-;;;;;;;43871:35;;43923:41;43939:4;43945:6;43953:10;43923:15;:41::i;:::-;43814:162;;43809:3;;;;;:::i;:::-;;;;43774:202;;;;44027:1;-1:-1:-1;;;;;43993:59:0;44013:4;-1:-1:-1;;;;;43993:59:0;44007:4;-1:-1:-1;;;;;43993:59:0;-1:-1:-1;;;;;;;;;;;44031:7:0;;44040:11;;43993:59;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;44105:10:0;44138:9;44133:200;44157:9;44153:1;:13;44133:200;;;44188:17;44208:10;;44219:1;44208:13;;;;;;;:::i;:::-;;;;;;;44188:33;;44236:16;44255:9;;44265:1;44255:12;;;;;;;:::i;:::-;;;;;;;44236:31;;44284:37;44295:4;44301:9;44312:8;44284:10;:37::i;:::-;44173:160;;44168:3;;;;;:::i;:::-;;;;44133:200;;;;44382:4;-1:-1:-1;;;;;44350:60:0;44378:1;-1:-1:-1;;;;;44350:60:0;44364:4;-1:-1:-1;;;;;44350:60:0;-1:-1:-1;;;;;;;;;;;44388:10:0;;44400:9;;44350:60;;;;;;;;;:::i;40628:1343::-;-1:-1:-1;;;;;40730:26:0;;40722:51;;;;-1:-1:-1;;;40722:51:0;;;;;;;:::i;:::-;40786:14;40803:30;40816:7;40825;40803:12;:30::i;:::-;40844:28;40875:15;;;:10;:15;;;;;;;;-1:-1:-1;27239:6:0;27227:18;;40969:12;40960:39;;;;-1:-1:-1;;;40960:39:0;;31304:2:1;40960:39:0;;;31286:21:1;31343:2;31323:18;;;31316:30;-1:-1:-1;;;31362:18:1;;;31355:43;31415:18;;40960:39:0;31102:337:1;40960:39:0;41029:31;:14;41053:6;41029:23;:31::i;:::-;41012:48;;41103:1;41077:23;:14;27056:2;27043:15;;26892:175;41077:23;:27;41073:857;;;41154:15;;;;:10;:15;;;;;:32;;;41073:857;;;41256:1;41219:15;;;:10;:15;;;;;;;;:39;;;-1:-1:-1;;;;;41347:19:0;;;;:10;:19;;;;;41398:18;;41449:1;41440:10;;41431:34;;;;-1:-1:-1;;;41431:34:0;;31646:2:1;41431:34:0;;;31628:21:1;31685:2;31665:18;;;31658:30;-1:-1:-1;;;31704:18:1;;;31697:40;31754:18;;41431:34:0;31444:334:1;41431:34:0;41482:12;41497:10;41506:1;41497:6;:10;:::i;:::-;41482:25;;41537:4;41526:8;:15;;;41522:351;;;41562:18;41583:11;41595:4;41583:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41583:17:0;;-1:-1:-1;41643:34:0;41656:7;41583:17;41643:12;:34::i;:::-;41713:15;;;;:10;:15;;;;;;;27500:34;;;-1:-1:-1;;27501:21:0;;27500:34;;41749:54;;;41822:21;;41713:15;;-1:-1:-1;41713:15:0;-1:-1:-1;41846:11:0;;41822:21;;27500:34;41822:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:35;;;;;-1:-1:-1;;;;;41822:35:0;;;;;-1:-1:-1;;;;;41822:35:0;;;;;;41543:330;41522:351;41901:11;:17;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;41901:17:0;;;;;;;;;-1:-1:-1;;;;;41901:17:0;;;;;;;;;;;;;;-1:-1:-1;;;41073:857:0;41957:6;41942:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;40628:1343:0:o;3829:174::-;3910:9;3925:2;-1:-1:-1;;;;;3925:7:0;3940:6;3925:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3909:42;;;3967:4;3962:33;;3980:15;;-1:-1:-1;;;3980:15:0;;;;;;;;;;;46770:322;46916:8;-1:-1:-1;;;;;46907:17:0;:5;-1:-1:-1;;;;;46907:17:0;;46899:71;;;;-1:-1:-1;;;46899:71:0;;32327:2:1;46899:71:0;;;32309:21:1;32366:2;32346:18;;;32339:30;32405:34;32385:18;;;32378:62;-1:-1:-1;;;32456:18:1;;;32449:39;32505:19;;46899:71:0;32125:405:1;46899:71:0;-1:-1:-1;;;;;46981:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;46981:46:0;;;;;;;;;;47043:41;;1159::1;;;47043::0;;1132:18:1;47043:41:0;;;;;;;;46770:322;;;:::o;54416:208::-;54509:41;;-1:-1:-1;;;54509:41:0;;-1:-1:-1;;;;;5705:32:1;;;54509:41:0;;;5687:51:1;5754:18;;;5747:34;;;54509:29:0;;;;;5660:18:1;;54509:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54605:2;-1:-1:-1;;;;;54568:48:0;54591:12;-1:-1:-1;;;;;54568:48:0;;54609:6;54568:48;;;;597:25:1;;585:2;570:18;;451:177;53433:584:0;53488:19;53529:5;53538:1;53529:10;53525:62;;-1:-1:-1;;53565:10:0;;;;;;;;;;;;-1:-1:-1;;;53565:10:0;;;;;53433:584::o;53525:62::-;53617:5;53597:17;53658:97;53665:14;;53658:97;;53705:8;;;;:::i;:::-;;-1:-1:-1;53728:15:0;;-1:-1:-1;53741:2:0;53728:15;;:::i;:::-;;;53658:97;;;53784:6;-1:-1:-1;;;;;53774:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53774:17:0;-1:-1:-1;53765:26:0;-1:-1:-1;53850:5:0;;-1:-1:-1;53821:6:0;53866:144;53873:14;;53866:144;;53952:14;53964:2;53952:9;:14;:::i;:::-;53947:19;;:2;:19;:::i;:::-;53934:34;;53913:6;53920:10;;;:::i;:::-;;;;53913:18;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;53913:55:0;;;;;;;;-1:-1:-1;53983:15:0;53996:2;53983:15;;:::i;:::-;;;53866:144;;;53514:503;;;53433:584;;;:::o;48166:467::-;-1:-1:-1;;;;;48295:16:0;;48287:66;;;;-1:-1:-1;;;48287:66:0;;;;;;;:::i;:::-;5025:10;48410:33;48426:4;48432:2;48436:6;48410:15;:33::i;:::-;48454:26;48465:2;48469;48473:6;48454:10;:26::i;:::-;48529:2;-1:-1:-1;;;;;48498:46:0;48523:4;-1:-1:-1;;;;;48498:46:0;48513:8;-1:-1:-1;;;;;48498:46:0;-1:-1:-1;;;;;;;;;;;48533:2:0;48537:6;48498:46;;;;;;18910:25:1;;;18966:2;18951:18;;18944:34;18898:2;18883:18;;18736:248;48498:46:0;;;;;;;;48557:68;48588:8;48598:4;48604:2;48608;48612:6;48620:4;;48557:30;:68::i;25862:458::-;25930:13;-1:-1:-1;;;;;25964:25:0;;25956:50;;;;-1:-1:-1;;;25956:50:0;;;;;;;:::i;:::-;26060:1;26111:2;26098:15;;;26162:6;26150:18;;26182:24;26200:5;26098:15;26182:24;:::i;:::-;-1:-1:-1;;26249:2:0;26230:21;;;;;26229:34;;;;;;-1:-1:-1;;;25862:458:0;;;;:::o;49455:730::-;-1:-1:-1;;;;;53394:19:0;;;:23;49641:537;;49680:79;;-1:-1:-1;;;49680:79:0;;-1:-1:-1;;;;;49680:43:0;;;;;:79;;49724:8;;49734:4;;49740:3;;;;49745:7;;;;49754:4;;;;49680:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;49680:79:0;;;;;;;;-1:-1:-1;;49680:79:0;;;;;;;;;;;;:::i;:::-;;;49676:491;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;50040:6;50033:14;;-1:-1:-1;;;50033:14:0;;;;;;;;:::i;49676:491::-;;;50089:62;;-1:-1:-1;;;50089:62:0;;35475:2:1;50089:62:0;;;35457:21:1;35514:2;35494:18;;;35487:30;35553:34;35533:18;;;35526:62;-1:-1:-1;;;35604:18:1;;;35597:50;35664:19;;50089:62:0;35273:416:1;49676:491:0;-1:-1:-1;;;;;;49809:60:0;;-1:-1:-1;;;49809:60:0;49805:159;;49894:50;;-1:-1:-1;;;49894:50:0;;;;;;;:::i;26328:556::-;26401:13;-1:-1:-1;;;;;26435:25:0;;26427:50;;;;-1:-1:-1;;;26427:50:0;;;;;;;:::i;:::-;26531:1;26582:2;26569:15;;;26633:6;26621:18;;26662:15;;;;26653:44;;;;-1:-1:-1;;;26653:44:0;;36305:2:1;26653:44:0;;;36287:21:1;36344:2;36324:18;;;36317:30;-1:-1:-1;;;36363:18:1;;;36356:45;36418:18;;26653:44:0;36103:339:1;26653:44:0;26793:34;;26735:24;;;26813:2;26794:21;-1:-1:-1;;26794:21:0;26793:34;;;;;26328:556;-1:-1:-1;;;26328:556:0:o;50193:689::-;-1:-1:-1;;;;;53394:19:0;;;:23;50350:525;;50389:72;;-1:-1:-1;;;50389:72:0;;-1:-1:-1;;;;;50389:38:0;;;;;:72;;50428:8;;50438:4;;50444:2;;50448:6;;50456:4;;;;50389:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;50389:72:0;;;;;;;;-1:-1:-1;;50389:72:0;;;;;;;;;;;;:::i;:::-;;;50385:479;;;;:::i;:::-;-1:-1:-1;;;;;;50511:55:0;;-1:-1:-1;;;50511:55:0;50507:154;;50591:50;;-1:-1:-1;;;50591:50:0;;;;;;;:::i;50507:154::-;50462:214;50193:689;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:180::-;1270:6;1323:2;1311:9;1302:7;1298:23;1294:32;1291:52;;;1339:1;1336;1329:12;1291:52;-1:-1:-1;1362:23:1;;1211:180;-1:-1:-1;1211:180:1:o;1396:186::-;1455:6;1508:2;1496:9;1487:7;1483:23;1479:32;1476:52;;;1524:1;1521;1514:12;1476:52;1547:29;1566:9;1547:29;:::i;1587:258::-;1659:1;1669:113;1683:6;1680:1;1677:13;1669:113;;;1759:11;;;1753:18;1740:11;;;1733:39;1705:2;1698:10;1669:113;;;1800:6;1797:1;1794:13;1791:48;;;-1:-1:-1;;1835:1:1;1817:16;;1810:27;1587:258::o;1850:::-;1892:3;1930:5;1924:12;1957:6;1952:3;1945:19;1973:63;2029:6;2022:4;2017:3;2013:14;2006:4;1999:5;1995:16;1973:63;:::i;:::-;2090:2;2069:15;-1:-1:-1;;2065:29:1;2056:39;;;;2097:4;2052:50;;1850:258;-1:-1:-1;;1850:258:1:o;2113:220::-;2262:2;2251:9;2244:21;2225:4;2282:45;2323:2;2312:9;2308:18;2300:6;2282:45;:::i;2338:159::-;2405:20;;2465:6;2454:18;;2444:29;;2434:57;;2487:1;2484;2477:12;2502:258;2569:6;2577;2630:2;2618:9;2609:7;2605:23;2601:32;2598:52;;;2646:1;2643;2636:12;2598:52;2669:28;2687:9;2669:28;:::i;:::-;2659:38;;2716;2750:2;2739:9;2735:18;2716:38;:::i;:::-;2706:48;;2502:258;;;;;:::o;3000:322::-;3077:6;3085;3093;3146:2;3134:9;3125:7;3121:23;3117:32;3114:52;;;3162:1;3159;3152:12;3114:52;3185:29;3204:9;3185:29;:::i;:::-;3175:39;3261:2;3246:18;;3233:32;;-1:-1:-1;3312:2:1;3297:18;;;3284:32;;3000:322;-1:-1:-1;;;3000:322:1:o;3327:184::-;3385:6;3438:2;3426:9;3417:7;3413:23;3409:32;3406:52;;;3454:1;3451;3444:12;3406:52;3477:28;3495:9;3477:28;:::i;3978:435::-;4031:3;4069:5;4063:12;4096:6;4091:3;4084:19;4122:4;4151:2;4146:3;4142:12;4135:19;;4188:2;4181:5;4177:14;4209:1;4219:169;4233:6;4230:1;4227:13;4219:169;;;4294:13;;4282:26;;4328:12;;;;4363:15;;;;4255:1;4248:9;4219:169;;;-1:-1:-1;4404:3:1;;3978:435;-1:-1:-1;;;;;3978:435:1:o;4418:837::-;4684:2;4696:21;;;4766:13;;4669:18;;;4788:22;;;4636:4;;4863;;4841:2;4826:18;;;4890:15;;;4636:4;4933:202;4947:6;4944:1;4941:13;4933:202;;;5012:13;;-1:-1:-1;;;;;5008:46:1;4996:59;;5075:12;;;;5110:15;;;;4969:1;4962:9;4933:202;;;4937:3;;;5180:9;5175:3;5171:19;5166:2;5155:9;5151:18;5144:47;5208:41;5245:3;5237:6;5208:41;:::i;:::-;5200:49;4418:837;-1:-1:-1;;;;;;4418:837:1:o;5260:248::-;5328:6;5336;5389:2;5377:9;5368:7;5364:23;5360:32;5357:52;;;5405:1;5402;5395:12;5357:52;-1:-1:-1;;5428:23:1;;;5498:2;5483:18;;;5470:32;;-1:-1:-1;5260:248:1:o;5792:367::-;5855:8;5865:6;5919:3;5912:4;5904:6;5900:17;5896:27;5886:55;;5937:1;5934;5927:12;5886:55;-1:-1:-1;5960:20:1;;-1:-1:-1;;;;;5992:30:1;;5989:50;;;6035:1;6032;6025:12;5989:50;6072:4;6064:6;6060:17;6048:29;;6132:3;6125:4;6115:6;6112:1;6108:14;6100:6;6096:27;6092:38;6089:47;6086:67;;;6149:1;6146;6139:12;6164:347;6215:8;6225:6;6279:3;6272:4;6264:6;6260:17;6256:27;6246:55;;6297:1;6294;6287:12;6246:55;-1:-1:-1;6320:20:1;;-1:-1:-1;;;;;6352:30:1;;6349:50;;;6395:1;6392;6385:12;6349:50;6432:4;6424:6;6420:17;6408:29;;6484:3;6477:4;6468:6;6460;6456:19;6452:30;6449:39;6446:59;;;6501:1;6498;6491:12;6516:1210;6676:6;6684;6692;6700;6708;6716;6724;6732;6785:3;6773:9;6764:7;6760:23;6756:33;6753:53;;;6802:1;6799;6792:12;6753:53;6825:29;6844:9;6825:29;:::i;:::-;6815:39;;6873:38;6907:2;6896:9;6892:18;6873:38;:::i;:::-;6863:48;;6962:2;6951:9;6947:18;6934:32;-1:-1:-1;;;;;7026:2:1;7018:6;7015:14;7012:34;;;7042:1;7039;7032:12;7012:34;7081:70;7143:7;7134:6;7123:9;7119:22;7081:70;:::i;:::-;7170:8;;-1:-1:-1;7055:96:1;-1:-1:-1;7258:2:1;7243:18;;7230:32;;-1:-1:-1;7274:16:1;;;7271:36;;;7303:1;7300;7293:12;7271:36;7342:72;7406:7;7395:8;7384:9;7380:24;7342:72;:::i;:::-;7433:8;;-1:-1:-1;7316:98:1;-1:-1:-1;7521:3:1;7506:19;;7493:33;;-1:-1:-1;7538:16:1;;;7535:36;;;7567:1;7564;7557:12;7535:36;;7606:60;7658:7;7647:8;7636:9;7632:24;7606:60;:::i;:::-;6516:1210;;;;-1:-1:-1;6516:1210:1;;-1:-1:-1;6516:1210:1;;;;;;7685:8;-1:-1:-1;;;6516:1210:1:o;8610:1404::-;8804:6;8812;8820;8828;8836;8844;8852;8860;8913:3;8901:9;8892:7;8888:23;8884:33;8881:53;;;8930:1;8927;8920:12;8881:53;8970:9;8957:23;-1:-1:-1;;;;;9040:2:1;9032:6;9029:14;9026:34;;;9056:1;9053;9046:12;9026:34;9095:70;9157:7;9148:6;9137:9;9133:22;9095:70;:::i;:::-;9184:8;;-1:-1:-1;9069:96:1;-1:-1:-1;9272:2:1;9257:18;;9244:32;;-1:-1:-1;9288:16:1;;;9285:36;;;9317:1;9314;9307:12;9285:36;9356:72;9420:7;9409:8;9398:9;9394:24;9356:72;:::i;:::-;9447:8;;-1:-1:-1;9330:98:1;-1:-1:-1;9535:2:1;9520:18;;9507:32;;-1:-1:-1;9551:16:1;;;9548:36;;;9580:1;9577;9570:12;9548:36;9619:72;9683:7;9672:8;9661:9;9657:24;9619:72;:::i;:::-;9710:8;;-1:-1:-1;9593:98:1;-1:-1:-1;9798:2:1;9783:18;;9770:32;;-1:-1:-1;9814:16:1;;;9811:36;;;9843:1;9840;9833:12;9811:36;;9882:72;9946:7;9935:8;9924:9;9920:24;9882:72;:::i;10019:847::-;10150:6;10158;10166;10174;10182;10235:2;10223:9;10214:7;10210:23;10206:32;10203:52;;;10251:1;10248;10241:12;10203:52;10274:29;10293:9;10274:29;:::i;:::-;10264:39;;10354:2;10343:9;10339:18;10326:32;-1:-1:-1;;;;;10418:2:1;10410:6;10407:14;10404:34;;;10434:1;10431;10424:12;10404:34;10473:70;10535:7;10526:6;10515:9;10511:22;10473:70;:::i;:::-;10562:8;;-1:-1:-1;10447:96:1;-1:-1:-1;10650:2:1;10635:18;;10622:32;;-1:-1:-1;10666:16:1;;;10663:36;;;10695:1;10692;10685:12;10663:36;;10734:72;10798:7;10787:8;10776:9;10772:24;10734:72;:::i;:::-;10019:847;;;;-1:-1:-1;10019:847:1;;-1:-1:-1;10825:8:1;;10708:98;10019:847;-1:-1:-1;;;10019:847:1:o;10871:773::-;10993:6;11001;11009;11017;11070:2;11058:9;11049:7;11045:23;11041:32;11038:52;;;11086:1;11083;11076:12;11038:52;11126:9;11113:23;-1:-1:-1;;;;;11196:2:1;11188:6;11185:14;11182:34;;;11212:1;11209;11202:12;11182:34;11251:70;11313:7;11304:6;11293:9;11289:22;11251:70;:::i;:::-;11340:8;;-1:-1:-1;11225:96:1;-1:-1:-1;11428:2:1;11413:18;;11400:32;;-1:-1:-1;11444:16:1;;;11441:36;;;11473:1;11470;11463:12;11441:36;;11512:72;11576:7;11565:8;11554:9;11550:24;11512:72;:::i;:::-;10871:773;;;;-1:-1:-1;11603:8:1;-1:-1:-1;;;;10871:773:1:o;11649:261::-;11828:2;11817:9;11810:21;11791:4;11848:56;11900:2;11889:9;11885:18;11877:6;11848:56;:::i;11915:482::-;11994:6;12002;12010;12063:2;12051:9;12042:7;12038:23;12034:32;12031:52;;;12079:1;12076;12069:12;12031:52;12102:28;12120:9;12102:28;:::i;:::-;12092:38;;12181:2;12170:9;12166:18;12153:32;-1:-1:-1;;;;;12200:6:1;12197:30;12194:50;;;12240:1;12237;12230:12;12194:50;12279:58;12329:7;12320:6;12309:9;12305:22;12279:58;:::i;:::-;11915:482;;12356:8;;-1:-1:-1;12253:84:1;;-1:-1:-1;;;;11915:482:1:o;13308:118::-;13394:5;13387:13;13380:21;13373:5;13370:32;13360:60;;13416:1;13413;13406:12;13431:315;13496:6;13504;13557:2;13545:9;13536:7;13532:23;13528:32;13525:52;;;13573:1;13570;13563:12;13525:52;13596:29;13615:9;13596:29;:::i;:::-;13586:39;;13675:2;13664:9;13660:18;13647:32;13688:28;13710:5;13688:28;:::i;:::-;13735:5;13725:15;;;13431:315;;;;;:::o;13975:328::-;14052:6;14060;14068;14121:2;14109:9;14100:7;14096:23;14092:32;14089:52;;;14137:1;14134;14127:12;14089:52;14160:29;14179:9;14160:29;:::i;:::-;14150:39;;14208:38;14242:2;14231:9;14227:18;14208:38;:::i;:::-;14198:48;;14293:2;14282:9;14278:18;14265:32;14255:42;;13975:328;;;;;:::o;14308:252::-;14375:6;14383;14436:2;14424:9;14415:7;14411:23;14407:32;14404:52;;;14452:1;14449;14442:12;14404:52;14475:28;14493:9;14475:28;:::i;14565:910::-;14705:6;14713;14721;14729;14737;14745;14798:3;14786:9;14777:7;14773:23;14769:33;14766:53;;;14815:1;14812;14805:12;14766:53;14851:9;14838:23;14828:33;;14908:2;14897:9;14893:18;14880:32;14870:42;;14963:2;14952:9;14948:18;14935:32;-1:-1:-1;;;;;15027:2:1;15019:6;15016:14;15013:34;;;15043:1;15040;15033:12;15013:34;15082:70;15144:7;15135:6;15124:9;15120:22;15082:70;:::i;:::-;15171:8;;-1:-1:-1;15056:96:1;-1:-1:-1;15259:2:1;15244:18;;15231:32;;-1:-1:-1;15275:16:1;;;15272:36;;;15304:1;15301;15294:12;15272:36;;15343:72;15407:7;15396:8;15385:9;15381:24;15343:72;:::i;:::-;14565:910;;;;-1:-1:-1;14565:910:1;;-1:-1:-1;14565:910:1;;15434:8;;14565:910;-1:-1:-1;;;14565:910:1:o;15480:260::-;15548:6;15556;15609:2;15597:9;15588:7;15584:23;15580:32;15577:52;;;15625:1;15622;15615:12;15577:52;15648:29;15667:9;15648:29;:::i;15745:695::-;15851:6;15859;15867;15875;15883;15891;15944:3;15932:9;15923:7;15919:23;15915:33;15912:53;;;15961:1;15958;15951:12;15912:53;15984:29;16003:9;15984:29;:::i;:::-;15974:39;;16032:38;16066:2;16055:9;16051:18;16032:38;:::i;:::-;16022:48;;16117:2;16106:9;16102:18;16089:32;16079:42;;16168:2;16157:9;16153:18;16140:32;16130:42;;16223:3;16212:9;16208:19;16195:33;-1:-1:-1;;;;;16243:6:1;16240:30;16237:50;;;16283:1;16280;16273:12;16237:50;16322:58;16372:7;16363:6;16352:9;16348:22;16322:58;:::i;16963:380::-;17042:1;17038:12;;;;17085;;;17106:61;;17160:4;17152:6;17148:17;17138:27;;17106:61;17213:2;17205:6;17202:14;17182:18;17179:38;17176:161;;17259:10;17254:3;17250:20;17247:1;17240:31;17294:4;17291:1;17284:15;17322:4;17319:1;17312:15;17176:161;;16963:380;;;:::o;17688:635::-;17966:3;18004:6;17998:13;18020:53;18066:6;18061:3;18054:4;18046:6;18042:17;18020:53;:::i;:::-;18136:13;;18095:16;;;;18158:57;18136:13;18095:16;18192:4;18180:17;;18158:57;:::i;:::-;-1:-1:-1;;;18237:20:1;;18266:22;;;18315:1;18304:13;;17688:635;-1:-1:-1;;;;17688:635:1:o;18989:127::-;19050:10;19045:3;19041:20;19038:1;19031:31;19081:4;19078:1;19071:15;19105:4;19102:1;19095:15;19121:127;19182:10;19177:3;19173:20;19170:1;19163:31;19213:4;19210:1;19203:15;19237:4;19234:1;19227:15;19253:125;19293:4;19321:1;19318;19315:8;19312:34;;;19326:18;;:::i;:::-;-1:-1:-1;19363:9:1;;19253:125::o;19383:127::-;19444:10;19439:3;19435:20;19432:1;19425:31;19475:4;19472:1;19465:15;19499:4;19496:1;19489:15;19515:127;19576:10;19571:3;19567:20;19564:1;19557:31;19607:4;19604:1;19597:15;19631:4;19628:1;19621:15;19647:120;19687:1;19713;19703:35;;19718:18;;:::i;:::-;-1:-1:-1;19752:9:1;;19647:120::o;20191:128::-;20231:3;20262:1;20258:6;20255:1;20252:13;20249:39;;;20268:18;;:::i;:::-;-1:-1:-1;20304:9:1;;20191:128::o;20324:136::-;20363:3;20391:5;20381:39;;20400:18;;:::i;:::-;-1:-1:-1;;;20436:18:1;;20324:136::o;22663:135::-;22702:3;22723:17;;;22720:43;;22743:18;;:::i;:::-;-1:-1:-1;22790:1:1;22779:13;;22663:135::o;22803:335::-;23005:2;22987:21;;;23044:2;23024:18;;;23017:30;-1:-1:-1;;;23078:2:1;23063:18;;23056:41;23129:2;23114:18;;22803:335::o;23143:404::-;23345:2;23327:21;;;23384:2;23364:18;;;23357:30;23423:34;23418:2;23403:18;;23396:62;-1:-1:-1;;;23489:2:1;23474:18;;23467:38;23537:3;23522:19;;23143:404::o;23552:354::-;23640:19;;;23622:3;-1:-1:-1;;;;;23671:31:1;;23668:51;;;23715:1;23712;23705:12;23668:51;23751:6;23748:1;23744:14;23803:8;23796:5;23789:4;23784:3;23780:14;23767:45;23880:1;23835:18;;23855:4;23831:29;23869:13;;;-1:-1:-1;23831:29:1;;23552:354;-1:-1:-1;;23552:354:1:o;23911:519::-;24188:2;24177:9;24170:21;24151:4;24214:73;24283:2;24272:9;24268:18;24260:6;24252;24214:73;:::i;:::-;24335:9;24327:6;24323:22;24318:2;24307:9;24303:18;24296:50;24363:61;24417:6;24409;24401;24363:61;:::i;:::-;24355:69;23911:519;-1:-1:-1;;;;;;;23911:519:1:o;24845:267::-;24934:6;24929:3;24922:19;24986:6;24979:5;24972:4;24967:3;24963:14;24950:43;-1:-1:-1;25038:1:1;25013:16;;;25031:4;25009:27;;;25002:38;;;;25094:2;25073:15;;;-1:-1:-1;;25069:29:1;25060:39;;;25056:50;;24845:267::o;25117:247::-;25276:2;25265:9;25258:21;25239:4;25296:62;25354:2;25343:9;25339:18;25331:6;25323;25296:62;:::i;:::-;25288:70;25117:247;-1:-1:-1;;;;25117:247:1:o;26326:761::-;26716:1;26712;26707:3;26703:11;26699:19;26691:6;26687:32;26676:9;26669:51;26756:6;26751:2;26740:9;26736:18;26729:34;26799:6;26794:2;26783:9;26779:18;26772:34;26842:3;26837:2;26826:9;26822:18;26815:31;26650:4;26869:74;26938:3;26927:9;26923:19;26915:6;26907;26869:74;:::i;:::-;26992:9;26984:6;26980:22;26974:3;26963:9;26959:19;26952:51;27020:61;27074:6;27066;27058;27020:61;:::i;:::-;27012:69;26326:761;-1:-1:-1;;;;;;;;;;26326:761:1:o;27092:647::-;27453:34;27448:3;27441:47;-1:-1:-1;;;27513:2:1;27508:3;27504:12;27497:32;27423:3;27558:6;27552:13;27574:60;27627:6;27622:2;27617:3;27613:12;27608:2;27600:6;27596:15;27574:60;:::i;:::-;-1:-1:-1;;;27693:2:1;27653:16;;;;27685:11;;;27678:28;-1:-1:-1;27730:2:1;27722:11;;27092:647;-1:-1:-1;27092:647:1:o;28154:336::-;28356:2;28338:21;;;28395:2;28375:18;;;28368:30;-1:-1:-1;;;28429:2:1;28414:18;;28407:42;28481:2;28466:18;;28154:336::o;28838:245::-;28905:6;28958:2;28946:9;28937:7;28933:23;28929:32;28926:52;;;28974:1;28971;28964:12;28926:52;29006:9;29000:16;29025:28;29047:5;29025:28;:::i;29088:401::-;29290:2;29272:21;;;29329:2;29309:18;;;29302:30;29368:34;29363:2;29348:18;;29341:62;-1:-1:-1;;;29434:2:1;29419:18;;29412:35;29479:3;29464:19;;29088:401::o;29494:168::-;29534:7;29600:1;29596;29592:6;29588:14;29585:1;29582:21;29577:1;29570:9;29563:17;29559:45;29556:71;;;29607:18;;:::i;:::-;-1:-1:-1;29647:9:1;;29494:168::o;30016:1081::-;-1:-1:-1;;;;;30497:32:1;;30479:51;;30517:3;30561:2;30546:18;;30539:31;;;-1:-1:-1;;30593:74:1;;30647:19;;30639:6;30631;30593:74;:::i;:::-;30715:9;30707:6;30703:22;30698:2;30687:9;30683:18;30676:50;30749:61;30803:6;30795;30787;30749:61;:::i;:::-;30735:75;;30858:9;30850:6;30846:22;30841:2;30830:9;30826:18;30819:50;30892:61;30946:6;30938;30930;30892:61;:::i;:::-;30878:75;;31002:9;30994:6;30990:22;30984:3;30973:9;30969:19;30962:51;31030:61;31084:6;31076;31068;31030:61;:::i;:::-;31022:69;30016:1081;-1:-1:-1;;;;;;;;;;;;30016:1081:1:o;31783:127::-;31844:10;31839:3;31835:20;31832:1;31825:31;31875:4;31872:1;31865:15;31899:4;31896:1;31889:15;32535:112;32567:1;32593;32583:35;;32598:18;;:::i;:::-;-1:-1:-1;32632:9:1;;32535:112::o;32652:238::-;32692:3;-1:-1:-1;;;;;32759:10:1;;;32789;;;32819:12;;;32811:21;;32808:47;;;32835:18;;:::i;:::-;32871:13;;32652:238;-1:-1:-1;;;;32652:238:1:o;32895:908::-;-1:-1:-1;;;;;33322:15:1;;;33304:34;;33374:15;;33369:2;33354:18;;33347:43;33284:3;33421:2;33406:18;;33399:31;;;33247:4;;33453:74;;33507:19;;33499:6;33491;33453:74;:::i;:::-;33575:9;33567:6;33563:22;33558:2;33547:9;33543:18;33536:50;33609:61;33663:6;33655;33647;33609:61;:::i;:::-;33595:75;;33719:9;33711:6;33707:22;33701:3;33690:9;33686:19;33679:51;33747:50;33790:6;33782;33774;33747:50;:::i;:::-;33739:58;32895:908;-1:-1:-1;;;;;;;;;;;32895:908:1:o;33808:249::-;33877:6;33930:2;33918:9;33909:7;33905:23;33901:32;33898:52;;;33946:1;33943;33936:12;33898:52;33978:9;33972:16;33997:30;34021:5;33997:30;:::i;34062:179::-;34097:3;34139:1;34121:16;34118:23;34115:120;;;34185:1;34182;34179;34164:23;-1:-1:-1;34222:1:1;34216:8;34211:3;34207:18;34115:120;34062:179;:::o;34246:346::-;34356:2;34337:13;;-1:-1:-1;;34333:27:1;34321:40;;-1:-1:-1;;;;;34376:34:1;;34412:22;;;34373:62;34370:185;;;34477:10;34472:3;34468:20;34465:1;34458:31;34512:4;34509:1;34502:15;34540:4;34537:1;34530:15;34370:185;34571:2;34564:22;-1:-1:-1;;34246:346:1:o;34597:671::-;34636:3;34678:4;34660:16;34657:26;34654:39;;;34597:671;:::o;34654:39::-;34720:2;34714:9;-1:-1:-1;;34785:16:1;34781:25;;34778:1;34714:9;34757:50;34836:4;34830:11;34860:16;-1:-1:-1;;;;;34966:2:1;34959:4;34951:6;34947:17;34944:25;34939:2;34931:6;34928:14;34925:45;34922:58;;;34973:5;;;;;34597:671;:::o;34922:58::-;35010:6;35004:4;35000:17;34989:28;;35046:3;35040:10;35073:2;35065:6;35062:14;35059:27;;;35079:5;;;;;;34597:671;:::o;35059:27::-;35163:2;35144:16;35138:4;35134:27;35130:36;35123:4;35114:6;35109:3;35105:16;35101:27;35098:69;35095:82;;;35170:5;;;;;;34597:671;:::o;35095:82::-;35186:57;35237:4;35228:6;35220;35216:19;35212:30;35206:4;35186:57;:::i;:::-;-1:-1:-1;35259:3:1;;34597:671;-1:-1:-1;;;;;34597:671:1:o;35694:404::-;35896:2;35878:21;;;35935:2;35915:18;;;35908:30;35974:34;35969:2;35954:18;;35947:62;-1:-1:-1;;;36040:2:1;36025:18;;36018:38;36088:3;36073:19;;35694:404::o;36447:588::-;-1:-1:-1;;;;;36754:15:1;;;36736:34;;36806:15;;36801:2;36786:18;;36779:43;36853:2;36838:18;;36831:34;;;36896:2;36881:18;;36874:34;;;36716:3;36939;36924:19;;36917:32;;;36679:4;;36966:63;;37009:19;;37001:6;36993;36966:63;:::i;:::-;36958:71;36447:588;-1:-1:-1;;;;;;;;36447:588:1:o

Swarm Source

ipfs://1d9fbe26287866c52ee9aab93432f3000137878b2d49faab5ce386da0541d869

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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