ETH Price: $3,066.62 (+2.48%)
Gas: 7 Gwei

Token

Swapp Token (SWAPP)
 

Overview

Max Total Supply

535,147,657.898017499283549132 SWAPP

Holders

3,499 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$168,646.43

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Wrapped BTC: WBTC Token
Balance
5 SWAPP

Value
$0.00 ( ~0 Eth) [0.0000%]
0x2260fac5e5542a773aa44fbcfedf7c193bc2c599
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

SWAPP Protocol is a multi-chain smart contract on Ethereum and BSC. SWAPP is a decentralized, fairly launched, ETH and BNB paired utility token used to both facilitate yield farming rewards in the SWAPP DeFi platform and as the form of rewards within the SWAPP smartphone app and browser extensions.

Market

Volume (24H):$8.97
Market Capitalization:$0.00
Circulating Supply:0.00 SWAPP
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SwappToken

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-20
*/

// SPDX-License-Identifier: MIT

pragma solidity =0.7.6;

contract Context {
    /**
     * @dev returns address executing the method
     */
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    /**
     * @dev returns data passed into the method
     */
    function _msgData() internal view virtual returns (bytes memory) {
        this;
        return msg.data;
    }
}

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

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

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

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract ERC20 is Context {

    using SafeMath for uint256;

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

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    uint256 private _totalSupply = 0.404 ether;

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

    constructor (string memory tokenName, string memory tokenSymbol) {
        _name = tokenName;
        _symbol = tokenSymbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the decimals of the token.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Returns the total supply of the token.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Returns the token balance of specific address.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount );

        return true;
    }

    /**
     * @dev Returns approved balance to be spent by another address
     * by using transferFrom method
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev Sets the token allowance to another spender
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);

        return true;
    }

    /**
     * @dev Allows to transfer tokens on senders behalf
     * based on allowance approved for the executer
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount));
        _transfer(sender, recipient, amount);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * Emits a {Transfer} event.
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0x0));
        require(recipient != address(0x0));

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0x0));

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);

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

    /**
     * @dev Allows to burn tokens if token sender
     * wants to reduce totalSupply() of the token
     */
    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0x0));

        _balances[account] = _balances[account].sub(amount);
        _totalSupply = _totalSupply.sub(amount);

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0x0));
        require(spender != address(0x0));

        _allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }
}

contract Events {
    event StakeStart(
        bytes16 indexed stakeID,
        address indexed stakerAddress,
        address indexed referralAddress,
        uint256 stakedAmount,
        uint256 stakesShares,
        uint256 referralShares,
        uint256 startDay,
        uint256 lockDays,
        uint256 daiEquivalent
    );

    event StakeEnd(
        bytes16 indexed stakeID,
        address indexed stakerAddress,
        address indexed referralAddress,
        uint256 stakedAmount,
        uint256 stakesShares,
        uint256 referralShares,
        uint256 rewardAmount,
        uint256 closeDay,
        uint256 penaltyAmount
    );

    event InterestScraped(
        bytes16 indexed stakeID,
        address indexed stakerAddress,
        uint256 scrapeAmount,
        uint256 scrapeDay,
        uint256 stakersPenalty,
        uint256 referrerPenalty,
        uint256 currentSwappDay
    );

    event ReferralCollected(
        address indexed staker,
        bytes16 indexed stakeID,
        address indexed referrer,
        bytes16 referrerID,
        uint256 rewardAmount
    );

    event NewGlobals(
        uint256 totalShares,
        uint256 totalStaked,
        uint256 shareRate,
        uint256 referrerShares,
        uint256 indexed currentSwappDay
    );

    event NewSharePrice(
        uint256 newSharePrice,
        uint256 oldSharePrice,
        uint64 currentSwappDay
    );

    event LiquidityGuardStatus(
        bool isActive
    );
}

abstract contract Global is ERC20, Events {
    using SafeMath for uint256;

    struct Globals {
        uint256 totalStaked;
        uint256 totalShares;
        uint256 sharePrice;
        uint256 currentSwappDay;
        uint256 referralShares;
        uint256 liquidityShares;
    }

    Globals public globals;

    constructor() {
        globals.sharePrice = 100E15;
    }

    function _increaseGlobals(
        uint256 _staked,
        uint256 _shares,
        uint256 _rshares
    ) internal {
        globals.totalStaked = globals.totalStaked.add(_staked);
        globals.totalShares = globals.totalShares.add(_shares);

        if (_rshares > 0) {
            globals.referralShares = globals.referralShares.add(_rshares);
        }

        _logGlobals();
    }

    function _decreaseGlobals(
        uint256 _staked,
        uint256 _shares,
        uint256 _rshares
    ) internal {
        globals.totalStaked = globals.totalStaked > _staked ? globals.totalStaked - _staked : 0;
        globals.totalShares = globals.totalShares > _shares ? globals.totalShares - _shares : 0;

        if (_rshares > 0) {
            globals.referralShares = globals.referralShares > _rshares ? globals.referralShares - _rshares : 0;
        }

        _logGlobals();
    }

    function _logGlobals() private {
        emit NewGlobals(
            globals.totalShares,
            globals.totalStaked,
            globals.sharePrice,
            globals.referralShares,
            globals.currentSwappDay
        );
    }
}

interface IUniswapV2Factory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (
        address pair
    );
}

interface IUniswapRouterV2 {
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
}

interface IUniswapV2Pair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token1() external view returns (address);
}

interface ILiquidityGuard {
    function getInflation(uint32 _amount) external view returns (uint256);
}

interface TokenInterface {
    function transferFrom(address _from, address _to, uint256 _value)  external returns (bool success);
    function approve(address _spender, uint256 _value)  external returns (bool success);
}

abstract contract Declaration is Global {

    uint256 constant _decimals = 18;
    uint256 constant TESLAS_PER_SWAPP = 10 ** _decimals;

    uint32 constant SECONDS_IN_DAY = 86400 seconds;
    uint16 constant MIN_LOCK_DAYS = 1;
    uint16 constant FORMULA_DAY = 65;
    uint16 constant MAX_LOCK_DAYS = 15330;
    uint16 constant MAX_BONUS_DAYS_A = 1825;
    uint16 constant MAX_BONUS_DAYS_B = 13505;
    uint16 constant MIN_REFERRAL_DAYS = 365;

    uint32 constant MIN_STAKE_AMOUNT = 1000000; // TESLA
    uint32 constant REFERRALS_RATE = 366816973; // 1.000% (direct value, can be used right away)

    uint32 public INFLATION_RATE = 103000; // 3.000% (indirect -> checks throgh LiquidityGuard)

    uint64 constant PRECISION_RATE = 1E18;

    uint96 constant THRESHOLD_LIMIT = 10000E18; // $10,000 DAI

    uint96 constant DAILY_BONUS_A = 13698630136986302; // 25%:1825 = 0.01369863013 per day;
    uint96 constant DAILY_BONUS_B = 370233246945575;   // 5%:13505 = 0.00037023324 per day;

    uint256 public LAUNCH_TIME;

    address constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
    address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    IUniswapRouterV2 public constant UNISWAP_ROUTER = IUniswapRouterV2(
        0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
    );

    IUniswapV2Factory public constant UNISWAP_FACTORY = IUniswapV2Factory(
        0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
    );

    ILiquidityGuard public LIQUIDITY_GUARD = ILiquidityGuard(
        0xECd13A6c13A97483deA1e31101e63718FcBd6b73
    );

    IUniswapV2Pair public UNISWAP_PAIR;
    bool public isLiquidityGuardActive;

    uint256 public latestDaiEquivalent;
    address[] internal _path = [address(this), WETH, DAI];

    constructor() {
        LAUNCH_TIME = 1620518400; // 2021.05.09 GMT
    }

    function createPair() external {
        UNISWAP_PAIR = IUniswapV2Pair(
            UNISWAP_FACTORY.createPair(
                WETH, address(this)
            )
        );
    }

    struct Stake {
        uint256 stakesShares;
        uint256 stakedAmount;
        uint256 rewardAmount;
        uint64 startDay;
        uint64 lockDays;
        uint64 finalDay;
        uint64 closeDay;
        uint256 scrapeDay;
        uint256 daiEquivalent;
        uint256 referrerShares;
        address referrer;
        bool isActive;
    }

    struct ReferrerLink {
        address staker;
        bytes16 stakeID;
        uint256 rewardAmount;
        uint256 processedDays;
        bool isActive;
    }

    struct CriticalMass {
        uint256 totalAmount;
        uint256 activationDay;
    }

    mapping(address => uint256) public stakeCount;
    mapping(address => uint256) public referralCount;

    mapping(address => CriticalMass) public criticalMass;
    mapping(address => mapping(bytes16 => uint256)) public scrapes;
    mapping(address => mapping(bytes16 => Stake)) public stakes;
    mapping(address => mapping(bytes16 => ReferrerLink)) public referrerLinks;

    mapping(uint256 => uint256) public scheduledToEnd;
    mapping(uint256 => uint256) public referralSharesToEnd;
    mapping(uint256 => uint256) public totalPenalties;

    mapping(address => uint256) public userStakedAmount;
}

abstract contract Helper is Declaration {

    using SafeMath for uint256;

    function currentSwappDay() public view returns (uint64) {
        return getNow() >= LAUNCH_TIME ? _currentSwappDay() : 0;
    }

    function _currentSwappDay() internal view returns (uint64) {
        return swappDayFromStamp(getNow());
    }

    function nextSwappDay() public view returns (uint64) {
        return _currentSwappDay() + 1;
    }

    function previousSwappDay() public view returns (uint64) {
        return _currentSwappDay() - 1;
    }

    function swappDayFromStamp(uint256 _timestamp) public view returns (uint64) {
        return uint64((_timestamp - LAUNCH_TIME) / SECONDS_IN_DAY);
    }

    function getNow() public view returns (uint256) {
        return block.timestamp;
    }

    function notContract(address _addr) internal view returns (bool) {
        uint32 size;
        assembly { size := extcodesize(_addr) }
        return (size == 0);
    }

    function toBytes16(uint256 x) internal pure returns (bytes16 b) {
       return bytes16(bytes32(x));
    }

    function generateID(address x, uint256 y, bytes1 z) public pure returns (bytes16 b) {
        b = toBytes16(uint256(keccak256(abi.encodePacked(x, y, z))));
    }

    function generateStakeID(address _staker) internal view returns (bytes16 stakeID) {
        return generateID(_staker, stakeCount[_staker], 0x01);
    }

    function generateReferralID(address _referrer) internal view returns (bytes16 referralID) {
        return generateID(_referrer, referralCount[_referrer], 0x02);
    }

    function stakesPagination(
        address _staker,
        uint256 _offset,
        uint256 _length
    ) external view returns (bytes16[] memory _stakes) {
        uint256 start = _offset > 0 &&
            stakeCount[_staker] > _offset ?
            stakeCount[_staker] - _offset : stakeCount[_staker];

        uint256 finish = _length > 0 &&
            start > _length ?
            start - _length : 0;

        uint256 i;

        _stakes = new bytes16[](start - finish);

        for (uint256 _stakeIndex = start; _stakeIndex > finish; _stakeIndex--) {
            bytes16 _stakeID = generateID(_staker, _stakeIndex - 1, 0x01);
            if (stakes[_staker][_stakeID].stakedAmount > 0) {
                _stakes[i] = _stakeID; i++;
            }
        }
    }

    function referralsPagination(
        address _referrer,
        uint256 _offset,
        uint256 _length
    ) external view returns (bytes16[] memory _referrals) {
        uint256 start = _offset > 0 &&
            referralCount[_referrer] > _offset ?
            referralCount[_referrer] - _offset : referralCount[_referrer];

        uint256 finish = _length > 0 &&
            start > _length ?
            start - _length : 0;

        uint256 i;

        _referrals = new bytes16[](start - finish);

        for (uint256 _rIndex = start; _rIndex > finish; _rIndex--) {
            bytes16 _rID = generateID(_referrer, _rIndex - 1, 0x02);
            if (_nonZeroAddress(referrerLinks[_referrer][_rID].staker)) {
                _referrals[i] = _rID; i++;
            }
        }
    }

    function latestStakeID(address _staker) external view returns (bytes16) {
        return stakeCount[_staker] == 0 ? bytes16(0) : generateID(_staker, stakeCount[_staker].sub(1), 0x01);
    }

    function latestReferralID(address _referrer) external view returns (bytes16) {
        return referralCount[_referrer] == 0 ? bytes16(0) : generateID(_referrer, referralCount[_referrer].sub(1), 0x02);
    }

    function _increaseStakeCount(address _staker) internal {
        stakeCount[_staker] = stakeCount[_staker] + 1;
    }

    function _increaseReferralCount(address _referrer) internal {
        referralCount[_referrer] = referralCount[_referrer] + 1;
    }

    function _isMatureStake(Stake memory _stake) internal view returns (bool) {
        return _stake.closeDay > 0
            ? _stake.finalDay <= _stake.closeDay
            : _stake.finalDay <= _currentSwappDay();
    }

    function _notCriticalMassReferrer(address _referrer) internal view returns (bool) {
        return criticalMass[_referrer].activationDay == 0;
    }

    function _stakeNotStarted(Stake memory _stake) internal view returns (bool) {
        return _stake.closeDay > 0
            ? _stake.startDay > _stake.closeDay
            : _stake.startDay > _currentSwappDay();
    }

    function _stakeEnded(Stake memory _stake) internal view returns (bool) {
        return _stake.isActive == false || _isMatureStake(_stake);
    }

    function _daysLeft(Stake memory _stake) internal view returns (uint256) {
        return _stake.isActive == false
            ? _daysDiff(_stake.closeDay, _stake.finalDay)
            : _daysDiff(_currentSwappDay(), _stake.finalDay);
    }

    function _daysDiff(uint256 _startDate, uint256 _endDate) internal pure returns (uint256) {
        return _startDate > _endDate ? 0 : _endDate.sub(_startDate);
    }

    function _calculationDay(Stake memory _stake) internal view returns (uint256) {
        return _stake.finalDay > globals.currentSwappDay ? globals.currentSwappDay : _stake.finalDay;
    }

    function _startingDay(Stake memory _stake) internal pure returns (uint256) {
        return _stake.scrapeDay == 0 ? _stake.startDay : _stake.scrapeDay;
    }

    function _notFuture(uint256 _day) internal view returns (bool) {
        return _day <= _currentSwappDay();
    }

    function _notPast(uint256 _day) internal view returns (bool) {
        return _day >= _currentSwappDay();
    }

    function _nonZeroAddress(address _address) internal pure returns (bool) {
        return _address != address(0x0);
    }

    function _getLockDays(Stake memory _stake) internal pure returns (uint256) {
        return
            _stake.lockDays > 1 ?
            _stake.lockDays - 1 : 1;
    }

    function _preparePath(
        address _tokenAddress,
        address _swappAddress
    ) internal pure returns (address[] memory _path) {
        _path = new address[](3);
        _path[0] = _tokenAddress;
        _path[1] = WETH;
        _path[2] = _swappAddress;
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));

        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint value
    ) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

abstract contract Snapshot is Helper {
    using SafeMath for uint;

    // regular shares
    struct SnapShot {
        uint256 totalShares;
        uint256 inflationAmount;
        uint256 scheduledToEnd;
    }

    // referral shares
    struct rSnapShot {
        uint256 totalShares;
        uint256 inflationAmount;
        uint256 scheduledToEnd;
    }

    mapping(uint256 => SnapShot) public snapshots;
    mapping(uint256 => rSnapShot) public rsnapshots;
    
    modifier snapshotTrigger() {
        _dailySnapshotPoint(_currentSwappDay());
        _;
    }

    /**
     * @notice allows to activate/deactivate
     * liquidity guard manually based on the
     * liquidity in UNISWAP pair contract
     */
    function liquidityGuardTrigger() public {
        (
            uint112 reserveA,
            uint112 reserveB,
        ) = UNISWAP_PAIR.getReserves();

        uint256 onUniswap = UNISWAP_PAIR.token1() == WETH
            ? reserveA
            : reserveB;

        uint256 ratio = totalSupply() == 0
            ? 0
            : onUniswap
                .mul(200)
                .div(totalSupply());

        if (ratio < 40 && isLiquidityGuardActive == false) enableLiquidityGuard();
        if (ratio > 60 && isLiquidityGuardActive == true) disableLiquidityGuard();

        emit LiquidityGuardStatus(isLiquidityGuardActive);
    }

    function enableLiquidityGuard() private {
        isLiquidityGuardActive = true;
    }

    function disableLiquidityGuard() private {
        isLiquidityGuardActive = false;
    }

    /**
     * @notice allows volunteer to offload snapshots
     * to save on gas during next start/end stake
     */
    function manualDailySnapshot() external {
        _dailySnapshotPoint(_currentSwappDay());
    }

    /**
     * @notice allows volunteer to offload snapshots
     * to save on gas during next start/end stake
     * in case manualDailySnapshot reach block limit
     */
    function manualDailySnapshotPoint(uint64 _updateDay) external {
        require(_updateDay > 0 && _updateDay < _currentSwappDay());
        require(_updateDay > globals.currentSwappDay);

        _dailySnapshotPoint(_updateDay);
    }

    /**
     * @notice internal function that offloads
     * global values to daily snapshots
     * updates globals.currentSwappDay
     */
    function _dailySnapshotPoint(uint64 _updateDay) private {
        liquidityGuardTrigger();

        uint256 scheduledToEndToday;
        uint256 totalStakedToday = globals.totalStaked;

        for (uint256 _day = globals.currentSwappDay; _day < _updateDay; _day++) {

            // ------------------------------------
            // prepare snapshot for regular shares
            // reusing scheduledToEndToday variable

            scheduledToEndToday = scheduledToEnd[_day] + snapshots[_day - 1].scheduledToEnd;

            SnapShot memory snapshot = snapshots[_day];
            snapshot.scheduledToEnd = scheduledToEndToday;

            snapshot.totalShares =
                globals.totalShares > scheduledToEndToday ?
                globals.totalShares - scheduledToEndToday : 0;

            snapshot.inflationAmount =  snapshot.totalShares
                .mul(PRECISION_RATE)
                .div(
                    _inflationAmount(
                        totalStakedToday,
                        totalSupply(),
                        totalPenalties[_day],
                        LIQUIDITY_GUARD.getInflation(
                            INFLATION_RATE
                        )
                    )
                );

            // store regular snapshot
            snapshots[_day] = snapshot;

            // ------------------------------------
            // prepare snapshot for referrer shares
            // reusing scheduledToEndToday variable

            scheduledToEndToday = referralSharesToEnd[_day] + rsnapshots[_day - 1].scheduledToEnd;

            rSnapShot memory rsnapshot = rsnapshots[_day];
            rsnapshot.scheduledToEnd = scheduledToEndToday;

            rsnapshot.totalShares =
                globals.referralShares > scheduledToEndToday ?
                globals.referralShares - scheduledToEndToday : 0;

            rsnapshot.inflationAmount = rsnapshot.totalShares
                .mul(PRECISION_RATE)
                .div(
                    _referralInflation(
                        totalStakedToday,
                        totalSupply()
                    )
                );

            // store referral snapshot
            rsnapshots[_day] = rsnapshot;

            adjustLiquidityRates();
            globals.currentSwappDay++;
        }
    }

    /**
     * @notice moves inflation up and down by 0.006%
     * from regular shares to liquidity shares
     * if the liquidityGuard is active (visa-versa)
     */
    function adjustLiquidityRates() private {
        if (isLiquidityGuardActive ==  true) {
            INFLATION_RATE = INFLATION_RATE - 6;
            return;
        }
        if (isLiquidityGuardActive == false) {
            INFLATION_RATE = INFLATION_RATE + 6;
            return;
        }
    }

    function _inflationAmount(
        uint256 _totalStaked,
        uint256 _totalSupply,
        uint256 _totalPenalties,
        uint256 _INFLATION_RATE
    ) private pure returns (uint256) {
        return (_totalStaked + _totalSupply) * 10000 / _INFLATION_RATE + _totalPenalties;
    }

    function _referralInflation(
        uint256 _totalStaked,
        uint256 _totalSupply
    ) private pure returns (uint256) {
        return (_totalStaked + _totalSupply) * 10000 / REFERRALS_RATE;
    }
}

abstract contract ReferralToken is Snapshot {
    using SafeMath for uint256;

    function _addReferrerSharesToEnd(uint256 _finalDay, uint256 _shares) internal {
        referralSharesToEnd[_finalDay] =
        referralSharesToEnd[_finalDay].add(_shares);
    }

    function _removeReferrerSharesToEnd(uint256 _finalDay, uint256 _shares) internal {
        if (_notPast(_finalDay)) {
            referralSharesToEnd[_finalDay] =
            referralSharesToEnd[_finalDay] > _shares ?
            referralSharesToEnd[_finalDay] - _shares : 0;
        } else {
            uint256 _day = previousSwappDay();
            rsnapshots[_day].scheduledToEnd =
            rsnapshots[_day].scheduledToEnd > _shares ?
            rsnapshots[_day].scheduledToEnd - _shares : 0;
        }
    }

    function _belowThresholdLevel(address _referrer) private view returns (bool) {
        return criticalMass[_referrer].totalAmount < THRESHOLD_LIMIT;
    }

    function _addCriticalMass(address _referrer, uint256 _daiEquivalent) internal {
        criticalMass[_referrer].totalAmount =
        criticalMass[_referrer].totalAmount.add(_daiEquivalent);
        criticalMass[_referrer].activationDay = _determineActivationDay(_referrer);
    }

    function _removeCriticalMass(
        address _referrer,
        uint256 _daiEquivalent,
        uint256 _startDay
    ) internal {
        if (
            _notFuture(_startDay) == false &&
            _nonZeroAddress(_referrer)
        ) {
            criticalMass[_referrer].totalAmount =
            criticalMass[_referrer].totalAmount > _daiEquivalent ?
            criticalMass[_referrer].totalAmount - _daiEquivalent : 0;
            criticalMass[_referrer].activationDay = _determineActivationDay(_referrer);
        }
    }

    function _determineActivationDay(address _referrer) private view returns (uint256) {
        return _belowThresholdLevel(_referrer) ? 0 : _activationDay(_referrer);
    }

    function _activationDay(address _referrer) private view returns (uint256) {
        return
            criticalMass[_referrer].activationDay > 0 ?
            criticalMass[_referrer].activationDay : _currentSwappDay();
    }

    function _updateDaiEquivalent() internal returns (uint256) {
        try UNISWAP_ROUTER.getAmountsOut(
            TESLAS_PER_SWAPP, _path
        ) returns (uint256[] memory results) {
            latestDaiEquivalent = results[2];
            return latestDaiEquivalent;
        } catch Error(string memory) {
            return latestDaiEquivalent;
        } catch (bytes memory) {
            return latestDaiEquivalent;
        }
    }

    function referrerInterest(
        bytes16 _referralID,
        uint256 _scrapeDays
    ) external snapshotTrigger {
        _referrerInterest(
            msg.sender,
            _referralID,
            _scrapeDays
        );
    }

    function referrerInterestBulk(
        bytes16[] memory _referralIDs,
        uint256[] memory _scrapeDays
    ) external snapshotTrigger {
        for(uint256 i = 0; i < _referralIDs.length; i++) {
            _referrerInterest(
                msg.sender,
                _referralIDs[i],
                _scrapeDays[i]
            );
        }
    }

    function _referrerInterest(
        address _referrer,
        bytes16 _referralID,
        uint256 _processDays
    ) internal {
        ReferrerLink memory link =
        referrerLinks[_referrer][_referralID];

        require(link.isActive == true);

        address staker = link.staker;
        bytes16 stakeID = link.stakeID;

        Stake memory stake = stakes[staker][stakeID];

        uint256 startDay = _determineStartDay(stake, link);
        uint256 finalDay = _determineFinalDay(stake);

        if (_stakeEnded(stake)) {
            if (
                _processDays > 0 &&
                _processDays < _daysDiff(startDay, finalDay)
                )
            {
                link.processedDays =
                link.processedDays.add(_processDays);

                finalDay =
                startDay.add(_processDays);
            } else {
                link.isActive = false;
            }
        } else {
            _processDays = _daysDiff(startDay, _currentSwappDay());

            link.processedDays =
            link.processedDays.add(_processDays);

            finalDay =
            startDay.add(_processDays);
        }

        uint256 referralInterest = _checkReferralInterest(
            stake,
            startDay,
            finalDay
        );

        link.rewardAmount = link.rewardAmount.add(referralInterest);

        referrerLinks[_referrer][_referralID] = link;

        _mint(_referrer, referralInterest);

        emit ReferralCollected(
            staker,
            stakeID,
            _referrer,
            _referralID,
            referralInterest
        );
    }

    function checkReferralsByID(
        address _referrer,
        bytes16 _referralID
    ) external view returns (
        address staker,
        bytes16 stakeID,
        uint256 referrerShares,
        uint256 referralInterest,
        bool isActiveReferral,
        bool isActiveStake,
        bool isMatureStake,
        bool isEndedStake
    ) {
        ReferrerLink memory link = referrerLinks[_referrer][_referralID];

        staker = link.staker;
        stakeID = link.stakeID;
        isActiveReferral = link.isActive;

        Stake memory stake = stakes[staker][stakeID];
        referrerShares = stake.referrerShares;

        referralInterest = _checkReferralInterest(
            stake,
            _determineStartDay(stake, link),
            _determineFinalDay(stake)
        );

        isActiveStake = stake.isActive;
        isEndedStake = _stakeEnded(stake);
        isMatureStake = _isMatureStake(stake);
    }

    function _checkReferralInterest(
        Stake memory _stake,
        uint256 _startDay,
        uint256 _finalDay
    ) internal view returns (uint256 _referralInterest) {
        return _notCriticalMassReferrer(_stake.referrer) ? 0 : _getReferralInterest(_stake, _startDay, _finalDay);
    }

    function _getReferralInterest(
        Stake memory _stake,
        uint256 _startDay,
        uint256 _finalDay
    ) private view returns (uint256 _referralInterest) {
        for (uint256 _day = _startDay; _day < _finalDay; _day++) {
            _referralInterest += _stake.stakesShares * PRECISION_RATE / rsnapshots[_day].inflationAmount;
        }
    }

    function _determineStartDay(
        Stake memory _stake,
        ReferrerLink memory _link
    ) internal view returns (uint256) {
        return (
            criticalMass[_stake.referrer].activationDay > _stake.startDay ?
            criticalMass[_stake.referrer].activationDay : _stake.startDay
        ).add(_link.processedDays);
    }

    function _determineFinalDay(
        Stake memory _stake
    ) internal view returns (uint256) {
        return
            _stake.closeDay > 0 ?
            _stake.closeDay : _calculationDay(_stake);
    }
}

