ETH Price: $3,504.14 (+0.13%)
Gas: 2 Gwei

Token

Feyorra (FEY)
 

Overview

Max Total Supply

998,652,613.877900420103361805 FEY

Holders

228

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FEYToken

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 3 of 10: FEYToken.sol
// SPDX-License-Identifier: -- 💰 --

import './Token.sol';

pragma solidity ^0.7.3;

contract FEYToken is Token {

    using SafeMath for uint256;

    /**
        * @notice returns the interest rate by getting the global variable
        * YEARLY_INTEREST and subtracting the percentage passed.
        * Lowers the default interest rate as amount staked rises towards the totalSupply.
        * Used to record the rates for snapshots + to calculate stake interest
        * @param _percentage any uint256 figure
        * @return APY
     */
    function getInterestRateYearly(
        uint256 _percentage
    )
        public
        pure
        returns (uint256)
    {
        return uint256(YEARLY_INTEREST)
            .mul(uint256(10000)
            .sub(_percentage))
            .div(100);
    }

    /**
        * @notice a no args function used to get current APY
        * @dev _precision in getPercent is fixed to 4
        * @return percentage -- totalStaked on a particular day out of totalSupply
        * @return interestRateYearly -- APY based on relative size of current total stakes
     */
    function getYearlyInterestLatest()
        public
        view
        returns (
            uint256 percentage,
            uint256 interestRateYearly
        )
    {
        percentage = getPercent(
            globals.totalStakedAmount,
            totalSupply,
            4
        );

        interestRateYearly = getInterestRateYearly(
            percentage
        );
    }

    /**
        * @notice function used to get APY of a specific day
        * @param _day integer for the target day, starting @ 0
        * @dev _precision in getPercent is fixed to 4
        * @return percentage -- totalStaked on a particular day out of totalSupply
        * @return interestRateYearly -- APY based on relative size of stake
     */
    function getYearlyInterestHistorical(
        uint256 _day
    )
        public
        view
        returns (
            uint256 percentage,
            uint256 interestRateYearly
        )
    {
        SnapShot memory s = snapshots[_day];

        if (s.totalSupply == 0) {
            return getYearlyInterestLatest();
        }

        percentage = getPercent(
            s.totalStakedAmount,
            s.totalSupply,
            4
        );

        interestRateYearly = getInterestRateYearly(
            percentage
        );
    }

    /**
        * @notice calculates amount of interest earned per second
        * @param _stakedAmount principal amount
        * @param _totalStakedAmount summation of principal amount staked by everyone
        * @param _seconds time spent earning interest on a particular day
        * _seconds will be passed as the full SECONDS_IN_DAY for full days that we staked
        * _seconds will be the seconds that have passed by the time getInterest is called on the last day
        * @dev _precision in getPercent is fixed to 4
        * @return durationInterestAmt -- totalStaked on a particular day out of totalSupply
     */
    function getInterest(
        uint256 _stakedAmount,
        uint256 _totalStakedAmount,
        uint256 _seconds
    )
        public
        view
        returns (uint256 durationInterestAmt)
    {
        uint256 percentage = getPercent(
            _totalStakedAmount,
            totalSupply,
            4
        );

        uint256 interestRateYearly = getInterestRateYearly(
            percentage
        );

        uint256 yearFullAmount = _stakedAmount
            .mul(interestRateYearly)
            .div(100);

        uint256 dailyInterestAmt = getPercent(
            yearFullAmount,
            31556952,
            0
        );

        durationInterestAmt = dailyInterestAmt
            .mul(_seconds)
            .div(100);
    }

   /**
        * @notice admin function to close a matured stake OBO the staker
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @dev can only close after all of the seconds of the last day have passed
     */
    function closeGhostStake(
        uint256 _stakingId
    )
        external
        onlyOwner
    {
        (uint256 daysOld, uint256 secondsOld) = getStakeAge(_stakingId);

        require(
            daysOld == MAX_STAKE_DAYS &&
            secondsOld == SECONDS_IN_DAY,
            'FEYToken: not old enough'
        );

        closeStake(_stakingId);

        emit ClosedGhostStake(
            daysOld,
            secondsOld,
            _stakingId
        );
    }

    /**
        * @notice calculates number of days and remaining seconds on current day that a stake is open
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return daysTotal -- number of complete days that the stake has been open
        * @return secondsToday -- number of seconds the stake has been open on the current day
     */
    function getStakeAge(
        uint256 _stakingId
    )
        public
        view
        returns (
            uint256 daysTotal,
            uint256 secondsToday
        )
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        uint256 secondsTotal = getNow()
            .sub(_stakeElement.stakedAt);

        daysTotal = secondsTotal
            .div(SECONDS_IN_DAY);

        if (daysTotal > MAX_STAKE_DAYS) {

            daysTotal = MAX_STAKE_DAYS;
            secondsToday = SECONDS_IN_DAY;

        } else {
            secondsToday = secondsTotal
                .mod(SECONDS_IN_DAY);
        }
    }

    /**
        * @notice calculates amount of interest due to be credited to the staker based on:
        * number of days and remaining seconds on current day that a stake is open
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return stakeInterest -- total interest per second the stake was open on each day
     */
    function getStakeInterest(
        uint256 _stakingId
    )
        public
        view
        returns (
            uint256 stakeInterest
        )
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        if (_stakeElement.isActive == false) {

            stakeInterest = _stakeElement.interestAmount;

        } else {

            (
                uint256 daysTotal,
                uint256 secondsToday
            ) = getStakeAge(_stakingId);

            uint256 finalDay = _currentFeyDay();
            uint256 startDay = finalDay.sub(daysTotal);

            for (uint256 _day = startDay; _day < finalDay; _day++) {
                stakeInterest += getInterest(
                    _stakeElement.stakedAmount,
                    snapshots[_day].totalStakedAmount,
                    SECONDS_IN_DAY
                );
            }

            stakeInterest += getInterest(
                _stakeElement.stakedAmount,
                globals.totalStakedAmount,
                secondsToday
            );
        }
    }

    /**
        * @notice penalties are taken if you close a stake before the completion of the 4th day
        * if closed before the end of the 2nd day: 7.5% of staked amount is penalized
        * if closed before the end of the 3rd day: 5% of staked amount is penalized
        * if closed before the end of the 4th day: 2.5% of staked amount is penalized
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return penaltyAmount -- amount that will be debited from the stakers principal when they close their stake
     */
    function getStakePenalty(
        uint256 _stakingId
    )
        public
        view
        returns (uint256 penaltyAmount)
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        uint256 daysDifference = getNow()
            .sub(_stakeElement.stakedAt)
            .div(SECONDS_IN_DAY);

        if (daysDifference < 15) {

            penaltyAmount = percentCalculator(
                _stakeElement.stakedAmount,
                750
            );

        } else if (daysDifference < 30) {

            penaltyAmount = percentCalculator(
                _stakeElement.stakedAmount,
                500
            );

        } else if (daysDifference < 45) {

            penaltyAmount = percentCalculator(
                _stakeElement.stakedAmount,
                250
            );
        }
    }

    /**
        * @notice calculates principal + interest - penalty (if applicable)
        * Note: this does not calculate a return rate, only what the sum would be if the stake was closed at that moment
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @dev the calculated value is only in memory
        * @return uint256 -- principal + interest - penalty
     */
    function estimateReturn(
        uint256 _stakingId
    )
        public
        view
        returns (uint256)
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        if (_stakeElement.isActive == false) {
            return  _stakeElement.returnAmount;
        }

        return _stakeElement.stakedAmount
            .add(getStakeInterest(_stakingId))
            .sub(getStakePenalty(_stakingId));
    }

    /**
        * @notice close a stake older than 1 full day to:
        * 1) credit principal + interest - penalty to the balance of the staker
        * 2) update totalStakedAmount in globals
        * 3) take snapshot of current FEY status before the stake closes
        * No interest is accrued unless the stake is at least on its 4th day
        * Updates global variables to reflect the closed stake
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return stakedAmount -- represents the total calculated by: principal + interest - penalty
        * @return penaltyAmount -- amount that will be debited from the stakers principal when they close their stake
        * @return interestAmount -- amount that will be debited from the stakers principal when they close their stake
     */
    function closeStake(
        uint256 _stakingId
    )
        public
        snapshotTrigger
        returns (
            uint256 stakedAmount,
            uint256 penaltyAmount,
            uint256 interestAmount
        )
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        uint256 daysDifference = getNow()
            .sub(_stakeElement.stakedAt)
            .div(SECONDS_IN_DAY);

        require(
            daysDifference >= 3,
            'FEYToken: immature stake'
        );

        require(
            _stakeElement.userAddress == msg.sender,
            'FEYToken: wrong stake owner'
        );

        require(
            _stakeElement.isActive,
            'FEYToken: stake not active'
        );

        _stakeElement.isActive = false;

        stakedAmount = _stakeElement.stakedAmount;

        if (daysDifference >= 45) {
            interestAmount = getStakeInterest(
                _stakingId
            );
        }

        penaltyAmount = getStakePenalty(
            _stakingId
        );

        totalSupply = totalSupply
            .add(interestAmount)
            .sub(penaltyAmount);

        _stakeElement.interestAmount = interestAmount;
        _stakeElement.returnAmount = stakedAmount
            .add(interestAmount)
            .sub(penaltyAmount);

        stakeList[_stakingId] = _stakeElement;

        balances[msg.sender] =
        balances[msg.sender].add(_stakeElement.returnAmount);

        globals.totalStakedAmount =
        globals.totalStakedAmount.sub(stakedAmount);

        emit StakeEnd(
            _stakingId,
            msg.sender,
            _stakeElement.returnAmount
        );

        emit Transfer(
            address(0x0),
            msg.sender,
            _stakeElement.returnAmount
        );
    }

    /**
        * @notice open a stake:
        * 1) must be greater than MINIMUM_STAKE in Declarations
        * 2) address opening the stake must have the amount of funds that they wish to stake in their balances[0xaddress]
        * 3) increment the global incrementId that is used to set the stakingId
        * 3) take snapshot of current FEY status before the stake is opened
        * Updates global variables to reflect the new stake
        * @param _amount the amount that you want to stake, will become your principal amount
        * @return true if no revert or error occurs
     */
    function openStake(
        uint256 _amount
    )
        external
        incrementId
        snapshotTrigger
        returns (bool)
    {
        require(
            _transferCheck(
                msg.sender,
                address(0x0),
                _amount,
                true
            ),
            'FEYToken: _transferCheck failed'
        );

        require(
            _amount >= MINIMUM_STAKE,
            'FEYToken: stake below minimum'
        );

        balances[msg.sender] =
        balances[msg.sender].sub(_amount);

        stakeList[globals.stakingId] = StakeElement(
            msg.sender,
            _amount,
            0,
            0,
            getNow(),
            true
        );

        globals.totalStakedAmount =
        globals.totalStakedAmount.add(_amount);

        emit StakeStart(
            globals.stakingId,
            msg.sender,
            _amount
        );

        emit Transfer(
            msg.sender,
            address(0),
            _amount
        );

        return true;
    }

    /**
        * @notice getter for the data of a specific stake
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return _stakedAmount -- represents the total calculated by: principal + interest - penalty
        * @return _userAddress -- address that was used to open the stake
        * @return _returnAmount -- principal + interest - penalty
        * @return interestAmount -- amount of interest accrued after closing the stake
        * @return _stakedAt -- timestamp of when stake was opened
        * @return _isActive -- boolean for if the stake is open and accruing interest
     */
    function getStaking(
        uint256 _stakingId
    )
        external
        view
        returns (
            uint256 _stakedAmount,
            address _userAddress,
            uint256 _returnAmount,
            uint256 interestAmount,
            uint256 _stakedAt,
            bool _isActive
        )
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        return (
            _stakeElement.stakedAmount,
            _stakeElement.userAddress,
            _stakeElement.returnAmount,
            _stakeElement.interestAmount,
            _stakeElement.stakedAt,
            _stakeElement.isActive
        );
    }
}

