ETH Price: $2,608.75 (+0.63%)

Contract

0x0763D730262Bcb2F6c818272f6290B2cFA55E454
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve138405342021-12-20 6:48:511031 days ago1639982931IN
0x0763D730...cFA55E454
0 ETH0.0026932358
Approve129981482021-08-10 15:04:261163 days ago1628607866IN
0x0763D730...cFA55E454
0 ETH0.0026467957
Put To Sheriffs ...123277312021-04-28 8:08:401267 days ago1619597320IN
0x0763D730...cFA55E454
0 ETH0.0033674139
Approve117188982021-01-24 14:31:431361 days ago1611498703IN
0x0763D730...cFA55E454
0 ETH0.0022035550
Transfer116757012021-01-17 23:25:461367 days ago1610925946IN
0x0763D730...cFA55E454
0 ETH0.0020069949
Approve115218752020-12-25 9:09:241391 days ago1608887364IN
0x0763D730...cFA55E454
0 ETH0.0020394146
Put To Sheriffs ...114955402020-12-21 8:09:021395 days ago1608538142IN
0x0763D730...cFA55E454
0 ETH0.011522634
Approve114934802020-12-21 0:24:321395 days ago1608510272IN
0x0763D730...cFA55E454
0 ETH0.0026645360.1
Put To Sheriffs ...114777412020-12-18 14:34:181398 days ago1608302058IN
0x0763D730...cFA55E454
0 ETH0.02141462103.00000156
Approve114769632020-12-18 11:37:381398 days ago1608291458IN
0x0763D730...cFA55E454
0 ETH0.001972944.5
Put To Sheriffs ...114712172020-12-17 14:27:431399 days ago1608215263IN
0x0763D730...cFA55E454
0 ETH0.0287165991
Take From Sherif...114622542020-12-16 5:35:041400 days ago1608096904IN
0x0763D730...cFA55E454
0 ETH0.0203338753
Put To Sheriffs ...114586012020-12-15 16:00:221401 days ago1608048022IN
0x0763D730...cFA55E454
0 ETH0.0292511280
Approve114441912020-12-13 10:43:291403 days ago1607856209IN
0x0763D730...cFA55E454
0 ETH0.0007802917.6
Transfer114247962020-12-10 10:58:271406 days ago1607597907IN
0x0763D730...cFA55E454
0 ETH0.0027705649.5000016
Put To Sheriffs ...113967522020-12-06 3:39:181410 days ago1607225958IN
0x0763D730...cFA55E454
0 ETH0.0054220116
Put To Sheriffs ...113853732020-12-04 9:42:451412 days ago1607074965IN
0x0763D730...cFA55E454
0 ETH0.0081863828
Take From Sherif...113815922020-12-03 19:38:061412 days ago1607024286IN
0x0763D730...cFA55E454
0 ETH0.0087698130
Put To Sheriffs ...113496952020-11-28 22:14:161417 days ago1606601656IN
0x0763D730...cFA55E454
0 ETH0.0044055413
Transfer113496622020-11-28 22:04:251417 days ago1606601065IN
0x0763D730...cFA55E454
0 ETH0.0009013622
Approve113228782020-11-24 19:23:291421 days ago1606245809IN
0x0763D730...cFA55E454
0 ETH0.001773440
Take Milk113165432020-11-23 20:10:581422 days ago1606162258IN
0x0763D730...cFA55E454
0 ETH0.0097616633
Take Milk113161872020-11-23 18:51:201422 days ago1606157480IN
0x0763D730...cFA55E454
0 ETH0.022481476
Put To Sheriffs ...113148072020-11-23 13:41:201423 days ago1606138880IN
0x0763D730...cFA55E454
0 ETH0.03596788111
Approve113113922020-11-23 0:55:421423 days ago1606092942IN
0x0763D730...cFA55E454
0 ETH0.0023497553
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
112330052020-11-11 0:24:151435 days ago1605054255
0x0763D730...cFA55E454
 Contract Creation0 ETH
112325392020-11-10 22:42:291435 days ago1605048149
0x0763D730...cFA55E454
 Contract Creation0 ETH
