false
true
0

Contract Address Details

0xfd4d3A2fd12C7f3146428a2ebDCb489550Ae9bea

Token
Function Island Farm (FARM)
Creator
0x7008d2–e6e3cf at 0xc063dd–7ac6ec
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
5,709 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25971125
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
FarmToken




Optimization enabled
false
Compiler version
v0.8.18+commit.87f61d96




EVM Version
default




Verified at
2024-03-21T11:09:55.479808Z

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IPRC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IPRC20Permit {
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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

interface IAccessControl {
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
    error AccessControlBadConfirmation();

    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address callerConfirmation) external;
}

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library Counters {
    struct Counter {
        uint256 _value;
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

library ECDSA {
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        bytes32 r;
        bytes32 s;
        uint8 v;

        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        return recover(hash, v, r, s);
    }

    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

abstract contract EIP712 {
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    function _domainSeparatorV4() internal view returns (bytes32) {
        if (block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
        return keccak256(
            abi.encode(
                typeHash,
                name,
                version,
                block.chainid,
                address(this)
            )
        );
    }

    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }
    
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

library SafePRC20 {
    using Address for address;

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

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

    function safeApprove(IPRC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafePRC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

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

    function _callOptionalReturn(IPRC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafePRC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafePRC20: PRC20 operation did not succeed");
        }
    }
}

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

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

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

contract PRC20 is Context, IPRC20 {
    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "PRC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "PRC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "PRC20: transfer from the zero address");
        require(recipient != address(0), "PRC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "PRC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "PRC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "PRC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "PRC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "PRC20: approve from the zero address");
        require(spender != address(0), "PRC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

abstract contract PRC20Burnable is Context, PRC20 {
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "PRC20: burn amount exceeds allowance");
        _approve(account, _msgSender(), currentAllowance - amount);
        _burn(account, amount);
    }
}

abstract contract PRC20Permit is PRC20, IPRC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping (address => Counters.Counter) private _nonces;

    bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    constructor(string memory name) EIP712(name, "1") {
    
    }

    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {
        require(block.timestamp <= deadline, "PRC20Permit: expired deadline");

        bytes32 structHash = keccak256(
            abi.encode(
                _PERMIT_TYPEHASH,
                owner,
                spender,
                value,
                _useNonce(owner),
                deadline
            )
        );

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "PRC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }

    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }

    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

contract FarmToken is PRC20Permit, Ownable, PRC20Burnable {

    constructor () PRC20("Function Island Farm", "FARM") PRC20Permit("Function Island Farm") {

    }

    function mint(address _to, uint256 _amount) public onlyOwner() {
        _mint(_to, _amount);
    }
}

contract MasterChef is AccessControl {
    using SafeMath for uint256;
    using SafePRC20 for IPRC20;

    FarmToken public rewards;

    address public constant team = 0xA1e0cC3153f05C24cB42B72068F407E0CAf879dA;
    address public constant treasury = 0x58AB8Fe4e78Da632FFca31D120AD766ae981A4D7;

    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
    bytes32 public constant CHEF_ROLE = keccak256("CHEF_ROLE");

    uint256 public constant rewardsPerBlock = 1e14; // 0.0001 rewards tokens per block
    uint256 public totalAllocPoint;
    uint256 public startBlock;

    PoolInfo[] public poolInfo;

    // Info of each user.
    struct UserInfo {
        uint256 amount;
        uint256 rewardDebt;
    }

    // Info of each pool.
    struct PoolInfo {
        IPRC20 lpToken;
        uint256 allocPoint;
        uint256 lastRewardBlock;
        uint256 accYieldPerShare;
        uint16 depositFeeBP;
    }

    mapping (uint256 => mapping (address => UserInfo)) public userInfo;

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);

    constructor(
        FarmToken _rewards,
        uint256 _startBlock
    ) {
        
        rewards = _rewards;
        startBlock = _startBlock;

        totalAllocPoint = 0;

        _setRoleAdmin(CHEF_ROLE, ADMIN_ROLE);

        _grantRole(ADMIN_ROLE, msg.sender);
        _grantRole(CHEF_ROLE, msg.sender);
    }

    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    // Add a new lp to the pool. Can only be called by the owner.
    // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do.
    function add(uint256 _allocPoint, IPRC20 _lpToken, uint16 _depositFeeBP, bool _withUpdate) public onlyRole(CHEF_ROLE) {
        require(_depositFeeBP <= 10000, "add: invalid deposit fee basis points");
        if (_withUpdate) {
            massUpdatePools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolInfo.push(PoolInfo({
            lpToken: _lpToken,
            allocPoint: _allocPoint,
            lastRewardBlock: lastRewardBlock,
            accYieldPerShare: 0,
            depositFeeBP: _depositFeeBP
        }));
    }

    // Update the given pool's token allocation point and deposit fee. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, bool _withUpdate) public onlyRole(CHEF_ROLE) {
        require(_depositFeeBP <= 10000, "set: invalid deposit fee basis points");
        if (_withUpdate) {
            massUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
        poolInfo[_pid].depositFeeBP = _depositFeeBP;
    }

    // Return reward multiplier over the given _from to _to block.
    function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) {
        return _to.sub(_from);
    }

    // View function to see pending rewards on frontend.
    function pendingRewards(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accYieldPerShare = pool.accYieldPerShare;
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        if (block.number > pool.lastRewardBlock && lpSupply != 0) {
            uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
            uint256 reward = multiplier.mul(rewardsPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
            accYieldPerShare = accYieldPerShare.add(reward.mul(1e12).div(lpSupply));
        }
        return user.amount.mul(accYieldPerShare).div(1e12).sub(user.rewardDebt);
    }

    // Update reward variables for all pools. Be careful of gas spending!
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];

        if (block.number <= pool.lastRewardBlock) {
            return;
        }

        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        
        if (lpSupply == 0 || pool.allocPoint == 0) {
            pool.lastRewardBlock = block.number;
            return;
        }

        uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
        uint256 reward = multiplier.mul(rewardsPerBlock).mul(pool.allocPoint).div(totalAllocPoint);

        rewards.mint(team, reward.div(200));
        rewards.mint(address(this), reward);

        pool.accYieldPerShare = pool.accYieldPerShare.add(reward.mul(1e12).div(lpSupply));
        pool.lastRewardBlock = block.number;
    }

    // Deposit LP tokens to MasterChef for token allocation.
    function deposit(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
            if(pending > 0) {
                safeTokenTransfer(msg.sender, pending);
            }
        }
        if(_amount > 0) {
            pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
            if(pool.depositFeeBP > 0){
                uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000);
                pool.lpToken.safeTransfer(treasury, depositFee);
                user.amount = user.amount.add(_amount).sub(depositFee);
            }else{
                user.amount = user.amount.add(_amount);
            }
        }
        user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
        emit Deposit(msg.sender, _pid, _amount);
    }

    // Withdraw LP tokens from MasterChef.
    function withdraw(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
        if(pending > 0) {
            safeTokenTransfer(msg.sender, pending);
        }
        if(_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.lpToken.safeTransfer(address(msg.sender), _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
        emit Withdraw(msg.sender, _pid, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        uint256 amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;
        pool.lpToken.safeTransfer(address(msg.sender), amount);
        emit EmergencyWithdraw(msg.sender, _pid, amount);
    }

    // Safe rewards transfer function, just in case if rounding error causes pool to not have enough tokens.
    function safeTokenTransfer(address _to, uint256 _amount) internal {
        uint256 farmBal = rewards.balanceOf(address(this));
        if (_amount > farmBal) {
            rewards.transfer(_to, farmBal);
        } else {
            rewards.transfer(_to, _amount);
        }
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permit","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120908152503480156200003a57600080fd5b506040518060400160405280601481526020017f46756e6374696f6e2049736c616e64204661726d000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280601481526020017f46756e6374696f6e2049736c616e64204661726d0000000000000000000000008152506040518060400160405280600481526020017f4641524d0000000000000000000000000000000000000000000000000000000081525081600390816200012591906200052d565b5080600490816200013791906200052d565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a08181525050620001a28184846200026f60201b60201c565b608081815250508061010081815250505050505050506000620001ca620002ab60201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620006e2565b600083838346306040516020016200028c95949392919062000685565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033557607f821691505b6020821081036200034b576200034a620002ed565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000376565b620003c1868362000376565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200040e620004086200040284620003d9565b620003e3565b620003d9565b9050919050565b6000819050919050565b6200042a83620003ed565b62000442620004398262000415565b84845462000383565b825550505050565b600090565b620004596200044a565b620004668184846200041f565b505050565b5b818110156200048e57620004826000826200044f565b6001810190506200046c565b5050565b601f821115620004dd57620004a78162000351565b620004b28462000366565b81016020851015620004c2578190505b620004da620004d18562000366565b8301826200046b565b50505b505050565b600082821c905092915050565b60006200050260001984600802620004e2565b1980831691505092915050565b60006200051d8383620004ef565b9150826002028217905092915050565b6200053882620002b3565b67ffffffffffffffff811115620005545762000553620002be565b5b6200056082546200031c565b6200056d82828562000492565b600060209050601f831160018114620005a5576000841562000590578287015190505b6200059c85826200050f565b8655506200060c565b601f198416620005b58662000351565b60005b82811015620005df57848901518255600182019150602085019450602081019050620005b8565b86831015620005ff5784890151620005fb601f891682620004ef565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b620006298162000614565b82525050565b6200063a81620003d9565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200066d8262000640565b9050919050565b6200067f8162000660565b82525050565b600060a0820190506200069c60008301886200061e565b620006ab60208301876200061e565b620006ba60408301866200061e565b620006c960608301856200062f565b620006d8608083018462000674565b9695505050505050565b60805160a05160c05160e0516101005161012051612a43620007326000396000610b86015260006113570152600061139901526000611378015260006113050152600061132c0152612a436000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063a457c2d711610071578063a457c2d714610333578063a9059cbb14610363578063d505accf14610393578063dd62ed3e146103af578063f2fde38b146103df5761012c565b8063715018a6146102a157806379cc6790146102ab5780637ecebe00146102c75780638da5cb5b146102f757806395d89b41146103155761012c565b80633644e515116100f45780633644e515146101eb578063395093511461020957806340c10f191461023957806342966c681461025557806370a08231146102715761012c565b806306fdde0314610131578063095ea7b31461014f57806318160ddd1461017f57806323b872dd1461019d578063313ce567146101cd575b600080fd5b6101396103fb565b6040516101469190611a11565b60405180910390f35b61016960048036038101906101649190611acc565b61048d565b6040516101769190611b27565b60405180910390f35b6101876104ab565b6040516101949190611b51565b60405180910390f35b6101b760048036038101906101b29190611b6c565b6104b5565b6040516101c49190611b27565b60405180910390f35b6101d56105b6565b6040516101e29190611bdb565b60405180910390f35b6101f36105bf565b6040516102009190611c0f565b60405180910390f35b610223600480360381019061021e9190611acc565b6105ce565b6040516102309190611b27565b60405180910390f35b610253600480360381019061024e9190611acc565b61067a565b005b61026f600480360381019061026a9190611c2a565b610704565b005b61028b60048036038101906102869190611c57565b610718565b6040516102989190611b51565b60405180910390f35b6102a9610760565b005b6102c560048036038101906102c09190611acc565b61089d565b005b6102e160048036038101906102dc9190611c57565b610921565b6040516102ee9190611b51565b60405180910390f35b6102ff610971565b60405161030c9190611c93565b60405180910390f35b61031d61099b565b60405161032a9190611a11565b60405180910390f35b61034d60048036038101906103489190611acc565b610a2d565b60405161035a9190611b27565b60405180910390f35b61037d60048036038101906103789190611acc565b610b21565b60405161038a9190611b27565b60405180910390f35b6103ad60048036038101906103a89190611d06565b610b3f565b005b6103c960048036038101906103c49190611da8565b610c81565b6040516103d69190611b51565b60405180910390f35b6103f960048036038101906103f49190611c57565b610d08565b005b60606003805461040a90611e17565b80601f016020809104026020016040519081016040528092919081815260200182805461043690611e17565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b60006104a161049a610eb3565b8484610ebb565b6001905092915050565b6000600254905090565b60006104c2848484611084565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061050d610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561058d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058490611eba565b60405180910390fd5b6105aa85610599610eb3565b85846105a59190611f09565b610ebb565b60019150509392505050565b60006012905090565b60006105c9611301565b905090565b60006106706105db610eb3565b8484600160006105e9610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461066b9190611f3d565b610ebb565b6001905092915050565b610682610eb3565b73ffffffffffffffffffffffffffffffffffffffff166106a0610971565b73ffffffffffffffffffffffffffffffffffffffff16146106f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ed90611fbd565b60405180910390fd5b61070082826113c3565b5050565b61071561070f610eb3565b82611516565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610768610eb3565b73ffffffffffffffffffffffffffffffffffffffff16610786610971565b73ffffffffffffffffffffffffffffffffffffffff16146107dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d390611fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006108b0836108ab610eb3565b610c81565b9050818110156108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec9061204f565b60405180910390fd5b61091283610901610eb3565b848461090d9190611f09565b610ebb565b61091c8383611516565b505050565b600061096a600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206116e9565b9050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109aa90611e17565b80601f01602080910402602001604051908101604052809291908181526020018280546109d690611e17565b8015610a235780601f106109f857610100808354040283529160200191610a23565b820191906000526020600020905b815481529060010190602001808311610a0657829003601f168201915b5050505050905090565b60008060016000610a3c610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af0906120e1565b60405180910390fd5b610b16610b04610eb3565b858584610b119190611f09565b610ebb565b600191505092915050565b6000610b35610b2e610eb3565b8484611084565b6001905092915050565b83421115610b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b799061214d565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000888888610bb18c6116f7565b89604051602001610bc79695949392919061216d565b6040516020818303038152906040528051906020012090506000610bea82611755565b90506000610bfa8287878761176f565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061221a565b60405180910390fd5b610c758a8a8a610ebb565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d10610eb3565b73ffffffffffffffffffffffffffffffffffffffff16610d2e610971565b73ffffffffffffffffffffffffffffffffffffffff1614610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90611fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906122ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f219061233e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f90906123d0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110779190611b51565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90612462565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906124f4565b60405180910390fd5b61116d8383836118f9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90612586565b60405180910390fd5b81816111ff9190611f09565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461128f9190611f3d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112f39190611b51565b60405180910390a350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004603611352577f000000000000000000000000000000000000000000000000000000000000000090506113c0565b6113bd7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006118fe565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611429906125f2565b60405180910390fd5b61143e600083836118f9565b80600260008282546114509190611f3d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114a59190611f3d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161150a9190611b51565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c90612684565b60405180910390fd5b611591826000836118f9565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90612716565b60405180910390fd5b81816116239190611f09565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546116779190611f09565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116dc9190611b51565b60405180910390a3505050565b600081600001549050919050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611744816116e9565b915061174f81611938565b50919050565b6000611768611762611301565b8361194e565b9050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce906127a8565b60405180910390fd5b601b8460ff1614806117ec5750601c8460ff16145b61182b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118229061283a565b60405180910390fd5b600060018686868660405160008152602001604052604051611850949392919061285a565b6020604051602081039080840390855afa158015611872573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e4906128eb565b60405180910390fd5b80915050949350505050565b505050565b6000838383463060405160200161191995949392919061290b565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b600082826040516020016119639291906129d6565b60405160208183030381529060405280519060200120905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119bb5780820151818401526020810190506119a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006119e382611981565b6119ed818561198c565b93506119fd81856020860161199d565b611a06816119c7565b840191505092915050565b60006020820190508181036000830152611a2b81846119d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a6382611a38565b9050919050565b611a7381611a58565b8114611a7e57600080fd5b50565b600081359050611a9081611a6a565b92915050565b6000819050919050565b611aa981611a96565b8114611ab457600080fd5b50565b600081359050611ac681611aa0565b92915050565b60008060408385031215611ae357611ae2611a33565b5b6000611af185828601611a81565b9250506020611b0285828601611ab7565b9150509250929050565b60008115159050919050565b611b2181611b0c565b82525050565b6000602082019050611b3c6000830184611b18565b92915050565b611b4b81611a96565b82525050565b6000602082019050611b666000830184611b42565b92915050565b600080600060608486031215611b8557611b84611a33565b5b6000611b9386828701611a81565b9350506020611ba486828701611a81565b9250506040611bb586828701611ab7565b9150509250925092565b600060ff82169050919050565b611bd581611bbf565b82525050565b6000602082019050611bf06000830184611bcc565b92915050565b6000819050919050565b611c0981611bf6565b82525050565b6000602082019050611c246000830184611c00565b92915050565b600060208284031215611c4057611c3f611a33565b5b6000611c4e84828501611ab7565b91505092915050565b600060208284031215611c6d57611c6c611a33565b5b6000611c7b84828501611a81565b91505092915050565b611c8d81611a58565b82525050565b6000602082019050611ca86000830184611c84565b92915050565b611cb781611bbf565b8114611cc257600080fd5b50565b600081359050611cd481611cae565b92915050565b611ce381611bf6565b8114611cee57600080fd5b50565b600081359050611d0081611cda565b92915050565b600080600080600080600060e0888a031215611d2557611d24611a33565b5b6000611d338a828b01611a81565b9750506020611d448a828b01611a81565b9650506040611d558a828b01611ab7565b9550506060611d668a828b01611ab7565b9450506080611d778a828b01611cc5565b93505060a0611d888a828b01611cf1565b92505060c0611d998a828b01611cf1565b91505092959891949750929550565b60008060408385031215611dbf57611dbe611a33565b5b6000611dcd85828601611a81565b9250506020611dde85828601611a81565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e2f57607f821691505b602082108103611e4257611e41611de8565b5b50919050565b7f50524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000611ea460288361198c565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f1482611a96565b9150611f1f83611a96565b9250828203905081811115611f3757611f36611eda565b5b92915050565b6000611f4882611a96565b9150611f5383611a96565b9250828201905080821115611f6b57611f6a611eda565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611fa760208361198c565b9150611fb282611f71565b602082019050919050565b60006020820190508181036000830152611fd681611f9a565b9050919050565b7f50524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061203960248361198c565b915061204482611fdd565b604082019050919050565b600060208201905081810360008301526120688161202c565b9050919050565b7f50524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006120cb60258361198c565b91506120d68261206f565b604082019050919050565b600060208201905081810360008301526120fa816120be565b9050919050565b7f50524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612137601d8361198c565b915061214282612101565b602082019050919050565b600060208201905081810360008301526121668161212a565b9050919050565b600060c0820190506121826000830189611c00565b61218f6020830188611c84565b61219c6040830187611c84565b6121a96060830186611b42565b6121b66080830185611b42565b6121c360a0830184611b42565b979650505050505050565b7f50524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612204601e8361198c565b915061220f826121ce565b602082019050919050565b60006020820190508181036000830152612233816121f7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061229660268361198c565b91506122a18261223a565b604082019050919050565b600060208201905081810360008301526122c581612289565b9050919050565b7f50524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061232860248361198c565b9150612333826122cc565b604082019050919050565b600060208201905081810360008301526123578161231b565b9050919050565b7f50524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006123ba60228361198c565b91506123c58261235e565b604082019050919050565b600060208201905081810360008301526123e9816123ad565b9050919050565b7f50524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061244c60258361198c565b9150612457826123f0565b604082019050919050565b6000602082019050818103600083015261247b8161243f565b9050919050565b7f50524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006124de60238361198c565b91506124e982612482565b604082019050919050565b6000602082019050818103600083015261250d816124d1565b9050919050565b7f50524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061257060268361198c565b915061257b82612514565b604082019050919050565b6000602082019050818103600083015261259f81612563565b9050919050565b7f50524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006125dc601f8361198c565b91506125e7826125a6565b602082019050919050565b6000602082019050818103600083015261260b816125cf565b9050919050565b7f50524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061266e60218361198c565b915061267982612612565b604082019050919050565b6000602082019050818103600083015261269d81612661565b9050919050565b7f50524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061270060228361198c565b915061270b826126a4565b604082019050919050565b6000602082019050818103600083015261272f816126f3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061279260228361198c565b915061279d82612736565b604082019050919050565b600060208201905081810360008301526127c181612785565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061282460228361198c565b915061282f826127c8565b604082019050919050565b6000602082019050818103600083015261285381612817565b9050919050565b600060808201905061286f6000830187611c00565b61287c6020830186611bcc565b6128896040830185611c00565b6128966060830184611c00565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006128d560188361198c565b91506128e08261289f565b602082019050919050565b60006020820190508181036000830152612904816128c8565b9050919050565b600060a0820190506129206000830188611c00565b61292d6020830187611c00565b61293a6040830186611c00565b6129476060830185611b42565b6129546080830184611c84565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061299f60028361295e565b91506129aa82612969565b600282019050919050565b6000819050919050565b6129d06129cb82611bf6565b6129b5565b82525050565b60006129e182612992565b91506129ed82856129bf565b6020820191506129fd82846129bf565b602082019150819050939250505056fea26469706673582212209b7fe5b4b5accea910c117f4554e36638f0793ac093ac8276a63cfd898658a0064736f6c63430008120033

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063a457c2d711610071578063a457c2d714610333578063a9059cbb14610363578063d505accf14610393578063dd62ed3e146103af578063f2fde38b146103df5761012c565b8063715018a6146102a157806379cc6790146102ab5780637ecebe00146102c75780638da5cb5b146102f757806395d89b41146103155761012c565b80633644e515116100f45780633644e515146101eb578063395093511461020957806340c10f191461023957806342966c681461025557806370a08231146102715761012c565b806306fdde0314610131578063095ea7b31461014f57806318160ddd1461017f57806323b872dd1461019d578063313ce567146101cd575b600080fd5b6101396103fb565b6040516101469190611a11565b60405180910390f35b61016960048036038101906101649190611acc565b61048d565b6040516101769190611b27565b60405180910390f35b6101876104ab565b6040516101949190611b51565b60405180910390f35b6101b760048036038101906101b29190611b6c565b6104b5565b6040516101c49190611b27565b60405180910390f35b6101d56105b6565b6040516101e29190611bdb565b60405180910390f35b6101f36105bf565b6040516102009190611c0f565b60405180910390f35b610223600480360381019061021e9190611acc565b6105ce565b6040516102309190611b27565b60405180910390f35b610253600480360381019061024e9190611acc565b61067a565b005b61026f600480360381019061026a9190611c2a565b610704565b005b61028b60048036038101906102869190611c57565b610718565b6040516102989190611b51565b60405180910390f35b6102a9610760565b005b6102c560048036038101906102c09190611acc565b61089d565b005b6102e160048036038101906102dc9190611c57565b610921565b6040516102ee9190611b51565b60405180910390f35b6102ff610971565b60405161030c9190611c93565b60405180910390f35b61031d61099b565b60405161032a9190611a11565b60405180910390f35b61034d60048036038101906103489190611acc565b610a2d565b60405161035a9190611b27565b60405180910390f35b61037d60048036038101906103789190611acc565b610b21565b60405161038a9190611b27565b60405180910390f35b6103ad60048036038101906103a89190611d06565b610b3f565b005b6103c960048036038101906103c49190611da8565b610c81565b6040516103d69190611b51565b60405180910390f35b6103f960048036038101906103f49190611c57565b610d08565b005b60606003805461040a90611e17565b80601f016020809104026020016040519081016040528092919081815260200182805461043690611e17565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b60006104a161049a610eb3565b8484610ebb565b6001905092915050565b6000600254905090565b60006104c2848484611084565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061050d610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561058d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058490611eba565b60405180910390fd5b6105aa85610599610eb3565b85846105a59190611f09565b610ebb565b60019150509392505050565b60006012905090565b60006105c9611301565b905090565b60006106706105db610eb3565b8484600160006105e9610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461066b9190611f3d565b610ebb565b6001905092915050565b610682610eb3565b73ffffffffffffffffffffffffffffffffffffffff166106a0610971565b73ffffffffffffffffffffffffffffffffffffffff16146106f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ed90611fbd565b60405180910390fd5b61070082826113c3565b5050565b61071561070f610eb3565b82611516565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610768610eb3565b73ffffffffffffffffffffffffffffffffffffffff16610786610971565b73ffffffffffffffffffffffffffffffffffffffff16146107dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d390611fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006108b0836108ab610eb3565b610c81565b9050818110156108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec9061204f565b60405180910390fd5b61091283610901610eb3565b848461090d9190611f09565b610ebb565b61091c8383611516565b505050565b600061096a600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206116e9565b9050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109aa90611e17565b80601f01602080910402602001604051908101604052809291908181526020018280546109d690611e17565b8015610a235780601f106109f857610100808354040283529160200191610a23565b820191906000526020600020905b815481529060010190602001808311610a0657829003601f168201915b5050505050905090565b60008060016000610a3c610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af0906120e1565b60405180910390fd5b610b16610b04610eb3565b858584610b119190611f09565b610ebb565b600191505092915050565b6000610b35610b2e610eb3565b8484611084565b6001905092915050565b83421115610b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b799061214d565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610bb18c6116f7565b89604051602001610bc79695949392919061216d565b6040516020818303038152906040528051906020012090506000610bea82611755565b90506000610bfa8287878761176f565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061221a565b60405180910390fd5b610c758a8a8a610ebb565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d10610eb3565b73ffffffffffffffffffffffffffffffffffffffff16610d2e610971565b73ffffffffffffffffffffffffffffffffffffffff1614610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90611fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906122ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f219061233e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f90906123d0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110779190611b51565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90612462565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906124f4565b60405180910390fd5b61116d8383836118f9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90612586565b60405180910390fd5b81816111ff9190611f09565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461128f9190611f3d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112f39190611b51565b60405180910390a350505050565b60007f00000000000000000000000000000000000000000000000000000000000001714603611352577f506a5bf1b63ab6ce03d2379017f6b085ce4a5c76d9c190bd7535253188643d2390506113c0565b6113bd7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fc3ba6702b9fe8546f63ee47722fe817d63fe862807f39dcd4c5389496aef69477fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66118fe565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611429906125f2565b60405180910390fd5b61143e600083836118f9565b80600260008282546114509190611f3d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114a59190611f3d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161150a9190611b51565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c90612684565b60405180910390fd5b611591826000836118f9565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90612716565b60405180910390fd5b81816116239190611f09565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546116779190611f09565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116dc9190611b51565b60405180910390a3505050565b600081600001549050919050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611744816116e9565b915061174f81611938565b50919050565b6000611768611762611301565b8361194e565b9050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce906127a8565b60405180910390fd5b601b8460ff1614806117ec5750601c8460ff16145b61182b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118229061283a565b60405180910390fd5b600060018686868660405160008152602001604052604051611850949392919061285a565b6020604051602081039080840390855afa158015611872573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e4906128eb565b60405180910390fd5b80915050949350505050565b505050565b6000838383463060405160200161191995949392919061290b565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b600082826040516020016119639291906129d6565b60405160208183030381529060405280519060200120905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119bb5780820151818401526020810190506119a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006119e382611981565b6119ed818561198c565b93506119fd81856020860161199d565b611a06816119c7565b840191505092915050565b60006020820190508181036000830152611a2b81846119d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a6382611a38565b9050919050565b611a7381611a58565b8114611a7e57600080fd5b50565b600081359050611a9081611a6a565b92915050565b6000819050919050565b611aa981611a96565b8114611ab457600080fd5b50565b600081359050611ac681611aa0565b92915050565b60008060408385031215611ae357611ae2611a33565b5b6000611af185828601611a81565b9250506020611b0285828601611ab7565b9150509250929050565b60008115159050919050565b611b2181611b0c565b82525050565b6000602082019050611b3c6000830184611b18565b92915050565b611b4b81611a96565b82525050565b6000602082019050611b666000830184611b42565b92915050565b600080600060608486031215611b8557611b84611a33565b5b6000611b9386828701611a81565b9350506020611ba486828701611a81565b9250506040611bb586828701611ab7565b9150509250925092565b600060ff82169050919050565b611bd581611bbf565b82525050565b6000602082019050611bf06000830184611bcc565b92915050565b6000819050919050565b611c0981611bf6565b82525050565b6000602082019050611c246000830184611c00565b92915050565b600060208284031215611c4057611c3f611a33565b5b6000611c4e84828501611ab7565b91505092915050565b600060208284031215611c6d57611c6c611a33565b5b6000611c7b84828501611a81565b91505092915050565b611c8d81611a58565b82525050565b6000602082019050611ca86000830184611c84565b92915050565b611cb781611bbf565b8114611cc257600080fd5b50565b600081359050611cd481611cae565b92915050565b611ce381611bf6565b8114611cee57600080fd5b50565b600081359050611d0081611cda565b92915050565b600080600080600080600060e0888a031215611d2557611d24611a33565b5b6000611d338a828b01611a81565b9750506020611d448a828b01611a81565b9650506040611d558a828b01611ab7565b9550506060611d668a828b01611ab7565b9450506080611d778a828b01611cc5565b93505060a0611d888a828b01611cf1565b92505060c0611d998a828b01611cf1565b91505092959891949750929550565b60008060408385031215611dbf57611dbe611a33565b5b6000611dcd85828601611a81565b9250506020611dde85828601611a81565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e2f57607f821691505b602082108103611e4257611e41611de8565b5b50919050565b7f50524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000611ea460288361198c565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f1482611a96565b9150611f1f83611a96565b9250828203905081811115611f3757611f36611eda565b5b92915050565b6000611f4882611a96565b9150611f5383611a96565b9250828201905080821115611f6b57611f6a611eda565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611fa760208361198c565b9150611fb282611f71565b602082019050919050565b60006020820190508181036000830152611fd681611f9a565b9050919050565b7f50524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061203960248361198c565b915061204482611fdd565b604082019050919050565b600060208201905081810360008301526120688161202c565b9050919050565b7f50524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006120cb60258361198c565b91506120d68261206f565b604082019050919050565b600060208201905081810360008301526120fa816120be565b9050919050565b7f50524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612137601d8361198c565b915061214282612101565b602082019050919050565b600060208201905081810360008301526121668161212a565b9050919050565b600060c0820190506121826000830189611c00565b61218f6020830188611c84565b61219c6040830187611c84565b6121a96060830186611b42565b6121b66080830185611b42565b6121c360a0830184611b42565b979650505050505050565b7f50524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612204601e8361198c565b915061220f826121ce565b602082019050919050565b60006020820190508181036000830152612233816121f7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061229660268361198c565b91506122a18261223a565b604082019050919050565b600060208201905081810360008301526122c581612289565b9050919050565b7f50524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061232860248361198c565b9150612333826122cc565b604082019050919050565b600060208201905081810360008301526123578161231b565b9050919050565b7f50524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006123ba60228361198c565b91506123c58261235e565b604082019050919050565b600060208201905081810360008301526123e9816123ad565b9050919050565b7f50524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061244c60258361198c565b9150612457826123f0565b604082019050919050565b6000602082019050818103600083015261247b8161243f565b9050919050565b7f50524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006124de60238361198c565b91506124e982612482565b604082019050919050565b6000602082019050818103600083015261250d816124d1565b9050919050565b7f50524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061257060268361198c565b915061257b82612514565b604082019050919050565b6000602082019050818103600083015261259f81612563565b9050919050565b7f50524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006125dc601f8361198c565b91506125e7826125a6565b602082019050919050565b6000602082019050818103600083015261260b816125cf565b9050919050565b7f50524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061266e60218361198c565b915061267982612612565b604082019050919050565b6000602082019050818103600083015261269d81612661565b9050919050565b7f50524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061270060228361198c565b915061270b826126a4565b604082019050919050565b6000602082019050818103600083015261272f816126f3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061279260228361198c565b915061279d82612736565b604082019050919050565b600060208201905081810360008301526127c181612785565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061282460228361198c565b915061282f826127c8565b604082019050919050565b6000602082019050818103600083015261285381612817565b9050919050565b600060808201905061286f6000830187611c00565b61287c6020830186611bcc565b6128896040830185611c00565b6128966060830184611c00565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006128d560188361198c565b91506128e08261289f565b602082019050919050565b60006020820190508181036000830152612904816128c8565b9050919050565b600060a0820190506129206000830188611c00565b61292d6020830187611c00565b61293a6040830186611c00565b6129476060830185611b42565b6129546080830184611c84565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061299f60028361295e565b91506129aa82612969565b600282019050919050565b6000819050919050565b6129d06129cb82611bf6565b6129b5565b82525050565b60006129e182612992565b91506129ed82856129bf565b6020820191506129fd82846129bf565b602082019150819050939250505056fea26469706673582212209b7fe5b4b5accea910c117f4554e36638f0793ac093ac8276a63cfd898658a0064736f6c63430008120033