ETH Price: $2,529.18 (+0.71%)

Contract

0xCb4336D9aA2027f563437B721b34C56a3E7A23F4
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve193027922024-02-25 6:25:23187 days ago1708842323IN
BTswap: BT Token
0 ETH0.0007359523.68611814
Transfer192343892024-02-15 16:01:35197 days ago1708012895IN
BTswap: BT Token
0 ETH0.01735883260.60403859
Approve169119682023-03-26 13:42:11523 days ago1679838131IN
BTswap: BT Token
0 ETH0.0007503624.15
Approve167600522023-03-05 5:13:11545 days ago1677993191IN
BTswap: BT Token
0 ETH0.0005912419.02885572
Approve158980622022-11-04 17:11:35665 days ago1667581895IN
BTswap: BT Token
0 ETH0.0005468417.6
Approve156647742022-10-03 2:54:11698 days ago1664765651IN
BTswap: BT Token
0 ETH0.0008003215
Approve156594712022-10-02 9:09:47698 days ago1664701787IN
BTswap: BT Token
0 ETH0.000194836.27072796
Approve145956032022-04-16 9:44:41867 days ago1650102281IN
BTswap: BT Token
0 ETH0.0008991428.93826196
Approve138084052021-12-15 7:36:07989 days ago1639553767IN
BTswap: BT Token
0 ETH0.0018953361
Transfer133636472021-10-06 5:44:441059 days ago1633499084IN
BTswap: BT Token
0 ETH0.02003052198.76675269
Approve132634572021-09-20 15:35:081075 days ago1632152108IN
BTswap: BT Token
0 ETH0.0023738276.4
Approve123214292021-04-27 8:55:091221 days ago1619513709IN
BTswap: BT Token
0 ETH0.0006887433.00000112
Approve119432402021-02-28 2:48:181280 days ago1614480498IN
BTswap: BT Token
0 ETH0.00176498104
Approve116252832021-01-10 5:54:091328 days ago1610258049IN
BTswap: BT Token
0 ETH0.001340779
Approve116251122021-01-10 5:14:371328 days ago1610255677IN
BTswap: BT Token
0 ETH0.0011031165
Approve115222262020-12-25 10:22:181344 days ago1608891738IN
BTswap: BT Token
0 ETH0.0010691763
Transfer115056692020-12-22 21:15:541347 days ago1608671754IN
BTswap: BT Token
0 ETH0.0030308880.00000123
Transfer115046692020-12-22 17:33:401347 days ago1608658420IN
BTswap: BT Token
0 ETH0.0053620479
Approve114331612020-12-11 18:15:221358 days ago1607710522IN
BTswap: BT Token
0 ETH0.0010844537.40000023
Approve114182842020-12-09 11:07:291360 days ago1607512049IN
BTswap: BT Token
0 ETH0.000933455
Approve111828482020-11-03 7:27:551396 days ago1604388475IN
BTswap: BT Token
0 ETH0.0017414737
Transfer110001212020-10-06 4:46:411425 days ago1601959601IN
BTswap: BT Token
0 ETH0.0023827935.1
Approve109821892020-10-03 9:30:591427 days ago1601717459IN
BTswap: BT Token
0 ETH0.0005939835.00000134
Transfer109815802020-10-03 7:19:201427 days ago1601709560IN
BTswap: BT Token
0 ETH0.0032579548.00000145
Transfer109713022020-10-01 16:48:041429 days ago1601570884IN
BTswap: BT Token
0 ETH0.0149187219.8
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BtswapToken

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-30
*/

// File: solidity-common/contracts/interface/IERC20.sol

pragma solidity >=0.5.0 <0.7.0;


/**
 * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
 */
interface IERC20 {
    /**
    * 可选方法
    */
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

    /**
     * 必须方法
     */
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * 事件类型
     */
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: solidity-common/contracts/library/SafeMath.sol

pragma solidity >=0.5.0 <0.7.0;


/**
 * 算术操作
 */
library SafeMath {
    uint256 constant WAD = 10 ** 18;
    uint256 constant RAY = 10 ** 27;

    function wad() public pure returns (uint256) {
        return WAD;
    }

    function ray() public pure returns (uint256) {
        return RAY;
    }

    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) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    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) {
        // Solidity only automatically asserts when dividing by 0
        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;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a <= b ? a : b;
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    function sqrt(uint256 a) internal pure returns (uint256 b) {
        if (a > 3) {
            b = a;
            uint256 x = a / 2 + 1;
            while (x < b) {
                b = x;
                x = (a / x + x) / 2;
            }
        } else if (a != 0) {
            b = 1;
        }
    }

    function wmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / WAD;
    }

    function wmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), WAD / 2) / WAD;
    }

    function rmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / RAY;
    }

    function rmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), RAY / 2) / RAY;
    }

    function wdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, WAD), b);
    }

    function wdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, WAD), b / 2) / b;
    }

    function rdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, RAY), b);
    }

    function rdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, RAY), b / 2) / b;
    }

    function wpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = WAD;
        while (n > 0) {
            if (n % 2 != 0) {
                result = wmul(result, x);
            }
            x = wmul(x, x);
            n /= 2;
        }
        return result;
    }

    function rpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = RAY;
        while (n > 0) {
            if (n % 2 != 0) {
                result = rmul(result, x);
            }
            x = rmul(x, x);
            n /= 2;
        }
        return result;
    }
}

// File: solidity-common/contracts/library/Array.sol

pragma solidity >=0.5.0 <0.7.0;


/**
 * 数组工具包
 */
library Array {
    // 从字节数组array中删除指定的bytes32
    function remove(bytes32[] storage array, bytes32 element) internal returns (bool) {
        for (uint256 index = 0; index < array.length; index++) {
            if (array[index] == element) {
                delete array[index];
                array[index] = array[array.length - 1];
                array.length--;
                return true;
            }
        }
        return false;
    }

    // 从地址数组array中删除指定的address
    function remove(address[] storage array, address element) internal returns (bool) {
        for (uint256 index = 0; index < array.length; index++) {
            if (array[index] == element) {
                delete array[index];
                array[index] = array[array.length - 1];
                array.length--;
                return true;
            }
        }
        return false;
    }
}

// File: solidity-common/contracts/library/Roles.sol

pragma solidity >=0.5.0 <0.7.0;


/**
 * 多角色管理逻辑
 */
library Roles {
    // 存储角色授权数据
    struct Role {
        mapping(address => bool) bearer;
    }

    // 增加一个不存在的地址
    function add(Role storage role, address account) internal {
        require(account != address(0), "Roles: account is the zero address");
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    // 删除一个存在的地址
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    // 判断地址是否有权限
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

// File: solidity-common/contracts/common/Ownable.sol

pragma solidity >=0.5.0 <0.7.0;


/**
 * 合约Owner机制
 */
contract Ownable {
    address private _owner;

    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    function isOwner(address account) public view returns (bool) {
        return account == _owner;
    }

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

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

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }


    modifier onlyOwner() {
        require(isOwner(msg.sender), "Ownable: caller is not the owner");
        _;
    }


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

// File: solidity-common/contracts/access/BlacklistedRole.sol

pragma solidity >=0.5.0 <0.7.0;





/**
 *  由owner控制,具备黑名单的合约
 */
contract BlacklistedRole is Ownable {
    using Roles for Roles.Role;
    using Array for address[];

    Roles.Role private _blacklisteds;
    address[] public blacklisteds;

    constructor () internal {}

    function _addBlacklisted(address account) internal {
        _blacklisteds.add(account);
        blacklisteds.push(account);
        emit BlacklistedAdded(account);
    }

    function addBlacklisted(address account) public onlyOwner {
        _addBlacklisted(account);
    }

    function addBlacklisted(address[] memory accounts) public onlyOwner {
        for (uint256 index = 0; index < accounts.length; index++) {
            _addBlacklisted(accounts[index]);
        }
    }

    function _delBlacklisted(address account) internal {
        _blacklisteds.remove(account);

        if (blacklisteds.remove(account)) {
            emit BlacklistedRemoved(account);
        }
    }

    function delBlacklisted(address account) public onlyOwner {
        _delBlacklisted(account);
    }

    function getBlacklistedsLength() public view returns (uint256) {
        return blacklisteds.length;
    }

    function isBlacklisted(address account) public view returns (bool) {
        return _blacklisteds.has(account);
    }


    modifier onlyBlacklisted() {
        require(isBlacklisted(msg.sender), "BlacklistedRole: caller does not have the blacklisted role");
        _;
    }

    modifier onlyNotBlacklisted(address account) {
        require(!isBlacklisted(account), "BlacklistedRole: account has the blacklisted role");
        _;
    }


    event BlacklistedAdded(address indexed account);
    event BlacklistedRemoved(address indexed account);
}

// File: solidity-common/contracts/common/DailyLimit.sol

pragma solidity >=0.5.0 <0.7.0;




/**
 * 代币每日转账额度控制机制
 */
contract DailyLimit is Ownable {
    using SafeMath for uint256;

    mapping(address => UserDailyLimit) public dailyLimits;      // 用户额度信息

    struct UserDailyLimit {
        uint256 spent;                                          // 今日已用额度
        uint256 today;                                          // 今日开始时间
        uint256 limit;                                          // 今日总共额度
    }

    constructor () internal {}

    /**
     * 查询用户每日额度信息
     */
    function getDailyLimit(address account) public view returns (uint256, uint256, uint256){
        UserDailyLimit memory dailyLimit = dailyLimits[account];
        return (dailyLimit.spent, dailyLimit.today, dailyLimit.limit);
    }

    /**
     * 设置用户每日总共额度
     */
    function _setDailyLimit(address account, uint256 limit) internal {
        require(account != address(0), "DailyLimit: account is the zero address");
        require(limit != 0, "DailyLimit: limit can not be zero");

        dailyLimits[account].limit = limit;
    }

    function setDailyLimit(address[] memory accounts, uint256[] memory limits) public onlyOwner {
        require(accounts.length == limits.length, "DailyLimit: accounts and limits length mismatched");

        for (uint256 index = 0; index < accounts.length; index++) {
            _setDailyLimit(accounts[index], limits[index]);
        }
    }

    /**
     * 今日开始时间
     */
    function today() public view returns (uint256){
        return now - (now % 1 days);
    }

    /**
     * 是否小于限制
     */
    function isUnderLimit(address account, uint256 amount) internal returns (bool){
        UserDailyLimit storage dailyLimit = dailyLimits[account];

        if (today() > dailyLimit.today) {
            dailyLimit.today = today();
            dailyLimit.spent = 0;
        }

        // A).limit为0,不用做限制 B).limit非0,需满足限制
        return (dailyLimit.limit == 0 || dailyLimit.spent.add(amount) <= dailyLimit.limit);
    }


    modifier onlyUnderLimit(address account, uint256 amount){
        require(isUnderLimit(account, amount), "DailyLimit: user's spent exceeds daily limit");
        _;
    }
}

// File: solidity-common/contracts/access/PauserRole.sol

pragma solidity >=0.5.0 <0.7.0;





/**
 * 由owner控制,具备可暂停的合约
 */
contract PauserRole is Ownable {
    using Roles for Roles.Role;
    using Array for address[];

    Roles.Role private _pausers;
    address[] public pausers;

    constructor () internal {}

    function _addPauser(address account) internal {
        _pausers.add(account);
        pausers.push(account);
        emit PauserAdded(account);
    }

    function addPauser(address account) public onlyOwner {
        _addPauser(account);
    }

    function addPauser(address[] memory accounts) public onlyOwner {
        for (uint256 index = 0; index < accounts.length; index++) {
            _addPauser(accounts[index]);
        }
    }

    function _delPauser(address account) internal {
        _pausers.remove(account);

        if (pausers.remove(account)) {
            emit PauserRemoved(account);
        }
    }

    function renouncePauser() public {
        _delPauser(msg.sender);
    }

    function delPauser(address account) public onlyOwner {
        _delPauser(account);
    }

    function getPausersLength() public view returns (uint256) {
        return pausers.length;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }


    modifier onlyPauser() {
        require(isPauser(msg.sender), "PauserRole: caller does not have the pauser role");
        _;
    }


    event PauserAdded(address indexed account);
    event PauserRemoved(address indexed account);
}

// File: solidity-common/contracts/common/Pausable.sol

pragma solidity >=0.5.0 <0.7.0;



/**
 * 紧急暂停机制
 */
contract Pausable is PauserRole {
    bool private _paused;               // 系统暂停标识

    constructor () internal {
        _paused = false;
    }

    // 暂停标识 true-禁用, false-启用
    function paused() public view returns (bool) {
        return _paused;
    }

    // 授权的访客在系统启用时,变更系统为禁用
    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    // 授权的访客在系统禁用时,变更系统为启用
    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }


    modifier whenNotPaused() {
        require(!_paused, "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(_paused, "Pausable: not paused");
        _;
    }


    event Paused(address indexed pauser);
    event Unpaused(address indexed pauser);
}

// File: solidity-common/contracts/erc20/ERC20.sol

pragma solidity >=0.5.0 <0.7.0;







/**
 * ERC20全实现合约
 */
contract ERC20 is IERC20, BlacklistedRole, DailyLimit, Pausable {
    using SafeMath for uint256;

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

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

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

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

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

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

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

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

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

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

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);

        emit Transfer(sender, recipient, amount);
    }

    function transfer(address recipient, uint256 amount) public whenNotPaused onlyNotBlacklisted(msg.sender) onlyNotBlacklisted(recipient) onlyUnderLimit(msg.sender, amount) returns (bool) {
        dailyLimits[msg.sender].spent = dailyLimits[msg.sender].spent.add(amount);
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public whenNotPaused onlyNotBlacklisted(msg.sender) onlyNotBlacklisted(sender) onlyNotBlacklisted(recipient) onlyUnderLimit(sender, amount) returns (bool) {
        uint256 delta = _allowances[sender][msg.sender].sub(amount, "ERC20: decreased allowance below zero");
        dailyLimits[sender].spent = dailyLimits[sender].spent.add(amount);
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, delta);
        return true;
    }

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

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

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public whenNotPaused onlyNotBlacklisted(msg.sender) onlyNotBlacklisted(spender) returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function approve(address spender, uint256 amount) whenNotPaused onlyNotBlacklisted(msg.sender) onlyNotBlacklisted(spender) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

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

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

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _burnFrom(address account, uint256 amount) internal {
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount, "ERC20: burn amount exceeds allowance"));
        _burn(account, amount);
    }
}

// File: solidity-common/contracts/access/WhitelistedRole.sol

pragma solidity >=0.5.0 <0.7.0;





/**
 *  由owner控制,具备白名单的合约
 */
contract WhitelistedRole is Ownable {
    using Roles for Roles.Role;
    using Array for address[];

    Roles.Role private _whitelisteds;
    address[] public whitelisteds;

    constructor () internal {}

    function _addWhitelisted(address account) internal {
        _whitelisteds.add(account);
        whitelisteds.push(account);
        emit WhitelistedAdded(account);
    }

    function addWhitelisted(address account) public onlyOwner {
        _addWhitelisted(account);
    }

    function addWhitelisted(address[] memory accounts) public onlyOwner {
        for (uint256 index = 0; index < accounts.length; index++) {
            _addWhitelisted(accounts[index]);
        }
    }

    function _delWhitelisted(address account) internal {
        _whitelisteds.remove(account);

        if (whitelisteds.remove(account)) {
            emit WhitelistedRemoved(account);
        }
    }

    function renounceWhitelisted() public {
        _delWhitelisted(msg.sender);
    }

    function delWhitelisted(address account) public onlyOwner {
        _delWhitelisted(account);
    }

    function getWhitelistedsLength() public view returns (uint256) {
        return whitelisteds.length;
    }

    function isWhitelisted(address account) public view returns (bool) {
        return _whitelisteds.has(account);
    }


    modifier onlyWhitelisted() {
        require(isWhitelisted(msg.sender), "WhitelistedRole: caller does not have the whitelisted role");
        _;
    }

    modifier onlyWhitelisting(address account) {
        require(isWhitelisted(account), "WhitelistedRole: caller does not have the whitelisted role");
        _;
    }


    event WhitelistedAdded(address indexed account);
    event WhitelistedRemoved(address indexed account);
}

// File: solidity-common/contracts/access/MinterRole.sol

pragma solidity >=0.5.0 <0.7.0;





/**
 *  由owner控制,具备动态矿工的合约
 */
contract MinterRole is Ownable {
    using Roles for Roles.Role;
    using Array for address[];

    Roles.Role private _minters;
    address[] public minters;

    constructor () internal {}

    function _addMinter(address account) internal {
        _minters.add(account);
        minters.push(account);
        emit MinterAdded(account);
    }

    function addMinter(address account) public onlyOwner {
        _addMinter(account);
    }

    function addMinter(address[] memory accounts) public onlyOwner {
        for (uint256 index = 0; index < accounts.length; index++) {
            _addMinter(accounts[index]);
        }
    }

    function _delMinter(address account) internal {
        _minters.remove(account);

        if (minters.remove(account)) {
            emit MinterRemoved(account);
        }
    }

    function renounceMinter() public {
        _delMinter(msg.sender);
    }

    function delMinter(address account) public onlyOwner {
        _delMinter(account);
    }

    function getMintersLength() public view returns (uint256) {
        return minters.length;
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.has(account);
    }


    modifier onlyMinter() {
        require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role");
        _;
    }


    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);
}