112323222020-11-10 21:54:091435 days ago1605045249
0x0763D730...cFA55E454
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Milk

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 777 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-10
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.7.0;


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

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

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

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

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

    /**
     * @dev Moves `amount` tokens from `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.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

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

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


/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


interface IStableV2 {
    // Stable balances management
    function update() external;
    // Management functions callable only be Milker
    function shareMilk(address taker) external returns (uint256);
    function bandits(uint256 amount) external returns (uint256, uint256, uint256);
    // Contract getters
    function milker() external view returns (address);
    function token() external view returns (address);
    function startTime() external view returns (uint256);
    function stakerTokens(address staker) external view returns (uint256);
    function stakerCorrection(address staker) external view returns (uint256);
    function tokenSupply() external view returns (uint256);
    function milkSupply() external view returns (uint256);
    // MILK production related getters
    function level() external view returns (uint256);
    function levelProgress() external view returns (uint256);
    function production() external view returns (uint256);
    function produced() external view returns (uint256);
    function distributed() external view returns (uint256);
    function pending() external view returns (uint256);
    function pendingTo(address account) external view returns (uint256);
}

interface IMilker is IERC20 {
    // Token management accessed only from StableV2 contracts
    function produceMilk(uint256 amount) external returns (uint256);
    function takeMilk(address account) external returns (uint256);
    // Primary MILK tokenomics events
    function bandits(uint256 percent) external returns (uint256, uint256, uint256);
    function sheriffsVaultCommission() external returns (uint256);
    function sheriffsPotDistribution() external returns (uint256);
    // Getters
    function startTime() external view returns (uint256);
    function isWhitelisted(address account) external view returns (bool);
    function vaultOf(address account) external view returns (uint256);
    function period() external view returns (uint256);
    function periodProgress() external view returns (uint256);
    function periodLength() external view returns (uint256);
    function production() external view returns (uint256);
    function producedTotal() external view returns (uint256);
    function distributedTotal() external view returns (uint256);
    function pendingTotal() external view returns (uint256);
    function pendingTo(address account) external view returns (uint256);
}

// solium-disable security/no-block-members

contract StableV2 is Ownable, IStableV2 {
    using SafeMath for uint256;

    // Stable contains info related to each staker.
    struct Staker {
        uint256 amount;      // amount of tokens currently staked to the Stable
        uint256 correction;  // value needed for correct calculation staker's share
        uint256 banditsCorrection;
        uint256 distributed; // amount of distributed MILK tokens
    }

    // Default deflationarity parameters.
    uint256 private constant REDUCING_INTERVAL = 7 days; // 7 days is time between reductions
    uint256 private constant REDUCING_FACTOR = 10;       // production is reduced by 10%

    // MILK token contract.
    IMilker private _milker;

    // ERC20 token contract staking to the Stable.
    IERC20 private _token;

    // Stakers info by token holders.
    mapping(address => Staker) private _stakers;

    // Common variables configuring of the Stable.
    uint256 private _startTime;

    // Common variables describing current state of the Stable.
    uint256 private _banditsCorrection = 1e18;
    uint256 private _tokensPerShare;
    uint256 private _distributed;
    uint256 private _production;
    uint256 private _produced;
    uint256 private _lastUpdateTime;


    // Events.
    event Initialized(uint256 startTime, uint256 initialProduction);
    event Bandits(
        uint256 indexed percent,
        uint256 totalAmount,
        uint256 arrestedAmount,
        uint256 burntAmount
    );
    event Staked(address indexed staker, uint256 amount);
    event Claimed(address indexed staker, uint256 amount);


    modifier onlyMilker() {
        require(address(_milker) == _msgSender(), "StableV2: caller is not the Milker contract");
        _;
    }


    constructor(address milker, address token) public {
        require(address(milker) != address(0), "StableV2: Milker contract address cannot be empty");
        require(address(token) != address(0), "StableV2: ERC20 token contract address cannot be empty");
        _milker = IMilker(milker);
        _token = IERC20(token);
        transferOwnership(Ownable(milker).owner());
    }

    function initialize(uint256 startTime, uint256 initialProductionPerDay) external onlyOwner {
        require(produced() == 0, "StableV2: already started");
        _startTime = startTime;
        _production = 7 * initialProductionPerDay;
        _lastUpdateTime = _startTime;
        emit Initialized(_startTime, _production);
    }

    function stake(uint256 amount) external {
        address staker = msg.sender;
        require(!_milker.isWhitelisted(staker), "StableV2: whitelisted MILK holders cannot stake tokens");

        // Recalculate stable shares
        update();

        // Transfer pending tokens (if any) to the staker
        _shareMilk(staker);

        if (amount > 0) {
            // Transfer staking tokens to the StableV2 contract
            bool ok = _token.transferFrom(staker, address(this), amount);
            require(ok, "StableV2: unable to transfer stake");
            // Register staking tokens
            _stakers[staker].amount = _stakers[staker].amount.add(amount);
        }

        // Adjust correction (staker's reward debt)
        uint256 correction = _stakers[staker].amount.mul(_tokensPerShare).div(1e12);
        _stakers[staker].correction = correction.mul(1e18).div(_banditsCorrection);
        _stakers[staker].banditsCorrection = _banditsCorrection;

        // Emit event to the logs so can be effectively used later
        emit Staked(staker, amount);
    }

    function claim(uint256 amount) external {
        address staker = msg.sender;
        require(!_milker.isWhitelisted(staker), "StableV2: whitelisted MILK holders cannot claim tokens");

        // Recalculate stable shares
        update();

        // Transfer pending tokens (if any) to the staker
        _shareMilk(staker);

        if (amount > 0) {
            // Unregister claimed tokens
            _stakers[staker].amount = _stakers[staker].amount.sub(amount);
            // Transfer requested tokens from the StableV2 contract
            bool ok = _token.transfer(staker, amount);
            require(ok, "StableV2: unable to transfer stake");
        }

        // Adjust correction (staker's reward debt)
        uint256 correction = _stakers[staker].amount.mul(_tokensPerShare).div(1e12);
        _stakers[staker].correction = correction.mul(1e18).div(_banditsCorrection);
        _stakers[staker].banditsCorrection = _banditsCorrection;

        // Emit event to the logs so can be effectively used later
        emit Claimed(staker, amount);
    }

    ////////////////////////////////////////////////////////////////
    // Updating stable state
    ////////////////////////////////////////////////////////////////

    // Updates stable's accumulative data until most recent block.
    function update() public override {
        if (block.timestamp <= _lastUpdateTime) {
            return;
        }
        uint256 productionNew = production();
        uint256 producedNew = produced();
        if (producedNew <= _produced) {
            _lastUpdateTime = block.timestamp;
            return;
        }
        uint256 supply = tokenSupply();
        if (supply == 0) {
            (_production, _produced) = (productionNew, producedNew);
            _lastUpdateTime = block.timestamp;
            return;
        }
        // Produce MILK tokens to this contract
        uint256 producedTotal = producedNew.sub(_produced);
        uint256 producedToStable = _milker.produceMilk(producedTotal);
        // Update stable share price
        _tokensPerShare = _tokensPerShare.add(producedToStable.mul(1e12).div(supply));
        // Update stable state
        _production = productionNew;
        _produced = producedNew;
        _lastUpdateTime = block.timestamp;
    }

    ////////////////////////////////////////////////////////////////
    // Management functions callable only be Milker
    ////////////////////////////////////////////////////////////////

    function shareMilk(address taker) public override onlyMilker returns (uint256) {
        return _shareMilk(taker);
    }

    function bandits(uint256 percent) external override onlyMilker returns (
        uint256 banditsAmount,
        uint256 arrestedAmount,
        uint256 burntAmount
    ) {
        // Recalculate stable shares
        update();

        // Ensure pending amount and total tokens staked are not zero
        uint256 pendingAmount = milkSupply();
        if (pendingAmount == 0) {
            return (0, 0, 0);
        }

        // Calculate bandits amounts
        banditsAmount = pendingAmount.mul(percent).div(100);
        burntAmount = banditsAmount.div(10);
        arrestedAmount = banditsAmount.sub(burntAmount);

        // Transfer arrested MILK to the Sheriff's Vault
        _safeTransferMilk(address(_milker), arrestedAmount);

        // Decrease pending of each staker
        _banditsCorrection = _banditsCorrection.sub(_banditsCorrection.mul(percent).div(100));
        _tokensPerShare = _tokensPerShare.sub(_tokensPerShare.mul(percent).div(100));

        // Emit event to the logs so can be effectively used later
        emit Bandits(percent, banditsAmount, arrestedAmount, burntAmount);
    }

    ////////////////////////////////////////////////////////////////
    // Contract getters
    ////////////////////////////////////////////////////////////////

    function milker() public view override returns (address) {
        return address(_milker);
    }

    function token() public view override returns (address) {
        return address(_token);
    }

    function startTime() public view override returns (uint256) {
        return _startTime;
    }

    function stakerTokens(address staker) public view override returns (uint256) {
        return _stakers[staker].amount;
    }

    function stakerCorrection(address staker) public view override returns (uint256) {
        return _stakers[staker].correction;
    }

    function tokenSupply() public view override returns (uint256) {
        return _token.balanceOf(address(this));
    }

    function milkSupply() public view override returns (uint256) {
        return _milker.balanceOf(address(this));
    }

    ////////////////////////////////////////////////////////////////
    // MILK production related getters
    ////////////////////////////////////////////////////////////////

    function level() public view override returns (uint256) {
        if (_startTime == 0 || _startTime >= block.timestamp) {
            return 0;
        }
        return (block.timestamp - _startTime) / REDUCING_INTERVAL;
    }

    function levelProgress() public view override returns (uint256) {
        if (_startTime == 0 || _startTime >= block.timestamp) {
            return 0;
        }
        uint256 d = block.timestamp - (_startTime + level() * REDUCING_INTERVAL);
        return d * 10**18 / REDUCING_INTERVAL;
    }

    function production() public view override returns(uint256) {
        if (_startTime == 0 || _startTime >= block.timestamp) {
            return 0;
        }
        uint256 prod = _production;
        uint256 lvlA = (_lastUpdateTime - _startTime) / REDUCING_INTERVAL;
        uint256 lvlB = (block.timestamp - _startTime) / REDUCING_INTERVAL;
        for (; lvlA < lvlB; lvlA++) {
            prod -= prod / REDUCING_FACTOR;
        }
        return prod;
    }

    function produced() public view override returns(uint256) {
        if (_startTime == 0 || _startTime >= block.timestamp) {
            return 0;
        }
        uint256 lvlA = (_lastUpdateTime - _startTime) / REDUCING_INTERVAL;
        uint256 lvlB = (block.timestamp - _startTime) / REDUCING_INTERVAL;
        if (lvlA == lvlB) {
            return _produced + (block.timestamp - _lastUpdateTime) * _production / REDUCING_INTERVAL;
        }
        uint256 amount = 0;
        uint256 prod = _production;
        // Count end of first level
        amount += ((_startTime + (lvlA+1) * REDUCING_INTERVAL) - _lastUpdateTime) * prod / REDUCING_INTERVAL;
        prod -= prod / REDUCING_FACTOR;
        for (lvlA++; lvlA < lvlB; lvlA++) {
            // Count full level
            amount += prod;
            prod -= prod / REDUCING_FACTOR;
        }
        // Count start of current level
        amount += (block.timestamp - (_startTime + lvlB * REDUCING_INTERVAL)) * prod / REDUCING_INTERVAL;
        return _produced + amount;
    }

    function distributed() public view override returns(uint256) {
        return _distributed;
    }

    function pending() public view override returns(uint256) {
        uint256 p = produced();
        if (p <= _distributed) {
            return 0;
        }
        return p.sub(_distributed);
    }

    function pendingTo(address account) public view override returns (uint256) {
        uint256 added = produced().sub(_produced);
        uint256 supply = tokenSupply();
        uint256 tokensPerShare = _tokensPerShare;
        if (added > 0 && supply > 0) {
            tokensPerShare = tokensPerShare.add(added.sub(added.div(20)).mul(1e12).div(supply));
        }
        uint256 tokens = _stakers[account].amount.mul(tokensPerShare).div(1e12);
        uint256 correction = _stakers[account].correction.mul(_banditsCorrection).div(1e18);
        if (_banditsCorrection != _stakers[account].banditsCorrection) {
            correction = correction.mul(_stakers[account].banditsCorrection).div(_banditsCorrection);
        }
        if (tokens <= correction) {
            return 0;
        }
        return tokens.sub(correction);
    }

    ////////////////////////////////////////////////////////////////
    // Internal functions
    ////////////////////////////////////////////////////////////////

    function _shareMilk(address taker) private returns (uint256 tokens) {

        // Calculate pending tokens
        Staker storage s = _stakers[taker];
        uint256 pendingAmount = s.amount.mul(_tokensPerShare).div(1e12);
        uint256 correction = s.correction.mul(_banditsCorrection).div(1e18);
        if (_banditsCorrection != s.banditsCorrection) {
            correction = correction.mul(s.banditsCorrection).div(_banditsCorrection);
            s.banditsCorrection = _banditsCorrection;
        }
        if (pendingAmount > correction) {
            uint256 balance = _milker.balanceOf(address(this));
            pendingAmount = pendingAmount.sub(correction);
            tokens = pendingAmount > balance ? balance : pendingAmount;
            // Unregister sharing tokens
            s.correction = correction.add(tokens).mul(1e18).div(_banditsCorrection);
            s.banditsCorrection = _banditsCorrection;
            _distributed = _distributed.add(tokens);
            // Transfer MILK tokens from the StableV2 contract to the taker
            _safeTransferMilk(taker, tokens);
        }

        return tokens;
    }

    function _safeTransferMilk(address to, uint256 amount) private {
        uint256 balance = _milker.balanceOf(address(this));
        uint256 tokens = amount > balance ? balance : amount;
        if (tokens > 0) {
            bool ok = _milker.transfer(to, tokens);
            require(ok, "StableV2: unable to transfer MILK");
        }
    }

    ////////////////////////////////////////////////////////////////
    // [TESTS] Test functions to check internal state
    // TODO: Remove it since only for tests !!!
    ////////////////////////////////////////////////////////////////

    function testProduction() public view returns (uint256) {
        return _production;
    }

    function testProduced() public view returns (uint256) {
        return _produced;
    }

    function testTokensPerShare() public view returns (uint256) {
        return _tokensPerShare;
    }

    function testLastUpdateTime() public view returns (uint256) {
        return _lastUpdateTime;
    }
}

contract Milk is Ownable, IMilker {
    using SafeMath for uint256;

    // Stable related info needed for proper shares calculation.
    struct StableInfo {
        IStableV2 stable;
    }

    // Token details.
    string public constant name = "Cowboy.Finance";
    string public constant symbol = "MILK";
    uint256 public constant decimals = 18;

    // Token supply limitations.
    uint256 private constant MAX_UINT256 = ~uint256(0);
    uint256 private constant MAX_SUPPLY = 7_000_000 * 10**decimals;
    uint256 private constant TOTAL_UNITS = MAX_UINT256 - (MAX_UINT256 % MAX_SUPPLY);

    // Period length is a time of events recharging.
    uint256 private constant PERIOD_LENGTH = 6 hours;

    // Hardcoded address to collect 5% developers team share.
    address private constant _devs = 0xFFCF83437a1Eb718933f39ebE75aD96335BC1BE4;

    // Address of controller contract from which base refase functions can be called.
    address private _controller;

    // Token holders balances "in hand", balances in vaults, and spending allowances.
    mapping(address => uint256) private _balances; // in units
    mapping(address => uint256) private _vaults;   // in units
    mapping(address => mapping (address => uint256)) private _allowances; // in tokens

    // Whitelisted addresses.
    mapping(address => bool) private _whitelist;

    // Registered stables.
    StableInfo[] private _stables;
    mapping(address => uint256) _stablesLookup;

    // Time of start token life.
    uint256 private _startTime;

    // Token supplies.
    uint256 private _supplyInBalances;      // in units
    uint256 private _supplyInSheriffsVault; // in units
    uint256 private _supplyInSheriffsPot;   // in tokens
    uint256 private _totalSupply;           // in tokens

    // Values needed to convert between units and tokens (divided to several parts).
    uint256 private _unitsPerTokenInBalances = TOTAL_UNITS.div(MAX_SUPPLY);
    uint256 private _unitsPerTokenInSheriffsVault = TOTAL_UNITS.div(MAX_SUPPLY);

    // Contract configuration events.
    event ControllerSetUp(address indexed controller);
    event StableCreated(address stable, address milker, address token, uint256 id);

    // ERC20 token related events.
    event Mint(address indexed recipient, uint256 amount);
    event Burn(address indexed stable, uint256 amount);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    // Tokenomics mechanics events.
    event Bandits(
        uint256 indexed percent,
        uint256 totalAmount,
        uint256 arrestedAmount,
        uint256 burntAmount
    );
    event SheriffsVaultCommission(uint256 amount);
    event SheriffsPotDistribution(uint256 amount);

    // Sheriff's Vault staking/unstaking events.
    event SheriffsVaultDeposit(address indexed account, uint256 amount);
    event SheriffsVaultWithdraw(address indexed account, uint256 amount);


    modifier validRecipient(address account) {
        require(account != address(0x0), "Milk: unable to send tokens to zero address");
        _;
    }

    modifier onlyController() {
        require(_controller == _msgSender(), "Milk: caller is not the controller");
        _;
    }

    modifier onlyStable() {
        require(_stablesLookup[_msgSender()] > 0, "Milk: caller is not the StableV2");
        _;
    }


    constructor() public {
        _whitelist[_devs] = true;
        _startTime = block.timestamp;
    }

    ////////////////////////////////////////////////////////////////
    // [Administration] Contract admin managing
    ////////////////////////////////////////////////////////////////

    function setController(address controller) external onlyOwner {
        _controller = controller;
        emit ControllerSetUp(controller);
    }

    function createStable(address token) external onlyOwner returns (address stable) {

        // Deploy StableV2 contract
        bytes32 salt = keccak256(abi.encodePacked(address(this), token));
        stable = address(new StableV2{salt: salt}(address(this), token));
        require(stable != address(0), "Milk: unable to create deploy StableV2 contract");

        // Register created Stable
        _stables.push(StableInfo({stable: IStableV2(stable)}));
        _stablesLookup[stable] = _stables.length;
        _whitelist[stable] = true;

        // Also set token as whitelist
        if (!_whitelist[token]) {
            uint256 amount = _balances[token].div(_unitsPerTokenInBalances);
            _supplyInBalances = _supplyInBalances.sub(_balances[token]);
            _balances[token] = amount;
            _whitelist[token] = true;
        }

        emit StableCreated(stable, address(this), token, _stables.length - 1);
    }

    ////////////////////////////////////////////////////////////////
    // [Event] Bandits are coming!
    ////////////////////////////////////////////////////////////////

    function bandits(uint256 percent) external override onlyController returns (
        uint256 banditsAmount,
        uint256 arrestedAmount,
        uint256 burntAmount
    ) {
        require(percent > 0 && percent < 100, "Milker: invalid bandits percent");
        uint256 supply = _supplyInBalances.div(_unitsPerTokenInBalances);

        // Calculate bandits amounts
        banditsAmount = supply.mul(percent).div(100);
        burntAmount = banditsAmount.div(10);
        arrestedAmount = banditsAmount.sub(burntAmount);

        // Burn necessary amount of MILK tokens in each stable
        uint256 banditsPending;
        uint256 arrestedPending;
        uint256 burntPending;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            (uint256 b, uint256 a, uint256 x) = _stables[i].stable.bandits(percent);
            // Calculate bandits pending amounts
            banditsPending = banditsPending.add(b);
            arrestedPending = arrestedPending.add(a);
            burntPending = burntPending.add(x);
            // Burn MILK from the Stable contract
            _burn(address(_stables[i].stable), x);
        }

        // Update supplies
        uint256 supplyNew = supply.sub(banditsAmount);
        if (supply > 0 && supplyNew > 0) {
            _unitsPerTokenInBalances = supply.mul(_unitsPerTokenInBalances).div(supplyNew);
            _supplyInBalances = supplyNew.mul(_unitsPerTokenInBalances);
            _supplyInSheriffsPot = _supplyInSheriffsPot.add(arrestedAmount).add(arrestedPending);
            _totalSupply = _totalSupply.sub(burntAmount);
        }

        // Calculate final bandits amounts
        banditsAmount = banditsAmount.add(banditsPending);
        arrestedAmount = arrestedAmount.add(arrestedPending);
        burntAmount = burntAmount.add(burntPending);

        emit Bandits(percent, banditsAmount, arrestedAmount, burntAmount);
    }

    ////////////////////////////////////////////////////////////////
    // [Event] Sheriff's Vault commission
    ////////////////////////////////////////////////////////////////

    function sheriffsVaultCommission() external override onlyController returns (uint256) {

        // Calculate comission in both units and tokens
        uint256 vunits = _supplyInSheriffsVault.div(100);
        uint256 tokens = vunits.div(_unitsPerTokenInSheriffsVault);

        // Update supplies
        uint256 supply = _supplyInSheriffsVault.div(_unitsPerTokenInSheriffsVault);
        uint256 supplyNew = supply.sub(supply.div(100));
        if (supply > 0 && supplyNew > 0) {
            _unitsPerTokenInSheriffsVault = supply.mul(_unitsPerTokenInSheriffsVault).div(supplyNew);
            _supplyInSheriffsVault = supplyNew.mul(_unitsPerTokenInSheriffsVault);
            _supplyInSheriffsPot = _supplyInSheriffsPot.add(tokens);
        } else {
            tokens = 0;
        }

        emit SheriffsVaultCommission(tokens);
        return tokens;
    }

    ////////////////////////////////////////////////////////////////
    // [Event] Sheriff's Pot distribution
    ////////////////////////////////////////////////////////////////

    function sheriffsPotDistribution() external override onlyController returns (uint256 amount) {
        uint256 tokens = _supplyInSheriffsPot;
        if (tokens == 0 || _supplyInBalances == 0) {
            return 0;
        }

        // Update supplies
        uint256 supply = _supplyInBalances.div(_unitsPerTokenInBalances);
        uint256 supplyNew = supply.add(tokens);
        _unitsPerTokenInBalances = supply.mul(_unitsPerTokenInBalances).div(supplyNew);
        _supplyInBalances = supplyNew.mul(_unitsPerTokenInBalances);
        _supplyInSheriffsPot = 0;

        emit SheriffsPotDistribution(tokens);
        return tokens;
    }

    ////////////////////////////////////////////////////////////////
    // Sheriff's Vault
    ////////////////////////////////////////////////////////////////

    function putToSheriffsVault(uint256 amount) external {
        address account = msg.sender;
        require(!_whitelist[account], "Milk: whitelisted holders cannot use Sheriff's Vault");

        // Take pending MILK
        takeMilk(account);

        // Calculate amount in units
        uint256 unitsInBalances = amount.mul(_unitsPerTokenInBalances);
        uint256 unitsInSheriffsVault = amount.mul(_unitsPerTokenInSheriffsVault);

        // Update balances and vaults records
        _balances[account] = _balances[account].sub(unitsInBalances);
        _vaults[account] = _vaults[account].add(unitsInSheriffsVault);

        // Update supplies
        _supplyInBalances = _supplyInBalances.sub(unitsInBalances);
        _supplyInSheriffsVault = _supplyInSheriffsVault.add(unitsInSheriffsVault);

        emit SheriffsVaultDeposit(account, amount);
    }

    function takeFromSheriffsVault(uint256 amount) external {
        address account = msg.sender;
        require(!_whitelist[account], "Milk: whitelisted holders cannot use Sheriff's Vault");

        // Take pending MILK
        takeMilk(account);

        // Calculate amount in units
        uint256 unitsInBalances = amount.mul(_unitsPerTokenInBalances);
        uint256 unitsInSheriffsVault = amount.mul(_unitsPerTokenInSheriffsVault);

        // Update balances and vaults records
        _balances[account] = _balances[account].add(unitsInBalances);
        _vaults[account] = _vaults[account].sub(unitsInSheriffsVault);

        // Update supplies
        _supplyInBalances = _supplyInBalances.add(unitsInBalances);
        _supplyInSheriffsVault = _supplyInSheriffsVault.sub(unitsInSheriffsVault);

        emit SheriffsVaultWithdraw(account, amount);
    }

    ////////////////////////////////////////////////////////////////
    // [Token] Minting/burning token
    ////////////////////////////////////////////////////////////////

    function mint(address recipient, uint256 amount) external validRecipient(recipient) onlyOwner returns (bool) {
        if (isWhitelisted(recipient)) {
            _balances[recipient] = _balances[recipient].add(amount);
        } else {
            uint256 units = amount.mul(_unitsPerTokenInBalances);
            _balances[recipient] = _balances[recipient].add(units);
            _supplyInBalances = _supplyInBalances.add(units);
        }
        _totalSupply = _totalSupply.add(amount);
        emit Mint(recipient, amount);
        emit Transfer(address(0), recipient, amount);
        return true;
    }

    function takeMilk(address account) public override returns (uint256) {
        uint256 tokens;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            _stables[i].stable.update();
            uint256 transferred = _stables[i].stable.shareMilk(account);
            tokens = tokens.add(transferred);
        }
        return tokens;
    }

    ////////////////////////////////////////////////////////////////
    // [Token] Issuing/transferring earned tokens
    ////////////////////////////////////////////////////////////////

    function produceMilk(uint256 amount) public override onlyStable returns (uint256) {
        // Substruct 5% from each amount to transfer to the developers team
        uint256 devsFee = amount.div(20);      //  5%
        uint256 stabled = amount.sub(devsFee); // 95%
        // Produce (mint) MILK tokens
        _balances[msg.sender] = _balances[msg.sender].add(stabled);
        _balances[_devs] = _balances[_devs].add(devsFee);
        _totalSupply = _totalSupply.add(amount);
        // emit Mint(msg.sender, amount);
        emit Transfer(address(0), msg.sender, stabled);
        emit Transfer(address(0), _devs, devsFee);
        return stabled;
    }

    ////////////////////////////////////////////////////////////////
    // [Token] Transferring token
    ////////////////////////////////////////////////////////////////

    function transfer(address to, uint256 value) public override validRecipient(to) returns (bool) {
        (address from, bool fromWT, bool toWT) = (msg.sender, isWhitelisted(msg.sender), isWhitelisted(to));
        uint256 unitsFrom = fromWT ? value : value.mul(_unitsPerTokenInBalances);
        uint256 unitsTo = toWT ? value : value.mul(_unitsPerTokenInBalances);
        if (!fromWT && _balances[from] < unitsFrom) {
            takeMilk(from);
        }
        if (fromWT && toWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
        } else if (fromWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
            _supplyInBalances = _supplyInBalances.add(unitsTo);
        } else if (toWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
            _supplyInBalances = _supplyInBalances.sub(unitsFrom);
        } else {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
        }
        emit Transfer(from, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint256 value) public override validRecipient(to) returns (bool) {
        (bool fromWT, bool toWT) = (isWhitelisted(msg.sender), isWhitelisted(to));
        uint256 unitsFrom = fromWT ? value : value.mul(_unitsPerTokenInBalances);
        uint256 unitsTo = toWT ? value : value.mul(_unitsPerTokenInBalances);
        _allowances[from][msg.sender] = _allowances[from][msg.sender].sub(value);
        if (!fromWT && _balances[from] < unitsFrom) {
            takeMilk(from);
        }
        if (fromWT && toWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
        } else if (fromWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
            _supplyInBalances = _supplyInBalances.add(unitsTo);
        } else if (toWT) {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
            _supplyInBalances = _supplyInBalances.sub(unitsFrom);
        } else {
            _balances[from] = _balances[from].sub(unitsFrom);
            _balances[to] = _balances[to].add(unitsTo);
        }
        emit Transfer(from, to, value);
        return true;
    }

    function approve(address spender, uint256 value) public override returns (bool) {
        _allowances[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _allowances[msg.sender][spender] = _allowances[msg.sender][spender].add(addedValue);
        emit Approval(msg.sender, spender, _allowances[msg.sender][spender]);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        uint256 oldValue = _allowances[msg.sender][spender];
        if (subtractedValue >= oldValue) {
            _allowances[msg.sender][spender] = 0;
        } else {
            _allowances[msg.sender][spender] = oldValue.sub(subtractedValue);
        }
        emit Approval(msg.sender, spender, _allowances[msg.sender][spender]);
        return true;
    }

    ////////////////////////////////////////////////////////////////
    // Common getters
    ////////////////////////////////////////////////////////////////

    function startTime() public view override returns (uint256) {
        return _startTime;
    }

    function isWhitelisted(address account) public view override returns (bool) {
        return _whitelist[account];
    }

    function stable(uint256 index) public view returns (address) {
        return index < _stables.length ? address(_stables[index].stable) : address(0);
    }

    function stables() public view returns (address[] memory) {
        address[] memory addresses = new address[](_stables.length);
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            addresses[i] = address(_stables[i].stable);
        }
        return addresses;
    }

    function stableCount() public view returns (uint256) {
        return _stables.length;
    }

    function balanceOf(address account) public view override returns (uint256) {
        // For whitelisted addresses don't calculate pending tokens
        if (isWhitelisted(account)) {
            return _balances[account];
        }
        // Summarize pending MILK from all stables
        uint256 pendingAmount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            pendingAmount = pendingAmount.add(_stables[i].stable.pendingTo(account));
        }
        // Final balance is actually summ of acked and pending MILK
        return _balances[account].div(_unitsPerTokenInBalances).add(pendingAmount);
    }

    function vaultOf(address account) public view override returns (uint256) {
        return _vaults[account].div(_unitsPerTokenInSheriffsVault);
    }

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

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

    function holdersSupply() public view returns (uint256) {
        return _supplyInBalances.div(_unitsPerTokenInBalances);
    }

    function sheriffsPotSupply() public view returns (uint256) {
        return _supplyInSheriffsPot;
    }

    function sheriffsVaultSupply() public view returns (uint256) {
        return _supplyInSheriffsVault.div(_unitsPerTokenInSheriffsVault);
    }

    ////////////////////////////////////////////////////////////////
    // Token lifetime related getters
    ////////////////////////////////////////////////////////////////

    function period() public view override returns (uint256) {
        return block.timestamp.sub(_startTime).div(PERIOD_LENGTH);
    }

    function periodProgress() public view override returns (uint256) {
        uint256 durationFromPeriodStart = block.timestamp
            .sub(_startTime.add(period().mul(PERIOD_LENGTH)));
        return durationFromPeriodStart.mul(10**18).div(PERIOD_LENGTH);
    }

    function periodLength() public view override returns (uint256) {
        return PERIOD_LENGTH;
    }

    ////////////////////////////////////////////////////////////////
    // Token production related getters
    ////////////////////////////////////////////////////////////////

    function production() public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.production());
        }
        return amount;
    }

    function producedTotal() public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.produced());
        }
        return amount;
    }

    function distributedTotal() public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.distributed());
        }
        return amount;
    }

    function pendingTotal() public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.pending());
        }
        return amount;
    }

    function pendingTo(address account) public view override returns(uint256) {
        uint256 amount;
        for ((uint256 i, uint256 c) = (0, _stables.length); i < c; i++) {
            amount = amount.add(_stables[i].stable.pendingTo(account));
        }
        return amount;
    }

    function unitsPerToken() public view returns (uint256) {
        return _unitsPerTokenInBalances;
    }

    ////////////////////////////////////////////////////////////////
    // Internal functions
    ////////////////////////////////////////////////////////////////

    function _burn(address burner, uint256 amount) private {
        _balances[burner] = _balances[burner].sub(amount);
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(burner, address(0), amount);
        // emit Burn(burner, amount);
    }
}

// solium-enable security/no-block-members

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"uint256","name":"percent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"arrestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burntAmount","type":"uint256"}],"name":"Bandits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stable","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"}],"name":"ControllerSetUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SheriffsPotDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SheriffsVaultCommission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SheriffsVaultDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SheriffsVaultWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stable","type":"address"},{"indexed":false,"internalType":"address","name":"milker","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"StableCreated","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"},{"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":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"bandits","outputs":[{"internalType":"uint256","name":"banditsAmount","type":"uint256"},{"internalType":"uint256","name":"arrestedAmount","type":"uint256"},{"internalType":"uint256","name":"burntAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"createStable","outputs":[{"internalType":"address","name":"stable","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdersSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"pendingTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"period","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodProgress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"produceMilk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"producedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"production","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"putToSheriffsVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sheriffsPotDistribution","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sheriffsPotSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sheriffsVaultCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sheriffsVaultSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"stable","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stableCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stables","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"takeFromSheriffsVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"takeMilk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unitsPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"vaultOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052620000326a05ca4ec2a79a7f67000000806000195b06600019036200010960201b62002a941790919060201c565b600d556200004f6a05ca4ec2a79a7f670000008060001962000019565b600e553480156200005f57600080fd5b5060006200006c6200015a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35073ffcf83437a1eb718933f39ebe75ad96335bc1be460005260056020527fabd433d087b32297e61a6cb70cf23a231ccf223f8cab3165cd9c1ec51ee0b473805460ff191660011790554260085562000205565b60006200015383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200015e60201b60201c565b9392505050565b3390565b60008183620001ee5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620001b257818101518382015260200162000198565b50505050905090810190601f168015620001e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581620001fb57fe5b0495945050505050565b614c1580620002156000396000f3fe60806040523480156200001157600080fd5b5060043610620003285760003560e01c8063758b689811620001ad578063a457c2d711620000f9578063c9f9619c11620000a5578063dd62ed3e116200007b578063dd62ed3e146200080e578063ef78d4fd146200083f578063f2fde38b14620008495762000328565b8063c9f9619c14620007da578063d2ca211514620007fa578063dcbdac3014620008045762000328565b8063acf9778f11620000db578063acf9778f14620007a6578063b928df4b14620007b0578063bd75bab514620007ba5762000328565b8063a457c2d71462000748578063a9059cbb14620007775762000328565b806392eefe9b116200015957806396cbfa4d116200013b57806396cbfa4d146200072a578063a17f9f391462000734578063a2f96a13146200073e5762000328565b806392eefe9b14620006f757806395d89b4114620007205762000328565b80637e37c312116200018f5780637e37c31214620006875780638da5cb5b14620006915780638f142907146200069b5762000328565b8063758b6898146200065457806378e97925146200067d5762000328565b806336a1b5a011620002795780635018d7a9116200022557806368ff7d0b11620001fb57806368ff7d0b146200061557806370a08231146200061f578063715018a614620006485762000328565b80635018d7a9146200058e578063521c863314620005ae5780635b76c71214620005d75762000328565b80633af32abf116200025b5780633af32abf14620004fa57806340c10f19146200052357806348a7b29314620005525762000328565b806336a1b5a014620004c15780633950935114620004cb5762000328565b806309b1f2d111620002d95780631ffe54b211620002bb5780631ffe54b2146200045557806323b872dd146200047e578063313ce56714620004b75762000328565b806309b1f2d1146200044157806318160ddd146200044b5762000328565b806306fdde03116200030f57806306fdde0314620003535780630709df4514620003d5578063095ea7b314620003fe5762000328565b806303d3d3ca146200032d57806305e88b691462000349575b600080fd5b6200033762000872565b60408051918252519081900360200190f35b6200033762000893565b6200035d6200094f565b6040805160208082528351818301528351919283929083019185019080838360005b83811015620003995781810151838201526020016200037f565b50505050905090810190601f168015620003c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6200033760048036036020811015620003ed57600080fd5b50356001600160a01b031662000988565b6200042d600480360360408110156200041657600080fd5b506001600160a01b038135169060200135620009ba565b604080519115158252519081900360200190f35b6200033762000a21565b6200033762000a27565b62000337600480360360208110156200046d57600080fd5b50356001600160a01b031662000a2d565b6200042d600480360360608110156200049657600080fd5b506001600160a01b0381358116916020810135909116906040013562000abe565b6200033762000e5a565b6200033762000e5f565b6200042d60048036036040811015620004e357600080fd5b506001600160a01b03813516906020013562000edd565b6200042d600480360360208110156200051257600080fd5b50356001600160a01b031662000f72565b6200042d600480360360408110156200053b57600080fd5b506001600160a01b03813516906020013562000f90565b62000572600480360360208110156200056a57600080fd5b5035620011a6565b604080516001600160a01b039092168252519081900360200190f35b6200033760048036036020811015620005a657600080fd5b5035620011e4565b6200033760048036036020811015620005c657600080fd5b50356001600160a01b0316620013db565b620005f760048036036020811015620005ef57600080fd5b503562001514565b60408051938452602084019290925282820152519081900360600190f35b620003376200186a565b62000337600480360360208110156200063757600080fd5b50356001600160a01b0316620019cf565b6200065262001a6b565b005b62000572600480360360208110156200066c57600080fd5b50356001600160a01b031662001b22565b6200033762001deb565b6200033762001df1565b6200057262001e49565b620006a562001e58565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015620006e3578181015183820152602001620006c9565b505050509050019250505060405180910390f35b62000652600480360360208110156200070f57600080fd5b50356001600160a01b031662001f0f565b6200035d62001fc6565b6200033762001fe6565b6200033762001fec565b620003376200206a565b6200042d600480360360408110156200076057600080fd5b506001600160a01b03813516906020013562002184565b6200042d600480360360408110156200078f57600080fd5b506001600160a01b03813516906020013562002271565b62000337620025bd565b62000337620025d8565b6200065260048036036020811015620007d257600080fd5b503562002656565b6200065260048036036020811015620007f257600080fd5b5035620027c2565b620003376200292e565b6200033762002934565b62000337600480360360408110156200082657600080fd5b506001600160a01b03813581169160200135166200293a565b6200033762002965565b62000652600480360360208110156200086157600080fd5b50356001600160a01b031662002985565b60006200088d600d5460095462002a9490919063ffffffff16565b90505b90565b600654600090819081905b8082101562000947576200093960068381548110620008b957fe5b60009182526020918290200154604080516305e88b6960e01b815290516001600160a01b03909216926305e88b6992600480840193829003018186803b1580156200090357600080fd5b505afa15801562000918573d6000803e3d6000fd5b505050506040513d60208110156200092f57600080fd5b5051849062002ad8565b92506001909101906200089e565b509091505090565b6040518060400160405280600e81526020017f436f77626f792e46696e616e636500000000000000000000000000000000000081525081565b600e546001600160a01b0382166000908152600360205260408120549091620009b2919062002a94565b90505b919050565b3360008181526004602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b600b5490565b600c5490565b600654600090819081905b8082101562000ab55762000aa76006838154811062000a5357fe5b6000918252602091829020015460408051630fff2a5960e11b81526001600160a01b038a8116600483015291519190921692631ffe54b29260248082019391829003018186803b1580156200090357600080fd5b925060019091019062000a38565b50909392505050565b6000826001600160a01b03811662000b085760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b60008062000b163362000f72565b62000b218762000f72565b9150915060008262000b4357600d5462000b3d90879062002b33565b62000b45565b855b905060008262000b6557600d5462000b5f90889062002b33565b62000b67565b865b6001600160a01b038a16600090815260046020908152604080832033845290915290205490915062000b9a908862002b91565b6001600160a01b038a1660009081526004602090815260408083203384529091529020558315801562000be457506001600160a01b03891660009081526002602052604090205482115b1562000bf75762000bf589620013db565b505b83801562000c025750825b1562000c7d576001600160a01b03891660009081526002602052604090205462000c2d908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000c5e908262002ad8565b6001600160a01b03891660009081526002602052604090205562000e00565b831562000d0b576001600160a01b03891660009081526002602052604090205462000ca9908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000cda908262002ad8565b6001600160a01b03891660009081526002602052604090205560095462000d02908262002ad8565b60095562000e00565b821562000d90576001600160a01b03891660009081526002602052604090205462000d37908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000d68908262002ad8565b6001600160a01b03891660009081526002602052604090205560095462000d02908362002b91565b6001600160a01b03891660009081526002602052604090205462000db5908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000de6908262002ad8565b6001600160a01b0389166000908152600260205260409020555b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a350600198975050505050505050565b601281565b600654600090819081905b80821015620009475762000ecf6006838154811062000e8557fe5b600091825260209182902001546040805163e20ccec360e01b815290516001600160a01b039092169263e20ccec392600480840193829003018186803b1580156200090357600080fd5b925060019091019062000e6a565b3360009081526004602090815260408083206001600160a01b038616845290915281205462000f0d908362002ad8565b3360008181526004602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b6001600160a01b031660009081526005602052604090205460ff1690565b6000826001600160a01b03811662000fda5760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b62000fe462002bd5565b6000546001600160a01b0390811691161462001047576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b620010528462000f72565b156200109c576001600160a01b0384166000908152600260205260409020546200107d908462002ad8565b6001600160a01b0385166000908152600260205260409020556200110a565b6000620010b5600d548562002b3390919063ffffffff16565b6001600160a01b038616600090815260026020526040902054909150620010dd908262002ad8565b6001600160a01b03861660009081526002602052604090205560095462001105908262002ad8565b600955505b600c5462001119908462002ad8565b600c556040805184815290516001600160a01b038616917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a26040805184815290516001600160a01b038616916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35060019392505050565b6006546000908210620011bb576000620009b2565b60068281548110620011c957fe5b6000918252602090912001546001600160a01b031692915050565b60008060076000620011f562002bd5565b6001600160a01b03166001600160a01b03168152602001908152602001600020541162001269576040805162461bcd60e51b815260206004820181905260248201527f4d696c6b3a2063616c6c6572206973206e6f742074686520537461626c655632604482015290519081900360640190fd5b60006200127883601462002a94565b9050600062001288848362002b91565b33600090815260026020526040902054909150620012a7908262002ad8565b3360009081526002602052604081209190915573ffcf83437a1eb718933f39ebe75ad96335bc1be490527f6b8f4fef7556cac5e814d6d800ed6a3aa582f70557367aff7d5019a2f15d34bb54620012ff908362002ad8565b73ffcf83437a1eb718933f39ebe75ad96335bc1be460005260026020527f6b8f4fef7556cac5e814d6d800ed6a3aa582f70557367aff7d5019a2f15d34bb55600c546200134d908562002ad8565b600c5560408051828152905133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360408051838152905173ffcf83437a1eb718933f39ebe75ad96335bc1be4916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a39392505050565b600654600090819081905b8082101562000ab55760068281548110620013fd57fe5b60009182526020822001546040805163a2e6204560e01b815290516001600160a01b039092169263a2e620459260048084019382900301818387803b1580156200144657600080fd5b505af11580156200145b573d6000803e3d6000fd5b505050506000600683815481106200146f57fe5b600091825260208083209091015460408051632b57434760e01b81526001600160a01b038b8116600483015291519190921693632b57434793602480850194919392918390030190829087803b158015620014c957600080fd5b505af1158015620014de573d6000803e3d6000fd5b505050506040513d6020811015620014f557600080fd5b5051905062001505848262002ad8565b935050600190910190620013e6565b60008060006200152362002bd5565b6001546001600160a01b03908116911614620015715760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600084118015620015825750606484105b620015d4576040805162461bcd60e51b815260206004820152601f60248201527f4d696c6b65723a20696e76616c69642062616e646974732070657263656e7400604482015290519081900360640190fd5b6000620015ef600d5460095462002a9490919063ffffffff16565b90506200160a606462001603838862002b33565b9062002a94565b93506200161984600a62002a94565b915062001627848362002b91565b6006549093506000908190819081905b8082101562001763576000806000600685815481106200165357fe5b9060005260206000200160000160009054906101000a90046001600160a01b03166001600160a01b0316635b76c7128e6040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b158015620016ba57600080fd5b505af1158015620016cf573d6000803e3d6000fd5b505050506040513d6060811015620016e657600080fd5b5080516020820151604090920151909450909250905062001708888462002ad8565b975062001716878362002ad8565b965062001724868262002ad8565b955062001754600686815481106200173857fe5b6000918252602090912001546001600160a01b03168262002bd9565b50506001909201915062001637565b506000905062001774858962002b91565b9050600085118015620017875750600081115b15620017f157620017a98162001603600d548862002b3390919063ffffffff16565b600d819055620017bb90829062002b33565b600955600b54620017db908490620017d4908a62002ad8565b9062002ad8565b600b55600c54620017ed908762002b91565b600c555b620017fd888562002ad8565b97506200180b878462002ad8565b965062001819868362002ad8565b604080518a8152602081018a905280820183905290519197508a917f976232a004b12cdbd7c3ce7d454fe1e8265752d8b7573d031e20184cfa1a07c69181900360600190a250505050509193909250565b60006200187662002bd5565b6001546001600160a01b03908116911614620018c45760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600a54600090620018d790606462002a94565b90506000620018f2600e548362002a9490919063ffffffff16565b905060006200190f600e54600a5462002a9490919063ffffffff16565b905060006200192c6200192483606462002a94565b839062002b91565b90506000821180156200193f5750600081115b156200198e57620019618162001603600e548562002b3390919063ffffffff16565b600e8190556200197390829062002b33565b600a55600b5462001985908462002ad8565b600b5562001993565b600092505b6040805184815290517f0c329f79ebcef45d12a32d1cd45cb01d499f469c0311673efd480d2e9f543ef49181900360200190a150909250505090565b6000620019dc8262000f72565b1562001a0257506001600160a01b038116600090815260026020526040902054620009b5565b60065460009081905b8082101562001a345762001a266006838154811062000a5357fe5b925060019091019062001a0b565b5050600d546001600160a01b03841660009081526002602052604090205462001a64918391620017d49162002a94565b9392505050565b62001a7562002bd5565b6000546001600160a01b0390811691161462001ad8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600062001b2e62002bd5565b6000546001600160a01b0390811691161462001b91576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000308360405160200180836001600160a01b031660601b8152601401826001600160a01b031660601b81526014019250505060405160208183030381529060405280519060200120905080308460405162001bed9062002d72565b6001600160a01b03928316815291166020820152604080518392819003909101906000f590508015801562001c26573d6000803e3d6000fd5b5091506001600160a01b03821662001c705760405162461bcd60e51b815260040180806020018281038252602f81526020018062004b3a602f913960400191505060405180910390fd5b60408051602080820183526001600160a01b038581168084526006805460018082018355600083815296517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90920180546001600160a01b03191692861692909217909155905491855260078452858520919091556005909252838320805460ff191690921790915585168152205460ff1662001d8f57600d546001600160a01b038416600090815260026020526040812054909162001d31919062002a94565b6001600160a01b03851660009081526002602052604090205460095491925062001d5c919062002b91565b6009556001600160a01b0384166000908152600260209081526040808320939093556005905220805460ff191660011790555b600654604080516001600160a01b0380861682523060208301528616818301526000199092016060830152517f4e4c3a9193c344ff05104b6235d880306f159319ad8727ddc36efa04349a7fee9181900360800190a150919050565b60085490565b60008062001e2662001e1e62001e1461546062001e0d62002965565b9062002b33565b6008549062002ad8565b429062002b91565b905062001e436154606200160383670de0b6b3a764000062002b33565b91505090565b6000546001600160a01b031690565b600654606090819067ffffffffffffffff8111801562001e7757600080fd5b5060405190808252806020026020018201604052801562001ea2578160200160208202803683370190505b506006549091506000905b8082101562000947576006828154811062001ec457fe5b60009182526020909120015483516001600160a01b039091169084908490811062001eeb57fe5b6001600160a01b039092166020928302919091019091015260019091019062001ead565b62001f1962002bd5565b6000546001600160a01b0390811691161462001f7c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f228db8ee4300998d545b80f9c24e8518ceaa382b3705d94b21298afc0065c7bc90600090a250565b604051806040016040528060048152602001634d494c4b60e01b81525081565b60065490565b600654600090819081905b8082101562000947576200205c600683815481106200201257fe5b6000918252602091829020015460408051637c25c81f60e11b815290516001600160a01b039092169263f84b903e92600480840193829003018186803b1580156200090357600080fd5b925060019091019062001ff7565b60006200207662002bd5565b6001546001600160a01b03908116911614620020c45760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600b54801580620020d55750600954155b15620020e657600091505062000890565b600062002101600d5460095462002a9490919063ffffffff16565b9050600062002111828462002ad8565b90506200212f8162001603600d548562002b3390919063ffffffff16565b600d8190556200214190829062002b33565b6009556000600b556040805184815290517fa1e8137d70f98302c6377f6d9457325c5068535cc4bfe7daa3e95a48a4cf0bd89181900360200190a1509091505090565b3360009081526004602090815260408083206001600160a01b0386168452909152812054808310620021da573360009081526004602090815260408083206001600160a01b03881684529091528120556200220b565b620021e6818462002b91565b3360009081526004602090815260408083206001600160a01b03891684529091529020555b3360008181526004602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6000826001600160a01b038116620022bb5760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b600080600033620022cc3362000f72565b620022d78962000f72565b925092509250600082620022fb57600d54620022f590889062002b33565b620022fd565b865b90506000826200231d57600d546200231790899062002b33565b6200231f565b875b9050831580156200234757506001600160a01b03851660009081526002602052604090205482115b156200235a576200235885620013db565b505b838015620023655750825b15620023e0576001600160a01b03851660009081526002602052604090205462002390908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b1681522054620023c1908262002ad8565b6001600160a01b038a1660009081526002602052604090205562002563565b83156200246e576001600160a01b0385166000908152600260205260409020546200240c908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b16815220546200243d908262002ad8565b6001600160a01b038a1660009081526002602052604090205560095462002465908262002ad8565b60095562002563565b8215620024f3576001600160a01b0385166000908152600260205260409020546200249a908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b1681522054620024cb908262002ad8565b6001600160a01b038a1660009081526002602052604090205560095462002465908362002b91565b6001600160a01b03851660009081526002602052604090205462002518908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b168152205462002549908262002ad8565b6001600160a01b038a166000908152600260205260409020555b886001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040518082815260200191505060405180910390a350600198975050505050505050565b60006200088d600e54600a5462002a9490919063ffffffff16565b600654600090819081905b8082101562000947576200264860068381548110620025fe57fe5b600091825260209182902001546040805163671dd38d60e11b815290516001600160a01b039092169263ce3ba71a92600480840193829003018186803b1580156200090357600080fd5b9250600190910190620025e3565b3360008181526005602052604090205460ff1615620026a75760405162461bcd60e51b815260040180806020018281038252603481526020018062004b8a6034913960400191505060405180910390fd5b620026b281620013db565b506000620026cc600d548462002b3390919063ffffffff16565b90506000620026e7600e548562002b3390919063ffffffff16565b6001600160a01b0384166000908152600260205260409020549091506200270f908362002b91565b6001600160a01b03841660009081526002602090815260408083209390935560039052205462002740908262002ad8565b6001600160a01b03841660009081526003602052604090205560095462002768908362002b91565b600955600a546200277a908262002ad8565b600a556040805185815290516001600160a01b038516917f4260f7ca2c87968cabbdc34199f1d1c370fa71a7b9fc3515f3d2c383f6ddee84919081900360200190a250505050565b3360008181526005602052604090205460ff1615620028135760405162461bcd60e51b815260040180806020018281038252603481526020018062004b8a6034913960400191505060405180910390fd5b6200281e81620013db565b50600062002838600d548462002b3390919063ffffffff16565b9050600062002853600e548562002b3390919063ffffffff16565b6001600160a01b0384166000908152600260205260409020549091506200287b908362002ad8565b6001600160a01b038416600090815260026020908152604080832093909355600390522054620028ac908262002b91565b6001600160a01b038416600090815260036020526040902055600954620028d4908362002ad8565b600955600a54620028e6908262002b91565b600a556040805185815290516001600160a01b038516917f653e5ff55ca48790142c29d106f9894a46f039160ea9f49c1fa78fd3748fdf5a919081900360200190a250505050565b61546090565b600d5490565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60006200088d615460620016036008544262002b9190919063ffffffff16565b6200298f62002bd5565b6000546001600160a01b03908116911614620029f2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811662002a395760405162461bcd60e51b815260040180806020018281038252602681526020018062004ae96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600062001a6483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062002c6e565b60008282018381101562001a64576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008262002b445750600062000a1b565b8282028284828162002b5257fe5b041462001a645760405162461bcd60e51b815260040180806020018281038252602181526020018062004b696021913960400191505060405180910390fd5b600062001a6483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062002d15565b3390565b6001600160a01b03821660009081526002602052604090205462002bfe908262002b91565b6001600160a01b038316600090815260026020526040902055600c5462002c26908262002b91565b600c556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000818362002cfe5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562002cc257818101518382015260200162002ca8565b50505050905090810190601f16801562002cf05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858162002d0b57fe5b0495945050505050565b6000818484111562002d6a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831562002cc257818101518382015260200162002ca8565b505050900390565b611d688062002d818339019056fe6080604052670de0b6b3a76400006005553480156200001d57600080fd5b5060405162001d6838038062001d68833981810160405260408110156200004357600080fd5b508051602090910151600062000058620001c5565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062001d12833981519152908290a3506001600160a01b038216620000d85760405162461bcd60e51b815260040180806020018281038252603181526020018062001ce16031913960400191505060405180910390fd5b6001600160a01b0381166200011f5760405162461bcd60e51b815260040180806020018281038252603681526020018062001d326036913960400191505060405180910390fd5b600180546001600160a01b038085166001600160a01b03199283168117909355600280549185169190921617905560408051638da5cb5b60e01b81529051620001bd9291638da5cb5b916004808301926020929190829003018186803b1580156200018957600080fd5b505afa1580156200019e573d6000803e3d6000fd5b505050506040513d6020811015620001b557600080fd5b5051620001c9565b5050620002c7565b3390565b620001d3620001c5565b6000546001600160a01b0390811691161462000236576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166200027d5760405162461bcd60e51b815260040180806020018281038252602681526020018062001cbb6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062001d1283398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6119e480620002d76000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063812de113116100f9578063ce3ba71a11610097578063e4a3011611610071578063e4a301161461037b578063f2fde38b1461039e578063f84b903e146103c4578063fc0c546a146103cc576101b9565b8063ce3ba71a14610345578063e20ccec31461034d578063e22a5b2614610355576101b9565b8063a2e62045116100d3578063a2e6204514610310578063a694fc3a14610318578063b5ad304214610335578063c1633d5c1461033d576101b9565b8063812de113146102da5780638da5cb5b146102e25780639058a51c146102ea576101b9565b8063379607f5116101665780636fd5ae15116101405780636fd5ae15146102ba578063715018a6146102c25780637824407f146102ca57806378e97925146102d2576101b9565b8063379607f514610258578063599946a0146102775780635b76c7121461027f576101b9565b80631ffe54b2116101975780631ffe54b2146101e8578063274b781b1461020e5780632b57434714610232576101b9565b806305e66729146101be57806305e88b69146101d857806312b4110f146101e0575b600080fd5b6101c66103d4565b60408051918252519081900360200190f35b6101c66103db565b6101c6610439565b6101c6600480360360208110156101fe57600080fd5b50356001600160a01b031661043f565b6102166105a4565b604080516001600160a01b039092168252519081900360200190f35b6101c66004803603602081101561024857600080fd5b50356001600160a01b03166105b3565b6102756004803603602081101561026e57600080fd5b5035610618565b005b6101c6610892565b61029c6004803603602081101561029557600080fd5b5035610898565b60408051938452602084019290925282820152519081900360600190f35b6101c66109f5565b610275610a2d565b6101c6610aee565b6101c6610b6a565b6101c6610b70565b610216610b76565b6101c66004803603602081101561030057600080fd5b50356001600160a01b0316610b85565b610275610ba0565b6102756004803603602081101561032e57600080fd5b5035610cc8565b6101c6610f52565b6101c6610fa8565b6101c6610ff3565b6101c66110dd565b6101c66004803603602081101561036b57600080fd5b50356001600160a01b0316611111565b6102756004803603604081101561039157600080fd5b508035906020013561112f565b610275600480360360208110156103b457600080fd5b50356001600160a01b0316611245565b6101c661135c565b610216611362565b6009545b90565b6000600454600014806103f057504260045410155b156103fd575060006103d8565b600854600454600a5462093a8090829003819004914203045b8082101561043157600a830490920391600190910190610416565b509091505090565b600a5490565b600080610456600954610450610ff3565b90611371565b90506000610462610aee565b60065490915082158015906104775750600082115b156104b7576104b46104ad836104a764e8d4a510006104a161049a8960146113ba565b8990611371565b906113fc565b906113ba565b8290611455565b90505b6001600160a01b0385166000908152600360205260408120546104e59064e8d4a51000906104a790856113fc565b6005546001600160a01b0388166000908152600360205260408120600101549293509161051f91670de0b6b3a7640000916104a7916113fc565b6001600160a01b03881660009081526003602052604090206002015460055491925014610578576005546001600160a01b03881660009081526003602052604090206002015461057591906104a79084906113fc565b90505b80821161058d5760009550505050505061059f565b6105978282611371565b955050505050505b919050565b6001546001600160a01b031690565b60006105bd6114af565b6001546001600160a01b039081169116146106095760405162461bcd60e51b815260040180806020018281038252602b81526020018061188e602b913960400191505060405180910390fd5b610612826114b3565b92915050565b60015460408051633af32abf60e01b81523360048201819052915191926001600160a01b031691633af32abf91602480820192602092909190829003018186803b15801561066557600080fd5b505afa158015610679573d6000803e3d6000fd5b505050506040513d602081101561068f57600080fd5b5051156106cd5760405162461bcd60e51b81526004018080602001828103825260368152602001806119436036913960400191505060405180910390fd5b6106d5610ba0565b6106de816114b3565b5081156107dc576001600160a01b0381166000908152600360205260409020546107089083611371565b6001600160a01b03808316600081815260036020908152604080832095909555600254855163a9059cbb60e01b8152600481019490945260248401889052945191949093169263a9059cbb926044808201939182900301818787803b15801561077057600080fd5b505af1158015610784573d6000803e3d6000fd5b505050506040513d602081101561079a57600080fd5b50519050806107da5760405162461bcd60e51b81526004018080602001828103825260228152602001806119006022913960400191505060405180910390fd5b505b6006546001600160a01b038216600090815260036020526040812054909161080f9164e8d4a51000916104a791906113fc565b60055490915061082b906104a783670de0b6b3a76400006113fc565b6001600160a01b03831660008181526003602090815260409182902060018101949094556005546002909401939093558051868152905191927fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a92918290030190a2505050565b60085490565b60008060006108a56114af565b6001546001600160a01b039081169116146108f15760405162461bcd60e51b815260040180806020018281038252602b81526020018061188e602b913960400191505060405180910390fd5b6108f9610ba0565b6000610903610fa8565b90508061091b576000806000935093509350506109ee565b61092a60646104a783886113fc565b935061093784600a6113ba565b91506109438483611371565b60015490935061095c906001600160a01b031684611634565b61098261097960646104a7886005546113fc90919063ffffffff16565b60055490611371565b6005556006546109a69061099d906064906104a790896113fc565b60065490611371565b6006556040805185815260208101859052808201849052905186917f976232a004b12cdbd7c3ce7d454fe1e8265752d8b7573d031e20184cfa1a07c6919081900360600190a2505b9193909250565b600060045460001480610a0a57504260045410155b15610a17575060006103d8565b62093a80600454420381610a2757fe5b04905090565b610a356114af565b6000546001600160a01b03908116911614610a97576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b3957600080fd5b505afa158015610b4d573d6000803e3d6000fd5b505050506040513d6020811015610b6357600080fd5b5051905090565b60045490565b60065490565b6000546001600160a01b031690565b6001600160a01b031660009081526003602052604090205490565b600a544211610bae57610cc6565b6000610bb86103db565b90506000610bc4610ff3565b90506009548111610bda57505042600a55610cc6565b6000610be4610aee565b905080610bfb575060095560085542600a55610cc6565b6000610c126009548461137190919063ffffffff16565b60015460408051635018d7a960e01b81526004810184905290519293506000926001600160a01b0390921691635018d7a99160248082019260209290919082900301818787803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d6020811015610c8f57600080fd5b50519050610cb2610ca9846104a78464e8d4a510006113fc565b60065490611455565b60065550505060089190915560095542600a555b565b60015460408051633af32abf60e01b81523360048201819052915191926001600160a01b031691633af32abf91602480820192602092909190829003018186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b505115610d7d5760405162461bcd60e51b81526004018080602001828103825260368152602001806119796036913960400191505060405180910390fd5b610d85610ba0565b610d8e816114b3565b508115610e9c57600254604080516323b872dd60e01b81526001600160a01b03848116600483015230602483015260448201869052915160009392909216916323b872dd9160648082019260209290919082900301818787803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b505050506040513d6020811015610e1e57600080fd5b5051905080610e5e5760405162461bcd60e51b81526004018080602001828103825260228152602001806119006022913960400191505060405180910390fd5b6001600160a01b038216600090815260036020526040902054610e819084611455565b6001600160a01b038316600090815260036020526040902055505b6006546001600160a01b0382166000908152600360205260408120549091610ecf9164e8d4a51000916104a791906113fc565b600554909150610eeb906104a783670de0b6b3a76400006113fc565b6001600160a01b03831660008181526003602090815260409182902060018101949094556005546002909401939093558051868152905191927f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d92918290030190a2505050565b600060045460001480610f6757504260045410155b15610f74575060006103d8565b600062093a80610f826109f5565b02600454014203905062093a8081670de0b6b3a76400000281610fa157fe5b0491505090565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b3957600080fd5b60006004546000148061100857504260045410155b15611015575060006103d8565b600062093a80600454600a54038161102957fe5b049050600062093a8060045442038161103e57fe5b0490508082141561106b5762093a80600854600a544203028161105d57fe5b0460095401925050506103d8565b600854600a80546004546001959095019462093a80868102909101919091038302049190810490035b828410156110b15790810190600a81600190950194049003611094565b62093a808162093a80850260045401420302816110ca57fe5b0482019150816009540194505050505090565b6000806110e8610ff3565b905060075481116110fd5760009150506103d8565b60075461110b908290611371565b91505090565b6001600160a01b031660009081526003602052604090206001015490565b6111376114af565b6000546001600160a01b03908116911614611199576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111a1610ff3565b156111f3576040805162461bcd60e51b815260206004820152601960248201527f537461626c6556323a20616c7265616479207374617274656400000000000000604482015290519081900360640190fd5b6004829055600781026008819055600a83905560408051848152602081019290925280517f997896709b4e932ee42750e2e14ed1f7ab6c60bd911ff567aa2485cf0b20051b9281900390910190a15050565b61124d6114af565b6000546001600160a01b039081169116146112af576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166112f45760405162461bcd60e51b81526004018080602001828103825260268152602001806118b96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60075490565b6002546001600160a01b031690565b60006113b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611791565b9392505050565b60006113b383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611828565b60008261140b57506000610612565b8282028284828161141857fe5b04146113b35760405162461bcd60e51b81526004018080602001828103825260218152602001806119226021913960400191505060405180910390fd5b6000828201838110156113b3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166000908152600360205260408120600654815483916114e79164e8d4a51000916104a791906113fc565b90506000611510670de0b6b3a76400006104a760055486600101546113fc90919063ffffffff16565b90508260020154600554146115475761153c6005546104a78560020154846113fc90919063ffffffff16565b600554600285015590505b8082111561162c57600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b505190506115d28383611371565b92508083116115e157826115e3565b805b600554909550611603906104a7670de0b6b3a76400006104a1868a611455565b6001850155600554600285015560075461161d9086611455565b60075561162a8686611634565b505b505050919050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561167f57600080fd5b505afa158015611693573d6000803e3d6000fd5b505050506040513d60208110156116a957600080fd5b5051905060008183116116bc57826116be565b815b9050801561178b576001546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018590529151600093929092169163a9059cbb9160448082019260209290919082900301818787803b15801561171f57600080fd5b505af1158015611733573d6000803e3d6000fd5b505050506040513d602081101561174957600080fd5b50519050806117895760405162461bcd60e51b81526004018080602001828103825260218152602001806118df6021913960400191505060405180910390fd5b505b50505050565b600081848411156118205760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156117e55781810151838201526020016117cd565b50505050905090810190601f1680156118125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836118775760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156117e55781810151838201526020016117cd565b50600083858161188357fe5b049594505050505056fe537461626c6556323a2063616c6c6572206973206e6f7420746865204d696c6b657220636f6e74726163744f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537461626c6556323a20756e61626c6520746f207472616e73666572204d494c4b537461626c6556323a20756e61626c6520746f207472616e73666572207374616b65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77537461626c6556323a2077686974656c6973746564204d494c4b20686f6c646572732063616e6e6f7420636c61696d20746f6b656e73537461626c6556323a2077686974656c6973746564204d494c4b20686f6c646572732063616e6e6f74207374616b6520746f6b656e73a26469706673582212206adc4592aac4c61b6a7cb18c1dd17111182d432f838c8f11bd2be1eba8d4fc3664736f6c634300060c00334f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537461626c6556323a204d696c6b657220636f6e747261637420616464726573732063616e6e6f7420626520656d7074798be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0537461626c6556323a20455243323020746f6b656e20636f6e747261637420616464726573732063616e6e6f7420626520656d7074794f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d696c6b3a20756e61626c6520746f2073656e6420746f6b656e7320746f207a65726f20616464726573734d696c6b3a20756e61626c6520746f20637265617465206465706c6f7920537461626c65563220636f6e7472616374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d696c6b3a2077686974656c697374656420686f6c646572732063616e6e6f742075736520536865726966662773205661756c744d696c6b3a2063616c6c6572206973206e6f742074686520636f6e74726f6c6c6572a264697066735822122008f730cfc637e2e90d89159c35308a8c6460e616246cd5189bdac1cf89877e7164736f6c634300060c0033

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620003285760003560e01c8063758b689811620001ad578063a457c2d711620000f9578063c9f9619c11620000a5578063dd62ed3e116200007b578063dd62ed3e146200080e578063ef78d4fd146200083f578063f2fde38b14620008495762000328565b8063c9f9619c14620007da578063d2ca211514620007fa578063dcbdac3014620008045762000328565b8063acf9778f11620000db578063acf9778f14620007a6578063b928df4b14620007b0578063bd75bab514620007ba5762000328565b8063a457c2d71462000748578063a9059cbb14620007775762000328565b806392eefe9b116200015957806396cbfa4d116200013b57806396cbfa4d146200072a578063a17f9f391462000734578063a2f96a13146200073e5762000328565b806392eefe9b14620006f757806395d89b4114620007205762000328565b80637e37c312116200018f5780637e37c31214620006875780638da5cb5b14620006915780638f142907146200069b5762000328565b8063758b6898146200065457806378e97925146200067d5762000328565b806336a1b5a011620002795780635018d7a9116200022557806368ff7d0b11620001fb57806368ff7d0b146200061557806370a08231146200061f578063715018a614620006485762000328565b80635018d7a9146200058e578063521c863314620005ae5780635b76c71214620005d75762000328565b80633af32abf116200025b5780633af32abf14620004fa57806340c10f19146200052357806348a7b29314620005525762000328565b806336a1b5a014620004c15780633950935114620004cb5762000328565b806309b1f2d111620002d95780631ffe54b211620002bb5780631ffe54b2146200045557806323b872dd146200047e578063313ce56714620004b75762000328565b806309b1f2d1146200044157806318160ddd146200044b5762000328565b806306fdde03116200030f57806306fdde0314620003535780630709df4514620003d5578063095ea7b314620003fe5762000328565b806303d3d3ca146200032d57806305e88b691462000349575b600080fd5b6200033762000872565b60408051918252519081900360200190f35b6200033762000893565b6200035d6200094f565b6040805160208082528351818301528351919283929083019185019080838360005b83811015620003995781810151838201526020016200037f565b50505050905090810190601f168015620003c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6200033760048036036020811015620003ed57600080fd5b50356001600160a01b031662000988565b6200042d600480360360408110156200041657600080fd5b506001600160a01b038135169060200135620009ba565b604080519115158252519081900360200190f35b6200033762000a21565b6200033762000a27565b62000337600480360360208110156200046d57600080fd5b50356001600160a01b031662000a2d565b6200042d600480360360608110156200049657600080fd5b506001600160a01b0381358116916020810135909116906040013562000abe565b6200033762000e5a565b6200033762000e5f565b6200042d60048036036040811015620004e357600080fd5b506001600160a01b03813516906020013562000edd565b6200042d600480360360208110156200051257600080fd5b50356001600160a01b031662000f72565b6200042d600480360360408110156200053b57600080fd5b506001600160a01b03813516906020013562000f90565b62000572600480360360208110156200056a57600080fd5b5035620011a6565b604080516001600160a01b039092168252519081900360200190f35b6200033760048036036020811015620005a657600080fd5b5035620011e4565b6200033760048036036020811015620005c657600080fd5b50356001600160a01b0316620013db565b620005f760048036036020811015620005ef57600080fd5b503562001514565b60408051938452602084019290925282820152519081900360600190f35b620003376200186a565b62000337600480360360208110156200063757600080fd5b50356001600160a01b0316620019cf565b6200065262001a6b565b005b62000572600480360360208110156200066c57600080fd5b50356001600160a01b031662001b22565b6200033762001deb565b6200033762001df1565b6200057262001e49565b620006a562001e58565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015620006e3578181015183820152602001620006c9565b505050509050019250505060405180910390f35b62000652600480360360208110156200070f57600080fd5b50356001600160a01b031662001f0f565b6200035d62001fc6565b6200033762001fe6565b6200033762001fec565b620003376200206a565b6200042d600480360360408110156200076057600080fd5b506001600160a01b03813516906020013562002184565b6200042d600480360360408110156200078f57600080fd5b506001600160a01b03813516906020013562002271565b62000337620025bd565b62000337620025d8565b6200065260048036036020811015620007d257600080fd5b503562002656565b6200065260048036036020811015620007f257600080fd5b5035620027c2565b620003376200292e565b6200033762002934565b62000337600480360360408110156200082657600080fd5b506001600160a01b03813581169160200135166200293a565b6200033762002965565b62000652600480360360208110156200086157600080fd5b50356001600160a01b031662002985565b60006200088d600d5460095462002a9490919063ffffffff16565b90505b90565b600654600090819081905b8082101562000947576200093960068381548110620008b957fe5b60009182526020918290200154604080516305e88b6960e01b815290516001600160a01b03909216926305e88b6992600480840193829003018186803b1580156200090357600080fd5b505afa15801562000918573d6000803e3d6000fd5b505050506040513d60208110156200092f57600080fd5b5051849062002ad8565b92506001909101906200089e565b509091505090565b6040518060400160405280600e81526020017f436f77626f792e46696e616e636500000000000000000000000000000000000081525081565b600e546001600160a01b0382166000908152600360205260408120549091620009b2919062002a94565b90505b919050565b3360008181526004602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b600b5490565b600c5490565b600654600090819081905b8082101562000ab55762000aa76006838154811062000a5357fe5b6000918252602091829020015460408051630fff2a5960e11b81526001600160a01b038a8116600483015291519190921692631ffe54b29260248082019391829003018186803b1580156200090357600080fd5b925060019091019062000a38565b50909392505050565b6000826001600160a01b03811662000b085760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b60008062000b163362000f72565b62000b218762000f72565b9150915060008262000b4357600d5462000b3d90879062002b33565b62000b45565b855b905060008262000b6557600d5462000b5f90889062002b33565b62000b67565b865b6001600160a01b038a16600090815260046020908152604080832033845290915290205490915062000b9a908862002b91565b6001600160a01b038a1660009081526004602090815260408083203384529091529020558315801562000be457506001600160a01b03891660009081526002602052604090205482115b1562000bf75762000bf589620013db565b505b83801562000c025750825b1562000c7d576001600160a01b03891660009081526002602052604090205462000c2d908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000c5e908262002ad8565b6001600160a01b03891660009081526002602052604090205562000e00565b831562000d0b576001600160a01b03891660009081526002602052604090205462000ca9908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000cda908262002ad8565b6001600160a01b03891660009081526002602052604090205560095462000d02908262002ad8565b60095562000e00565b821562000d90576001600160a01b03891660009081526002602052604090205462000d37908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000d68908262002ad8565b6001600160a01b03891660009081526002602052604090205560095462000d02908362002b91565b6001600160a01b03891660009081526002602052604090205462000db5908362002b91565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205462000de6908262002ad8565b6001600160a01b0389166000908152600260205260409020555b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a350600198975050505050505050565b601281565b600654600090819081905b80821015620009475762000ecf6006838154811062000e8557fe5b600091825260209182902001546040805163e20ccec360e01b815290516001600160a01b039092169263e20ccec392600480840193829003018186803b1580156200090357600080fd5b925060019091019062000e6a565b3360009081526004602090815260408083206001600160a01b038616845290915281205462000f0d908362002ad8565b3360008181526004602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b6001600160a01b031660009081526005602052604090205460ff1690565b6000826001600160a01b03811662000fda5760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b62000fe462002bd5565b6000546001600160a01b0390811691161462001047576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b620010528462000f72565b156200109c576001600160a01b0384166000908152600260205260409020546200107d908462002ad8565b6001600160a01b0385166000908152600260205260409020556200110a565b6000620010b5600d548562002b3390919063ffffffff16565b6001600160a01b038616600090815260026020526040902054909150620010dd908262002ad8565b6001600160a01b03861660009081526002602052604090205560095462001105908262002ad8565b600955505b600c5462001119908462002ad8565b600c556040805184815290516001600160a01b038616917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a26040805184815290516001600160a01b038616916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35060019392505050565b6006546000908210620011bb576000620009b2565b60068281548110620011c957fe5b6000918252602090912001546001600160a01b031692915050565b60008060076000620011f562002bd5565b6001600160a01b03166001600160a01b03168152602001908152602001600020541162001269576040805162461bcd60e51b815260206004820181905260248201527f4d696c6b3a2063616c6c6572206973206e6f742074686520537461626c655632604482015290519081900360640190fd5b60006200127883601462002a94565b9050600062001288848362002b91565b33600090815260026020526040902054909150620012a7908262002ad8565b3360009081526002602052604081209190915573ffcf83437a1eb718933f39ebe75ad96335bc1be490527f6b8f4fef7556cac5e814d6d800ed6a3aa582f70557367aff7d5019a2f15d34bb54620012ff908362002ad8565b73ffcf83437a1eb718933f39ebe75ad96335bc1be460005260026020527f6b8f4fef7556cac5e814d6d800ed6a3aa582f70557367aff7d5019a2f15d34bb55600c546200134d908562002ad8565b600c5560408051828152905133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360408051838152905173ffcf83437a1eb718933f39ebe75ad96335bc1be4916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a39392505050565b600654600090819081905b8082101562000ab55760068281548110620013fd57fe5b60009182526020822001546040805163a2e6204560e01b815290516001600160a01b039092169263a2e620459260048084019382900301818387803b1580156200144657600080fd5b505af11580156200145b573d6000803e3d6000fd5b505050506000600683815481106200146f57fe5b600091825260208083209091015460408051632b57434760e01b81526001600160a01b038b8116600483015291519190921693632b57434793602480850194919392918390030190829087803b158015620014c957600080fd5b505af1158015620014de573d6000803e3d6000fd5b505050506040513d6020811015620014f557600080fd5b5051905062001505848262002ad8565b935050600190910190620013e6565b60008060006200152362002bd5565b6001546001600160a01b03908116911614620015715760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600084118015620015825750606484105b620015d4576040805162461bcd60e51b815260206004820152601f60248201527f4d696c6b65723a20696e76616c69642062616e646974732070657263656e7400604482015290519081900360640190fd5b6000620015ef600d5460095462002a9490919063ffffffff16565b90506200160a606462001603838862002b33565b9062002a94565b93506200161984600a62002a94565b915062001627848362002b91565b6006549093506000908190819081905b8082101562001763576000806000600685815481106200165357fe5b9060005260206000200160000160009054906101000a90046001600160a01b03166001600160a01b0316635b76c7128e6040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b158015620016ba57600080fd5b505af1158015620016cf573d6000803e3d6000fd5b505050506040513d6060811015620016e657600080fd5b5080516020820151604090920151909450909250905062001708888462002ad8565b975062001716878362002ad8565b965062001724868262002ad8565b955062001754600686815481106200173857fe5b6000918252602090912001546001600160a01b03168262002bd9565b50506001909201915062001637565b506000905062001774858962002b91565b9050600085118015620017875750600081115b15620017f157620017a98162001603600d548862002b3390919063ffffffff16565b600d819055620017bb90829062002b33565b600955600b54620017db908490620017d4908a62002ad8565b9062002ad8565b600b55600c54620017ed908762002b91565b600c555b620017fd888562002ad8565b97506200180b878462002ad8565b965062001819868362002ad8565b604080518a8152602081018a905280820183905290519197508a917f976232a004b12cdbd7c3ce7d454fe1e8265752d8b7573d031e20184cfa1a07c69181900360600190a250505050509193909250565b60006200187662002bd5565b6001546001600160a01b03908116911614620018c45760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600a54600090620018d790606462002a94565b90506000620018f2600e548362002a9490919063ffffffff16565b905060006200190f600e54600a5462002a9490919063ffffffff16565b905060006200192c6200192483606462002a94565b839062002b91565b90506000821180156200193f5750600081115b156200198e57620019618162001603600e548562002b3390919063ffffffff16565b600e8190556200197390829062002b33565b600a55600b5462001985908462002ad8565b600b5562001993565b600092505b6040805184815290517f0c329f79ebcef45d12a32d1cd45cb01d499f469c0311673efd480d2e9f543ef49181900360200190a150909250505090565b6000620019dc8262000f72565b1562001a0257506001600160a01b038116600090815260026020526040902054620009b5565b60065460009081905b8082101562001a345762001a266006838154811062000a5357fe5b925060019091019062001a0b565b5050600d546001600160a01b03841660009081526002602052604090205462001a64918391620017d49162002a94565b9392505050565b62001a7562002bd5565b6000546001600160a01b0390811691161462001ad8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600062001b2e62002bd5565b6000546001600160a01b0390811691161462001b91576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000308360405160200180836001600160a01b031660601b8152601401826001600160a01b031660601b81526014019250505060405160208183030381529060405280519060200120905080308460405162001bed9062002d72565b6001600160a01b03928316815291166020820152604080518392819003909101906000f590508015801562001c26573d6000803e3d6000fd5b5091506001600160a01b03821662001c705760405162461bcd60e51b815260040180806020018281038252602f81526020018062004b3a602f913960400191505060405180910390fd5b60408051602080820183526001600160a01b038581168084526006805460018082018355600083815296517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90920180546001600160a01b03191692861692909217909155905491855260078452858520919091556005909252838320805460ff191690921790915585168152205460ff1662001d8f57600d546001600160a01b038416600090815260026020526040812054909162001d31919062002a94565b6001600160a01b03851660009081526002602052604090205460095491925062001d5c919062002b91565b6009556001600160a01b0384166000908152600260209081526040808320939093556005905220805460ff191660011790555b600654604080516001600160a01b0380861682523060208301528616818301526000199092016060830152517f4e4c3a9193c344ff05104b6235d880306f159319ad8727ddc36efa04349a7fee9181900360800190a150919050565b60085490565b60008062001e2662001e1e62001e1461546062001e0d62002965565b9062002b33565b6008549062002ad8565b429062002b91565b905062001e436154606200160383670de0b6b3a764000062002b33565b91505090565b6000546001600160a01b031690565b600654606090819067ffffffffffffffff8111801562001e7757600080fd5b5060405190808252806020026020018201604052801562001ea2578160200160208202803683370190505b506006549091506000905b8082101562000947576006828154811062001ec457fe5b60009182526020909120015483516001600160a01b039091169084908490811062001eeb57fe5b6001600160a01b039092166020928302919091019091015260019091019062001ead565b62001f1962002bd5565b6000546001600160a01b0390811691161462001f7c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f228db8ee4300998d545b80f9c24e8518ceaa382b3705d94b21298afc0065c7bc90600090a250565b604051806040016040528060048152602001634d494c4b60e01b81525081565b60065490565b600654600090819081905b8082101562000947576200205c600683815481106200201257fe5b6000918252602091829020015460408051637c25c81f60e11b815290516001600160a01b039092169263f84b903e92600480840193829003018186803b1580156200090357600080fd5b925060019091019062001ff7565b60006200207662002bd5565b6001546001600160a01b03908116911614620020c45760405162461bcd60e51b815260040180806020018281038252602281526020018062004bbe6022913960400191505060405180910390fd5b600b54801580620020d55750600954155b15620020e657600091505062000890565b600062002101600d5460095462002a9490919063ffffffff16565b9050600062002111828462002ad8565b90506200212f8162001603600d548562002b3390919063ffffffff16565b600d8190556200214190829062002b33565b6009556000600b556040805184815290517fa1e8137d70f98302c6377f6d9457325c5068535cc4bfe7daa3e95a48a4cf0bd89181900360200190a1509091505090565b3360009081526004602090815260408083206001600160a01b0386168452909152812054808310620021da573360009081526004602090815260408083206001600160a01b03881684529091528120556200220b565b620021e6818462002b91565b3360009081526004602090815260408083206001600160a01b03891684529091529020555b3360008181526004602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6000826001600160a01b038116620022bb5760405162461bcd60e51b815260040180806020018281038252602b81526020018062004b0f602b913960400191505060405180910390fd5b600080600033620022cc3362000f72565b620022d78962000f72565b925092509250600082620022fb57600d54620022f590889062002b33565b620022fd565b865b90506000826200231d57600d546200231790899062002b33565b6200231f565b875b9050831580156200234757506001600160a01b03851660009081526002602052604090205482115b156200235a576200235885620013db565b505b838015620023655750825b15620023e0576001600160a01b03851660009081526002602052604090205462002390908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b1681522054620023c1908262002ad8565b6001600160a01b038a1660009081526002602052604090205562002563565b83156200246e576001600160a01b0385166000908152600260205260409020546200240c908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b16815220546200243d908262002ad8565b6001600160a01b038a1660009081526002602052604090205560095462002465908262002ad8565b60095562002563565b8215620024f3576001600160a01b0385166000908152600260205260409020546200249a908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b1681522054620024cb908262002ad8565b6001600160a01b038a1660009081526002602052604090205560095462002465908362002b91565b6001600160a01b03851660009081526002602052604090205462002518908362002b91565b6001600160a01b0380871660009081526002602052604080822093909355908b168152205462002549908262002ad8565b6001600160a01b038a166000908152600260205260409020555b886001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040518082815260200191505060405180910390a350600198975050505050505050565b60006200088d600e54600a5462002a9490919063ffffffff16565b600654600090819081905b8082101562000947576200264860068381548110620025fe57fe5b600091825260209182902001546040805163671dd38d60e11b815290516001600160a01b039092169263ce3ba71a92600480840193829003018186803b1580156200090357600080fd5b9250600190910190620025e3565b3360008181526005602052604090205460ff1615620026a75760405162461bcd60e51b815260040180806020018281038252603481526020018062004b8a6034913960400191505060405180910390fd5b620026b281620013db565b506000620026cc600d548462002b3390919063ffffffff16565b90506000620026e7600e548562002b3390919063ffffffff16565b6001600160a01b0384166000908152600260205260409020549091506200270f908362002b91565b6001600160a01b03841660009081526002602090815260408083209390935560039052205462002740908262002ad8565b6001600160a01b03841660009081526003602052604090205560095462002768908362002b91565b600955600a546200277a908262002ad8565b600a556040805185815290516001600160a01b038516917f4260f7ca2c87968cabbdc34199f1d1c370fa71a7b9fc3515f3d2c383f6ddee84919081900360200190a250505050565b3360008181526005602052604090205460ff1615620028135760405162461bcd60e51b815260040180806020018281038252603481526020018062004b8a6034913960400191505060405180910390fd5b6200281e81620013db565b50600062002838600d548462002b3390919063ffffffff16565b9050600062002853600e548562002b3390919063ffffffff16565b6001600160a01b0384166000908152600260205260409020549091506200287b908362002ad8565b6001600160a01b038416600090815260026020908152604080832093909355600390522054620028ac908262002b91565b6001600160a01b038416600090815260036020526040902055600954620028d4908362002ad8565b600955600a54620028e6908262002b91565b600a556040805185815290516001600160a01b038516917f653e5ff55ca48790142c29d106f9894a46f039160ea9f49c1fa78fd3748fdf5a919081900360200190a250505050565b61546090565b600d5490565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60006200088d615460620016036008544262002b9190919063ffffffff16565b6200298f62002bd5565b6000546001600160a01b03908116911614620029f2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811662002a395760405162461bcd60e51b815260040180806020018281038252602681526020018062004ae96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600062001a6483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062002c6e565b60008282018381101562001a64576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008262002b445750600062000a1b565b8282028284828162002b5257fe5b041462001a645760405162461bcd60e51b815260040180806020018281038252602181526020018062004b696021913960400191505060405180910390fd5b600062001a6483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062002d15565b3390565b6001600160a01b03821660009081526002602052604090205462002bfe908262002b91565b6001600160a01b038316600090815260026020526040902055600c5462002c26908262002b91565b600c556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000818362002cfe5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562002cc257818101518382015260200162002ca8565b50505050905090810190601f16801562002cf05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858162002d0b57fe5b0495945050505050565b6000818484111562002d6a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831562002cc257818101518382015260200162002ca8565b505050900390565b611d688062002d818339019056fe6080604052670de0b6b3a76400006005553480156200001d57600080fd5b5060405162001d6838038062001d68833981810160405260408110156200004357600080fd5b508051602090910151600062000058620001c5565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062001d12833981519152908290a3506001600160a01b038216620000d85760405162461bcd60e51b815260040180806020018281038252603181526020018062001ce16031913960400191505060405180910390fd5b6001600160a01b0381166200011f5760405162461bcd60e51b815260040180806020018281038252603681526020018062001d326036913960400191505060405180910390fd5b600180546001600160a01b038085166001600160a01b03199283168117909355600280549185169190921617905560408051638da5cb5b60e01b81529051620001bd9291638da5cb5b916004808301926020929190829003018186803b1580156200018957600080fd5b505afa1580156200019e573d6000803e3d6000fd5b505050506040513d6020811015620001b557600080fd5b5051620001c9565b5050620002c7565b3390565b620001d3620001c5565b6000546001600160a01b0390811691161462000236576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166200027d5760405162461bcd60e51b815260040180806020018281038252602681526020018062001cbb6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062001d1283398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6119e480620002d76000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063812de113116100f9578063ce3ba71a11610097578063e4a3011611610071578063e4a301161461037b578063f2fde38b1461039e578063f84b903e146103c4578063fc0c546a146103cc576101b9565b8063ce3ba71a14610345578063e20ccec31461034d578063e22a5b2614610355576101b9565b8063a2e62045116100d3578063a2e6204514610310578063a694fc3a14610318578063b5ad304214610335578063c1633d5c1461033d576101b9565b8063812de113146102da5780638da5cb5b146102e25780639058a51c146102ea576101b9565b8063379607f5116101665780636fd5ae15116101405780636fd5ae15146102ba578063715018a6146102c25780637824407f146102ca57806378e97925146102d2576101b9565b8063379607f514610258578063599946a0146102775780635b76c7121461027f576101b9565b80631ffe54b2116101975780631ffe54b2146101e8578063274b781b1461020e5780632b57434714610232576101b9565b806305e66729146101be57806305e88b69146101d857806312b4110f146101e0575b600080fd5b6101c66103d4565b60408051918252519081900360200190f35b6101c66103db565b6101c6610439565b6101c6600480360360208110156101fe57600080fd5b50356001600160a01b031661043f565b6102166105a4565b604080516001600160a01b039092168252519081900360200190f35b6101c66004803603602081101561024857600080fd5b50356001600160a01b03166105b3565b6102756004803603602081101561026e57600080fd5b5035610618565b005b6101c6610892565b61029c6004803603602081101561029557600080fd5b5035610898565b60408051938452602084019290925282820152519081900360600190f35b6101c66109f5565b610275610a2d565b6101c6610aee565b6101c6610b6a565b6101c6610b70565b610216610b76565b6101c66004803603602081101561030057600080fd5b50356001600160a01b0316610b85565b610275610ba0565b6102756004803603602081101561032e57600080fd5b5035610cc8565b6101c6610f52565b6101c6610fa8565b6101c6610ff3565b6101c66110dd565b6101c66004803603602081101561036b57600080fd5b50356001600160a01b0316611111565b6102756004803603604081101561039157600080fd5b508035906020013561112f565b610275600480360360208110156103b457600080fd5b50356001600160a01b0316611245565b6101c661135c565b610216611362565b6009545b90565b6000600454600014806103f057504260045410155b156103fd575060006103d8565b600854600454600a5462093a8090829003819004914203045b8082101561043157600a830490920391600190910190610416565b509091505090565b600a5490565b600080610456600954610450610ff3565b90611371565b90506000610462610aee565b60065490915082158015906104775750600082115b156104b7576104b46104ad836104a764e8d4a510006104a161049a8960146113ba565b8990611371565b906113fc565b906113ba565b8290611455565b90505b6001600160a01b0385166000908152600360205260408120546104e59064e8d4a51000906104a790856113fc565b6005546001600160a01b0388166000908152600360205260408120600101549293509161051f91670de0b6b3a7640000916104a7916113fc565b6001600160a01b03881660009081526003602052604090206002015460055491925014610578576005546001600160a01b03881660009081526003602052604090206002015461057591906104a79084906113fc565b90505b80821161058d5760009550505050505061059f565b6105978282611371565b955050505050505b919050565b6001546001600160a01b031690565b60006105bd6114af565b6001546001600160a01b039081169116146106095760405162461bcd60e51b815260040180806020018281038252602b81526020018061188e602b913960400191505060405180910390fd5b610612826114b3565b92915050565b60015460408051633af32abf60e01b81523360048201819052915191926001600160a01b031691633af32abf91602480820192602092909190829003018186803b15801561066557600080fd5b505afa158015610679573d6000803e3d6000fd5b505050506040513d602081101561068f57600080fd5b5051156106cd5760405162461bcd60e51b81526004018080602001828103825260368152602001806119436036913960400191505060405180910390fd5b6106d5610ba0565b6106de816114b3565b5081156107dc576001600160a01b0381166000908152600360205260409020546107089083611371565b6001600160a01b03808316600081815260036020908152604080832095909555600254855163a9059cbb60e01b8152600481019490945260248401889052945191949093169263a9059cbb926044808201939182900301818787803b15801561077057600080fd5b505af1158015610784573d6000803e3d6000fd5b505050506040513d602081101561079a57600080fd5b50519050806107da5760405162461bcd60e51b81526004018080602001828103825260228152602001806119006022913960400191505060405180910390fd5b505b6006546001600160a01b038216600090815260036020526040812054909161080f9164e8d4a51000916104a791906113fc565b60055490915061082b906104a783670de0b6b3a76400006113fc565b6001600160a01b03831660008181526003602090815260409182902060018101949094556005546002909401939093558051868152905191927fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a92918290030190a2505050565b60085490565b60008060006108a56114af565b6001546001600160a01b039081169116146108f15760405162461bcd60e51b815260040180806020018281038252602b81526020018061188e602b913960400191505060405180910390fd5b6108f9610ba0565b6000610903610fa8565b90508061091b576000806000935093509350506109ee565b61092a60646104a783886113fc565b935061093784600a6113ba565b91506109438483611371565b60015490935061095c906001600160a01b031684611634565b61098261097960646104a7886005546113fc90919063ffffffff16565b60055490611371565b6005556006546109a69061099d906064906104a790896113fc565b60065490611371565b6006556040805185815260208101859052808201849052905186917f976232a004b12cdbd7c3ce7d454fe1e8265752d8b7573d031e20184cfa1a07c6919081900360600190a2505b9193909250565b600060045460001480610a0a57504260045410155b15610a17575060006103d8565b62093a80600454420381610a2757fe5b04905090565b610a356114af565b6000546001600160a01b03908116911614610a97576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b3957600080fd5b505afa158015610b4d573d6000803e3d6000fd5b505050506040513d6020811015610b6357600080fd5b5051905090565b60045490565b60065490565b6000546001600160a01b031690565b6001600160a01b031660009081526003602052604090205490565b600a544211610bae57610cc6565b6000610bb86103db565b90506000610bc4610ff3565b90506009548111610bda57505042600a55610cc6565b6000610be4610aee565b905080610bfb575060095560085542600a55610cc6565b6000610c126009548461137190919063ffffffff16565b60015460408051635018d7a960e01b81526004810184905290519293506000926001600160a01b0390921691635018d7a99160248082019260209290919082900301818787803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d6020811015610c8f57600080fd5b50519050610cb2610ca9846104a78464e8d4a510006113fc565b60065490611455565b60065550505060089190915560095542600a555b565b60015460408051633af32abf60e01b81523360048201819052915191926001600160a01b031691633af32abf91602480820192602092909190829003018186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b505115610d7d5760405162461bcd60e51b81526004018080602001828103825260368152602001806119796036913960400191505060405180910390fd5b610d85610ba0565b610d8e816114b3565b508115610e9c57600254604080516323b872dd60e01b81526001600160a01b03848116600483015230602483015260448201869052915160009392909216916323b872dd9160648082019260209290919082900301818787803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b505050506040513d6020811015610e1e57600080fd5b5051905080610e5e5760405162461bcd60e51b81526004018080602001828103825260228152602001806119006022913960400191505060405180910390fd5b6001600160a01b038216600090815260036020526040902054610e819084611455565b6001600160a01b038316600090815260036020526040902055505b6006546001600160a01b0382166000908152600360205260408120549091610ecf9164e8d4a51000916104a791906113fc565b600554909150610eeb906104a783670de0b6b3a76400006113fc565b6001600160a01b03831660008181526003602090815260409182902060018101949094556005546002909401939093558051868152905191927f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d92918290030190a2505050565b600060045460001480610f6757504260045410155b15610f74575060006103d8565b600062093a80610f826109f5565b02600454014203905062093a8081670de0b6b3a76400000281610fa157fe5b0491505090565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b3957600080fd5b60006004546000148061100857504260045410155b15611015575060006103d8565b600062093a80600454600a54038161102957fe5b049050600062093a8060045442038161103e57fe5b0490508082141561106b5762093a80600854600a544203028161105d57fe5b0460095401925050506103d8565b600854600a80546004546001959095019462093a80868102909101919091038302049190810490035b828410156110b15790810190600a81600190950194049003611094565b62093a808162093a80850260045401420302816110ca57fe5b0482019150816009540194505050505090565b6000806110e8610ff3565b905060075481116110fd5760009150506103d8565b60075461110b908290611371565b91505090565b6001600160a01b031660009081526003602052604090206001015490565b6111376114af565b6000546001600160a01b03908116911614611199576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111a1610ff3565b156111f3576040805162461bcd60e51b815260206004820152601960248201527f537461626c6556323a20616c7265616479207374617274656400000000000000604482015290519081900360640190fd5b6004829055600781026008819055600a83905560408051848152602081019290925280517f997896709b4e932ee42750e2e14ed1f7ab6c60bd911ff567aa2485cf0b20051b9281900390910190a15050565b61124d6114af565b6000546001600160a01b039081169116146112af576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166112f45760405162461bcd60e51b81526004018080602001828103825260268152602001806118b96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60075490565b6002546001600160a01b031690565b60006113b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611791565b9392505050565b60006113b383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611828565b60008261140b57506000610612565b8282028284828161141857fe5b04146113b35760405162461bcd60e51b81526004018080602001828103825260218152602001806119226021913960400191505060405180910390fd5b6000828201838110156113b3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166000908152600360205260408120600654815483916114e79164e8d4a51000916104a791906113fc565b90506000611510670de0b6b3a76400006104a760055486600101546113fc90919063ffffffff16565b90508260020154600554146115475761153c6005546104a78560020154846113fc90919063ffffffff16565b600554600285015590505b8082111561162c57600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b505190506115d28383611371565b92508083116115e157826115e3565b805b600554909550611603906104a7670de0b6b3a76400006104a1868a611455565b6001850155600554600285015560075461161d9086611455565b60075561162a8686611634565b505b505050919050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561167f57600080fd5b505afa158015611693573d6000803e3d6000fd5b505050506040513d60208110156116a957600080fd5b5051905060008183116116bc57826116be565b815b9050801561178b576001546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018590529151600093929092169163a9059cbb9160448082019260209290919082900301818787803b15801561171f57600080fd5b505af1158015611733573d6000803e3d6000fd5b505050506040513d602081101561174957600080fd5b50519050806117895760405162461bcd60e51b81526004018080602001828103825260218152602001806118df6021913960400191505060405180910390fd5b505b50505050565b600081848411156118205760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156117e55781810151838201526020016117cd565b50505050905090810190601f1680156118125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836118775760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156117e55781810151838201526020016117cd565b50600083858161188357fe5b049594505050505056fe537461626c6556323a2063616c6c6572206973206e6f7420746865204d696c6b657220636f6e74726163744f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537461626c6556323a20756e61626c6520746f207472616e73666572204d494c4b537461626c6556323a20756e61626c6520746f207472616e73666572207374616b65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77537461626c6556323a2077686974656c6973746564204d494c4b20686f6c646572732063616e6e6f7420636c61696d20746f6b656e73537461626c6556323a2077686974656c6973746564204d494c4b20686f6c646572732063616e6e6f74207374616b6520746f6b656e73a26469706673582212206adc4592aac4c61b6a7cb18c1dd17111182d432f838c8f11bd2be1eba8d4fc3664736f6c634300060c00334f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537461626c6556323a204d696c6b657220636f6e747261637420616464726573732063616e6e6f7420626520656d7074798be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0537461626c6556323a20455243323020746f6b656e20636f6e747261637420616464726573732063616e6e6f7420626520656d7074794f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d696c6b3a20756e61626c6520746f2073656e6420746f6b656e7320746f207a65726f20616464726573734d696c6b3a20756e61626c6520746f20637265617465206465706c6f7920537461626c65563220636f6e7472616374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d696c6b3a2077686974656c697374656420686f6c646572732063616e6e6f742075736520536865726966662773205661756c744d696c6b3a2063616c6c6572206973206e6f742074686520636f6e74726f6c6c6572a264697066735822122008f730cfc637e2e90d89159c35308a8c6460e616246cd5189bdac1cf89877e7164736f6c634300060c0033

Deployed Bytecode Sourcemap

28011:22120:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46873:128;;;:::i;:::-;;;;;;;;;;;;;;;;48165:270;;;:::i;28237:46::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46456:150;;;;;;;;;;;;;;;;-1:-1:-1;46456:150:0;-1:-1:-1;;;;;46456:150:0;;:::i;43825:213::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43825:213:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47009:105;;;:::i;46765:100::-;;;:::i;49284:290::-;;;;;;;;;;;;;;;;-1:-1:-1;49284:290:0;-1:-1:-1;;;;;49284:290:0;;:::i;42479:1338::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42479:1338:0;;;;;;;;;;;;;;;;;:::i;28335:37::-;;;:::i;49007:269::-;;;:::i;44046:289::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44046:289:0;;;;;;;;:::i;45085:121::-;;;;;;;;;;;;;;;;-1:-1:-1;45085:121:0;-1:-1:-1;;;;;45085:121:0;;:::i;39146:622::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39146:622:0;;;;;;;;:::i;45214:157::-;;;;;;;;;;;;;;;;-1:-1:-1;45214:157:0;;:::i;:::-;;;;-1:-1:-1;;;;;45214:157:0;;;;;;;;;;;;;;40352:671;;;;;;;;;;;;;;;;-1:-1:-1;40352:671:0;;:::i;39776:375::-;;;;;;;;;;;;;;;;-1:-1:-1;39776:375:0;-1:-1:-1;;;;;39776:375:0;;:::i;33126:1956::-;;;;;;;;;;;;;;;;-1:-1:-1;33126:1956:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;35275:882;;;:::i;45795:653::-;;;;;;;;;;;;;;;;-1:-1:-1;45795:653:0;-1:-1:-1;;;;;45795:653:0;;:::i;10636:148::-;;;:::i;:::-;;31980:960;;;;;;;;;;;;;;;;-1:-1:-1;31980:960:0;-1:-1:-1;;;;;31980:960:0;;:::i;44981:96::-;;;:::i;47596:268::-;;;:::i;9994:79::-;;;:::i;45379:306::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31824:148;;;;;;;;;;;;;;;;-1:-1:-1;31824:148:0;-1:-1:-1;;;;;31824:148:0;;:::i;28290:38::-;;;:::i;45693:94::-;;;:::i;48722:277::-;;;:::i;36350:658::-;;;:::i;44343:465::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44343:465:0;;;;;;;;:::i;41208:1263::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41208:1263:0;;;;;;;;:::i;47122:144::-;;;:::i;48443:271::-;;;:::i;37182:882::-;;;;;;;;;;;;;;;;-1:-1:-1;37182:882:0;;:::i;38072:886::-;;;;;;;;;;;;;;;;-1:-1:-1;38072:886:0;;:::i;47872:102::-;;;:::i;49582:105::-;;;:::i;46614:143::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46614:143:0;;;;;;;;;;:::i;47455:133::-;;;:::i;10939:244::-;;;;;;;;;;;;;;;;-1:-1:-1;10939:244:0;-1:-1:-1;;;;;10939:244:0;;:::i;46873:128::-;46919:7;46946:47;46968:24;;46946:17;;:21;;:47;;;;:::i;:::-;46939:54;;46873:128;;:::o;48165:270::-;48295:8;:15;48216:7;;;;;;48261:143;48317:1;48313;:5;48261:143;;;48349:43;48360:8;48369:1;48360:11;;;;;;;;;;;;;;;;;;:18;:31;;;-1:-1:-1;;;48360:31:0;;;;-1:-1:-1;;;;;48360:18:0;;;;:29;;:31;;;;;;;;;;:18;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48360:31:0;48349:6;;:10;:43::i;:::-;48340:52;-1:-1:-1;48320:3:0;;;;;48261:143;;;-1:-1:-1;48421:6:0;;-1:-1:-1;;48165:270:0;:::o;28237:46::-;;;;;;;;;;;;;;;;;;;:::o;46456:150::-;46568:29;;-1:-1:-1;;;;;46547:16:0;;46520:7;46547:16;;;:7;:16;;;;;;46520:7;;46547:51;;:16;:20;:51::i;:::-;46540:58;;46456:150;;;;:::o;43825:213::-;43928:10;43899:4;43916:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;43916:32:0;;;;;;;;;;;:40;;;43972:36;;;;;;;43899:4;;43916:32;;43928:10;;43972:36;;;;;;;;-1:-1:-1;44026:4:0;43825:213;;;;;:::o;47009:105::-;47086:20;;47009:105;:::o;46765:100::-;46845:12;;46765:100;:::o;49284:290::-;49428:8;:15;49349:7;;;;;;49394:149;49450:1;49446;:5;49394:149;;;49482:49;49493:8;49502:1;49493:11;;;;;;;;;;;;;;;;;;:18;:37;;;-1:-1:-1;;;49493:37:0;;-1:-1:-1;;;;;49493:37:0;;;;;;;;;:18;;;;;:28;;:37;;;;;;;;;;;:18;:37;;;;;;;;;;49482:49;49473:58;-1:-1:-1;49453:3:0;;;;;49394:149;;;-1:-1:-1;49560:6:0;;49284:290;-1:-1:-1;;;49284:290:0:o;42479:1338::-;42586:4;42573:2;-1:-1:-1;;;;;31144:23:0;;31136:79;;;;-1:-1:-1;;;31136:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42604:11:::1;42617:9:::0;42631:25:::1;42645:10;42631:13;:25::i;:::-;42658:17;42672:2;42658:13;:17::i;:::-;42603:73;;;;42687:17;42707:6;:52;;42734:24;::::0;42724:35:::1;::::0;:5;;:9:::1;:35::i;:::-;42707:52;;;42716:5;42707:52;42687:72;;42770:15;42788:4;:50;;42813:24;::::0;42803:35:::1;::::0;:5;;:9:::1;:35::i;:::-;42788:50;;;42795:5;42788:50;-1:-1:-1::0;;;;;42881:17:0;::::1;;::::0;;;:11:::1;:17;::::0;;;;;;;42899:10:::1;42881:29:::0;;;;;;;;42770:68;;-1:-1:-1;42881:40:0::1;::::0;42915:5;42881:33:::1;:40::i;:::-;-1:-1:-1::0;;;;;42849:17:0;::::1;;::::0;;;:11:::1;:17;::::0;;;;;;;42867:10:::1;42849:29:::0;;;;;;;:72;42936:7;::::1;:38:::0;::::1;;;-1:-1:-1::0;;;;;;42947:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:27;-1:-1:-1;42936:38:0::1;42932:85;;;42991:14;43000:4;42991:8;:14::i;:::-;;42932:85;43031:6;:14;;;;;43041:4;43031:14;43027:720;;;-1:-1:-1::0;;;;;43080:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;43100:9;43080:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;43062:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;43141:13;;::::1;::::0;;;;:26:::1;::::0;43159:7;43141:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;43125:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;43027:720:::1;;;43189:6;43185:562;;;-1:-1:-1::0;;;;;43230:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;43250:9;43230:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;43212:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;43291:13;;::::1;::::0;;;;:26:::1;::::0;43309:7;43291:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;43275:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;43352:17:::1;::::0;:30:::1;::::0;43374:7;43352:21:::1;:30::i;:::-;43332:17;:50:::0;43185:562:::1;;;43404:4;43400:347;;;-1:-1:-1::0;;;;;43443:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;43463:9;43443:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;43425:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;43504:13;;::::1;::::0;;;;:26:::1;::::0;43522:7;43504:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;43488:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;43565:17:::1;::::0;:32:::1;::::0;43587:9;43565:21:::1;:32::i;43400:347::-;-1:-1:-1::0;;;;;43648:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;43668:9;43648:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;43630:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;43709:13;;::::1;::::0;;;;:26:::1;::::0;43727:7;43709:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;43693:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;43400:347:::1;43777:2;-1:-1:-1::0;;;;;43762:25:0::1;43771:4;-1:-1:-1::0;;;;;43762:25:0::1;;43781:5;43762:25;;;;;;;;;;;;;;;;;;-1:-1:-1::0;43805:4:0::1;::::0;42479:1338;-1:-1:-1;;;;;;;;42479:1338:0:o;28335:37::-;28370:2;28335:37;:::o;49007:269::-;49139:8;:15;49060:7;;;;;;49105:140;49161:1;49157;:5;49105:140;;;49193:40;49204:8;49213:1;49204:11;;;;;;;;;;;;;;;;;;:18;:28;;;-1:-1:-1;;;49204:28:0;;;;-1:-1:-1;;;;;49204:18:0;;;;:26;;:28;;;;;;;;;;:18;:28;;;;;;;;;;49193:40;49184:49;-1:-1:-1;49164:3:0;;;;;49105:140;;44046:289;44190:10;44126:4;44178:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44178:32:0;;;;;;;;;;:48;;44215:10;44178:36;:48::i;:::-;44155:10;44143:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44143:32:0;;;;;;;;;;;;:83;;;44242:63;;;;;;44143:32;;44242:63;;;;;;;;;;;-1:-1:-1;44323:4:0;44046:289;;;;:::o;45085:121::-;-1:-1:-1;;;;;45179:19:0;45155:4;45179:19;;;:10;:19;;;;;;;;;45085:121::o;39146:622::-;39249:4;39219:9;-1:-1:-1;;;;;31144:23:0;;31136:79;;;;-1:-1:-1;;;31136:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10216:12:::1;:10;:12::i;:::-;10206:6;::::0;-1:-1:-1;;;;;10206:6:0;;::::1;:22:::0;::::1;;10198:67;;;::::0;;-1:-1:-1;;;10198:67:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39270:24:::2;39284:9;39270:13;:24::i;:::-;39266:329;;;-1:-1:-1::0;;;;;39334:20:0;::::2;;::::0;;;:9:::2;:20;::::0;;;;;:32:::2;::::0;39359:6;39334:24:::2;:32::i;:::-;-1:-1:-1::0;;;;;39311:20:0;::::2;;::::0;;;:9:::2;:20;::::0;;;;:55;39266:329:::2;;;39399:13;39415:36;39426:24;;39415:6;:10;;:36;;;;:::i;:::-;-1:-1:-1::0;;;;;39489:20:0;::::2;;::::0;;;:9:::2;:20;::::0;;;;;39399:52;;-1:-1:-1;39489:31:0::2;::::0;39399:52;39489:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;39466:20:0;::::2;;::::0;;;:9:::2;:20;::::0;;;;:54;39555:17:::2;::::0;:28:::2;::::0;39577:5;39555:21:::2;:28::i;:::-;39535:17;:48:::0;-1:-1:-1;39266:329:0::2;39620:12;::::0;:24:::2;::::0;39637:6;39620:16:::2;:24::i;:::-;39605:12;:39:::0;39660:23:::2;::::0;;;;;;;-1:-1:-1;;;;;39660:23:0;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;39699:39;::::0;;;;;;;-1:-1:-1;;;;;39699:39:0;::::2;::::0;39716:1:::2;::::0;39699:39:::2;::::0;;;;::::2;::::0;;::::2;-1:-1:-1::0;39756:4:0::2;::::0;39146:622;-1:-1:-1;;;39146:622:0:o;45214:157::-;45301:8;:15;45266:7;;45293:23;;:70;;45361:1;45293:70;;;45327:8;45336:5;45327:15;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;45327:22:0;;45214:157;-1:-1:-1;;45214:157:0:o;40352:671::-;40425:7;31454:1;31423:14;:28;31438:12;:10;:12::i;:::-;-1:-1:-1;;;;;31423:28:0;-1:-1:-1;;;;;31423:28:0;;;;;;;;;;;;;:32;31415:77;;;;;-1:-1:-1;;;31415:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40522:15:::1;40540:14;:6:::0;40551:2:::1;40540:10;:14::i;:::-;40522:32:::0;-1:-1:-1;40577:15:0::1;40595:19;:6:::0;40522:32;40595:10:::1;:19::i;:::-;40705:10;40695:21;::::0;;;:9:::1;:21;::::0;;;;;40577:37;;-1:-1:-1;40695:34:0::1;::::0;40577:37;40695:25:::1;:34::i;:::-;40681:10;40671:21;::::0;;;:9:::1;:21;::::0;;;;:58;;;;28836:42:::1;40759:16:::0;;;;:29:::1;::::0;40780:7;40759:20:::1;:29::i;:::-;28836:42;40740:16;::::0;:9:::1;:16;::::0;;:48;40814:12:::1;::::0;:24:::1;::::0;40831:6;40814:16:::1;:24::i;:::-;40799:12;:39:::0;40897:41:::1;::::0;;;;;;;40918:10:::1;::::0;40914:1:::1;::::0;40897:41:::1;::::0;;;;::::1;::::0;;::::1;40954:36;::::0;;;;;;;28836:42:::1;::::0;40971:1:::1;::::0;40954:36:::1;::::0;;;;::::1;::::0;;::::1;41008:7:::0;40352:671;-1:-1:-1;;;40352:671:0:o;39776:375::-;39915:8;:15;39836:7;;;;;;39881:239;39937:1;39933;:5;39881:239;;;39960:8;39969:1;39960:11;;;;;;;;;;;;;;;;:18;:27;;;-1:-1:-1;;;39960:27:0;;;;-1:-1:-1;;;;;39960:18:0;;;;:25;;:27;;;;;;;;;;:11;:18;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40002:19;40024:8;40033:1;40024:11;;;;;;;;;;;;;;;;;;;:18;:37;;;-1:-1:-1;;;40024:37:0;;-1:-1:-1;;;;;40024:37:0;;;;;;;;;:18;;;;;:28;;:37;;;;;:11;;:37;;;;;;;;;:18;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40024:37:0;;-1:-1:-1;40085:23:0;:6;40024:37;40085:10;:23::i;:::-;40076:32;-1:-1:-1;;39940:3:0;;;;;39881:239;;33126:1956;33212:21;33244:22;33277:19;31303:12;:10;:12::i;:::-;31288:11;;-1:-1:-1;;;;;31288:11:0;;;:27;;;31280:74;;;;-1:-1:-1;;;31280:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33333:1:::1;33323:7;:11;:28;;;;;33348:3;33338:7;:13;33323:28;33315:72;;;::::0;;-1:-1:-1;;;33315:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33398:14;33415:47;33437:24;;33415:17;;:21;;:47;;;;:::i;:::-;33398:64:::0;-1:-1:-1;33529:28:0::1;33553:3;33529:19;33398:64:::0;33540:7;33529:10:::1;:19::i;:::-;:23:::0;::::1;:28::i;:::-;33513:44:::0;-1:-1:-1;33582:21:0::1;33513:44:::0;33600:2:::1;33582:17;:21::i;:::-;33568:35:::0;-1:-1:-1;33631:30:0::1;:13:::0;33568:35;33631:17:::1;:30::i;:::-;33870:8;:15:::0;33614:47;;-1:-1:-1;33738:22:0::1;::::0;;;;;;;33836:472:::1;33892:1;33888;:5;33836:472;;;33916:9;33927::::0;33938::::1;33951:8;33960:1;33951:11;;;;;;;;;;;;;;;:18;;;;;;;;;;-1:-1:-1::0;;;;;33951:18:0::1;-1:-1:-1::0;;;;;33951:26:0::1;;33978:7;33951:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33951:35:0;;::::1;::::0;::::1;::::0;;;;;;;;-1:-1:-1;33951:35:0;;-1:-1:-1;33951:35:0;-1:-1:-1;34068:21:0::1;:14:::0;33951:35;34068:18:::1;:21::i;:::-;34051:38:::0;-1:-1:-1;34122:22:0::1;:15:::0;34142:1;34122:19:::1;:22::i;:::-;34104:40:::0;-1:-1:-1;34174:19:0::1;:12:::0;34191:1;34174:16:::1;:19::i;:::-;34159:34;;34259:37;34273:8;34282:1;34273:11;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:18:::0;-1:-1:-1;;;;;34273:18:0::1;34294:1:::0;34259:5:::1;:37::i;:::-;-1:-1:-1::0;;33895:3:0::1;::::0;;::::1;::::0;-1:-1:-1;33836:472:0::1;;;-1:-1:-1::0;34348:17:0::1;::::0;-1:-1:-1;34368:25:0::1;:6:::0;34379:13;34368:10:::1;:25::i;:::-;34348:45;;34417:1;34408:6;:10;:27;;;;;34434:1;34422:9;:13;34408:27;34404:370;;;34479:51;34520:9;34479:36;34490:24;;34479:6;:10;;:36;;;;:::i;:51::-;34452:24;:78:::0;;;34565:39:::1;::::0;:9;;:13:::1;:39::i;:::-;34545:17;:59:::0;34642:20:::1;::::0;:61:::1;::::0;34687:15;;34642:40:::1;::::0;34667:14;34642:24:::1;:40::i;:::-;:44:::0;::::1;:61::i;:::-;34619:20;:84:::0;34733:12:::1;::::0;:29:::1;::::0;34750:11;34733:16:::1;:29::i;:::-;34718:12;:44:::0;34404:370:::1;34846:33;:13:::0;34864:14;34846:17:::1;:33::i;:::-;34830:49:::0;-1:-1:-1;34907:35:0::1;:14:::0;34926:15;34907:18:::1;:35::i;:::-;34890:52:::0;-1:-1:-1;34967:29:0::1;:11:::0;34983:12;34967:15:::1;:29::i;:::-;35014:60;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;34953:43;;-1:-1:-1;35022:7:0;;35014:60:::1;::::0;;;;;;;::::1;31365:1;;;;;33126:1956:::0;;;;;:::o;35275:882::-;35352:7;31303:12;:10;:12::i;:::-;31288:11;;-1:-1:-1;;;;;31288:11:0;;;:27;;;31280:74;;;;-1:-1:-1;;;31280:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35448:22:::1;::::0;35431:14:::1;::::0;35448:31:::1;::::0;35475:3:::1;35448:26;:31::i;:::-;35431:48;;35490:14;35507:41;35518:29;;35507:6;:10;;:41;;;;:::i;:::-;35490:58;;35589:14;35606:57;35633:29;;35606:22;;:26;;:57;;;;:::i;:::-;35589:74:::0;-1:-1:-1;35674:17:0::1;35694:27;35705:15;35589:74:::0;35716:3:::1;35705:10;:15::i;:::-;35694:6:::0;;:10:::1;:27::i;:::-;35674:47;;35745:1;35736:6;:10;:27;;;;;35762:1;35750:9;:13;35736:27;35732:345;;;35812:56;35858:9;35812:41;35823:29;;35812:6;:10;;:41;;;;:::i;:56::-;35780:29;:88:::0;;;35908:44:::1;::::0;:9;;:13:::1;:44::i;:::-;35883:22;:69:::0;35990:20:::1;::::0;:32:::1;::::0;36015:6;35990:24:::1;:32::i;:::-;35967:20;:55:::0;35732:345:::1;;;36064:1;36055:10;;35732:345;36094:31;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;36143:6:0;;-1:-1:-1;;;35275:882:0;:::o;45795:653::-;45861:7;45954:22;45968:7;45954:13;:22::i;:::-;45950:80;;;-1:-1:-1;;;;;;46000:18:0;;;;;;:9;:18;;;;;;45993:25;;45950:80;46158:8;:15;46092:21;;;;46124:163;46180:1;46176;:5;46124:163;;;46219:56;46237:8;46246:1;46237:11;;;;;;;46219:56;46203:72;-1:-1:-1;46183:3:0;;;;;46124:163;;;-1:-1:-1;;46396:24:0;;-1:-1:-1;;;;;46373:18:0;;;;;;:9;:18;;;;;;:67;;46426:13;;46373:48;;:22;:48::i;:67::-;46366:74;45795:653;-1:-1:-1;;;45795:653:0:o;10636:148::-;10216:12;:10;:12::i;:::-;10206:6;;-1:-1:-1;;;;;10206:6:0;;;:22;;;10198:67;;;;;-1:-1:-1;;;10198:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10743:1:::1;10727:6:::0;;10706:40:::1;::::0;-1:-1:-1;;;;;10727:6:0;;::::1;::::0;10706:40:::1;::::0;10743:1;;10706:40:::1;10774:1;10757:19:::0;;-1:-1:-1;;;;;;10757:19:0::1;::::0;;10636:148::o;31980:960::-;32045:14;10216:12;:10;:12::i;:::-;10206:6;;-1:-1:-1;;;;;10206:6:0;;;:22;;;10198:67;;;;;-1:-1:-1;;;10198:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32111:12:::1;32161:4;32168:5;32136:38;;;;;;-1:-1:-1::0;;;;;32136:38:0::1;;;;;;;;-1:-1:-1::0;;;;;32136:38:0::1;;;;;;;;;;;;;;;;;;;;;;;32126:49;;;;;;32111:64;;32222:4;32236;32243:5;32203:46;;;;;:::i;:::-;-1:-1:-1::0;;;;;32203:46:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;32203:46:0::1;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;32186:64:0;-1:-1:-1;;;;;;32269:20:0;::::1;32261:80;;;;-1:-1:-1::0;;;32261:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32404:39;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;32404:39:0;;::::1;::::0;;;32390:8:::1;:54:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;32390:54:0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;32390:54:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;32480:15;;32455:22;;;:14:::1;:22:::0;;;;;:40;;;;32506:10:::1;:18:::0;;;;;;:25;;-1:-1:-1;;32506:25:0::1;::::0;;::::1;::::0;;;32589:17;::::1;::::0;;;;32506:25:::1;32589:17;32584:267;;32661:24;::::0;-1:-1:-1;;;;;32640:16:0;::::1;32623:14;32640:16:::0;;;:9:::1;:16;::::0;;;;;32623:14;;32640:46:::1;::::0;:16;:20:::1;:46::i;:::-;-1:-1:-1::0;;;;;32743:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;32721:17:::1;::::0;32623:63;;-1:-1:-1;32721:39:0::1;::::0;:17;:21:::1;:39::i;:::-;32701:17;:59:::0;-1:-1:-1;;;;;32775:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:25;;;;32815:10:::1;:17:::0;;;:24;;-1:-1:-1;;32815:24:0::1;32835:4;32815:24;::::0;;32584:267:::1;32912:8;:15:::0;32868:64:::1;::::0;;-1:-1:-1;;;;;32868:64:0;;::::1;::::0;;32898:4:::1;32868:64;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;32912:19:0;;;32868:64;;;;;::::1;::::0;;;;;;;::::1;10276:1;31980:960:::0;;;:::o;44981:96::-;45059:10;;44981:96;:::o;47596:268::-;47652:7;47672:31;47706:78;47740:43;47755:27;28724:7;47755:8;:6;:8::i;:::-;:12;;:27::i;:::-;47740:10;;;:14;:43::i;:::-;47706:15;;:33;:78::i;:::-;47672:112;-1:-1:-1;47802:54:0;28724:7;47802:35;47672:112;47830:6;47802:27;:35::i;:54::-;47795:61;;;47596:268;:::o;9994:79::-;10032:7;10059:6;-1:-1:-1;;;;;10059:6:0;9994:79;:::o;45379:306::-;45491:8;:15;45419:16;;;;45477:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45477:30:0;-1:-1:-1;45552:8:0;:15;45448:59;;-1:-1:-1;45524:9:0;;45518:133;45574:1;45570;:5;45518:133;;;45620:8;45629:1;45620:11;;;;;;;;;;;;;;;;;:18;45597:12;;-1:-1:-1;;;;;45620:18:0;;;;45597:9;;45607:1;;45597:12;;;;;;-1:-1:-1;;;;;45597:42:0;;;:12;;;;;;;;;;;:42;45577:3;;;;;45518:133;;31824:148;10216:12;:10;:12::i;:::-;10206:6;;-1:-1:-1;;;;;10206:6:0;;;:22;;;10198:67;;;;;-1:-1:-1;;;10198:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31897:11:::1;:24:::0;;-1:-1:-1;;;;;;31897:24:0::1;-1:-1:-1::0;;;;;31897:24:0;::::1;::::0;;::::1;::::0;;;31937:27:::1;::::0;::::1;::::0;-1:-1:-1;;31937:27:0::1;31824:148:::0;:::o;28290:38::-;;;;;;;;;;;;;;-1:-1:-1;;;28290:38:0;;;;:::o;45693:94::-;45764:8;:15;45693:94;:::o;48722:277::-;48858:8;:15;48779:7;;;;;;48824:144;48880:1;48876;:5;48824:144;;;48912:44;48923:8;48932:1;48923:11;;;;;;;;;;;;;;;;;;:18;:32;;;-1:-1:-1;;;48923:32:0;;;;-1:-1:-1;;;;;48923:18:0;;;;:30;;:32;;;;;;;;;;:18;:32;;;;;;;;;;48912:44;48903:53;-1:-1:-1;48883:3:0;;;;;48824:144;;36350:658;36427:14;31303:12;:10;:12::i;:::-;31288:11;;-1:-1:-1;;;;;31288:11:0;;;:27;;;31280:74;;;;-1:-1:-1;;;31280:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36471:20:::1;::::0;36506:11;;;:37:::1;;-1:-1:-1::0;36521:17:0::1;::::0;:22;36506:37:::1;36502:78;;;36567:1;36560:8;;;;;36502:78;36620:14;36637:47;36659:24;;36637:17;;:21;;:47;;;;:::i;:::-;36620:64:::0;-1:-1:-1;36695:17:0::1;36715:18;36620:64:::0;36726:6;36715:10:::1;:18::i;:::-;36695:38;;36771:51;36812:9;36771:36;36782:24;;36771:6;:10;;:36;;;;:::i;:51::-;36744:24;:78:::0;;;36853:39:::1;::::0;:9;;:13:::1;:39::i;:::-;36833:17;:59:::0;36926:1:::1;36903:20;:24:::0;36945:31:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;36994:6:0;;-1:-1:-1;;36350:658:0;:::o;44343:465::-;44476:10;44428:4;44464:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44464:32:0;;;;;;;;;;44511:27;;;44507:193;;44567:10;44590:1;44555:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44555:32:0;;;;;;;;;:36;44507:193;;;44659:29;:8;44672:15;44659:12;:29::i;:::-;44636:10;44624:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44624:32:0;;;;;;;;;:64;44507:193;44724:10;44745:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;44715:63:0;;44745:32;;;;;;;;;;;44715:63;;;;;;;;;44724:10;44715:63;;;;;;;;;;;-1:-1:-1;44796:4:0;;44343:465;-1:-1:-1;;;44343:465:0:o;41208:1263::-;41297:4;41284:2;-1:-1:-1;;;;;31144:23:0;;31136:79;;;;-1:-1:-1;;;31136:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41315:12:::1;41329:11:::0;41342:9:::1;41356:10;41368:25;41382:10;41368:13;:25::i;:::-;41395:17;41409:2;41395:13;:17::i;:::-;41314:99;;;;;;41424:17;41444:6;:52;;41471:24;::::0;41461:35:::1;::::0;:5;;:9:::1;:35::i;:::-;41444:52;;;41453:5;41444:52;41424:72;;41507:15;41525:4;:50;;41550:24;::::0;41540:35:::1;::::0;:5;;:9:::1;:35::i;:::-;41525:50;;;41532:5;41525:50;41507:68;;41591:6;41590:7;:38;;;;-1:-1:-1::0;;;;;;41601:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:27;-1:-1:-1;41590:38:0::1;41586:85;;;41645:14;41654:4;41645:8;:14::i;:::-;;41586:85;41685:6;:14;;;;;41695:4;41685:14;41681:720;;;-1:-1:-1::0;;;;;41734:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;41754:9;41734:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;41716:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;41795:13;;::::1;::::0;;;;:26:::1;::::0;41813:7;41795:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;41779:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;41681:720:::1;;;41843:6;41839:562;;;-1:-1:-1::0;;;;;41884:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;41904:9;41884:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;41866:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;41945:13;;::::1;::::0;;;;:26:::1;::::0;41963:7;41945:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;41929:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;42006:17:::1;::::0;:30:::1;::::0;42028:7;42006:21:::1;:30::i;:::-;41986:17;:50:::0;41839:562:::1;;;42058:4;42054:347;;;-1:-1:-1::0;;;;;42097:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;42117:9;42097:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;42079:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;42158:13;;::::1;::::0;;;;:26:::1;::::0;42176:7;42158:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;42142:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;42219:17:::1;::::0;:32:::1;::::0;42241:9;42219:21:::1;:32::i;42054:347::-;-1:-1:-1::0;;;;;42302:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;42322:9;42302:19:::1;:30::i;:::-;-1:-1:-1::0;;;;;42284:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:48;;;;42363:13;;::::1;::::0;;;;:26:::1;::::0;42381:7;42363:17:::1;:26::i;:::-;-1:-1:-1::0;;;;;42347:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:42;42054:347:::1;42431:2;-1:-1:-1::0;;;;;42416:25:0::1;42425:4;-1:-1:-1::0;;;;;42416:25:0::1;;42435:5;42416:25;;;;;;;;;;;;;;;;;;-1:-1:-1::0;42459:4:0::1;::::0;41208:1263;-1:-1:-1;;;;;;;;41208:1263:0:o;47122:144::-;47174:7;47201:57;47228:29;;47201:22;;:26;;:57;;;;:::i;48443:271::-;48576:8;:15;48497:7;;;;;;48542:141;48598:1;48594;:5;48542:141;;;48630:41;48641:8;48650:1;48641:11;;;;;;;;;;;;;;;;;;:18;:29;;;-1:-1:-1;;;48641:29:0;;;;-1:-1:-1;;;;;48641:18:0;;;;:27;;:29;;;;;;;;;;:18;:29;;;;;;;;;;48630:41;48621:50;-1:-1:-1;48601:3:0;;;;;48542:141;;37182:882;37264:10;37246:15;37294:19;;;:10;:19;;;;;;;;37293:20;37285:85;;;;-1:-1:-1;;;37285:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37413:17;37422:7;37413:8;:17::i;:::-;;37481:23;37507:36;37518:24;;37507:6;:10;;:36;;;;:::i;:::-;37481:62;;37554:28;37585:41;37596:29;;37585:6;:10;;:41;;;;:::i;:::-;-1:-1:-1;;;;;37707:18:0;;;;;;:9;:18;;;;;;37554:72;;-1:-1:-1;37707:39:0;;37730:15;37707:22;:39::i;:::-;-1:-1:-1;;;;;37686:18:0;;;;;;:9;:18;;;;;;;;:60;;;;37776:7;:16;;;;:42;;37797:20;37776;:42::i;:::-;-1:-1:-1;;;;;37757:16:0;;;;;;:7;:16;;;;;:61;37879:17;;:38;;37901:15;37879:21;:38::i;:::-;37859:17;:58;37953:22;;:48;;37980:20;37953:26;:48::i;:::-;37928:22;:73;38019:37;;;;;;;;-1:-1:-1;;;;;38019:37:0;;;;;;;;;;;;;37182:882;;;;:::o;38072:886::-;38157:10;38139:15;38187:19;;;:10;:19;;;;;;;;38186:20;38178:85;;;;-1:-1:-1;;;38178:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38306:17;38315:7;38306:8;:17::i;:::-;;38374:23;38400:36;38411:24;;38400:6;:10;;:36;;;;:::i;:::-;38374:62;;38447:28;38478:41;38489:29;;38478:6;:10;;:41;;;;:::i;:::-;-1:-1:-1;;;;;38600:18:0;;;;;;:9;:18;;;;;;38447:72;;-1:-1:-1;38600:39:0;;38623:15;38600:22;:39::i;:::-;-1:-1:-1;;;;;38579:18:0;;;;;;:9;:18;;;;;;;;:60;;;;38669:7;:16;;;;:42;;38690:20;38669;:42::i;:::-;-1:-1:-1;;;;;38650:16:0;;;;;;:7;:16;;;;;:61;38772:17;;:38;;38794:15;38772:21;:38::i;:::-;38752:17;:58;38846:22;;:48;;38873:20;38846:26;:48::i;:::-;38821:22;:73;38912:38;;;;;;;;-1:-1:-1;;;;;38912:38:0;;;;;;;;;;;;;38072:886;;;;:::o;47872:102::-;28724:7;47872:102;:::o;49582:105::-;49655:24;;49582:105;:::o;46614:143::-;-1:-1:-1;;;;;46722:18:0;;;46695:7;46722:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;46614:143::o;47455:133::-;47503:7;47530:50;28724:7;47530:31;47550:10;;47530:15;:19;;:31;;;;:::i;10939:244::-;10216:12;:10;:12::i;:::-;10206:6;;-1:-1:-1;;;;;10206:6:0;;;:22;;;10198:67;;;;;-1:-1:-1;;;10198:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11028:22:0;::::1;11020:73;;;;-1:-1:-1::0;;;11020:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11130:6;::::0;;11109:38:::1;::::0;-1:-1:-1;;;;;11109:38:0;;::::1;::::0;11130:6;::::1;::::0;11109:38:::1;::::0;::::1;11158:6;:17:::0;;-1:-1:-1;;;;;;11158:17:0::1;-1:-1:-1::0;;;;;11158:17:0;;;::::1;::::0;;;::::1;::::0;;10939:244::o;3213:132::-;3271:7;3298:39;3302:1;3305;3298:39;;;;;;;;;;;;;;;;;:3;:39::i;912:181::-;970:7;1002:5;;;1026:6;;;;1018:46;;;;;-1:-1:-1;;;1018:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2266:471;2324:7;2569:6;2565:47;;-1:-1:-1;2599:1:0;2592:8;;2565:47;2636:5;;;2640:1;2636;:5;:1;2660:5;;;;;:10;2652:56;;;;-1:-1:-1;;;2652:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1376:136;1434:7;1461:43;1465:1;1468;1461:43;;;;;;;;;;;;;;;;;:3;:43::i;8630:106::-;8718:10;8630:106;:::o;49864:264::-;-1:-1:-1;;;;;49950:17:0;;;;;;:9;:17;;;;;;:29;;49972:6;49950:21;:29::i;:::-;-1:-1:-1;;;;;49930:17:0;;;;;;:9;:17;;;;;:49;50005:12;;:24;;50022:6;50005:16;:24::i;:::-;49990:12;:39;50045:36;;;;;;;;50070:1;;-1:-1:-1;;;;;50045:36:0;;;;;;;;;;;;49864:264;;:::o;3841:278::-;3927:7;3962:12;3955:5;3947:28;;;;-1:-1:-1;;;3947:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3986:9;4002:1;3998;:5;;;;;;;3841:278;-1:-1:-1;;;;;3841:278:0:o;1815:192::-;1901:7;1937:12;1929:6;;;;1921:29;;;;-1:-1:-1;;;1921:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1973:5:0;;;1815:192::o;-1:-1:-1:-;;;;;;;;:::o

Swarm Source

ipfs://08f730cfc637e2e90d89159c35308a8c6460e616246cd5189bdac1cf89877e71

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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