File 1 of 10: Declaration.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

abstract contract Declaration  {

    string public name = "Feyorra";
    string public symbol = "FEY";

    uint256 public decimals = 18;
    uint256 public totalSupply = 1000000000E18;

    uint256 public constant YEARLY_INTEREST = 410;
    uint256 public constant MINIMUM_STAKE = 100E18;
    uint256 public constant SECONDS_IN_DAY = 86400;
    uint256 public constant MAX_STAKE_DAYS = 1825;

    uint256 public immutable LAUNCH_TIME;

    struct Globals {
        uint256 stakingId;
        uint256 currentFeyDay;
        uint256 totalStakedAmount;
    }

    struct StakeElement {
        address userAddress;
        uint256 stakedAmount;
        uint256 returnAmount;
        uint256 interestAmount;
        uint256 stakedAt;
        bool isActive;
    }

    struct SnapShot {
        uint256 totalSupply;
        uint256 totalStakedAmount;
    }

    mapping(address => uint256) public balances;
    mapping(address => mapping(address => uint256)) public allowances;

    mapping(uint256 => SnapShot) public snapshots;
    mapping(uint256 => StakeElement) public stakeList;

    Globals public globals;

    modifier incrementId() {
        _;
        globals.stakingId++;
    }

    constructor() {
        LAUNCH_TIME = block.timestamp;
        balances[msg.sender] = totalSupply;
    }
}

File 2 of 10: Events.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

abstract contract Events  {

    event StakeStart(
        uint256 indexed _stakingId,
        address _address,
        uint256 _amount
    );

    event StakeEnd(
        uint256 indexed _stakingId,
        address _address,
        uint256 _amount
    );

    event Transfer(
        address indexed _from,
        address indexed _to,
        uint256 _value
    );

    event Approval(
        address indexed _owner,
        address indexed _spender,
        uint256 _value
    );

    event ClosedGhostStake(
        uint256 daysOld,
        uint256 secondsOld,
        uint256 stakeId
    );

    event SnapshotCaptured(
        uint256 _totalSupply,
        uint256 _totalStakedAmount,
        uint64 _snapshotDay
    );
}

File 4 of 10: Helper.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

import './Timing.sol';
import './Ownable.sol';
import './Events.sol';
import './SafeMath.sol';

contract Helper is Ownable, Timing, Events {

    using SafeMath for uint256;

    /**
    * @notice burns set amount of tokens
    * @dev currently unused based on changing requirements
    * @param _amount -- amount to be burned
    * @return true if burn() succeeds
    */
    function burn(
        uint256 _amount
    )
        external
        onlyOwner
        returns (bool)
    {
        require(
            balances[msg.sender].sub(_amount) >= 0,
            'FEYToken: exceeding balance'
        );

        totalSupply =
        totalSupply.sub(_amount);

        balances[msg.sender] =
        balances[msg.sender].sub(_amount);

        emit Transfer(
            msg.sender,
            address(0x0),
            _amount
       );

        return true;
    }

    /**
    * @notice Groups common requirements in global, internal function
    * @dev Used by Transfer(), TransferFrom(), + OpenStake()
    * @param _sender -- msg.sender of the functions listed above
    * @param _recipient -- recipient of amount
    * @param _amount -- amount that is transferred
    * @param _allowBurnAddress -- boolean to allow burning tokens
    * @return balance[] value of the input address
    */
    function _transferCheck(
        address _sender,
        address _recipient,
        uint256 _amount,
        bool _allowBurnAddress
    )
        internal
        view
        returns (bool)
    {

        if (_allowBurnAddress == false) {
            require(
                _recipient != address(0x0),
                'FEYToken: cannot send to burn address'
            );
        }

        require(
            balances[_sender] >= _amount,
            'FEYToken: exceeding balance'
        );

        require(
            balances[_recipient].add(_amount) >= balances[_recipient],
            'FEYToken: overflow detected'
        );

        return true;
    }

    /**
    * @notice Used to calculate % that is staked out of the totalSupply
    * @dev Used by getYearlyInterestLatest(), getYearlyInterestHistorical(), + twice in getInterest()
    * @param _numerator -- numerator, typically globals.totalStakedAmount
    * @param _denominator -- denominator, typically totalSupply
    * @param _precision -- number of decimal points, fixed at 4
    * @return quotient -- calculated value
    */
    function getPercent(
        uint256 _numerator,
        uint256 _denominator,
        uint256 _precision
    )
        public
        pure
        returns(uint256 quotient)
    {
        uint256 numerator = _numerator * 10 ** (_precision + 1);
        quotient = ((numerator / _denominator) + 5) / 10;
    }

    /**
    * @notice Used to reduce value by a set percentage amount
    * @dev Used to calculate penaltyAmount
    * @param _value -- initial value, typically _stakeElement.stakedAmount
    * @param _perc -- percentage reduction that will be applied
    * @return percentageValue -- value reduced by the input percentage
    */
    function percentCalculator(
        uint256 _value,
        uint256 _perc
    )
        public
        pure
        returns (uint256 percentageValue)
    {
        percentageValue = _value
            .mul(_perc)
            .div(10000);
    }

}

File 5 of 10: Migrations.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.8.0;

contract Migrations {
    address public owner;
    uint public last_completed_migration;

    constructor() {
        owner = msg.sender;
    }

    modifier restricted() {
        if (msg.sender == owner) _;
    }

    function setCompleted(uint completed) public restricted {
        last_completed_migration = completed;
    }

    function upgrade(address new_address) public restricted {
        Migrations upgraded = Migrations(new_address);
        upgraded.setCompleted(last_completed_migration);
    }
}

File 6 of 10: Ownable.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

contract Ownable {

    address public owner;

    event ownershipChanged(
        address indexed _invoker,
        address indexed _newOwner
    );

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(
            msg.sender == owner,
            'Ownable: must be the owner'
        );
        _;
    }

    function changeOwner(
        address _newOwner
    )
        external
        onlyOwner
        returns (bool)
    {
        require(
            _newOwner != address(0x0),
            'Ownable: invalid address'
        );
        
        owner = _newOwner;

        emit ownershipChanged(
            msg.sender,
            _newOwner
        );

        return true;
    }
}

File 7 of 10: SafeMath.sol
// SPDX-License-Identifier: -- 🎲 --

pragma solidity ^0.7.0;

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, 'SafeMath: subtraction overflow');
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, 'SafeMath: multiplication overflow');
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, 'SafeMath: division by zero');
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, 'SafeMath: modulo by zero');
        return a % b;
    }
}

File 8 of 10: Snapshot.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

import "./Helper.sol";

abstract contract Snapshot is Helper {

    using SafeMath for uint;


    /**
    * @notice modifier to capture snapshots when a stake is opened or closed
    * @dev used in OpenStake() + CloseStake() in FeyToken 
    */
    modifier snapshotTrigger() 
    {
        _dailySnapshotPoint(
            _currentFeyDay()
        );
        _;
    }

    /**
    * @notice Manually capture snapshot
    */
    function manualDailySnapshot() 
        external
    {
        _dailySnapshotPoint(
            _currentFeyDay()
        );
    }

    /**
    * @notice takes in todays feyday + updates all missing snapshot days with todays data
    * @param _updateDay -- current FeyDay as outputted from timing's _currentFeyDay() function
    * Emits SnapshotCaptured event
    */
    function _dailySnapshotPoint(
        uint64 _updateDay
    )
        private
    {
        for (uint256 _day = globals.currentFeyDay; _day < _updateDay; _day++) {

            SnapShot memory s = snapshots[_day];

            s.totalSupply = totalSupply;
            s.totalStakedAmount = globals.totalStakedAmount;
            

            snapshots[_day] = s;

            globals.currentFeyDay++;
        }

        emit SnapshotCaptured(
            totalSupply,
            globals.totalStakedAmount,
            _updateDay
        );
    }
}