// File: contracts/interface/IBtswapFactory.sol

pragma solidity >=0.5.0 <0.7.0;


interface IBtswapFactory {
    function FEE_RATE_DENOMINATOR() external view returns (uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function feeRateNumerator() external view returns (uint256);

    function initCodeHash() external view returns (bytes32);

    function getPair(address tokenA, address tokenB) external view returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setRouter(address) external;

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function setFeeRateNumerator(uint256) external;

    function setInitCodeHash(bytes32) external;

    function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1);

    function pairFor(address factory, address tokenA, address tokenB) external view returns (address pair);

    function getReserves(address factory, address tokenA, address tokenB) external view returns (uint256 reserveA, uint256 reserveB);

    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);

    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountOut);

    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountIn);

    function getAmountsOut(address factory, uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(address factory, uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);


    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

}

// File: contracts/interface/IBtswapPairToken.sol

pragma solidity >=0.5.0 <0.7.0;


interface IBtswapPairToken {
    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function router() external view returns (address);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address, address) external;

    function price(address token) external view returns (uint256);


    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
    event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to);
    event Sync(uint112 reserve0, uint112 reserve1);

}

// File: contracts/interface/IBtswapRouter02.sol

pragma solidity >=0.5.0 <0.7.0;


interface IBtswapRouter02 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function BT() external pure returns (address);

    function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);

    function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);

    function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline) external payable returns (uint256[] memory amounts);

    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external view returns (uint256 amountB);

    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountOut);

    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);

    function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;

    function weth(address token) external view returns (uint256);

    function onTransfer(address sender, address recipient) external returns (bool);

}

// File: contracts/interface/IBtswapToken.sol

pragma solidity >=0.5.0 <0.7.0;


interface IBtswapToken {
    function swap(address account, address input, uint256 amount, address output) external returns (bool);

    function liquidity(address account, address pair) external returns (bool);

}

// File: contracts/interface/IBtswapWhitelistedRole.sol

pragma solidity >=0.5.0 <0.7.0;


interface IBtswapWhitelistedRole {
    function getWhitelistedsLength() external view returns (uint256);

    function isWhitelisted(address) external view returns (bool);

    function whitelisteds(uint256) external view returns (address);

}

// File: contracts/biz/BtswapToken.sol

pragma solidity >=0.5.0 <0.7.0;










