ETH Price: $3,193.41 (+1.18%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction and > 10 Token Transfers found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
150615262022-07-02 6:41:19943 days ago1656744079  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VestingPool

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 2 : VestingPool.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.8.0 <0.9.0;
import "./vendor/@openzeppelin/contracts/token/ERC20/IERC20.sol";

/// @title Vesting contract for multiple accounts
/// @author Richard Meissner - @rmeissner
contract VestingPool {
    event AddedVesting(bytes32 indexed id, address indexed account);
    event ClaimedVesting(bytes32 indexed id, address indexed account, address indexed beneficiary);
    event PausedVesting(bytes32 indexed id);
    event UnpausedVesting(bytes32 indexed id);
    event CancelledVesting(bytes32 indexed id);

    // Sane limits based on: https://eips.ethereum.org/EIPS/eip-1985
    // amountClaimed should always be equal to or less than amount
    // pausingDate should always be equal to or greater than startDate
    struct Vesting {
        // First storage slot
        address account; // 20 bytes
        uint8 curveType; // 1 byte -> Max 256 different curve types
        bool managed; // 1 byte
        uint16 durationWeeks; // 2 bytes -> Max 65536 weeks ~ 1260 years
        uint64 startDate; // 8 bytes -> Works until year 292278994, but not before 1970
        // Second storage slot
        uint128 amount; // 16 bytes -> Max 3.4e20 tokens (including decimals)
        uint128 amountClaimed; // 16 bytes -> Max 3.4e20 tokens (including decimals)
        // Third storage slot
        uint64 pausingDate; // 8 bytes -> Works until year 292278994, but not before 1970
        bool cancelled; // 1 byte
    }

    // keccak256(
    //     "EIP712Domain(uint256 chainId,address verifyingContract)"
    // );
    bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;

    // keccak256(
    //     "Vesting(address account,uint8 curveType,bool managed,uint16 durationWeeks,uint64 startDate,uint128 amount)"
    // );
    bytes32 private constant VESTING_TYPEHASH = 0x43838b5ce9ca440d1ac21b07179a1fdd88aa2175e5ea103f6e37aa6d18ce78ad;

    address public immutable token;
    address public immutable poolManager;

    uint256 public totalTokensInVesting;
    mapping(bytes32 => Vesting) public vestings;

    modifier onlyPoolManager() {
        require(msg.sender == poolManager, "Can only be called by pool manager");
        _;
    }

    constructor(address _token, address _poolManager) {
        token = _token;
        poolManager = _poolManager;
    }

    /// @notice Create a vesting on this pool for `account`.
    /// @dev This can only be called by the pool manager
    /// @dev It is required that the pool has enough tokens available
    /// @param account The account for which the vesting is created
    /// @param curveType Type of the curve that should be used for the vesting
    /// @param managed Boolean that indicates if the vesting can be managed by the pool manager
    /// @param durationWeeks The duration of the vesting in weeks
    /// @param startDate The date when the vesting should be started (can be in the past)
    /// @param amount Amount of tokens that should be vested in atoms
    function addVesting(
        address account,
        uint8 curveType,
        bool managed,
        uint16 durationWeeks,
        uint64 startDate,
        uint128 amount
    ) public virtual onlyPoolManager {
        _addVesting(account, curveType, managed, durationWeeks, startDate, amount);
    }

    /// @notice Calculate the amount of tokens available for new vestings.
    /// @dev This value changes when more tokens are deposited to this contract
    /// @return Amount of tokens that can be used for new vestings.
    function tokensAvailableForVesting() public view virtual returns (uint256) {
        return IERC20(token).balanceOf(address(this)) - totalTokensInVesting;
    }

    /// @notice Create a vesting on this pool for `account`.
    /// @dev It is required that the pool has enough tokens available
    /// @dev Account cannot be zero address
    /// @param account The account for which the vesting is created
    /// @param curveType Type of the curve that should be used for the vesting
    /// @param managed Boolean that indicates if the vesting can be managed by the pool manager
    /// @param durationWeeks The duration of the vesting in weeks
    /// @param startDate The date when the vesting should be started (can be in the past)
    /// @param amount Amount of tokens that should be vested in atoms
    /// @param vestingId The id of the created vesting
    function _addVesting(
        address account,
        uint8 curveType,
        bool managed,
        uint16 durationWeeks,
        uint64 startDate,
        uint128 amount
    ) internal returns (bytes32 vestingId) {
        require(account != address(0), "Invalid account");
        require(curveType < 2, "Invalid vesting curve");
        vestingId = vestingHash(account, curveType, managed, durationWeeks, startDate, amount);
        require(vestings[vestingId].account == address(0), "Vesting id already used");
        // Check that enough tokens are available for the new vesting
        uint256 availableTokens = tokensAvailableForVesting();
        require(availableTokens >= amount, "Not enough tokens available");
        // Mark tokens for this vesting in use
        totalTokensInVesting += amount;
        vestings[vestingId] = Vesting({
            account: account,
            curveType: curveType,
            managed: managed,
            durationWeeks: durationWeeks,
            startDate: startDate,
            amount: amount,
            amountClaimed: 0,
            pausingDate: 0,
            cancelled: false
        });
        emit AddedVesting(vestingId, account);
    }

    /// @notice Claim `tokensToClaim` tokens from vesting `vestingId` and transfer them to the `beneficiary`.
    /// @dev This can only be called by the owner of the vesting
    /// @dev Beneficiary cannot be the 0-address
    /// @dev This will trigger a transfer of tokens
    /// @param vestingId Id of the vesting from which the tokens should be claimed
    /// @param beneficiary Account that should receive the claimed tokens
    /// @param tokensToClaim Amount of tokens to claim in atoms or max uint128 to claim all available
    function claimVestedTokens(
        bytes32 vestingId,
        address beneficiary,
        uint128 tokensToClaim
    ) public {
        uint128 tokensClaimed = updateClaimedTokens(vestingId, beneficiary, tokensToClaim);
        require(IERC20(token).transfer(beneficiary, tokensClaimed), "Token transfer failed");
    }

    /// @notice Update `amountClaimed` on vesting `vestingId` by `tokensToClaim` tokens.
    /// @dev This can only be called by the owner of the vesting
    /// @dev Beneficiary cannot be the 0-address
    /// @dev This will only update the internal state and NOT trigger the transfer of tokens.
    /// @param vestingId Id of the vesting from which the tokens should be claimed
    /// @param beneficiary Account that should receive the claimed tokens
    /// @param tokensToClaim Amount of tokens to claim in atoms or max uint128 to claim all available
    /// @param tokensClaimed Amount of tokens that have been newly claimed by calling this method
    function updateClaimedTokens(
        bytes32 vestingId,
        address beneficiary,
        uint128 tokensToClaim
    ) internal returns (uint128 tokensClaimed) {
        require(beneficiary != address(0), "Cannot claim to 0-address");
        Vesting storage vesting = vestings[vestingId];
        require(vesting.account == msg.sender, "Can only be claimed by vesting owner");
        // Calculate how many tokens can be claimed
        uint128 availableClaim = _calculateVestedAmount(vesting) - vesting.amountClaimed;
        // If max uint128 is used, claim all available tokens.
        tokensClaimed = tokensToClaim == type(uint128).max ? availableClaim : tokensToClaim;
        require(tokensClaimed <= availableClaim, "Trying to claim too many tokens");
        // Adjust how many tokens are locked in vesting
        totalTokensInVesting -= tokensClaimed;
        vesting.amountClaimed += tokensClaimed;
        emit ClaimedVesting(vestingId, vesting.account, beneficiary);
    }

    /// @notice Cancel vesting `vestingId`.
    /// @dev This can only be called by the pool manager
    /// @dev Only manageable vestings can be cancelled
    /// @param vestingId Id of the vesting that should be cancelled
    function cancelVesting(bytes32 vestingId) public onlyPoolManager {
        Vesting storage vesting = vestings[vestingId];
        require(vesting.account != address(0), "Vesting not found");
        require(vesting.managed, "Only managed vestings can be cancelled");
        require(!vesting.cancelled, "Vesting already cancelled");
        bool isFutureVesting = block.timestamp <= vesting.startDate;
        // If vesting is not already paused it will be paused
        // Pausing date should not be reset else tokens of the initial pause can be claimed
        if (vesting.pausingDate == 0) {
            // pausingDate should always be larger or equal to startDate
            vesting.pausingDate = isFutureVesting ? vesting.startDate : uint64(block.timestamp);
        }
        // Vesting is cancelled, therefore tokens that are not vested yet, will be added back to the pool
        uint128 unusedToken = isFutureVesting ? vesting.amount : vesting.amount - _calculateVestedAmount(vesting);
        totalTokensInVesting -= unusedToken;
        // Vesting is set to cancelled and therefore disallows unpausing
        vesting.cancelled = true;
        emit CancelledVesting(vestingId);
    }

    /// @notice Pause vesting `vestingId`.
    /// @dev This can only be called by the pool manager
    /// @dev Only manageable vestings can be paused
    /// @param vestingId Id of the vesting that should be paused
    function pauseVesting(bytes32 vestingId) public onlyPoolManager {
        Vesting storage vesting = vestings[vestingId];
        require(vesting.account != address(0), "Vesting not found");
        require(vesting.managed, "Only managed vestings can be paused");
        require(vesting.pausingDate == 0, "Vesting already paused");
        // pausingDate should always be larger or equal to startDate
        vesting.pausingDate = block.timestamp <= vesting.startDate ? vesting.startDate : uint64(block.timestamp);
        emit PausedVesting(vestingId);
    }

    /// @notice Unpause vesting `vestingId`.
    /// @dev This can only be called by the pool manager
    /// @dev Only vestings that have not been cancelled can be unpaused
    /// @param vestingId Id of the vesting that should be unpaused
    function unpauseVesting(bytes32 vestingId) public onlyPoolManager {
        Vesting storage vesting = vestings[vestingId];
        require(vesting.account != address(0), "Vesting not found");
        require(vesting.pausingDate != 0, "Vesting is not paused");
        require(!vesting.cancelled, "Vesting has been cancelled and cannot be unpaused");
        // Calculate the time the vesting was paused
        // If vesting has not started yet, then pausing date might be in the future
        uint64 timePaused = block.timestamp <= vesting.pausingDate ? 0 : uint64(block.timestamp) - vesting.pausingDate;
        // Offset the start date to create the effect of pausing
        vesting.startDate = vesting.startDate + timePaused;
        vesting.pausingDate = 0;
        emit UnpausedVesting(vestingId);
    }

    /// @notice Calculate vested and claimed token amounts for vesting `vestingId`.
    /// @dev This will revert if the vesting has not been started yet
    /// @param vestingId Id of the vesting for which to calculate the amounts
    /// @return vestedAmount The amount in atoms of tokens vested
    /// @return claimedAmount The amount in atoms of tokens claimed
    function calculateVestedAmount(bytes32 vestingId) external view returns (uint128 vestedAmount, uint128 claimedAmount) {
        Vesting storage vesting = vestings[vestingId];
        require(vesting.account != address(0), "Vesting not found");
        vestedAmount = _calculateVestedAmount(vesting);
        claimedAmount = vesting.amountClaimed;
    }

    /// @notice Calculate vested token amount for vesting `vesting`.
    /// @dev This will revert if the vesting has not been started yet
    /// @param vesting The vesting for which to calculate the amounts
    /// @return vestedAmount The amount in atoms of tokens vested
    function _calculateVestedAmount(Vesting storage vesting) internal view returns (uint128 vestedAmount) {
        require(vesting.startDate <= block.timestamp, "Vesting not active yet");
        // Convert vesting duration to seconds
        uint64 durationSeconds = uint64(vesting.durationWeeks) * 7 * 24 * 60 * 60;
        // If contract is paused use the pausing date to calculate amount
        uint64 vestedSeconds = vesting.pausingDate > 0
            ? vesting.pausingDate - vesting.startDate
            : uint64(block.timestamp) - vesting.startDate;
        if (vestedSeconds >= durationSeconds) {
            // If vesting time is longer than duration everything has been vested
            vestedAmount = vesting.amount;
        } else if (vesting.curveType == 0) {
            // Linear vesting
            vestedAmount = calculateLinear(vesting.amount, vestedSeconds, durationSeconds);
        } else if (vesting.curveType == 1) {
            // Exponential vesting
            vestedAmount = calculateExponential(vesting.amount, vestedSeconds, durationSeconds);
        } else {
            // This is unreachable because it is not possible to add a vesting with an invalid curve type
            revert("Invalid curve type");
        }
    }

    /// @notice Calculate vested token amount on a linear curve.
    /// @dev Calculate vested amount on linear curve: targetAmount * elapsedTime / totalTime
    /// @param targetAmount Amount of tokens that is being vested
    /// @param elapsedTime Time that has elapsed for the vesting
    /// @param totalTime Duration of the vesting
    /// @return Tokens that have been vested on a linear curve
    function calculateLinear(
        uint128 targetAmount,
        uint64 elapsedTime,
        uint64 totalTime
    ) internal pure returns (uint128) {
        // Calculate vested amount on linear curve: targetAmount * elapsedTime / totalTime
        uint256 amount = (uint256(targetAmount) * uint256(elapsedTime)) / uint256(totalTime);
        require(amount <= type(uint128).max, "Overflow in curve calculation");
        return uint128(amount);
    }

    /// @notice Calculate vested token amount on an exponential curve.
    /// @dev Calculate vested amount on exponential curve: targetAmount * elapsedTime^2 / totalTime^2
    /// @param targetAmount Amount of tokens that is being vested
    /// @param elapsedTime Time that has elapsed for the vesting
    /// @param totalTime Duration of the vesting
    /// @return Tokens that have been vested on an exponential curve
    function calculateExponential(
        uint128 targetAmount,
        uint64 elapsedTime,
        uint64 totalTime
    ) internal pure returns (uint128) {
        // Calculate vested amount on exponential curve: targetAmount * elapsedTime^2 / totalTime^2
        uint256 amount = (uint256(targetAmount) * uint256(elapsedTime) * uint256(elapsedTime)) / (uint256(totalTime) * uint256(totalTime));
        require(amount <= type(uint128).max, "Overflow in curve calculation");
        return uint128(amount);
    }

    /// @notice Calculate the id for a vesting based on its parameters.
    /// @dev The id is a EIP-712 based hash of the vesting.
    /// @param account The account for which the vesting was created
    /// @param curveType Type of the curve that is used for the vesting
    /// @param managed Indicator if the vesting is managed by the pool manager
    /// @param durationWeeks The duration of the vesting in weeks
    /// @param startDate The date when the vesting started (can be in the future)
    /// @param amount Amount of tokens that are vested in atoms
    /// @return vestingId Id of a vesting based on its parameters
    function vestingHash(
        address account,
        uint8 curveType,
        bool managed,
        uint16 durationWeeks,
        uint64 startDate,
        uint128 amount
    ) public view returns (bytes32 vestingId) {
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, block.chainid, this));
        bytes32 vestingDataHash = keccak256(abi.encode(VESTING_TYPEHASH, account, curveType, managed, durationWeeks, startDate, amount));
        vestingId = keccak256(abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator, vestingDataHash));
    }
}