abstract contract StakingToken is ReferralToken {
    using SafeMath for uint256;

    /**
     * @notice A method for a staker to create multiple stakes
     * @param _stakedAmount amount of SWAPP staked.
     * @param _lockDays amount of days it is locked for.
     * @param _referrer address of the referrer
     */
    function createStakeBulk(
        uint256[] memory _stakedAmount,
        uint64[] memory _lockDays,
        address[] memory _referrer
    ) external {
        for(uint256 i = 0; i < _stakedAmount.length; i++) {
            createStake(_stakedAmount[i], _lockDays[i], _referrer[i]);
        }
    }

    /**
     * @notice A method for a staker to create a stake
     * @param _stakedAmount amount of SWAPP staked.
     * @param _lockDays amount of days it is locked for.
     * @param _referrer address of the referrer
     */
    function createStake(
        uint256 _stakedAmount,
        uint64 _lockDays,
        address _referrer
    )  public returns (bytes16, uint256, bytes16 referralID) {
        require(msg.sender != _referrer && notContract(_referrer));
        require(_lockDays >= MIN_LOCK_DAYS && _lockDays <= MAX_LOCK_DAYS);
        require(_stakedAmount >= MIN_STAKE_AMOUNT);

        (
            Stake memory newStake,
            bytes16 stakeID,
            uint256 _startDay
        ) = _createStake(msg.sender, _stakedAmount, _lockDays, _referrer);

        if (newStake.referrerShares > 0) {

            ReferrerLink memory referrerLink;

            referrerLink.staker = msg.sender;
            referrerLink.stakeID = stakeID;
            referrerLink.isActive = true;

            referralID = generateReferralID(_referrer);
            referrerLinks[_referrer][referralID] = referrerLink;

            _increaseReferralCount(_referrer);
            _addReferrerSharesToEnd(newStake.finalDay, newStake.referrerShares);
        }

        stakes[msg.sender][stakeID] = newStake;

        _increaseStakeCount(msg.sender);

        _increaseGlobals(
            newStake.stakedAmount,
            newStake.stakesShares,
            newStake.referrerShares
        );

        _addScheduledShares(newStake.finalDay, newStake.stakesShares);

        emit StakeStart(
            stakeID,
            msg.sender,
            _referrer,
            newStake.stakedAmount,
            newStake.stakesShares,
            newStake.referrerShares,
            newStake.startDay,
            newStake.lockDays,
            newStake.daiEquivalent
        );

        return (stakeID, _startDay, referralID);
    }

    function getStakingShare(
        uint256 _stakedAmount,
        uint64 _lockDays,
        address _referrer
    ) external view returns (uint256 stakingShare) {
        return _stakesShares(
            _stakedAmount,
            _lockDays,
            _referrer,
            globals.sharePrice
        );
    }

    /**
    * @notice A method for a staker to start a stake
    * @param _staker ...
    * @param _stakedAmount ...
    * @param _lockDays ...
    */
    function _createStake(
        address _staker,
        uint256 _stakedAmount,
        uint64 _lockDays,
        address _referrer
    ) private returns (Stake memory _newStake, bytes16 _stakeID, uint64 _startDay) {
        _burn(_staker, _stakedAmount);

        userStakedAmount[_staker] = userStakedAmount[_staker].add(_stakedAmount);

        _startDay = nextSwappDay();
        _stakeID = generateStakeID(_staker);

        _newStake.lockDays = _lockDays;
        _newStake.startDay = _startDay;
        _newStake.finalDay = _startDay + _lockDays;
        _newStake.isActive = true;

        _newStake.stakedAmount = _stakedAmount;
        _newStake.stakesShares = _stakesShares(
            _stakedAmount,
            _lockDays,
            _referrer,
            globals.sharePrice
        );

        _updateDaiEquivalent();

        _newStake.daiEquivalent = latestDaiEquivalent
            .mul(_newStake.stakedAmount)
            .div(TESLAS_PER_SWAPP);

        if (_nonZeroAddress(_referrer)) {
            _newStake.referrer = _referrer;
            _addCriticalMass(_newStake.referrer, _newStake.daiEquivalent);
            _newStake.referrerShares = _referrerShares(
                _stakedAmount,
                _lockDays,
                _referrer
            );
        }
    }

    /**
    * @notice A method for a staker to remove a stake
    * belonging to his address by providing ID of a stake.
    * @param _stakeID unique bytes sequence reference to the stake
    */
    function endStake(bytes16 _stakeID) snapshotTrigger external returns (uint256) {
        (
            Stake memory endedStake,
            uint256 penaltyAmount
        ) = _endStake(msg.sender, _stakeID);

        _decreaseGlobals(
            endedStake.stakedAmount,
            endedStake.stakesShares,
            endedStake.referrerShares
        );

        _removeScheduledShares(endedStake.finalDay, endedStake.stakesShares);
        _removeReferrerSharesToEnd(endedStake.finalDay, endedStake.referrerShares);

        _removeCriticalMass(
            endedStake.referrer,
            endedStake.daiEquivalent,
            endedStake.startDay
        );

        _storePenalty(endedStake.closeDay, penaltyAmount);

        _sharePriceUpdate(
            endedStake.stakedAmount > penaltyAmount ?
            endedStake.stakedAmount - penaltyAmount : 0,
            endedStake.rewardAmount + scrapes[msg.sender][_stakeID],
            endedStake.referrer,
            endedStake.lockDays,
            endedStake.stakesShares
        );

        emit StakeEnd(
            _stakeID,
            msg.sender,
            endedStake.referrer,
            endedStake.stakedAmount,
            endedStake.stakesShares,
            endedStake.referrerShares,
            endedStake.rewardAmount,
            endedStake.closeDay,
            penaltyAmount
        );

        return endedStake.rewardAmount;
    }

    function _endStake(
        address _staker,
        bytes16 _stakeID
    ) private returns (Stake storage _stake, uint256 _penalty) {
        require(stakes[_staker][_stakeID].isActive);

        _stake = stakes[_staker][_stakeID];
        _stake.closeDay = _currentSwappDay();
        _stake.rewardAmount = _calculateRewardAmount(_stake);
        _penalty = _calculatePenaltyAmount(_stake);

        _stake.isActive = false;

        userStakedAmount[_staker] = userStakedAmount[_staker].sub(_stake.stakedAmount);

        _mint(
            _staker,
            _stake.stakedAmount > _penalty ?
            _stake.stakedAmount - _penalty : 0
        );

        _mint(_staker, _stake.rewardAmount);
    }

    /**
    * @notice alloes to scrape interest from active stake
    * @param _stakeID unique bytes sequence reference to the stake
    * @param _scrapeDays amount of days to proccess, 0 = all
    */
    function scrapeInterest(
        bytes16 _stakeID,
        uint64 _scrapeDays
    ) external snapshotTrigger returns (
        uint256 scrapeDay,
        uint256 scrapeAmount,
        uint256 remainingDays,
        uint256 stakersPenalty,
        uint256 referrerPenalty
    ) {
        require(stakes[msg.sender][_stakeID].isActive);

        Stake memory stake = stakes[msg.sender][_stakeID];

        scrapeDay = _scrapeDays > 0
            ? _startingDay(stake).add(_scrapeDays)
            : _calculationDay(stake);

        scrapeDay = scrapeDay > stake.finalDay
            ? _calculationDay(stake)
            : scrapeDay;

        scrapeAmount = _loopRewardAmount(
            stake.stakesShares,
            _startingDay(stake),
            scrapeDay
        );

        if (_isMatureStake(stake) == false) {

            remainingDays = _daysLeft(stake);

            stakersPenalty = _stakesShares(
                scrapeAmount,
                remainingDays,
                msg.sender,
                globals.sharePrice
            );

            stake.stakesShares = stake.stakesShares.sub(stakersPenalty);

            _removeScheduledShares(stake.finalDay, stakersPenalty);

            if (stake.referrerShares > 0) {
                referrerPenalty = _stakesShares(
                    scrapeAmount,
                    remainingDays,
                    address(0x0),
                    globals.sharePrice
                );

                stake.referrerShares = stake.referrerShares.sub(referrerPenalty);
                _removeReferrerSharesToEnd(stake.finalDay, referrerPenalty);
            }

            _decreaseGlobals(0, stakersPenalty, referrerPenalty);

            _sharePriceUpdate(
                stake.stakedAmount,
                scrapeAmount,
                stake.referrer,
                stake.lockDays,
                stake.stakesShares
            );
        }
        else {
            scrapes[msg.sender][_stakeID] = scrapes[msg.sender][_stakeID].add(scrapeAmount);
            _sharePriceUpdate(
                stake.stakedAmount,
                scrapes[msg.sender][_stakeID],
                stake.referrer,
                stake.lockDays,
                stake.stakesShares
            );
        }

        stake.scrapeDay = scrapeDay;
        stakes[msg.sender][_stakeID] = stake;

        _mint(msg.sender, scrapeAmount);

        emit InterestScraped(
            _stakeID,
            msg.sender,
            scrapeAmount,
            scrapeDay,
            stakersPenalty,
            referrerPenalty,
            _currentSwappDay()
        );
    }

    function _addScheduledShares(uint256 _finalDay, uint256 _shares) internal {
        scheduledToEnd[_finalDay] = scheduledToEnd[_finalDay].add(_shares);
    }

    function _removeScheduledShares(uint256 _finalDay, uint256 _shares) internal {
        if (_notPast(_finalDay)) {
            scheduledToEnd[_finalDay] =
            scheduledToEnd[_finalDay] > _shares ?
            scheduledToEnd[_finalDay] - _shares : 0;
        } else {
            uint256 _day = previousSwappDay();
            snapshots[_day].scheduledToEnd =
            snapshots[_day].scheduledToEnd > _shares ?
            snapshots[_day].scheduledToEnd - _shares : 0;
        }
    }

    function _sharePriceUpdate(
        uint256 _stakedAmount,
        uint256 _rewardAmount,
        address _referrer,
        uint256 _lockDays,
        uint256 _stakeShares
    ) private {
        if (_stakeShares > 0 && _currentSwappDay() > FORMULA_DAY) {
            uint256 newSharePrice = _getNewSharePrice(
                _stakedAmount,
                _rewardAmount,
                _stakeShares,
                _lockDays,
                _referrer
            );

            if (newSharePrice > globals.sharePrice) {
                newSharePrice = newSharePrice < globals.sharePrice.mul(110).div(100) ?
                    newSharePrice : globals.sharePrice.mul(110).div(100);

                emit NewSharePrice(
                    newSharePrice,
                    globals.sharePrice,
                    _currentSwappDay()
                );

                globals.sharePrice = newSharePrice;
            }

            return;
        }

        if (_currentSwappDay() == FORMULA_DAY) {
            globals.sharePrice = 110E15;
        }
    }

    function _getNewSharePrice(
        uint256 _stakedAmount,
        uint256 _rewardAmount,
        uint256 _stakeShares,
        uint256 _lockDays,
        address _referrer
    ) private pure returns (uint256) {
        uint256 _bonusAmount = _getBonus(
            _lockDays, _nonZeroAddress(_referrer) ? 11E9 : 10E9
        );

        return 
            _stakedAmount
                .add(_rewardAmount)
                .mul(_bonusAmount)
                .mul(1E8)
                .div(_stakeShares);
    }

    function checkMatureStake(
        address _staker,
        bytes16 _stakeID
    ) external view returns (bool isMature) {
        Stake memory stake = stakes[_staker][_stakeID];
        isMature = _isMatureStake(stake);
    }

    function checkStakeByID(address _staker, bytes16 _stakeID) external view
        returns (
            uint256 startDay,
            uint256 lockDays,
            uint256 finalDay,
            uint256 closeDay,
            uint256 scrapeDay,
            uint256 stakedAmount,
            uint256 stakesShares,
            uint256 rewardAmount,
            uint256 penaltyAmount,
            bool isActive,
            bool isMature
        )
    {
        Stake memory stake = stakes[_staker][_stakeID];
        startDay = stake.startDay;
        lockDays = stake.lockDays;
        finalDay = stake.finalDay;
        closeDay = stake.closeDay;
        scrapeDay = stake.scrapeDay;
        stakedAmount = stake.stakedAmount;
        stakesShares = stake.stakesShares;
        rewardAmount = _checkRewardAmount(stake);
        penaltyAmount = _calculatePenaltyAmount(stake);
        isActive = stake.isActive;
        isMature = _isMatureStake(stake);
    }

    function _stakesShares(
        uint256 _stakedAmount,
        uint256 _lockDays,
        address _referrer,
        uint256 _sharePrice
    ) private pure returns (uint256) {
        return _nonZeroAddress(_referrer)
            ? _sharesAmount(_stakedAmount, _lockDays, _sharePrice, 11E9)
            : _sharesAmount(_stakedAmount, _lockDays, _sharePrice, 10E9);
    }

    function _sharesAmount(
        uint256 _stakedAmount,
        uint256 _lockDays,
        uint256 _sharePrice,
        uint256 _extraBonus
    ) private pure returns (uint256) {
        return _baseAmount(_stakedAmount, _sharePrice)
            .mul(_getBonus(_lockDays, _extraBonus))
            .div(10E9);
    }

    function _getBonus(
        uint256 _lockDays,
        uint256 _extraBonus
    ) private pure returns (uint256) {
        return
            _regularBonus(_lockDays, DAILY_BONUS_A, MAX_BONUS_DAYS_A) +
            _regularBonus(
                _lockDays > MAX_BONUS_DAYS_A ?
                _lockDays - MAX_BONUS_DAYS_A : 0, DAILY_BONUS_B, MAX_BONUS_DAYS_B
            ) + _extraBonus;
    }

    function _regularBonus(
        uint256 _lockDays,
        uint256 _daily,
        uint256 _maxDays
    ) private pure returns (uint256) {
        return (
            _lockDays > _maxDays
                ? _maxDays.mul(_daily)
                : _lockDays.mul(_daily)
            ).div(10E9);
    }

    function _baseAmount(
        uint256 _stakedAmount,
        uint256 _sharePrice
    ) private pure returns (uint256) {
        return _stakedAmount.mul(PRECISION_RATE).div(_sharePrice);
    }

    function _referrerShares(
        uint256 _stakedAmount,
        uint256 _lockDays,
        address _referrer
    ) private view returns (uint256) {
        return
            _notCriticalMassReferrer(_referrer) ||
            _lockDays < MIN_REFERRAL_DAYS
                ? 0
                : _sharesAmount(
                    _stakedAmount,
                    _lockDays,
                    globals.sharePrice,
                    10E9
                );
    }

    function _checkRewardAmount(Stake memory _stake) private view returns (uint256) {
        return _stake.isActive ? _detectReward(_stake) : _stake.rewardAmount;
    }

    function _detectReward(Stake memory _stake) private view returns (uint256) {
        return _stakeNotStarted(_stake) ? 0 : _calculateRewardAmount(_stake);
    }

    function _storePenalty(uint64 _storeDay, uint256 _penalty) private {
        if (_penalty > 0) {
            totalPenalties[_storeDay] =
            totalPenalties[_storeDay].add(_penalty);
        }
    }

    function _calculatePenaltyAmount(Stake memory _stake) private view returns (uint256) {
        return _stakeNotStarted(_stake) || _isMatureStake(_stake) ? 0 : _getPenalties(_stake);
    }

    function _getPenalties(Stake memory _stake) private view returns (uint256) {
        return _stake.stakedAmount * (100 + (800 * (_daysLeft(_stake) - 1) / (_getLockDays(_stake)))) / 1000;
    }

    function _calculateRewardAmount(Stake memory _stake) private view returns (uint256) {
        return _loopRewardAmount(
            _stake.stakesShares,
            _startingDay(_stake),
            _calculationDay(_stake)
        );
    }

    function _loopRewardAmount(
        uint256 _stakeShares,
        uint256 _startDay,
        uint256 _finalDay
    ) private view returns (uint256 _rewardAmount) {
        for (uint256 _day = _startDay; _day < _finalDay; _day++) {
            _rewardAmount += _stakeShares * PRECISION_RATE / snapshots[_day].inflationAmount;
        }
    }
}

