Token EverRise Mementos

 

Overview ERC-1155

Total Supply:
151 memeRISE

Holders:
85 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
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

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
Loading