contract BtswapToken is IBtswapToken, WhitelistedRole, MinterRole, ERC20 {
    uint256 public constant MINT_DECAY_DURATION = 8409600;
    uint256 public INITIAL_BLOCK_REWARD = SafeMath.wad().mul(56);
    uint256 public PERCENTAGE_FOR_TAKER = SafeMath.wad().mul(60).div(100);
    uint256 public PERCENTAGE_FOR_MAKER = SafeMath.wad().mul(30).div(100);
    address public constant TAKER_ADDRESS = 0x0000000000000000000000000000000000000001;
    address public constant MAKER_ADDRESS = 0x0000000000000000000000000000000000000002;
    address public constant GROUP_ADDRESS = 0x0000000000000000000000000000000000000003;

    IBtswapRouter02 private _router;

    uint256 private _initMintBlock;
    uint256 private _lastMintBlock;
    mapping(address => uint256) private _weights;

    Pool public taker;
    Pool public maker;

    struct Pool {
        uint256 timestamp;
        uint256 quantity;
        uint256 deposit;
        mapping(address => User) users;
    }

    struct User {
        uint256 timestamp;
        uint256 quantity;
        uint256 deposit;
        mapping(address => uint256) deposits;
    }

    constructor () public ERC20("BTswap Token", "BT", 18) {
        _setInitMintBlock(block.number);
        _setLastMintBlock(block.number);
        _mint(msg.sender, 50000000 * 1e18);
    }


    /**
     * dao
     */
    function router() public view returns (IBtswapRouter02) {
        return _router;
    }

    function setRouter(IBtswapRouter02 newRouter) public onlyOwner {
        require(address(newRouter) != address(0), "BtswapToken: new router is the zero address");
        _router = newRouter;
    }

    function initMintBlock() public view returns (uint256) {
        return _initMintBlock;
    }

    function _setInitMintBlock(uint256 blockNumber) internal {
        _initMintBlock = blockNumber;
    }

    function lastMintBlock() public view returns (uint256) {
        return _lastMintBlock;
    }

    function _setLastMintBlock(uint256 blockNumber) internal {
        _lastMintBlock = blockNumber;
    }

    function weightOf(address token) public view returns (uint256) {
        uint256 _weight = _weights[token];

        if (_weight > 0) {
            return _weight;
        }

        return 1;
    }

    function setWeight(address newToken, uint256 newWeight) public onlyOwner {
        require(address(newToken) != address(0), "BtswapToken: new token is the zero address");
        _weights[newToken] = newWeight;
    }


    /**
     * miner
     */
    function phase(uint256 blockNumber) public view returns (uint256) {
        uint256 _phase = 0;

        if (blockNumber > initMintBlock()) {
            _phase = (blockNumber.sub(initMintBlock()).sub(1)).div(MINT_DECAY_DURATION);
        }

        return _phase;
    }

    function phase() public view returns (uint256) {
        return phase(block.number);
    }

    function reward(uint256 blockNumber) public view returns (uint256) {
        uint256 _phase = phase(blockNumber);
        if (_phase >= 10) {
            return 0;
        }

        return INITIAL_BLOCK_REWARD.div(2 ** _phase);
    }

    function reward() public view returns (uint256) {
        return reward(block.number);
    }

    function mintable(uint256 blockNumber) public view returns (uint256) {
        uint256 _mintable = 0;
        uint256 lastMintableBlock = lastMintBlock();
        uint256 n = phase(lastMintBlock());
        uint256 m = phase(blockNumber);

        while (n < m) {
            n++;
            uint256 r = n.mul(MINT_DECAY_DURATION).add(initMintBlock());
            _mintable = _mintable.add((r.sub(lastMintableBlock)).mul(reward(r)));
            lastMintableBlock = r;
        }
        _mintable = _mintable.add((blockNumber.sub(lastMintableBlock)).mul(reward(blockNumber)));

        return _mintable;
    }

    function mint() public returns (bool) {
        if (!isMintable()) {
            return false;
        }

        uint256 _mintable = mintable(block.number);
        if (_mintable <= 0) {
            return false;
        }

        _setLastMintBlock(block.number);

        uint256 takerMintable = _mintable.wmul(PERCENTAGE_FOR_TAKER);
        uint256 makerMintable = _mintable.wmul(PERCENTAGE_FOR_MAKER);
        uint256 groupMintable = _mintable.sub(takerMintable).sub(makerMintable);

        _mint(TAKER_ADDRESS, takerMintable);
        _mint(MAKER_ADDRESS, makerMintable);
        _mint(GROUP_ADDRESS, groupMintable);

        return true;
    }


    /**
     * oracle
     */
    function weth(address token, uint256 amount) public view returns (uint256) {
        uint256 _weth = router().weth(token);
        if (_weth <= 0) {
            return 0;
        }

        return _weth.wmul(amount);
    }

    function rebalance(address account, address pair) public view returns (uint256) {
        if (!isWhitelisted(IBtswapPairToken(pair).token0()) || !isWhitelisted(IBtswapPairToken(pair).token1())) {
            return 0;
        }

        uint256 m = IBtswapPairToken(pair).totalSupply();
        uint256 n = IBtswapPairToken(pair).balanceOf(account);
        if (n <= 0 || m <= 0) {
            return 0;
        }

        (uint112 reserve0, uint112 reserve1,) = IBtswapPairToken(pair).getReserves();
        uint256 _weth0 = weth(IBtswapPairToken(pair).token0(), uint256(reserve0));
        uint256 _weight0 = weightOf(IBtswapPairToken(pair).token0());
        uint256 _weth1 = weth(IBtswapPairToken(pair).token1(), uint256(reserve1));
        uint256 _weight1 = weightOf(IBtswapPairToken(pair).token1());

        uint256 _weth = _weth0.mul(_weight0).add(_weth1.mul(_weight1));

        return _weth.mul(n).div(m);
    }


    /**
     * taker
     */
    function shareOf(address account) public view returns (uint256, uint256) {
        uint256 m = takerQuantityOfPool();
        uint256 n = takerQuantityOf(account);

        return (m, n);
    }

    function takerQuantityOfPool() public view returns (uint256) {
        return taker.quantity;
    }

    function takerTimestampOfPool() public view returns (uint256) {
        return taker.timestamp;
    }

    function takerQuantityOf(address account) public view returns (uint256) {
        return taker.users[account].quantity;
    }

    function takerTimestampOf(address account) public view returns (uint256) {
        return taker.users[account].timestamp;
    }

    function takerBalanceOf() public view returns (uint256) {
        return balanceOf(TAKER_ADDRESS);
    }

    function takerBalanceOf(address account) public view returns (uint256) {
        (uint256 m, uint256 n) = shareOf(account);
        if (n <= 0 || m <= 0) {
            return 0;
        }

        if (n == m) {
            return takerBalanceOf();
        }

        return takerBalanceOf().mul(n).div(m);
    }

    function swap(address account, address input, uint256 amount, address output) public onlyMinter returns (bool) {
        require(account != address(0), "BtswapToken: taker swap account is the zero address");
        require(input != address(0), "BtswapToken: taker swap input is the zero address");
        require(output != address(0), "BtswapToken: taker swap output is the zero address");

        // if (!isWhitelisted(input) || !isWhitelisted(output)) {
        //     return false;
        // }

        uint256 quantity = weth(input, amount);
        if (quantity <= 0) {
            return false;
        }

        mint();

        taker.timestamp = block.timestamp;
        taker.quantity = takerQuantityOfPool().add(quantity);

        User storage user = taker.users[account];
        user.timestamp = block.timestamp;
        user.quantity = takerQuantityOf(account).add(quantity);

        return true;
    }

    function _takerWithdraw(uint256 quantity) internal returns (bool) {
        require(quantity > 0, "BtswapToken: taker withdraw quantity is the zero value");
        require(takerBalanceOf() >= quantity, "BtswapToken: taker withdraw quantity exceeds taker balance");

        uint256 delta = takerQuantityOfPool();
        if (takerBalanceOf() != quantity) {
            delta = takerQuantityOfPool().mul(quantity).div(takerBalanceOf());
        }

        taker.timestamp = block.timestamp;
        taker.quantity = takerQuantityOfPool().sub(delta);

        User storage user = taker.users[msg.sender];
        user.timestamp = block.timestamp;
        user.quantity = takerQuantityOf(msg.sender).sub(delta);

        _transfer(TAKER_ADDRESS, msg.sender, quantity);

        return true;
    }

    function takerWithdraw(uint256 quantity) public returns (bool) {
        mint();

        uint256 balance = takerBalanceOf(msg.sender);
        if (quantity <= balance) {
            return _takerWithdraw(quantity);
        }

        return _takerWithdraw(balance);
    }

    function takerWithdraw() public returns (bool) {
        mint();

        uint256 balance = takerBalanceOf(msg.sender);

        return _takerWithdraw(balance);
    }


    /**
     * maker
     */
    function liquidityOf(address account) public view returns (uint256, uint256) {
        uint256 m = makerQuantityOfPool().add(makerDepositOfPool().mul(block.number.sub(makerTimestampOfPool())));
        uint256 n = makerQuantityOf(account).add(makerDepositOf(account).mul(block.number.sub(makerTimestampOf(account))));

        return (m, n);
    }

    function makerQuantityOfPool() public view returns (uint256) {
        return maker.quantity;
    }

    function makerDepositOfPool() public view returns (uint256) {
        return maker.deposit;
    }

    function makerTimestampOfPool() public view returns (uint256) {
        return maker.timestamp;
    }

    function makerQuantityOf(address account) public view returns (uint256) {
        return maker.users[account].quantity;
    }

    function makerDepositOf(address account) public view returns (uint256) {
        return maker.users[account].deposit;
    }

    function makerLastDepositOf(address account, address pair) public view returns (uint256) {
        return maker.users[account].deposits[pair];
    }

    function makerTimestampOf(address account) public view returns (uint256) {
        return maker.users[account].timestamp;
    }

    function _makerBalanceAndLiquidityOf(address account) internal view returns (uint256, uint256, uint256) {
        (uint256 m, uint256 n) = liquidityOf(account);
        if (n <= 0 || m <= 0) {
            return (0, m, n);
        }

        if (n == m) {
            return (makerBalanceOf(), m, n);
        }

        return (makerBalanceOf().mul(n).div(m), m, n);
    }

    function makerBalanceOf() public view returns (uint256) {
        return balanceOf(MAKER_ADDRESS);
    }

    function makerBalanceOf(address account) public view returns (uint256) {
        (uint256 balance, ,) = _makerBalanceAndLiquidityOf(account);
        return balance;
    }

    function liquidity(address account, address pair) public onlyRouter returns (bool) {
        require(account != address(0), "BtswapToken: maker liquidity account is the zero address");
        require(pair != address(0), "BtswapToken: maker liquidity pair is the zero address");

        mint();
        
        User storage user = maker.users[account];
        uint256 deposit = rebalance(account, pair);
        uint256 previous = makerLastDepositOf(account, pair);

        (uint256 m, uint256 n) = liquidityOf(account);
        maker.quantity = m;
        maker.timestamp = block.number;
        maker.deposit = makerDepositOfPool().add(deposit).sub(previous);

        user.quantity = n;
        user.timestamp = block.number;
        user.deposit = makerDepositOf(account).add(deposit).sub(previous);
        user.deposits[pair] = deposit;

        return true;
    }

    function _makerWithdraw(address account) internal returns (bool) {
        require(account != address(0), "BtswapToken: maker withdraw account is the zero address");

        (uint256 withdrawn, uint256 m, uint256 n) = _makerBalanceAndLiquidityOf(account);
        if (withdrawn <= 0) {
            return false;
        }

        User storage user = maker.users[account];
        maker.timestamp = block.number;
        maker.quantity = m.sub(n);
        user.timestamp = block.number;
        user.quantity = 0;

        _transfer(MAKER_ADDRESS, account, withdrawn);

        return true;
    }

    function makerWithdraw() public returns (bool) {
        mint();

        return _makerWithdraw(msg.sender);
    }


    /**
     * group
     */
    function groupBalanceOf() public view returns (uint256) {
        return balanceOf(GROUP_ADDRESS);
    }

    function groupWithdraw(address account, uint256 amount) public onlyOwner returns (bool) {
        require(account != address(0), "BtswapToken: group withdraw account is the zero address");
        require(amount > 0, "BtswapToken: group withdraw amount is the zero value");
        require(groupBalanceOf() >= amount, "BtswapToken: group withdraw amount exceeds group balance");

        _transfer(GROUP_ADDRESS, account, amount);

        return true;
    }


    /**
     * modifier
     */
    function isMintable() public view returns (bool) {
        if (block.number.sub(lastMintBlock()) > 0 && reward(lastMintBlock()) > 0) {
            return true;
        }
        return false;
    }

    function isRouter(address account) public view returns (bool) {
        return account == address(router());
    }

    modifier onlyRouter() {
        require(isRouter(msg.sender), "BtswapToken: caller is not the router");
        _;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"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":"address","name":"account","type":"address"}],"name":"BlacklistedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BlacklistedRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pauser","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pauser","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedRemoved","type":"event"},{"constant":true,"inputs":[],"name":"GROUP_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_BLOCK_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAKER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINT_DECAY_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERCENTAGE_FOR_MAKER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERCENTAGE_FOR_TAKER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TAKER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBlacklisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addBlacklisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blacklisteds","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dailyLimits","outputs":[{"internalType":"uint256","name":"spent","type":"uint256"},{"internalType":"uint256","name":"today","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delBlacklisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBlacklistedsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDailyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMintersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPausersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getWhitelistedsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"groupBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"groupWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initMintBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isMintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isRouter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastMintBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"pair","type":"address"}],"name":"liquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"liquidityOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maker","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"deposit","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"makerBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"makerDepositOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerDepositOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"pair","type":"address"}],"name":"makerLastDepositOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"makerQuantityOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerQuantityOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"makerTimestampOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerTimestampOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"makerWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"mintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minters","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pausers","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"phase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"phase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"pair","type":"address"}],"name":"rebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"router","outputs":[{"internalType":"contract IBtswapRouter02","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"limits","type":"uint256[]"}],"name":"setDailyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IBtswapRouter02","name":"newRouter","type":"address"}],"name":"setRouter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newToken","type":"address"},{"internalType":"uint256","name":"newWeight","type":"uint256"}],"name":"setWeight","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shareOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"input","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"output","type":"address"}],"name":"swap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"taker","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"deposit","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"takerBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"takerBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"takerQuantityOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"takerQuantityOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"takerTimestampOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"takerTimestampOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"takerWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"takerWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"today","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"weightOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"weth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelisteds","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040819052637df38c5b60e01b81526200008e9060389073d6e9e857b03ff8440493d8c47bbffc274616839a90637df38c5b9060849060209060048186803b1580156200004d57600080fd5b505af415801562000062573d6000803e3d6000fd5b505050506040513d60208110156200007957600080fd5b50519062000277602090811b6200353717901c565b601155620000f66064620000e2603c73d6e9e857b03ff8440493d8c47bbffc274616839a637df38c5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200004d57600080fd5b620002de60201b620037d01790919060201c565b6012556200014a6064620000e2601e73d6e9e857b03ff8440493d8c47bbffc274616839a637df38c5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200004d57600080fd5b6013553480156200015a57600080fd5b50604080518082018252600c81526b212a39bbb0b8102a37b5b2b760a11b602080830191909152825180840184526002815261109560f21b91810191909152600080546001600160a01b03191633178082559351929391926012926001600160a01b031691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600a805460ff1916905582516200020490600b90602086019062000539565b5081516200021a90600c90602085019062000539565b50600d805460ff191660ff92909216919091179055506200023d90504362000328565b62000251436001600160e01b036200032d16565b62000271336a295be96e640669720000006001600160e01b036200033216565b620005de565b6000826200028857506000620002d8565b828202828482816200029657fe5b0414620002d55760405162461bcd60e51b815260040180806020018281038252602181526020018062004feb6021913960400191505060405180910390fd5b90505b92915050565b6000620002d583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200043760201b60201c565b601555565b601655565b6001600160a01b0382166200038e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b620003aa81601054620004de60201b620035901790919060201c565b6010556001600160a01b0382166000908152600e6020908152604090912054620003df91839062003590620004de821b17901c565b6001600160a01b0383166000818152600e602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183620004c75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200048b57818101518382015260200162000471565b50505050905090810190601f168015620004b95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581620004d457fe5b0495945050505050565b600082820183811015620002d5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200057c57805160ff1916838001178555620005ac565b82800160010185558215620005ac579182015b82811115620005ac5782518255916020019190600101906200058f565b50620005ba929150620005be565b5090565b620005db91905b80821115620005ba5760008155600101620005c5565b90565b6149fd80620005ee6000396000f3fe608060405234801561001057600080fd5b50600436106105665760003560e01c806383aedf9c116102ca578063b29876531161018d578063d7b7d58b116100f4578063e9517399116100ad578063f2fde38b11610087578063f2fde38b1461128a578063f3d7d282146112b0578063f887ea40146112d6578063fe575a87146112de57610566565b8063e9517399146111bb578063ee6506e0146111e1578063f18e33e1146111e957610566565b8063d7b7d58b146110ed578063d7bffc9214611113578063d7d98b1e14611139578063dd4bc10114611141578063dd62ed3e14611167578063e509a3b81461119557610566565b8063c0d7865511610146578063c0d786551461108a578063cac4a4ab146110b0578063cc1cfa16146110b8578063ce36a8b3146110c0578063d332a781146110c8578063d6cd9473146110e557610566565b8063b29876531461103c578063b5c8195614611044578063b74e452b1461106a578063b872dd0e14611072578063b9b513d11461107a578063bb84f15b1461108257610566565b80639cf5c3f511610231578063aa271e1a116101ea578063aa271e1a14610f7e578063aacd053b14610fa4578063abe49d8a14610fd2578063af59346214610ffe578063b1c9fe6e14611006578063b22172811461100e57610566565b80639cf5c3f514610ed3578063a42091cf14610edb578063a457c2d714610ee3578063a9059cbb14610f0f578063a93783f814610f3b578063a9fb763c14610f6157610566565b806392236b111161028357806392236b1114610e8557806395d89b4114610e8d578063983b2d5614610e9557806398457ea814610ebb5780639865027514610ec35780639bffba7214610ecb57610566565b806383aedf9c14610e0d5780638456cb5914610e155780638623ec7b14610e1d57806388d1a75214610e3a5780638da5cb5b14610e605780639037a0b114610e6857610566565b80633f4ba83a1161042d5780635af993ea116103945780636fe958d81161034d578063715018a611610327578063715018a614610dcf578063782b360214610dd75780637ae21c0a14610ddf57806382dc1ec414610de757610566565b80636fe958d814610d55578063706eeba114610d8357806370a0823114610da957610566565b80635af993ea14610ba35780635c975abb14610bc0578063615b4a6014610bc85780636bf11d4a14610ceb5780636e81221c14610d115780636ef8d66d14610d4d57610566565b80634b5fe2f9116103e65780634b5fe2f914610a4f57806350655d8c14610a8857806350ad236714610aae57806355d17ee914610b4f57806356518be514610b5757806358f2ef1714610b7d57610566565b80633f4ba83a1461094a578063420a5d6c14610952578063443902811461095a57806344e1cecd146109fb57806346b45af714610a2157806346fbf68e14610a2957610566565b806321e5e2c4116104d1578063313ce5671161048a578063313ce5671461088057806333a149c11461089e578063376de2ab146108a657806339509351146108d25780633af32abf146108fe5780633c4750df1461092457610566565b806321e5e2c414610716578063227275ef14610755578063228cb733146107f657806323338b88146107fe57806323b872dd146108245780632f54bf6e1461085a57610566565b8063119c062711610523578063119c0627146106b35780631249c58b146106bb578063135f8aa7146106c357806316ea5a2c146106e057806318160ddd146106e8578063188efc16146106f057610566565b806305ba0cf11461056b57806306fdde0314610599578063095ea7b3146106165780630d5b5f0f146106565780630f7849431461067057806310154bad1461068d575b600080fd5b6105976004803603604081101561058157600080fd5b506001600160a01b038135169060200135611304565b005b6105a16113ad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105db5781810151838201526020016105c3565b50505050905090810190601f1680156106085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106426004803603604081101561062c57600080fd5b506001600160a01b038135169060200135611444565b604080519115158252519081900360200190f35b61065e611534565b60408051918252519081900360200190f35b61065e6004803603602081101561068657600080fd5b503561153a565b610597600480360360208110156106a357600080fd5b50356001600160a01b031661161f565b61065e611673565b610642611679565b61065e600480360360208110156106d957600080fd5b5035611739565b61065e611784565b61065e61178a565b6105976004803603602081101561070657600080fd5b50356001600160a01b0316611790565b61073c6004803603602081101561072c57600080fd5b50356001600160a01b03166117e1565b6040805192835260208301919091528051918290030190f35b6105976004803603602081101561076b57600080fd5b810190602081018135600160201b81111561078557600080fd5b82018360208201111561079757600080fd5b803590602001918460208302840111600160201b831117156107b857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611807945050505050565b61065e611883565b6105976004803603602081101561081457600080fd5b50356001600160a01b0316611893565b6106426004803603606081101561083a57600080fd5b506001600160a01b038135811691602081013590911690604001356118e4565b6106426004803603602081101561087057600080fd5b50356001600160a01b0316611b06565b610888611b1a565b6040805160ff9092168252519081900360200190f35b61065e611b23565b61065e600480360360408110156108bc57600080fd5b506001600160a01b038135169060200135611b29565b610642600480360360408110156108e857600080fd5b506001600160a01b038135169060200135611bde565b6106426004803603602081101561091457600080fd5b50356001600160a01b0316611cf8565b61073c6004803603602081101561093a57600080fd5b50356001600160a01b0316611d0b565b610597611d66565b61065e611e2f565b6105976004803603602081101561097057600080fd5b810190602081018135600160201b81111561098a57600080fd5b82018360208201111561099c57600080fd5b803590602001918460208302840111600160201b831117156109bd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e35945050505050565b61065e60048036036020811015610a1157600080fd5b50356001600160a01b0316611ead565b610642611ecb565b61064260048036036020811015610a3f57600080fd5b50356001600160a01b0316611f08565b610a6c60048036036020811015610a6557600080fd5b5035611f1b565b604080516001600160a01b039092168252519081900360200190f35b610a90611f42565b60408051938452602084019290925282820152519081900360600190f35b61059760048036036020811015610ac457600080fd5b810190602081018135600160201b811115610ade57600080fd5b820183602082011115610af057600080fd5b803590602001918460208302840111600160201b83111715610b1157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611f4e945050505050565b61065e611fc6565b61065e60048036036020811015610b6d57600080fd5b50356001600160a01b0316611fcc565b610a9060048036036020811015610b9357600080fd5b50356001600160a01b0316612023565b610a6c60048036036020811015610bb957600080fd5b503561207c565b610642612089565b61059760048036036040811015610bde57600080fd5b810190602081018135600160201b811115610bf857600080fd5b820183602082011115610c0a57600080fd5b803590602001918460208302840111600160201b83111715610c2b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c7a57600080fd5b820183602082011115610c8c57600080fd5b803590602001918460208302840111600160201b83111715610cad57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612092945050505050565b61059760048036036020811015610d0157600080fd5b50356001600160a01b0316612163565b61064260048036036080811015610d2757600080fd5b506001600160a01b038135811691602081013582169160408201359160600135166121b4565b61059761233d565b61065e60048036036040811015610d6b57600080fd5b506001600160a01b0381358116916020013516612348565b61065e60048036036020811015610d9957600080fd5b50356001600160a01b0316612776565b61065e60048036036020811015610dbf57600080fd5b50356001600160a01b0316612791565b6105976127ac565b610a9061283e565b61065e61284a565b61059760048036036020811015610dfd57600080fd5b50356001600160a01b0316612856565b61065e6128a7565b6105976128ad565b610a6c60048036036020811015610e3357600080fd5b5035612976565b61059760048036036020811015610e5057600080fd5b50356001600160a01b0316612983565b610a6c6129d4565b610a6c60048036036020811015610e7e57600080fd5b50356129e3565b610a6c6129f0565b6105a16129f5565b61059760048036036020811015610eab57600080fd5b50356001600160a01b0316612a56565b61065e612aa7565b610597612aad565b61065e612ab6565b61065e612ac2565b610a6c612ac8565b61064260048036036040811015610ef957600080fd5b506001600160a01b038135169060200135612acd565b61064260048036036040811015610f2557600080fd5b506001600160a01b038135169060200135612bfa565b61065e60048036036020811015610f5157600080fd5b50356001600160a01b0316612d66565b61065e60048036036020811015610f7757600080fd5b5035612d84565b61064260048036036020811015610f9457600080fd5b50356001600160a01b0316612dc2565b61065e60048036036040811015610fba57600080fd5b506001600160a01b0381358116916020013516612dd5565b61064260048036036040811015610fe857600080fd5b506001600160a01b038135169060200135612e04565b610a6c612f2d565b61065e612f32565b6106426004803603604081101561102457600080fd5b506001600160a01b0381358116916020013516612f3d565b61065e6130bf565b61065e6004803603602081101561105a57600080fd5b50356001600160a01b03166130c5565b61065e6130e3565b6106426130f0565b61065e613117565b61065e61311d565b610597600480360360208110156110a057600080fd5b50356001600160a01b0316613123565b61065e6131d2565b61065e6131d9565b61065e6131df565b610642600480360360208110156110de57600080fd5b50356131e5565b61059761321e565b6105976004803603602081101561110357600080fd5b50356001600160a01b0316613227565b610a906004803603602081101561112957600080fd5b50356001600160a01b0316613278565b610642613299565b61065e6004803603602081101561115757600080fd5b50356001600160a01b03166132ad565b61065e6004803603604081101561117d57600080fd5b506001600160a01b03813581169160200135166132d3565b61065e600480360360208110156111ab57600080fd5b50356001600160a01b03166132fe565b61065e600480360360208110156111d157600080fd5b50356001600160a01b0316613319565b61065e61332f565b610597600480360360208110156111ff57600080fd5b810190602081018135600160201b81111561121957600080fd5b82018360208201111561122b57600080fd5b803590602001918460208302840111600160201b8311171561124c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061333b945050505050565b610597600480360360208110156112a057600080fd5b50356001600160a01b03166133b3565b610642600480360360208110156112c657600080fd5b50356001600160a01b0316613404565b610a6c613429565b610642600480360360208110156112f457600080fd5b50356001600160a01b0316613438565b61130d33611b06565b61134c576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6001600160a01b0382166113915760405162461bcd60e51b815260040180806020018281038252602a8152602001806148e1602a913960400191505060405180910390fd5b6001600160a01b03909116600090815260176020526040902055565b600b8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114395780601f1061140e57610100808354040283529160200191611439565b820191906000526020600020905b81548152906001019060200180831161141c57829003601f168201915b505050505090505b90565b600a5460009060ff1615611492576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b3361149c81613438565b156114d85760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b836114e281613438565b1561151e5760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b61152933868661344b565b506001949350505050565b60125481565b60008080611546612ac2565b9050600061155a611555612ac2565b611739565b9050600061156786611739565b90505b808210156115e75760019091019060006115a4611585611b23565b611598856280520063ffffffff61353716565b9063ffffffff61359016565b90506115de6115d16115b583612d84565b6115c5848863ffffffff6135ea16565b9063ffffffff61353716565b869063ffffffff61359016565b9450925061156a565b6116136116066115f688612d84565b6115c5898763ffffffff6135ea16565b859063ffffffff61359016565b9450505050505b919050565b61162833611b06565b611667576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6116708161362c565b50565b601d5490565b6000611683611ecb565b61168f57506000611441565b600061169a4361153a565b9050600081116116ae576000915050611441565b6116b7436136b5565b60006116ce601254836136ba90919063ffffffff16565b905060006116e7601354846136ba90919063ffffffff16565b9050600061170b826116ff868663ffffffff6135ea16565b9063ffffffff6135ea16565b90506117186001846136de565b6117236002836136de565b61172e6003826136de565b600194505050505090565b600080611744611b23565b83111561177e5761177b6280520061176f60016116ff611762611b23565b889063ffffffff6135ea16565b9063ffffffff6137d016565b90505b92915050565b601c5490565b60105490565b61179933611b06565b6117d8576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613812565b60008060006117ee612aa7565b905060006117fb85611ead565b91935090915050915091565b61181033611b06565b61184f576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b60005b815181101561187f5761187782828151811061186a57fe5b602002602001015161362c565b600101611852565b5050565b600061188e43612d84565b905090565b61189c33611b06565b6118db576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6116708161389b565b600a5460009060ff1615611932576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b3361193c81613438565b156119785760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b8461198281613438565b156119be5760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b846119c881613438565b15611a045760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b8685611a1082826138f9565b611a4b5760405162461bcd60e51b815260040180806020018281038252602c81526020018061499d602c913960400191505060405180910390fd5b6000611a9b88604051806060016040528060258152602001614978602591396001600160a01b038d166000908152600f60209081526040808320338452909152902054919063ffffffff61396316565b6001600160a01b038b16600090815260076020526040902054909150611ac7908963ffffffff61359016565b6001600160a01b038b16600090815260076020526040902055611aeb8a8a8a6139fa565b611af68a338361344b565b5060019998505050505050505050565b6000546001600160a01b0390811691161490565b600d5460ff1690565b60155490565b600080611b34613429565b6001600160a01b031663be20492f856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b8957600080fd5b505afa158015611b9d573d6000803e3d6000fd5b505050506040513d6020811015611bb357600080fd5b5051905080611bc657600091505061177e565b611bd6818463ffffffff6136ba16565b949350505050565b600a5460009060ff1615611c2c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b33611c3681613438565b15611c725760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b83611c7c81613438565b15611cb85760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b336000818152600f602090815260408083206001600160a01b038a16845290915290205461152991908790611cf3908863ffffffff61359016565b61344b565b600061177e60018363ffffffff613b5816565b6000806000611d3e611d36611d2e611d21611784565b439063ffffffff6135ea16565b6115c56130bf565b611598611673565b905060006117fb611d5d611d54611d21886132fe565b6115c5886130c5565b61159887612d66565b611d6f33611f08565b611daa5760405162461bcd60e51b81526004018080602001828103825260308152602001806147fc6030913960400191505060405180910390fd5b600a5460ff16611df8576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b600a805460ff1916905560405133907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a2565b60095490565b611e3e33611b06565b611e7d576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b60005b815181101561187f57611ea5828281518110611e9857fe5b6020026020010151613bbf565b600101611e80565b6001600160a01b03166000908152601b602052604090206001015490565b600080611ed9611d21612ac2565b118015611ef557506000611ef3611eee612ac2565b612d84565b115b15611f0257506001611441565b50600090565b600061177e60088363ffffffff613b5816565b60028181548110611f2857fe5b6000918252602090912001546001600160a01b0316905081565b601c54601d54601e5483565b611f5733611b06565b611f96576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b60005b815181101561187f57611fbe828281518110611fb157fe5b6020026020010151613812565b600101611f99565b60185490565b6000806000611fda846117e1565b9092509050801580611fea575081155b15611ffa5760009250505061161a565b818114156120135761200a61332f565b9250505061161a565b611bd68261176f836115c561332f565b60008060006120306143ea565b505050506001600160a01b0381166000908152600760209081526040918290208251606081018452815480825260018301549382018490526002909201549301839052915b9193909250565b60098181548110611f2857fe5b600a5460ff1690565b61209b33611b06565b6120da576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b805182511461211a5760405162461bcd60e51b81526004018080602001828103825260318152602001806145416031913960400191505060405180910390fd5b60005b825181101561215e5761215683828151811061213557fe5b602002602001015183838151811061214957fe5b6020026020010151613c48565b60010161211d565b505050565b61216c33611b06565b6121ab576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613ce8565b60006121bf33612dc2565b6121fa5760405162461bcd60e51b815260040180806020018281038252603081526020018061460a6030913960400191505060405180910390fd5b6001600160a01b03851661223f5760405162461bcd60e51b81526004018080602001828103825260338152602001806145ac6033913960400191505060405180910390fd5b6001600160a01b0384166122845760405162461bcd60e51b81526004018080602001828103825260318152602001806147cb6031913960400191505060405180910390fd5b6001600160a01b0382166122c95760405162461bcd60e51b81526004018080602001828103825260328152602001806144b46032913960400191505060405180910390fd5b60006122d58585611b29565b9050600081116122e9576000915050611bd6565b6122f1611679565b504260185561230281611598612aa7565b6019556001600160a01b0386166000908152601b6020526040902042815561232d8261159889611ead565b6001918201559695505050505050565b61234633613d46565b565b60006123b7826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561238657600080fd5b505afa15801561239a573d6000803e3d6000fd5b505050506040513d60208110156123b057600080fd5b5051611cf8565b15806123fc57506123fa826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561238657600080fd5b155b156124095750600061177e565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561244457600080fd5b505afa158015612458573d6000803e3d6000fd5b505050506040513d602081101561246e57600080fd5b5051604080516370a0823160e01b81526001600160a01b0387811660048301529151929350600092918616916370a0823191602480820192602092909190829003018186803b1580156124c057600080fd5b505afa1580156124d4573d6000803e3d6000fd5b505050506040513d60208110156124ea57600080fd5b505190508015806124f9575081155b156125095760009250505061177e565b600080856001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561254557600080fd5b505afa158015612559573d6000803e3d6000fd5b505050506040513d606081101561256f57600080fd5b50805160209182015160408051630dfe168160e01b815290519295509093506000926125fd926001600160a01b038b1692630dfe1681926004808301939192829003018186803b1580156125c257600080fd5b505afa1580156125d6573d6000803e3d6000fd5b505050506040513d60208110156125ec57600080fd5b50516001600160701b038516611b29565b9050600061266e886001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561263d57600080fd5b505afa158015612651573d6000803e3d6000fd5b505050506040513d602081101561266757600080fd5b50516132ad565b905060006126e9896001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156126ae57600080fd5b505afa1580156126c2573d6000803e3d6000fd5b505050506040513d60208110156126d857600080fd5b50516001600160701b038616611b29565b905060006127298a6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561263d57600080fd5b90506000612750612740848463ffffffff61353716565b611598878763ffffffff61353716565b90506127668961176f838b63ffffffff61353716565b9c9b505050505050505050505050565b6001600160a01b03166000908152601b602052604090205490565b6001600160a01b03166000908152600e602052604090205490565b6127b533611b06565b6127f4576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b601854601954601a5483565b600061188e6002612791565b61285f33611b06565b61289e576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613bbf565b60045490565b6128b633611f08565b6128f15760405162461bcd60e51b81526004018080602001828103825260308152602001806147fc6030913960400191505060405180910390fd5b600a5460ff161561293c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600a805460ff1916600117905560405133907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890600090a2565b60048181548110611f2857fe5b61298c33611b06565b6129cb576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613d46565b6000546001600160a01b031690565b60068181548110611f2857fe5b600181565b600c8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114395780601f1061140e57610100808354040283529160200191611439565b612a5f33611b06565b612a9e576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613da4565b60195490565b6123463361389b565b600061188e6003612791565b60165490565b600281565b600a5460009060ff1615612b1b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b33612b2581613438565b15612b615760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b83612b6b81613438565b15612ba75760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b6115293386611cf38760405180606001604052806025815260200161497860259139336000908152600f602090815260408083206001600160a01b038f168452909152902054919063ffffffff61396316565b600a5460009060ff1615612c48576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b33612c5281613438565b15612c8e5760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b83612c9881613438565b15612cd45760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b3384612ce082826138f9565b612d1b5760405162461bcd60e51b815260040180806020018281038252602c81526020018061499d602c913960400191505060405180910390fd5b33600090815260076020526040902054612d3b908763ffffffff61359016565b33600081815260076020526040902091909155612d599088886139fa565b5060019695505050505050565b6001600160a01b03166000908152601f602052604090206001015490565b600080612d9083611739565b9050600a8110612da457600091505061161a565b601154612dbb90600283900a63ffffffff6137d016565b9392505050565b600061177e60038363ffffffff613b5816565b6001600160a01b039182166000908152601f602090815260408083209390941682526003909201909152205490565b6000612e0f33611b06565b612e4e576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6001600160a01b038316612e935760405162461bcd60e51b815260040180806020018281038252603781526020018061470c6037913960400191505060405180910390fd5b60008211612ed25760405162461bcd60e51b81526004018080602001828103825260348152602001806148ad6034913960400191505060405180910390fd5b81612edb612ab6565b1015612f185760405162461bcd60e51b815260040180806020018281038252603881526020018061482c6038913960400191505060405180910390fd5b612f24600384846139fa565b50600192915050565b600381565b600061188e43611739565b6000612f4833613404565b612f835760405162461bcd60e51b81526004018080602001828103825260258152602001806147636025913960400191505060405180910390fd5b6001600160a01b038316612fc85760405162461bcd60e51b81526004018080602001828103825260388152602001806146826038913960400191505060405180910390fd5b6001600160a01b03821661300d5760405162461bcd60e51b81526004018080602001828103825260358152602001806144e66035913960400191505060405180910390fd5b613015611679565b506001600160a01b0383166000908152601f60205260408120906130398585612348565b905060006130478686612dd5565b905060008061305588611d0b565b601d82905543601c559092509050613073836116ff866115986130bf565b601e5560018501819055438555613091836116ff866115988c6130c5565b60028601555050506001600160a01b0384166000908152600390920160205260409091205550600192915050565b601e5490565b6001600160a01b03166000908152601f602052604090206002015490565b6201518042908106900390565b60006130fa611679565b50600061310633611fcc565b905061311181613e2d565b91505090565b60025490565b60065490565b61312c33611b06565b61316b576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6001600160a01b0381166131b05760405162461bcd60e51b815260040180806020018281038252602b8152602001806145df602b913960400191505060405180910390fd5b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6280520081565b60115481565b60135481565b60006131ef611679565b5060006131fb33611fcc565b90508083116132155761320d83613e2d565b91505061161a565b612dbb81613e2d565b61234633613ce8565b61323033611b06565b61326f576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613f3a565b60076020526000908152604090208054600182015460029092015490919083565b60006132a3611679565b5061188e33613f98565b6001600160a01b0381166000908152601760205260408120548015612f2457905061161a565b6001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b6001600160a01b03166000908152601f602052604090205490565b60008061332583614058565b5090949350505050565b600061188e6001612791565b61334433611b06565b613383576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b60005b815181101561187f576133ab82828151811061339e57fe5b6020026020010151613da4565b600101613386565b6133bc33611b06565b6133fb576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b611670816140c3565b600061340e613429565b6001600160a01b0316826001600160a01b0316149050919050565b6014546001600160a01b031690565b600061177e60058363ffffffff613b5816565b6001600160a01b0383166134905760405162461bcd60e51b81526004018080602001828103825260248152602001806148896024913960400191505060405180910390fd5b6001600160a01b0382166134d55760405162461bcd60e51b81526004018080602001828103825260228152602001806144926022913960400191505060405180910390fd5b6001600160a01b038084166000818152600f6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000826135465750600061177e565b8282028284828161355357fe5b0414612dbb5760405162461bcd60e51b81526004018080602001828103825260218152602001806146eb6021913960400191505060405180910390fd5b600082820183811015612dbb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000612dbb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613963565b61363d60018263ffffffff61416316565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b03841690811790915560405190917fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f91a250565b601655565b6000670de0b6b3a76400006136cf8484613537565b816136d657fe5b049392505050565b6001600160a01b038216613739576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60105461374c908263ffffffff61359016565b6010556001600160a01b0382166000908152600e6020526040902054613778908263ffffffff61359016565b6001600160a01b0383166000818152600e602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000612dbb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614229565b61382360058263ffffffff61416316565b6006805460018101825560009182527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b03841690811790915560405190917fdbe320accb74107e8da655fa6a1e2b454c3102a3985d4201aba99308881a410a91a250565b6138ac60038263ffffffff61428e16565b6138bd60048263ffffffff6142f516565b15611670576040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b6001600160a01b0382166000908152600760205260408120600181015461391e6130e3565b11156139365761392c6130e3565b6001820155600081555b60028101541580611bd6575060028101548154613959908563ffffffff61359016565b1115949350505050565b600081848411156139f25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139b757818101518382015260200161399f565b50505050905090810190601f1680156139e45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038316613a3f5760405162461bcd60e51b81526004018080602001828103825260258152602001806148646025913960400191505060405180910390fd5b6001600160a01b038216613a845760405162461bcd60e51b81526004018080602001828103825260238152602001806144496023913960400191505060405180910390fd5b613ac78160405180606001604052806026815260200161451b602691396001600160a01b0386166000908152600e6020526040902054919063ffffffff61396316565b6001600160a01b038085166000908152600e60205260408082209390935590841681522054613afc908263ffffffff61359016565b6001600160a01b038084166000818152600e602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60006001600160a01b038216613b9f5760405162461bcd60e51b81526004018080602001828103825260228152602001806147a96022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b613bd060088263ffffffff61416316565b6009805460018101825560009182527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319166001600160a01b03841690811790915560405190917f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f891a250565b6001600160a01b038216613c8d5760405162461bcd60e51b815260040180806020018281038252602781526020018061463a6027913960400191505060405180910390fd5b80613cc95760405162461bcd60e51b81526004018080602001828103825260218152602001806147886021913960400191505060405180910390fd5b6001600160a01b03909116600090815260076020526040902060020155565b613cf960018263ffffffff61428e16565b613d0a60028263ffffffff6142f516565b15611670576040516001600160a01b038216907f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b690600090a250565b613d5760088263ffffffff61428e16565b613d6860098263ffffffff6142f516565b15611670576040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b613db560038263ffffffff61416316565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b03841690811790915560405190917f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f691a250565b6000808211613e6d5760405162461bcd60e51b815260040180806020018281038252603681526020018061490b6036913960400191505060405180910390fd5b81613e7661332f565b1015613eb35760405162461bcd60e51b815260040180806020018281038252603a815260200180614572603a913960400191505060405180910390fd5b6000613ebd612aa7565b905082613ec861332f565b14613ee757613ee4613ed861332f565b61176f856115c5612aa7565b90505b42601855613ef7816116ff612aa7565b601955336000818152601b6020526040902042815590613f1c9083906116ff90611ead565b8160010181905550613f30600133866139fa565b5060019392505050565b613f4b60058263ffffffff61428e16565b613f5c60068263ffffffff6142f516565b15611670576040516001600160a01b038216907ff38e60871ec534937251cd91cad807e15f55f1f6815128faecc256e71994b49790600090a250565b60006001600160a01b038216613fdf5760405162461bcd60e51b81526004018080602001828103825260378152602001806149416037913960400191505060405180910390fd5b6000806000613fed85614058565b92509250925060008311614007576000935050505061161a565b6001600160a01b0385166000908152601f6020526040902043601c55614033838363ffffffff6135ea16565b601d554381556000600182015561404c600287866139fa565b50600195945050505050565b600080600080600061406986611d0b565b9092509050801580614079575081155b1561408c57600094509092509050612075565b818114156140a85761409c61284a565b94509092509050612075565b6140b88261176f836115c561284a565b969195509350915050565b6001600160a01b0381166141085760405162461bcd60e51b815260040180806020018281038252602681526020018061446c6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166141a85760405162461bcd60e51b81526004018080602001828103825260228152602001806147a96022913960400191505060405180910390fd5b6141b28282613b58565b15614204576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b600081836142785760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156139b757818101518382015260200161399f565b50600083858161428457fe5b0495945050505050565b6142988282613b58565b6142d35760405162461bcd60e51b81526004018080602001828103825260218152602001806146616021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000805b83548110156143e057826001600160a01b031684828154811061431857fe5b6000918252602090912001546001600160a01b031614156143d85783818154811061433f57fe5b600091825260209091200180546001600160a01b031916905583548490600019810190811061436a57fe5b9060005260206000200160009054906101000a90046001600160a01b031684828154811061439457fe5b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905583546143cd85600019830161440b565b50600191505061177e565b6001016142f9565b5060009392505050565b60405180606001604052806000815260200160008152602001600081525090565b81548183558181111561215e5760008381526020902061215e91810190830161144191905b808211156144445760008155600101614430565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373427473776170546f6b656e3a2074616b65722073776170206f757470757420697320746865207a65726f2061646472657373427473776170546f6b656e3a206d616b6572206c6971756964697479207061697220697320746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654461696c794c696d69743a206163636f756e747320616e64206c696d697473206c656e677468206d69736d617463686564427473776170546f6b656e3a2074616b6572207769746864726177207175616e7469747920657863656564732074616b65722062616c616e6365427473776170546f6b656e3a2074616b65722073776170206163636f756e7420697320746865207a65726f2061646472657373427473776170546f6b656e3a206e657720726f7574657220697320746865207a65726f20616464726573734d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c654461696c794c696d69743a206163636f756e7420697320746865207a65726f2061646472657373526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65427473776170546f6b656e3a206d616b6572206c6971756964697479206163636f756e7420697320746865207a65726f2061646472657373426c61636b6c6973746564526f6c653a206163636f756e74206861732074686520626c61636b6c697374656420726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77427473776170546f6b656e3a2067726f7570207769746864726177206163636f756e7420697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572427473776170546f6b656e3a2063616c6c6572206973206e6f742074686520726f757465724461696c794c696d69743a206c696d69742063616e206e6f74206265207a65726f526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373427473776170546f6b656e3a2074616b6572207377617020696e70757420697320746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652070617573657220726f6c65427473776170546f6b656e3a2067726f757020776974686472617720616d6f756e7420657863656564732067726f75702062616c616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373427473776170546f6b656e3a2067726f757020776974686472617720616d6f756e7420697320746865207a65726f2076616c7565427473776170546f6b656e3a206e657720746f6b656e20697320746865207a65726f2061646472657373427473776170546f6b656e3a2074616b6572207769746864726177207175616e7469747920697320746865207a65726f2076616c7565427473776170546f6b656e3a206d616b6572207769746864726177206163636f756e7420697320746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4461696c794c696d69743a20757365722773207370656e742065786365656473206461696c79206c696d6974a265627a7a723158208ad2edf037e5cf92806ccfca6eaf984958938e89bb898b6cae266c759ff3264864736f6c63430005100032536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106105665760003560e01c806383aedf9c116102ca578063b29876531161018d578063d7b7d58b116100f4578063e9517399116100ad578063f2fde38b11610087578063f2fde38b1461128a578063f3d7d282146112b0578063f887ea40146112d6578063fe575a87146112de57610566565b8063e9517399146111bb578063ee6506e0146111e1578063f18e33e1146111e957610566565b8063d7b7d58b146110ed578063d7bffc9214611113578063d7d98b1e14611139578063dd4bc10114611141578063dd62ed3e14611167578063e509a3b81461119557610566565b8063c0d7865511610146578063c0d786551461108a578063cac4a4ab146110b0578063cc1cfa16146110b8578063ce36a8b3146110c0578063d332a781146110c8578063d6cd9473146110e557610566565b8063b29876531461103c578063b5c8195614611044578063b74e452b1461106a578063b872dd0e14611072578063b9b513d11461107a578063bb84f15b1461108257610566565b80639cf5c3f511610231578063aa271e1a116101ea578063aa271e1a14610f7e578063aacd053b14610fa4578063abe49d8a14610fd2578063af59346214610ffe578063b1c9fe6e14611006578063b22172811461100e57610566565b80639cf5c3f514610ed3578063a42091cf14610edb578063a457c2d714610ee3578063a9059cbb14610f0f578063a93783f814610f3b578063a9fb763c14610f6157610566565b806392236b111161028357806392236b1114610e8557806395d89b4114610e8d578063983b2d5614610e9557806398457ea814610ebb5780639865027514610ec35780639bffba7214610ecb57610566565b806383aedf9c14610e0d5780638456cb5914610e155780638623ec7b14610e1d57806388d1a75214610e3a5780638da5cb5b14610e605780639037a0b114610e6857610566565b80633f4ba83a1161042d5780635af993ea116103945780636fe958d81161034d578063715018a611610327578063715018a614610dcf578063782b360214610dd75780637ae21c0a14610ddf57806382dc1ec414610de757610566565b80636fe958d814610d55578063706eeba114610d8357806370a0823114610da957610566565b80635af993ea14610ba35780635c975abb14610bc0578063615b4a6014610bc85780636bf11d4a14610ceb5780636e81221c14610d115780636ef8d66d14610d4d57610566565b80634b5fe2f9116103e65780634b5fe2f914610a4f57806350655d8c14610a8857806350ad236714610aae57806355d17ee914610b4f57806356518be514610b5757806358f2ef1714610b7d57610566565b80633f4ba83a1461094a578063420a5d6c14610952578063443902811461095a57806344e1cecd146109fb57806346b45af714610a2157806346fbf68e14610a2957610566565b806321e5e2c4116104d1578063313ce5671161048a578063313ce5671461088057806333a149c11461089e578063376de2ab146108a657806339509351146108d25780633af32abf146108fe5780633c4750df1461092457610566565b806321e5e2c414610716578063227275ef14610755578063228cb733146107f657806323338b88146107fe57806323b872dd146108245780632f54bf6e1461085a57610566565b8063119c062711610523578063119c0627146106b35780631249c58b146106bb578063135f8aa7146106c357806316ea5a2c146106e057806318160ddd146106e8578063188efc16146106f057610566565b806305ba0cf11461056b57806306fdde0314610599578063095ea7b3146106165780630d5b5f0f146106565780630f7849431461067057806310154bad1461068d575b600080fd5b6105976004803603604081101561058157600080fd5b506001600160a01b038135169060200135611304565b005b6105a16113ad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105db5781810151838201526020016105c3565b50505050905090810190601f1680156106085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106426004803603604081101561062c57600080fd5b506001600160a01b038135169060200135611444565b604080519115158252519081900360200190f35b61065e611534565b60408051918252519081900360200190f35b61065e6004803603602081101561068657600080fd5b503561153a565b610597600480360360208110156106a357600080fd5b50356001600160a01b031661161f565b61065e611673565b610642611679565b61065e600480360360208110156106d957600080fd5b5035611739565b61065e611784565b61065e61178a565b6105976004803603602081101561070657600080fd5b50356001600160a01b0316611790565b61073c6004803603602081101561072c57600080fd5b50356001600160a01b03166117e1565b6040805192835260208301919091528051918290030190f35b6105976004803603602081101561076b57600080fd5b810190602081018135600160201b81111561078557600080fd5b82018360208201111561079757600080fd5b803590602001918460208302840111600160201b831117156107b857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611807945050505050565b61065e611883565b6105976004803603602081101561081457600080fd5b50356001600160a01b0316611893565b6106426004803603606081101561083a57600080fd5b506001600160a01b038135811691602081013590911690604001356118e4565b6106426004803603602081101561087057600080fd5b50356001600160a01b0316611b06565b610888611b1a565b6040805160ff9092168252519081900360200190f35b61065e611b23565b61065e600480360360408110156108bc57600080fd5b506001600160a01b038135169060200135611b29565b610642600480360360408110156108e857600080fd5b506001600160a01b038135169060200135611bde565b6106426004803603602081101561091457600080fd5b50356001600160a01b0316611cf8565b61073c6004803603602081101561093a57600080fd5b50356001600160a01b0316611d0b565b610597611d66565b61065e611e2f565b6105976004803603602081101561097057600080fd5b810190602081018135600160201b81111561098a57600080fd5b82018360208201111561099c57600080fd5b803590602001918460208302840111600160201b831117156109bd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e35945050505050565b61065e60048036036020811015610a1157600080fd5b50356001600160a01b0316611ead565b610642611ecb565b61064260048036036020811015610a3f57600080fd5b50356001600160a01b0316611f08565b610a6c60048036036020811015610a6557600080fd5b5035611f1b565b604080516001600160a01b039092168252519081900360200190f35b610a90611f42565b60408051938452602084019290925282820152519081900360600190f35b61059760048036036020811015610ac457600080fd5b810190602081018135600160201b811115610ade57600080fd5b820183602082011115610af057600080fd5b803590602001918460208302840111600160201b83111715610b1157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611f4e945050505050565b61065e611fc6565b61065e60048036036020811015610b6d57600080fd5b50356001600160a01b0316611fcc565b610a9060048036036020811015610b9357600080fd5b50356001600160a01b0316612023565b610a6c60048036036020811015610bb957600080fd5b503561207c565b610642612089565b61059760048036036040811015610bde57600080fd5b810190602081018135600160201b811115610bf857600080fd5b820183602082011115610c0a57600080fd5b803590602001918460208302840111600160201b83111715610c2b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c7a57600080fd5b820183602082011115610c8c57600080fd5b803590602001918460208302840111600160201b83111715610cad57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612092945050505050565b61059760048036036020811015610d0157600080fd5b50356001600160a01b0316612163565b61064260048036036080811015610d2757600080fd5b506001600160a01b038135811691602081013582169160408201359160600135166121b4565b61059761233d565b61065e60048036036040811015610d6b57600080fd5b506001600160a01b0381358116916020013516612348565b61065e60048036036020811015610d9957600080fd5b50356001600160a01b0316612776565b61065e60048036036020811015610dbf57600080fd5b50356001600160a01b0316612791565b6105976127ac565b610a9061283e565b61065e61284a565b61059760048036036020811015610dfd57600080fd5b50356001600160a01b0316612856565b61065e6128a7565b6105976128ad565b610a6c60048036036020811015610e3357600080fd5b5035612976565b61059760048036036020811015610e5057600080fd5b50356001600160a01b0316612983565b610a6c6129d4565b610a6c60048036036020811015610e7e57600080fd5b50356129e3565b610a6c6129f0565b6105a16129f5565b61059760048036036020811015610eab57600080fd5b50356001600160a01b0316612a56565b61065e612aa7565b610597612aad565b61065e612ab6565b61065e612ac2565b610a6c612ac8565b61064260048036036040811015610ef957600080fd5b506001600160a01b038135169060200135612acd565b61064260048036036040811015610f2557600080fd5b506001600160a01b038135169060200135612bfa565b61065e60048036036020811015610f5157600080fd5b50356001600160a01b0316612d66565b61065e60048036036020811015610f7757600080fd5b5035612d84565b61064260048036036020811015610f9457600080fd5b50356001600160a01b0316612dc2565b61065e60048036036040811015610fba57600080fd5b506001600160a01b0381358116916020013516612dd5565b61064260048036036040811015610fe857600080fd5b506001600160a01b038135169060200135612e04565b610a6c612f2d565b61065e612f32565b6106426004803603604081101561102457600080fd5b506001600160a01b0381358116916020013516612f3d565b61065e6130bf565b61065e6004803603602081101561105a57600080fd5b50356001600160a01b03166130c5565b61065e6130e3565b6106426130f0565b61065e613117565b61065e61311d565b610597600480360360208110156110a057600080fd5b50356001600160a01b0316613123565b61065e6131d2565b61065e6131d9565b61065e6131df565b610642600480360360208110156110de57600080fd5b50356131e5565b61059761321e565b6105976004803603602081101561110357600080fd5b50356001600160a01b0316613227565b610a906004803603602081101561112957600080fd5b50356001600160a01b0316613278565b610642613299565b61065e6004803603602081101561115757600080fd5b50356001600160a01b03166132ad565b61065e6004803603604081101561117d57600080fd5b506001600160a01b03813581169160200135166132d3565b61065e600480360360208110156111ab57600080fd5b50356001600160a01b03166132fe565b61065e600480360360208110156111d157600080fd5b50356001600160a01b0316613319565b61065e61332f565b610597600480360360208110156111ff57600080fd5b810190602081018135600160201b81111561121957600080fd5b82018360208201111561122b57600080fd5b803590602001918460208302840111600160201b8311171561124c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061333b945050505050565b610597600480360360208110156112a057600080fd5b50356001600160a01b03166133b3565b610642600480360360208110156112c657600080fd5b50356001600160a01b0316613404565b610a6c613429565b610642600480360360208110156112f457600080fd5b50356001600160a01b0316613438565b61130d33611b06565b61134c576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6001600160a01b0382166113915760405162461bcd60e51b815260040180806020018281038252602a8152602001806148e1602a913960400191505060405180910390fd5b6001600160a01b03909116600090815260176020526040902055565b600b8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114395780601f1061140e57610100808354040283529160200191611439565b820191906000526020600020905b81548152906001019060200180831161141c57829003601f168201915b505050505090505b90565b600a5460009060ff1615611492576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b3361149c81613438565b156114d85760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b836114e281613438565b1561151e5760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b61152933868661344b565b506001949350505050565b60125481565b60008080611546612ac2565b9050600061155a611555612ac2565b611739565b9050600061156786611739565b90505b808210156115e75760019091019060006115a4611585611b23565b611598856280520063ffffffff61353716565b9063ffffffff61359016565b90506115de6115d16115b583612d84565b6115c5848863ffffffff6135ea16565b9063ffffffff61353716565b869063ffffffff61359016565b9450925061156a565b6116136116066115f688612d84565b6115c5898763ffffffff6135ea16565b859063ffffffff61359016565b9450505050505b919050565b61162833611b06565b611667576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6116708161362c565b50565b601d5490565b6000611683611ecb565b61168f57506000611441565b600061169a4361153a565b9050600081116116ae576000915050611441565b6116b7436136b5565b60006116ce601254836136ba90919063ffffffff16565b905060006116e7601354846136ba90919063ffffffff16565b9050600061170b826116ff868663ffffffff6135ea16565b9063ffffffff6135ea16565b90506117186001846136de565b6117236002836136de565b61172e6003826136de565b600194505050505090565b600080611744611b23565b83111561177e5761177b6280520061176f60016116ff611762611b23565b889063ffffffff6135ea16565b9063ffffffff6137d016565b90505b92915050565b601c5490565b60105490565b61179933611b06565b6117d8576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613812565b60008060006117ee612aa7565b905060006117fb85611ead565b91935090915050915091565b61181033611b06565b61184f576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b60005b815181101561187f5761187782828151811061186a57fe5b602002602001015161362c565b600101611852565b5050565b600061188e43612d84565b905090565b61189c33611b06565b6118db576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6116708161389b565b600a5460009060ff1615611932576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b3361193c81613438565b156119785760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b8461198281613438565b156119be5760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b846119c881613438565b15611a045760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b8685611a1082826138f9565b611a4b5760405162461bcd60e51b815260040180806020018281038252602c81526020018061499d602c913960400191505060405180910390fd5b6000611a9b88604051806060016040528060258152602001614978602591396001600160a01b038d166000908152600f60209081526040808320338452909152902054919063ffffffff61396316565b6001600160a01b038b16600090815260076020526040902054909150611ac7908963ffffffff61359016565b6001600160a01b038b16600090815260076020526040902055611aeb8a8a8a6139fa565b611af68a338361344b565b5060019998505050505050505050565b6000546001600160a01b0390811691161490565b600d5460ff1690565b60155490565b600080611b34613429565b6001600160a01b031663be20492f856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b8957600080fd5b505afa158015611b9d573d6000803e3d6000fd5b505050506040513d6020811015611bb357600080fd5b5051905080611bc657600091505061177e565b611bd6818463ffffffff6136ba16565b949350505050565b600a5460009060ff1615611c2c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b33611c3681613438565b15611c725760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b83611c7c81613438565b15611cb85760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b336000818152600f602090815260408083206001600160a01b038a16845290915290205461152991908790611cf3908863ffffffff61359016565b61344b565b600061177e60018363ffffffff613b5816565b6000806000611d3e611d36611d2e611d21611784565b439063ffffffff6135ea16565b6115c56130bf565b611598611673565b905060006117fb611d5d611d54611d21886132fe565b6115c5886130c5565b61159887612d66565b611d6f33611f08565b611daa5760405162461bcd60e51b81526004018080602001828103825260308152602001806147fc6030913960400191505060405180910390fd5b600a5460ff16611df8576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b600a805460ff1916905560405133907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a2565b60095490565b611e3e33611b06565b611e7d576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b60005b815181101561187f57611ea5828281518110611e9857fe5b6020026020010151613bbf565b600101611e80565b6001600160a01b03166000908152601b602052604090206001015490565b600080611ed9611d21612ac2565b118015611ef557506000611ef3611eee612ac2565b612d84565b115b15611f0257506001611441565b50600090565b600061177e60088363ffffffff613b5816565b60028181548110611f2857fe5b6000918252602090912001546001600160a01b0316905081565b601c54601d54601e5483565b611f5733611b06565b611f96576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b60005b815181101561187f57611fbe828281518110611fb157fe5b6020026020010151613812565b600101611f99565b60185490565b6000806000611fda846117e1565b9092509050801580611fea575081155b15611ffa5760009250505061161a565b818114156120135761200a61332f565b9250505061161a565b611bd68261176f836115c561332f565b60008060006120306143ea565b505050506001600160a01b0381166000908152600760209081526040918290208251606081018452815480825260018301549382018490526002909201549301839052915b9193909250565b60098181548110611f2857fe5b600a5460ff1690565b61209b33611b06565b6120da576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b805182511461211a5760405162461bcd60e51b81526004018080602001828103825260318152602001806145416031913960400191505060405180910390fd5b60005b825181101561215e5761215683828151811061213557fe5b602002602001015183838151811061214957fe5b6020026020010151613c48565b60010161211d565b505050565b61216c33611b06565b6121ab576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613ce8565b60006121bf33612dc2565b6121fa5760405162461bcd60e51b815260040180806020018281038252603081526020018061460a6030913960400191505060405180910390fd5b6001600160a01b03851661223f5760405162461bcd60e51b81526004018080602001828103825260338152602001806145ac6033913960400191505060405180910390fd5b6001600160a01b0384166122845760405162461bcd60e51b81526004018080602001828103825260318152602001806147cb6031913960400191505060405180910390fd5b6001600160a01b0382166122c95760405162461bcd60e51b81526004018080602001828103825260328152602001806144b46032913960400191505060405180910390fd5b60006122d58585611b29565b9050600081116122e9576000915050611bd6565b6122f1611679565b504260185561230281611598612aa7565b6019556001600160a01b0386166000908152601b6020526040902042815561232d8261159889611ead565b6001918201559695505050505050565b61234633613d46565b565b60006123b7826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561238657600080fd5b505afa15801561239a573d6000803e3d6000fd5b505050506040513d60208110156123b057600080fd5b5051611cf8565b15806123fc57506123fa826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561238657600080fd5b155b156124095750600061177e565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561244457600080fd5b505afa158015612458573d6000803e3d6000fd5b505050506040513d602081101561246e57600080fd5b5051604080516370a0823160e01b81526001600160a01b0387811660048301529151929350600092918616916370a0823191602480820192602092909190829003018186803b1580156124c057600080fd5b505afa1580156124d4573d6000803e3d6000fd5b505050506040513d60208110156124ea57600080fd5b505190508015806124f9575081155b156125095760009250505061177e565b600080856001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561254557600080fd5b505afa158015612559573d6000803e3d6000fd5b505050506040513d606081101561256f57600080fd5b50805160209182015160408051630dfe168160e01b815290519295509093506000926125fd926001600160a01b038b1692630dfe1681926004808301939192829003018186803b1580156125c257600080fd5b505afa1580156125d6573d6000803e3d6000fd5b505050506040513d60208110156125ec57600080fd5b50516001600160701b038516611b29565b9050600061266e886001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561263d57600080fd5b505afa158015612651573d6000803e3d6000fd5b505050506040513d602081101561266757600080fd5b50516132ad565b905060006126e9896001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156126ae57600080fd5b505afa1580156126c2573d6000803e3d6000fd5b505050506040513d60208110156126d857600080fd5b50516001600160701b038616611b29565b905060006127298a6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561263d57600080fd5b90506000612750612740848463ffffffff61353716565b611598878763ffffffff61353716565b90506127668961176f838b63ffffffff61353716565b9c9b505050505050505050505050565b6001600160a01b03166000908152601b602052604090205490565b6001600160a01b03166000908152600e602052604090205490565b6127b533611b06565b6127f4576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b601854601954601a5483565b600061188e6002612791565b61285f33611b06565b61289e576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613bbf565b60045490565b6128b633611f08565b6128f15760405162461bcd60e51b81526004018080602001828103825260308152602001806147fc6030913960400191505060405180910390fd5b600a5460ff161561293c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600a805460ff1916600117905560405133907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890600090a2565b60048181548110611f2857fe5b61298c33611b06565b6129cb576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613d46565b6000546001600160a01b031690565b60068181548110611f2857fe5b600181565b600c8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114395780601f1061140e57610100808354040283529160200191611439565b612a5f33611b06565b612a9e576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613da4565b60195490565b6123463361389b565b600061188e6003612791565b60165490565b600281565b600a5460009060ff1615612b1b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b33612b2581613438565b15612b615760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b83612b6b81613438565b15612ba75760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b6115293386611cf38760405180606001604052806025815260200161497860259139336000908152600f602090815260408083206001600160a01b038f168452909152902054919063ffffffff61396316565b600a5460009060ff1615612c48576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b33612c5281613438565b15612c8e5760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b83612c9881613438565b15612cd45760405162461bcd60e51b81526004018080602001828103825260318152602001806146ba6031913960400191505060405180910390fd5b3384612ce082826138f9565b612d1b5760405162461bcd60e51b815260040180806020018281038252602c81526020018061499d602c913960400191505060405180910390fd5b33600090815260076020526040902054612d3b908763ffffffff61359016565b33600081815260076020526040902091909155612d599088886139fa565b5060019695505050505050565b6001600160a01b03166000908152601f602052604090206001015490565b600080612d9083611739565b9050600a8110612da457600091505061161a565b601154612dbb90600283900a63ffffffff6137d016565b9392505050565b600061177e60038363ffffffff613b5816565b6001600160a01b039182166000908152601f602090815260408083209390941682526003909201909152205490565b6000612e0f33611b06565b612e4e576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6001600160a01b038316612e935760405162461bcd60e51b815260040180806020018281038252603781526020018061470c6037913960400191505060405180910390fd5b60008211612ed25760405162461bcd60e51b81526004018080602001828103825260348152602001806148ad6034913960400191505060405180910390fd5b81612edb612ab6565b1015612f185760405162461bcd60e51b815260040180806020018281038252603881526020018061482c6038913960400191505060405180910390fd5b612f24600384846139fa565b50600192915050565b600381565b600061188e43611739565b6000612f4833613404565b612f835760405162461bcd60e51b81526004018080602001828103825260258152602001806147636025913960400191505060405180910390fd5b6001600160a01b038316612fc85760405162461bcd60e51b81526004018080602001828103825260388152602001806146826038913960400191505060405180910390fd5b6001600160a01b03821661300d5760405162461bcd60e51b81526004018080602001828103825260358152602001806144e66035913960400191505060405180910390fd5b613015611679565b506001600160a01b0383166000908152601f60205260408120906130398585612348565b905060006130478686612dd5565b905060008061305588611d0b565b601d82905543601c559092509050613073836116ff866115986130bf565b601e5560018501819055438555613091836116ff866115988c6130c5565b60028601555050506001600160a01b0384166000908152600390920160205260409091205550600192915050565b601e5490565b6001600160a01b03166000908152601f602052604090206002015490565b6201518042908106900390565b60006130fa611679565b50600061310633611fcc565b905061311181613e2d565b91505090565b60025490565b60065490565b61312c33611b06565b61316b576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b6001600160a01b0381166131b05760405162461bcd60e51b815260040180806020018281038252602b8152602001806145df602b913960400191505060405180910390fd5b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6280520081565b60115481565b60135481565b60006131ef611679565b5060006131fb33611fcc565b90508083116132155761320d83613e2d565b91505061161a565b612dbb81613e2d565b61234633613ce8565b61323033611b06565b61326f576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b61167081613f3a565b60076020526000908152604090208054600182015460029092015490919083565b60006132a3611679565b5061188e33613f98565b6001600160a01b0381166000908152601760205260408120548015612f2457905061161a565b6001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b6001600160a01b03166000908152601f602052604090205490565b60008061332583614058565b5090949350505050565b600061188e6001612791565b61334433611b06565b613383576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b60005b815181101561187f576133ab82828151811061339e57fe5b6020026020010151613da4565b600101613386565b6133bc33611b06565b6133fb576040805162461bcd60e51b81526020600482018190526024820152600080516020614743833981519152604482015290519081900360640190fd5b611670816140c3565b600061340e613429565b6001600160a01b0316826001600160a01b0316149050919050565b6014546001600160a01b031690565b600061177e60058363ffffffff613b5816565b6001600160a01b0383166134905760405162461bcd60e51b81526004018080602001828103825260248152602001806148896024913960400191505060405180910390fd5b6001600160a01b0382166134d55760405162461bcd60e51b81526004018080602001828103825260228152602001806144926022913960400191505060405180910390fd5b6001600160a01b038084166000818152600f6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000826135465750600061177e565b8282028284828161355357fe5b0414612dbb5760405162461bcd60e51b81526004018080602001828103825260218152602001806146eb6021913960400191505060405180910390fd5b600082820183811015612dbb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000612dbb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613963565b61363d60018263ffffffff61416316565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b03841690811790915560405190917fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f91a250565b601655565b6000670de0b6b3a76400006136cf8484613537565b816136d657fe5b049392505050565b6001600160a01b038216613739576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60105461374c908263ffffffff61359016565b6010556001600160a01b0382166000908152600e6020526040902054613778908263ffffffff61359016565b6001600160a01b0383166000818152600e602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000612dbb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614229565b61382360058263ffffffff61416316565b6006805460018101825560009182527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b03841690811790915560405190917fdbe320accb74107e8da655fa6a1e2b454c3102a3985d4201aba99308881a410a91a250565b6138ac60038263ffffffff61428e16565b6138bd60048263ffffffff6142f516565b15611670576040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b6001600160a01b0382166000908152600760205260408120600181015461391e6130e3565b11156139365761392c6130e3565b6001820155600081555b60028101541580611bd6575060028101548154613959908563ffffffff61359016565b1115949350505050565b600081848411156139f25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139b757818101518382015260200161399f565b50505050905090810190601f1680156139e45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038316613a3f5760405162461bcd60e51b81526004018080602001828103825260258152602001806148646025913960400191505060405180910390fd5b6001600160a01b038216613a845760405162461bcd60e51b81526004018080602001828103825260238152602001806144496023913960400191505060405180910390fd5b613ac78160405180606001604052806026815260200161451b602691396001600160a01b0386166000908152600e6020526040902054919063ffffffff61396316565b6001600160a01b038085166000908152600e60205260408082209390935590841681522054613afc908263ffffffff61359016565b6001600160a01b038084166000818152600e602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60006001600160a01b038216613b9f5760405162461bcd60e51b81526004018080602001828103825260228152602001806147a96022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b613bd060088263ffffffff61416316565b6009805460018101825560009182527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319166001600160a01b03841690811790915560405190917f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f891a250565b6001600160a01b038216613c8d5760405162461bcd60e51b815260040180806020018281038252602781526020018061463a6027913960400191505060405180910390fd5b80613cc95760405162461bcd60e51b81526004018080602001828103825260218152602001806147886021913960400191505060405180910390fd5b6001600160a01b03909116600090815260076020526040902060020155565b613cf960018263ffffffff61428e16565b613d0a60028263ffffffff6142f516565b15611670576040516001600160a01b038216907f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b690600090a250565b613d5760088263ffffffff61428e16565b613d6860098263ffffffff6142f516565b15611670576040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b613db560038263ffffffff61416316565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b03841690811790915560405190917f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f691a250565b6000808211613e6d5760405162461bcd60e51b815260040180806020018281038252603681526020018061490b6036913960400191505060405180910390fd5b81613e7661332f565b1015613eb35760405162461bcd60e51b815260040180806020018281038252603a815260200180614572603a913960400191505060405180910390fd5b6000613ebd612aa7565b905082613ec861332f565b14613ee757613ee4613ed861332f565b61176f856115c5612aa7565b90505b42601855613ef7816116ff612aa7565b601955336000818152601b6020526040902042815590613f1c9083906116ff90611ead565b8160010181905550613f30600133866139fa565b5060019392505050565b613f4b60058263ffffffff61428e16565b613f5c60068263ffffffff6142f516565b15611670576040516001600160a01b038216907ff38e60871ec534937251cd91cad807e15f55f1f6815128faecc256e71994b49790600090a250565b60006001600160a01b038216613fdf5760405162461bcd60e51b81526004018080602001828103825260378152602001806149416037913960400191505060405180910390fd5b6000806000613fed85614058565b92509250925060008311614007576000935050505061161a565b6001600160a01b0385166000908152601f6020526040902043601c55614033838363ffffffff6135ea16565b601d554381556000600182015561404c600287866139fa565b50600195945050505050565b600080600080600061406986611d0b565b9092509050801580614079575081155b1561408c57600094509092509050612075565b818114156140a85761409c61284a565b94509092509050612075565b6140b88261176f836115c561284a565b969195509350915050565b6001600160a01b0381166141085760405162461bcd60e51b815260040180806020018281038252602681526020018061446c6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166141a85760405162461bcd60e51b81526004018080602001828103825260228152602001806147a96022913960400191505060405180910390fd5b6141b28282613b58565b15614204576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b600081836142785760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156139b757818101518382015260200161399f565b50600083858161428457fe5b0495945050505050565b6142988282613b58565b6142d35760405162461bcd60e51b81526004018080602001828103825260218152602001806146616021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000805b83548110156143e057826001600160a01b031684828154811061431857fe5b6000918252602090912001546001600160a01b031614156143d85783818154811061433f57fe5b600091825260209091200180546001600160a01b031916905583548490600019810190811061436a57fe5b9060005260206000200160009054906101000a90046001600160a01b031684828154811061439457fe5b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905583546143cd85600019830161440b565b50600191505061177e565b6001016142f9565b5060009392505050565b60405180606001604052806000815260200160008152602001600081525090565b81548183558181111561215e5760008381526020902061215e91810190830161144191905b808211156144445760008155600101614430565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373427473776170546f6b656e3a2074616b65722073776170206f757470757420697320746865207a65726f2061646472657373427473776170546f6b656e3a206d616b6572206c6971756964697479207061697220697320746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654461696c794c696d69743a206163636f756e747320616e64206c696d697473206c656e677468206d69736d617463686564427473776170546f6b656e3a2074616b6572207769746864726177207175616e7469747920657863656564732074616b65722062616c616e6365427473776170546f6b656e3a2074616b65722073776170206163636f756e7420697320746865207a65726f2061646472657373427473776170546f6b656e3a206e657720726f7574657220697320746865207a65726f20616464726573734d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c654461696c794c696d69743a206163636f756e7420697320746865207a65726f2061646472657373526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65427473776170546f6b656e3a206d616b6572206c6971756964697479206163636f756e7420697320746865207a65726f2061646472657373426c61636b6c6973746564526f6c653a206163636f756e74206861732074686520626c61636b6c697374656420726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77427473776170546f6b656e3a2067726f7570207769746864726177206163636f756e7420697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572427473776170546f6b656e3a2063616c6c6572206973206e6f742074686520726f757465724461696c794c696d69743a206c696d69742063616e206e6f74206265207a65726f526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373427473776170546f6b656e3a2074616b6572207377617020696e70757420697320746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652070617573657220726f6c65427473776170546f6b656e3a2067726f757020776974686472617720616d6f756e7420657863656564732067726f75702062616c616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373427473776170546f6b656e3a2067726f757020776974686472617720616d6f756e7420697320746865207a65726f2076616c7565427473776170546f6b656e3a206e657720746f6b656e20697320746865207a65726f2061646472657373427473776170546f6b656e3a2074616b6572207769746864726177207175616e7469747920697320746865207a65726f2076616c7565427473776170546f6b656e3a206d616b6572207769746864726177206163636f756e7420697320746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4461696c794c696d69743a20757365722773207370656e742065786365656473206461696c79206c696d6974a265627a7a723158208ad2edf037e5cf92806ccfca6eaf984958938e89bb898b6cae266c759ff3264864736f6c63430005100032

Libraries Used


Deployed Bytecode Sourcemap

34658:14028:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34658:14028:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36989:219;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36989:219:0;;;;;;;;:::i;:::-;;16698:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;16698:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19690:223;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19690:223:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34865:69;;;:::i;:::-;;;;;;;;;;;;;;;;37987:626;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37987:626:0;;:::i;21396:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21396:101:0;-1:-1:-1;;;;;21396:101:0;;:::i;44337:::-;;;:::i;38621:672::-;;;:::i;37250:278::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37250:278:0;;:::i;44553:103::-;;;:::i;16975:91::-;;;:::i;9449:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9449:101:0;-1:-1:-1;;;;;9449:101:0;;:::i;40557:198::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40557:198:0;-1:-1:-1;;;;;40557:198:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21505:203;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21505:203:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;21505:203:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;21505:203:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;21505:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;21505:203:0;;-1:-1:-1;21505:203:0;;-1:-1:-1;;;;;21505:203:0:i;37885:94::-;;;:::i;23929:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23929:91:0;-1:-1:-1;;;;;23929:91:0;;:::i;18173:538::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18173:538:0;;;;;;;;;;;;;;;;;:::i;8048:104::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8048:104:0;-1:-1:-1;;;;;8048:104:0;;:::i;16884:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36345:95;;;:::i;39336:229::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39336:229:0;;;;;;;;:::i;19065:279::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19065:279:0;;;;;;;;:::i;22245:119::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22245:119:0;-1:-1:-1;;;;;22245:119:0;;:::i;43977:352::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43977:352:0;-1:-1:-1;;;;;43977:352:0;;:::i;15609:118::-;;;:::i;14450:98::-;;;:::i;13876:193::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13876:193:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;13876:193:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13876:193:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;13876:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;13876:193:0;;-1:-1:-1;13876:193:0;;-1:-1:-1;;;;;13876:193:0:i;40983:127::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40983:127:0;-1:-1:-1;;;;;40983:127:0;;:::i;48224:202::-;;;:::i;14556:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14556:109:0;-1:-1:-1;;;;;14556:109:0;;:::i;21142:29::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21142:29:0;;:::i;:::-;;;;-1:-1:-1;;;;;21142:29:0;;;;;;;;;;;;;;35477:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;9558:203;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9558:203:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;9558:203:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9558:203:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;9558:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;9558:203:0;;-1:-1:-1;9558:203:0;;-1:-1:-1;;;;;9558:203:0:i;40872:103::-;;;:::i;41369:322::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41369:322:0;-1:-1:-1;;;;;41369:322:0;;:::i;11483:233::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11483:233:0;-1:-1:-1;;;;;11483:233:0;;:::i;13548:24::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13548:24:0;;:::i;15267:78::-;;;:::i;12060:348::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12060:348:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;12060:348:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12060:348:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;12060:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;12060:348:0;;;;;;;;-1:-1:-1;12060:348:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;12060:348:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12060:348:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;12060:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;12060:348:0;;-1:-1:-1;12060:348:0;;-1:-1:-1;;;;;12060:348:0:i;22020:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22020:101:0;-1:-1:-1;;;;;22020:101:0;;:::i;41699:946::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;41699:946:0;;;;;;;;;;;;;;;;;;;;;;:::i;14269:74::-;;;:::i;39573:942::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39573:942:0;;;;;;;;;;:::i;41118:129::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41118:129:0;-1:-1:-1;;;;;41118:129:0;;:::i;17074:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17074:110:0;-1:-1:-1;;;;;17074:110:0;;:::i;8160:140::-;;;:::i;35453:17::-;;;:::i;45618:106::-;;;:::i;13777:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13777:91:0;-1:-1:-1;;;;;13777:91:0;;:::i;24028:98::-;;;:::i;15419:116::-;;;:::i;23126:24::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23126:24:0;;:::i;14351:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14351:91:0;-1:-1:-1;;;;;14351:91:0;;:::i;7961:79::-;;;:::i;9195:29::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9195:29:0;;:::i;35017:82::-;;;:::i;16789:87::-;;;:::i;23355:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23355:91:0;-1:-1:-1;;;;;23355:91:0;;:::i;40763:101::-;;;:::i;23847:74::-;;;:::i;47599:106::-;;;:::i;36560:95::-;;;:::i;35106:82::-;;;:::i;19352:330::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19352:330:0;;;;;;;;:::i;17815:350::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17815:350:0;;;;;;;;:::i;44664:127::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44664:127:0;-1:-1:-1;;;;;44664:127:0;;:::i;37636:241::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37636:241:0;;:::i;24134:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24134:109:0;-1:-1:-1;;;;;24134:109:0;;:::i;44932:150::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;44932:150:0;;;;;;;;;;:::i;47713:466::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;47713:466:0;;;;;;;;:::i;35195:82::-;;;:::i;37536:92::-;;;:::i;45914:895::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45914:895:0;;;;;;;;;;:::i;44446:99::-;;;:::i;44799:125::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44799:125:0;-1:-1:-1;;;;;44799:125:0;;:::i;12461:92::-;;;:::i;43763:172::-;;;:::i;22129:108::-;;;:::i;10090:::-;;;:::i;36137:200::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36137:200:0;-1:-1:-1;;;;;36137:200:0;;:::i;34738:53::-;;;:::i;34798:60::-;;;:::i;34941:69::-;;;:::i;43474:281::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43474:281:0;;:::i;21928:84::-;;;:::i;9981:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9981:101:0;-1:-1:-1;;;;;9981:101:0;;:::i;11004:53::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11004:53:0;-1:-1:-1;;;;;11004:53:0;;:::i;47439:118::-;;;:::i;36775:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36775:206:0;-1:-1:-1;;;;;36775:206:0;;:::i;17192:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17192:134:0;;;;;;;;;;:::i;45090:129::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45090:129:0;-1:-1:-1;;;;;45090:129:0;;:::i;45732:174::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45732:174:0;-1:-1:-1;;;;;45732:174:0;;:::i;41255:106::-;;;:::i;23454:193::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23454:193:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;23454:193:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23454:193:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;23454:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;23454:193:0;;-1:-1:-1;23454:193:0;;-1:-1:-1;;;;;23454:193:0:i;8545:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8545:109:0;-1:-1:-1;;;;;8545:109:0;;:::i;48434:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48434:116:0;-1:-1:-1;;;;;48434:116:0;;:::i;36040:89::-;;;:::i;10206:119::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10206:119:0;-1:-1:-1;;;;;10206:119:0;;:::i;36989:219::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37081:31:0;;37073:86;;;;-1:-1:-1;;;37073:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37170:18:0;;;;;;;:8;:18;;;;;:30;36989:219::o;16698:83::-;16768:5;16761:12;;;;;;;;-1:-1:-1;;16761:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16735:13;;16761:12;;16768:5;;16761:12;;16768:5;16761:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16698:83;;:::o;19690:223::-;15782:7;;19829:4;;15782:7;;15781:8;15773:37;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;;;;19773:10;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19804:7;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19846:37;19855:10;19867:7;19876:6;19846:8;:37::i;:::-;-1:-1:-1;19901:4:0;;19690:223;-1:-1:-1;;;;19690:223:0:o;34865:69::-;;;;:::o;37987:626::-;38047:7;;;38127:15;:13;:15::i;:::-;38099:43;;38153:9;38165:22;38171:15;:13;:15::i;:::-;38165:5;:22::i;:::-;38153:34;;38198:9;38210:18;38216:11;38210:5;:18::i;:::-;38198:30;;38241:237;38252:1;38248;:5;38241:237;;;38270:3;;;;;38288:9;38300:47;38331:15;:13;:15::i;:::-;38300:26;:1;34784:7;38300:26;:5;:26;:::i;:::-;:30;:47;:30;:47;:::i;:::-;38288:59;;38374:56;38388:41;38419:9;38426:1;38419:6;:9::i;:::-;38389:24;:1;38395:17;38389:24;:5;:24;:::i;:::-;38388:30;:41;:30;:41;:::i;:::-;38374:9;;:56;:13;:56;:::i;:::-;38362:68;-1:-1:-1;38465:1:0;-1:-1:-1;38241:237:0;;;38500:76;38514:61;38555:19;38562:11;38555:6;:19::i;:::-;38515:34;:11;38531:17;38515:34;:15;:34;:::i;38514:61::-;38500:9;;:76;:13;:76;:::i;:::-;38488:88;-1:-1:-1;;;;;37987:626:0;;;;:::o;21396:101::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;21465:24;21481:7;21465:15;:24::i;:::-;21396:101;:::o;44337:::-;44416:14;;44337:101;:::o;38621:672::-;38653:4;38675:12;:10;:12::i;:::-;38670:58;;-1:-1:-1;38711:5:0;38704:12;;38670:58;38740:17;38760:22;38769:12;38760:8;:22::i;:::-;38740:42;;38810:1;38797:9;:14;38793:59;;38835:5;38828:12;;;;;38793:59;38864:31;38882:12;38864:17;:31::i;:::-;38908:21;38932:36;38947:20;;38932:9;:14;;:36;;;;:::i;:::-;38908:60;;38979:21;39003:36;39018:20;;39003:9;:14;;:36;;;;:::i;:::-;38979:60;-1:-1:-1;39050:21:0;39074:47;38979:60;39074:28;:9;39088:13;39074:28;:13;:28;:::i;:::-;:32;:47;:32;:47;:::i;:::-;39050:71;;39134:35;35057:42;39155:13;39134:5;:35::i;:::-;39180;35146:42;39201:13;39180:5;:35::i;:::-;39226;35235:42;39247:13;39226:5;:35::i;:::-;39281:4;39274:11;;;;;;38621:672;:::o;37250:278::-;37307:7;;37376:15;:13;:15::i;:::-;37362:11;:29;37358:137;;;37417:66;34784:7;37418:39;37455:1;37418:32;37434:15;:13;:15::i;:::-;37418:11;;:32;:15;:32;:::i;:39::-;37417:45;:66;:45;:66;:::i;:::-;37408:75;;37358:137;37514:6;37250:278;-1:-1:-1;;37250:278:0:o;44553:103::-;44633:5;:15;44553:103;:::o;16975:91::-;17046:12;;16975:91;:::o;9449:101::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;9518:24;9534:7;9518:15;:24::i;40557:198::-;40612:7;40621;40641:9;40653:21;:19;:21::i;:::-;40641:33;;40685:9;40697:24;40713:7;40697:15;:24::i;:::-;40742:1;;-1:-1:-1;40685:36:0;;-1:-1:-1;;40557:198:0;;;:::o;21505:203::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;21589:13;21584:117;21616:8;:15;21608:5;:23;21584:117;;;21657:32;21673:8;21682:5;21673:15;;;;;;;;;;;;;;21657;:32::i;:::-;21633:7;;21584:117;;;;21505:203;:::o;37885:94::-;37924:7;37951:20;37958:12;37951:6;:20::i;:::-;37944:27;;37885:94;:::o;23929:91::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;23993:19;24004:7;23993:10;:19::i;18173:538::-;15782:7;;18395:4;;15782:7;;15781:8;15773:37;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;;;;18286:10;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18317:6;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18344:9;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18370:6;18378;13145:29;13158:7;13167:6;13145:12;:29::i;:::-;13137:86;;;;-1:-1:-1;;;13137:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18412:13;18428:84;18464:6;18428:84;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18428:19:0;;;;;;:11;:19;;;;;;;;18448:10;18428:31;;;;;;;;;:84;;:35;:84;:::i;:::-;-1:-1:-1;;;;;18551:19:0;;;;;;:11;:19;;;;;:25;18412:100;;-1:-1:-1;18551:37:0;;18581:6;18551:37;:29;:37;:::i;:::-;-1:-1:-1;;;;;18523:19:0;;;;;;:11;:19;;;;;:65;18599:36;18535:6;18617:9;18628:6;18599:9;:36::i;:::-;18646:35;18655:6;18663:10;18675:5;18646:8;:35::i;:::-;-1:-1:-1;18699:4:0;;18173:538;-1:-1:-1;;;;;;;;;18173:538:0:o;8048:104::-;8103:4;8138:6;-1:-1:-1;;;;;8138:6:0;;;8127:17;;;;8048:104::o;16884:83::-;16950:9;;;;16884:83;:::o;36345:95::-;36418:14;;36345:95;:::o;39336:229::-;39402:7;39422:13;39438:8;:6;:8::i;:::-;-1:-1:-1;;;;;39438:13:0;;39452:5;39438:20;;;;;;;;;;;;;-1:-1:-1;;;;;39438:20:0;-1:-1:-1;;;;;39438:20:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39438:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39438:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39438:20:0;;-1:-1:-1;39473:10:0;39469:51;;39507:1;39500:8;;;;;39469:51;39539:18;:5;39550:6;39539:18;:10;:18;:::i;:::-;39532:25;39336:229;-1:-1:-1;;;;39336:229:0:o;19065:279::-;15782:7;;19218:4;;15782:7;;15781:8;15773:37;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;;;;19169:10;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19200:7;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19244:10;19265:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;19265:32:0;;;;;;;;;;19235:79;;19244:10;19256:7;;19265:48;;19302:10;19265:48;:36;:48;:::i;:::-;19235:8;:79::i;22245:119::-;22306:4;22330:26;:13;22348:7;22330:26;:17;:26;:::i;43977:352::-;44036:7;44045;44065:9;44077:93;44103:66;44128:40;44145:22;:20;:22::i;:::-;44128:12;;:40;:16;:40;:::i;:::-;44103:20;:18;:20::i;:66::-;44077:21;:19;:21::i;:93::-;44065:105;;44181:9;44193:102;44222:72;44250:43;44267:25;44284:7;44267:16;:25::i;44250:43::-;44222:23;44237:7;44222:14;:23::i;:72::-;44193:24;44209:7;44193:15;:24::i;15609:118::-;14716:20;14725:10;14716:8;:20::i;:::-;14708:81;;;;-1:-1:-1;;;14708:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15879:7;;;;15871:40;;;;;-1:-1:-1;;;15871:40:0;;;;;;;;;;;;-1:-1:-1;;;15871:40:0;;;;;;;;;;;;;;;15668:7;:15;;-1:-1:-1;;15668:15:0;;;15699:20;;15708:10;;15699:20;;15678:5;;15699:20;15609:118::o;14450:98::-;14526:7;:14;14450:98;:::o;13876:193::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;13955:13;13950:112;13982:8;:15;13974:5;:23;13950:112;;;14023:27;14034:8;14043:5;14034:15;;;;;;;;;;;;;;14023:10;:27::i;:::-;13999:7;;13950:112;;40983:127;-1:-1:-1;;;;;41073:20:0;41046:7;41073:20;;;:11;:20;;;;;:29;;;;40983:127::o;48224:202::-;48267:4;48324:1;48288:33;48305:15;:13;:15::i;48288:33::-;:37;:68;;;;;48355:1;48329:23;48336:15;:13;:15::i;:::-;48329:6;:23::i;:::-;:27;48288:68;48284:112;;;-1:-1:-1;48380:4:0;48373:11;;48284:112;-1:-1:-1;48413:5:0;48224:202;:::o;14556:109::-;14612:4;14636:21;:8;14649:7;14636:21;:12;:21;:::i;21142:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21142:29:0;;-1:-1:-1;21142:29:0;:::o;35477:17::-;;;;;;;;:::o;9558:203::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;9642:13;9637:117;9669:8;:15;9661:5;:23;9637:117;;;9710:32;9726:8;9735:5;9726:15;;;;;;;;;;;;;;9710;:32::i;:::-;9686:7;;9637:117;;40872:103;40952:5;:15;40872:103;:::o;41369:322::-;41431:7;41452:9;41463;41476:16;41484:7;41476;:16::i;:::-;41451:41;;-1:-1:-1;41451:41:0;-1:-1:-1;41507:6:0;;;:16;;-1:-1:-1;41517:6:0;;41507:16;41503:57;;;41547:1;41540:8;;;;;;41503:57;41581:1;41576;:6;41572:62;;;41606:16;:14;:16::i;:::-;41599:23;;;;;;41572:62;41653:30;41681:1;41653:23;41674:1;41653:16;:14;:16::i;11483:233::-;11544:7;11553;11562;11581:32;;:::i;:::-;-1:-1:-1;;;;;;;;;11616:20:0;;;;;;:11;:20;;;;;;;;;11581:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11483:233;;;;;;:::o;13548:24::-;;;;;;;;;;15267:78;15330:7;;;;15267:78;:::o;12060:348::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;12190:6;:13;12171:8;:15;:32;12163:94;;;;-1:-1:-1;;;12163:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12275:13;12270:131;12302:8;:15;12294:5;:23;12270:131;;;12343:46;12358:8;12367:5;12358:15;;;;;;;;;;;;;;12375:6;12382:5;12375:13;;;;;;;;;;;;;;12343:14;:46::i;:::-;12319:7;;12270:131;;;;12060:348;;:::o;22020:101::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;22089:24;22105:7;22089:15;:24::i;41699:946::-;41804:4;24294:20;24303:10;24294:8;:20::i;:::-;24286:81;;;;-1:-1:-1;;;24286:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41829:21:0;;41821:85;;;;-1:-1:-1;;;41821:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41925:19:0;;41917:81;;;;-1:-1:-1;;;41917:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42017:20:0;;42009:83;;;;-1:-1:-1;;;42009:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42218:16;42237:19;42242:5;42249:6;42237:4;:19::i;:::-;42218:38;;42283:1;42271:8;:13;42267:58;;42308:5;42301:12;;;;;42267:58;42337:6;:4;:6::i;:::-;-1:-1:-1;42374:15:0;42356:5;:33;42417:35;42443:8;42417:21;:19;:21::i;:35::-;42400:14;:52;-1:-1:-1;;;;;42485:20:0;;42465:17;42485:20;;;:11;:20;;;;;42533:15;42516:32;;42575:38;42604:8;42575:24;42497:7;42575:15;:24::i;:38::-;42559:13;;;;:54;:13;41699:946;-1:-1:-1;;;;;;41699:946:0:o;14269:74::-;14313:22;14324:10;14313;:22::i;:::-;14269:74::o;39573:942::-;39644:7;39669:46;39700:4;-1:-1:-1;;;;;39683:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39683:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39683:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39683:31:0;39669:13;:46::i;:::-;39668:47;:98;;;;39720:46;39751:4;-1:-1:-1;;;;;39734:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;39720:46:0;39719:47;39668:98;39664:139;;;-1:-1:-1;39790:1:0;39783:8;;39664:139;39815:9;39844:4;-1:-1:-1;;;;;39827:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39827:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39827:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39827:36:0;39886:41;;;-1:-1:-1;;;39886:41:0;;-1:-1:-1;;;;;39886:41:0;;;;;;;;;39827:36;;-1:-1:-1;39874:9:0;;39886:32;;;;;;:41;;;;;39827:36;;39886:41;;;;;;;;:32;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;39886:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39886:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39886:41:0;;-1:-1:-1;39942:6:0;;;:16;;-1:-1:-1;39952:6:0;;39942:16;39938:57;;;39982:1;39975:8;;;;;;39938:57;40008:16;40026;40064:4;-1:-1:-1;;;;;40047:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40047:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40047:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40047:36:0;;;;;;;;40116:31;;-1:-1:-1;;;40116:31:0;;;;40047:36;;-1:-1:-1;40047:36:0;;-1:-1:-1;40094:14:0;;40111:56;;-1:-1:-1;;;;;40116:29:0;;;;;:31;;;;;40047:36;;40116:31;;;;;:29;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;40116:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40116:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40116:31:0;-1:-1:-1;;;;;40149:17:0;;40111:4;:56::i;:::-;40094:73;;40178:16;40197:41;40223:4;-1:-1:-1;;;;;40206:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40206:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40206:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40206:31:0;40197:8;:41::i;:::-;40178:60;;40249:14;40266:56;40288:4;-1:-1:-1;;;;;40271:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40271:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40271:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40271:31:0;-1:-1:-1;;;;;40304:17:0;;40266:4;:56::i;:::-;40249:73;;40333:16;40352:41;40378:4;-1:-1:-1;;;;;40361:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;40352:41:0;40333:60;-1:-1:-1;40406:13:0;40422:46;40447:20;:6;40333:60;40447:20;:10;:20;:::i;:::-;40422;:6;40433:8;40422:20;:10;:20;:::i;:46::-;40406:62;-1:-1:-1;40488:19:0;40505:1;40488:12;40406:62;40498:1;40488:12;:9;:12;:::i;:19::-;40481:26;39573:942;-1:-1:-1;;;;;;;;;;;;39573:942:0:o;41118:129::-;-1:-1:-1;;;;;41209:20:0;41182:7;41209:20;;;:11;:20;;;;;:30;;41118:129::o;17074:110::-;-1:-1:-1;;;;;17158:18:0;17131:7;17158:18;;;:9;:18;;;;;;;17074:110::o;8160:140::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;8259:1;8243:6;;8222:40;;-1:-1:-1;;;;;8243:6:0;;;;8222:40;;8259:1;;8222:40;8290:1;8273:19;;-1:-1:-1;;;;;;8273:19:0;;;8160:140::o;35453:17::-;;;;;;;;:::o;45618:106::-;45665:7;45692:24;35146:42;45692:9;:24::i;13777:91::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;13841:19;13852:7;13841:10;:19::i;24028:98::-;24104:7;:14;24028:98;:::o;15419:116::-;14716:20;14725:10;14716:8;:20::i;:::-;14708:81;;;;-1:-1:-1;;;14708:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15782:7;;;;15781:8;15773:37;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;;;;15479:7;:14;;-1:-1:-1;;15479:14:0;15489:4;15479:14;;;15509:18;;15516:10;;15509:18;;15479:7;;15509:18;15419:116::o;23126:24::-;;;;;;;;;;14351:91;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;14415:19;14426:7;14415:10;:19::i;7961:79::-;7999:7;8026:6;-1:-1:-1;;;;;8026:6:0;7961:79;:::o;9195:29::-;;;;;;;;;;35017:82;35057:42;35017:82;:::o;16789:87::-;16861:7;16854:14;;;;;;;;-1:-1:-1;;16854:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16828:13;;16854:14;;16861:7;;16854:14;;16861:7;16854:14;;;;;;;;;;;;;;;;;;;;;;;;23355:91;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;23419:19;23430:7;23419:10;:19::i;40763:101::-;40842:14;;40763:101;:::o;23847:74::-;23891:22;23902:10;23891;:22::i;47599:106::-;47646:7;47673:24;35235:42;47673:9;:24::i;36560:95::-;36633:14;;36560:95;:::o;35106:82::-;35146:42;35106:82;:::o;19352:330::-;15782:7;;19510:4;;15782:7;;15781:8;15773:37;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;;;;19461:10;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19492:7;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19527:125;19536:10;19548:7;19557:94;19594:15;19557:94;;;;;;;;;;;;;;;;;19569:10;19557:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;19557:32:0;;;;;;;;;;;:94;;:36;:94;:::i;17815:350::-;15782:7;;17994:4;;15782:7;;15781:8;15773:37;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;-1:-1:-1;;;15773:37:0;;;;;;;;;;;;;;;17908:10;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17939:9;10562:22;10576:7;10562:13;:22::i;:::-;10561:23;10553:85;;;;-1:-1:-1;;;10553:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17965:10;17977:6;13145:29;13158:7;13167:6;13145:12;:29::i;:::-;13137:86;;;;-1:-1:-1;;;13137:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18055:10;18043:23;;;;:11;:23;;;;;:29;:41;;18077:6;18043:41;:33;:41;:::i;:::-;18023:10;18011:23;;;;:11;:23;;;;;:73;;;;18095:40;;18117:9;18128:6;18095:9;:40::i;:::-;-1:-1:-1;18153:4:0;;17815:350;-1:-1:-1;;;;;;17815:350:0:o;44664:127::-;-1:-1:-1;;;;;44754:20:0;44727:7;44754:20;;;:11;:20;;;;;:29;;;;44664:127::o;37636:241::-;37694:7;37714:14;37731:18;37737:11;37731:5;:18::i;:::-;37714:35;;37774:2;37764:6;:12;37760:53;;37800:1;37793:8;;;;;37760:53;37832:20;;:37;;37857:1;:11;;;37832:37;:24;:37;:::i;:::-;37825:44;37636:241;-1:-1:-1;;;37636:241:0:o;24134:109::-;24190:4;24214:21;:8;24227:7;24214:21;:12;:21;:::i;44932:150::-;-1:-1:-1;;;;;45039:20:0;;;45012:7;45039:20;;;:11;:20;;;;;;;;:35;;;;;;:11;:29;;;:35;;;;;;44932:150::o;47713:466::-;47795:4;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47820:21:0;;47812:89;;;;-1:-1:-1;;;47812:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47929:1;47920:6;:10;47912:75;;;;-1:-1:-1;;;47912:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48026:6;48006:16;:14;:16::i;:::-;:26;;47998:95;;;;-1:-1:-1;;;47998:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48106:41;35235:42;48131:7;48140:6;48106:9;:41::i;:::-;-1:-1:-1;48167:4:0;47713:466;;;;:::o;35195:82::-;35235:42;35195:82;:::o;37536:92::-;37574:7;37601:19;37607:12;37601:5;:19::i;45914:895::-;45991:4;48599:20;48608:10;48599:8;:20::i;:::-;48591:70;;;;-1:-1:-1;;;48591:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46016:21:0;;46008:90;;;;-1:-1:-1;;;46008:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46117:18:0;;46109:84;;;;-1:-1:-1;;;46109:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46206:6;:4;:6::i;:::-;-1:-1:-1;;;;;;46253:20:0;;46233:17;46253:20;;;:11;:20;;;;;;46302:24;46265:7;46321:4;46302:9;:24::i;:::-;46284:42;;46337:16;46356:33;46375:7;46384:4;46356:18;:33::i;:::-;46337:52;;46403:9;46414;46427:20;46439:7;46427:11;:20::i;:::-;46458:14;:18;;;46505:12;46458:5;46487:30;46402:45;;-1:-1:-1;46402:45:0;-1:-1:-1;46544:47:0;46582:8;46544:33;46569:7;46544:20;:18;:20::i;:47::-;46528:13;:63;46604:13;;;:17;;;46649:12;46632:29;;46687:50;46728:8;46687:36;46715:7;46687:23;46702:7;46687:14;:23::i;:50::-;46672:12;;;:65;-1:-1:-1;;;;;;;;46748:19:0;;;;;;:13;;;;:19;;;;;;:29;-1:-1:-1;46797:4:0;45914:895;;;;:::o;44446:99::-;44524:13;;44446:99;:::o;44799:125::-;-1:-1:-1;;;;;44888:20:0;44861:7;44888:20;;;:11;:20;;;;;:28;;;;44799:125::o;12461:92::-;12538:6;12532:3;:12;;;12525:20;;;12461:92::o;43763:172::-;43804:4;43821:6;:4;:6::i;:::-;;43840:15;43858:26;43873:10;43858:14;:26::i;:::-;43840:44;;43904:23;43919:7;43904:14;:23::i;:::-;43897:30;;;43763:172;:::o;22129:108::-;22210:12;:19;22129:108;:::o;10090:::-;10171:12;:19;10090:108;:::o;36137:200::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36219:32:0;;36211:88;;;;-1:-1:-1;;;36211:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36310:7;:19;;-1:-1:-1;;;;;;36310:19:0;-1:-1:-1;;;;;36310:19:0;;;;;;;;;;36137:200::o;34738:53::-;34784:7;34738:53;:::o;34798:60::-;;;;:::o;34941:69::-;;;;:::o;43474:281::-;43531:4;43548:6;:4;:6::i;:::-;;43567:15;43585:26;43600:10;43585:14;:26::i;:::-;43567:44;;43638:7;43626:8;:19;43622:83;;43669:24;43684:8;43669:14;:24::i;:::-;43662:31;;;;;43622:83;43724:23;43739:7;43724:14;:23::i;21928:84::-;21977:27;21993:10;21977:15;:27::i;9981:101::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;10050:24;10066:7;10050:15;:24::i;11004:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47439:118::-;47480:4;47497:6;:4;:6::i;:::-;;47523:26;47538:10;47523:14;:26::i;36775:206::-;-1:-1:-1;;;;;36867:15:0;;36829:7;36867:15;;;:8;:15;;;;;;36899:11;;36895:58;;36934:7;-1:-1:-1;36927:14:0;;17192:134;-1:-1:-1;;;;;17291:18:0;;;17264:7;17291:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17192:134::o;45090:129::-;-1:-1:-1;;;;;45181:20:0;45154:7;45181:20;;;:11;:20;;;;;:30;;45090:129::o;45732:174::-;45794:7;45815:15;45837:36;45865:7;45837:27;:36::i;:::-;-1:-1:-1;45814:59:0;;45732:174;-1:-1:-1;;;;45732:174:0:o;41255:106::-;41302:7;41329:24;35057:42;41329:9;:24::i;23454:193::-;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;23533:13;23528:112;23560:8;:15;23552:5;:23;23528:112;;;23601:27;23612:8;23621:5;23612:15;;;;;;;;;;;;;;23601:10;:27::i;:::-;23577:7;;23528:112;;8545:109;8704:19;8712:10;8704:7;:19::i;:::-;8696:64;;;;;-1:-1:-1;;;8696:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8696:64:0;;;;;;;;;;;;;;;8618:28;8637:8;8618:18;:28::i;48434:116::-;48490:4;48533:8;:6;:8::i;:::-;-1:-1:-1;;;;;48514:28:0;:7;-1:-1:-1;;;;;48514:28:0;;48507:35;;48434:116;;;:::o;36040:89::-;36114:7;;-1:-1:-1;;;;;36114:7:0;36040:89;:::o;10206:119::-;10267:4;10291:26;:13;10309:7;10291:26;:17;:26;:::i;18719:338::-;-1:-1:-1;;;;;18813:19:0;;18805:68;;;;-1:-1:-1;;;18805:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18892:21:0;;18884:68;;;;-1:-1:-1;;;18884:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18965:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19017:32;;;;;;;;;;;;;;;;;18719:338;;;:::o;2066:471::-;2124:7;2369:6;2365:47;;-1:-1:-1;2399:1:0;2392:8;;2365:47;2436:5;;;2440:1;2436;:5;:1;2460:5;;;;;:10;2452:56;;;;-1:-1:-1;;;2452:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1533:181;1591:7;1623:5;;;1647:6;;;;1639:46;;;;;-1:-1:-1;;;1639:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1722:136;1780:7;1807:43;1811:1;1814;1807:43;;;;;;;;;;;;;;;;;:3;:43::i;21214:174::-;21276:26;:13;21294:7;21276:26;:17;:26;:::i;:::-;21313:12;27:10:-1;;39:1;23:18;;45:23;;-1:-1;21313:26:0;;;;;;;-1:-1:-1;;;;;;21313:26:0;-1:-1:-1;;;;;21313:26:0;;;;;;;;21355:25;;21313:26;;21355:25;;;21214:174;:::o;36663:104::-;36731:14;:28;36663:104::o;3900:109::-;3959:7;1314:8;3986:9;3990:1;3993;3986:3;:9::i;:::-;:15;;;;;;;3900:109;-1:-1:-1;;;3900:109:0:o;19921:308::-;-1:-1:-1;;;;;19997:21:0;;19989:65;;;;;-1:-1:-1;;;19989:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20082:12;;:24;;20099:6;20082:24;:16;:24;:::i;:::-;20067:12;:39;-1:-1:-1;;;;;20138:18:0;;;;;;:9;:18;;;;;;:30;;20161:6;20138:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;20117:18:0;;;;;;:9;:18;;;;;;;;:51;;;;20184:37;;;;;;;20117:18;;;;20184:37;;;;;;;;;;19921:308;;:::o;2545:132::-;2603:7;2630:39;2634:1;2637;2630:39;;;;;;;;;;;;;;;;;:3;:39::i;9267:174::-;9329:26;:13;9347:7;9329:26;:17;:26;:::i;:::-;9366:12;27:10:-1;;39:1;23:18;;45:23;;-1:-1;9366:26:0;;;;;;;-1:-1:-1;;;;;;9366:26:0;-1:-1:-1;;;;;9366:26:0;;;;;;;;9408:25;;9366:26;;9408:25;;;9267:174;:::o;23655:184::-;23712:24;:8;23728:7;23712:24;:15;:24;:::i;:::-;23753:23;:7;23768;23753:23;:14;:23;:::i;:::-;23749:83;;;23798:22;;-1:-1:-1;;;;;23798:22:0;;;;;;;;23655:184;:::o;12606:454::-;-1:-1:-1;;;;;12731:20:0;;12679:4;12731:20;;;:11;:20;;;;;12778:16;;;;12768:7;:5;:7::i;:::-;:26;12764:120;;;12830:7;:5;:7::i;:::-;12811:16;;;:26;12871:1;12852:20;;12764:120;12978:16;;;;:21;;:73;;-1:-1:-1;13035:16:0;;;;13003;;:28;;13024:6;13003:28;:20;:28;:::i;:::-;:48;;;12606:454;-1:-1:-1;;;;12606:454:0:o;1866:192::-;1952:7;1988:12;1980:6;;;;1972:29;;;;-1:-1:-1;;;1972:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1972:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2024:5:0;;;1866:192::o;17334:473::-;-1:-1:-1;;;;;17432:20:0;;17424:70;;;;-1:-1:-1;;;17424:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17513:23:0;;17505:71;;;;-1:-1:-1;;;17505:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17609;17631:6;17609:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17609:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;17589:17:0;;;;;;;:9;:17;;;;;;:91;;;;17714:20;;;;;;;:32;;17739:6;17714:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;17691:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;17764:35;;;;;;;17691:20;;17764:35;;;;;;;;;;;;;17334:473;;;:::o;7444:203::-;7516:4;-1:-1:-1;;;;;7541:21:0;;7533:68;;;;-1:-1:-1;;;7533:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7619:20:0;:11;:20;;;;;;;;;;;;;;;7444:203::o;13615:154::-;13672:21;:8;13685:7;13672:21;:12;:21;:::i;:::-;13704:7;27:10:-1;;39:1;23:18;;45:23;;-1:-1;13704:21:0;;;;;;;-1:-1:-1;;;;;;13704:21:0;-1:-1:-1;;;;;13704:21:0;;;;;;;;13741:20;;13704:21;;13741:20;;;13615:154;:::o;11781:271::-;-1:-1:-1;;;;;11865:21:0;;11857:73;;;;-1:-1:-1;;;11857:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11949:10;11941:56;;;;-1:-1:-1;;;11941:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12010:20:0;;;;;;;:11;:20;;;;;:26;;:34;11781:271::o;21716:204::-;21778:29;:13;21799:7;21778:29;:20;:29;:::i;:::-;21824:28;:12;21844:7;21824:28;:19;:28;:::i;:::-;21820:93;;;21874:27;;-1:-1:-1;;;;;21874:27:0;;;;;;;;21716:204;:::o;14077:184::-;14134:24;:8;14150:7;14134:24;:15;:24;:::i;:::-;14175:23;:7;14190;14175:23;:14;:23;:::i;:::-;14171:83;;;14220:22;;-1:-1:-1;;;;;14220:22:0;;;;;;;;14077:184;:::o;23193:154::-;23250:21;:8;23263:7;23250:21;:12;:21;:::i;:::-;23282:7;27:10:-1;;39:1;23:18;;45:23;;-1:-1;23282:21:0;;;;;;;-1:-1:-1;;;;;;23282:21:0;-1:-1:-1;;;;;23282:21:0;;;;;;;;23319:20;;23282:21;;23319:20;;;23193:154;:::o;42653:813::-;42713:4;42749:1;42738:8;:12;42730:79;;;;-1:-1:-1;;;42730:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42848:8;42828:16;:14;:16::i;:::-;:28;;42820:99;;;;-1:-1:-1;;;42820:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42932:13;42948:21;:19;:21::i;:::-;42932:37;;43004:8;42984:16;:14;:16::i;:::-;:28;42980:126;;43037:57;43077:16;:14;:16::i;:::-;43037:35;43063:8;43037:21;:19;:21::i;:57::-;43029:65;;42980:126;43136:15;43118:5;:33;43179:32;43205:5;43179:21;:19;:21::i;:32::-;43162:14;:49;43256:10;43224:17;43244:23;;;:11;:23;;;;;43295:15;43278:32;;43244:23;43337:38;;43369:5;;43337:27;;:15;:27::i;:38::-;43321:4;:13;;:54;;;;43388:46;35057:42;43413:10;43425:8;43388:9;:46::i;:::-;-1:-1:-1;43454:4:0;;42653:813;-1:-1:-1;;;42653:813:0:o;9769:204::-;9831:29;:13;9852:7;9831:29;:20;:29;:::i;:::-;9877:28;:12;9897:7;9877:28;:19;:28;:::i;:::-;9873:93;;;9927:27;;-1:-1:-1;;;;;9927:27:0;;;;;;;;9769:204;:::o;46817:614::-;46876:4;-1:-1:-1;;;;;46901:21:0;;46893:89;;;;-1:-1:-1;;;46893:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46996:17;47015:9;47026;47039:36;47067:7;47039:27;:36::i;:::-;46995:80;;;;;;47103:1;47090:9;:14;47086:59;;47128:5;47121:12;;;;;;;47086:59;-1:-1:-1;;;;;47177:20:0;;47157:17;47177:20;;;:11;:20;;;;;47226:12;47177:5;47208:30;47266:8;:1;47272;47266:8;:5;:8;:::i;:::-;47249:14;:25;47302:12;47285:29;;:14;47249;47325:13;;:17;47355:44;35146:42;47380:7;47389:9;47355;:44::i;:::-;-1:-1:-1;47419:4:0;;46817:614;-1:-1:-1;;;;;46817:614:0:o;45227:383::-;45304:7;45313;45322;45343:9;45354;45367:20;45379:7;45367:11;:20::i;:::-;45342:45;;-1:-1:-1;45342:45:0;-1:-1:-1;45402:6:0;;;:16;;-1:-1:-1;45412:6:0;;45402:16;45398:65;;;45443:1;;-1:-1:-1;45446:1:0;;-1:-1:-1;45449:1:0;-1:-1:-1;45435:16:0;;45398:65;45484:1;45479;:6;45475:70;;;45510:16;:14;:16::i;:::-;45502:31;-1:-1:-1;45528:1:0;;-1:-1:-1;45531:1:0;-1:-1:-1;45502:31:0;;45475:70;45565:30;45593:1;45565:23;45586:1;45565:16;:14;:16::i;:30::-;45557:45;45597:1;;-1:-1:-1;45597:1:0;-1:-1:-1;45227:383:0;-1:-1:-1;;45227:383:0:o;8308:229::-;-1:-1:-1;;;;;8382:22:0;;8374:73;;;;-1:-1:-1;;;8374:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8484:6;;;8463:38;;-1:-1:-1;;;;;8463:38:0;;;;8484:6;;;8463:38;;;8512:6;:17;;-1:-1:-1;;;;;;8512:17:0;-1:-1:-1;;;;;8512:17:0;;;;;;;;;;8308:229::o;6916:257::-;-1:-1:-1;;;;;6993:21:0;;6985:68;;;;-1:-1:-1;;;6985:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7073:18;7077:4;7083:7;7073:3;:18::i;:::-;7072:19;7064:63;;;;;-1:-1:-1;;;7064:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7138:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;7138:27:0;7161:4;7138:27;;;6916:257::o;2685:345::-;2771:7;2873:12;2866:5;2858:28;;;;-1:-1:-1;;;2858:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;2858:28:0;;2897:9;2913:1;2909;:5;;;;;;;2685:345;-1:-1:-1;;;;;2685:345:0:o;7217:183::-;7297:18;7301:4;7307:7;7297:3;:18::i;:::-;7289:64;;;;-1:-1:-1;;;7289:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7364:20:0;7387:5;7364:20;;;;;;;;;;;:28;;-1:-1:-1;;7364:28:0;;;7217:183::o;6210:407::-;6286:4;;6303:284;6335:12;;6327:20;;6303:284;;;6393:7;-1:-1:-1;;;;;6377:23:0;:5;6383;6377:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6377:12:0;:23;6373:203;;;6428:5;6434;6428:12;;;;;;;;;;;;;;;;;6421:19;;-1:-1:-1;;;;;;6421:19:0;;;6480:12;;6474:5;;-1:-1:-1;;6480:16:0;;;6474:23;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6474:23:0;6459:5;6465;6459:12;;;;;;;;;;;;;;;;;:38;;-1:-1:-1;;;;;;6459:38:0;-1:-1:-1;;;;;6459:38:0;;;;;;;;;;6516:14;;;;-1:-1:-1;;6516:14:0;;;:::i;:::-;;6556:4;6549:11;;;;;6373:203;6349:7;;6303:284;;;-1:-1:-1;6604:5:0;;6210:407;-1:-1:-1;;;6210:407:0:o;34658:14028::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://8ad2edf037e5cf92806ccfca6eaf984958938e89bb898b6cae266c759ff32648

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

BTswap is a protocol that allows automatic token exchange based on Ethereum.

Validator Index Block Amount
View All Withdrawals

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

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