contract SwappToken is StakingToken {
    address public LIQUIDITY_TRANSFORMER;
    address public YIELD_FARM_STABLE;
    address public YIELD_FARM_LP;
    address public tokenMinterDefiner;

    modifier onlyMinter() {
        require(
            msg.sender == LIQUIDITY_TRANSFORMER ||
            msg.sender == YIELD_FARM_STABLE ||
            msg.sender == YIELD_FARM_LP,
            'SWAPP: Invalid token minter'
        );
        _;
    }

    constructor() ERC20("Swapp Token", "SWAPP") {
        tokenMinterDefiner = msg.sender;

        _mint(0x0d970a04d46c73B6d20d9a0B2B07C35F2495ca9c, 162500000E18); // SWAPP FOUNDATION - Contract Owner Wallet
        _mint(0x915D99375Ba8EDbbee46bE1AD045718a05A6655b, 3307862E18);   // MM-PRESALE Investors Wallet
        _mint(0x7Db4456a73a9C94a381d244E9dfC76E83C05913E, 58364082E18);  // Employee Pool Including Founders MM Wallet
        _mint(0x62F16a5bA06693B1E96a656d46e66A8CdaE17C69, 13328056E18);  // Swapp Previous Investors MM Wallet
        _mint(0x94dc2f1823AbfdC2fb9BB8Ae10162b65D2Cf1c65, 250000000E18); // Rewards Wallet
        _mint(0x2a8eA8a4842DA268FA4180b1a99B7876f820ECC1, 35000000E18);  // Future Development Wallet
        _mint(0x000baFB91ED6436ad2888C2418197aFDB85785C5, 5000000E18);   // Reserved Funding Wallet
        _mint(0xd4041e1c24A54134Fb9657e8DA85e75001D7Ea44, 5000000E18);   // Bounty, Advisors, Partnership Wallet
    }

    receive() external payable {
        revert();
    }

    function setMinters(
        address _transformer,
        address _yieldFarmStable,
        address _yieldFarmLP
    ) external {
        require(tokenMinterDefiner == msg.sender);
        LIQUIDITY_TRANSFORMER = _transformer;
        YIELD_FARM_STABLE = _yieldFarmStable;
        YIELD_FARM_LP = _yieldFarmLP;
    }

    function burnMinterDefiner() external {
        require(tokenMinterDefiner == msg.sender);
        tokenMinterDefiner = address(0x0);
    }

    /**
     * @notice allows liquidityTransformer to mint supply
     * @dev executed from liquidityTransformer upon UNISWAP transfer
     * and during reservation payout to contributors and referrers
     * @param _investorAddress address for minting SWAPP tokens
     * @param _amount of tokens to mint for _investorAddress
     */
    function mintSupply(address _investorAddress, uint256 _amount) external onlyMinter {
        _mint(_investorAddress, _amount);
    }

    /**
     * @notice allows to grant permission to CM referrer status
     * @dev called from liquidityTransformer if user referred 50 ETH
     * @param _referrer - address that becomes a CM reffer
     */
    function giveStatus(address _referrer) external onlyMinter {
        criticalMass[_referrer].totalAmount = THRESHOLD_LIMIT;
        criticalMass[_referrer].activationDay = nextSwappDay();
    }

    /**
     * @notice allows to create stake directly with ETH
     * if you don't have SWAPP tokens method will convert
     * and use amount returned from UNISWAP to open a stake
     * @param _lockDays amount of days it is locked for.
     * @param _referrer referrer address for +10% bonus
     */
    function createStakeWithETH(
        uint64 _lockDays,
        address _referrer
    ) external payable returns (bytes16, uint256, bytes16 referralID) {
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);

        uint256[] memory amounts = UNISWAP_ROUTER.swapExactETHForTokens{value: msg.value}(
            1,
            path,
            msg.sender,
            block.timestamp
        );

        return createStake(amounts[1], _lockDays, _referrer);
    }

    /**
     * @notice allows to create stake with another token
     * if you don't have SWAPP tokens method will convert
     * and use amount returned from UNISWAP to open a stake
     * @dev the token must have WETH pair on UNISWAP
     * @param _tokenAddress any ERC20 token address
     * @param _tokenAmount amount to be converted to SWAPP
     * @param _lockDays amount of days it is locked for.
     * @param _referrer referrer address for +10% bonus
     */
    function createStakeWithToken(
        address _tokenAddress,
        uint256 _tokenAmount,
        uint64 _lockDays,
        address _referrer
    ) external returns (bytes16, uint256, bytes16 referralID) {
        TokenInterface token = TokenInterface(_tokenAddress);

        token.transferFrom(msg.sender, address(this), _tokenAmount);
        token.approve(address(UNISWAP_ROUTER), _tokenAmount);

        address[] memory path = _preparePath(_tokenAddress, address(this));

        uint256[] memory amounts = UNISWAP_ROUTER.swapExactTokensForTokens(
            _tokenAmount,
            1,
            path,
            msg.sender,
            block.timestamp
        );

        return createStake(amounts[2], _lockDays, _referrer);
    }
}

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":"bytes16","name":"stakeID","type":"bytes16"},{"indexed":true,"internalType":"address","name":"stakerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"scrapeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"scrapeDay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakersPenalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referrerPenalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentSwappDay","type":"uint256"}],"name":"InterestScraped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"LiquidityGuardStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referrerShares","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"currentSwappDay","type":"uint256"}],"name":"NewGlobals","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSharePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldSharePrice","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"currentSwappDay","type":"uint64"}],"name":"NewSharePrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"bytes16","name":"referrerID","type":"bytes16"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"ReferralCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"indexed":true,"internalType":"address","name":"stakerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"referralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakesShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"closeDay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"name":"StakeEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"indexed":true,"internalType":"address","name":"stakerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"referralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakesShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startDay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockDays","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiEquivalent","type":"uint256"}],"name":"StakeStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"INFLATION_RATE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAUNCH_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_GUARD","outputs":[{"internalType":"contract ILiquidityGuard","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_TRANSFORMER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_FACTORY","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_PAIR","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_ROUTER","outputs":[{"internalType":"contract IUniswapRouterV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YIELD_FARM_LP","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YIELD_FARM_STABLE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnMinterDefiner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"bytes16","name":"_stakeID","type":"bytes16"}],"name":"checkMatureStake","outputs":[{"internalType":"bool","name":"isMature","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"bytes16","name":"_referralID","type":"bytes16"}],"name":"checkReferralsByID","outputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"internalType":"uint256","name":"referrerShares","type":"uint256"},{"internalType":"uint256","name":"referralInterest","type":"uint256"},{"internalType":"bool","name":"isActiveReferral","type":"bool"},{"internalType":"bool","name":"isActiveStake","type":"bool"},{"internalType":"bool","name":"isMatureStake","type":"bool"},{"internalType":"bool","name":"isEndedStake","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"bytes16","name":"_stakeID","type":"bytes16"}],"name":"checkStakeByID","outputs":[{"internalType":"uint256","name":"startDay","type":"uint256"},{"internalType":"uint256","name":"lockDays","type":"uint256"},{"internalType":"uint256","name":"finalDay","type":"uint256"},{"internalType":"uint256","name":"closeDay","type":"uint256"},{"internalType":"uint256","name":"scrapeDay","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"stakesShares","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"isMature","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakedAmount","type":"uint256"},{"internalType":"uint64","name":"_lockDays","type":"uint64"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"createStake","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes16","name":"referralID","type":"bytes16"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakedAmount","type":"uint256[]"},{"internalType":"uint64[]","name":"_lockDays","type":"uint64[]"},{"internalType":"address[]","name":"_referrer","type":"address[]"}],"name":"createStakeBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_lockDays","type":"uint64"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"createStakeWithETH","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes16","name":"referralID","type":"bytes16"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint64","name":"_lockDays","type":"uint64"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"createStakeWithToken","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes16","name":"referralID","type":"bytes16"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"criticalMass","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"activationDay","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSwappDay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_stakeID","type":"bytes16"}],"name":"endStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"x","type":"address"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"bytes1","name":"z","type":"bytes1"}],"name":"generateID","outputs":[{"internalType":"bytes16","name":"b","type":"bytes16"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getNow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakedAmount","type":"uint256"},{"internalType":"uint64","name":"_lockDays","type":"uint64"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"getStakingShare","outputs":[{"internalType":"uint256","name":"stakingShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"giveStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"globals","outputs":[{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalShares","type":"uint256"},{"internalType":"uint256","name":"sharePrice","type":"uint256"},{"internalType":"uint256","name":"currentSwappDay","type":"uint256"},{"internalType":"uint256","name":"referralShares","type":"uint256"},{"internalType":"uint256","name":"liquidityShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLiquidityGuardActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDaiEquivalent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"latestReferralID","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"latestStakeID","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityGuardTrigger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualDailySnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_updateDay","type":"uint64"}],"name":"manualDailySnapshotPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investorAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextSwappDay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousSwappDay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"referralSharesToEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"referralsPagination","outputs":[{"internalType":"bytes16[]","name":"_referrals","type":"bytes16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_referralID","type":"bytes16"},{"internalType":"uint256","name":"_scrapeDays","type":"uint256"}],"name":"referrerInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes16[]","name":"_referralIDs","type":"bytes16[]"},{"internalType":"uint256[]","name":"_scrapeDays","type":"uint256[]"}],"name":"referrerInterestBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes16","name":"","type":"bytes16"}],"name":"referrerLinks","outputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"processedDays","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rsnapshots","outputs":[{"internalType":"uint256","name":"totalShares","type":"uint256"},{"internalType":"uint256","name":"inflationAmount","type":"uint256"},{"internalType":"uint256","name":"scheduledToEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"scheduledToEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_stakeID","type":"bytes16"},{"internalType":"uint64","name":"_scrapeDays","type":"uint64"}],"name":"scrapeInterest","outputs":[{"internalType":"uint256","name":"scrapeDay","type":"uint256"},{"internalType":"uint256","name":"scrapeAmount","type":"uint256"},{"internalType":"uint256","name":"remainingDays","type":"uint256"},{"internalType":"uint256","name":"stakersPenalty","type":"uint256"},{"internalType":"uint256","name":"referrerPenalty","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes16","name":"","type":"bytes16"}],"name":"scrapes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_transformer","type":"address"},{"internalType":"address","name":"_yieldFarmStable","type":"address"},{"internalType":"address","name":"_yieldFarmLP","type":"address"}],"name":"setMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snapshots","outputs":[{"internalType":"uint256","name":"totalShares","type":"uint256"},{"internalType":"uint256","name":"inflationAmount","type":"uint256"},{"internalType":"uint256","name":"scheduledToEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes16","name":"","type":"bytes16"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"stakesShares","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint64","name":"startDay","type":"uint64"},{"internalType":"uint64","name":"lockDays","type":"uint64"},{"internalType":"uint64","name":"finalDay","type":"uint64"},{"internalType":"uint64","name":"closeDay","type":"uint64"},{"internalType":"uint256","name":"scrapeDay","type":"uint256"},{"internalType":"uint256","name":"daiEquivalent","type":"uint256"},{"internalType":"uint256","name":"referrerShares","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"stakesPagination","outputs":[{"internalType":"bytes16[]","name":"_stakes","type":"bytes16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"swappDayFromStamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMinterDefiner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalPenalties","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

67059b4bdc09420000600555600c805463ffffffff191662019258179055600e80546001600160a01b03191673ecd13a6c13a97483dea1e31101e63718fcbd6b7317905560e060405230608090815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260a052736b175474e89094c44da98b954eedeac495271d0f60c0526200008e906011906003620003b1565b503480156200009c57600080fd5b50604080518082018252600b81526a29bbb0b838102a37b5b2b760a91b602080830191825283518085019094526005845264053574150560dc1b908401528151919291620000ed916002916200041b565b508051620001039060039060208401906200041b565b50506004805460ff191660121790555067016345785d8a00006008556360972600600d55602180546001600160a01b0319163317905562000164730d970a04d46c73b6d20d9a0b2b07c35f2495ca9c6a866ab6a6c514d6b280000062000296565b6200018f73915d99375ba8edbbee46be1ad045718a05a6655b6a02bc778eeefc007f98000062000296565b620001ba737db4456a73a9c94a381d244e9dfc76e83c05913e6a304713399808baa388000062000296565b620001e57362f16a5ba06693b1e96a656d46e66a8cdae17c696a0b06535d0f04e307e0000062000296565b620002107394dc2f1823abfdc2fb9bb8ae10162b65d2cf1c656acecb8f27f4200f3a00000062000296565b6200023b732a8ea8a4842da268fa4180b1a99b7876f820ecc16a1cf389cd46047d0300000062000296565b62000265720bafb91ed6436ad2888c2418197afdb85785c56a0422ca8b0a00a42500000062000296565b6200029073d4041e1c24a54134fb9657e8da85e75001d7ea446a0422ca8b0a00a42500000062000296565b620004b5565b6001600160a01b038216620002aa57600080fd5b620002c6816005546200034f60201b620038721790919060201c565b6005556001600160a01b03821660009081526020818152604090912054620002f9918390620038726200034f821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600082820183811015620003aa576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b82805482825590600052602060002090810192821562000409579160200282015b828111156200040957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003d2565b50620004179291506200049e565b5090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000453576000855562000409565b82601f106200046e57805160ff191683800117855562000409565b8280016001018555821562000409579182015b828111156200040957825182559160200191906001019062000481565b5b808211156200041757600081556001016200049f565b61581580620004c56000396000f3fe6080604052600436106103d15760003560e01c80639e78fb4f116101fd578063c23d656411610118578063df2d02b1116100ab578063e7881cda1161007a578063e7881cda1461132c578063e8a407661461136b578063e8f5babe14611380578063f843d495146113aa578063fc527bf5146113bf576103db565b8063df2d02b1146111d7578063e1d033e91461121f578063e742806a146112de578063e769c3f814611317576103db565b8063d6565a2d116100e7578063d6565a2d1461112a578063d826492014611154578063db74559b14611169578063dd62ed3e1461119c576103db565b8063c23d656414611053578063c31245251461107d578063c74c0fac146110c5578063d1cf9098146110da576103db565b8063b543c4ba11610190578063be21ff701161015f578063be21ff7014610f48578063bf58f6d214610f72578063c172628e14610fbb578063c19f953c1461103e576103db565b8063b543c4ba14610eac578063b5ebdb6c14610ec1578063bba85e1f14610f09578063bbe4fd5014610f33576103db565b8063ae3d1de2116101cc578063ae3d1de214610df1578063afbad29214610e24578063b08dd75214610e39578063b381a81114610e7e576103db565b80639e78fb4f14610cd3578063a4ed055014610ce8578063a9059cbb14610d85578063a91b19f214610dbe576103db565b80634f47b16d116102ed578063779e2e18116102805780638e4647ee1161024f5780638e4647ee14610be957806395d89b4114610c1c57806399c2def414610c315780639b57ab1214610c65576103db565b8063779e2e1814610aac5780638649102b14610aef57806387da627414610b3757806389201d4e14610b4c576103db565b8063613fc9fd116102bc578063613fc9fd1461089d5780636ba631cf146108b257806370a08231146108c7578063763241d3146108fa576103db565b80634f47b16d146107cd5780635540989f146108075780635b2023871461081c57806360e4c6511461086c576103db565b806320429fac1161036557806333060d901161033457806333060d90146106ef5780633b58afe71461072257806342966c681461076e5780634dfc7a031461079a576103db565b806320429fac146105af57806323672d8a146105f257806323b872dd14610681578063313ce567146106c4576103db565b8063095ea7b3116103a1578063095ea7b3146104cf57806318160ddd146105085780631c0b37e11461051d5780631e2ef22d1461057e576103db565b80625ada7f146103e0578063022466b51461040757806302cbb2661461041c57806306fdde0314610445576103db565b366103db57600080fd5b600080fd5b3480156103ec57600080fd5b506103f56114ef565b60408051918252519081900360200190f35b34801561041357600080fd5b506103f56114f5565b34801561042857600080fd5b506104316114fb565b604080519115158252519081900360200190f35b34801561045157600080fd5b5061045a61150b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049457818101518382015260200161047c565b50505050905090810190601f1680156104c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104db57600080fd5b50610431600480360360408110156104f257600080fd5b506001600160a01b03813516906020013561159f565b34801561051457600080fd5b506103f56115bd565b6105526004803603604081101561053357600080fd5b5080356001600160401b031690602001356001600160a01b03166115c3565b604080516001600160801b03199485168152602081019390935292168183015290519081900360600190f35b34801561058a57600080fd5b5061059361180e565b604080516001600160401b039092168252519081900360200190f35b3480156105bb57600080fd5b506103f5600480360360408110156105d257600080fd5b5080356001600160a01b031690602001356001600160801b031916611820565b3480156105fe57600080fd5b506106316004803603606081101561061557600080fd5b506001600160a01b03813516906020810135906040013561183d565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561066d578181015183820152602001610655565b505050509050019250505060405180910390f35b34801561068d57600080fd5b50610431600480360360608110156106a457600080fd5b506001600160a01b038135811691602081013590911690604001356119aa565b3480156106d057600080fd5b506106d9611a19565b6040805160ff9092168252519081900360200190f35b3480156106fb57600080fd5b506103f56004803603602081101561071257600080fd5b50356001600160a01b0316611a22565b34801561072e57600080fd5b506107556004803603602081101561074557600080fd5b50356001600160a01b0316611a34565b6040805192835260208301919091528051918290030190f35b34801561077a57600080fd5b506107986004803603602081101561079157600080fd5b5035611a4d565b005b3480156107a657600080fd5b50610798600480360360208110156107bd57600080fd5b50356001600160a01b0316611a5a565b3480156107d957600080fd5b50610798600480360360408110156107f057600080fd5b506001600160801b03198135169060200135611b3d565b34801561081357600080fd5b50610593611b5c565b34801561082857600080fd5b5061084f6004803603602081101561083f57600080fd5b50356001600160a01b0316611b83565b604080516001600160801b03199092168252519081900360200190f35b34801561087857600080fd5b50610881611be2565b604080516001600160a01b039092168252519081900360200190f35b3480156108a957600080fd5b50610798611bf1565b3480156108be57600080fd5b50610881611bfe565b3480156108d357600080fd5b506103f5600480360360208110156108ea57600080fd5b50356001600160a01b0316611c0d565b34801561090657600080fd5b506107986004803603606081101561091d57600080fd5b810190602081018135600160201b81111561093757600080fd5b82018360208201111561094957600080fd5b803590602001918460208302840111600160201b8311171561096a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156109b957600080fd5b8201836020820111156109cb57600080fd5b803590602001918460208302840111600160201b831117156109ec57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a3b57600080fd5b820183602082011115610a4d57600080fd5b803590602001918460208302840111600160201b83111715610a6e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611c28945050505050565b348015610ab857600080fd5b5061043160048036036040811015610acf57600080fd5b5080356001600160a01b031690602001356001600160801b031916611c89565b348015610afb57600080fd5b50610b1960048036036020811015610b1257600080fd5b5035611d6d565b60408051938452602084019290925282820152519081900360600190f35b348015610b4357600080fd5b50610798611d8e565b348015610b5857600080fd5b50610b8f60048036036040811015610b6f57600080fd5b5080356001600160a01b031690602001356001600160801b031916611f94565b604080516001600160a01b0390991689526001600160801b031990971660208901528787019590955260608701939093529015156080860152151560a0850152151560c0840152151560e083015251908190036101000190f35b348015610bf557600080fd5b506103f560048036036020811015610c0c57600080fd5b50356001600160a01b0316612286565b348015610c2857600080fd5b5061045a612298565b348015610c3d57600080fd5b506103f560048036036020811015610c5457600080fd5b50356001600160801b0319166122f9565b348015610c7157600080fd5b50610ca860048036036040811015610c8857600080fd5b5080356001600160801b03191690602001356001600160401b0316612556565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610cdf57600080fd5b506107986129ea565b348015610cf457600080fd5b50610d2b60048036036040811015610d0b57600080fd5b5080356001600160a01b031690602001356001600160801b031916612aa4565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501521515610120840152151561014083015251908190036101600190f35b348015610d9157600080fd5b5061043160048036036040811015610da857600080fd5b506001600160a01b038135169060200135612bd0565b348015610dca57600080fd5b5061079860048036036020811015610de157600080fd5b50356001600160401b0316612be4565b348015610dfd57600080fd5b5061084f60048036036020811015610e1457600080fd5b50356001600160a01b0316612c3e565b348015610e3057600080fd5b50610798612c90565b348015610e4557600080fd5b5061079860048036036060811015610e5c57600080fd5b506001600160a01b038135811691602081013582169160409091013516612cb9565b348015610e8a57600080fd5b50610e93612d0f565b6040805163ffffffff9092168252519081900360200190f35b348015610eb857600080fd5b50610881612d1b565b348015610ecd57600080fd5b506103f560048036036060811015610ee457600080fd5b5080359060208101356001600160401b031690604001356001600160a01b0316612d2a565b348015610f1557600080fd5b506103f560048036036020811015610f2c57600080fd5b5035612d46565b348015610f3f57600080fd5b506103f5612d58565b348015610f5457600080fd5b506103f560048036036020811015610f6b57600080fd5b5035612d5c565b348015610f7e57600080fd5b5061084f60048036036060811015610f9557600080fd5b5080356001600160a01b031690602081013590604001356001600160f81b031916612d6e565b348015610fc757600080fd5b50610ffe60048036036040811015610fde57600080fd5b5080356001600160a01b031690602001356001600160801b031916612dc9565b604080516001600160a01b0390961686526001600160801b0319909416602086015284840192909252606084015215156080830152519081900360a00190f35b34801561104a57600080fd5b50610881612e15565b34801561105f57600080fd5b506103f56004803603602081101561107657600080fd5b5035612e24565b34801561108957600080fd5b50611092612e36565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156110d157600080fd5b50610881612e4b565b3480156110e657600080fd5b50610552600480360360808110156110fd57600080fd5b506001600160a01b0381358116916020810135916001600160401b03604083013516916060013516612e63565b34801561113657600080fd5b50610b196004803603602081101561114d57600080fd5b503561314a565b34801561116057600080fd5b5061088161316b565b34801561117557600080fd5b506103f56004803603602081101561118c57600080fd5b50356001600160a01b0316613183565b3480156111a857600080fd5b506103f5600480360360408110156111bf57600080fd5b506001600160a01b0381358116916020013516613195565b3480156111e357600080fd5b50610552600480360360608110156111fa57600080fd5b5080359060208101356001600160401b031690604001356001600160a01b03166131c0565b34801561122b57600080fd5b506112626004803603604081101561124257600080fd5b5080356001600160a01b031690602001356001600160801b03191661354f565b604080519c8d5260208d019b909b528b8b01999099526001600160401b0397881660608c015295871660808b015293861660a08a01529190941660c088015260e08701939093526101008601929092526101208501919091526001600160a01b0316610140840152151561016083015251908190036101800190f35b3480156112ea57600080fd5b506107986004803603604081101561130157600080fd5b506001600160a01b0381351690602001356135db565b34801561132357600080fd5b5061059361366e565b34801561133857600080fd5b506106316004803603606081101561134f57600080fd5b506001600160a01b038135169060208101359060400135613680565b34801561137757600080fd5b506108816137ea565b34801561138c57600080fd5b50610593600480360360208110156113a357600080fd5b50356137f9565b3480156113b657600080fd5b5061088161380e565b3480156113cb57600080fd5b50610798600480360360408110156113e257600080fd5b810190602081018135600160201b8111156113fc57600080fd5b82018360208201111561140e57600080fd5b803590602001918460208302840111600160201b8311171561142f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561147e57600080fd5b82018360208201111561149057600080fd5b803590602001918460208302840111600160201b831117156114b157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061381d945050505050565b60105481565b600d5481565b600f54600160a01b900460ff1681565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156115945780601f1061156957610100808354040283529160200191611594565b820191906000526020600020905b81548152906001019060200180831161157757829003601f168201915b505050505090505b90565b60006115b36115ac6138d3565b84846138d7565b5060015b92915050565b60055490565b60408051600280825260608201835260009283928392839260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061160c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061163a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab53460018533426040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156116ef5781810151838201526020016116d7565b50505050905001955050505050506000604051808303818588803b15801561171657600080fd5b505af115801561172a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561175457600080fd5b8101908080516040519392919084600160201b82111561177357600080fd5b90830190602082018581111561178857600080fd5b82518660208202830111600160201b821117156117a457600080fd5b82525081516020918201928201910280838360005b838110156117d15781810151838201526020016117b9565b5050505090500160405250505090506117ff816001815181106117f057fe5b602002602001015188886131c0565b94509450945050509250925092565b6000600161181a61395f565b03905090565b601560209081526000928352604080842090915290825290205481565b60606000808411801561186757506001600160a01b03851660009081526012602052604090205484105b611889576001600160a01b0385166000908152601260205260409020546118a6565b6001600160a01b0385166000908152601260205260409020548490035b9050600080841180156118b857508382115b6118c35760006118c7565b8382035b905060008183036001600160401b03811180156118e357600080fd5b5060405190808252806020026020018201604052801561190d578160200160208202803683370190505b509350825b8281111561199f57600061192f896000198401600160f81b612d6e565b6001600160a01b038a1660009081526016602090815260408083206001600160801b03198516845290915290206001015490915015611995578086848151811061197557fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901611912565b505050509392505050565b6000611a04846119b86138d3565b6001600160a01b03871660009081526001602052604081206119ff918791906119df6138d3565b6001600160a01b0316815260208101919091526040016000205490613971565b6138d7565b611a0f8484846139b3565b5060019392505050565b60045460ff1690565b60126020526000908152604090205481565b6014602052600090815260409020805460019091015482565b611a573382613a85565b50565b601e546001600160a01b0316331480611a7d5750601f546001600160a01b031633145b80611a9257506020546001600160a01b031633145b611ae3576040805162461bcd60e51b815260206004820152601b60248201527f53574150503a20496e76616c696420746f6b656e206d696e7465720000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260146020526040902069021e19e0c9bab24000009055611b1061366e565b6001600160a01b0390911660009081526014602052604090206001600160401b0391909116600190910155565b611b4d611b4861395f565b613b29565b611b58338383613d59565b5050565b6000600d54611b69612d58565b1015611b76576000611b7e565b611b7e61395f565b905090565b6001600160a01b03811660009081526013602052604081205415611bda576001600160a01b038216600090815260136020526040902054611bd5908390611bcb906001613971565b600160f91b612d6e565b6115b7565b600092915050565b601e546001600160a01b031681565b611bfc611b4861395f565b565b600f546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b60005b8351811015611c8357611c78848281518110611c4357fe5b6020026020010151848381518110611c5757fe5b6020026020010151848481518110611c6b57fe5b60200260200101516131c0565b505050600101611c2b565b50505050565b6001600160a01b0382811660009081526016602090815260408083206001600160801b03198616845282528083208151610180810183528154815260018201549381019390935260028101549183019190915260038101546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600481015460e08301526005810154610100830152600681015461012083015260070154928316610140820152600160a01b90920460ff16151561016083015290611d65816140d7565b949350505050565b601d6020526000908152604090208054600182015460029092015490919083565b600080600f60009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611ddf57600080fd5b505afa158015611df3573d6000803e3d6000fd5b505050506040513d6060811015611e0957600080fd5b508051602091820151600f546040805163d21220a760e01b8152905193965091945060009373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2936001600160a01b039092169263d21220a79260048083019392829003018186803b158015611e7157600080fd5b505afa158015611e85573d6000803e3d6000fd5b505050506040513d6020811015611e9b57600080fd5b50516001600160a01b031614611eb15781611eb3565b825b6dffffffffffffffffffffffffffff1690506000611ecf6115bd565b15611ef557611ef0611edf6115bd565b611eea8460c8614138565b90614191565b611ef8565b60005b9050602881108015611f145750600f54600160a01b900460ff16155b15611f2157611f216141d3565b603c81118015611f3f5750600f54600160a01b900460ff1615156001145b15611f4c57611f4c6141e8565b600f5460408051600160a01b90920460ff1615158252517fbbf65e071e5468fb599b01ba3b914ae6065cf10ad084e0efe2133f7eaa8979bd916020908290030190a150505050565b6000806000806000806000806000601760008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b03191681526020019081526020016000206040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a900460801b6001600160801b0319166001600160801b031916815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060000151985080602001519750806080015194506000601660008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008a6001600160801b0319166001600160801b0319168152602001908152602001600020604051806101800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016007820160149054906101000a900460ff161515151581525050905080610120015197506122578161224983856141f7565b6122528461427c565b6142ac565b9650806101600151945061226a816142da565b9250612275816140d7565b935050509295985092959890939650565b601b6020526000908152604090205481565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115945780601f1061156957610100808354040283529160200191611594565b6000612306611b4861395f565b60008061231333856142f3565b6040805161018081018252835480825260018501546020830181905260028601549383019390935260038501546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600485015460e08301526005850154610100830152600685015461012083018190526007909501546001600160a01b038116610140840152600160a01b900460ff1615156101608301529095509193506123d69290919061457f565b6123f18260a001516001600160401b031683600001516145dc565b61240d8260a001516001600160401b031683610120015161468f565b61242f82610140015183610100015184606001516001600160401b0316614742565b61243d8260c00151826147e7565b6124aa8183602001511161245257600061245a565b818360200151035b3360009081526015602090815260408083206001600160801b03198a16845290915290819020549085015161014086015160808701518751929093019290916001600160401b039091169061482d565b8161014001516001600160a01b0316336001600160a01b0316856001600160801b0319167f8cc66e48ebd8c008b36e03ee2f7c3f60a313a34a5bf1f3cb988a7936cd47f0d48560200151866000015187610120015188604001518960c001518960405180878152602001868152602001858152602001848152602001836001600160401b03168152602001828152602001965050505050505060405180910390a4506040015192915050565b6000806000806000612569611b4861395f565b3360009081526016602090815260408083206001600160801b03198b168452909152902060070154600160a01b900460ff166125a457600080fd5b3360009081526016602090815260408083206001600160801b03198b1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c0830152600483015460e0830152600583015461010083015260068301546101208301526007909201546001600160a01b038116610140830152600160a01b900460ff16151561016082015290871661268b5761268681614936565b6126a7565b6126a7876001600160401b03166126a18361496c565b90613872565b95508060a001516001600160401b031686116126c357856126cc565b6126cc81614936565b95506126e581600001516126df8361496c565b88614995565b94506126f0816140d7565b6127bf576126fd816149db565b9350612710858533600660020154614a34565b815190935061271f9084613971565b815260a0810151612739906001600160401b0316846145dc565b610120810151156127875761275685856000600660020154614a34565b6101208201519092506127699083613971565b61012082015260a0810151612787906001600160401b03168361468f565b6127936000848461457f565b6127ba81602001518683610140015184608001516001600160401b0316856000015161482d565b61283a565b3360009081526015602090815260408083206001600160801b03198c1684529091529020546127ee9086613872565b3360009081526015602090815260408083206001600160801b03198d16845282529091208290558201516101408301516080840151845161283a9492916001600160401b03169061482d565b60e081018681523360008181526016602090815260408083206001600160801b03198e168452825291829020855181559085015160018201559084015160028201556060840151600382018054608087015160a088015160c089015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b93909116929092029190911790559151600483015561010083015160058301556101208301516006830155610140830151600790920180546101608501516001600160a01b03199091166001600160a01b039094169390931760ff60a01b1916600160a01b93151593909302929092179091556129739086614a73565b336001600160801b031989167f7b5d0995432c9ea1c8033b358af591013d0deff8dec5f4ae49612eba8bfafc0c878987876129ac61395f565b6040805195865260208601949094528484019290925260608401526001600160401b03166080830152519081900360a00190a3509295509295909350565b604080516364e329cb60e11b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201523060248201529051735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163c9c653969160448083019260209291908290030181600087803b158015612a5757600080fd5b505af1158015612a6b573d6000803e3d6000fd5b505050506040513d6020811015612a8157600080fd5b5051600f80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0382811660009081526016602090815260408083206001600160801b03198616845282528083208151610180810183528154808252600183015494820185905260028301549382019390935260038201546001600160401b0380821660608401819052600160401b8304821660808501819052600160801b8404831660a08601819052600160c01b90940490921660c08501819052600486015460e0860181905260058701546101008701526006870154610120870152600790960154998a16610140860152600160a01b90990460ff161515610160850152979096919590949092909190819081908190612b9f81614b0f565b9450612baa81614b2e565b93508061016001519250612bbd816140d7565b9150509295989b509295989b9093969950565b60006115b3612bdd6138d3565b84846139b3565b6000816001600160401b0316118015612c155750612c0061395f565b6001600160401b0316816001600160401b0316105b612c1e57600080fd5b6009546001600160401b03821611612c3557600080fd5b611a5781613b29565b6001600160a01b03811660009081526012602052604081205415611bda576001600160a01b038216600090815260126020526040902054611bd5908390612c86906001613971565b600160f81b612d6e565b6021546001600160a01b03163314612ca757600080fd5b602180546001600160a01b0319169055565b6021546001600160a01b03163314612cd057600080fd5b601e80546001600160a01b039485166001600160a01b031991821617909155601f80549385169382169390931790925560208054919093169116179055565b600c5463ffffffff1681565b600e546001600160a01b031681565b6000611d6584846001600160401b031684600660020154614a34565b601a6020526000908152604090205481565b4290565b60196020526000908152604090205481565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152603482018590526001600160f81b0319841660548301528251603581840301815260559092019092528051910120600090611d659061159c565b6017602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401546001600160a01b039093169360809290921b9290919060ff1685565b6021546001600160a01b031681565b60186020526000908152604090205481565b600654600754600854600954600a54600b5486565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516000918291829188916001600160a01b038316916323b872dd91606480830192602092919082900301818887803b158015612ec057600080fd5b505af1158015612ed4573d6000803e3d6000fd5b505050506040513d6020811015612eea57600080fd5b50506040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810189905290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b158015612f4f57600080fd5b505af1158015612f63573d6000803e3d6000fd5b505050506040513d6020811015612f7957600080fd5b5060009050612f888930614b55565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398a60018533426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561302557818101518382015260200161300d565b505050509050019650505050505050600060405180830381600087803b15801561304e57600080fd5b505af1158015613062573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561308b57600080fd5b8101908080516040519392919084600160201b8211156130aa57600080fd5b9083019060208201858111156130bf57600080fd5b82518660208202830111600160201b821117156130db57600080fd5b82525081516020918201928201910280838360005b838110156131085781810151838201526020016130f0565b5050505090500160405250505090506131368160028151811061312757fe5b602002602001015189896131c0565b9550955095505050505b9450945094915050565b601c6020526000908152604090208054600182015460029092015490919083565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60136020526000908152604090205481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60008080336001600160a01b038516148015906131e157506131e184614c1b565b6131ea57600080fd5b60016001600160401b0386161080159061320f5750613be26001600160401b03861611155b61321857600080fd5b620f424086101561322857600080fd5b6000806000613239338a8a8a614c26565b6001600160401b0316925092509250600083610120015111156133305761325e615656565b3381526001600160801b0319831660208201526001608082015261328188614d56565b6001600160a01b0389811660009081526017602090815260408083206001600160801b0319868116855290835292819020865181546001600160a01b031916951694909417845590850151600184018054909316608091821c179092558401516002830155606084015160038301558301516004909101805460ff1916911515919091179055945061331288614d7f565b61332e8460a001516001600160401b0316856101200151614d9f565b505b3360008181526016602090815260408083206001600160801b031987168452825291829020865181559086015160018201559085015160028201556060850151600382018054608088015160a089015160c08a015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b939091169290920291909117905560e0850151600482015561010085015160058201556101208501516006820155610140850151600790910180546101608701516001600160a01b03199091166001600160a01b039093169290921760ff60a01b1916600160a01b9215159290920291909117905561346390614dce565b61347b83602001518460000151856101200151614dee565b6134968360a001516001600160401b03168460000151614e21565b866001600160a01b0316336001600160a01b0316836001600160801b0319167f6619c8f19b39bf3558af16516f9ca110fcac4a7ab6d846d1b02a17b11f703a338660200151876000015188610120015189606001518a608001518b610100015160405180878152602001868152602001858152602001846001600160401b03168152602001836001600160401b03168152602001828152602001965050505050505060405180910390a490945092505093509350939050565b6016602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007909701549596949593946001600160401b0380851695600160401b8604821695600160801b8104831695600160c01b909104909216939192906001600160a01b03811690600160a01b900460ff168c565b601e546001600160a01b03163314806135fe5750601f546001600160a01b031633145b8061361357506020546001600160a01b031633145b613664576040805162461bcd60e51b815260206004820152601b60248201527f53574150503a20496e76616c696420746f6b656e206d696e7465720000000000604482015290519081900360640190fd5b611b588282614a73565b600061367861395f565b600101905090565b6060600080841180156136aa57506001600160a01b03851660009081526013602052604090205484105b6136cc576001600160a01b0385166000908152601360205260409020546136e9565b6001600160a01b0385166000908152601360205260409020548490035b9050600080841180156136fb57508382115b61370657600061370a565b8382035b905060008183036001600160401b038111801561372657600080fd5b50604051908082528060200260200182016040528015613750578160200160208202803683370190505b509350825b8281111561199f576000613772896000198401600160f91b612d6e565b6001600160a01b03808b1660009081526017602090815260408083206001600160801b0319861684529091529020549192506137ae9116614e50565b156137e057808684815181106137c057fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901613755565b601f546001600160a01b031681565b600d54600090620151809083035b0492915050565b6020546001600160a01b031681565b613828611b4861395f565b60005b825181101561386d576138653384838151811061384457fe5b602002602001015184848151811061385857fe5b6020026020010151613d59565b60010161382b565b505050565b6000828201838110156138cc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166138ea57600080fd5b6001600160a01b0382166138fd57600080fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000611b7e61396c612d58565b6137f9565b60006138cc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614e5e565b6001600160a01b0383166139c657600080fd5b6001600160a01b0382166139d957600080fd5b6001600160a01b0383166000908152602081905260409020546139fc9082613971565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613a2b9082613872565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b038216613a9857600080fd5b6001600160a01b038216600090815260208190526040902054613abb9082613971565b6001600160a01b038316600090815260208190526040902055600554613ae19082613971565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b613b31611d8e565b600654600954600091905b836001600160401b0316811015611c835760001981016000908152601c602081815260408084206002015485855260188352818520549383529381902081516060810183528154815260019091015492810192909252919092019082018190526007549094508410613baf576000613bb6565b6007548490035b8152613c6e613c5a84613bc76115bd565b6000868152601a602090815260409182902054600e54600c5484516330550a4b60e01b815263ffffffff9091166004820152935191936001600160a01b03909116926330550a4b92602480840193829003018186803b158015613c2957600080fd5b505afa158015613c3d573d6000803e3d6000fd5b505050506040513d6020811015613c5357600080fd5b5051614ef5565b8251611eea90670de0b6b3a7640000614138565b60208083019182526000848152601c825260408082208551815593516001808601919091558186015160029586015560001987018352601d80855282842090950154878452601985528284205495855292829020825160608101845281548152910154938101939093529201918101829052600a54919550908510613cf4576000613cfb565b600a548590035b8152613d11613c5a85613d0c6115bd565b614f12565b60208083019182526000858152601d9091526040908190208351815591516001830155820151600290910155613d45614f21565b505060098054600190810190915501613b3c565b6001600160a01b0380841660009081526017602090815260408083206001600160801b0319808816855290835292819020815160a08101835281549095168552600180820154608090811b90951693860193909352600281015491850191909152600381015460608501526004015460ff16151591830182905214613ddd57600080fd5b80516020808301516001600160a01b0380841660009081526016845260408082206001600160801b03198516835285528082208151610180810183528154815260018201549681019690965260028101549186019190915260038101546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b9091041660c0860152600481015460e08601526005810154610100860152600681015461012086015260070154918216610140850152600160a01b90910460ff161515610160840152909190613ec182866141f7565b90506000613ece8361427c565b9050613ed9836142da565b15613f2d57600087118015613ef65750613ef38282614f8e565b87105b15613f20576060860151613f0a9088613872565b6060870152613f198288613872565b9050613f28565b600060808701525b613f6b565b613f4782613f3961395f565b6001600160401b0316614f8e565b6060870151909750613f599088613872565b6060870152613f688288613872565b90505b6000613f788484846142ac565b6040880151909150613f8a9082613872565b87604001818152505086601760008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b031916815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b03021916908360801c0217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506140738a82614a73565b604080516001600160801b03198b811682526020820184905282516001600160a01b03808f1694928a1693908b16927f5d13067bdc9e4d510839580df1e932220b31fb2bc7790b5bd35aae14f0303bed92918290030190a450505050505050505050565b6000808260c001516001600160401b031611614113576140f561395f565b6001600160401b03168260a001516001600160401b031611156115b7565b8160c001516001600160401b03168260a001516001600160401b031611159050919050565b600082614147575060006115b7565b8282028284828161415457fe5b04146138cc5760405162461bcd60e51b81526004018080602001828103825260218152602001806157bf6021913960400191505060405180910390fd5b60006138cc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614faf565b600f805460ff60a01b1916600160a01b179055565b600f805460ff60a01b19169055565b60006138cc826060015184606001516001600160401b0316601460008761014001516001600160a01b03166001600160a01b0316815260200190815260200160002060010154116142555784606001516001600160401b03166126a1565b6101408501516001600160a01b031660009081526014602052604090206001015490613872565b6000808260c001516001600160401b03161161429b57611bd582614936565b5060c001516001600160401b031690565b60006142bc846101400151615014565b6142d0576142cb848484615033565b611d65565b5060009392505050565b61016081015160009015806115b757506115b7826140d7565b6001600160a01b03821660009081526016602090815260408083206001600160801b0319851684529091528120600701548190600160a01b900460ff1661433957600080fd5b6001600160a01b03841660009081526016602090815260408083206001600160801b0319871684529091529020915061437061395f565b6003830180546001600160c01b0316600160c01b6001600160401b0393841681029190911791829055604080516101808101825286548152600187015460208201526002870154918101919091528284166060820152600160401b830484166080820152600160801b8304841660a0820152910490911660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff16151561016082015261443c90615072565b60028301819055604080516101808101825284548152600185015460208201529081019190915260038301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526144f290614b2e565b60078301805460ff60a01b1916905560018301546001600160a01b0386166000908152601b602052604090205491925061452c9190613971565b6001600160a01b0385166000908152601b6020526040902055600182015461456a908590831061455d576000614565565b828460010154035b614a73565b614578848360020154614a73565b9250929050565b600654831061458f576000614596565b6006548390035b60065560075482106145a95760006145b0565b6007548290035b60075580156145d457600a5481106145c95760006145d0565b600a548190035b600a555b61386d615093565b6145e5826150ea565b1561462d576000828152601860205260409020548110614606576000614619565b6000828152601860205260409020548190035b600083815260186020526040902055611b58565b600061463761180e565b6001600160401b03166000818152601c60205260409020600201549091508210614662576000614678565b6000818152601c60205260409020600201548290035b6000918252601c6020526040909120600201555050565b614698826150ea565b156146e05760008281526019602052604090205481106146b95760006146cc565b6000828152601960205260409020548190035b600083815260196020526040902055611b58565b60006146ea61180e565b6001600160401b03166000818152601d6020526040902060020154909150821061471557600061472b565b6000818152601d60205260409020600201548290035b6000918252601d6020526040909120600201555050565b61474b81615106565b15801561475c575061475c83614e50565b1561386d576001600160a01b03831660009081526014602052604090205482106147875760006147a4565b6001600160a01b0383166000908152601460205260409020548290035b6001600160a01b0384166000908152601460205260409020556147c683615122565b6001600160a01b038416600090815260146020526040902060010155505050565b8015611b58576001600160401b0382166000908152601a60205260409020546148109082613872565b6001600160401b0383166000908152601a60205260409020555050565b60008111801561484d5750604161484261395f565b6001600160401b0316115b15614909576000614861868684868861513a565b6008549091508111156149035760085461488390606490611eea90606e614138565b81106148a35760085461489e90606490611eea90606e614138565b6148a5565b805b90507fb52ab4a425c20017539fcd851fc4ddbb50d17546576353cd51a2d483d80a45b8816006600201546148d761395f565b6040805193845260208401929092526001600160401b031682820152519081900360600190a160088190555b5061492f565b604161491361395f565b6001600160401b0316141561492f57670186cc6acd4b00006008555b5050505050565b60006006600301548260a001516001600160401b031611614964578160a001516001600160401b03166115b7565b505060095490565b60008160e00151600014614984578160e001516115b7565b50606001516001600160401b031690565b6000825b828110156149d3576000818152601c6020526040902060010154670de0b6b3a76400008602816149c557fe5b049190910190600101614999565b509392505050565b61016081015160009015614a1057611bd56149f461395f565b6001600160401b03168360a001516001600160401b0316614f8e565b6115b78260c001516001600160401b03168360a001516001600160401b0316614f8e565b6000614a3f83614e50565b614a5957614a548585846402540be400615197565b614a6a565b614a6a85858464028fa6ae00615197565b95945050505050565b6001600160a01b038216614a8657600080fd5b600554614a939082613872565b6005556001600160a01b038216600090815260208190526040902054614ab99082613872565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000816101600151614b255781604001516115b7565b6115b7826151b9565b6000614b39826151d1565b80614b485750614b48826140d7565b611bda57611bd582615230565b604080516003808252608082019092526060916020820183803683370190505090508281600081518110614b8557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110614bc757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110614bf557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b3b63ffffffff161590565b614c2e615684565b600080614c3b8787613a85565b6001600160a01b0387166000908152601b6020526040902054614c5e9087613872565b6001600160a01b0388166000908152601b6020526040902055614c7f61366e565b9050614c8a87615266565b6001600160401b0380871660808601819052838216606087015283880190911660a0860152600161016086015260208501889052600854919350614cd2918891908790614a34565b8352614cdc61528f565b506020830151601054614cfc91670de0b6b3a764000091611eea91614138565b610100840152614d0b84614e50565b15613140576001600160a01b0384166101408401819052610100840151614d32919061547e565b614d4686866001600160401b0316866154e6565b6101208401529450945094915050565b6001600160a01b0381166000908152601360205260408120546115b7908390600160f91b612d6e565b6001600160a01b0316600090815260136020526040902080546001019055565b600082815260196020526040902054614db89082613872565b6000928352601960205260409092209190915550565b6001600160a01b0316600090815260126020526040902080546001019055565b600654614dfb9084613872565b600655600754614e0b9083613872565b60075580156145d457600a546145d09082613872565b600082815260186020526040902054614e3a9082613872565b6000928352601860205260409092209190915550565b6001600160a01b0316151590565b60008184841115614eed5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614eb2578181015183820152602001614e9a565b50505050905090810190601f168015614edf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082828587016127100281614f0757fe5b040195945050505050565b6315dd2ecd9101612710020490565b600f54600160a01b900460ff16151560011415614f5b57600c805463ffffffff19811663ffffffff91821660051901909116179055611bfc565b600f54600160a01b900460ff16611bfc57600c805463ffffffff19811663ffffffff918216600601909116179055611bfc565b6000818311614fa657614fa18284613971565b6138cc565b50600092915050565b60008183614ffe5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614eb2578181015183820152602001614e9a565b50600083858161500a57fe5b0495945050505050565b6001600160a01b03166000908152601460205260409020600101541590565b6000825b828110156149d3576000818152601d60205260409020600101548551670de0b6b3a7640000028161506457fe5b049190910190600101615037565b60006115b782600001516150858461496c565b61508e85614936565b614995565b600954600754600654600854600a54604080519485526020850193909352838301919091526060830152517fea8ce1d041020595d75f4f48ba3378787b84e61d101465836fa54f1b338a4db59181900360800190a2565b60006150f461395f565b6001600160401b031690911015919050565b600061511061395f565b6001600160401b031690911115919050565b600061512d82615517565b611bda57611bd58261553e565b60008061516c8461514a85614e50565b615159576402540be400615160565b64028fa6ae005b64ffffffffff16615593565b905061518c85611eea6305f5e10061518685818d8d613872565b90614138565b979650505050505050565b6000614a6a6402540be400611eea6151af8786615593565b61518689886155dd565b60006151c4826151d1565b611bda57611bd582615072565b6000808260c001516001600160401b03161161520c576151ef61395f565b6001600160401b031682606001516001600160401b0316116115b7565b8160c001516001600160401b031682606001516001600160401b0316119050919050565b60006103e861523e836155f5565b6001615249856149db565b03610320028161525557fe5b046064018360200151028161380757fe5b6001600160a01b0381166000908152601260205260408120546115b7908390600160f81b612d6e565b6040805163d06ca61f60e01b8152670de0b6b3a764000060048201818152602483019384526011805460448501819052600095737a250d5630b4cf539739df2c5dacb4c659f2488d9563d06ca61f9594926064909101908490801561531d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116152ff575b5050935050505060006040518083038186803b15801561533c57600080fd5b505afa9250505080156153fc57506040513d6000823e601f3d908101601f19168201604052602081101561536f57600080fd5b8101908080516040519392919084600160201b82111561538e57600080fd5b9083019060208201858111156153a357600080fd5b82518660208202830111600160201b821117156153bf57600080fd5b82525081516020918201928201910280838360005b838110156153ec5781810151838201526020016153d4565b5050505090500160405250505060015b6154585761540861571a565b80615413575061541d565b505060105461159c565b3d808015615447576040519150601f19603f3d011682016040523d82523d6000602084013e61544c565b606091505b5060105491505061159c565b8060028151811061546557fe5b602002602001015160108190555060105491505061159c565b6001600160a01b0382166000908152601460205260409020546154a19082613872565b6001600160a01b0383166000908152601460205260409020556154c382615122565b6001600160a01b0390921660009081526014602052604090206001019190915550565b60006154f182615014565b806154fd575061016d83105b6142d0576142cb84846006600201546402540be400615197565b6001600160a01b031660009081526014602052604090205469021e19e0c9bab24000001190565b6001600160a01b0381166000908152601460205260408120600101546155745761556661395f565b6001600160401b03166115b7565b506001600160a01b031660009081526014602052604090206001015490565b6000816155c061072185116155a95760006155b0565b6107201985015b660150b9a52b11276134c161562b565b6155d4856630aad4df397abe61072161562b565b01019392505050565b60006138cc82611eea85670de0b6b3a7640000614138565b6000600182608001516001600160401b03161161561357600161561c565b60018260800151035b6001600160401b031692915050565b6000611d656402540be40083861161564c576156478686614138565b611eea565b611eea8486614138565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180610180016040528060008152602001600081526020016000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b60e01c90565b600060443d101561572a5761159c565b600481823e6308c379a061573e8251615714565b146157485761159c565b6040513d600319016004823e80513d6001600160401b038160248401118184111715615777575050505061159c565b82840192508251915080821115615791575050505061159c565b503d830160208284010111156157a95750505061159c565b601f01601f191681016020016040529150509056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212205fc0fbf6b4e80d846430a2c2107e39abab2c58c4d585e46baae4b057c29057f764736f6c63430007060033

Deployed Bytecode

0x6080604052600436106103d15760003560e01c80639e78fb4f116101fd578063c23d656411610118578063df2d02b1116100ab578063e7881cda1161007a578063e7881cda1461132c578063e8a407661461136b578063e8f5babe14611380578063f843d495146113aa578063fc527bf5146113bf576103db565b8063df2d02b1146111d7578063e1d033e91461121f578063e742806a146112de578063e769c3f814611317576103db565b8063d6565a2d116100e7578063d6565a2d1461112a578063d826492014611154578063db74559b14611169578063dd62ed3e1461119c576103db565b8063c23d656414611053578063c31245251461107d578063c74c0fac146110c5578063d1cf9098146110da576103db565b8063b543c4ba11610190578063be21ff701161015f578063be21ff7014610f48578063bf58f6d214610f72578063c172628e14610fbb578063c19f953c1461103e576103db565b8063b543c4ba14610eac578063b5ebdb6c14610ec1578063bba85e1f14610f09578063bbe4fd5014610f33576103db565b8063ae3d1de2116101cc578063ae3d1de214610df1578063afbad29214610e24578063b08dd75214610e39578063b381a81114610e7e576103db565b80639e78fb4f14610cd3578063a4ed055014610ce8578063a9059cbb14610d85578063a91b19f214610dbe576103db565b80634f47b16d116102ed578063779e2e18116102805780638e4647ee1161024f5780638e4647ee14610be957806395d89b4114610c1c57806399c2def414610c315780639b57ab1214610c65576103db565b8063779e2e1814610aac5780638649102b14610aef57806387da627414610b3757806389201d4e14610b4c576103db565b8063613fc9fd116102bc578063613fc9fd1461089d5780636ba631cf146108b257806370a08231146108c7578063763241d3146108fa576103db565b80634f47b16d146107cd5780635540989f146108075780635b2023871461081c57806360e4c6511461086c576103db565b806320429fac1161036557806333060d901161033457806333060d90146106ef5780633b58afe71461072257806342966c681461076e5780634dfc7a031461079a576103db565b806320429fac146105af57806323672d8a146105f257806323b872dd14610681578063313ce567146106c4576103db565b8063095ea7b3116103a1578063095ea7b3146104cf57806318160ddd146105085780631c0b37e11461051d5780631e2ef22d1461057e576103db565b80625ada7f146103e0578063022466b51461040757806302cbb2661461041c57806306fdde0314610445576103db565b366103db57600080fd5b600080fd5b3480156103ec57600080fd5b506103f56114ef565b60408051918252519081900360200190f35b34801561041357600080fd5b506103f56114f5565b34801561042857600080fd5b506104316114fb565b604080519115158252519081900360200190f35b34801561045157600080fd5b5061045a61150b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049457818101518382015260200161047c565b50505050905090810190601f1680156104c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104db57600080fd5b50610431600480360360408110156104f257600080fd5b506001600160a01b03813516906020013561159f565b34801561051457600080fd5b506103f56115bd565b6105526004803603604081101561053357600080fd5b5080356001600160401b031690602001356001600160a01b03166115c3565b604080516001600160801b03199485168152602081019390935292168183015290519081900360600190f35b34801561058a57600080fd5b5061059361180e565b604080516001600160401b039092168252519081900360200190f35b3480156105bb57600080fd5b506103f5600480360360408110156105d257600080fd5b5080356001600160a01b031690602001356001600160801b031916611820565b3480156105fe57600080fd5b506106316004803603606081101561061557600080fd5b506001600160a01b03813516906020810135906040013561183d565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561066d578181015183820152602001610655565b505050509050019250505060405180910390f35b34801561068d57600080fd5b50610431600480360360608110156106a457600080fd5b506001600160a01b038135811691602081013590911690604001356119aa565b3480156106d057600080fd5b506106d9611a19565b6040805160ff9092168252519081900360200190f35b3480156106fb57600080fd5b506103f56004803603602081101561071257600080fd5b50356001600160a01b0316611a22565b34801561072e57600080fd5b506107556004803603602081101561074557600080fd5b50356001600160a01b0316611a34565b6040805192835260208301919091528051918290030190f35b34801561077a57600080fd5b506107986004803603602081101561079157600080fd5b5035611a4d565b005b3480156107a657600080fd5b50610798600480360360208110156107bd57600080fd5b50356001600160a01b0316611a5a565b3480156107d957600080fd5b50610798600480360360408110156107f057600080fd5b506001600160801b03198135169060200135611b3d565b34801561081357600080fd5b50610593611b5c565b34801561082857600080fd5b5061084f6004803603602081101561083f57600080fd5b50356001600160a01b0316611b83565b604080516001600160801b03199092168252519081900360200190f35b34801561087857600080fd5b50610881611be2565b604080516001600160a01b039092168252519081900360200190f35b3480156108a957600080fd5b50610798611bf1565b3480156108be57600080fd5b50610881611bfe565b3480156108d357600080fd5b506103f5600480360360208110156108ea57600080fd5b50356001600160a01b0316611c0d565b34801561090657600080fd5b506107986004803603606081101561091d57600080fd5b810190602081018135600160201b81111561093757600080fd5b82018360208201111561094957600080fd5b803590602001918460208302840111600160201b8311171561096a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156109b957600080fd5b8201836020820111156109cb57600080fd5b803590602001918460208302840111600160201b831117156109ec57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a3b57600080fd5b820183602082011115610a4d57600080fd5b803590602001918460208302840111600160201b83111715610a6e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611c28945050505050565b348015610ab857600080fd5b5061043160048036036040811015610acf57600080fd5b5080356001600160a01b031690602001356001600160801b031916611c89565b348015610afb57600080fd5b50610b1960048036036020811015610b1257600080fd5b5035611d6d565b60408051938452602084019290925282820152519081900360600190f35b348015610b4357600080fd5b50610798611d8e565b348015610b5857600080fd5b50610b8f60048036036040811015610b6f57600080fd5b5080356001600160a01b031690602001356001600160801b031916611f94565b604080516001600160a01b0390991689526001600160801b031990971660208901528787019590955260608701939093529015156080860152151560a0850152151560c0840152151560e083015251908190036101000190f35b348015610bf557600080fd5b506103f560048036036020811015610c0c57600080fd5b50356001600160a01b0316612286565b348015610c2857600080fd5b5061045a612298565b348015610c3d57600080fd5b506103f560048036036020811015610c5457600080fd5b50356001600160801b0319166122f9565b348015610c7157600080fd5b50610ca860048036036040811015610c8857600080fd5b5080356001600160801b03191690602001356001600160401b0316612556565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610cdf57600080fd5b506107986129ea565b348015610cf457600080fd5b50610d2b60048036036040811015610d0b57600080fd5b5080356001600160a01b031690602001356001600160801b031916612aa4565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501521515610120840152151561014083015251908190036101600190f35b348015610d9157600080fd5b5061043160048036036040811015610da857600080fd5b506001600160a01b038135169060200135612bd0565b348015610dca57600080fd5b5061079860048036036020811015610de157600080fd5b50356001600160401b0316612be4565b348015610dfd57600080fd5b5061084f60048036036020811015610e1457600080fd5b50356001600160a01b0316612c3e565b348015610e3057600080fd5b50610798612c90565b348015610e4557600080fd5b5061079860048036036060811015610e5c57600080fd5b506001600160a01b038135811691602081013582169160409091013516612cb9565b348015610e8a57600080fd5b50610e93612d0f565b6040805163ffffffff9092168252519081900360200190f35b348015610eb857600080fd5b50610881612d1b565b348015610ecd57600080fd5b506103f560048036036060811015610ee457600080fd5b5080359060208101356001600160401b031690604001356001600160a01b0316612d2a565b348015610f1557600080fd5b506103f560048036036020811015610f2c57600080fd5b5035612d46565b348015610f3f57600080fd5b506103f5612d58565b348015610f5457600080fd5b506103f560048036036020811015610f6b57600080fd5b5035612d5c565b348015610f7e57600080fd5b5061084f60048036036060811015610f9557600080fd5b5080356001600160a01b031690602081013590604001356001600160f81b031916612d6e565b348015610fc757600080fd5b50610ffe60048036036040811015610fde57600080fd5b5080356001600160a01b031690602001356001600160801b031916612dc9565b604080516001600160a01b0390961686526001600160801b0319909416602086015284840192909252606084015215156080830152519081900360a00190f35b34801561104a57600080fd5b50610881612e15565b34801561105f57600080fd5b506103f56004803603602081101561107657600080fd5b5035612e24565b34801561108957600080fd5b50611092612e36565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156110d157600080fd5b50610881612e4b565b3480156110e657600080fd5b50610552600480360360808110156110fd57600080fd5b506001600160a01b0381358116916020810135916001600160401b03604083013516916060013516612e63565b34801561113657600080fd5b50610b196004803603602081101561114d57600080fd5b503561314a565b34801561116057600080fd5b5061088161316b565b34801561117557600080fd5b506103f56004803603602081101561118c57600080fd5b50356001600160a01b0316613183565b3480156111a857600080fd5b506103f5600480360360408110156111bf57600080fd5b506001600160a01b0381358116916020013516613195565b3480156111e357600080fd5b50610552600480360360608110156111fa57600080fd5b5080359060208101356001600160401b031690604001356001600160a01b03166131c0565b34801561122b57600080fd5b506112626004803603604081101561124257600080fd5b5080356001600160a01b031690602001356001600160801b03191661354f565b604080519c8d5260208d019b909b528b8b01999099526001600160401b0397881660608c015295871660808b015293861660a08a01529190941660c088015260e08701939093526101008601929092526101208501919091526001600160a01b0316610140840152151561016083015251908190036101800190f35b3480156112ea57600080fd5b506107986004803603604081101561130157600080fd5b506001600160a01b0381351690602001356135db565b34801561132357600080fd5b5061059361366e565b34801561133857600080fd5b506106316004803603606081101561134f57600080fd5b506001600160a01b038135169060208101359060400135613680565b34801561137757600080fd5b506108816137ea565b34801561138c57600080fd5b50610593600480360360208110156113a357600080fd5b50356137f9565b3480156113b657600080fd5b5061088161380e565b3480156113cb57600080fd5b50610798600480360360408110156113e257600080fd5b810190602081018135600160201b8111156113fc57600080fd5b82018360208201111561140e57600080fd5b803590602001918460208302840111600160201b8311171561142f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561147e57600080fd5b82018360208201111561149057600080fd5b803590602001918460208302840111600160201b831117156114b157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061381d945050505050565b60105481565b600d5481565b600f54600160a01b900460ff1681565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156115945780601f1061156957610100808354040283529160200191611594565b820191906000526020600020905b81548152906001019060200180831161157757829003601f168201915b505050505090505b90565b60006115b36115ac6138d3565b84846138d7565b5060015b92915050565b60055490565b60408051600280825260608201835260009283928392839260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061160c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061163a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab53460018533426040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156116ef5781810151838201526020016116d7565b50505050905001955050505050506000604051808303818588803b15801561171657600080fd5b505af115801561172a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561175457600080fd5b8101908080516040519392919084600160201b82111561177357600080fd5b90830190602082018581111561178857600080fd5b82518660208202830111600160201b821117156117a457600080fd5b82525081516020918201928201910280838360005b838110156117d15781810151838201526020016117b9565b5050505090500160405250505090506117ff816001815181106117f057fe5b602002602001015188886131c0565b94509450945050509250925092565b6000600161181a61395f565b03905090565b601560209081526000928352604080842090915290825290205481565b60606000808411801561186757506001600160a01b03851660009081526012602052604090205484105b611889576001600160a01b0385166000908152601260205260409020546118a6565b6001600160a01b0385166000908152601260205260409020548490035b9050600080841180156118b857508382115b6118c35760006118c7565b8382035b905060008183036001600160401b03811180156118e357600080fd5b5060405190808252806020026020018201604052801561190d578160200160208202803683370190505b509350825b8281111561199f57600061192f896000198401600160f81b612d6e565b6001600160a01b038a1660009081526016602090815260408083206001600160801b03198516845290915290206001015490915015611995578086848151811061197557fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901611912565b505050509392505050565b6000611a04846119b86138d3565b6001600160a01b03871660009081526001602052604081206119ff918791906119df6138d3565b6001600160a01b0316815260208101919091526040016000205490613971565b6138d7565b611a0f8484846139b3565b5060019392505050565b60045460ff1690565b60126020526000908152604090205481565b6014602052600090815260409020805460019091015482565b611a573382613a85565b50565b601e546001600160a01b0316331480611a7d5750601f546001600160a01b031633145b80611a9257506020546001600160a01b031633145b611ae3576040805162461bcd60e51b815260206004820152601b60248201527f53574150503a20496e76616c696420746f6b656e206d696e7465720000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260146020526040902069021e19e0c9bab24000009055611b1061366e565b6001600160a01b0390911660009081526014602052604090206001600160401b0391909116600190910155565b611b4d611b4861395f565b613b29565b611b58338383613d59565b5050565b6000600d54611b69612d58565b1015611b76576000611b7e565b611b7e61395f565b905090565b6001600160a01b03811660009081526013602052604081205415611bda576001600160a01b038216600090815260136020526040902054611bd5908390611bcb906001613971565b600160f91b612d6e565b6115b7565b600092915050565b601e546001600160a01b031681565b611bfc611b4861395f565b565b600f546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b60005b8351811015611c8357611c78848281518110611c4357fe5b6020026020010151848381518110611c5757fe5b6020026020010151848481518110611c6b57fe5b60200260200101516131c0565b505050600101611c2b565b50505050565b6001600160a01b0382811660009081526016602090815260408083206001600160801b03198616845282528083208151610180810183528154815260018201549381019390935260028101549183019190915260038101546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600481015460e08301526005810154610100830152600681015461012083015260070154928316610140820152600160a01b90920460ff16151561016083015290611d65816140d7565b949350505050565b601d6020526000908152604090208054600182015460029092015490919083565b600080600f60009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611ddf57600080fd5b505afa158015611df3573d6000803e3d6000fd5b505050506040513d6060811015611e0957600080fd5b508051602091820151600f546040805163d21220a760e01b8152905193965091945060009373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2936001600160a01b039092169263d21220a79260048083019392829003018186803b158015611e7157600080fd5b505afa158015611e85573d6000803e3d6000fd5b505050506040513d6020811015611e9b57600080fd5b50516001600160a01b031614611eb15781611eb3565b825b6dffffffffffffffffffffffffffff1690506000611ecf6115bd565b15611ef557611ef0611edf6115bd565b611eea8460c8614138565b90614191565b611ef8565b60005b9050602881108015611f145750600f54600160a01b900460ff16155b15611f2157611f216141d3565b603c81118015611f3f5750600f54600160a01b900460ff1615156001145b15611f4c57611f4c6141e8565b600f5460408051600160a01b90920460ff1615158252517fbbf65e071e5468fb599b01ba3b914ae6065cf10ad084e0efe2133f7eaa8979bd916020908290030190a150505050565b6000806000806000806000806000601760008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b03191681526020019081526020016000206040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a900460801b6001600160801b0319166001600160801b031916815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060000151985080602001519750806080015194506000601660008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008a6001600160801b0319166001600160801b0319168152602001908152602001600020604051806101800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016007820160149054906101000a900460ff161515151581525050905080610120015197506122578161224983856141f7565b6122528461427c565b6142ac565b9650806101600151945061226a816142da565b9250612275816140d7565b935050509295985092959890939650565b601b6020526000908152604090205481565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115945780601f1061156957610100808354040283529160200191611594565b6000612306611b4861395f565b60008061231333856142f3565b6040805161018081018252835480825260018501546020830181905260028601549383019390935260038501546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600485015460e08301526005850154610100830152600685015461012083018190526007909501546001600160a01b038116610140840152600160a01b900460ff1615156101608301529095509193506123d69290919061457f565b6123f18260a001516001600160401b031683600001516145dc565b61240d8260a001516001600160401b031683610120015161468f565b61242f82610140015183610100015184606001516001600160401b0316614742565b61243d8260c00151826147e7565b6124aa8183602001511161245257600061245a565b818360200151035b3360009081526015602090815260408083206001600160801b03198a16845290915290819020549085015161014086015160808701518751929093019290916001600160401b039091169061482d565b8161014001516001600160a01b0316336001600160a01b0316856001600160801b0319167f8cc66e48ebd8c008b36e03ee2f7c3f60a313a34a5bf1f3cb988a7936cd47f0d48560200151866000015187610120015188604001518960c001518960405180878152602001868152602001858152602001848152602001836001600160401b03168152602001828152602001965050505050505060405180910390a4506040015192915050565b6000806000806000612569611b4861395f565b3360009081526016602090815260408083206001600160801b03198b168452909152902060070154600160a01b900460ff166125a457600080fd5b3360009081526016602090815260408083206001600160801b03198b1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c0830152600483015460e0830152600583015461010083015260068301546101208301526007909201546001600160a01b038116610140830152600160a01b900460ff16151561016082015290871661268b5761268681614936565b6126a7565b6126a7876001600160401b03166126a18361496c565b90613872565b95508060a001516001600160401b031686116126c357856126cc565b6126cc81614936565b95506126e581600001516126df8361496c565b88614995565b94506126f0816140d7565b6127bf576126fd816149db565b9350612710858533600660020154614a34565b815190935061271f9084613971565b815260a0810151612739906001600160401b0316846145dc565b610120810151156127875761275685856000600660020154614a34565b6101208201519092506127699083613971565b61012082015260a0810151612787906001600160401b03168361468f565b6127936000848461457f565b6127ba81602001518683610140015184608001516001600160401b0316856000015161482d565b61283a565b3360009081526015602090815260408083206001600160801b03198c1684529091529020546127ee9086613872565b3360009081526015602090815260408083206001600160801b03198d16845282529091208290558201516101408301516080840151845161283a9492916001600160401b03169061482d565b60e081018681523360008181526016602090815260408083206001600160801b03198e168452825291829020855181559085015160018201559084015160028201556060840151600382018054608087015160a088015160c089015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b93909116929092029190911790559151600483015561010083015160058301556101208301516006830155610140830151600790920180546101608501516001600160a01b03199091166001600160a01b039094169390931760ff60a01b1916600160a01b93151593909302929092179091556129739086614a73565b336001600160801b031989167f7b5d0995432c9ea1c8033b358af591013d0deff8dec5f4ae49612eba8bfafc0c878987876129ac61395f565b6040805195865260208601949094528484019290925260608401526001600160401b03166080830152519081900360a00190a3509295509295909350565b604080516364e329cb60e11b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201523060248201529051735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163c9c653969160448083019260209291908290030181600087803b158015612a5757600080fd5b505af1158015612a6b573d6000803e3d6000fd5b505050506040513d6020811015612a8157600080fd5b5051600f80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0382811660009081526016602090815260408083206001600160801b03198616845282528083208151610180810183528154808252600183015494820185905260028301549382019390935260038201546001600160401b0380821660608401819052600160401b8304821660808501819052600160801b8404831660a08601819052600160c01b90940490921660c08501819052600486015460e0860181905260058701546101008701526006870154610120870152600790960154998a16610140860152600160a01b90990460ff161515610160850152979096919590949092909190819081908190612b9f81614b0f565b9450612baa81614b2e565b93508061016001519250612bbd816140d7565b9150509295989b509295989b9093969950565b60006115b3612bdd6138d3565b84846139b3565b6000816001600160401b0316118015612c155750612c0061395f565b6001600160401b0316816001600160401b0316105b612c1e57600080fd5b6009546001600160401b03821611612c3557600080fd5b611a5781613b29565b6001600160a01b03811660009081526012602052604081205415611bda576001600160a01b038216600090815260126020526040902054611bd5908390612c86906001613971565b600160f81b612d6e565b6021546001600160a01b03163314612ca757600080fd5b602180546001600160a01b0319169055565b6021546001600160a01b03163314612cd057600080fd5b601e80546001600160a01b039485166001600160a01b031991821617909155601f80549385169382169390931790925560208054919093169116179055565b600c5463ffffffff1681565b600e546001600160a01b031681565b6000611d6584846001600160401b031684600660020154614a34565b601a6020526000908152604090205481565b4290565b60196020526000908152604090205481565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152603482018590526001600160f81b0319841660548301528251603581840301815260559092019092528051910120600090611d659061159c565b6017602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401546001600160a01b039093169360809290921b9290919060ff1685565b6021546001600160a01b031681565b60186020526000908152604090205481565b600654600754600854600954600a54600b5486565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516000918291829188916001600160a01b038316916323b872dd91606480830192602092919082900301818887803b158015612ec057600080fd5b505af1158015612ed4573d6000803e3d6000fd5b505050506040513d6020811015612eea57600080fd5b50506040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810189905290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b158015612f4f57600080fd5b505af1158015612f63573d6000803e3d6000fd5b505050506040513d6020811015612f7957600080fd5b5060009050612f888930614b55565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398a60018533426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561302557818101518382015260200161300d565b505050509050019650505050505050600060405180830381600087803b15801561304e57600080fd5b505af1158015613062573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561308b57600080fd5b8101908080516040519392919084600160201b8211156130aa57600080fd5b9083019060208201858111156130bf57600080fd5b82518660208202830111600160201b821117156130db57600080fd5b82525081516020918201928201910280838360005b838110156131085781810151838201526020016130f0565b5050505090500160405250505090506131368160028151811061312757fe5b602002602001015189896131c0565b9550955095505050505b9450945094915050565b601c6020526000908152604090208054600182015460029092015490919083565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60136020526000908152604090205481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60008080336001600160a01b038516148015906131e157506131e184614c1b565b6131ea57600080fd5b60016001600160401b0386161080159061320f5750613be26001600160401b03861611155b61321857600080fd5b620f424086101561322857600080fd5b6000806000613239338a8a8a614c26565b6001600160401b0316925092509250600083610120015111156133305761325e615656565b3381526001600160801b0319831660208201526001608082015261328188614d56565b6001600160a01b0389811660009081526017602090815260408083206001600160801b0319868116855290835292819020865181546001600160a01b031916951694909417845590850151600184018054909316608091821c179092558401516002830155606084015160038301558301516004909101805460ff1916911515919091179055945061331288614d7f565b61332e8460a001516001600160401b0316856101200151614d9f565b505b3360008181526016602090815260408083206001600160801b031987168452825291829020865181559086015160018201559085015160028201556060850151600382018054608088015160a089015160c08a015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b939091169290920291909117905560e0850151600482015561010085015160058201556101208501516006820155610140850151600790910180546101608701516001600160a01b03199091166001600160a01b039093169290921760ff60a01b1916600160a01b9215159290920291909117905561346390614dce565b61347b83602001518460000151856101200151614dee565b6134968360a001516001600160401b03168460000151614e21565b866001600160a01b0316336001600160a01b0316836001600160801b0319167f6619c8f19b39bf3558af16516f9ca110fcac4a7ab6d846d1b02a17b11f703a338660200151876000015188610120015189606001518a608001518b610100015160405180878152602001868152602001858152602001846001600160401b03168152602001836001600160401b03168152602001828152602001965050505050505060405180910390a490945092505093509350939050565b6016602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007909701549596949593946001600160401b0380851695600160401b8604821695600160801b8104831695600160c01b909104909216939192906001600160a01b03811690600160a01b900460ff168c565b601e546001600160a01b03163314806135fe5750601f546001600160a01b031633145b8061361357506020546001600160a01b031633145b613664576040805162461bcd60e51b815260206004820152601b60248201527f53574150503a20496e76616c696420746f6b656e206d696e7465720000000000604482015290519081900360640190fd5b611b588282614a73565b600061367861395f565b600101905090565b6060600080841180156136aa57506001600160a01b03851660009081526013602052604090205484105b6136cc576001600160a01b0385166000908152601360205260409020546136e9565b6001600160a01b0385166000908152601360205260409020548490035b9050600080841180156136fb57508382115b61370657600061370a565b8382035b905060008183036001600160401b038111801561372657600080fd5b50604051908082528060200260200182016040528015613750578160200160208202803683370190505b509350825b8281111561199f576000613772896000198401600160f91b612d6e565b6001600160a01b03808b1660009081526017602090815260408083206001600160801b0319861684529091529020549192506137ae9116614e50565b156137e057808684815181106137c057fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901613755565b601f546001600160a01b031681565b600d54600090620151809083035b0492915050565b6020546001600160a01b031681565b613828611b4861395f565b60005b825181101561386d576138653384838151811061384457fe5b602002602001015184848151811061385857fe5b6020026020010151613d59565b60010161382b565b505050565b6000828201838110156138cc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166138ea57600080fd5b6001600160a01b0382166138fd57600080fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000611b7e61396c612d58565b6137f9565b60006138cc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614e5e565b6001600160a01b0383166139c657600080fd5b6001600160a01b0382166139d957600080fd5b6001600160a01b0383166000908152602081905260409020546139fc9082613971565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613a2b9082613872565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b038216613a9857600080fd5b6001600160a01b038216600090815260208190526040902054613abb9082613971565b6001600160a01b038316600090815260208190526040902055600554613ae19082613971565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b613b31611d8e565b600654600954600091905b836001600160401b0316811015611c835760001981016000908152601c602081815260408084206002015485855260188352818520549383529381902081516060810183528154815260019091015492810192909252919092019082018190526007549094508410613baf576000613bb6565b6007548490035b8152613c6e613c5a84613bc76115bd565b6000868152601a602090815260409182902054600e54600c5484516330550a4b60e01b815263ffffffff9091166004820152935191936001600160a01b03909116926330550a4b92602480840193829003018186803b158015613c2957600080fd5b505afa158015613c3d573d6000803e3d6000fd5b505050506040513d6020811015613c5357600080fd5b5051614ef5565b8251611eea90670de0b6b3a7640000614138565b60208083019182526000848152601c825260408082208551815593516001808601919091558186015160029586015560001987018352601d80855282842090950154878452601985528284205495855292829020825160608101845281548152910154938101939093529201918101829052600a54919550908510613cf4576000613cfb565b600a548590035b8152613d11613c5a85613d0c6115bd565b614f12565b60208083019182526000858152601d9091526040908190208351815591516001830155820151600290910155613d45614f21565b505060098054600190810190915501613b3c565b6001600160a01b0380841660009081526017602090815260408083206001600160801b0319808816855290835292819020815160a08101835281549095168552600180820154608090811b90951693860193909352600281015491850191909152600381015460608501526004015460ff16151591830182905214613ddd57600080fd5b80516020808301516001600160a01b0380841660009081526016845260408082206001600160801b03198516835285528082208151610180810183528154815260018201549681019690965260028101549186019190915260038101546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b9091041660c0860152600481015460e08601526005810154610100860152600681015461012086015260070154918216610140850152600160a01b90910460ff161515610160840152909190613ec182866141f7565b90506000613ece8361427c565b9050613ed9836142da565b15613f2d57600087118015613ef65750613ef38282614f8e565b87105b15613f20576060860151613f0a9088613872565b6060870152613f198288613872565b9050613f28565b600060808701525b613f6b565b613f4782613f3961395f565b6001600160401b0316614f8e565b6060870151909750613f599088613872565b6060870152613f688288613872565b90505b6000613f788484846142ac565b6040880151909150613f8a9082613872565b87604001818152505086601760008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b031916815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b03021916908360801c0217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506140738a82614a73565b604080516001600160801b03198b811682526020820184905282516001600160a01b03808f1694928a1693908b16927f5d13067bdc9e4d510839580df1e932220b31fb2bc7790b5bd35aae14f0303bed92918290030190a450505050505050505050565b6000808260c001516001600160401b031611614113576140f561395f565b6001600160401b03168260a001516001600160401b031611156115b7565b8160c001516001600160401b03168260a001516001600160401b031611159050919050565b600082614147575060006115b7565b8282028284828161415457fe5b04146138cc5760405162461bcd60e51b81526004018080602001828103825260218152602001806157bf6021913960400191505060405180910390fd5b60006138cc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614faf565b600f805460ff60a01b1916600160a01b179055565b600f805460ff60a01b19169055565b60006138cc826060015184606001516001600160401b0316601460008761014001516001600160a01b03166001600160a01b0316815260200190815260200160002060010154116142555784606001516001600160401b03166126a1565b6101408501516001600160a01b031660009081526014602052604090206001015490613872565b6000808260c001516001600160401b03161161429b57611bd582614936565b5060c001516001600160401b031690565b60006142bc846101400151615014565b6142d0576142cb848484615033565b611d65565b5060009392505050565b61016081015160009015806115b757506115b7826140d7565b6001600160a01b03821660009081526016602090815260408083206001600160801b0319851684529091528120600701548190600160a01b900460ff1661433957600080fd5b6001600160a01b03841660009081526016602090815260408083206001600160801b0319871684529091529020915061437061395f565b6003830180546001600160c01b0316600160c01b6001600160401b0393841681029190911791829055604080516101808101825286548152600187015460208201526002870154918101919091528284166060820152600160401b830484166080820152600160801b8304841660a0820152910490911660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff16151561016082015261443c90615072565b60028301819055604080516101808101825284548152600185015460208201529081019190915260038301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526144f290614b2e565b60078301805460ff60a01b1916905560018301546001600160a01b0386166000908152601b602052604090205491925061452c9190613971565b6001600160a01b0385166000908152601b6020526040902055600182015461456a908590831061455d576000614565565b828460010154035b614a73565b614578848360020154614a73565b9250929050565b600654831061458f576000614596565b6006548390035b60065560075482106145a95760006145b0565b6007548290035b60075580156145d457600a5481106145c95760006145d0565b600a548190035b600a555b61386d615093565b6145e5826150ea565b1561462d576000828152601860205260409020548110614606576000614619565b6000828152601860205260409020548190035b600083815260186020526040902055611b58565b600061463761180e565b6001600160401b03166000818152601c60205260409020600201549091508210614662576000614678565b6000818152601c60205260409020600201548290035b6000918252601c6020526040909120600201555050565b614698826150ea565b156146e05760008281526019602052604090205481106146b95760006146cc565b6000828152601960205260409020548190035b600083815260196020526040902055611b58565b60006146ea61180e565b6001600160401b03166000818152601d6020526040902060020154909150821061471557600061472b565b6000818152601d60205260409020600201548290035b6000918252601d6020526040909120600201555050565b61474b81615106565b15801561475c575061475c83614e50565b1561386d576001600160a01b03831660009081526014602052604090205482106147875760006147a4565b6001600160a01b0383166000908152601460205260409020548290035b6001600160a01b0384166000908152601460205260409020556147c683615122565b6001600160a01b038416600090815260146020526040902060010155505050565b8015611b58576001600160401b0382166000908152601a60205260409020546148109082613872565b6001600160401b0383166000908152601a60205260409020555050565b60008111801561484d5750604161484261395f565b6001600160401b0316115b15614909576000614861868684868861513a565b6008549091508111156149035760085461488390606490611eea90606e614138565b81106148a35760085461489e90606490611eea90606e614138565b6148a5565b805b90507fb52ab4a425c20017539fcd851fc4ddbb50d17546576353cd51a2d483d80a45b8816006600201546148d761395f565b6040805193845260208401929092526001600160401b031682820152519081900360600190a160088190555b5061492f565b604161491361395f565b6001600160401b0316141561492f57670186cc6acd4b00006008555b5050505050565b60006006600301548260a001516001600160401b031611614964578160a001516001600160401b03166115b7565b505060095490565b60008160e00151600014614984578160e001516115b7565b50606001516001600160401b031690565b6000825b828110156149d3576000818152601c6020526040902060010154670de0b6b3a76400008602816149c557fe5b049190910190600101614999565b509392505050565b61016081015160009015614a1057611bd56149f461395f565b6001600160401b03168360a001516001600160401b0316614f8e565b6115b78260c001516001600160401b03168360a001516001600160401b0316614f8e565b6000614a3f83614e50565b614a5957614a548585846402540be400615197565b614a6a565b614a6a85858464028fa6ae00615197565b95945050505050565b6001600160a01b038216614a8657600080fd5b600554614a939082613872565b6005556001600160a01b038216600090815260208190526040902054614ab99082613872565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000816101600151614b255781604001516115b7565b6115b7826151b9565b6000614b39826151d1565b80614b485750614b48826140d7565b611bda57611bd582615230565b604080516003808252608082019092526060916020820183803683370190505090508281600081518110614b8557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110614bc757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110614bf557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b3b63ffffffff161590565b614c2e615684565b600080614c3b8787613a85565b6001600160a01b0387166000908152601b6020526040902054614c5e9087613872565b6001600160a01b0388166000908152601b6020526040902055614c7f61366e565b9050614c8a87615266565b6001600160401b0380871660808601819052838216606087015283880190911660a0860152600161016086015260208501889052600854919350614cd2918891908790614a34565b8352614cdc61528f565b506020830151601054614cfc91670de0b6b3a764000091611eea91614138565b610100840152614d0b84614e50565b15613140576001600160a01b0384166101408401819052610100840151614d32919061547e565b614d4686866001600160401b0316866154e6565b6101208401529450945094915050565b6001600160a01b0381166000908152601360205260408120546115b7908390600160f91b612d6e565b6001600160a01b0316600090815260136020526040902080546001019055565b600082815260196020526040902054614db89082613872565b6000928352601960205260409092209190915550565b6001600160a01b0316600090815260126020526040902080546001019055565b600654614dfb9084613872565b600655600754614e0b9083613872565b60075580156145d457600a546145d09082613872565b600082815260186020526040902054614e3a9082613872565b6000928352601860205260409092209190915550565b6001600160a01b0316151590565b60008184841115614eed5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614eb2578181015183820152602001614e9a565b50505050905090810190601f168015614edf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082828587016127100281614f0757fe5b040195945050505050565b6315dd2ecd9101612710020490565b600f54600160a01b900460ff16151560011415614f5b57600c805463ffffffff19811663ffffffff91821660051901909116179055611bfc565b600f54600160a01b900460ff16611bfc57600c805463ffffffff19811663ffffffff918216600601909116179055611bfc565b6000818311614fa657614fa18284613971565b6138cc565b50600092915050565b60008183614ffe5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614eb2578181015183820152602001614e9a565b50600083858161500a57fe5b0495945050505050565b6001600160a01b03166000908152601460205260409020600101541590565b6000825b828110156149d3576000818152601d60205260409020600101548551670de0b6b3a7640000028161506457fe5b049190910190600101615037565b60006115b782600001516150858461496c565b61508e85614936565b614995565b600954600754600654600854600a54604080519485526020850193909352838301919091526060830152517fea8ce1d041020595d75f4f48ba3378787b84e61d101465836fa54f1b338a4db59181900360800190a2565b60006150f461395f565b6001600160401b031690911015919050565b600061511061395f565b6001600160401b031690911115919050565b600061512d82615517565b611bda57611bd58261553e565b60008061516c8461514a85614e50565b615159576402540be400615160565b64028fa6ae005b64ffffffffff16615593565b905061518c85611eea6305f5e10061518685818d8d613872565b90614138565b979650505050505050565b6000614a6a6402540be400611eea6151af8786615593565b61518689886155dd565b60006151c4826151d1565b611bda57611bd582615072565b6000808260c001516001600160401b03161161520c576151ef61395f565b6001600160401b031682606001516001600160401b0316116115b7565b8160c001516001600160401b031682606001516001600160401b0316119050919050565b60006103e861523e836155f5565b6001615249856149db565b03610320028161525557fe5b046064018360200151028161380757fe5b6001600160a01b0381166000908152601260205260408120546115b7908390600160f81b612d6e565b6040805163d06ca61f60e01b8152670de0b6b3a764000060048201818152602483019384526011805460448501819052600095737a250d5630b4cf539739df2c5dacb4c659f2488d9563d06ca61f9594926064909101908490801561531d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116152ff575b5050935050505060006040518083038186803b15801561533c57600080fd5b505afa9250505080156153fc57506040513d6000823e601f3d908101601f19168201604052602081101561536f57600080fd5b8101908080516040519392919084600160201b82111561538e57600080fd5b9083019060208201858111156153a357600080fd5b82518660208202830111600160201b821117156153bf57600080fd5b82525081516020918201928201910280838360005b838110156153ec5781810151838201526020016153d4565b5050505090500160405250505060015b6154585761540861571a565b80615413575061541d565b505060105461159c565b3d808015615447576040519150601f19603f3d011682016040523d82523d6000602084013e61544c565b606091505b5060105491505061159c565b8060028151811061546557fe5b602002602001015160108190555060105491505061159c565b6001600160a01b0382166000908152601460205260409020546154a19082613872565b6001600160a01b0383166000908152601460205260409020556154c382615122565b6001600160a01b0390921660009081526014602052604090206001019190915550565b60006154f182615014565b806154fd575061016d83105b6142d0576142cb84846006600201546402540be400615197565b6001600160a01b031660009081526014602052604090205469021e19e0c9bab24000001190565b6001600160a01b0381166000908152601460205260408120600101546155745761556661395f565b6001600160401b03166115b7565b506001600160a01b031660009081526014602052604090206001015490565b6000816155c061072185116155a95760006155b0565b6107201985015b660150b9a52b11276134c161562b565b6155d4856630aad4df397abe61072161562b565b01019392505050565b60006138cc82611eea85670de0b6b3a7640000614138565b6000600182608001516001600160401b03161161561357600161561c565b60018260800151035b6001600160401b031692915050565b6000611d656402540be40083861161564c576156478686614138565b611eea565b611eea8486614138565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180610180016040528060008152602001600081526020016000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b60e01c90565b600060443d101561572a5761159c565b600481823e6308c379a061573e8251615714565b146157485761159c565b6040513d600319016004823e80513d6001600160401b038160248401118184111715615777575050505061159c565b82840192508251915080821115615791575050505061159c565b503d830160208284010111156157a95750505061159c565b601f01601f191681016020016040529150509056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212205fc0fbf6b4e80d846430a2c2107e39abab2c58c4d585e46baae4b057c29057f764736f6c63430007060033

Deployed Bytecode Sourcemap

52060:4982:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53534:8;;;52060:4982;;;;13305:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;12641:26;;;;;;;;;;;;;:::i;13262:34::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2740:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4022:154;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4022:154:0;;;;;;;;:::i;3217:91::-;;;;;;;;;;;;;:::i;55253:532::-;;;;;;;;;;;;;;;;-1:-1:-1;55253:532:0;;-1:-1:-1;;;;;55253:532:0;;;;;-1:-1:-1;;;;;55253:532:0;;:::i;:::-;;;;-1:-1:-1;;;;;;55253:532:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15395:105;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;15395:105:0;;;;;;;;;;;;;;14493:62;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14493:62:0;;-1:-1:-1;;;;;14493:62:0;;;;;-1:-1:-1;;;;;;14493:62:0;;:::i;16573:795::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16573:795:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4312:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4312:262:0;;;;;;;;;;;;;;;;;:::i;3056:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14325:45;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14325:45:0;-1:-1:-1;;;;;14325:45:0;;:::i;14434:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14434:52:0;-1:-1:-1;;;;;14434:52:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5947:83;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5947:83:0;;:::i;:::-;;54739:196;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54739:196:0;-1:-1:-1;;;;;54739:196:0;;:::i;30456:242::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;30456:242:0;;;;;;;;:::i;15028:130::-;;;;;;;;;;;;;:::i;18397:208::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18397:208:0;-1:-1:-1;;;;;18397:208:0;;:::i;:::-;;;;-1:-1:-1;;;;;;18397:208:0;;;;;;;;;;;;;;52103:36;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;52103:36:0;;;;;;;;;;;;;;23685:98;;;;;;;;;;;;;:::i;13221:34::-;;;;;;;;;;;;;:::i;3394:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3394:110:0;-1:-1:-1;;;;;3394:110:0;;:::i;35338:307::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35338:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35338:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35338:307:0;;;;;;;;-1:-1:-1;35338:307:0;;-1:-1:-1;;;;;35338:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35338:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35338:307:0;;;;;;;;-1:-1:-1;35338:307:0;;-1:-1:-1;;;;;35338:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35338:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35338:307:0;;-1:-1:-1;35338:307:0;;-1:-1:-1;;;;;35338:307:0:i;47124:232::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47124:232:0;;-1:-1:-1;;;;;47124:232:0;;;;;-1:-1:-1;;;;;;47124:232:0;;:::i;22385:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22385:47:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;22703:657;;;;;;;;;;;;;:::i;32779:963::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32779:963:0;;-1:-1:-1;;;;;32779:963:0;;;;;-1:-1:-1;;;;;;32779:963:0;;:::i;:::-;;;;-1:-1:-1;;;;;32779:963:0;;;;;-1:-1:-1;;;;;;32779:963:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14885:51;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14885:51:0;-1:-1:-1;;;;;14885:51:0;;:::i;2895:87::-;;;;;;;;;;;;;:::i;39683:1459::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39683:1459:0;-1:-1:-1;;;;;;39683:1459:0;;:::i;42093:2703::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42093:2703:0;;-1:-1:-1;;;;;;42093:2703:0;;;;;-1:-1:-1;;;;;42093:2703:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13491:184;;;;;;;;;;;;;:::i;47364:982::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47364:982:0;;-1:-1:-1;;;;;47364:982:0;;;;;-1:-1:-1;;;;;;47364:982:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3512:161;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3512:161:0;;;;;;;;:::i;23968:239::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23968:239:0;-1:-1:-1;;;;;23968:239:0;;:::i;18198:191::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18198:191:0;-1:-1:-1;;;;;18198:191:0;;:::i;53892:142::-;;;;;;;;;;;;;:::i;53558:326::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53558:326:0;;;;;;;;;;;;;;;;;;;:::i;12242:37::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13096:116;;;;;;;;;;;;;:::i;37649:323::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37649:323:0;;;;;;;-1:-1:-1;;;;;37649:323:0;;;;;-1:-1:-1;;;;;37649:323:0;;:::i;14827:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14827:49:0;;:::i;15669:89::-;;;;;;;;;;;;;:::i;14766:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14766:54:0;;:::i;16063:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16063:163:0;;-1:-1:-1;;;;;16063:163:0;;;;;;;;;;-1:-1:-1;;;;;;16063:163:0;;:::i;14628:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14628:73:0;;-1:-1:-1;;;;;14628:73:0;;;;;-1:-1:-1;;;;;;14628:73:0;;:::i;:::-;;;;-1:-1:-1;;;;;14628:73:0;;;;;-1:-1:-1;;;;;;14628:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52220:33;;;;;;;;;;;;;:::i;14710:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14710:49:0;;:::i;9059:22::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12958:129;;;;;;;;;;;;;:::i;56271:768::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56271:768:0;;;;;;;;;;-1:-1:-1;;;;;56271:768:0;;;;;;;;;;;:::i;22333:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22333:45:0;;:::i;12823:126::-;;;;;;;;;;;;;:::i;14377:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14377:48:0;-1:-1:-1;;;;;14377:48:0;;:::i;3805:134::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3805:134:0;;;;;;;;;;:::i;35887:1754::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35887:1754:0;;;;;;;-1:-1:-1;;;;;35887:1754:0;;;;;-1:-1:-1;;;;;35887:1754:0;;:::i;14562:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14562:59:0;;-1:-1:-1;;;;;14562:59:0;;;;;-1:-1:-1;;;;;;14562:59:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14562:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14562:59:0;;;;;;;;;;;;;;;;;;;;54384:134;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54384:134:0;;;;;;;;:::i;15286:101::-;;;;;;;;;;;;;:::i;17376:814::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17376:814:0;;;;;;;;;;;;;:::i;52146:32::-;;;;;;;;;;;;;:::i;15508:153::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15508:153:0;;:::i;52185:28::-;;;;;;;;;;;;;:::i;30706:363::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30706:363:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30706:363:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30706:363:0;;;;;;;;-1:-1:-1;30706:363:0;;-1:-1:-1;;;;;30706:363:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30706:363:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30706:363:0;;-1:-1:-1;30706:363:0;;-1:-1:-1;;;;;30706:363:0:i;13305:34::-;;;;:::o;12641:26::-;;;;:::o;13262:34::-;;;-1:-1:-1;;;13262:34:0;;;;;:::o;2740:83::-;2810:5;2803:12;;;;;;;-1:-1:-1;;2803:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2777:13;;2803:12;;2810:5;;2803:12;;2810:5;2803:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2740:83;;:::o;4022:154::-;4088:4;4105:39;4114:12;:10;:12::i;:::-;4128:7;4137:6;4105:8;:39::i;:::-;-1:-1:-1;4164:4:0;4022:154;;;;;:::o;3217:91::-;3288:12;;3217:91;:::o;55253:532::-;55442:16;;;55456:1;55442:16;;;;;;;;55369:7;;;;;;;;55442:16;;;;;;;;;;-1:-1:-1;55442:16:0;55418:40;;12772:42;55469:4;55474:1;55469:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;55469:14:0;;;-1:-1:-1;;;;;55469:14:0;;;;;55512:4;55494;55499:1;55494:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;55494:23:0;;;-1:-1:-1;;;;;55494:23:0;;;;;55530:24;12900:42;-1:-1:-1;;;;;55557:36:0;;55601:9;55626:1;55642:4;55661:10;55686:15;55557:155;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55557:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55557:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55557:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55557:155:0;;;;;;;;;;;;-1:-1:-1;55557:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55530:182;;55732:45;55744:7;55752:1;55744:10;;;;;;;;;;;;;;55756:9;55767;55732:11;:45::i;:::-;55725:52;;;;;;;;55253:532;;;;;:::o;15395:105::-;15444:6;15491:1;15470:18;:16;:18::i;:::-;:22;15463:29;;15395:105;:::o;14493:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;16573:795::-;16707:24;16744:13;16770:1;16760:7;:11;:57;;;;-1:-1:-1;;;;;;16788:19:0;;;;;;:10;:19;;;;;;:29;-1:-1:-1;16760:57:0;:124;;-1:-1:-1;;;;;16865:19:0;;;;;;:10;:19;;;;;;16760:124;;;-1:-1:-1;;;;;16833:19:0;;;;;;:10;:19;;;;;;:29;;;16760:124;16744:140;;16897:14;16924:1;16914:7;:11;:43;;;;;16950:7;16942:5;:15;16914:43;:78;;16991:1;16914:78;;;16981:7;16973:5;:15;16914:78;16897:95;;17005:9;17059:6;17051:5;:14;-1:-1:-1;;;;;17037:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17037:29:0;-1:-1:-1;17027:39:0;-1:-1:-1;17106:5:0;17079:282;17127:6;17113:11;:20;17079:282;;;17165:16;17184:42;17195:7;-1:-1:-1;;17204:15:0;;-1:-1:-1;;;17184:10:0;:42::i;:::-;-1:-1:-1;;;;;17245:15:0;;17286:1;17245:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;17245:25:0;;;;;;;;;:38;;;17165:61;;-1:-1:-1;17245:42:0;17241:109;;17321:8;17308:7;17316:1;17308:10;;;;;;;;-1:-1:-1;;;;;;17308:21:0;;;:10;;;;;;;;;;;:21;17331:3;;;;;17241:109;-1:-1:-1;;;17135:13:0;17079:282;;;;16573:795;;;;;;;;:::o;4312:262::-;4401:4;4418:77;4427:6;4435:12;:10;:12::i;:::-;-1:-1:-1;;;;;4449:19:0;;;;;;:11;:19;;;;;:45;;4487:6;;4449:19;4469:12;:10;:12::i;:::-;-1:-1:-1;;;;;4449:33:0;;;;;;;;;;;;-1:-1:-1;4449:33:0;;;:37;:45::i;:::-;4418:8;:77::i;:::-;4506:36;4516:6;4524:9;4535:6;4506:9;:36::i;:::-;-1:-1:-1;4562:4:0;4312:262;;;;;:::o;3056:83::-;3122:9;;;;3056:83;:::o;14325:45::-;;;;;;;;;;;;;:::o;14434:52::-;;;;;;;;;;;;;;;;;;;:::o;5947:83::-;5997:25;6003:10;6015:6;5997:5;:25::i;:::-;5947:83;:::o;54739:196::-;52331:21;;-1:-1:-1;;;;;52331:21:0;52317:10;:35;;:83;;-1:-1:-1;52383:17:0;;-1:-1:-1;;;;;52383:17:0;52369:10;:31;52317:83;:127;;;-1:-1:-1;52431:13:0;;-1:-1:-1;;;;;52431:13:0;52417:10;:27;52317:127;52295:204;;;;;-1:-1:-1;;;52295:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54809:23:0;::::1;;::::0;;;:12:::1;:23;::::0;;;;12421:8:::1;54809:53:::0;;54913:14:::1;:12;:14::i;:::-;-1:-1:-1::0;;;;;54873:23:0;;::::1;;::::0;;;:12:::1;:23;::::0;;;;-1:-1:-1;;;;;54873:54:0;;;::::1;:37;::::0;;::::1;:54:::0;54739:196::o;30456:242::-;22483:39;22503:18;:16;:18::i;:::-;22483:19;:39::i;:::-;30585:105:::1;30617:10;30642:11;30668;30585:17;:105::i;:::-;30456:242:::0;;:::o;15028:130::-;15076:6;15114:11;;15102:8;:6;:8::i;:::-;:23;;:48;;15149:1;15102:48;;;15128:18;:16;:18::i;:::-;15095:55;;15028:130;:::o;18397:208::-;-1:-1:-1;;;;;18492:24:0;;18465:7;18492:24;;;:13;:24;;;;;;:29;:105;;-1:-1:-1;;;;;18559:24:0;;;;;;:13;:24;;;;;;18537:60;;18548:9;;18559:31;;18588:1;18559:28;:31::i;:::-;-1:-1:-1;;;18537:10:0;:60::i;:::-;18492:105;;;18532:1;18485:112;18397:208;-1:-1:-1;;18397:208:0:o;52103:36::-;;;-1:-1:-1;;;;;52103:36:0;;:::o;23685:98::-;23736:39;23756:18;:16;:18::i;23736:39::-;23685:98::o;13221:34::-;;;-1:-1:-1;;;;;13221:34:0;;:::o;3394:110::-;-1:-1:-1;;;;;3478:18:0;3451:7;3478:18;;;;;;;;;;;;3394:110::o;35338:307::-;35508:9;35504:134;35527:13;:20;35523:1;:24;35504:134;;;35569:57;35581:13;35595:1;35581:16;;;;;;;;;;;;;;35599:9;35609:1;35599:12;;;;;;;;;;;;;;35613:9;35623:1;35613:12;;;;;;;;;;;;;;35569:11;:57::i;:::-;-1:-1:-1;;;35549:3:0;;35504:134;;;;35338:307;;;:::o;47124:232::-;-1:-1:-1;;;;;47280:15:0;;;47233:13;47280:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;47280:25:0;;;;;;;;;47259:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47259:46:0;;;;;;;-1:-1:-1;;;47259:46:0;;;;;;;;-1:-1:-1;;;47259:46:0;;;;;;;;-1:-1:-1;;;47259:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47259:46:0;;;;;;;;;;;47233:13;47327:21;47259:46;47327:14;:21::i;:::-;47316:32;47124:232;-1:-1:-1;;;;47124:232:0:o;22385:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22703:657::-;22769:16;22800;22831:12;;;;;;;;;-1:-1:-1;;;;;22831:12:0;-1:-1:-1;;;;;22831:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22831:26:0;;;;;;;22890:12;;22831:26;22890:21;;-1:-1:-1;;;22890:21:0;;;;22831:26;;-1:-1:-1;22831:26:0;;-1:-1:-1;22870:17:0;;12772:42;;-1:-1:-1;;;;;22890:12:0;;;;:19;;:21;;;;;22831:26;22890:21;;;;;:12;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22890:21:0;-1:-1:-1;;;;;22890:29:0;;:77;;22959:8;22890:77;;;22935:8;22890:77;22870:97;;;;22980:13;22996;:11;:13::i;:::-;:18;:124;;23047:73;23106:13;:11;:13::i;:::-;23047:36;:9;23079:3;23047:31;:36::i;:::-;:58;;:73::i;:::-;22996:124;;;23030:1;22996:124;22980:140;;23145:2;23137:5;:10;:45;;;;-1:-1:-1;23151:22:0;;-1:-1:-1;;;23151:22:0;;;;:31;23137:45;23133:73;;;23184:22;:20;:22::i;:::-;23229:2;23221:5;:10;:44;;;;-1:-1:-1;23235:22:0;;-1:-1:-1;;;23235:22:0;;;;:30;;23261:4;23235:30;23221:44;23217:73;;;23267:23;:21;:23::i;:::-;23329:22;;23308:44;;;-1:-1:-1;;;23329:22:0;;;;;23308:44;;;;;;;;;;;;;;;22703:657;;;;:::o;32779:963::-;32905:14;32930:15;32956:22;32989:24;33024:21;33056:18;33085;33114:17;33150:24;33177:13;:24;33191:9;-1:-1:-1;;;;;33177:24:0;-1:-1:-1;;;;;33177:24:0;;;;;;;;;;;;:37;33202:11;-1:-1:-1;;;;;33177:37:0;;-1:-1:-1;;;;;33177:37:0;;;;;;;;;;;;;33150:64;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33150:64:0;-1:-1:-1;;;;;33150:64:0;-1:-1:-1;;;;;33150:64:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33150:64:0;;-1:-1:-1;;;;;33150:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33236:4;:11;;;33227:20;;33268:4;:12;;;33258:22;;33310:4;:13;;;33291:32;;33336:18;33357:6;:14;33364:6;-1:-1:-1;;;;;33357:14:0;-1:-1:-1;;;;;33357:14:0;;;;;;;;;;;;:23;33372:7;-1:-1:-1;;;;;33357:23:0;;-1:-1:-1;;;;;33357:23:0;;;;;;;;;;;;;33336:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;-1:-1:-1;;;;;33336:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33408:5;:20;;;33391:37;;33460:139;33497:5;33517:31;33536:5;33543:4;33517:18;:31::i;:::-;33563:25;33582:5;33563:18;:25::i;:::-;33460:22;:139::i;:::-;33441:158;;33628:5;:14;;;33612:30;;33668:18;33680:5;33668:11;:18::i;:::-;33653:33;;33713:21;33728:5;33713:14;:21::i;:::-;33697:37;;32779:963;;;;;;;;;;;;;:::o;14885:51::-;;;;;;;;;;;;;:::o;2895:87::-;2967:7;2960:14;;;;;;;;-1:-1:-1;;2960:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2934:13;;2960:14;;2967:7;;2960:14;;2967:7;2960:14;;;;;;;;;;;;;;;;;;;;;;;;39683:1459;39753:7;22483:39;22503:18;:16;:18::i;22483:39::-;39788:23:::1;39826:21:::0;39861:31:::1;39871:10;39883:8;39861:9;:31::i;:::-;39773:119;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;39773:119:0;;::::1;::::0;;;;-1:-1:-1;;;39773:119:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39773:119:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39773:119:0;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;39773:119:0;::::1;::::0;;;;-1:-1:-1;;;39773:119:0;::::1;;;;;::::0;;;;;;-1:-1:-1;39773:119:0;;-1:-1:-1;39905:143:0::1;::::0;39773:119;;;39905:16:::1;:143::i;:::-;40061:68;40084:10;:19;;;-1:-1:-1::0;;;;;40061:68:0::1;40105:10;:23;;;40061:22;:68::i;:::-;40140:74;40167:10;:19;;;-1:-1:-1::0;;;;;40140:74:0::1;40188:10;:25;;;40140:26;:74::i;:::-;40227:137;40261:10;:19;;;40295:10;:24;;;40334:10;:19;;;-1:-1:-1::0;;;;;40227:137:0::1;:19;:137::i;:::-;40377:49;40391:10;:19;;;40412:13;40377;:49::i;:::-;40439:317;40497:13;40471:10;:23;;;:39;:98;;40568:1;40471:98;;;40552:13;40526:10;:23;;;:39;40471:98;40618:10;40610:19;::::0;;;:7:::1;:19;::::0;;;;;;;-1:-1:-1;;;;;;40610:29:0;::::1;::::0;;;;;;;;;;40584:23;;::::1;::::0;40654:19:::1;::::0;::::1;::::0;40688::::1;::::0;::::1;::::0;40722:23;;40584:55;;;::::1;::::0;40654:19;;-1:-1:-1;;;;;40439:317:0;;::::1;::::0;:17:::1;:317::i;:::-;40845:10;:19;;;-1:-1:-1::0;;;;;40774:317:0::1;40820:10;-1:-1:-1::0;;;;;40774:317:0::1;40797:8;-1:-1:-1::0;;;;;40774:317:0::1;;;40879:10;:23;;;40917:10;:23;;;40955:10;:25;;;40995:10;:23;;;41033:10;:19;;;41067:13;40774:317;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;40774:317:0::1;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;41111:23:0::1;;::::0;;39683:1459;-1:-1:-1;;39683:1459:0:o;42093:2703::-;42224:17;42252:20;42283:21;42315:22;42348:23;22483:39;22503:18;:16;:18::i;22483:39::-;42405:10:::1;42398:18;::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;42398:28:0;::::1;::::0;;;;;;;:37:::1;;::::0;-1:-1:-1;;;42398:37:0;::::1;;;42390:46;;;::::0;::::1;;42477:10;42449:18;42470::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;42470:28:0;::::1;::::0;;;;;;;;42449:49;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;42449:49:0;;::::1;::::0;;;;-1:-1:-1;;;42449:49:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42449:49:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42449:49:0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;42449:49:0;::::1;::::0;;;;-1:-1:-1;;;42449:49:0;::::1;;;;;::::0;;;;;42523:15;::::1;:105;;42606:22;42622:5;42606:15;:22::i;:::-;42523:105;;;42554:36;42578:11;-1:-1:-1::0;;;;;42554:36:0::1;:19;42567:5;42554:12;:19::i;:::-;:23:::0;::::1;:36::i;:::-;42511:117;;42665:5;:14;;;-1:-1:-1::0;;;;;42653:26:0::1;:9;:26;:89;;42733:9;42653:89;;;42695:22;42711:5;42695:15;:22::i;:::-;42641:101;;42770:119;42802:5;:18;;;42835:19;42848:5;42835:12;:19::i;:::-;42869:9;42770:17;:119::i;:::-;42755:134;;42906:21;42921:5;42906:14;:21::i;:::-;42902:1521;;42971:16;42981:5;42971:9;:16::i;:::-;42955:32;;43021:157;43053:12;43084:13;43116:10;43145:7;:18;;;43021:13;:157::i;:::-;43216:18:::0;;43004:174;;-1:-1:-1;43216:38:0::1;::::0;43004:174;43216:22:::1;:38::i;:::-;43195:59:::0;;43294:14:::1;::::0;::::1;::::0;43271:54:::1;::::0;-1:-1:-1;;;;;43271:54:0::1;43310:14:::0;43271:22:::1;:54::i;:::-;43346:20;::::0;::::1;::::0;:24;43342:425:::1;;43409:179;43445:12;43480:13;43524:3;43551:7;:18;;;43409:13;:179::i;:::-;43632:20;::::0;::::1;::::0;43391:197;;-1:-1:-1;43632:41:0::1;::::0;43391:197;43632:24:::1;:41::i;:::-;43609:20;::::0;::::1;:64:::0;43719:14:::1;::::0;::::1;::::0;43692:59:::1;::::0;-1:-1:-1;;;;;43692:59:0::1;43735:15:::0;43692:26:::1;:59::i;:::-;43783:52;43800:1;43803:14;43819:15;43783:16;:52::i;:::-;43852:203;43888:5;:18;;;43925:12;43956:5;:14;;;43989:5;:14;;;-1:-1:-1::0;;;;;43852:203:0::1;44022:5;:18;;;43852:17;:203::i;:::-;42902:1521;;;44137:10;44129:19;::::0;;;:7:::1;:19;::::0;;;;;;;-1:-1:-1;;;;;;44129:29:0;::::1;::::0;;;;;;;;:47:::1;::::0;44163:12;44129:33:::1;:47::i;:::-;44105:10;44097:19;::::0;;;:7:::1;:19;::::0;;;;;;;-1:-1:-1;;;;;;44097:29:0;::::1;::::0;;;;;;;:79;;;44227:18;::::1;::::0;44312:14:::1;::::0;::::1;::::0;44345::::1;::::0;::::1;::::0;44378:18;;44191:220:::1;::::0;44097:79;44312:14;-1:-1:-1;;;;;44191:220:0::1;::::0;:17:::1;:220::i;:::-;44435:15;::::0;::::1;:27:::0;;;44480:10:::1;44473:18;::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;44473:28:0;::::1;::::0;;;;;;;;:36;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;44473:36:0;;::::1;-1:-1:-1::0;;;;;44473:36:0;;::::1;;-1:-1:-1::0;;;;44473:36:0::1;-1:-1:-1::0;;;44473:36:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;44473:36:0::1;-1:-1:-1::0;;;44473:36:0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;44473:36:0::1;-1:-1:-1::0;;;44473:36:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;;44473:36:0;;::::1;-1:-1:-1::0;;;;;44473:36:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;44473:36:0::1;-1:-1:-1::0;;;44473:36:0;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;44522:31:::1;::::0;44540:12;44522:5:::1;:31::i;:::-;44624:10;-1:-1:-1::0;;;;;;44571:217:0;::::1;;44649:12:::0;44676:9;44700:14;44729:15;44759:18:::1;:16;:18::i;:::-;44571:217;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44571:217:0::1;::::0;;;;;;;;;;;;::::1;22533:1;42093:2703:::0;;;;;;;;:::o;13491:184::-;13577:79;;;-1:-1:-1;;;13577:79:0;;12772:42;13577:79;;;;13636:4;13577:79;;;;;;13038:42;;13577:26;;:79;;;;;;;;;;;;;;-1:-1:-1;13038:42:0;13577:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13577:79:0;13533:12;:134;;-1:-1:-1;;;;;;13533:134:0;-1:-1:-1;;;;;13533:134:0;;;;;;;;;13491:184::o;47364:982::-;-1:-1:-1;;;;;47856:15:0;;;47469:16;47856:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;47856:25:0;;;;;;;;;47835:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47835:46:0;;;;;;;;;-1:-1:-1;;;47835:46:0;;;;;;;;;;-1:-1:-1;;;47835:46:0;;;;;;;;;;-1:-1:-1;;;47835:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47835:46:0;;;;;;;;;;;;;;;;;;;;;;47469:16;;;;;;;48177:25;47835:46;48177:18;:25::i;:::-;48162:40;;48229:30;48253:5;48229:23;:30::i;:::-;48213:46;;48281:5;:14;;;48270:25;;48317:21;48332:5;48317:14;:21::i;:::-;48306:32;;47364:982;;;;;;;;;;;;;;;:::o;3512:161::-;3581:4;3598:43;3608:12;:10;:12::i;:::-;3622:9;3633:6;3598:9;:43::i;23968:239::-;24062:1;24049:10;-1:-1:-1;;;;;24049:14:0;;:49;;;;;24080:18;:16;:18::i;:::-;-1:-1:-1;;;;;24067:31:0;:10;-1:-1:-1;;;;;24067:31:0;;24049:49;24041:58;;;;;;24131:23;;-1:-1:-1;;;;;24118:36:0;;;24110:45;;;;;;24168:31;24188:10;24168:19;:31::i;18198:191::-;-1:-1:-1;;;;;18288:19:0;;18261:7;18288:19;;;:10;:19;;;;;;:24;:93;;-1:-1:-1;;;;;18348:19:0;;;;;;:10;:19;;;;;;18328:53;;18339:7;;18348:26;;18372:1;18348:23;:26::i;:::-;-1:-1:-1;;;18328:10:0;:53::i;53892:142::-;53949:18;;-1:-1:-1;;;;;53949:18:0;53971:10;53949:32;53941:41;;;;;;53993:18;:33;;-1:-1:-1;;;;;;53993:33:0;;;53892:142::o;53558:326::-;53710:18;;-1:-1:-1;;;;;53710:18:0;53732:10;53710:32;53702:41;;;;;;53754:21;:36;;-1:-1:-1;;;;;53754:36:0;;;-1:-1:-1;;;;;;53754:36:0;;;;;;;53801:17;:36;;;;;;;;;;;;;;;53848:13;:28;;;;;;;;;;;53558:326::o;12242:37::-;;;;;;:::o;13096:116::-;;;-1:-1:-1;;;;;13096:116:0;;:::o;37649:323::-;37791:20;37831:133;37859:13;37887:9;-1:-1:-1;;;;;37831:133:0;37911:9;37935:7;:18;;;37831:13;:133::i;14827:49::-;;;;;;;;;;;;;:::o;15669:89::-;15735:15;15669:89;:::o;14766:54::-;;;;;;;;;;;;;:::o;16063:163::-;16190:25;;;-1:-1:-1;;16190:25:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16190:25:0;;;;;;;;;;;;;;;;;;;;;;16180:36;;;;;16136:9;;16162:56;;:9;:56::i;14628:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14628:73:0;;;;;;;;;;;;;;;;:::o;52220:33::-;;;-1:-1:-1;;;;;52220:33:0;;:::o;14710:49::-;;;;;;;;;;;;;:::o;9059:22::-;;;;;;;;;;;;;;:::o;12958:129::-;13038:42;12958:129;:::o;56271:768::-;56558:59;;;-1:-1:-1;;;56558:59:0;;56577:10;56558:59;;;;56597:4;56558:59;;;;;;;;;;;;56444:7;;;;;;56531:13;;-1:-1:-1;;;;;56558:18:0;;;;;:59;;;;;;;;;;;;;;56444:7;56558:18;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56628:52:0;;;-1:-1:-1;;;56628:52:0;;12900:42;56628:52;;;;;;;;;;;;-1:-1:-1;;;;;56628:13:0;;;;;:52;;;;;56558:59;;56628:52;;;;;;;-1:-1:-1;56628:13:0;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56693:21:0;;-1:-1:-1;56717:42:0;56730:13;56753:4;56717:12;:42::i;:::-;56693:66;;56772:24;12900:42;-1:-1:-1;;;;;56799:39:0;;56853:12;56880:1;56896:4;56915:10;56940:15;56799:167;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56799:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56799:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56799:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56799:167:0;;;;;;;;;;;;-1:-1:-1;56799:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56772:194;;56986:45;56998:7;57006:1;56998:10;;;;;;;;;;;;;;57010:9;57021;56986:11;:45::i;:::-;56979:52;;;;;;;;;56271:768;;;;;;;;;:::o;22333:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12823:126::-;12900:42;12823:126;:::o;14377:48::-;;;;;;;;;;;;;:::o;3805:134::-;-1:-1:-1;;;;;3904:18:0;;;3877:7;3904:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3805:134::o;35887:1754::-;36019:7;;;36076:10;-1:-1:-1;;;;;36076:23:0;;;;;;:49;;;36103:22;36115:9;36103:11;:22::i;:::-;36068:58;;;;;;11852:1;-1:-1:-1;;;;;36145:26:0;;;;;;:56;;-1:-1:-1;11931:5:0;-1:-1:-1;;;;;36175:26:0;;;;36145:56;36137:65;;;;;;12119:7;36221:33;;;36213:42;;;;;;36283:21;36319:15;36349:17;36380:61;36393:10;36405:13;36420:9;36431;36380:12;:61::i;:::-;-1:-1:-1;;;;;36268:173:0;;;;;;;36484:1;36458:8;:23;;;:27;36454:488;;;36504:32;;:::i;:::-;36575:10;36553:32;;-1:-1:-1;;;;;;36600:30:0;;:20;;;:30;36669:4;36645:21;;;:28;36703:29;36722:9;36703:18;:29::i;:::-;-1:-1:-1;;;;;36747:24:0;;;;;;;:13;:24;;;;;;;;-1:-1:-1;;;;;;36747:36:0;;;;;;;;;;;;:51;;;;-1:-1:-1;;;;;;36747:51:0;;;;;;;;;;;;;-1:-1:-1;36747:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36747:51:0;;;;;;;;;;:36;-1:-1:-1;36815:33:0;36747:24;36815:22;:33::i;:::-;36863:67;36887:8;:17;;;-1:-1:-1;;;;;36863:67:0;36906:8;:23;;;36863;:67::i;:::-;36454:488;;36961:10;36954:18;;;;:6;:18;;;;;;;;-1:-1:-1;;;;;;36954:27:0;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36954:38:0;;;-1:-1:-1;;;;;36954:38:0;;;;-1:-1:-1;;;;36954:38:0;-1:-1:-1;;;36954:38:0;;;;;;;;;;;-1:-1:-1;;;;36954:38:0;-1:-1:-1;;;36954:38:0;;;;;;;;-1:-1:-1;;;;;36954:38:0;-1:-1:-1;;;36954:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36954:38:0;;;-1:-1:-1;;;;;36954:38:0;;;;;;;-1:-1:-1;;;;36954:38:0;-1:-1:-1;;;36954:38:0;;;;;;;;;;;;;37005:31;;:19;:31::i;:::-;37049:137;37080:8;:21;;;37116:8;:21;;;37152:8;:23;;;37049:16;:137::i;:::-;37199:61;37219:8;:17;;;-1:-1:-1;;;;;37199:61:0;37238:8;:21;;;37199:19;:61::i;:::-;37350:9;-1:-1:-1;;;;;37278:303:0;37325:10;-1:-1:-1;;;;;37278:303:0;37303:7;-1:-1:-1;;;;;37278:303:0;;;37374:8;:21;;;37410:8;:21;;;37446:8;:23;;;37484:8;:17;;;37516:8;:17;;;37548:8;:22;;;37278:303;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37278:303:0;;;;;;-1:-1:-1;;;;;37278:303:0;;;;;;;;;;;;;;;;;;;;;;;;;37602:7;;-1:-1:-1;37611:9:0;-1:-1:-1;;35887:1754:0;;;;;;;:::o;14562:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14562:59:0;;;;-1:-1:-1;;;14562:59:0;;;;;-1:-1:-1;;;14562:59:0;;;;;-1:-1:-1;;;14562:59:0;;;;;;;;;;-1:-1:-1;;;;;14562:59:0;;;-1:-1:-1;;;14562:59:0;;;;;:::o;54384:134::-;52331:21;;-1:-1:-1;;;;;52331:21:0;52317:10;:35;;:83;;-1:-1:-1;52383:17:0;;-1:-1:-1;;;;;52383:17:0;52369:10;:31;52317:83;:127;;;-1:-1:-1;52431:13:0;;-1:-1:-1;;;;;52431:13:0;52417:10;:27;52317:127;52295:204;;;;;-1:-1:-1;;;52295:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54478:32:::1;54484:16;54502:7;54478:5;:32::i;15286:101::-:0;15331:6;15357:18;:16;:18::i;:::-;15378:1;15357:22;15350:29;;15286:101;:::o;17376:814::-;17515:27;17555:13;17581:1;17571:7;:11;:62;;;;-1:-1:-1;;;;;;17599:24:0;;;;;;:13;:24;;;;;;:34;-1:-1:-1;17571:62:0;:139;;-1:-1:-1;;;;;17686:24:0;;;;;;:13;:24;;;;;;17571:139;;;-1:-1:-1;;;;;17649:24:0;;;;;;:13;:24;;;;;;:34;;;17571:139;17555:155;;17723:14;17750:1;17740:7;:11;:43;;;;;17776:7;17768:5;:15;17740:43;:78;;17817:1;17740:78;;;17807:7;17799:5;:15;17740:78;17723:95;;17831:9;17888:6;17880:5;:14;-1:-1:-1;;;;;17866:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17866:29:0;-1:-1:-1;17853:42:0;-1:-1:-1;17931:5:0;17908:275;17948:6;17938:7;:16;17908:275;;;17982:12;17997:40;18008:9;-1:-1:-1;;18019:11:0;;-1:-1:-1;;;17997:10:0;:40::i;:::-;-1:-1:-1;;;;;18072:24:0;;;;;;;:13;:24;;;;;;;;-1:-1:-1;;;;;;18072:30:0;;;;;;;;;:37;17982:55;;-1:-1:-1;18056:54:0;;18072:37;18056:15;:54::i;:::-;18052:120;;;18147:4;18131:10;18142:1;18131:13;;;;;;;;-1:-1:-1;;;;;;18131:20:0;;;:13;;;;;;;;;;;:20;18153:3;;;;;18052:120;-1:-1:-1;;;17956:9:0;17908:275;;52146:32;;;-1:-1:-1;;;;;52146:32:0;;:::o;15508:153::-;15623:11;;15576:6;;11800:13;;15610:24;;15609:43;;;15508:153;-1:-1:-1;;15508:153:0:o;52185:28::-;;;-1:-1:-1;;;;;52185:28:0;;:::o;30706:363::-;22483:39;22503:18;:16;:18::i;22483:39::-;30862:9:::1;30858:204;30881:12;:19;30877:1;:23;30858:204;;;30922:128;30958:10;30987:12;31000:1;30987:15;;;;;;;;;;;;;;31021:11;31033:1;31021:14;;;;;;;;;;;;;;30922:17;:128::i;:::-;30902:3;;30858:204;;;;30706:363:::0;;:::o;480:181::-;538:7;570:5;;;594:6;;;;586:46;;;;;-1:-1:-1;;;586:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;652:1;480:181;-1:-1:-1;;;480:181:0:o;154:106::-;242:10;154:106;:::o;6926:274::-;-1:-1:-1;;;;;7028:21:0;;7020:30;;;;;;-1:-1:-1;;;;;7069:23:0;;7061:32;;;;;;-1:-1:-1;;;;;7106:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;7160:32;;;;;;;;;;;;;;;;;6926:274;;;:::o;15166:112::-;15217:6;15243:27;15261:8;:6;:8::i;:::-;15243:17;:27::i;669:136::-;727:7;754:43;758:1;761;754:43;;;;;;;;;;;;;;;;;:3;:43::i;4895:363::-;-1:-1:-1;;;;;5001:22:0;;4993:31;;;;;;-1:-1:-1;;;;;5043:25:0;;5035:34;;;;;;-1:-1:-1;;;;;5102:17:0;;:9;:17;;;;;;;;;;;:29;;5124:6;5102:21;:29::i;:::-;-1:-1:-1;;;;;5082:17:0;;;:9;:17;;;;;;;;;;;:49;;;;5165:20;;;;;;;:32;;5190:6;5165:24;:32::i;:::-;-1:-1:-1;;;;;5142:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;5215:35;;;;;;;5142:20;;5215:35;;;;;;;;;;;;;4895:363;;;:::o;6363:287::-;-1:-1:-1;;;;;6447:23:0;;6439:32;;;;;;-1:-1:-1;;;;;6505:18:0;;:9;:18;;;;;;;;;;;:30;;6528:6;6505:22;:30::i;:::-;-1:-1:-1;;;;;6484:18:0;;:9;:18;;;;;;;;;;:51;6561:12;;:24;;6578:6;6561:16;:24::i;:::-;6546:12;:39;6603;;;;;;;;6629:3;;-1:-1:-1;;;;;6603:39:0;;;;;;;;;;;;6363:287;;:::o;24362:2386::-;24429:23;:21;:23::i;:::-;24530:7;:19;24582:23;;24465:27;;24530:19;24562:2179;24614:10;-1:-1:-1;;;;;24607:17:0;:4;:17;24562:2179;;;-1:-1:-1;;24866:8:0;;24856:19;;;;:9;:19;;;;;;;;:34;;;24833:20;;;:14;:20;;;;;;24934:15;;;;;;;24907:42;;;;;;;;;;;24873:1;24907:42;;;;;;;;;;;24833:57;;;;24907:42;;;24964:45;;;25066:19;;24833:57;;-1:-1:-1;;;25066:106:0;;25171:1;25066:106;;;25127:19;;:41;;;25066:106;25026:146;;25217:418;25320:296;25363:16;25406:13;:11;:13::i;:::-;25446:20;;;;:14;:20;;;;;;;;;;25493:15;;25552:14;;25493:100;;-1:-1:-1;;;25493:100:0;;25552:14;;;;25493:100;;;;;;25446:20;;-1:-1:-1;;;;;25493:15:0;;;;:28;;:100;;;;;;;;;;:15;:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25493:100:0;25320:16;:296::i;:::-;25217:20;;:58;;12374:4;25217:42;:58::i;:418::-;25189:24;;;;:446;;;25691:15;;;;:9;:15;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25956:8:0;;25945:20;;:10;:20;;;;;;:35;;;;25917:25;;;:19;:25;;;;;;26026:16;;;;;;;25997:45;;;;;;;;;;;;;;;;;;;;;25917:63;;25997:45;;;26057:46;;;26161:22;;25917:63;;-1:-1:-1;25997:45:0;26161:44;-1:-1:-1;26161:112:0;;26272:1;26161:112;;;26225:22;;:44;;;26161:112;26120:153;;26318:247;26422:124;26467:16;26510:13;:11;:13::i;:::-;26422:18;:124::i;26318:247::-;26290:25;;;;:275;;;26622:16;;;;:10;:16;;;;;;;;:28;;;;;;;;;;;;;;;;;;26667:22;:20;:22::i;:::-;-1:-1:-1;;26704:23:0;:25;;;;;;;;;24626:6;24562:2179;;31077:1694;-1:-1:-1;;;;;31256:24:0;;;31220;31256;;;:13;:24;;;;;;;;-1:-1:-1;;;;;;31256:37:0;;;;;;;;;;;;31220:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31314:21;31306:30;;;;;;31366:11;;31406:12;;;;;-1:-1:-1;;;;;31452:14:0;;;31349;31452;;;:6;:14;;;;;;-1:-1:-1;;;;;;31452:23:0;;;;;;;;;31431:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31431:44:0;;;;;;;-1:-1:-1;;;31431:44:0;;;;;;;;-1:-1:-1;;;31431:44:0;;;;;;;;-1:-1:-1;;;31431:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31431:44:0;;;;;;;;;;;31406:12;;31431:44;31507:31;31431:44;31366:11;31507:18;:31::i;:::-;31488:50;;31549:16;31568:25;31587:5;31568:18;:25::i;:::-;31549:44;;31610:18;31622:5;31610:11;:18::i;:::-;31606:673;;;31682:1;31667:12;:16;:81;;;;;31719:29;31729:8;31739;31719:9;:29::i;:::-;31704:12;:44;31667:81;31645:382;;;31838:18;;;;:36;;31861:12;31838:22;:36::i;:::-;31800:18;;;:74;31923:26;:8;31936:12;31923;:26::i;:::-;31895:54;;31645:382;;;32006:5;31990:13;;;:21;31645:382;31606:673;;;32074:39;32084:8;32094:18;:16;:18::i;:::-;-1:-1:-1;;;;;32074:39:0;:9;:39::i;:::-;32164:18;;;;32059:54;;-1:-1:-1;32164:36:0;;32059:54;32164:22;:36::i;:::-;32130:18;;;:70;32241:26;:8;32254:12;32241;:26::i;:::-;32217:50;;31606:673;32291:24;32318:99;32355:5;32375:8;32398;32318:22;:99::i;:::-;32450:17;;;;32291:126;;-1:-1:-1;32450:39:0;;32291:126;32450:21;:39::i;:::-;32430:4;:17;;:59;;;;;32542:4;32502:13;:24;32516:9;-1:-1:-1;;;;;32502:24:0;-1:-1:-1;;;;;32502:24:0;;;;;;;;;;;;:37;32527:11;-1:-1:-1;;;;;32502:37:0;;-1:-1:-1;;;;;32502:37:0;;;;;;;;;;;;;:44;;;;;;;;;;;;;-1:-1:-1;;;;;32502:44:0;;;;;-1:-1:-1;;;;;32502:44:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32502:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32559:34;32565:9;32576:16;32559:5;:34::i;:::-;32611:152;;;-1:-1:-1;;;;;;32611:152:0;;;;;;;;;;;;;-1:-1:-1;;;;;32611:152:0;;;;;;;;;;;;;;;;;;;;;31077:1694;;;;;;;;;;:::o;18882:222::-;18950:4;18992:1;18974:6;:15;;;-1:-1:-1;;;;;18974:19:0;;:122;;19078:18;:16;:18::i;:::-;-1:-1:-1;;;;;19059:37:0;:6;:15;;;-1:-1:-1;;;;;19059:37:0;;;18974:122;;;19028:6;:15;;;-1:-1:-1;;;;;19009:34:0;:6;:15;;;-1:-1:-1;;;;;19009:34:0;;;18967:129;;18882:222;;;:::o;1013:250::-;1071:7;1095:6;1091:47;;-1:-1:-1;1125:1:0;1118:8;;1091:47;1162:5;;;1166:1;1162;:5;:1;1186:5;;;;;:10;1178:56;;;;-1:-1:-1;;;1178:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1271:132;1329:7;1356:39;1360:1;1363;1356:39;;;;;;;;;;;;;;;;;:3;:39::i;23368:88::-;23419:22;:29;;-1:-1:-1;;;;23419:29:0;-1:-1:-1;;;23419:29:0;;;23368:88::o;23464:90::-;23516:22;:30;;-1:-1:-1;;;;23516:30:0;;;23464:90::o;34431:348::-;34555:7;34582:189;34751:5;:19;;;34643:6;:15;;;-1:-1:-1;;;;;34597:61:0;:12;:29;34610:6;:15;;;-1:-1:-1;;;;;34597:29:0;-1:-1:-1;;;;;34597:29:0;;;;;;;;;;;;:43;;;:61;:138;;34720:6;:15;;;-1:-1:-1;;;;;34597:138:0;;;;34687:15;;;;-1:-1:-1;;;;;34674:29:0;;;;;:12;:29;;;;;:43;;;34582:168;;:189::i;34787:212::-;34875:7;34933:1;34915:6;:15;;;-1:-1:-1;;;;;34915:19:0;;:76;;34968:23;34984:6;34968:15;:23::i;34915:76::-;-1:-1:-1;34950:15:0;;;-1:-1:-1;;;;;34915:76:0;;34787:212::o;33750:299::-;33898:25;33943:41;33968:6;:15;;;33943:24;:41::i;:::-;:98;;33991:50;34012:6;34020:9;34031;33991:20;:50::i;:::-;33943:98;;;-1:-1:-1;33987:1:0;;33750:299;-1:-1:-1;;;33750:299:0:o;19500:147::-;19589:15;;;;19565:4;;19589:24;;:50;;;19617:22;19632:6;19617:14;:22::i;41150:729::-;-1:-1:-1;;;;;41305:15:0;;41246:20;41305:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;41305:25:0;;;;;;;;;:34;;;41246:20;;-1:-1:-1;;;41305:34:0;;;;41297:43;;;;;;-1:-1:-1;;;;;41362:15:0;;;;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;41362:25:0;;;;;;;;;;-1:-1:-1;41416:18:0;:16;:18::i;:::-;41398:15;;;:36;;-1:-1:-1;;;;;41398:36:0;-1:-1:-1;;;;;;;;41398:36:0;;;;;;;;;;;;;41467:30;;;;;;;;;;;;-1:-1:-1;41467:30:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41467:30:0;;;;;;;;-1:-1:-1;;;41467:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41398:36;41467:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;41467:30:0;;;;;;-1:-1:-1;;;41467:30:0;;;;;;;;;;;;:22;:30::i;:::-;41445:19;;;:52;;;41519:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41519:31:0;;;;;;;-1:-1:-1;;;41519:31:0;;;;;;;;-1:-1:-1;;;41519:31:0;;;;;;;;-1:-1:-1;;;41519:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41519:31:0;;;;;;-1:-1:-1;;;41519:31:0;;;;;;;;;;;;:23;:31::i;:::-;41563:15;;;:23;;-1:-1:-1;;;;41563:23:0;;;;41657:19;;;-1:-1:-1;;;;;41627:25:0;;41581:5;41627:25;;;:16;:25;;;;;;41508:42;;-1:-1:-1;41627:50:0;;:25;:29;:50::i;:::-;-1:-1:-1;;;;;41599:25:0;;;;;;:16;:25;;;;;:78;41732:19;;;;41690:133;;41616:7;;41732:30;-1:-1:-1;41732:80:0;;41811:1;41732:80;;;41800:8;41778:6;:19;;;:30;41732:80;41690:5;:133::i;:::-;41836:35;41842:7;41851:6;:19;;;41836:5;:35::i;:::-;41150:729;;;;;:::o;9569:506::-;9723:7;:19;:29;-1:-1:-1;9723:65:0;;9787:1;9723:65;;;9755:7;:19;:29;;;9723:65;9701:7;:87;9821:19;;:29;-1:-1:-1;9821:65:0;;9885:1;9821:65;;;9853:19;;:29;;;9821:65;9799:19;:87;9903:12;;9899:143;;9957:22;;:33;-1:-1:-1;9957:73:0;;10029:1;9957:73;;;9993:22;;:33;;;9957:73;9932:22;:98;9899:143;10054:13;:11;:13::i;44971:505::-;45063:19;45072:9;45063:8;:19::i;:::-;45059:410;;;45140:25;;;;:14;:25;;;;;;:35;-1:-1:-1;45140:90:0;;45229:1;45140:90;;;45191:25;;;;:14;:25;;;;;;:35;;;45140:90;45099:25;;;;:14;:25;;;;;:131;45059:410;;;45263:12;45278:18;:16;:18::i;:::-;-1:-1:-1;;;;;45263:33:0;45357:15;;;;:9;:15;;;;;:30;;;45263:33;;-1:-1:-1;45357:40:0;-1:-1:-1;45357:100:0;;45456:1;45357:100;;;45413:15;;;;:9;:15;;;;;:30;;;:40;;;45357:100;45311:15;;;;:9;:15;;;;;;:30;;:146;44971:505;;:::o;28037:527::-;28133:19;28142:9;28133:8;:19::i;:::-;28129:428;;;28215:30;;;;:19;:30;;;;;;:40;-1:-1:-1;28215:100:0;;28314:1;28215:100;;;28271:30;;;;:19;:30;;;;;;:40;;;28215:100;28169:30;;;;:19;:30;;;;;:146;28129:428;;;28348:12;28363:18;:16;:18::i;:::-;-1:-1:-1;;;;;28348:33:0;28443:16;;;;:10;:16;;;;;:31;;;28348:33;;-1:-1:-1;28443:41:0;-1:-1:-1;28443:102:0;;28544:1;28443:102;;;28500:16;;;;:10;:16;;;;;:31;;;:41;;;28443:102;28396:16;;;;:10;:16;;;;;;:31;;:149;28037:527;;:::o;29028:546::-;29191:21;29202:9;29191:10;:21::i;:::-;:30;;;:73;;;29238:26;29254:9;29238:15;:26::i;:::-;29173:394;;;-1:-1:-1;;;;;29342:23:0;;;;;;:12;:23;;;;;:35;:52;-1:-1:-1;29342:124:0;;29465:1;29342:124;;;-1:-1:-1;;;;;29410:23:0;;;;;;:12;:23;;;;;:35;:52;;;29342:124;-1:-1:-1;;;;;29291:23:0;;;;;;:12;:23;;;;;:175;29521:34;29304:9;29521:23;:34::i;:::-;-1:-1:-1;;;;;29481:23:0;;;;;;:12;:23;;;;;:37;;:74;29028:546;;;:::o;50835:210::-;50917:12;;50913:125;;-1:-1:-1;;;;;50987:25:0;;;;;;:14;:25;;;;;;:39;;51017:8;50987:29;:39::i;:::-;-1:-1:-1;;;;;50946:25:0;;;;;;:14;:25;;;;;:80;50835:210;;:::o;45484:1097::-;45707:1;45692:12;:16;:52;;;;-1:-1:-1;11890:2:0;45712:18;:16;:18::i;:::-;-1:-1:-1;;;;;45712:32:0;;45692:52;45688:781;;;45761:21;45785:183;45821:13;45853;45885:12;45916:9;45944;45785:17;:183::i;:::-;46005:18;;45761:207;;-1:-1:-1;45989:34:0;;45985:450;;;46076:18;;:36;;46108:3;;46076:27;;46099:3;46076:22;:27::i;:36::-;46060:13;:52;:128;;46152:18;;:36;;46184:3;;46152:27;;46175:3;46152:22;:27::i;:36::-;46060:128;;;46136:13;46060:128;46044:144;;46214:150;46250:13;46286:7;:18;;;46327;:16;:18::i;:::-;46214:150;;;;;;;;;;;;;-1:-1:-1;;;;;46214:150:0;;;;;;;;;;;;;;46385:18;:34;;;45985:450;46451:7;;;45688:781;11890:2;46485:18;:16;:18::i;:::-;-1:-1:-1;;;;;46485:33:0;;46481:93;;;46556:6;46535:18;:27;46481:93;45484:1097;;;;;:::o;20081:189::-;20150:7;20195;:23;;;20177:6;:15;;;-1:-1:-1;;;;;20177:41:0;;:85;;20247:6;:15;;;-1:-1:-1;;;;;20177:85:0;;;;-1:-1:-1;;20221:23:0;;;20081:189::o;20278:159::-;20344:7;20371:6;:16;;;20391:1;20371:21;:58;;20413:6;:16;;;20371:58;;;-1:-1:-1;20395:15:0;;;-1:-1:-1;;;;;20371:58:0;;20278:159::o;51705:348::-;51848:21;51902:9;51882:164;51920:9;51913:4;:16;51882:164;;;52003:15;;;;:9;:15;;;;;:31;;;12374:4;51971:29;;52003:31;51971:63;;;;;51954:80;;;;;51931:6;;51882:164;;;;51705:348;;;;;:::o;19655:243::-;19745:15;;;;19718:7;;19745:24;:145;;19844:46;19854:18;:16;:18::i;:::-;-1:-1:-1;;;;;19844:46:0;19874:6;:15;;;-1:-1:-1;;;;;19844:46:0;:9;:46::i;19745:145::-;19785:43;19795:6;:15;;;-1:-1:-1;;;;;19785:43:0;19812:6;:15;;;-1:-1:-1;;;;;19785:43:0;:9;:43::i;48354:379::-;48524:7;48551:26;48567:9;48551:15;:26::i;:::-;:174;;48667:58;48681:13;48696:9;48707:11;48720:4;48667:13;:58::i;:::-;48551:174;;;48593:58;48607:13;48622:9;48633:11;48646:4;48593:13;:58::i;:::-;48544:181;48354:379;-1:-1:-1;;;;;48354:379:0:o;5532:287::-;-1:-1:-1;;;;;5616:23:0;;5608:32;;;;;;5668:12;;:24;;5685:6;5668:16;:24::i;:::-;5653:12;:39;-1:-1:-1;;;;;5724:18:0;;:9;:18;;;;;;;;;;;:30;;5747:6;5724:22;:30::i;:::-;-1:-1:-1;;;;;5703:18:0;;:9;:18;;;;;;;;;;;:51;;;;5772:39;;;;;;;5703:18;;:9;;5772:39;;;;;;;;;;5532:287;;:::o;50490:167::-;50561:7;50588:6;:15;;;:61;;50630:6;:19;;;50588:61;;;50606:21;50620:6;50606:13;:21::i;51053:189::-;51129:7;51156:24;51173:6;51156:16;:24::i;:::-;:50;;;;51184:22;51199:6;51184:14;:22::i;:::-;51156:78;;51213:21;51227:6;51213:13;:21::i;20999:279::-;21158:16;;;21172:1;21158:16;;;;;;;;;21115:22;;21158:16;;;21115:22;;21158:16;;;;;-1:-1:-1;21158:16:0;21150:24;;21196:13;21185:5;21191:1;21185:8;;;;;;;;;;;;;:24;-1:-1:-1;;;;;21185:24:0;;;-1:-1:-1;;;;;21185:24:0;;;;;12772:42;21220:5;21226:1;21220:8;;;;;;;;;;;;;:15;-1:-1:-1;;;;;21220:15:0;;;-1:-1:-1;;;;;21220:15:0;;;;;21257:13;21246:5;21252:1;21246:8;;;;;;;;;;;;;:24;-1:-1:-1;;;;;21246:24:0;;;-1:-1:-1;;;;;21246:24:0;;;;;20999:279;;;;:::o;15766:173::-;15883:18;15921:9;;;;15766:173::o;38137:1338::-;38296:22;;:::i;:::-;38320:16;38338;38367:29;38373:7;38382:13;38367:5;:29::i;:::-;-1:-1:-1;;;;;38437:25:0;;;;;;:16;:25;;;;;;:44;;38467:13;38437:29;:44::i;:::-;-1:-1:-1;;;;;38409:25:0;;;;;;:16;:25;;;;;:72;38506:14;:12;:14::i;:::-;38494:26;;38542:24;38558:7;38542:15;:24::i;:::-;-1:-1:-1;;;;;38579:30:0;;;:18;;;:30;;;38620;;;:18;;;:30;38682:21;;;38661:42;;;:18;;;:42;38735:4;38714:18;;;:25;-1:-1:-1;38752:22:0;;:38;;;38930:18;;38531:35;;-1:-1:-1;38826:133:0;;38777:13;;38579:30;38906:9;;38826:13;:133::i;:::-;38801:158;;38972:22;:20;:22::i;:::-;-1:-1:-1;39071:22:0;;;;39033:19;;:97;;11743:15;;39033:61;;:37;:61::i;:97::-;39007:23;;;:123;39147:26;39163:9;39147:15;:26::i;:::-;39143:325;;;-1:-1:-1;;;;;39190:30:0;;:18;;;:30;;;39272:23;;;;39235:61;;39190:30;39235:16;:61::i;:::-;39338:118;39372:13;39404:9;-1:-1:-1;;;;;39338:118:0;39432:9;39338:15;:118::i;:::-;39311:24;;;:145;38137:1338;;;;;;;;:::o;16396:169::-;-1:-1:-1;;;;;16526:24:0;;16466:18;16526:24;;;:13;:24;;;;;;16504:53;;16515:9;;-1:-1:-1;;;16504:10:0;:53::i;18740:134::-;-1:-1:-1;;;;;18838:24:0;;;;;:13;:24;;;;;;;18865:1;18838:28;18811:55;;18740:134::o;27847:182::-;27978:30;;;;:19;:30;;;;;;:43;;28013:7;27978:34;:43::i;:::-;27936:30;;;;:19;:30;;;;;;:85;;;;-1:-1:-1;27847:182:0:o;18613:119::-;-1:-1:-1;;;;;18701:19:0;;;;;:10;:19;;;;;;;18723:1;18701:23;18679:45;;18613:119::o;9158:403::-;9312:7;:19;:32;;9336:7;9312:23;:32::i;:::-;9290:7;:54;9377:19;;:32;;9401:7;9377:23;:32::i;:::-;9355:19;:54;9426:12;;9422:106;;9480:22;;:36;;9507:8;9480:26;:36::i;44804:159::-;44917:25;;;;:14;:25;;;;;;:38;;44947:7;44917:29;:38::i;:::-;44889:25;;;;:14;:25;;;;;;:66;;;;-1:-1:-1;44804:159:0:o;20689:122::-;-1:-1:-1;;;;;20779:24:0;;;;20689:122::o;813:192::-;899:7;935:12;927:6;;;;919:29;;;;-1:-1:-1;;;919:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;971:5:0;;;813:192::o;27245:293::-;27430:7;27515:15;27497;27473:12;27458;:27;27489:5;27457:37;:55;;;;;;:73;;27245:293;-1:-1:-1;;;;;27245:293:0:o;27546:208::-;12175:9;27693:27;;27724:5;27692:37;:54;;27546:208::o;26929:308::-;26984:22;;-1:-1:-1;;;26984:22:0;;;;:31;;27011:4;26984:31;26980:120;;;27049:14;;;-1:-1:-1;;27032:35:0;;27049:14;;;;-1:-1:-1;;27049:18:0;27032:35;;;;;;27082:7;;26980:120;27114:22;;-1:-1:-1;;;27114:22:0;;;;27110:120;;27179:14;;;-1:-1:-1;;27162:35:0;;27179:14;;;;27196:1;27179:18;27162:35;;;;;;27212:7;;19906:167;19986:7;20026:8;20013:10;:21;:52;;20041:24;:8;20054:10;20041:12;:24::i;:::-;20013:52;;;-1:-1:-1;20037:1:0;;19906:167;-1:-1:-1;;19906:167:0:o;1411:278::-;1497:7;1532:12;1525:5;1517:28;;;;-1:-1:-1;;;1517:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1556:9;1572:1;1568;:5;;;;;;;1411:278;-1:-1:-1;;;;;1411:278:0:o;19112:150::-;-1:-1:-1;;;;;19212:23:0;19188:4;19212:23;;;:12;:23;;;;;:37;;;:42;;19112:150::o;34057:366::-;34202:25;34260:9;34240:176;34278:9;34271:4;:16;34240:176;;;34372:16;;;;:10;:16;;;;;:32;;;34333:19;;12374:4;34333:36;34372:32;34333:71;;;;;34312:92;;;;;34289:6;;34240:176;;51452:245;51527:7;51554:135;51586:6;:19;;;51620:20;51633:6;51620:12;:20::i;:::-;51655:23;51671:6;51655:15;:23::i;:::-;51554:17;:135::i;10083:252::-;10293:23;;10155:19;;10293:7;10189:19;10223:18;;10256:22;;10130:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10083:252::o;20568:113::-;20623:4;20655:18;:16;:18::i;:::-;-1:-1:-1;;;;;20647:26:0;;;;;;20568:113;-1:-1:-1;20568:113:0:o;20445:115::-;20502:4;20534:18;:16;:18::i;:::-;-1:-1:-1;;;;;20526:26:0;;;;;;20445:115;-1:-1:-1;20445:115:0:o;29582:172::-;29656:7;29683:31;29704:9;29683:20;:31::i;:::-;:63;;29721:25;29736:9;29721:14;:25::i;46589:527::-;46796:7;46816:20;46839:86;46863:9;46874:26;46890:9;46874:15;:26::i;:::-;:40;;46910:4;46874:40;;;46903:4;46874:40;46839:86;;:9;:86::i;:::-;46816:109;-1:-1:-1;46959:149:0;47095:12;46959:113;47068:3;46959:86;46816:109;46959:86;:13;46995;46959:35;:50::i;:::-;:72;;:86::i;:149::-;46938:170;46589:527;-1:-1:-1;;;;;;;46589:527:0:o;48741:323::-;48913:7;48940:116;49051:4;48940:92;48998:33;49008:9;49019:11;48998:9;:33::i;:::-;48940:39;48952:13;48967:11;48940;:39::i;50665:162::-;50731:7;50758:24;50775:6;50758:16;:24::i;:::-;:61;;50789:30;50812:6;50789:22;:30::i;19270:222::-;19340:4;19382:1;19364:6;:15;;;-1:-1:-1;;;;;19364:19:0;;:120;;19466:18;:16;:18::i;:::-;-1:-1:-1;;;;;19448:36:0;:6;:15;;;-1:-1:-1;;;;;19448:36:0;;19364:120;;;19417:6;:15;;;-1:-1:-1;;;;;19399:33:0;:6;:15;;;-1:-1:-1;;;;;19399:33:0;;19357:127;;19270:222;;;:::o;51250:194::-;51316:7;51432:4;51406:20;51419:6;51406:12;:20::i;:::-;51400:1;51380:17;51390:6;51380:9;:17::i;:::-;:21;51373:3;:29;:54;;;;;;51366:3;:62;51343:6;:19;;;:86;:93;;;;16234:154;-1:-1:-1;;;;;16354:19:0;;16299:15;16354:19;;;:10;:19;;;;;;16334:46;;16345:7;;-1:-1:-1;;;16334:10:0;:46::i;29998:450::-;30072:77;;;-1:-1:-1;;;30072:77:0;;11743:15;30072:77;;;;;;;;;;;;30133:5;30072:77;;;;;;;;30048:7;;12900:42;;30072:28;;11743:15;30072:77;;;;;;30133:5;;30072:77;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30072:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30072:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30072:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30072:77:0;;;;;;;;;;;;-1:-1:-1;30072:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30068:373;;;;:::i;:::-;;;;;;;;-1:-1:-1;;30335:19:0;;30328:26;;30068:373;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30410:19;;30403:26;;;;;30068:373;30222:7;30230:1;30222:10;;;;;;;;;;;;;;30200:19;:32;;;;30254:19;;30247:26;;;;;28736:284;-1:-1:-1;;;;;28872:23:0;;;;;;:12;:23;;;;;:35;:55;;28912:14;28872:39;:55::i;:::-;-1:-1:-1;;;;;28825:23:0;;;;;;:12;:23;;;;;:102;28978:34;28838:9;28978:23;:34::i;:::-;-1:-1:-1;;;;;28938:23:0;;;;;;;:12;:23;;;;;:37;;:74;;;;-1:-1:-1;28736:284:0:o;50002:480::-;50144:7;50184:35;50209:9;50184:24;:35::i;:::-;:81;;;-1:-1:-1;12072:3:0;50236:29;;50184:81;:290;;50306:168;50342:13;50378:9;50410:7;:18;;;50451:4;50306:13;:168::i;28572:156::-;-1:-1:-1;;;;;28667:23:0;28643:4;28667:23;;;:12;:23;;;;;:35;12421:8;-1:-1:-1;;28572:156:0:o;29762:228::-;-1:-1:-1;;;;;29867:23:0;;29827:7;29867:23;;;:12;:23;;;;;:37;;;:115;;29964:18;:16;:18::i;:::-;-1:-1:-1;;;;;29867:115:0;;;;-1:-1:-1;;;;;;29924:23:0;;;;;:12;:23;;;;;:37;;;;29762:228::o;49072:401::-;49178:7;49454:11;49291:160;11978:4;49323:28;;:80;;49402:1;49323:80;;;-1:-1:-1;;49371:28:0;;49323:80;12578:15;12024:5;49291:13;:160::i;:::-;49218:57;49232:9;12485:17;11978:4;49218:13;:57::i;:::-;:233;:247;;49072:401;-1:-1:-1;;;49072:401:0:o;49797:197::-;49909:7;49936:50;49974:11;49936:33;:13;12374:4;49936:17;:33::i;20819:172::-;20885:7;20943:1;20925:6;:15;;;-1:-1:-1;;;;;20925:19:0;;:58;;20982:1;20925:58;;;20978:1;20960:6;:15;;;:19;20925:58;-1:-1:-1;;;;;20905:78:0;;20819:172;-1:-1:-1;;20819:172:0:o;49481:308::-;49613:7;49640:141;49776:4;49667:8;49655:9;:20;:101;;49735:21;:9;49749:6;49735:13;:21::i;:::-;49655:101;;;49695:20;:8;49708:6;49695:12;:20::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:88:1:-;89:3;85:15;;71:31::o;107:764::-;;188:4;170:16;167:26;164:2;;;196:5;;164:2;237:1;232:3;227;212:27;299:10;261:36;292:3;286:10;261:36;:::i;:::-;258:52;248:2;;314:5;;248:2;348;342:9;388:16;-1:-1:-1;;384:29:1;381:1;342:9;360:54;443:4;437:11;467:16;-1:-1:-1;;;;;573:2:1;566:4;558:6;554:17;551:25;546:2;538:6;535:14;532:45;529:2;;;580:5;;;;;;529:2;617:6;611:4;607:17;596:28;;653:3;647:10;633:24;;680:2;672:6;669:14;666:2;;;686:5;;;;;;666:2;;747:16;741:4;737:27;730:4;721:6;716:3;712:16;708:27;705:60;702:2;;;768:5;;;;;702:2;833;812:15;-1:-1:-1;;808:29:1;799:39;;840:4;795:50;791:2;784:62;803:3;-1:-1:-1;;154:717:1;:::o

Swarm Source

ipfs://5fc0fbf6b4e80d846430a2c2107e39abab2c58c4d585e46baae4b057c29057f7
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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