File 9 of 10: Timing.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

import './Declaration.sol';

abstract contract Timing is Declaration {

    /**
    * @notice external view function to get current FeyDay, unless called at LAUNCH_TIME, in which case it will return 0 to save gas
    * @dev called by _currentFeyDay
    * @return current FeyDay
    */
    function currentFeyDay()
        public
        view
        returns (uint64)
    {
        return getNow() >= LAUNCH_TIME
            ? _currentFeyDay()
            : 0;
    }

    /**
    * @notice internal view function to calculate current FeyDay by using _feyDayFromStamp()
    * @dev called by snapshotTrigger(), manualDailySnapshot(), + getStakeInterest()
    * @return current FeyDay
    */
    function _currentFeyDay()
        internal
        view
        returns (uint64)
    {
        return _feyDayFromStamp(getNow());
    }

    /**
    * @notice calculates difference between passed timestamp + original LAUNCH_TIME, set when contract was deployed
    * @dev called by _currentFeyDay
    * @param _timestamp -- timestamp to use for difference
    * @return number of days between timestamp param + LAUNCH_TIME 
    */
    function _feyDayFromStamp(
        uint256 _timestamp
    )
        internal
        view
        returns (uint64)
    {
        return uint64((_timestamp - LAUNCH_TIME) / SECONDS_IN_DAY);
    }
    
    /**
    * @dev called by getStakeAge(), getStakePenalty, closeStake(), openStake(), + _currentFeyDay
    * @return current block.timestamp
    */
    function getNow()
        public
        view
        returns (uint256)
    {
        return block.timestamp;
    }

}

File 10 of 10: Token.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

import "./Snapshot.sol";