File 2 of 2 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_poolManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"CancelledVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"}],"name":"ClaimedVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"PausedVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"UnpausedVesting","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"curveType","type":"uint8"},{"internalType":"bool","name":"managed","type":"bool"},{"internalType":"uint16","name":"durationWeeks","type":"uint16"},{"internalType":"uint64","name":"startDate","type":"uint64"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"addVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"name":"calculateVestedAmount","outputs":[{"internalType":"uint128","name":"vestedAmount","type":"uint128"},{"internalType":"uint128","name":"claimedAmount","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"name":"cancelVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint128","name":"tokensToClaim","type":"uint128"}],"name":"claimVestedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"name":"pauseVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"poolManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensAvailableForVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensInVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"name":"unpauseVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"curveType","type":"uint8"},{"internalType":"bool","name":"managed","type":"bool"},{"internalType":"uint16","name":"durationWeeks","type":"uint16"},{"internalType":"uint64","name":"startDate","type":"uint64"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"vestingHash","outputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"vestings","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"curveType","type":"uint8"},{"internalType":"bool","name":"managed","type":"bool"},{"internalType":"uint16","name":"durationWeeks","type":"uint16"},{"internalType":"uint64","name":"startDate","type":"uint64"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint128","name":"amountClaimed","type":"uint128"},{"internalType":"uint64","name":"pausingDate","type":"uint64"},{"internalType":"bool","name":"cancelled","type":"bool"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b506040516200308d3803806200308d833981810160405281019062000037919062000111565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050505062000158565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000d982620000ac565b9050919050565b620000eb81620000cc565b8114620000f757600080fd5b50565b6000815190506200010b81620000e0565b92915050565b600080604083850312156200012b576200012a620000a7565b5b60006200013b85828601620000fa565b92505060206200014e85828601620000fa565b9150509250929050565b60805160a051612ee5620001a8600039600081816103500152818161069101528181610a7801528181610b1d015261106101526000818161026d015281816105e801526110850152612ee56000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80636cbab079116100715780636cbab079146101795780638f5b3c3b146101955780639fb0c41d146101b1578063d7faa145146101e9578063dc4c90d31461021a578063fc0c546a14610238576100b4565b806307380481146100b9578063166bbd3b146100d75780632bafa73c146100f35780632e0427aa1461010f5780633034d5341461012d5780635d76df6b14610149575b600080fd5b6100c1610256565b6040516100ce9190611c3c565b60405180910390f35b6100f160048036038101906100ec9190611d38565b61025c565b005b61010d60048036038101906101089190611d8b565b61034e565b005b6101176105e2565b6040516101249190611c3c565b60405180910390f35b61014760048036038101906101429190611d8b565b61068f565b005b610163600480360381019061015e9190611ea3565b610986565b6040516101709190611f3f565b60405180910390f35b610193600480360381019061018e9190611ea3565b610a76565b005b6101af60048036038101906101aa9190611d8b565b610b1b565b005b6101cb60048036038101906101c69190611d8b565b610e7a565b6040516101e099989796959493929190611fb4565b60405180910390f35b61020360048036038101906101fe9190611d8b565b610f7d565b604051610211929190612041565b60405180910390f35b61022261105f565b60405161022f919061206a565b60405180910390f35b610240611083565b60405161024d919061206a565b60405180910390f35b60005481565b60006102698484846110a7565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016102c69291906120c0565b6020604051808303816000875af11580156102e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030991906120fe565b610348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033f90612188565b60405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d39061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047e90612286565b60405180910390fd5b8060000160159054906101000a900460ff166104d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cf90612318565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161461053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053490612384565b60405180910390fd5b8060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561056d5742610587565b8060000160189054906101000a900467ffffffffffffffff165b8160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550817f871860f90ed272e98149ef133136694f00424a57465aa85bfc2535dfd4d450b860405160405180910390a25050565b600080547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161063f919061206a565b602060405180830381865afa15801561065c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068091906123d0565b61068a919061242c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107149061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf90612286565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141561082e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610825906124ac565b60405180910390fd5b8060020160089054906101000a900460ff1615610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061253e565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff164211156108d5578160020160009054906101000a900467ffffffffffffffff16426108d0919061255e565b6108d8565b60005b9050808260000160189054906101000a900467ffffffffffffffff166108fe9190612592565b8260000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008260020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550827f1bf30dbd59905813e462b38cc5a44f3aadd0ee101ec6d7537139f5c7f8a9868560405160405180910390a2505050565b6000807f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b46306040516020016109c193929190612625565b60405160208183030381529060405280519060200120905060007f43838b5ce9ca440d1ac21b07179a1fdd88aa2175e5ea103f6e37aa6d18ce78ad60001b898989898989604051602001610a1b979695949392919061265c565b604051602081830303815290604052805190602001209050601960f81b600160f81b8383604051602001610a529493929190612739565b60405160208183030381529060405280519060200120925050509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb9061221a565b60405180910390fd5b610b128686868686866113ac565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba09061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b90612286565b60405180910390fd5b8060000160159054906101000a900460ff16610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c906127f9565b60405180910390fd5b8060020160089054906101000a900460ff1615610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90612865565b60405180910390fd5b60008160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115905060008260020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415610d9c5780610d575742610d71565b8160000160189054906101000a900467ffffffffffffffff165b8260020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b600081610ddc57610dac8361184c565b8360010160009054906101000a90046fffffffffffffffffffffffffffffffff16610dd79190612885565b610dfe565b8260010160009054906101000a90046fffffffffffffffffffffffffffffffff165b9050806fffffffffffffffffffffffffffffffff16600080828254610e23919061242c565b9250508190555060018360020160086101000a81548160ff021916908315150217905550837fc27a46a60d5d211f8ef42242a25d5db8357aefb1bd0e7d8fbab00d4c40d4d1c760405160405180910390a250505050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900460ff16908060000160169054906101000a900461ffff16908060000160189054906101000a900467ffffffffffffffff16908060010160009054906101000a90046fffffffffffffffffffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16908060020160009054906101000a900467ffffffffffffffff16908060020160089054906101000a900460ff16905089565b6000806000600160008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290612286565b60405180910390fd5b6110348161184c565b92508060010160109054906101000a90046fffffffffffffffffffffffffffffffff16915050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90612905565b60405180910390fd5b60006001600086815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890612997565b60405180910390fd5b60008160010160109054906101000a90046fffffffffffffffffffffffffffffffff166111ed8361184c565b6111f79190612885565b90506fffffffffffffffffffffffffffffffff8016846fffffffffffffffffffffffffffffffff161461122a578361122c565b805b9250806fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff161115611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90612a03565b60405180910390fd5b826fffffffffffffffffffffffffffffffff166000808282546112b8919061242c565b92505081905550828260010160108282829054906101000a90046fffffffffffffffffffffffffffffffff166112ee9190612a23565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16877f31b718389b1eb92df83ab00c1a5112e5bb8a02c7c1c9c02e1e3c15ad33e0532660405160405180910390a450509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141490612ab5565b60405180910390fd5b60028660ff1610611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90612b21565b60405180910390fd5b611471878787878787610986565b9050600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90612b8d565b60405180910390fd5b60006115226105e2565b9050826fffffffffffffffffffffffffffffffff16811015611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090612bf9565b60405180910390fd5b826fffffffffffffffffffffffffffffffff1660008082825461159c9190612c19565b925050819055506040518061012001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018860ff16815260200187151581526020018661ffff1681526020018567ffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152506001600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff02191690831515021790555060608201518160000160166101000a81548161ffff021916908361ffff16021790555060808201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060e08201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101008201518160020160086101000a81548160ff0219169083151502179055509050508773ffffffffffffffffffffffffffffffffffffffff16827fff2781f5af6cf115d187dd0e4ef590f5d1288b83ef3eb6739c69db99e70c8b4d60405160405180910390a3509695505050505050565b6000428260000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1611156118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90612cbb565b60405180910390fd5b6000603c80601860078660000160169054906101000a900461ffff1661ffff166118dd9190612cdb565b6118e79190612cdb565b6118f19190612cdb565b6118fb9190612cdb565b90506000808460020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611611951578360000160189054906101000a900467ffffffffffffffff164261194c919061255e565b61198e565b8360000160189054906101000a900467ffffffffffffffff168460020160009054906101000a900467ffffffffffffffff1661198d919061255e565b5b90508167ffffffffffffffff168167ffffffffffffffff16106119d3578360010160009054906101000a90046fffffffffffffffffffffffffffffffff169250611aae565b60008460000160149054906101000a900460ff1660ff161415611a2257611a1b8460010160009054906101000a90046fffffffffffffffffffffffffffffffff168284611ab5565b9250611aad565b60018460000160149054906101000a900460ff1660ff161415611a7157611a6a8460010160009054906101000a90046fffffffffffffffffffffffffffffffff168284611b57565b9250611aac565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390612d69565b60405180910390fd5b5b5b5050919050565b6000808267ffffffffffffffff168467ffffffffffffffff16866fffffffffffffffffffffffffffffffff16611aeb9190612d89565b611af59190612e12565b90506fffffffffffffffffffffffffffffffff8016811115611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390612e8f565b60405180910390fd5b809150509392505050565b6000808267ffffffffffffffff168367ffffffffffffffff16611b7a9190612d89565b8467ffffffffffffffff168567ffffffffffffffff16876fffffffffffffffffffffffffffffffff16611bad9190612d89565b611bb79190612d89565b611bc19190612e12565b90506fffffffffffffffffffffffffffffffff8016811115611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90612e8f565b60405180910390fd5b809150509392505050565b6000819050919050565b611c3681611c23565b82525050565b6000602082019050611c516000830184611c2d565b92915050565b600080fd5b6000819050919050565b611c6f81611c5c565b8114611c7a57600080fd5b50565b600081359050611c8c81611c66565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611cbd82611c92565b9050919050565b611ccd81611cb2565b8114611cd857600080fd5b50565b600081359050611cea81611cc4565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611d1581611cf0565b8114611d2057600080fd5b50565b600081359050611d3281611d0c565b92915050565b600080600060608486031215611d5157611d50611c57565b5b6000611d5f86828701611c7d565b9350506020611d7086828701611cdb565b9250506040611d8186828701611d23565b9150509250925092565b600060208284031215611da157611da0611c57565b5b6000611daf84828501611c7d565b91505092915050565b600060ff82169050919050565b611dce81611db8565b8114611dd957600080fd5b50565b600081359050611deb81611dc5565b92915050565b60008115159050919050565b611e0681611df1565b8114611e1157600080fd5b50565b600081359050611e2381611dfd565b92915050565b600061ffff82169050919050565b611e4081611e29565b8114611e4b57600080fd5b50565b600081359050611e5d81611e37565b92915050565b600067ffffffffffffffff82169050919050565b611e8081611e63565b8114611e8b57600080fd5b50565b600081359050611e9d81611e77565b92915050565b60008060008060008060c08789031215611ec057611ebf611c57565b5b6000611ece89828a01611cdb565b9650506020611edf89828a01611ddc565b9550506040611ef089828a01611e14565b9450506060611f0189828a01611e4e565b9350506080611f1289828a01611e8e565b92505060a0611f2389828a01611d23565b9150509295509295509295565b611f3981611c5c565b82525050565b6000602082019050611f546000830184611f30565b92915050565b611f6381611cb2565b82525050565b611f7281611db8565b82525050565b611f8181611df1565b82525050565b611f9081611e29565b82525050565b611f9f81611e63565b82525050565b611fae81611cf0565b82525050565b600061012082019050611fca600083018c611f5a565b611fd7602083018b611f69565b611fe4604083018a611f78565b611ff16060830189611f87565b611ffe6080830188611f96565b61200b60a0830187611fa5565b61201860c0830186611fa5565b61202560e0830185611f96565b612033610100830184611f78565b9a9950505050505050505050565b60006040820190506120566000830185611fa5565b6120636020830184611fa5565b9392505050565b600060208201905061207f6000830184611f5a565b92915050565b6000819050919050565b60006120aa6120a56120a084611cf0565b612085565b611c23565b9050919050565b6120ba8161208f565b82525050565b60006040820190506120d56000830185611f5a565b6120e260208301846120b1565b9392505050565b6000815190506120f881611dfd565b92915050565b60006020828403121561211457612113611c57565b5b6000612122848285016120e9565b91505092915050565b600082825260208201905092915050565b7f546f6b656e207472616e73666572206661696c65640000000000000000000000600082015250565b600061217260158361212b565b915061217d8261213c565b602082019050919050565b600060208201905081810360008301526121a181612165565b9050919050565b7f43616e206f6e6c792062652063616c6c656420627920706f6f6c206d616e616760008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061220460228361212b565b915061220f826121a8565b604082019050919050565b60006020820190508181036000830152612233816121f7565b9050919050565b7f56657374696e67206e6f7420666f756e64000000000000000000000000000000600082015250565b600061227060118361212b565b915061227b8261223a565b602082019050919050565b6000602082019050818103600083015261229f81612263565b9050919050565b7f4f6e6c79206d616e616765642076657374696e67732063616e2062652070617560008201527f7365640000000000000000000000000000000000000000000000000000000000602082015250565b600061230260238361212b565b915061230d826122a6565b604082019050919050565b60006020820190508181036000830152612331816122f5565b9050919050565b7f56657374696e6720616c72656164792070617573656400000000000000000000600082015250565b600061236e60168361212b565b915061237982612338565b602082019050919050565b6000602082019050818103600083015261239d81612361565b9050919050565b6123ad81611c23565b81146123b857600080fd5b50565b6000815190506123ca816123a4565b92915050565b6000602082840312156123e6576123e5611c57565b5b60006123f4848285016123bb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061243782611c23565b915061244283611c23565b925082821015612455576124546123fd565b5b828203905092915050565b7f56657374696e67206973206e6f74207061757365640000000000000000000000600082015250565b600061249660158361212b565b91506124a182612460565b602082019050919050565b600060208201905081810360008301526124c581612489565b9050919050565b7f56657374696e6720686173206265656e2063616e63656c6c656420616e64206360008201527f616e6e6f7420626520756e706175736564000000000000000000000000000000602082015250565b600061252860318361212b565b9150612533826124cc565b604082019050919050565b600060208201905081810360008301526125578161251b565b9050919050565b600061256982611e63565b915061257483611e63565b925082821015612587576125866123fd565b5b828203905092915050565b600061259d82611e63565b91506125a883611e63565b92508267ffffffffffffffff038211156125c5576125c46123fd565b5b828201905092915050565b60006125eb6125e66125e184611c92565b612085565b611c92565b9050919050565b60006125fd826125d0565b9050919050565b600061260f826125f2565b9050919050565b61261f81612604565b82525050565b600060608201905061263a6000830186611f30565b6126476020830185611c2d565b6126546040830184612616565b949350505050565b600060e082019050612671600083018a611f30565b61267e6020830189611f5a565b61268b6040830188611f69565b6126986060830187611f78565b6126a56080830186611f87565b6126b260a0830185611f96565b6126bf60c0830184611fa5565b98975050505050505050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b61271261270d826126cb565b6126f7565b82525050565b6000819050919050565b61273361272e82611c5c565b612718565b82525050565b60006127458287612701565b6001820191506127558286612701565b6001820191506127658285612722565b6020820191506127758284612722565b60208201915081905095945050505050565b7f4f6e6c79206d616e616765642076657374696e67732063616e2062652063616e60008201527f63656c6c65640000000000000000000000000000000000000000000000000000602082015250565b60006127e360268361212b565b91506127ee82612787565b604082019050919050565b60006020820190508181036000830152612812816127d6565b9050919050565b7f56657374696e6720616c72656164792063616e63656c6c656400000000000000600082015250565b600061284f60198361212b565b915061285a82612819565b602082019050919050565b6000602082019050818103600083015261287e81612842565b9050919050565b600061289082611cf0565b915061289b83611cf0565b9250828210156128ae576128ad6123fd565b5b828203905092915050565b7f43616e6e6f7420636c61696d20746f20302d6164647265737300000000000000600082015250565b60006128ef60198361212b565b91506128fa826128b9565b602082019050919050565b6000602082019050818103600083015261291e816128e2565b9050919050565b7f43616e206f6e6c7920626520636c61696d65642062792076657374696e67206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b600061298160248361212b565b915061298c82612925565b604082019050919050565b600060208201905081810360008301526129b081612974565b9050919050565b7f547279696e6720746f20636c61696d20746f6f206d616e7920746f6b656e7300600082015250565b60006129ed601f8361212b565b91506129f8826129b7565b602082019050919050565b60006020820190508181036000830152612a1c816129e0565b9050919050565b6000612a2e82611cf0565b9150612a3983611cf0565b9250826fffffffffffffffffffffffffffffffff03821115612a5e57612a5d6123fd565b5b828201905092915050565b7f496e76616c6964206163636f756e740000000000000000000000000000000000600082015250565b6000612a9f600f8361212b565b9150612aaa82612a69565b602082019050919050565b60006020820190508181036000830152612ace81612a92565b9050919050565b7f496e76616c69642076657374696e672063757276650000000000000000000000600082015250565b6000612b0b60158361212b565b9150612b1682612ad5565b602082019050919050565b60006020820190508181036000830152612b3a81612afe565b9050919050565b7f56657374696e6720696420616c72656164792075736564000000000000000000600082015250565b6000612b7760178361212b565b9150612b8282612b41565b602082019050919050565b60006020820190508181036000830152612ba681612b6a565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320617661696c61626c650000000000600082015250565b6000612be3601b8361212b565b9150612bee82612bad565b602082019050919050565b60006020820190508181036000830152612c1281612bd6565b9050919050565b6000612c2482611c23565b9150612c2f83611c23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c6457612c636123fd565b5b828201905092915050565b7f56657374696e67206e6f74206163746976652079657400000000000000000000600082015250565b6000612ca560168361212b565b9150612cb082612c6f565b602082019050919050565b60006020820190508181036000830152612cd481612c98565b9050919050565b6000612ce682611e63565b9150612cf183611e63565b92508167ffffffffffffffff0483118215151615612d1257612d116123fd565b5b828202905092915050565b7f496e76616c696420637572766520747970650000000000000000000000000000600082015250565b6000612d5360128361212b565b9150612d5e82612d1d565b602082019050919050565b60006020820190508181036000830152612d8281612d46565b9050919050565b6000612d9482611c23565b9150612d9f83611c23565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dd857612dd76123fd565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e1d82611c23565b9150612e2883611c23565b925082612e3857612e37612de3565b5b828204905092915050565b7f4f766572666c6f7720696e2063757276652063616c63756c6174696f6e000000600082015250565b6000612e79601d8361212b565b9150612e8482612e43565b602082019050919050565b60006020820190508181036000830152612ea881612e6c565b905091905056fea2646970667358221220afcb98a54ef70fbec64c6247556dd6770edab2f5863e5fa28430ef0a779afbfd64736f6c634300080b00330000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d1

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80636cbab079116100715780636cbab079146101795780638f5b3c3b146101955780639fb0c41d146101b1578063d7faa145146101e9578063dc4c90d31461021a578063fc0c546a14610238576100b4565b806307380481146100b9578063166bbd3b146100d75780632bafa73c146100f35780632e0427aa1461010f5780633034d5341461012d5780635d76df6b14610149575b600080fd5b6100c1610256565b6040516100ce9190611c3c565b60405180910390f35b6100f160048036038101906100ec9190611d38565b61025c565b005b61010d60048036038101906101089190611d8b565b61034e565b005b6101176105e2565b6040516101249190611c3c565b60405180910390f35b61014760048036038101906101429190611d8b565b61068f565b005b610163600480360381019061015e9190611ea3565b610986565b6040516101709190611f3f565b60405180910390f35b610193600480360381019061018e9190611ea3565b610a76565b005b6101af60048036038101906101aa9190611d8b565b610b1b565b005b6101cb60048036038101906101c69190611d8b565b610e7a565b6040516101e099989796959493929190611fb4565b60405180910390f35b61020360048036038101906101fe9190611d8b565b610f7d565b604051610211929190612041565b60405180910390f35b61022261105f565b60405161022f919061206a565b60405180910390f35b610240611083565b60405161024d919061206a565b60405180910390f35b60005481565b60006102698484846110a7565b90507f0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016102c69291906120c0565b6020604051808303816000875af11580156102e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030991906120fe565b610348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033f90612188565b60405180910390fd5b50505050565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d39061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047e90612286565b60405180910390fd5b8060000160159054906101000a900460ff166104d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cf90612318565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161461053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053490612384565b60405180910390fd5b8060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561056d5742610587565b8060000160189054906101000a900467ffffffffffffffff165b8160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550817f871860f90ed272e98149ef133136694f00424a57465aa85bfc2535dfd4d450b860405160405180910390a25050565b600080547f0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161063f919061206a565b602060405180830381865afa15801561065c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068091906123d0565b61068a919061242c565b905090565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107149061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf90612286565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141561082e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610825906124ac565b60405180910390fd5b8060020160089054906101000a900460ff1615610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061253e565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff164211156108d5578160020160009054906101000a900467ffffffffffffffff16426108d0919061255e565b6108d8565b60005b9050808260000160189054906101000a900467ffffffffffffffff166108fe9190612592565b8260000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008260020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550827f1bf30dbd59905813e462b38cc5a44f3aadd0ee101ec6d7537139f5c7f8a9868560405160405180910390a2505050565b6000807f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b46306040516020016109c193929190612625565b60405160208183030381529060405280519060200120905060007f43838b5ce9ca440d1ac21b07179a1fdd88aa2175e5ea103f6e37aa6d18ce78ad60001b898989898989604051602001610a1b979695949392919061265c565b604051602081830303815290604052805190602001209050601960f81b600160f81b8383604051602001610a529493929190612739565b60405160208183030381529060405280519060200120925050509695505050505050565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb9061221a565b60405180910390fd5b610b128686868686866113ac565b50505050505050565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba09061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b90612286565b60405180910390fd5b8060000160159054906101000a900460ff16610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c906127f9565b60405180910390fd5b8060020160089054906101000a900460ff1615610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90612865565b60405180910390fd5b60008160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115905060008260020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415610d9c5780610d575742610d71565b8160000160189054906101000a900467ffffffffffffffff165b8260020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b600081610ddc57610dac8361184c565b8360010160009054906101000a90046fffffffffffffffffffffffffffffffff16610dd79190612885565b610dfe565b8260010160009054906101000a90046fffffffffffffffffffffffffffffffff165b9050806fffffffffffffffffffffffffffffffff16600080828254610e23919061242c565b9250508190555060018360020160086101000a81548160ff021916908315150217905550837fc27a46a60d5d211f8ef42242a25d5db8357aefb1bd0e7d8fbab00d4c40d4d1c760405160405180910390a250505050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900460ff16908060000160169054906101000a900461ffff16908060000160189054906101000a900467ffffffffffffffff16908060010160009054906101000a90046fffffffffffffffffffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16908060020160009054906101000a900467ffffffffffffffff16908060020160089054906101000a900460ff16905089565b6000806000600160008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290612286565b60405180910390fd5b6110348161184c565b92508060010160109054906101000a90046fffffffffffffffffffffffffffffffff16915050915091565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d181565b7f0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee81565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90612905565b60405180910390fd5b60006001600086815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890612997565b60405180910390fd5b60008160010160109054906101000a90046fffffffffffffffffffffffffffffffff166111ed8361184c565b6111f79190612885565b90506fffffffffffffffffffffffffffffffff8016846fffffffffffffffffffffffffffffffff161461122a578361122c565b805b9250806fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff161115611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90612a03565b60405180910390fd5b826fffffffffffffffffffffffffffffffff166000808282546112b8919061242c565b92505081905550828260010160108282829054906101000a90046fffffffffffffffffffffffffffffffff166112ee9190612a23565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16877f31b718389b1eb92df83ab00c1a5112e5bb8a02c7c1c9c02e1e3c15ad33e0532660405160405180910390a450509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141490612ab5565b60405180910390fd5b60028660ff1610611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90612b21565b60405180910390fd5b611471878787878787610986565b9050600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90612b8d565b60405180910390fd5b60006115226105e2565b9050826fffffffffffffffffffffffffffffffff16811015611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090612bf9565b60405180910390fd5b826fffffffffffffffffffffffffffffffff1660008082825461159c9190612c19565b925050819055506040518061012001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018860ff16815260200187151581526020018661ffff1681526020018567ffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152506001600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff02191690831515021790555060608201518160000160166101000a81548161ffff021916908361ffff16021790555060808201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060e08201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101008201518160020160086101000a81548160ff0219169083151502179055509050508773ffffffffffffffffffffffffffffffffffffffff16827fff2781f5af6cf115d187dd0e4ef590f5d1288b83ef3eb6739c69db99e70c8b4d60405160405180910390a3509695505050505050565b6000428260000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1611156118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90612cbb565b60405180910390fd5b6000603c80601860078660000160169054906101000a900461ffff1661ffff166118dd9190612cdb565b6118e79190612cdb565b6118f19190612cdb565b6118fb9190612cdb565b90506000808460020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611611951578360000160189054906101000a900467ffffffffffffffff164261194c919061255e565b61198e565b8360000160189054906101000a900467ffffffffffffffff168460020160009054906101000a900467ffffffffffffffff1661198d919061255e565b5b90508167ffffffffffffffff168167ffffffffffffffff16106119d3578360010160009054906101000a90046fffffffffffffffffffffffffffffffff169250611aae565b60008460000160149054906101000a900460ff1660ff161415611a2257611a1b8460010160009054906101000a90046fffffffffffffffffffffffffffffffff168284611ab5565b9250611aad565b60018460000160149054906101000a900460ff1660ff161415611a7157611a6a8460010160009054906101000a90046fffffffffffffffffffffffffffffffff168284611b57565b9250611aac565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390612d69565b60405180910390fd5b5b5b5050919050565b6000808267ffffffffffffffff168467ffffffffffffffff16866fffffffffffffffffffffffffffffffff16611aeb9190612d89565b611af59190612e12565b90506fffffffffffffffffffffffffffffffff8016811115611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390612e8f565b60405180910390fd5b809150509392505050565b6000808267ffffffffffffffff168367ffffffffffffffff16611b7a9190612d89565b8467ffffffffffffffff168567ffffffffffffffff16876fffffffffffffffffffffffffffffffff16611bad9190612d89565b611bb79190612d89565b611bc19190612e12565b90506fffffffffffffffffffffffffffffffff8016811115611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90612e8f565b60405180910390fd5b809150509392505050565b6000819050919050565b611c3681611c23565b82525050565b6000602082019050611c516000830184611c2d565b92915050565b600080fd5b6000819050919050565b611c6f81611c5c565b8114611c7a57600080fd5b50565b600081359050611c8c81611c66565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611cbd82611c92565b9050919050565b611ccd81611cb2565b8114611cd857600080fd5b50565b600081359050611cea81611cc4565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611d1581611cf0565b8114611d2057600080fd5b50565b600081359050611d3281611d0c565b92915050565b600080600060608486031215611d5157611d50611c57565b5b6000611d5f86828701611c7d565b9350506020611d7086828701611cdb565b9250506040611d8186828701611d23565b9150509250925092565b600060208284031215611da157611da0611c57565b5b6000611daf84828501611c7d565b91505092915050565b600060ff82169050919050565b611dce81611db8565b8114611dd957600080fd5b50565b600081359050611deb81611dc5565b92915050565b60008115159050919050565b611e0681611df1565b8114611e1157600080fd5b50565b600081359050611e2381611dfd565b92915050565b600061ffff82169050919050565b611e4081611e29565b8114611e4b57600080fd5b50565b600081359050611e5d81611e37565b92915050565b600067ffffffffffffffff82169050919050565b611e8081611e63565b8114611e8b57600080fd5b50565b600081359050611e9d81611e77565b92915050565b60008060008060008060c08789031215611ec057611ebf611c57565b5b6000611ece89828a01611cdb565b9650506020611edf89828a01611ddc565b9550506040611ef089828a01611e14565b9450506060611f0189828a01611e4e565b9350506080611f1289828a01611e8e565b92505060a0611f2389828a01611d23565b9150509295509295509295565b611f3981611c5c565b82525050565b6000602082019050611f546000830184611f30565b92915050565b611f6381611cb2565b82525050565b611f7281611db8565b82525050565b611f8181611df1565b82525050565b611f9081611e29565b82525050565b611f9f81611e63565b82525050565b611fae81611cf0565b82525050565b600061012082019050611fca600083018c611f5a565b611fd7602083018b611f69565b611fe4604083018a611f78565b611ff16060830189611f87565b611ffe6080830188611f96565b61200b60a0830187611fa5565b61201860c0830186611fa5565b61202560e0830185611f96565b612033610100830184611f78565b9a9950505050505050505050565b60006040820190506120566000830185611fa5565b6120636020830184611fa5565b9392505050565b600060208201905061207f6000830184611f5a565b92915050565b6000819050919050565b60006120aa6120a56120a084611cf0565b612085565b611c23565b9050919050565b6120ba8161208f565b82525050565b60006040820190506120d56000830185611f5a565b6120e260208301846120b1565b9392505050565b6000815190506120f881611dfd565b92915050565b60006020828403121561211457612113611c57565b5b6000612122848285016120e9565b91505092915050565b600082825260208201905092915050565b7f546f6b656e207472616e73666572206661696c65640000000000000000000000600082015250565b600061217260158361212b565b915061217d8261213c565b602082019050919050565b600060208201905081810360008301526121a181612165565b9050919050565b7f43616e206f6e6c792062652063616c6c656420627920706f6f6c206d616e616760008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061220460228361212b565b915061220f826121a8565b604082019050919050565b60006020820190508181036000830152612233816121f7565b9050919050565b7f56657374696e67206e6f7420666f756e64000000000000000000000000000000600082015250565b600061227060118361212b565b915061227b8261223a565b602082019050919050565b6000602082019050818103600083015261229f81612263565b9050919050565b7f4f6e6c79206d616e616765642076657374696e67732063616e2062652070617560008201527f7365640000000000000000000000000000000000000000000000000000000000602082015250565b600061230260238361212b565b915061230d826122a6565b604082019050919050565b60006020820190508181036000830152612331816122f5565b9050919050565b7f56657374696e6720616c72656164792070617573656400000000000000000000600082015250565b600061236e60168361212b565b915061237982612338565b602082019050919050565b6000602082019050818103600083015261239d81612361565b9050919050565b6123ad81611c23565b81146123b857600080fd5b50565b6000815190506123ca816123a4565b92915050565b6000602082840312156123e6576123e5611c57565b5b60006123f4848285016123bb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061243782611c23565b915061244283611c23565b925082821015612455576124546123fd565b5b828203905092915050565b7f56657374696e67206973206e6f74207061757365640000000000000000000000600082015250565b600061249660158361212b565b91506124a182612460565b602082019050919050565b600060208201905081810360008301526124c581612489565b9050919050565b7f56657374696e6720686173206265656e2063616e63656c6c656420616e64206360008201527f616e6e6f7420626520756e706175736564000000000000000000000000000000602082015250565b600061252860318361212b565b9150612533826124cc565b604082019050919050565b600060208201905081810360008301526125578161251b565b9050919050565b600061256982611e63565b915061257483611e63565b925082821015612587576125866123fd565b5b828203905092915050565b600061259d82611e63565b91506125a883611e63565b92508267ffffffffffffffff038211156125c5576125c46123fd565b5b828201905092915050565b60006125eb6125e66125e184611c92565b612085565b611c92565b9050919050565b60006125fd826125d0565b9050919050565b600061260f826125f2565b9050919050565b61261f81612604565b82525050565b600060608201905061263a6000830186611f30565b6126476020830185611c2d565b6126546040830184612616565b949350505050565b600060e082019050612671600083018a611f30565b61267e6020830189611f5a565b61268b6040830188611f69565b6126986060830187611f78565b6126a56080830186611f87565b6126b260a0830185611f96565b6126bf60c0830184611fa5565b98975050505050505050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b61271261270d826126cb565b6126f7565b82525050565b6000819050919050565b61273361272e82611c5c565b612718565b82525050565b60006127458287612701565b6001820191506127558286612701565b6001820191506127658285612722565b6020820191506127758284612722565b60208201915081905095945050505050565b7f4f6e6c79206d616e616765642076657374696e67732063616e2062652063616e60008201527f63656c6c65640000000000000000000000000000000000000000000000000000602082015250565b60006127e360268361212b565b91506127ee82612787565b604082019050919050565b60006020820190508181036000830152612812816127d6565b9050919050565b7f56657374696e6720616c72656164792063616e63656c6c656400000000000000600082015250565b600061284f60198361212b565b915061285a82612819565b602082019050919050565b6000602082019050818103600083015261287e81612842565b9050919050565b600061289082611cf0565b915061289b83611cf0565b9250828210156128ae576128ad6123fd565b5b828203905092915050565b7f43616e6e6f7420636c61696d20746f20302d6164647265737300000000000000600082015250565b60006128ef60198361212b565b91506128fa826128b9565b602082019050919050565b6000602082019050818103600083015261291e816128e2565b9050919050565b7f43616e206f6e6c7920626520636c61696d65642062792076657374696e67206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b600061298160248361212b565b915061298c82612925565b604082019050919050565b600060208201905081810360008301526129b081612974565b9050919050565b7f547279696e6720746f20636c61696d20746f6f206d616e7920746f6b656e7300600082015250565b60006129ed601f8361212b565b91506129f8826129b7565b602082019050919050565b60006020820190508181036000830152612a1c816129e0565b9050919050565b6000612a2e82611cf0565b9150612a3983611cf0565b9250826fffffffffffffffffffffffffffffffff03821115612a5e57612a5d6123fd565b5b828201905092915050565b7f496e76616c6964206163636f756e740000000000000000000000000000000000600082015250565b6000612a9f600f8361212b565b9150612aaa82612a69565b602082019050919050565b60006020820190508181036000830152612ace81612a92565b9050919050565b7f496e76616c69642076657374696e672063757276650000000000000000000000600082015250565b6000612b0b60158361212b565b9150612b1682612ad5565b602082019050919050565b60006020820190508181036000830152612b3a81612afe565b9050919050565b7f56657374696e6720696420616c72656164792075736564000000000000000000600082015250565b6000612b7760178361212b565b9150612b8282612b41565b602082019050919050565b60006020820190508181036000830152612ba681612b6a565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320617661696c61626c650000000000600082015250565b6000612be3601b8361212b565b9150612bee82612bad565b602082019050919050565b60006020820190508181036000830152612c1281612bd6565b9050919050565b6000612c2482611c23565b9150612c2f83611c23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c6457612c636123fd565b5b828201905092915050565b7f56657374696e67206e6f74206163746976652079657400000000000000000000600082015250565b6000612ca560168361212b565b9150612cb082612c6f565b602082019050919050565b60006020820190508181036000830152612cd481612c98565b9050919050565b6000612ce682611e63565b9150612cf183611e63565b92508167ffffffffffffffff0483118215151615612d1257612d116123fd565b5b828202905092915050565b7f496e76616c696420637572766520747970650000000000000000000000000000600082015250565b6000612d5360128361212b565b9150612d5e82612d1d565b602082019050919050565b60006020820190508181036000830152612d8281612d46565b9050919050565b6000612d9482611c23565b9150612d9f83611c23565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dd857612dd76123fd565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e1d82611c23565b9150612e2883611c23565b925082612e3857612e37612de3565b5b828204905092915050565b7f4f766572666c6f7720696e2063757276652063616c63756c6174696f6e000000600082015250565b6000612e79601d8361212b565b9150612e8482612e43565b602082019050919050565b60006020820190508181036000830152612ea881612e6c565b905091905056fea2646970667358221220afcb98a54ef70fbec64c6247556dd6770edab2f5863e5fa28430ef0a779afbfd64736f6c634300080b0033

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

0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d1

-----Decoded View---------------
Arg [0] : _token (address): 0x5aFE3855358E112B5647B952709E6165e1c1eEEe
Arg [1] : _poolManager (address): 0x8CF60B289f8d31F737049B590b5E4285Ff0Bd1D1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee
Arg [1] : 0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d1


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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