contract Token is Snapshot {

    using SafeMath for uint256;

    /**
    * @notice Moves amount tokens from the caller’s account to recipient.
    * Returns a boolean value indicating whether the operation succeeded.
    * @dev See {IERC20-transfer}.
    * Emits an {Transfer} event indicating a successful transfer.
    * @param _receiver -- recipient of amount
    * @param _amount -- amount that is transferred
    * @return true if transfer() succeeds
    */
    function transfer(
        address _receiver,
        uint256 _amount
    )
        external
        returns (bool)
    {
        require(
            _transferCheck(
                msg.sender,
                _receiver,
                _amount,
                false
            ),
            'Token: _transferCheck failed'
        );

        balances[msg.sender] =
        balances[msg.sender].sub(_amount);

        balances[_receiver] =
        balances[_receiver].add(_amount);

        emit Transfer(
            msg.sender,
            _receiver,
            _amount
        );

        return true;
    }

    /**
    * @notice Moves amount tokens from sender to recipient using the allowance mechanism. 
    * Amount is then deducted from the caller’s allowance.
    * Returns a boolean value indicating whether the operation succeeded.
    * @dev See {IERC20-transferFrom}.
    * Emits an {Transfer} event indicating a successful transfer.
    * @param _owner -- address who is sending the transfer amount
    * @param _receiver -- recipient of amount
    * @param _amount -- amount that is transferred
    * @return true if transferFrom() succeeds
     */
    function transferFrom(
        address _owner,
        address _receiver,
        uint256 _amount
    )
        external
        returns (bool)
    {
        require(
            _transferCheck(
                _owner,
                _receiver,
                _amount,
                false
            ),
            'Token: _transferCheck failed'
        );

        require(
            allowances[_owner][msg.sender] >= _amount,
            'Token: exceeding allowance'
        );

        allowances[_owner][msg.sender] =
        allowances[_owner][msg.sender].sub(_amount);

        balances[_owner] =
        balances[_owner].sub(_amount);

        balances[_receiver] =
        balances[_receiver].add(_amount);

        totalSupply =
        totalSupply.sub(_amount);

        emit Transfer(
            _owner,
            _receiver,
            _amount
        );

        return true;
    }

    /**
    * @notice Sets amount as the allowance of spender over the caller’s tokens.
    * @dev See {IERC20-approve}.
    * Emits an {Approval} event indicating how much was approved and whom is the spender
    * @param _spender -- approved address
    * @param _amount -- amount that they are approved to spend
    * @return true if Approve() succeeds
    */
    function approve(
        address _spender,
        uint256 _amount
    )
        external
        returns (bool)
    {
        allowances[msg.sender][_spender] = _amount;

        emit Approval(
            msg.sender,
            _spender,
            _amount
        );

        return true;
    }

    /**
    * @notice Returns the amount of tokens owned by account.
    * @dev See {IERC20-approve}.
    * @param _address -- address whose balance will be returned
    * @return balance[] value of the input address
    */
    function balanceOf(
        address _address
    )
        external
        view
        returns (uint256)
    {
        return balances[_address];
    }

    /**
    * @notice 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.
    * @dev See {IERC20-allowance}.
    * @param _owner -- owner address
    * @param _spender -- address that is approved to spend tokens
    * @return allowances[] value of the input addresses to reflect the value mapped to the _spender's address
    */
    function allowance(
        address _owner,
        address _spender
    )
        external
        view
        returns (uint256)
    {
        return allowances[_owner][_spender];
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"daysOld","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondsOld","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"ClosedGhostStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalStakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"_snapshotDay","type":"uint64"}],"name":"SnapshotCaptured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_stakingId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakeEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_stakingId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakeStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_invoker","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"ownershipChanged","type":"event"},{"inputs":[],"name":"LAUNCH_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STAKE_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_STAKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YEARLY_INTEREST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"closeGhostStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"closeStake","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"},{"internalType":"uint256","name":"interestAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentFeyDay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"estimateReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakedAmount","type":"uint256"},{"internalType":"uint256","name":"_totalStakedAmount","type":"uint256"},{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"getInterest","outputs":[{"internalType":"uint256","name":"durationInterestAmt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"getInterestRateYearly","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getNow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"},{"internalType":"uint256","name":"_precision","type":"uint256"}],"name":"getPercent","outputs":[{"internalType":"uint256","name":"quotient","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStakeAge","outputs":[{"internalType":"uint256","name":"daysTotal","type":"uint256"},{"internalType":"uint256","name":"secondsToday","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStakeInterest","outputs":[{"internalType":"uint256","name":"stakeInterest","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStakePenalty","outputs":[{"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStaking","outputs":[{"internalType":"uint256","name":"_stakedAmount","type":"uint256"},{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_returnAmount","type":"uint256"},{"internalType":"uint256","name":"interestAmount","type":"uint256"},{"internalType":"uint256","name":"_stakedAt","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_day","type":"uint256"}],"name":"getYearlyInterestHistorical","outputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"interestRateYearly","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getYearlyInterestLatest","outputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"interestRateYearly","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globals","outputs":[{"internalType":"uint256","name":"stakingId","type":"uint256"},{"internalType":"uint256","name":"currentFeyDay","type":"uint256"},{"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualDailySnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"openStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"percentCalculator","outputs":[{"internalType":"uint256","name":"percentageValue","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snapshots","outputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeList","outputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"interestAmount","type":"uint256"},{"internalType":"uint256","name":"stakedAt","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60e0604052600760a0819052664665796f72726160c81b60c09081526200002a9160019190620000aa565b506040805180820190915260038082526246455960e81b60209092019182526200005791600291620000aa565b5060126003556b033b2e3c9fd0803ce80000006004553480156200007a57600080fd5b50600080546001600160a01b03191633908117825542608052600454908252600560205260409091205562000156565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620000e257600085556200012d565b82601f10620000fd57805160ff19168380011785556200012d565b828001600101855582156200012d579182015b828111156200012d57825182559160200191906001019062000110565b506200013b9291506200013f565b5090565b5b808211156200013b576000815560010162000140565b60805161202c6200017b6000398061078f52806111ec5280611f0f525061202c6000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806355b6ed5c1161013b578063a9059cbb116100b8578063d6565a2d1161007c578063d6565a2d146106eb578063dd62ed3e14610708578063e498484c14610736578063f67e675614610753578063f7d623bb146107705761023d565b8063a9059cbb1461066c578063bbe4fd5014610698578063bd5bf4ce146106a0578063c3124525146106db578063d2e6bcfa146106e35761023d565b80638da5cb5b116100ff5780638da5cb5b146105d25780638f2dbc21146105f657806395d89b411461061b57806399d0cfa114610623578063a6f9dae1146106465761023d565b806355b6ed5c1461055157806358ff4ddd1461057f578063613fc9fd1461059c57806361a52a36146105a457806370a08231146105ac5761023d565b806323b872dd116101c9578063313ce5671161018d578063313ce5671461045957806331eb3f37146104615780633a6088db146104bb57806342966c68146104d85780634c86259e146104f55761023d565b806323b872dd146103ad57806325c01505146103e357806326986d3f1461040257806327e235e31461040a578063291ab43b146104305761023d565b80630eb1bc08116102105780630eb1bc081461032157806317f4cb8b1461032957806318160ddd146103465780631c89edc71461034e5780631df5b4d2146103845761023d565b8063022466b51461024257806306fdde031461025c57806308dbbb03146102d9578063095ea7b3146102e1575b600080fd5b61024a61078d565b60408051918252519081900360200190f35b6102646107b1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029e578181015183820152602001610286565b50505050905090810190601f1680156102cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024a61083e565b61030d600480360360408110156102f757600080fd5b506001600160a01b03813516906020013561084b565b604080519115158252519081900360200190f35b61024a6108b2565b61024a6004803603602081101561033f57600080fd5b50356108b8565b61024a6109a8565b61036b6004803603602081101561036457600080fd5b50356109ae565b6040805192835260208301919091528051918290030190f35b61024a6004803603606081101561039a57600080fd5b5080359060208101359060400135610a24565b61030d600480360360608110156103c357600080fd5b506001600160a01b03813581169160208101359091169060400135610a86565b610400600480360360208110156103f957600080fd5b5035610c5a565b005b61024a610d7c565b61024a6004803603602081101561042057600080fd5b50356001600160a01b0316610d82565b61024a6004803603606081101561044657600080fd5b5080359060208101359060400135610d94565b61024a610dc0565b61047e6004803603602081101561047757600080fd5b5035610dc6565b604080519687526001600160a01b0390951660208701528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b61024a600480360360208110156104d157600080fd5b5035610e52565b61030d600480360360208110156104ee57600080fd5b5035610f68565b6105126004803603602081101561050b57600080fd5b503561109d565b604080516001600160a01b03909716875260208701959095528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b61024a6004803603604081101561056757600080fd5b506001600160a01b03813581169160200135166110df565b61024a6004803603602081101561059557600080fd5b50356110fc565b6104006111a5565b61024a6111b7565b61024a600480360360208110156105c257600080fd5b50356001600160a01b03166111be565b6105da6111d9565b604080516001600160a01b039092168252519081900360200190f35b6105fe6111e8565b6040805167ffffffffffffffff9092168252519081900360200190f35b61026461122d565b61024a6004803603604081101561063957600080fd5b5080359060200135611285565b61030d6004803603602081101561065c57600080fd5b50356001600160a01b0316611297565b61030d6004803603604081101561068257600080fd5b506001600160a01b03813516906020013561139f565b61024a611491565b6106bd600480360360208110156106b657600080fd5b5035611495565b60408051938452602084019290925282820152519081900360600190f35b6106bd6117a9565b61036b6117b5565b61036b6004803603602081101561070157600080fd5b50356117dc565b61024a6004803603604081101561071e57600080fd5b506001600160a01b03813581169160200135166117f5565b61024a6004803603602081101561074c57600080fd5b5035611820565b61036b6004803603602081101561076957600080fd5b503561183f565b61030d6004803603602081101561078657600080fd5b5035611900565b7f000000000000000000000000000000000000000000000000000000000000000081565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108365780601f1061080b57610100808354040283529160200191610836565b820191906000526020600020905b81548152906001019060200180831161081957829003601f168201915b505050505081565b68056bc75e2d6310000081565b3360008181526006602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b61019a81565b60006108c2611f35565b506000828152600860209081526040808320815160c08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460ff16151560a083015290919061094b9062015180906109459061093f611491565b90611b24565b90611b81565b9050600f81101561096d5761096682602001516102ee611285565b92506109a1565b601e8110156109865761096682602001516101f4611285565b602d8110156109a15761099e826020015160fa611285565b92505b5050919050565b60045481565b6000806109b9611f76565b5060008381526007602090815260409182902082518084019093528054808452600190910154918301919091526109fc576109f26117b5565b9250925050610a1f565b610a10816020015182600001516004610d94565b9250610a1b83611820565b9150505b915091565b600080610a35846004546004610d94565b90506000610a4282611820565b90506000610a5560646109458985611beb565b90506000610a69826301e185586000610d94565b9050610a7a60646109458389611beb565b98975050505050505050565b6000610a958484846000611c44565b610ae6576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e3a205f7472616e73666572436865636b206661696c656400000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600660209081526040808320338452909152902054821115610b5e576040805162461bcd60e51b815260206004820152601a60248201527f546f6b656e3a20657863656564696e6720616c6c6f77616e6365000000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600660209081526040808320338452909152902054610b8c9083611b24565b6001600160a01b038516600081815260066020908152604080832033845282528083209490945591815260059091522054610bc79083611b24565b6001600160a01b038086166000908152600560205260408082209390935590851681522054610bf69083611d7e565b6001600160a01b038416600090815260056020526040902055600454610c1c9083611b24565b6004556040805183815290516001600160a01b038086169290871691600080516020611fb28339815191529181900360200190a35060019392505050565b6000546001600160a01b03163314610cb6576040805162461bcd60e51b815260206004820152601a60248201527927bbb730b136329d1036bab9ba103132903a34329037bbb732b960311b604482015290519081900360640190fd5b600080610cc28361183f565b9150915061072182148015610cd957506201518081145b610d2a576040805162461bcd60e51b815260206004820152601860248201527f464559546f6b656e3a206e6f74206f6c6420656e6f7567680000000000000000604482015290519081900360640190fd5b610d3383611495565b5050604080518481526020810184905280820186905290517f9fb5c0857986c4f071d2fdb4e3d5e9a116bb3be34ecc8a4ca1abe6a886d098d292509081900360600190a1505050565b61072181565b60056020526000908152604090205481565b600060018201600a90810a850290848281610dab57fe5b0460050181610db657fe5b0495945050505050565b60035481565b600080600080600080610dd7611f35565b5050506000948552505060086020908152604093849020845160c08101865281546001600160a01b03168082526001830154938201849052600283015496820187905260038301546060830181905260048401546080840181905260059094015460ff16151560a09093018390529397909695509293509091565b6000610e5c611f35565b50600082815260086020908152604091829020825160c08101845281546001600160a01b03168152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015260059091015460ff16151560a08201819052610ed25780606001519150610f62565b600080610ede8561183f565b915091506000610eec611dd8565b67ffffffffffffffff1690506000610f048285611b24565b9050805b82811015610f4457610f388660200151600760008481526020019081526020016000206001015462015180610a24565b90960195600101610f08565b50610f59856020015160096002015485610a24565b86019550505050505b50919050565b600080546001600160a01b03163314610fc5576040805162461bcd60e51b815260206004820152601a60248201527927bbb730b136329d1036bab9ba103132903a34329037bbb732b960311b604482015290519081900360640190fd5b33600090815260056020526040812054610fdf9084611b24565b1015611032576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a20657863656564696e672062616c616e63650000000000604482015290519081900360640190fd5b60045461103f9083611b24565b6004553360009081526005602052604090205461105c9083611b24565b33600081815260056020908152604080832094909455835186815293519193600080516020611fb2833981519152929081900390910190a35060015b919050565b6008602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039094169492939192909160ff1686565b600660209081526000928352604080842090915290825290205481565b6000611106611f35565b50600082815260086020908152604091829020825160c08101845281546001600160a01b03168152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015260059091015460ff16151560a0820181905261117b57604001519050611098565b61119e611187846108b8565b61093f61119386610e52565b602085015190611d7e565b9392505050565b6111b56111b0611dd8565b611dea565b565b6201518081565b6001600160a01b031660009081526005602052604090205490565b6000546001600160a01b031681565b60007f0000000000000000000000000000000000000000000000000000000000000000611213611491565b1015611220576000611228565b611228611dd8565b905090565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156108365780601f1061080b57610100808354040283529160200191610836565b600061119e6127106109458585611beb565b600080546001600160a01b031633146112f4576040805162461bcd60e51b815260206004820152601a60248201527927bbb730b136329d1036bab9ba103132903a34329037bbb732b960311b604482015290519081900360640190fd5b6001600160a01b03821661134f576040805162461bcd60e51b815260206004820152601860248201527f4f776e61626c653a20696e76616c696420616464726573730000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0384169081178255604051909133917f5d92051b4a9b6e7154c5be37e18edd17bfd2e650a3a6dbf8c3eded0ef431ff0e9190a3506001919050565b60006113ae3384846000611c44565b6113ff576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e3a205f7472616e73666572436865636b206661696c656400000000604482015290519081900360640190fd5b336000908152600560205260409020546114199083611b24565b33600090815260056020526040808220929092556001600160a01b038516815220546114459083611d7e565b6001600160a01b038416600081815260056020908152604091829020939093558051858152905191923392600080516020611fb28339815191529281900390910190a350600192915050565b4290565b60008060006114a56111b0611dd8565b6114ad611f35565b506000848152600860209081526040808320815160c08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460ff16151560a083015290919061152a9062015180906109459061093f611491565b90506003811015611582576040805162461bcd60e51b815260206004820152601860248201527f464559546f6b656e3a20696d6d6174757265207374616b650000000000000000604482015290519081900360640190fd5b81516001600160a01b031633146115e0576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a2077726f6e67207374616b65206f776e65720000000000604482015290519081900360640190fd5b8160a00151611636576040805162461bcd60e51b815260206004820152601a60248201527f464559546f6b656e3a207374616b65206e6f7420616374697665000000000000604482015290519081900360640190fd5b600060a083015260208201519450602d81106116585761165586610e52565b92505b611661866108b8565b935061167c8461093f85600454611d7e90919063ffffffff16565b600455606082018390526116948461093f8786611d7e565b6040838101918252600088815260086020908152828220865181546001600160a01b0319166001600160a01b03909116178155818701516001820155935160028501819055606087015160038601556080870151600486015560a08701516005958601805460ff1916911515919091179055338352939052205461171791611d7e565b33600090815260056020526040902055600b546117349086611b24565b600b5560408083015181513381526020810191909152815188927f1400fbd2ee4a2075080df3e8fe9550cae0dab5bd1d037452a12390141e45563d928290030190a2604080830151815190815290513391600091600080516020611fb28339815191529181900360200190a350509193909250565b600954600a54600b5483565b6000806117cb6009600201546004546004610d94565b91506117d682611820565b90509091565b6007602052600090815260409020805460019091015482565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b60006108ac606461094561183661271086611b24565b61019a90611beb565b60008061184a611f35565b506000838152600860209081526040808320815160c08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460ff16151560a08301529091906118be9061093f611491565b90506118cd8162015180611b81565b93506107218411156118e95761072193506201518092506118f9565b6118f68162015180611ea4565b92505b5050915091565b600061190d6111b0611dd8565b61191b336000846001611c44565b61196c576040805162461bcd60e51b815260206004820152601f60248201527f464559546f6b656e3a205f7472616e73666572436865636b206661696c656400604482015290519081900360640190fd5b68056bc75e2d631000008210156119ca576040805162461bcd60e51b815260206004820152601d60248201527f464559546f6b656e3a207374616b652062656c6f77206d696e696d756d000000604482015290519081900360640190fd5b336000908152600560205260409020546119e49083611b24565b33600081815260056020908152604080832094909455835160c0810185529283528201859052918101829052606081019190915260808101611a24611491565b815260016020918201819052600954600090815260088352604090819020845181546001600160a01b0319166001600160a01b0390911617815592840151918301919091558201516002820155606082015160038201556080820151600482015560a0909101516005909101805460ff1916911515919091179055600b54611aac9083611d7e565b600b55600954604080513381526020810185905281517f32705d413ffd76af5104215480a9b5784ae0349bc7fd042427e7f186d3bee6a2929181900390910190a26040805183815290516000913391600080516020611fb28339815191529181900360200190a3506001600980546001019055919050565b600082821115611b7b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808211611bd7576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611be257fe5b04949350505050565b600082611bfa575060006108ac565b82820282848281611c0757fe5b041461119e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f916021913960400191505060405180910390fd5b600081611c90576001600160a01b038416611c905760405162461bcd60e51b8152600401808060200182810382526025815260200180611fd26025913960400191505060405180910390fd5b6001600160a01b038516600090815260056020526040902054831115611cfd576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a20657863656564696e672062616c616e63650000000000604482015290519081900360640190fd5b6001600160a01b038416600090815260056020526040902054611d208185611d7e565b1015611d73576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a206f766572666c6f772064657465637465640000000000604482015290519081900360640190fd5b506001949350505050565b60008282018381101561119e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000611228611de5611491565b611f09565b600a545b8167ffffffffffffffff16811015611e5157611e08611f76565b50600081815260076020818152604080842081518083019092526004548252600b5482840190815294869052929091525181559051600191820155600a80548201905501611dee565b50600454600b5460408051928352602083019190915267ffffffffffffffff831682820152517f94a13e9f9a91f7369c805b3cd3ffa4ae084c462ce95a364deeb1db54b4672f879181900360600190a150565b600081611ef8576040805162461bcd60e51b815260206004820152601860248201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604482015290519081900360640190fd5b818381611f0157fe5b069392505050565b620151807f00000000000000000000000000000000000000000000000000000000000000009091030490565b6040518060c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581525090565b60405180604001604052806000815260200160008152509056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef464559546f6b656e3a2063616e6e6f742073656e6420746f206275726e2061646472657373a2646970667358221220ee81112f7e49526cac766284f4fe32348ac982671dec0c69fb51391747b91b7364736f6c63430007050033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c806355b6ed5c1161013b578063a9059cbb116100b8578063d6565a2d1161007c578063d6565a2d146106eb578063dd62ed3e14610708578063e498484c14610736578063f67e675614610753578063f7d623bb146107705761023d565b8063a9059cbb1461066c578063bbe4fd5014610698578063bd5bf4ce146106a0578063c3124525146106db578063d2e6bcfa146106e35761023d565b80638da5cb5b116100ff5780638da5cb5b146105d25780638f2dbc21146105f657806395d89b411461061b57806399d0cfa114610623578063a6f9dae1146106465761023d565b806355b6ed5c1461055157806358ff4ddd1461057f578063613fc9fd1461059c57806361a52a36146105a457806370a08231146105ac5761023d565b806323b872dd116101c9578063313ce5671161018d578063313ce5671461045957806331eb3f37146104615780633a6088db146104bb57806342966c68146104d85780634c86259e146104f55761023d565b806323b872dd146103ad57806325c01505146103e357806326986d3f1461040257806327e235e31461040a578063291ab43b146104305761023d565b80630eb1bc08116102105780630eb1bc081461032157806317f4cb8b1461032957806318160ddd146103465780631c89edc71461034e5780631df5b4d2146103845761023d565b8063022466b51461024257806306fdde031461025c57806308dbbb03146102d9578063095ea7b3146102e1575b600080fd5b61024a61078d565b60408051918252519081900360200190f35b6102646107b1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029e578181015183820152602001610286565b50505050905090810190601f1680156102cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024a61083e565b61030d600480360360408110156102f757600080fd5b506001600160a01b03813516906020013561084b565b604080519115158252519081900360200190f35b61024a6108b2565b61024a6004803603602081101561033f57600080fd5b50356108b8565b61024a6109a8565b61036b6004803603602081101561036457600080fd5b50356109ae565b6040805192835260208301919091528051918290030190f35b61024a6004803603606081101561039a57600080fd5b5080359060208101359060400135610a24565b61030d600480360360608110156103c357600080fd5b506001600160a01b03813581169160208101359091169060400135610a86565b610400600480360360208110156103f957600080fd5b5035610c5a565b005b61024a610d7c565b61024a6004803603602081101561042057600080fd5b50356001600160a01b0316610d82565b61024a6004803603606081101561044657600080fd5b5080359060208101359060400135610d94565b61024a610dc0565b61047e6004803603602081101561047757600080fd5b5035610dc6565b604080519687526001600160a01b0390951660208701528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b61024a600480360360208110156104d157600080fd5b5035610e52565b61030d600480360360208110156104ee57600080fd5b5035610f68565b6105126004803603602081101561050b57600080fd5b503561109d565b604080516001600160a01b03909716875260208701959095528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b61024a6004803603604081101561056757600080fd5b506001600160a01b03813581169160200135166110df565b61024a6004803603602081101561059557600080fd5b50356110fc565b6104006111a5565b61024a6111b7565b61024a600480360360208110156105c257600080fd5b50356001600160a01b03166111be565b6105da6111d9565b604080516001600160a01b039092168252519081900360200190f35b6105fe6111e8565b6040805167ffffffffffffffff9092168252519081900360200190f35b61026461122d565b61024a6004803603604081101561063957600080fd5b5080359060200135611285565b61030d6004803603602081101561065c57600080fd5b50356001600160a01b0316611297565b61030d6004803603604081101561068257600080fd5b506001600160a01b03813516906020013561139f565b61024a611491565b6106bd600480360360208110156106b657600080fd5b5035611495565b60408051938452602084019290925282820152519081900360600190f35b6106bd6117a9565b61036b6117b5565b61036b6004803603602081101561070157600080fd5b50356117dc565b61024a6004803603604081101561071e57600080fd5b506001600160a01b03813581169160200135166117f5565b61024a6004803603602081101561074c57600080fd5b5035611820565b61036b6004803603602081101561076957600080fd5b503561183f565b61030d6004803603602081101561078657600080fd5b5035611900565b7f000000000000000000000000000000000000000000000000000000005fc3ac4f81565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108365780601f1061080b57610100808354040283529160200191610836565b820191906000526020600020905b81548152906001019060200180831161081957829003601f168201915b505050505081565b68056bc75e2d6310000081565b3360008181526006602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b61019a81565b60006108c2611f35565b506000828152600860209081526040808320815160c08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460ff16151560a083015290919061094b9062015180906109459061093f611491565b90611b24565b90611b81565b9050600f81101561096d5761096682602001516102ee611285565b92506109a1565b601e8110156109865761096682602001516101f4611285565b602d8110156109a15761099e826020015160fa611285565b92505b5050919050565b60045481565b6000806109b9611f76565b5060008381526007602090815260409182902082518084019093528054808452600190910154918301919091526109fc576109f26117b5565b9250925050610a1f565b610a10816020015182600001516004610d94565b9250610a1b83611820565b9150505b915091565b600080610a35846004546004610d94565b90506000610a4282611820565b90506000610a5560646109458985611beb565b90506000610a69826301e185586000610d94565b9050610a7a60646109458389611beb565b98975050505050505050565b6000610a958484846000611c44565b610ae6576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e3a205f7472616e73666572436865636b206661696c656400000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600660209081526040808320338452909152902054821115610b5e576040805162461bcd60e51b815260206004820152601a60248201527f546f6b656e3a20657863656564696e6720616c6c6f77616e6365000000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600660209081526040808320338452909152902054610b8c9083611b24565b6001600160a01b038516600081815260066020908152604080832033845282528083209490945591815260059091522054610bc79083611b24565b6001600160a01b038086166000908152600560205260408082209390935590851681522054610bf69083611d7e565b6001600160a01b038416600090815260056020526040902055600454610c1c9083611b24565b6004556040805183815290516001600160a01b038086169290871691600080516020611fb28339815191529181900360200190a35060019392505050565b6000546001600160a01b03163314610cb6576040805162461bcd60e51b815260206004820152601a60248201527927bbb730b136329d1036bab9ba103132903a34329037bbb732b960311b604482015290519081900360640190fd5b600080610cc28361183f565b9150915061072182148015610cd957506201518081145b610d2a576040805162461bcd60e51b815260206004820152601860248201527f464559546f6b656e3a206e6f74206f6c6420656e6f7567680000000000000000604482015290519081900360640190fd5b610d3383611495565b5050604080518481526020810184905280820186905290517f9fb5c0857986c4f071d2fdb4e3d5e9a116bb3be34ecc8a4ca1abe6a886d098d292509081900360600190a1505050565b61072181565b60056020526000908152604090205481565b600060018201600a90810a850290848281610dab57fe5b0460050181610db657fe5b0495945050505050565b60035481565b600080600080600080610dd7611f35565b5050506000948552505060086020908152604093849020845160c08101865281546001600160a01b03168082526001830154938201849052600283015496820187905260038301546060830181905260048401546080840181905260059094015460ff16151560a09093018390529397909695509293509091565b6000610e5c611f35565b50600082815260086020908152604091829020825160c08101845281546001600160a01b03168152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015260059091015460ff16151560a08201819052610ed25780606001519150610f62565b600080610ede8561183f565b915091506000610eec611dd8565b67ffffffffffffffff1690506000610f048285611b24565b9050805b82811015610f4457610f388660200151600760008481526020019081526020016000206001015462015180610a24565b90960195600101610f08565b50610f59856020015160096002015485610a24565b86019550505050505b50919050565b600080546001600160a01b03163314610fc5576040805162461bcd60e51b815260206004820152601a60248201527927bbb730b136329d1036bab9ba103132903a34329037bbb732b960311b604482015290519081900360640190fd5b33600090815260056020526040812054610fdf9084611b24565b1015611032576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a20657863656564696e672062616c616e63650000000000604482015290519081900360640190fd5b60045461103f9083611b24565b6004553360009081526005602052604090205461105c9083611b24565b33600081815260056020908152604080832094909455835186815293519193600080516020611fb2833981519152929081900390910190a35060015b919050565b6008602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039094169492939192909160ff1686565b600660209081526000928352604080842090915290825290205481565b6000611106611f35565b50600082815260086020908152604091829020825160c08101845281546001600160a01b03168152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015260059091015460ff16151560a0820181905261117b57604001519050611098565b61119e611187846108b8565b61093f61119386610e52565b602085015190611d7e565b9392505050565b6111b56111b0611dd8565b611dea565b565b6201518081565b6001600160a01b031660009081526005602052604090205490565b6000546001600160a01b031681565b60007f000000000000000000000000000000000000000000000000000000005fc3ac4f611213611491565b1015611220576000611228565b611228611dd8565b905090565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156108365780601f1061080b57610100808354040283529160200191610836565b600061119e6127106109458585611beb565b600080546001600160a01b031633146112f4576040805162461bcd60e51b815260206004820152601a60248201527927bbb730b136329d1036bab9ba103132903a34329037bbb732b960311b604482015290519081900360640190fd5b6001600160a01b03821661134f576040805162461bcd60e51b815260206004820152601860248201527f4f776e61626c653a20696e76616c696420616464726573730000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0384169081178255604051909133917f5d92051b4a9b6e7154c5be37e18edd17bfd2e650a3a6dbf8c3eded0ef431ff0e9190a3506001919050565b60006113ae3384846000611c44565b6113ff576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e3a205f7472616e73666572436865636b206661696c656400000000604482015290519081900360640190fd5b336000908152600560205260409020546114199083611b24565b33600090815260056020526040808220929092556001600160a01b038516815220546114459083611d7e565b6001600160a01b038416600081815260056020908152604091829020939093558051858152905191923392600080516020611fb28339815191529281900390910190a350600192915050565b4290565b60008060006114a56111b0611dd8565b6114ad611f35565b506000848152600860209081526040808320815160c08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460ff16151560a083015290919061152a9062015180906109459061093f611491565b90506003811015611582576040805162461bcd60e51b815260206004820152601860248201527f464559546f6b656e3a20696d6d6174757265207374616b650000000000000000604482015290519081900360640190fd5b81516001600160a01b031633146115e0576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a2077726f6e67207374616b65206f776e65720000000000604482015290519081900360640190fd5b8160a00151611636576040805162461bcd60e51b815260206004820152601a60248201527f464559546f6b656e3a207374616b65206e6f7420616374697665000000000000604482015290519081900360640190fd5b600060a083015260208201519450602d81106116585761165586610e52565b92505b611661866108b8565b935061167c8461093f85600454611d7e90919063ffffffff16565b600455606082018390526116948461093f8786611d7e565b6040838101918252600088815260086020908152828220865181546001600160a01b0319166001600160a01b03909116178155818701516001820155935160028501819055606087015160038601556080870151600486015560a08701516005958601805460ff1916911515919091179055338352939052205461171791611d7e565b33600090815260056020526040902055600b546117349086611b24565b600b5560408083015181513381526020810191909152815188927f1400fbd2ee4a2075080df3e8fe9550cae0dab5bd1d037452a12390141e45563d928290030190a2604080830151815190815290513391600091600080516020611fb28339815191529181900360200190a350509193909250565b600954600a54600b5483565b6000806117cb6009600201546004546004610d94565b91506117d682611820565b90509091565b6007602052600090815260409020805460019091015482565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b60006108ac606461094561183661271086611b24565b61019a90611beb565b60008061184a611f35565b506000838152600860209081526040808320815160c08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460ff16151560a08301529091906118be9061093f611491565b90506118cd8162015180611b81565b93506107218411156118e95761072193506201518092506118f9565b6118f68162015180611ea4565b92505b5050915091565b600061190d6111b0611dd8565b61191b336000846001611c44565b61196c576040805162461bcd60e51b815260206004820152601f60248201527f464559546f6b656e3a205f7472616e73666572436865636b206661696c656400604482015290519081900360640190fd5b68056bc75e2d631000008210156119ca576040805162461bcd60e51b815260206004820152601d60248201527f464559546f6b656e3a207374616b652062656c6f77206d696e696d756d000000604482015290519081900360640190fd5b336000908152600560205260409020546119e49083611b24565b33600081815260056020908152604080832094909455835160c0810185529283528201859052918101829052606081019190915260808101611a24611491565b815260016020918201819052600954600090815260088352604090819020845181546001600160a01b0319166001600160a01b0390911617815592840151918301919091558201516002820155606082015160038201556080820151600482015560a0909101516005909101805460ff1916911515919091179055600b54611aac9083611d7e565b600b55600954604080513381526020810185905281517f32705d413ffd76af5104215480a9b5784ae0349bc7fd042427e7f186d3bee6a2929181900390910190a26040805183815290516000913391600080516020611fb28339815191529181900360200190a3506001600980546001019055919050565b600082821115611b7b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808211611bd7576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611be257fe5b04949350505050565b600082611bfa575060006108ac565b82820282848281611c0757fe5b041461119e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f916021913960400191505060405180910390fd5b600081611c90576001600160a01b038416611c905760405162461bcd60e51b8152600401808060200182810382526025815260200180611fd26025913960400191505060405180910390fd5b6001600160a01b038516600090815260056020526040902054831115611cfd576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a20657863656564696e672062616c616e63650000000000604482015290519081900360640190fd5b6001600160a01b038416600090815260056020526040902054611d208185611d7e565b1015611d73576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a206f766572666c6f772064657465637465640000000000604482015290519081900360640190fd5b506001949350505050565b60008282018381101561119e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000611228611de5611491565b611f09565b600a545b8167ffffffffffffffff16811015611e5157611e08611f76565b50600081815260076020818152604080842081518083019092526004548252600b5482840190815294869052929091525181559051600191820155600a80548201905501611dee565b50600454600b5460408051928352602083019190915267ffffffffffffffff831682820152517f94a13e9f9a91f7369c805b3cd3ffa4ae084c462ce95a364deeb1db54b4672f879181900360600190a150565b600081611ef8576040805162461bcd60e51b815260206004820152601860248201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604482015290519081900360640190fd5b818381611f0157fe5b069392505050565b620151807f000000000000000000000000000000000000000000000000000000005fc3ac4f9091030490565b6040518060c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581525090565b60405180604001604052806000815260200160008152509056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef464559546f6b656e3a2063616e6e6f742073656e6420746f206275726e2061646472657373a2646970667358221220ee81112f7e49526cac766284f4fe32348ac982671dec0c69fb51391747b91b7364736f6c63430007050033

Deployed Bytecode Sourcemap

88:14787:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;464:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;103:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;308:46;;;:::i;3013:300:9:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3013:300:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;257:45:0;;;:::i;7574:836:2:-;;;;;;;;;;;;;;;;-1:-1:-1;7574:836:2;;:::i;208:42:0:-;;;:::i;1860:545:2:-;;;;;;;;;;;;;;;;-1:-1:-1;1860:545:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3042:752;;;;;;;;;;;;;;;;-1:-1:-1;3042:752:2;;;;;;;;;;;;:::i;1738:904:9:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1738:904:9;;;;;;;;;;;;;;;;;:::i;4059:473:2:-;;;;;;;;;;;;;;;;-1:-1:-1;4059:473:2;;:::i;:::-;;412:45:0;;;:::i;924:43::-;;;;;;;;;;;;;;;;-1:-1:-1;924:43:0;-1:-1:-1;;;;;924:43:0;;:::i;2477:308:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2477:308:3;;;;;;;;;;;;:::i;174:28:0:-;;;:::i;14224:649:2:-;;;;;;;;;;;;;;;;-1:-1:-1;14224:649:2;;:::i;:::-;;;;;;;-1:-1:-1;;;;;14224:649:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5936:1058;;;;;;;;;;;;;;;;-1:-1:-1;5936:1058:2;;:::i;441:494:3:-;;;;;;;;;;;;;;;;-1:-1:-1;441:494:3;;:::i;1096:49:0:-;;;;;;;;;;;;;;;;-1:-1:-1;1096:49:0;;:::i;:::-;;;;-1:-1:-1;;;;;1096:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;973:65;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;973:65:0;;;;;;;;;;:::i;8831:433:2:-;;;;;;;;;;;;;;;;-1:-1:-1;8831:433:2;;:::i;495:129:7:-;;;:::i;360:46:0:-;;;:::i;3543:153:9:-;;;;;;;;;;;;;;;;-1:-1:-1;3543:153:9;-1:-1:-1;;;;;3543:153:9;;:::i;89:20:5:-;;;:::i;:::-;;;;-1:-1:-1;;;;;89:20:5;;;;;;;;;;;;;;354:176:8;;;:::i;:::-;;;;;;;;;;;;;;;;;;;139:28:0;;;:::i;3121:243:3:-;;;;;;;;;;;;;;;;-1:-1:-1;3121:243:3;;;;;;;:::i;422:376:5:-;;;;;;;;;;;;;;;;-1:-1:-1;422:376:5;-1:-1:-1;;;;;422:376:5;;:::i;562:615:9:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;562:615:9;;;;;;;;:::i;1546:115:8:-;;;:::i;10112:1808:2:-;;;;;;;;;;;;;;;;-1:-1:-1;10112:1808:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1152:22:0;;;:::i;1119:382:2:-;;;:::i;1045:45:0:-;;;;;;;;;;;;;;;;-1:-1:-1;1045:45:0;;:::i;4195:187:9:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4195:187:9;;;;;;;;;;:::i;551:257:2:-;;;;;;;;;;;;;;;;-1:-1:-1;551:257:2;;:::i;4923:637::-;;;;;;;;;;;;;;;;-1:-1:-1;4923:637:2;;:::i;12522:1053::-;;;;;;;;;;;;;;;;-1:-1:-1;12522:1053:2;;:::i;464:36:0:-;;;:::o;103:30::-;;;;;;;;;;;;;;;-1:-1:-1;;103:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;308:46::-;348:6;308:46;:::o;3013:300:9:-;3152:10;3121:4;3141:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3141:32:9;;;;;;;;;;;:42;;;3199:85;;;;;;;3121:4;;3141:32;;3152:10;;3199:85;;;;;;;;-1:-1:-1;3302:4:9;3013:300;;;;;:::o;257:45:0:-;299:3;257:45;:::o;7574:836:2:-;7678:21;7715:33;;:::i;:::-;-1:-1:-1;7751:21:2;;;;:9;:21;;;;;;;;7715:57;;;;;;;;;-1:-1:-1;;;;;7715:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7751:21;7808:82;;401:5:0;;7808:49:2;;:8;:6;:8::i;:::-;:25;;:49::i;:::-;:66;;:82::i;:::-;7783:107;;7922:2;7905:14;:19;7901:503;;;7957:96;7992:13;:26;;;8036:3;7957:17;:96::i;:::-;7941:112;;7901:503;;;8092:2;8075:14;:19;8071:333;;;8127:96;8162:13;:26;;;8206:3;8127:17;:96::i;8071:333::-;8262:2;8245:14;:19;8241:163;;;8297:96;8332:13;:26;;;8376:3;8297:17;:96::i;:::-;8281:112;;8241:163;7574:836;;;;;:::o;208:42:0:-;;;;:::o;1860:545:2:-;1983:18;2015:26;2066:17;;:::i;:::-;-1:-1:-1;2086:15:2;;;;:9;:15;;;;;;;;;2066:35;;;;;;;;;;;;;;;;;;;;;;;;;2112:81;;2157:25;:23;:25::i;:::-;2150:32;;;;;;;2112:81;2216:95;2240:1;:19;;;2273:1;:13;;;2300:1;2216:10;:95::i;:::-;2203:108;;2343:55;2378:10;2343:21;:55::i;:::-;2322:76;;1860:545;;;;;:::o;3042:752::-;3207:27;3250:18;3271:92;3295:18;3327:11;;3352:1;3271:10;:92::i;:::-;3250:113;;3374:26;3403:55;3438:10;3403:21;:55::i;:::-;3374:84;-1:-1:-1;3469:22:2;3494:72;3562:3;3494:50;:13;3374:84;3494:30;:50::i;:72::-;3469:97;;3577:24;3604:85;3628:14;3656:8;3678:1;3604:10;:85::i;:::-;3577:112;-1:-1:-1;3722:65:2;3783:3;3722:43;3577:112;3756:8;3722:33;:43::i;:65::-;3700:87;3042:752;-1:-1:-1;;;;;;;;3042:752:2:o;1738:904:9:-;1876:4;1917:127;1949:6;1973:9;2000:7;2025:5;1917:14;:127::i;:::-;1896:202;;;;;-1:-1:-1;;;1896:202:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2130:18:9;;;;;;:10;:18;;;;;;;;2149:10;2130:30;;;;;;;;:41;-1:-1:-1;2130:41:9;2109:114;;;;;-1:-1:-1;;;2109:114:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2275:18:9;;;;;;:10;:18;;;;;;;;2294:10;2275:30;;;;;;;;:43;;2310:7;2275:34;:43::i;:::-;-1:-1:-1;;;;;2234:18:9;;;;;;:10;:18;;;;;;;;2253:10;2234:30;;;;;;;:84;;;;2356:16;;;:8;:16;;;;;:29;;2377:7;2356:20;:29::i;:::-;-1:-1:-1;;;;;2329:16:9;;;;;;;:8;:16;;;;;;:56;;;;2426:19;;;;;;;:32;;2450:7;2426:23;:32::i;:::-;-1:-1:-1;;;;;2396:19:9;;;;;;:8;:19;;;;;:62;2491:11;;:24;;2507:7;2491:15;:24::i;:::-;2469:11;:46;2531:82;;;;;;;;-1:-1:-1;;;;;2531:82:9;;;;;;;;-1:-1:-1;;;;;;;;;;;2531:82:9;;;;;;;;-1:-1:-1;2631:4:9;1738:904;;;;;:::o;4059:473:2:-;341:5:5;;-1:-1:-1;;;;;341:5:5;327:10;:19;306:92;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;;;;4168:15:2::1;4185:18:::0;4207:23:::1;4219:10;4207:11;:23::i;:::-;4167:63;;;;453:4:0;4262:7:2;:25;:69;;;;;401:5:0;4303:10:2;:28;4262:69;4241:140;;;::::0;;-1:-1:-1;;;4241:140:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;4392:22;4403:10;4392;:22::i;:::-;-1:-1:-1::0;;4430:95:2::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;4430:95:2;;;;;;;::::1;408:1:5;;4059:473:2::0;:::o;412:45:0:-;453:4;412:45;:::o;924:43::-;;;;;;;;;;;;;:::o;2477:308:3:-;2633:16;2718:1;2705:14;;2698:2;:22;;;2685:35;;;2755:12;2685:35;2755:12;2743:24;;;;;2771:1;2742:30;2741:37;;;;;;;2477:308;-1:-1:-1;;;;;2477:308:3:o;174:28:0:-;;;;:::o;14224:649:2:-;14338:21;14373:20;14407:21;14442:22;14478:17;14509:14;14548:33;;:::i;:::-;-1:-1:-1;;;14584:21:2;;;;-1:-1:-1;;14584:9:2;:21;;;;;;;;;14548:57;;;;;;;;;-1:-1:-1;;;;;14548:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14548:57:2;;-1:-1:-1;14548:57:2;;14224:649::o;5936:1058::-;6054:21;6100:33;;:::i;:::-;-1:-1:-1;6136:21:2;;;;:9;:21;;;;;;;;;6100:57;;;;;;;;;-1:-1:-1;;;;;6100:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6168:820;;6236:13;:28;;;6220:44;;6168:820;;;6315:17;6350:20;6387:23;6399:10;6387:11;:23::i;:::-;6297:113;;;;6425:16;6444;:14;:16::i;:::-;6425:35;;;-1:-1:-1;6474:16:2;6493:23;6425:35;6506:9;6493:12;:23::i;:::-;6474:42;-1:-1:-1;6474:42:2;6531:273;6568:8;6561:4;:15;6531:273;;;6621:168;6654:13;:26;;;6702:9;:15;6712:4;6702:15;;;;;;;;;;;:33;;;401:5:0;6621:11:2;:168::i;:::-;6604:185;;;;6578:6;;6531:273;;;;6835:142;6864:13;:26;;;6908:7;:25;;;6951:12;6835:11;:142::i;:::-;6818:159;;;;6168:820;;;;;5936:1058;;;;:::o;441:494:3:-;538:4;341:5:5;;-1:-1:-1;;;;;341:5:5;327:10;:19;306:92;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;;;;588:10:3::1;616:1;579:20:::0;;;:8:::1;:20;::::0;;;;;:33:::1;::::0;604:7;579:24:::1;:33::i;:::-;:38;;558:112;;;::::0;;-1:-1:-1;;;558:112:3;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;703:11;::::0;:24:::1;::::0;719:7;703:15:::1;:24::i;:::-;681:11;:46:::0;778:10:::1;769:20;::::0;;;:8:::1;:20;::::0;;;;;:33:::1;::::0;794:7;769:24:::1;:33::i;:::-;747:10;738:20;::::0;;;:8:::1;:20;::::0;;;;;;;:64;;;;818:88;;;;;;;738:20;;-1:-1:-1;;;;;;;;;;;818:88:3;;;;;;;;;::::1;-1:-1:-1::0;924:4:3::1;408:1:5;441:494:3::0;;;:::o;1096:49:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1096:49:0;;;;;;;;;;;;;:::o;973:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;8831:433:2:-;8934:7;8957:33;;:::i;:::-;-1:-1:-1;8993:21:2;;;;:9;:21;;;;;;;;;8957:57;;;;;;;;;-1:-1:-1;;;;;8957:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9025:96;;9084:26;;;;-1:-1:-1;9076:34:2;;9025:96;9138:119;9229:27;9245:10;9229:15;:27::i;:::-;9138:73;9182:28;9199:10;9182:16;:28::i;:::-;9138:26;;;;;:43;:73::i;:119::-;9131:126;8831:433;-1:-1:-1;;;8831:433:2:o;495:129:7:-;558:59;591:16;:14;:16::i;:::-;558:19;:59::i;:::-;495:129::o;360:46:0:-;401:5;360:46;:::o;3543:153:9:-;-1:-1:-1;;;;;3671:18:9;3641:7;3671:18;;;:8;:18;;;;;;;3543:153::o;89:20:5:-;;;-1:-1:-1;;;;;89:20:5;;:::o;354:176:8:-;424:6;465:11;453:8;:6;:8::i;:::-;:23;;:70;;522:1;453:70;;;491:16;:14;:16::i;:::-;446:77;;354:176;:::o;139:28:0:-;;;;;;;;;;;;;;-1:-1:-1;;139:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3121:243:3;3246:23;3303:54;3351:5;3303:30;:6;3327:5;3303:23;:30::i;422:376:5:-;528:4;341:5;;-1:-1:-1;;;;;341:5:5;327:10;:19;306:92;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;569:25:5;::::1;548:96;;;::::0;;-1:-1:-1;;;548:96:5;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;663:5;:17:::0;;-1:-1:-1;;;;;;663:17:5::1;-1:-1:-1::0;;;;;663:17:5;::::1;::::0;;::::1;::::0;;696:73:::1;::::0;663:17;;726:10:::1;::::0;696:73:::1;::::0;663:5;696:73:::1;-1:-1:-1::0;787:4:5::1;422:376:::0;;;:::o;562:615:9:-;672:4;713:131;745:10;773:9;800:7;825:5;713:14;:131::i;:::-;692:206;;;;;-1:-1:-1;;;692:206:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;949:10;940:20;;;;:8;:20;;;;;;:33;;965:7;940:24;:33::i;:::-;918:10;909:20;;;;:8;:20;;;;;;:64;;;;-1:-1:-1;;;;;1014:19:9;;;;;;:32;;1038:7;1014:23;:32::i;:::-;-1:-1:-1;;;;;984:19:9;;;;;;:8;:19;;;;;;;;;:62;;;;1062:86;;;;;;;984:19;;1084:10;;-1:-1:-1;;;;;;;;;;;1062:86:9;;;;;;;;;-1:-1:-1;1166:4:9;562:615;;;;:::o;1546:115:8:-;1639:15;1546:115;:::o;10112:1808:2:-;10235:20;10269:21;10304:22;357:59:7;390:16;:14;:16::i;357:59::-;10351:33:2::1;;:::i;:::-;-1:-1:-1::0;10387:21:2::1;::::0;;;:9:::1;:21;::::0;;;;;;;10351:57;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;10351:57:2::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;;;;10387:21;10444:82:::1;::::0;401:5:0::1;::::0;10444:49:2::1;::::0;:8:::1;:6;:8::i;:82::-;10419:107;;10576:1;10558:14;:19;;10537:90;;;::::0;;-1:-1:-1;;;10537:90:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;10659:25:::0;;-1:-1:-1;;;;;10659:39:2::1;10688:10;10659:39;10638:113;;;::::0;;-1:-1:-1;;;10638:113:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;10783:13;:22;;;10762:95;;;::::0;;-1:-1:-1;;;10762:95:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;10893:5;10868:22;::::0;::::1;:30:::0;10924:26:::1;::::0;::::1;::::0;;-1:-1:-1;10983:2:2::1;10965:20:::0;::::1;10961:126;;11018:58;11052:10;11018:16;:58::i;:::-;11001:75;;10961:126;11113:49;11142:10;11113:15;:49::i;:::-;11097:65;;11187:76;11249:13;11187:44;11216:14;11187:11;;:28;;:44;;;;:::i;:76::-;11173:11;:90:::0;11274:28:::1;::::0;::::1;:45:::0;;;11358:77:::1;11421:13:::0;11358:45:::1;:12:::0;11305:14;11358:29:::1;:45::i;:77::-;11329:26;::::0;;::::1;:106:::0;;;11446:21:::1;::::0;;;:9:::1;:21;::::0;;;;;;:37;;;;-1:-1:-1;;;;;;11446:37:2::1;-1:-1:-1::0;;;;;11446:37:2;;::::1;;::::0;;;;::::1;::::0;-1:-1:-1;11446:37:2;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;11446:37:2::1;::::0;::::1;;::::0;;;::::1;::::0;;11534:10:::1;11525:20:::0;;;;;;;:52:::1;::::0;:24:::1;:52::i;:::-;11503:10;11494:20;::::0;;;:8:::1;:20;::::0;;;;:83;11624:25;;:43:::1;::::0;11654:12;11624:29:::1;:43::i;:::-;11588:25:::0;:79;11753:26:::1;::::0;;::::1;::::0;11683:106;;11729:10:::1;11683:106:::0;;::::1;::::0;::::1;::::0;;;;;;11705:10;;11683:106:::1;::::0;;;;;;::::1;11877:26;::::0;;::::1;::::0;11805:108;;;;;;;11853:10:::1;::::0;11835:3:::1;::::0;-1:-1:-1;;;;;;;;;;;11805:108:2;;;;::::1;::::0;;::::1;426:1:7;;10112:1808:2::0;;;;;:::o;1152:22:0:-;;;;;;;;:::o;1119:382:2:-;1212:18;1244:26;1308:99;1332:7;:25;;;1371:11;;1396:1;1308:10;:99::i;:::-;1295:112;;1439:55;1474:10;1439:21;:55::i;:::-;1418:76;;1119:382;;:::o;1045:45:0:-;;;;;;;;;;;;;;;;;;;:::o;4195:187:9:-;-1:-1:-1;;;;;4347:18:9;;;4317:7;4347:18;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;;4195:187::o;551:257:2:-;662:7;692:109;797:3;692:87;734:44;742:5;766:11;734:31;:44::i;:::-;299:3:0;;692:41:2;:87::i;4923:637::-;5036:17;5067:20;5112:33;;:::i;:::-;-1:-1:-1;5148:21:2;;;;:9;:21;;;;;;;;5112:57;;;;;;;;;-1:-1:-1;;;;;5112:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5148:21;5203:49;;:8;:6;:8::i;:49::-;5180:72;-1:-1:-1;5275:45:2;5180:72;401:5:0;5275:29:2;:45::i;:::-;5263:57;;453:4:0;5335:9:2;:26;5331:223;;;453:4:0;5378:26:2;;401:5:0;5418:29:2;;5331:223;;;5494:49;:12;401:5:0;5494:33:2;:49::i;:::-;5479:64;;5331:223;4923:637;;;;;:::o;12522:1053::-;12650:4;357:59:7::1;390:16;:14;:16::i;357:59::-;12691:133:2::2;12723:10;12759:3;12781:7;12806:4;12691:14;:133::i;:::-;12670:211;;;::::0;;-1:-1:-1;;;12670:211:2;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;348:6:0;12913:7:2;:24;;12892:100;;;::::0;;-1:-1:-1;;;12892:100:2;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;13043:10;13034:20;::::0;;;:8:::2;:20;::::0;;;;;:33:::2;::::0;13059:7;13034:24:::2;:33::i;:::-;13012:10;13003:20;::::0;;;:8:::2;:20;::::0;;;;;;;:64;;;;13109:137;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;;;;;;;;;13210:8:::2;:6;:8::i;:::-;13109:137:::0;;13232:4:::2;13109:137;::::0;;::::2;::::0;;;13088:7:::2;:17:::0;-1:-1:-1;13078:28:2;;;:9:::2;:28:::0;;;;;;;:168;;;;-1:-1:-1;;;;;;13078:168:2::2;-1:-1:-1::0;;;;;13078:168:2;;::::2;;::::0;;;;::::2;::::0;;;::::2;::::0;;;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;-1:-1:-1;;13078:168:2::2;::::0;::::2;;::::0;;;::::2;::::0;;13293:25;;:38:::2;::::0;13323:7;13293:29:::2;:38::i;:::-;13257:25:::0;:74;:7:::2;13371:17:::0;13347:96:::2;::::0;;13402:10:::2;13347:96:::0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;;;;;;;;::::2;13459:87;::::0;;;;;;;13513:1:::2;::::0;13481:10:::2;::::0;-1:-1:-1;;;;;;;;;;;13459:87:2;;;;::::2;::::0;;::::2;-1:-1:-1::0;13564:4:2::2;1225:7:0::0;:19;;;;;;12522:1053:2;;-1:-1:-1;12522:1053:2:o;270:178:6:-;328:7;360:1;355;:6;;347:49;;;;;-1:-1:-1;;;347:49:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;418:5:6;;;270:178::o;700:259::-;758:7;789:1;785;:5;777:44;;;;;-1:-1:-1;;;777:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;831:9;847:1;843;:5;;;;;;;700:259;-1:-1:-1;;;;700:259:6:o;454:240::-;512:7;535:6;531:45;;-1:-1:-1;564:1:6;557:8;;531:45;598:5;;;602:1;598;:5;:1;621:5;;;;;:10;613:56;;;;-1:-1:-1;;;613:56:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1367:670:3;1554:4;1579:26;1575:179;;-1:-1:-1;;;;;1646:26:3;;1621:122;;;;-1:-1:-1;;;1621:122:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1785:17:3;;;;;;:8;:17;;;;;;:28;-1:-1:-1;1785:28:3;1764:102;;;;;-1:-1:-1;;;1764:102:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1935:20:3;;;;;;:8;:20;;;;;;1898:33;1935:20;1923:7;1898:24;:33::i;:::-;:57;;1877:131;;;;;-1:-1:-1;;;1877:131:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2026:4:3;1367:670;;;;;;:::o;89:175:6:-;147:7;178:5;;;201:6;;;;193:46;;;;;-1:-1:-1;;;193:46:6;;;;;;;;;;;;;;;;;;;;;;;;;;;757:135:8;830:6;859:26;876:8;:6;:8::i;:::-;859:16;:26::i;865:547:7:-;977:21;;957:319;1007:10;1000:17;;:4;:17;957:319;;;1042:17;;:::i;:::-;-1:-1:-1;1062:15:7;;;;:9;:15;;;;;;;;1042:35;;;;;;;;1108:11;;1092:27;;1155:25;;1042:35;;;1133:47;;;1208:15;;;;;;;;:19;;;;;1042:35;;;;1208:19;1242:21;:23;;;;;;1019:6;957:319;;;-1:-1:-1;1321:11:7;;1346:25;;1291:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;865:547;:::o;965:149:6:-;1023:7;1050:6;1042:43;;;;;-1:-1:-1;;;1042:43:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;1106:1;1102;:5;;;;;;;965:149;-1:-1:-1;;;965:149:6:o;1192:194:8:-;401:5:0;1349:11:8;1336:24;;;1335:43;;1192:194::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://ee81112f7e49526cac766284f4fe32348ac982671dec0c69fb51391747b91b73
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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