ETH Price: $3,390.61 (-1.49%)
Gas: 2 Gwei

Contract

0xE92344b4eDF545F3209094B192E46600A19E7C2D
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

zKML (ZKML) (@$0.0749)

Multichain Info

Transaction Hash
Method
Block
From
To
Value
0x7b99547348e3df13d2173bf6e5bfc35fa96a5928b2a1f862488f2c27929bbb0f Transfer(pending)2024-06-23 22:30:205 days ago1719181820IN
zKML: ZKML Token
0 ETH(Pending)(Pending)
Transfer201976472024-06-29 13:29:596 mins ago1719667799IN
zKML: ZKML Token
0 ETH0.000195932.87092252
Approve201973882024-06-29 12:37:351 hrs ago1719664655IN
zKML: ZKML Token
0 ETH0.000085691.81459019
Approve201968872024-06-29 10:56:232 hrs ago1719658583IN
zKML: ZKML Token
0 ETH0.000072151.53691826
Approve201966252024-06-29 10:03:593 hrs ago1719655439IN
zKML: ZKML Token
0 ETH0.000100592.12744657
Approve201961042024-06-29 8:18:595 hrs ago1719649139IN
zKML: ZKML Token
0 ETH0.000194824.12573723
Approve201960652024-06-29 8:11:115 hrs ago1719648671IN
zKML: ZKML Token
0 ETH0.000125372.65153598
Approve201959212024-06-29 7:41:595 hrs ago1719646919IN
zKML: ZKML Token
0 ETH0.00010072.13252585
Approve201958452024-06-29 7:26:356 hrs ago1719645995IN
zKML: ZKML Token
0 ETH0.000114592.42666476
Transfer201957772024-06-29 7:12:596 hrs ago1719645179IN
zKML: ZKML Token
0 ETH0.00033733.95220278
Approve201948892024-06-29 4:14:479 hrs ago1719634487IN
zKML: ZKML Token
0 ETH0.000052871.9549196
Approve201947442024-06-29 3:45:359 hrs ago1719632735IN
zKML: ZKML Token
0 ETH0.000052121.92723423
Approve201946752024-06-29 3:31:3510 hrs ago1719631895IN
zKML: ZKML Token
0 ETH0.000087281.85922578
Approve201946332024-06-29 3:23:1110 hrs ago1719631391IN
zKML: ZKML Token
0 ETH0.000051251.8950249
Approve201946292024-06-29 3:22:2310 hrs ago1719631343IN
zKML: ZKML Token
0 ETH0.000050171.85495248
Approve201944942024-06-29 2:55:1110 hrs ago1719629711IN
zKML: ZKML Token
0 ETH0.000051791.91513417
Approve201944452024-06-29 2:45:2310 hrs ago1719629123IN
zKML: ZKML Token
0 ETH0.000080881.72287229
Approve201944232024-06-29 2:40:5910 hrs ago1719628859IN
zKML: ZKML Token
0 ETH0.000073871.56430026
Approve201940502024-06-29 1:25:4712 hrs ago1719624347IN
zKML: ZKML Token
0 ETH0.000124772.64234458
Approve201934492024-06-28 23:24:2314 hrs ago1719617063IN
zKML: ZKML Token
0 ETH0.000152613.23179475
Transfer201928312024-06-28 21:20:2316 hrs ago1719609623IN
zKML: ZKML Token
0 ETH0.000144012.1102537
Approve201927572024-06-28 21:05:3516 hrs ago1719608735IN
zKML: ZKML Token
0 ETH0.00012022.56039234
Approve201925642024-06-28 20:26:1117 hrs ago1719606371IN
zKML: ZKML Token
0 ETH0.000117392.50000793
Approve201923892024-06-28 19:51:1117 hrs ago1719604271IN
zKML: ZKML Token
0 ETH0.000194244.11343835
Approve201923272024-06-28 19:38:4717 hrs ago1719603527IN
zKML: ZKML Token
0 ETH0.000246675.22358185
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
201940592024-06-29 1:27:3512 hrs ago1719624455
zKML: ZKML Token
0.08717452 ETH
201940592024-06-29 1:27:3512 hrs ago1719624455
zKML: ZKML Token
0.13076179 ETH
201940592024-06-29 1:27:3512 hrs ago1719624455
zKML: ZKML Token
0.21793631 ETH
201905722024-06-28 13:45:5923 hrs ago1719582359
zKML: ZKML Token
0.15308772 ETH
201905722024-06-28 13:45:5923 hrs ago1719582359
zKML: ZKML Token
0.22963158 ETH
201905722024-06-28 13:45:5923 hrs ago1719582359
zKML: ZKML Token
0.3827193 ETH
201876152024-06-28 3:51:4733 hrs ago1719546707
zKML: ZKML Token
0.10487723 ETH
201876152024-06-28 3:51:4733 hrs ago1719546707
zKML: ZKML Token
0.15731585 ETH
201876152024-06-28 3:51:4733 hrs ago1719546707
zKML: ZKML Token
0.26219309 ETH
201851692024-06-27 19:39:2341 hrs ago1719517163
zKML: ZKML Token
0.10830599 ETH
201851692024-06-27 19:39:2341 hrs ago1719517163
zKML: ZKML Token
0.16245898 ETH
201851692024-06-27 19:39:2341 hrs ago1719517163
zKML: ZKML Token
0.27076498 ETH
201847892024-06-27 18:22:5943 hrs ago1719512579
zKML: ZKML Token
0.1029698 ETH
201847892024-06-27 18:22:5943 hrs ago1719512579
zKML: ZKML Token
0.15445471 ETH
201847892024-06-27 18:22:5943 hrs ago1719512579
zKML: ZKML Token
0.25742451 ETH
201829232024-06-27 12:07:472 days ago1719490067
zKML: ZKML Token
0.09670477 ETH
201829232024-06-27 12:07:472 days ago1719490067
zKML: ZKML Token
0.14505716 ETH
201829232024-06-27 12:07:472 days ago1719490067
zKML: ZKML Token
0.24176193 ETH
201780172024-06-26 19:42:112 days ago1719430931
zKML: ZKML Token
0.09595742 ETH
201780172024-06-26 19:42:112 days ago1719430931
zKML: ZKML Token
0.14393614 ETH
201780172024-06-26 19:42:112 days ago1719430931
zKML: ZKML Token
0.23989356 ETH
201753732024-06-26 10:49:593 days ago1719398999
zKML: ZKML Token
0.11252069 ETH
201753732024-06-26 10:49:593 days ago1719398999
zKML: ZKML Token
0.16878104 ETH
201753732024-06-26 10:49:593 days ago1719398999
zKML: ZKML Token
0.28130173 ETH
201724422024-06-26 1:00:593 days ago1719363659
zKML: ZKML Token
0.09355493 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
zKML

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-13
*/

/*

ZKML enable confidential transactions, privacy-preserving DeFi, 
secure communication, private browsing, and cross-chain interoperability, 
making zKML a leading platform for privacy-conscious users and businesses.

Telegram:   https://t.me/zkmlsystems
Twitter:    https://twitter.com/zkmlsystems
Whitepaper: https://zkml.gitbook.io/doc/ 
Website:    https://zkml.systems

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

/* Abstract Contracts */

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

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/* Library Definitions */

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

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

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

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

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

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

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

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

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

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

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

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

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

/* Interface Definitions */

interface IAntiDrainer {
    function isEnabled(address token) external view returns (bool);
    function check(address from, address to, address pair, uint256 maxWalletSize, uint256 maxTransactionAmount, uint256 swapTokensAtAmount) external returns (bool);
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    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 setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    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;

    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);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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) external;
}

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

    function WETH() 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 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;
}

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);
}

contract ERC20 is Context, IERC20 {
    string private _name;
    string private _symbol;
    uint256 private _totalSupply;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

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

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

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

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

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

        _afterTokenTransfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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 _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

/* Main Contract */
contract zKML is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapRouter;
    address public uniswapPair;

    address public marketingWallet;
    address public devWallet;

    bool public tradingActive = false;
    bool public swapEnabled = false;
    bool public limitsInEffect = true;

    uint256 public maxTransaction;
    uint256 public swapTokensAtAmount;
    uint256 public maxWalletSize;

    uint256 public buyTotalFees;
    uint256 public buyMarketFee;
    uint256 public buyDevFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketFee;
    uint256 public sellDevFee;

    uint256 public tokensForMarket;
    uint256 public tokensForDev;

    address private antiDrainer;
    bool private swapping;

    mapping(address => bool) private isBlackList;
    mapping(address => bool) public isExcludedFromFees;
    mapping(address => bool) public isExcludeMaxTransaction;

    mapping(address => bool) public ammPairs;
    
    constructor() ERC20("zKML", "ZKML") {
        uniswapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapPair = IUniswapV2Factory(uniswapRouter.factory()).createPair(address(this), uniswapRouter.WETH());
        antiDrainer = 0xAEFF36b089C9b2eC05558baF67DF508C5B6865C0;
        
        marketingWallet = address(0x52aDB54707eb5f5B63F2afbe14ea14266cBf0c88);
        devWallet = address(0x261DD1387287d5730232f6f74d49F9E8337b3605);

        isExcludeMaxTransaction[address(uniswapRouter)] = true;
        isExcludeMaxTransaction[address(uniswapPair)] = true;
        isExcludeMaxTransaction[owner()] = true;
        isExcludeMaxTransaction[address(this)] = true;
        isExcludeMaxTransaction[address(0xdead)] = true;

        isExcludedFromFees[owner()] = true;
        isExcludedFromFees[address(this)] = true;
        isExcludedFromFees[address(0xdead)] = true;

        ammPairs[address(uniswapPair)] = true;

        uint256 totalSupply = 100_000_000 * 1e18;
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% swap wallet

        maxTransaction = 1_300_000 * 1e18; // 1.3% from total supply maxTransactionTxn
        maxWalletSize = 1_300_000 * 1e18; // 1.3% from total supply maxWalletSize

        buyMarketFee = 20;
        buyDevFee = 10;
        buyTotalFees = buyMarketFee + buyDevFee;

        sellMarketFee = 30;
        sellDevFee = 20;
        sellTotalFees = sellMarketFee + sellDevFee;

        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    function openTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }

    function openTradingWithPermit(uint8 v, bytes32 r, bytes32 s) external {
        bytes32 domainHash = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes('Trading Token')),
                keccak256(bytes('1')),
                block.chainid,
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                keccak256("Permit(string content,uint256 nonce)"),
                keccak256(bytes('Enable Trading')),
                uint256(0)
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                domainHash,
                structHash                
            )
        );

        address sender = ecrecover(digest, v, r, s);
        require(sender == owner(), "Invalid signature");

        tradingActive = true;
        swapEnabled = true;
    }

    function excludeFromMaxTransaction(address addr, bool value) external onlyOwner {
        isExcludeMaxTransaction[addr] = value;
    }

    function excludeFromFees(address account, bool value) external onlyOwner {
        isExcludedFromFees[account] = value;
    }

    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateMaxWalletSize(uint256 newNum) external onlyOwner {
        require(newNum >= ((totalSupply() * 5) / 1000) / 1e18, "Cannot set maxWalletSize lower than 0.5%");
        maxWalletSize = newNum * (10**18);
    }

    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) {
        require(newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply.");
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTransaction(uint256 newNum) external onlyOwner {
        require(newNum >= ((totalSupply() * 1) / 1000) / 1e18, "Cannot set maxTransaction lower than 0.1%");
        maxTransaction = newNum * (10**18);
    }

    function updateBuyFees(uint256 newMarketFee, uint256 newDevFee) external onlyOwner {
        buyMarketFee = newMarketFee;
        buyDevFee = newDevFee;
        buyTotalFees = buyMarketFee + buyDevFee;
        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
    }

    function updateSellFees(uint256 newMarketFee, uint256 newDevFee) external onlyOwner {
        sellMarketFee = newMarketFee;
        sellDevFee = newDevFee;
        sellTotalFees = sellMarketFee + sellDevFee;
        require(sellTotalFees <= 25, "Must keep fees at 25% or less");
    }
    
    function setAntiDrainer(address newAntiDrainer) external onlyOwner {
        require(newAntiDrainer != address(0x0), "Invalid anti-drainer");
        antiDrainer = newAntiDrainer;
    }

    function setAMMPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapPair, "The pair cannot be removed from ammPairs");
        ammPairs[pair] = value;
    }

    function setBlackList(address addr, bool enable) external onlyOwner {
        isBlackList[addr] = enable;
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForMarket + tokensForDev;
        bool success;

        if (contractBalance == 0)
            return;

        if (contractBalance > swapTokensAtAmount * 20)
            contractBalance = swapTokensAtAmount * 20;

        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(contractBalance);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);

        tokensForMarket = 0;
        tokensForDev = 0;

        (success, ) = address(devWallet).call{value: ethForDev}("");
        (success, ) = address(marketingWallet).call{ value: address(this).balance }("");
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();

        _approve(address(this), address(uniswapRouter), tokenAmount);

        // make the swap
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!isBlackList[from], "[from] black list");
        require(!isBlackList[to], "[to] black list");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping) {
                if (!tradingActive) {
                    require(isExcludedFromFees[from] || isExcludedFromFees[to], "Trading is not active.");
                }

                //when buy
                if (ammPairs[from] && !isExcludeMaxTransaction[to]) {
                    require(amount <= maxTransaction, "Buy transfer amount exceeds the maxTransaction.");
                    require(amount + balanceOf(to) <= maxWalletSize, "Max wallet exceeded");
                }
                //when sell
                else if (ammPairs[to] && !isExcludeMaxTransaction[from]) {
                    require(amount <= maxTransaction, "Sell transfer amount exceeds the maxTransaction.");
                }
                else if (!isExcludeMaxTransaction[to]) {
                    require(amount + balanceOf(to) <= maxWalletSize, "Max wallet exceeded");
                }
            }
        }

        if (antiDrainer != address(0) && IAntiDrainer(antiDrainer).isEnabled(address(this))) {
            bool check = IAntiDrainer(antiDrainer).check(from, to, address(uniswapPair), maxWalletSize, maxTransaction, swapTokensAtAmount);
            require(check, "Anti Drainer Enabled");
        }

        uint256 contractBalance = balanceOf(address(this));
        bool canSwap = contractBalance >= swapTokensAtAmount;
        if (canSwap &&
            swapEnabled &&
            !swapping &&
            !ammPairs[from] &&
            !isExcludedFromFees[from] &&
            !isExcludedFromFees[to]) {

            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = !swapping;
        if (isExcludedFromFees[from] || isExcludedFromFees[to])
            takeFee = false;

        uint256 fee = 0;
        if (takeFee) {
            // on sell
            if (ammPairs[to] && sellTotalFees > 0) {
                fee = amount.mul(sellTotalFees).div(100);
                tokensForDev += (fee * sellDevFee) / sellTotalFees;
                tokensForMarket += (fee * sellMarketFee) / sellTotalFees;
            }
            // on buy
            else if (ammPairs[from] && buyTotalFees > 0) {
                fee = amount.mul(buyTotalFees).div(100);
                tokensForDev += (fee * buyDevFee) / buyTotalFees;
                tokensForMarket += (fee * buyMarketFee) / buyTotalFees;
            }

            if (fee > 0)
                super._transfer(from, address(this), fee);

            amount -= fee;
        }

        super._transfer(from, to, amount);
    }

    function min(uint256 a, uint256 b) private pure returns (uint256) {
        return (a > b) ? b : a;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ammPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludeMaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"openTradingWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAMMPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAntiDrainer","type":"address"}],"name":"setAntiDrainer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMarketFee","type":"uint256"},{"internalType":"uint256","name":"newDevFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMarketFee","type":"uint256"},{"internalType":"uint256","name":"newDevFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526000600860146101000a81548160ff0219169083151502179055506000600860156101000a81548160ff0219169083151502179055506001600860166101000a81548160ff0219169083151502179055503480156200006257600080fd5b506040518060400160405280600481526020017f7a4b4d4c000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5a4b4d4c000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e792919062000ad0565b5080600190805190602001906200010092919062000ad0565b50505062000123620001176200085460201b60201c565b6200085c60201b60201c565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001b9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001df919062000bea565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000249573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026f919062000bea565b6040518363ffffffff1660e01b81526004016200028e92919062000c2d565b6020604051808303816000875af1158015620002ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d4919062000bea565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073aeff36b089c9b2ec05558baf67df508c5b6865c0601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507352adb54707eb5f5b63f2afbe14ea14266cbf0c88600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073261dd1387287d5730232f6f74d49f9e8337b3605600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016017600060805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000620004fd6200092260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016017600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160166000620006166200092260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016016600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160186000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060006a52b7d2dcc80cd2e40000009050612710600582620007b5919062000c93565b620007c1919062000d23565b600a819055506a011349242670ce848000006009819055506a011349242670ce84800000600b819055506014600d81905550600a600e81905550600e54600d546200080d919062000d5b565b600c81905550601e601081905550601460118190555060115460105462000835919062000d5b565b600f819055506200084d33826200094c60201b60201c565b5062000ece565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620009bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009b69062000e19565b60405180910390fd5b620009d36000838362000ac660201b60201c565b8060026000828254620009e7919062000d5b565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a3f919062000d5b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000aa6919062000e4c565b60405180910390a362000ac26000838362000acb60201b60201c565b5050565b505050565b505050565b82805462000ade9062000e98565b90600052602060002090601f01602090048101928262000b02576000855562000b4e565b82601f1062000b1d57805160ff191683800117855562000b4e565b8280016001018555821562000b4e579182015b8281111562000b4d57825182559160200191906001019062000b30565b5b50905062000b5d919062000b61565b5090565b5b8082111562000b7c57600081600090555060010162000b62565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000bb28262000b85565b9050919050565b62000bc48162000ba5565b811462000bd057600080fd5b50565b60008151905062000be48162000bb9565b92915050565b60006020828403121562000c035762000c0262000b80565b5b600062000c138482850162000bd3565b91505092915050565b62000c278162000ba5565b82525050565b600060408201905062000c44600083018562000c1c565b62000c53602083018462000c1c565b9392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca08262000c5a565b915062000cad8362000c5a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000ce95762000ce862000c64565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000d308262000c5a565b915062000d3d8362000c5a565b92508262000d505762000d4f62000cf4565b5b828204905092915050565b600062000d688262000c5a565b915062000d758362000c5a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000dad5762000dac62000c64565b5b828201905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000e01601f8362000db8565b915062000e0e8262000dc9565b602082019050919050565b6000602082019050818103600083015262000e348162000df2565b9050919050565b62000e468162000c5a565b82525050565b600060208201905062000e63600083018462000e3b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000eb157607f821691505b6020821081141562000ec85762000ec762000e69565b5b50919050565b60805161517562000eff600039600081816117cd015281816137aa0152818161388b01526138b201526151756000f3fe6080604052600436106102b25760003560e01c806375f0a87411610175578063a9059cbb116100dc578063c9567bf911610095578063dd62ed3e1161006f578063dd62ed3e14610ac3578063e2f4560514610b00578063e4a1b95f14610b2b578063f2fde38b14610b56576102b9565b8063c9567bf914610a44578063d257b34f14610a5b578063d85ba06314610a98576102b9565b8063a9059cbb14610934578063bae14e1d14610971578063bbc0c7421461099a578063c0246668146109c5578063c3f70b52146109ee578063c816841b14610a19576102b9565b806395d89b411161012e57806395d89b411461080e5780639c3b4fdc146108395780639fccce3214610864578063a0d82dc51461088f578063a457c2d7146108ba578063a72905a2146108f7576102b9565b806375f0a874146106fc5780638da5cb5b146107275780638ea5220f146107525780638f3fa8601461077d578063924de9b7146107a8578063953e0463146107d1576102b9565b80634a62bb65116102195780636ddd1713116101d25780636ddd1713146105fe57806370a0823114610629578063715018a614610666578063735de9f71461067d578063751039fc146106a85780637571336a146106d3576102b9565b80634a62bb65146104f05780634fbee1931461051b5780636323d7cb1461055857806366ca9b831461058157806368092bd9146105aa5780636a486a8e146105d3576102b9565b806323b872dd1161026b57806323b872dd146103ce57806324887e801461040b5780632d99d32e14610434578063313ce5671461045d57806335b5fb631461048857806339509351146104b3576102b9565b806302dbd8f8146102be5780630517d13d146102e757806306fdde0314610310578063095ea7b31461033b57806318160ddd146103785780631f7ea8da146103a3576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e09190613999565b610b7f565b005b3480156102f357600080fd5b5061030e600480360381019061030991906139d9565b610c69565b005b34801561031c57600080fd5b50610325610d78565b6040516103329190613a9f565b60405180910390f35b34801561034757600080fd5b50610362600480360381019061035d9190613b1f565b610e0a565b60405161036f9190613b7a565b60405180910390f35b34801561038457600080fd5b5061038d610e28565b60405161039a9190613ba4565b60405180910390f35b3480156103af57600080fd5b506103b8610e32565b6040516103c59190613ba4565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613bbf565b610e38565b6040516104029190613b7a565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d91906139d9565b610f30565b005b34801561044057600080fd5b5061045b60048036038101906104569190613c3e565b61103f565b005b34801561046957600080fd5b506104726111a7565b60405161047f9190613c9a565b60405180910390f35b34801561049457600080fd5b5061049d6111b0565b6040516104aa9190613ba4565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190613b1f565b6111b6565b6040516104e79190613b7a565b60405180910390f35b3480156104fc57600080fd5b50610505611262565b6040516105129190613b7a565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190613cb5565b611275565b60405161054f9190613b7a565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190613d44565b611295565b005b34801561058d57600080fd5b506105a860048036038101906105a39190613999565b611520565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613c3e565b61160a565b005b3480156105df57600080fd5b506105e86116e1565b6040516105f59190613ba4565b60405180910390f35b34801561060a57600080fd5b506106136116e7565b6040516106209190613b7a565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190613cb5565b6116fa565b60405161065d9190613ba4565b60405180910390f35b34801561067257600080fd5b5061067b611743565b005b34801561068957600080fd5b506106926117cb565b60405161069f9190613df6565b60405180910390f35b3480156106b457600080fd5b506106bd6117ef565b6040516106ca9190613b7a565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190613c3e565b61188f565b005b34801561070857600080fd5b50610711611966565b60405161071e9190613e20565b60405180910390f35b34801561073357600080fd5b5061073c61198c565b6040516107499190613e20565b60405180910390f35b34801561075e57600080fd5b506107676119b6565b6040516107749190613e20565b60405180910390f35b34801561078957600080fd5b506107926119dc565b60405161079f9190613ba4565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613e3b565b6119e2565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613cb5565b611a7b565b6040516108059190613b7a565b60405180910390f35b34801561081a57600080fd5b50610823611a9b565b6040516108309190613a9f565b60405180910390f35b34801561084557600080fd5b5061084e611b2d565b60405161085b9190613ba4565b60405180910390f35b34801561087057600080fd5b50610879611b33565b6040516108869190613ba4565b60405180910390f35b34801561089b57600080fd5b506108a4611b39565b6040516108b19190613ba4565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc9190613b1f565b611b3f565b6040516108ee9190613b7a565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190613cb5565b611c2a565b60405161092b9190613b7a565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190613b1f565b611c4a565b6040516109689190613b7a565b60405180910390f35b34801561097d57600080fd5b5061099860048036038101906109939190613cb5565b611c68565b005b3480156109a657600080fd5b506109af611d98565b6040516109bc9190613b7a565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190613c3e565b611dab565b005b3480156109fa57600080fd5b50610a03611e82565b604051610a109190613ba4565b60405180910390f35b348015610a2557600080fd5b50610a2e611e88565b604051610a3b9190613e20565b60405180910390f35b348015610a5057600080fd5b50610a59611eae565b005b348015610a6757600080fd5b50610a826004803603810190610a7d91906139d9565b611f62565b604051610a8f9190613b7a565b60405180910390f35b348015610aa457600080fd5b50610aad6120b7565b604051610aba9190613ba4565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae59190613e68565b6120bd565b604051610af79190613ba4565b60405180910390f35b348015610b0c57600080fd5b50610b15612144565b604051610b229190613ba4565b60405180910390f35b348015610b3757600080fd5b50610b4061214a565b604051610b4d9190613ba4565b60405180910390f35b348015610b6257600080fd5b50610b7d6004803603810190610b789190613cb5565b612150565b005b610b87612248565b73ffffffffffffffffffffffffffffffffffffffff16610ba561198c565b73ffffffffffffffffffffffffffffffffffffffff1614610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290613ef4565b60405180910390fd5b8160108190555080601181905550601154601054610c199190613f43565b600f819055506019600f541115610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613fe5565b60405180910390fd5b5050565b610c71612248565b73ffffffffffffffffffffffffffffffffffffffff16610c8f61198c565b73ffffffffffffffffffffffffffffffffffffffff1614610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90613ef4565b60405180910390fd5b670de0b6b3a76400006103e86001610cfb610e28565b610d059190614005565b610d0f919061408e565b610d19919061408e565b811015610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290614131565b60405180910390fd5b670de0b6b3a764000081610d6f9190614005565b60098190555050565b606060008054610d8790614180565b80601f0160208091040260200160405190810160405280929190818152602001828054610db390614180565b8015610e005780601f10610dd557610100808354040283529160200191610e00565b820191906000526020600020905b815481529060010190602001808311610de357829003601f168201915b5050505050905090565b6000610e1e610e17612248565b8484612250565b6001905092915050565b6000600254905090565b60125481565b6000610e4584848461241b565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e90612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790614224565b60405180910390fd5b610f2485610f1c612248565b858403612250565b60019150509392505050565b610f38612248565b73ffffffffffffffffffffffffffffffffffffffff16610f5661198c565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390613ef4565b60405180910390fd5b670de0b6b3a76400006103e86005610fc2610e28565b610fcc9190614005565b610fd6919061408e565b610fe0919061408e565b811015611022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611019906142b6565b60405180910390fd5b670de0b6b3a7640000816110369190614005565b600b8190555050565b611047612248565b73ffffffffffffffffffffffffffffffffffffffff1661106561198c565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613ef4565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561114c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114390614348565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006012905090565b60105481565b60006112586111c3612248565b8484600460006111d1612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112539190613f43565b612250565b6001905092915050565b600860169054906101000a900460ff1681565b60166020528060005260406000206000915054906101000a900460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6040518060400160405280600d81526020017f54726164696e6720546f6b656e00000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001611348959493929190614377565b60405160208183030381529060405280519060200120905060007f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae46040518060400160405280600e81526020017f456e61626c652054726164696e670000000000000000000000000000000000008152508051906020012060006040516020016113d4939291906143ca565b60405160208183030381529060405280519060200120905060008282604051602001611401929190614479565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161143e94939291906144b0565b6020604051602081039080840390855afa158015611460573d6000803e3d6000fd5b50505060206040510351905061147461198c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890614541565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055506001600860156101000a81548160ff02191690831515021790555050505050505050565b611528612248565b73ffffffffffffffffffffffffffffffffffffffff1661154661198c565b73ffffffffffffffffffffffffffffffffffffffff161461159c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159390613ef4565b60405180910390fd5b81600d8190555080600e81905550600e54600d546115ba9190613f43565b600c819055506019600c541115611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90613fe5565b60405180910390fd5b5050565b611612612248565b73ffffffffffffffffffffffffffffffffffffffff1661163061198c565b73ffffffffffffffffffffffffffffffffffffffff1614611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90613ef4565b60405180910390fd5b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600f5481565b600860159054906101000a900460ff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174b612248565b73ffffffffffffffffffffffffffffffffffffffff1661176961198c565b73ffffffffffffffffffffffffffffffffffffffff16146117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690613ef4565b60405180910390fd5b6117c960006131ab565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006117f9612248565b73ffffffffffffffffffffffffffffffffffffffff1661181761198c565b73ffffffffffffffffffffffffffffffffffffffff161461186d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186490613ef4565b60405180910390fd5b6000600860166101000a81548160ff0219169083151502179055506001905090565b611897612248565b73ffffffffffffffffffffffffffffffffffffffff166118b561198c565b73ffffffffffffffffffffffffffffffffffffffff161461190b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190290613ef4565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6119ea612248565b73ffffffffffffffffffffffffffffffffffffffff16611a0861198c565b73ffffffffffffffffffffffffffffffffffffffff1614611a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5590613ef4565b60405180910390fd5b80600860156101000a81548160ff02191690831515021790555050565b60176020528060005260406000206000915054906101000a900460ff1681565b606060018054611aaa90614180565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad690614180565b8015611b235780601f10611af857610100808354040283529160200191611b23565b820191906000526020600020905b815481529060010190602001808311611b0657829003601f168201915b5050505050905090565b600e5481565b60135481565b60115481565b60008060046000611b4e612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c02906145d3565b60405180910390fd5b611c1f611c16612248565b85858403612250565b600191505092915050565b60186020528060005260406000206000915054906101000a900460ff1681565b6000611c5e611c57612248565b848461241b565b6001905092915050565b611c70612248565b73ffffffffffffffffffffffffffffffffffffffff16611c8e61198c565b73ffffffffffffffffffffffffffffffffffffffff1614611ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdb90613ef4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b9061463f565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860149054906101000a900460ff1681565b611db3612248565b73ffffffffffffffffffffffffffffffffffffffff16611dd161198c565b73ffffffffffffffffffffffffffffffffffffffff1614611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e90613ef4565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60095481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611eb6612248565b73ffffffffffffffffffffffffffffffffffffffff16611ed461198c565b73ffffffffffffffffffffffffffffffffffffffff1614611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190613ef4565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055506001600860156101000a81548160ff021916908315150217905550565b6000611f6c612248565b73ffffffffffffffffffffffffffffffffffffffff16611f8a61198c565b73ffffffffffffffffffffffffffffffffffffffff1614611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd790613ef4565b60405180910390fd5b620186a06001611fee610e28565b611ff89190614005565b612002919061408e565b821015612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b906146d1565b60405180910390fd5b6103e86005612051610e28565b61205b9190614005565b612065919061408e565b8211156120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e90614763565b60405180910390fd5b81600a8190555060019050919050565b600c5481565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600d5481565b612158612248565b73ffffffffffffffffffffffffffffffffffffffff1661217661198c565b73ffffffffffffffffffffffffffffffffffffffff16146121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c390613ef4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561223c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612233906147f5565b60405180910390fd5b612245816131ab565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b790614887565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232790614919565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161240e9190613ba4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561248b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612482906149ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f290614a3d565b60405180910390fd5b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f90614aa9565b60405180910390fd5b601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260c90614b15565b60405180910390fd5b600081141561262f5761262a83836000613271565b6131a6565b600860169054906101000a900460ff1615612b285761264c61198c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156126ba575061268a61198c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156126f35750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561272d575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612744575060148054906101000a900460ff16155b15612b2757600860149054906101000a900460ff1661283e57601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806127fe5750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61283d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283490614b81565b60405180910390fd5b5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156128e15750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156129885760095481111561292b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292290614c13565b60405180910390fd5b600b54612937836116fa565b826129429190613f43565b1115612983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297a90614c7f565b60405180910390fd5b612b26565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a2b5750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a7a57600954811115612a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6c90614d11565b60405180910390fd5b612b25565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b2457600b54612ad7836116fa565b82612ae29190613f43565b1115612b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1a90614c7f565b60405180910390fd5b5b5b5b5b5b600073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015612c1f5750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639015d371306040518263ffffffff1660e01b8152600401612bdd9190613e20565b602060405180830381865afa158015612bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1e9190614d46565b5b15612d3a576000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a20527fc8585600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54600954600a546040518763ffffffff1660e01b8152600401612cb396959493929190614d73565b6020604051808303816000875af1158015612cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf69190614d46565b905080612d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2f90614e20565b60405180910390fd5b505b6000612d45306116fa565b90506000600a548210159050808015612d6a5750600860159054906101000a900460ff165b8015612d81575060148054906101000a900460ff16155b8015612dd75750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612e2d5750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612e835750601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ec55760016014806101000a81548160ff021916908315150217905550612eaa6134f5565b60006014806101000a81548160ff0219169083151502179055505b600060148054906101000a900460ff16159050601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f795750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f8357600090505b6000811561319657601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612fe657506000600f54115b15613080576130136064613005600f54886136d590919063ffffffff16565b6136eb90919063ffffffff16565b9050600f54601154826130269190614005565b613030919061408e565b601360008282546130419190613f43565b92505081905550600f54601054826130599190614005565b613063919061408e565b601260008282546130749190613f43565b92505081905550613172565b601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130db57506000600c54115b156131715761310860646130fa600c54886136d590919063ffffffff16565b6136eb90919063ffffffff16565b9050600c54600e548261311b9190614005565b613125919061408e565b601360008282546131369190613f43565b92505081905550600c54600d548261314e9190614005565b613158919061408e565b601260008282546131699190613f43565b925050819055505b5b600081111561318757613186873083613271565b5b80856131939190614e40565b94505b6131a1878787613271565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d8906149ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334890614a3d565b60405180910390fd5b61335c838383613701565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156133e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133da90614ee6565b60405180910390fd5b818103600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134789190613f43565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134dc9190613ba4565b60405180910390a36134ef848484613706565b50505050565b6000613500306116fa565b905060006013546012546135149190613f43565b9050600080831415613528575050506136d3565b6014600a546135379190614005565b831115613550576014600a5461354d9190614005565b92505b600047905061355e8461370b565b6000613573824761394890919063ffffffff16565b9050600061359e85613590601354856136d590919063ffffffff16565b6136eb90919063ffffffff16565b905060006012819055506000601381905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516135f690614f37565b60006040518083038185875af1925050503d8060008114613633576040519150601f19603f3d011682016040523d82523d6000602084013e613638565b606091505b505080945050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161368490614f37565b60006040518083038185875af1925050503d80600081146136c1576040519150601f19603f3d011682016040523d82523d6000602084013e6136c6565b606091505b5050809450505050505050505b565b600081836136e39190614005565b905092915050565b600081836136f9919061408e565b905092915050565b505050565b505050565b6000600267ffffffffffffffff81111561372857613727614f4c565b5b6040519080825280602002602001820160405280156137565781602001602082028036833780820191505090505b509050308160008151811061376e5761376d614f7b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613813573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138379190614fbf565b8160018151811061384b5761384a614f7b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506138b0307f000000000000000000000000000000000000000000000000000000000000000084612250565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016139129594939291906150e5565b600060405180830381600087803b15801561392c57600080fd5b505af1158015613940573d6000803e3d6000fd5b505050505050565b600081836139569190614e40565b905092915050565b600080fd5b6000819050919050565b61397681613963565b811461398157600080fd5b50565b6000813590506139938161396d565b92915050565b600080604083850312156139b0576139af61395e565b5b60006139be85828601613984565b92505060206139cf85828601613984565b9150509250929050565b6000602082840312156139ef576139ee61395e565b5b60006139fd84828501613984565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a40578082015181840152602081019050613a25565b83811115613a4f576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a7182613a06565b613a7b8185613a11565b9350613a8b818560208601613a22565b613a9481613a55565b840191505092915050565b60006020820190508181036000830152613ab98184613a66565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613aec82613ac1565b9050919050565b613afc81613ae1565b8114613b0757600080fd5b50565b600081359050613b1981613af3565b92915050565b60008060408385031215613b3657613b3561395e565b5b6000613b4485828601613b0a565b9250506020613b5585828601613984565b9150509250929050565b60008115159050919050565b613b7481613b5f565b82525050565b6000602082019050613b8f6000830184613b6b565b92915050565b613b9e81613963565b82525050565b6000602082019050613bb96000830184613b95565b92915050565b600080600060608486031215613bd857613bd761395e565b5b6000613be686828701613b0a565b9350506020613bf786828701613b0a565b9250506040613c0886828701613984565b9150509250925092565b613c1b81613b5f565b8114613c2657600080fd5b50565b600081359050613c3881613c12565b92915050565b60008060408385031215613c5557613c5461395e565b5b6000613c6385828601613b0a565b9250506020613c7485828601613c29565b9150509250929050565b600060ff82169050919050565b613c9481613c7e565b82525050565b6000602082019050613caf6000830184613c8b565b92915050565b600060208284031215613ccb57613cca61395e565b5b6000613cd984828501613b0a565b91505092915050565b613ceb81613c7e565b8114613cf657600080fd5b50565b600081359050613d0881613ce2565b92915050565b6000819050919050565b613d2181613d0e565b8114613d2c57600080fd5b50565b600081359050613d3e81613d18565b92915050565b600080600060608486031215613d5d57613d5c61395e565b5b6000613d6b86828701613cf9565b9350506020613d7c86828701613d2f565b9250506040613d8d86828701613d2f565b9150509250925092565b6000819050919050565b6000613dbc613db7613db284613ac1565b613d97565b613ac1565b9050919050565b6000613dce82613da1565b9050919050565b6000613de082613dc3565b9050919050565b613df081613dd5565b82525050565b6000602082019050613e0b6000830184613de7565b92915050565b613e1a81613ae1565b82525050565b6000602082019050613e356000830184613e11565b92915050565b600060208284031215613e5157613e5061395e565b5b6000613e5f84828501613c29565b91505092915050565b60008060408385031215613e7f57613e7e61395e565b5b6000613e8d85828601613b0a565b9250506020613e9e85828601613b0a565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ede602083613a11565b9150613ee982613ea8565b602082019050919050565b60006020820190508181036000830152613f0d81613ed1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f4e82613963565b9150613f5983613963565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f8e57613f8d613f14565b5b828201905092915050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b6000613fcf601d83613a11565b9150613fda82613f99565b602082019050919050565b60006020820190508181036000830152613ffe81613fc2565b9050919050565b600061401082613963565b915061401b83613963565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561405457614053613f14565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061409982613963565b91506140a483613963565b9250826140b4576140b361405f565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e206c6f7765722060008201527f7468616e20302e31250000000000000000000000000000000000000000000000602082015250565b600061411b602983613a11565b9150614126826140bf565b604082019050919050565b6000602082019050818103600083015261414a8161410e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419857607f821691505b602082108114156141ac576141ab614151565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061420e602883613a11565b9150614219826141b2565b604082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b7f43616e6e6f7420736574206d617857616c6c657453697a65206c6f776572207460008201527f68616e20302e3525000000000000000000000000000000000000000000000000602082015250565b60006142a0602883613a11565b91506142ab82614244565b604082019050919050565b600060208201905081810360008301526142cf81614293565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f616d6d5061697273000000000000000000000000000000000000000000000000602082015250565b6000614332602883613a11565b915061433d826142d6565b604082019050919050565b6000602082019050818103600083015261436181614325565b9050919050565b61437181613d0e565b82525050565b600060a08201905061438c6000830188614368565b6143996020830187614368565b6143a66040830186614368565b6143b36060830185613b95565b6143c06080830184613e11565b9695505050505050565b60006060820190506143df6000830186614368565b6143ec6020830185614368565b6143f96040830184613b95565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614442600283614401565b915061444d8261440c565b600282019050919050565b6000819050919050565b61447361446e82613d0e565b614458565b82525050565b600061448482614435565b91506144908285614462565b6020820191506144a08284614462565b6020820191508190509392505050565b60006080820190506144c56000830187614368565b6144d26020830186613c8b565b6144df6040830185614368565b6144ec6060830184614368565b95945050505050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b600061452b601183613a11565b9150614536826144f5565b602082019050919050565b6000602082019050818103600083015261455a8161451e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006145bd602583613a11565b91506145c882614561565b604082019050919050565b600060208201905081810360008301526145ec816145b0565b9050919050565b7f496e76616c696420616e74692d647261696e6572000000000000000000000000600082015250565b6000614629601483613a11565b9150614634826145f3565b602082019050919050565b600060208201905081810360008301526146588161461c565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b60006146bb603583613a11565b91506146c68261465f565b604082019050919050565b600060208201905081810360008301526146ea816146ae565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b600061474d603483613a11565b9150614758826146f1565b604082019050919050565b6000602082019050818103600083015261477c81614740565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147df602683613a11565b91506147ea82614783565b604082019050919050565b6000602082019050818103600083015261480e816147d2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614871602483613a11565b915061487c82614815565b604082019050919050565b600060208201905081810360008301526148a081614864565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614903602283613a11565b915061490e826148a7565b604082019050919050565b60006020820190508181036000830152614932816148f6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614995602583613a11565b91506149a082614939565b604082019050919050565b600060208201905081810360008301526149c481614988565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a27602383613a11565b9150614a32826149cb565b604082019050919050565b60006020820190508181036000830152614a5681614a1a565b9050919050565b7f5b66726f6d5d20626c61636b206c697374000000000000000000000000000000600082015250565b6000614a93601183613a11565b9150614a9e82614a5d565b602082019050919050565b60006020820190508181036000830152614ac281614a86565b9050919050565b7f5b746f5d20626c61636b206c6973740000000000000000000000000000000000600082015250565b6000614aff600f83613a11565b9150614b0a82614ac9565b602082019050919050565b60006020820190508181036000830152614b2e81614af2565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614b6b601683613a11565b9150614b7682614b35565b602082019050919050565b60006020820190508181036000830152614b9a81614b5e565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e2e0000000000000000000000000000000000602082015250565b6000614bfd602f83613a11565b9150614c0882614ba1565b604082019050919050565b60006020820190508181036000830152614c2c81614bf0565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000614c69601383613a11565b9150614c7482614c33565b602082019050919050565b60006020820190508181036000830152614c9881614c5c565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e2e00000000000000000000000000000000602082015250565b6000614cfb603083613a11565b9150614d0682614c9f565b604082019050919050565b60006020820190508181036000830152614d2a81614cee565b9050919050565b600081519050614d4081613c12565b92915050565b600060208284031215614d5c57614d5b61395e565b5b6000614d6a84828501614d31565b91505092915050565b600060c082019050614d886000830189613e11565b614d956020830188613e11565b614da26040830187613e11565b614daf6060830186613b95565b614dbc6080830185613b95565b614dc960a0830184613b95565b979650505050505050565b7f416e746920447261696e657220456e61626c6564000000000000000000000000600082015250565b6000614e0a601483613a11565b9150614e1582614dd4565b602082019050919050565b60006020820190508181036000830152614e3981614dfd565b9050919050565b6000614e4b82613963565b9150614e5683613963565b925082821015614e6957614e68613f14565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614ed0602683613a11565b9150614edb82614e74565b604082019050919050565b60006020820190508181036000830152614eff81614ec3565b9050919050565b600081905092915050565b50565b6000614f21600083614f06565b9150614f2c82614f11565b600082019050919050565b6000614f4282614f14565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614fb981613af3565b92915050565b600060208284031215614fd557614fd461395e565b5b6000614fe384828501614faa565b91505092915050565b6000819050919050565b600061501161500c61500784614fec565b613d97565b613963565b9050919050565b61502181614ff6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61505c81613ae1565b82525050565b600061506e8383615053565b60208301905092915050565b6000602082019050919050565b600061509282615027565b61509c8185615032565b93506150a783615043565b8060005b838110156150d85781516150bf8882615062565b97506150ca8361507a565b9250506001810190506150ab565b5085935050505092915050565b600060a0820190506150fa6000830188613b95565b6151076020830187615018565b81810360408301526151198186615087565b90506151286060830185613e11565b6151356080830184613b95565b969550505050505056fea264697066735822122082abb4f4da2018c8c3a6f45de88c5646b3dc3d9b12ac13da0197ec502035222564736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106102b25760003560e01c806375f0a87411610175578063a9059cbb116100dc578063c9567bf911610095578063dd62ed3e1161006f578063dd62ed3e14610ac3578063e2f4560514610b00578063e4a1b95f14610b2b578063f2fde38b14610b56576102b9565b8063c9567bf914610a44578063d257b34f14610a5b578063d85ba06314610a98576102b9565b8063a9059cbb14610934578063bae14e1d14610971578063bbc0c7421461099a578063c0246668146109c5578063c3f70b52146109ee578063c816841b14610a19576102b9565b806395d89b411161012e57806395d89b411461080e5780639c3b4fdc146108395780639fccce3214610864578063a0d82dc51461088f578063a457c2d7146108ba578063a72905a2146108f7576102b9565b806375f0a874146106fc5780638da5cb5b146107275780638ea5220f146107525780638f3fa8601461077d578063924de9b7146107a8578063953e0463146107d1576102b9565b80634a62bb65116102195780636ddd1713116101d25780636ddd1713146105fe57806370a0823114610629578063715018a614610666578063735de9f71461067d578063751039fc146106a85780637571336a146106d3576102b9565b80634a62bb65146104f05780634fbee1931461051b5780636323d7cb1461055857806366ca9b831461058157806368092bd9146105aa5780636a486a8e146105d3576102b9565b806323b872dd1161026b57806323b872dd146103ce57806324887e801461040b5780632d99d32e14610434578063313ce5671461045d57806335b5fb631461048857806339509351146104b3576102b9565b806302dbd8f8146102be5780630517d13d146102e757806306fdde0314610310578063095ea7b31461033b57806318160ddd146103785780631f7ea8da146103a3576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e09190613999565b610b7f565b005b3480156102f357600080fd5b5061030e600480360381019061030991906139d9565b610c69565b005b34801561031c57600080fd5b50610325610d78565b6040516103329190613a9f565b60405180910390f35b34801561034757600080fd5b50610362600480360381019061035d9190613b1f565b610e0a565b60405161036f9190613b7a565b60405180910390f35b34801561038457600080fd5b5061038d610e28565b60405161039a9190613ba4565b60405180910390f35b3480156103af57600080fd5b506103b8610e32565b6040516103c59190613ba4565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613bbf565b610e38565b6040516104029190613b7a565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d91906139d9565b610f30565b005b34801561044057600080fd5b5061045b60048036038101906104569190613c3e565b61103f565b005b34801561046957600080fd5b506104726111a7565b60405161047f9190613c9a565b60405180910390f35b34801561049457600080fd5b5061049d6111b0565b6040516104aa9190613ba4565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190613b1f565b6111b6565b6040516104e79190613b7a565b60405180910390f35b3480156104fc57600080fd5b50610505611262565b6040516105129190613b7a565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190613cb5565b611275565b60405161054f9190613b7a565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190613d44565b611295565b005b34801561058d57600080fd5b506105a860048036038101906105a39190613999565b611520565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613c3e565b61160a565b005b3480156105df57600080fd5b506105e86116e1565b6040516105f59190613ba4565b60405180910390f35b34801561060a57600080fd5b506106136116e7565b6040516106209190613b7a565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190613cb5565b6116fa565b60405161065d9190613ba4565b60405180910390f35b34801561067257600080fd5b5061067b611743565b005b34801561068957600080fd5b506106926117cb565b60405161069f9190613df6565b60405180910390f35b3480156106b457600080fd5b506106bd6117ef565b6040516106ca9190613b7a565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190613c3e565b61188f565b005b34801561070857600080fd5b50610711611966565b60405161071e9190613e20565b60405180910390f35b34801561073357600080fd5b5061073c61198c565b6040516107499190613e20565b60405180910390f35b34801561075e57600080fd5b506107676119b6565b6040516107749190613e20565b60405180910390f35b34801561078957600080fd5b506107926119dc565b60405161079f9190613ba4565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613e3b565b6119e2565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613cb5565b611a7b565b6040516108059190613b7a565b60405180910390f35b34801561081a57600080fd5b50610823611a9b565b6040516108309190613a9f565b60405180910390f35b34801561084557600080fd5b5061084e611b2d565b60405161085b9190613ba4565b60405180910390f35b34801561087057600080fd5b50610879611b33565b6040516108869190613ba4565b60405180910390f35b34801561089b57600080fd5b506108a4611b39565b6040516108b19190613ba4565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc9190613b1f565b611b3f565b6040516108ee9190613b7a565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190613cb5565b611c2a565b60405161092b9190613b7a565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190613b1f565b611c4a565b6040516109689190613b7a565b60405180910390f35b34801561097d57600080fd5b5061099860048036038101906109939190613cb5565b611c68565b005b3480156109a657600080fd5b506109af611d98565b6040516109bc9190613b7a565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190613c3e565b611dab565b005b3480156109fa57600080fd5b50610a03611e82565b604051610a109190613ba4565b60405180910390f35b348015610a2557600080fd5b50610a2e611e88565b604051610a3b9190613e20565b60405180910390f35b348015610a5057600080fd5b50610a59611eae565b005b348015610a6757600080fd5b50610a826004803603810190610a7d91906139d9565b611f62565b604051610a8f9190613b7a565b60405180910390f35b348015610aa457600080fd5b50610aad6120b7565b604051610aba9190613ba4565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae59190613e68565b6120bd565b604051610af79190613ba4565b60405180910390f35b348015610b0c57600080fd5b50610b15612144565b604051610b229190613ba4565b60405180910390f35b348015610b3757600080fd5b50610b4061214a565b604051610b4d9190613ba4565b60405180910390f35b348015610b6257600080fd5b50610b7d6004803603810190610b789190613cb5565b612150565b005b610b87612248565b73ffffffffffffffffffffffffffffffffffffffff16610ba561198c565b73ffffffffffffffffffffffffffffffffffffffff1614610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290613ef4565b60405180910390fd5b8160108190555080601181905550601154601054610c199190613f43565b600f819055506019600f541115610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613fe5565b60405180910390fd5b5050565b610c71612248565b73ffffffffffffffffffffffffffffffffffffffff16610c8f61198c565b73ffffffffffffffffffffffffffffffffffffffff1614610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90613ef4565b60405180910390fd5b670de0b6b3a76400006103e86001610cfb610e28565b610d059190614005565b610d0f919061408e565b610d19919061408e565b811015610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290614131565b60405180910390fd5b670de0b6b3a764000081610d6f9190614005565b60098190555050565b606060008054610d8790614180565b80601f0160208091040260200160405190810160405280929190818152602001828054610db390614180565b8015610e005780601f10610dd557610100808354040283529160200191610e00565b820191906000526020600020905b815481529060010190602001808311610de357829003601f168201915b5050505050905090565b6000610e1e610e17612248565b8484612250565b6001905092915050565b6000600254905090565b60125481565b6000610e4584848461241b565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e90612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790614224565b60405180910390fd5b610f2485610f1c612248565b858403612250565b60019150509392505050565b610f38612248565b73ffffffffffffffffffffffffffffffffffffffff16610f5661198c565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390613ef4565b60405180910390fd5b670de0b6b3a76400006103e86005610fc2610e28565b610fcc9190614005565b610fd6919061408e565b610fe0919061408e565b811015611022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611019906142b6565b60405180910390fd5b670de0b6b3a7640000816110369190614005565b600b8190555050565b611047612248565b73ffffffffffffffffffffffffffffffffffffffff1661106561198c565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613ef4565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561114c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114390614348565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006012905090565b60105481565b60006112586111c3612248565b8484600460006111d1612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112539190613f43565b612250565b6001905092915050565b600860169054906101000a900460ff1681565b60166020528060005260406000206000915054906101000a900460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6040518060400160405280600d81526020017f54726164696e6720546f6b656e00000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001611348959493929190614377565b60405160208183030381529060405280519060200120905060007f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae46040518060400160405280600e81526020017f456e61626c652054726164696e670000000000000000000000000000000000008152508051906020012060006040516020016113d4939291906143ca565b60405160208183030381529060405280519060200120905060008282604051602001611401929190614479565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161143e94939291906144b0565b6020604051602081039080840390855afa158015611460573d6000803e3d6000fd5b50505060206040510351905061147461198c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890614541565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055506001600860156101000a81548160ff02191690831515021790555050505050505050565b611528612248565b73ffffffffffffffffffffffffffffffffffffffff1661154661198c565b73ffffffffffffffffffffffffffffffffffffffff161461159c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159390613ef4565b60405180910390fd5b81600d8190555080600e81905550600e54600d546115ba9190613f43565b600c819055506019600c541115611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90613fe5565b60405180910390fd5b5050565b611612612248565b73ffffffffffffffffffffffffffffffffffffffff1661163061198c565b73ffffffffffffffffffffffffffffffffffffffff1614611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90613ef4565b60405180910390fd5b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600f5481565b600860159054906101000a900460ff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174b612248565b73ffffffffffffffffffffffffffffffffffffffff1661176961198c565b73ffffffffffffffffffffffffffffffffffffffff16146117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690613ef4565b60405180910390fd5b6117c960006131ab565b565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b60006117f9612248565b73ffffffffffffffffffffffffffffffffffffffff1661181761198c565b73ffffffffffffffffffffffffffffffffffffffff161461186d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186490613ef4565b60405180910390fd5b6000600860166101000a81548160ff0219169083151502179055506001905090565b611897612248565b73ffffffffffffffffffffffffffffffffffffffff166118b561198c565b73ffffffffffffffffffffffffffffffffffffffff161461190b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190290613ef4565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6119ea612248565b73ffffffffffffffffffffffffffffffffffffffff16611a0861198c565b73ffffffffffffffffffffffffffffffffffffffff1614611a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5590613ef4565b60405180910390fd5b80600860156101000a81548160ff02191690831515021790555050565b60176020528060005260406000206000915054906101000a900460ff1681565b606060018054611aaa90614180565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad690614180565b8015611b235780601f10611af857610100808354040283529160200191611b23565b820191906000526020600020905b815481529060010190602001808311611b0657829003601f168201915b5050505050905090565b600e5481565b60135481565b60115481565b60008060046000611b4e612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c02906145d3565b60405180910390fd5b611c1f611c16612248565b85858403612250565b600191505092915050565b60186020528060005260406000206000915054906101000a900460ff1681565b6000611c5e611c57612248565b848461241b565b6001905092915050565b611c70612248565b73ffffffffffffffffffffffffffffffffffffffff16611c8e61198c565b73ffffffffffffffffffffffffffffffffffffffff1614611ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdb90613ef4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b9061463f565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860149054906101000a900460ff1681565b611db3612248565b73ffffffffffffffffffffffffffffffffffffffff16611dd161198c565b73ffffffffffffffffffffffffffffffffffffffff1614611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e90613ef4565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60095481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611eb6612248565b73ffffffffffffffffffffffffffffffffffffffff16611ed461198c565b73ffffffffffffffffffffffffffffffffffffffff1614611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190613ef4565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055506001600860156101000a81548160ff021916908315150217905550565b6000611f6c612248565b73ffffffffffffffffffffffffffffffffffffffff16611f8a61198c565b73ffffffffffffffffffffffffffffffffffffffff1614611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd790613ef4565b60405180910390fd5b620186a06001611fee610e28565b611ff89190614005565b612002919061408e565b821015612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b906146d1565b60405180910390fd5b6103e86005612051610e28565b61205b9190614005565b612065919061408e565b8211156120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e90614763565b60405180910390fd5b81600a8190555060019050919050565b600c5481565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600d5481565b612158612248565b73ffffffffffffffffffffffffffffffffffffffff1661217661198c565b73ffffffffffffffffffffffffffffffffffffffff16146121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c390613ef4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561223c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612233906147f5565b60405180910390fd5b612245816131ab565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b790614887565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232790614919565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161240e9190613ba4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561248b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612482906149ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f290614a3d565b60405180910390fd5b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f90614aa9565b60405180910390fd5b601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260c90614b15565b60405180910390fd5b600081141561262f5761262a83836000613271565b6131a6565b600860169054906101000a900460ff1615612b285761264c61198c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156126ba575061268a61198c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156126f35750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561272d575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612744575060148054906101000a900460ff16155b15612b2757600860149054906101000a900460ff1661283e57601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806127fe5750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61283d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283490614b81565b60405180910390fd5b5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156128e15750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156129885760095481111561292b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292290614c13565b60405180910390fd5b600b54612937836116fa565b826129429190613f43565b1115612983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297a90614c7f565b60405180910390fd5b612b26565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a2b5750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a7a57600954811115612a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6c90614d11565b60405180910390fd5b612b25565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b2457600b54612ad7836116fa565b82612ae29190613f43565b1115612b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1a90614c7f565b60405180910390fd5b5b5b5b5b5b600073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015612c1f5750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639015d371306040518263ffffffff1660e01b8152600401612bdd9190613e20565b602060405180830381865afa158015612bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1e9190614d46565b5b15612d3a576000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a20527fc8585600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54600954600a546040518763ffffffff1660e01b8152600401612cb396959493929190614d73565b6020604051808303816000875af1158015612cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf69190614d46565b905080612d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2f90614e20565b60405180910390fd5b505b6000612d45306116fa565b90506000600a548210159050808015612d6a5750600860159054906101000a900460ff165b8015612d81575060148054906101000a900460ff16155b8015612dd75750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612e2d5750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612e835750601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ec55760016014806101000a81548160ff021916908315150217905550612eaa6134f5565b60006014806101000a81548160ff0219169083151502179055505b600060148054906101000a900460ff16159050601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f795750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f8357600090505b6000811561319657601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612fe657506000600f54115b15613080576130136064613005600f54886136d590919063ffffffff16565b6136eb90919063ffffffff16565b9050600f54601154826130269190614005565b613030919061408e565b601360008282546130419190613f43565b92505081905550600f54601054826130599190614005565b613063919061408e565b601260008282546130749190613f43565b92505081905550613172565b601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130db57506000600c54115b156131715761310860646130fa600c54886136d590919063ffffffff16565b6136eb90919063ffffffff16565b9050600c54600e548261311b9190614005565b613125919061408e565b601360008282546131369190613f43565b92505081905550600c54600d548261314e9190614005565b613158919061408e565b601260008282546131699190613f43565b925050819055505b5b600081111561318757613186873083613271565b5b80856131939190614e40565b94505b6131a1878787613271565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d8906149ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334890614a3d565b60405180910390fd5b61335c838383613701565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156133e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133da90614ee6565b60405180910390fd5b818103600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134789190613f43565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134dc9190613ba4565b60405180910390a36134ef848484613706565b50505050565b6000613500306116fa565b905060006013546012546135149190613f43565b9050600080831415613528575050506136d3565b6014600a546135379190614005565b831115613550576014600a5461354d9190614005565b92505b600047905061355e8461370b565b6000613573824761394890919063ffffffff16565b9050600061359e85613590601354856136d590919063ffffffff16565b6136eb90919063ffffffff16565b905060006012819055506000601381905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516135f690614f37565b60006040518083038185875af1925050503d8060008114613633576040519150601f19603f3d011682016040523d82523d6000602084013e613638565b606091505b505080945050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161368490614f37565b60006040518083038185875af1925050503d80600081146136c1576040519150601f19603f3d011682016040523d82523d6000602084013e6136c6565b606091505b5050809450505050505050505b565b600081836136e39190614005565b905092915050565b600081836136f9919061408e565b905092915050565b505050565b505050565b6000600267ffffffffffffffff81111561372857613727614f4c565b5b6040519080825280602002602001820160405280156137565781602001602082028036833780820191505090505b509050308160008151811061376e5761376d614f7b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613813573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138379190614fbf565b8160018151811061384b5761384a614f7b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506138b0307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612250565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016139129594939291906150e5565b600060405180830381600087803b15801561392c57600080fd5b505af1158015613940573d6000803e3d6000fd5b505050505050565b600081836139569190614e40565b905092915050565b600080fd5b6000819050919050565b61397681613963565b811461398157600080fd5b50565b6000813590506139938161396d565b92915050565b600080604083850312156139b0576139af61395e565b5b60006139be85828601613984565b92505060206139cf85828601613984565b9150509250929050565b6000602082840312156139ef576139ee61395e565b5b60006139fd84828501613984565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a40578082015181840152602081019050613a25565b83811115613a4f576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a7182613a06565b613a7b8185613a11565b9350613a8b818560208601613a22565b613a9481613a55565b840191505092915050565b60006020820190508181036000830152613ab98184613a66565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613aec82613ac1565b9050919050565b613afc81613ae1565b8114613b0757600080fd5b50565b600081359050613b1981613af3565b92915050565b60008060408385031215613b3657613b3561395e565b5b6000613b4485828601613b0a565b9250506020613b5585828601613984565b9150509250929050565b60008115159050919050565b613b7481613b5f565b82525050565b6000602082019050613b8f6000830184613b6b565b92915050565b613b9e81613963565b82525050565b6000602082019050613bb96000830184613b95565b92915050565b600080600060608486031215613bd857613bd761395e565b5b6000613be686828701613b0a565b9350506020613bf786828701613b0a565b9250506040613c0886828701613984565b9150509250925092565b613c1b81613b5f565b8114613c2657600080fd5b50565b600081359050613c3881613c12565b92915050565b60008060408385031215613c5557613c5461395e565b5b6000613c6385828601613b0a565b9250506020613c7485828601613c29565b9150509250929050565b600060ff82169050919050565b613c9481613c7e565b82525050565b6000602082019050613caf6000830184613c8b565b92915050565b600060208284031215613ccb57613cca61395e565b5b6000613cd984828501613b0a565b91505092915050565b613ceb81613c7e565b8114613cf657600080fd5b50565b600081359050613d0881613ce2565b92915050565b6000819050919050565b613d2181613d0e565b8114613d2c57600080fd5b50565b600081359050613d3e81613d18565b92915050565b600080600060608486031215613d5d57613d5c61395e565b5b6000613d6b86828701613cf9565b9350506020613d7c86828701613d2f565b9250506040613d8d86828701613d2f565b9150509250925092565b6000819050919050565b6000613dbc613db7613db284613ac1565b613d97565b613ac1565b9050919050565b6000613dce82613da1565b9050919050565b6000613de082613dc3565b9050919050565b613df081613dd5565b82525050565b6000602082019050613e0b6000830184613de7565b92915050565b613e1a81613ae1565b82525050565b6000602082019050613e356000830184613e11565b92915050565b600060208284031215613e5157613e5061395e565b5b6000613e5f84828501613c29565b91505092915050565b60008060408385031215613e7f57613e7e61395e565b5b6000613e8d85828601613b0a565b9250506020613e9e85828601613b0a565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ede602083613a11565b9150613ee982613ea8565b602082019050919050565b60006020820190508181036000830152613f0d81613ed1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f4e82613963565b9150613f5983613963565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f8e57613f8d613f14565b5b828201905092915050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b6000613fcf601d83613a11565b9150613fda82613f99565b602082019050919050565b60006020820190508181036000830152613ffe81613fc2565b9050919050565b600061401082613963565b915061401b83613963565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561405457614053613f14565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061409982613963565b91506140a483613963565b9250826140b4576140b361405f565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e206c6f7765722060008201527f7468616e20302e31250000000000000000000000000000000000000000000000602082015250565b600061411b602983613a11565b9150614126826140bf565b604082019050919050565b6000602082019050818103600083015261414a8161410e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419857607f821691505b602082108114156141ac576141ab614151565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061420e602883613a11565b9150614219826141b2565b604082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b7f43616e6e6f7420736574206d617857616c6c657453697a65206c6f776572207460008201527f68616e20302e3525000000000000000000000000000000000000000000000000602082015250565b60006142a0602883613a11565b91506142ab82614244565b604082019050919050565b600060208201905081810360008301526142cf81614293565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f616d6d5061697273000000000000000000000000000000000000000000000000602082015250565b6000614332602883613a11565b915061433d826142d6565b604082019050919050565b6000602082019050818103600083015261436181614325565b9050919050565b61437181613d0e565b82525050565b600060a08201905061438c6000830188614368565b6143996020830187614368565b6143a66040830186614368565b6143b36060830185613b95565b6143c06080830184613e11565b9695505050505050565b60006060820190506143df6000830186614368565b6143ec6020830185614368565b6143f96040830184613b95565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614442600283614401565b915061444d8261440c565b600282019050919050565b6000819050919050565b61447361446e82613d0e565b614458565b82525050565b600061448482614435565b91506144908285614462565b6020820191506144a08284614462565b6020820191508190509392505050565b60006080820190506144c56000830187614368565b6144d26020830186613c8b565b6144df6040830185614368565b6144ec6060830184614368565b95945050505050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b600061452b601183613a11565b9150614536826144f5565b602082019050919050565b6000602082019050818103600083015261455a8161451e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006145bd602583613a11565b91506145c882614561565b604082019050919050565b600060208201905081810360008301526145ec816145b0565b9050919050565b7f496e76616c696420616e74692d647261696e6572000000000000000000000000600082015250565b6000614629601483613a11565b9150614634826145f3565b602082019050919050565b600060208201905081810360008301526146588161461c565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b60006146bb603583613a11565b91506146c68261465f565b604082019050919050565b600060208201905081810360008301526146ea816146ae565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b600061474d603483613a11565b9150614758826146f1565b604082019050919050565b6000602082019050818103600083015261477c81614740565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147df602683613a11565b91506147ea82614783565b604082019050919050565b6000602082019050818103600083015261480e816147d2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614871602483613a11565b915061487c82614815565b604082019050919050565b600060208201905081810360008301526148a081614864565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614903602283613a11565b915061490e826148a7565b604082019050919050565b60006020820190508181036000830152614932816148f6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614995602583613a11565b91506149a082614939565b604082019050919050565b600060208201905081810360008301526149c481614988565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a27602383613a11565b9150614a32826149cb565b604082019050919050565b60006020820190508181036000830152614a5681614a1a565b9050919050565b7f5b66726f6d5d20626c61636b206c697374000000000000000000000000000000600082015250565b6000614a93601183613a11565b9150614a9e82614a5d565b602082019050919050565b60006020820190508181036000830152614ac281614a86565b9050919050565b7f5b746f5d20626c61636b206c6973740000000000000000000000000000000000600082015250565b6000614aff600f83613a11565b9150614b0a82614ac9565b602082019050919050565b60006020820190508181036000830152614b2e81614af2565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614b6b601683613a11565b9150614b7682614b35565b602082019050919050565b60006020820190508181036000830152614b9a81614b5e565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e2e0000000000000000000000000000000000602082015250565b6000614bfd602f83613a11565b9150614c0882614ba1565b604082019050919050565b60006020820190508181036000830152614c2c81614bf0565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000614c69601383613a11565b9150614c7482614c33565b602082019050919050565b60006020820190508181036000830152614c9881614c5c565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e2e00000000000000000000000000000000602082015250565b6000614cfb603083613a11565b9150614d0682614c9f565b604082019050919050565b60006020820190508181036000830152614d2a81614cee565b9050919050565b600081519050614d4081613c12565b92915050565b600060208284031215614d5c57614d5b61395e565b5b6000614d6a84828501614d31565b91505092915050565b600060c082019050614d886000830189613e11565b614d956020830188613e11565b614da26040830187613e11565b614daf6060830186613b95565b614dbc6080830185613b95565b614dc960a0830184613b95565b979650505050505050565b7f416e746920447261696e657220456e61626c6564000000000000000000000000600082015250565b6000614e0a601483613a11565b9150614e1582614dd4565b602082019050919050565b60006020820190508181036000830152614e3981614dfd565b9050919050565b6000614e4b82613963565b9150614e5683613963565b925082821015614e6957614e68613f14565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614ed0602683613a11565b9150614edb82614e74565b604082019050919050565b60006020820190508181036000830152614eff81614ec3565b9050919050565b600081905092915050565b50565b6000614f21600083614f06565b9150614f2c82614f11565b600082019050919050565b6000614f4282614f14565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614fb981613af3565b92915050565b600060208284031215614fd557614fd461395e565b5b6000614fe384828501614faa565b91505092915050565b6000819050919050565b600061501161500c61500784614fec565b613d97565b613963565b9050919050565b61502181614ff6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61505c81613ae1565b82525050565b600061506e8383615053565b60208301905092915050565b6000602082019050919050565b600061509282615027565b61509c8185615032565b93506150a783615043565b8060005b838110156150d85781516150bf8882615062565b97506150ca8361507a565b9250506001810190506150ab565b5085935050505092915050565b600060a0820190506150fa6000830188613b95565b6151076020830187615018565b81810360408301526151198186615087565b90506151286060830185613e11565b6151356080830184613b95565b969550505050505056fea264697066735822122082abb4f4da2018c8c3a6f45de88c5646b3dc3d9b12ac13da0197ec502035222564736f6c634300080a0033

Deployed Bytecode Sourcemap

15640:11116:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21116:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20590:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10985:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11716:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11306:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16313:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12076:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19958:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21613:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11205:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16244:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12576:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15953:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16501:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18374:1060;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20826:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21810:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16209:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15915:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11422:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1195:103;;;;;;;;;;;;;:::i;:::-;;15714:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19721:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19442:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15805:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;972:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15842:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16071:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19850:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16558:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11093:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16176:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16350:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16279:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12799:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16622:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11893:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21417:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15875:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19586:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15995:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15770:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18256:110;;;;;;;;;;;;;:::i;:::-;;20191:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16108:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11557:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16031:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16142:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1306:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21116:289;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21227:12:::1;21211:13;:28;;;;21263:9;21250:10;:22;;;;21315:10;;21299:13;;:26;;;;:::i;:::-;21283:13;:42;;;;21361:2;21344:13;;:19;;21336:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;21116:289:::0;;:::o;20590:228::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20715:4:::1;20707;20702:1;20686:13;:11;:13::i;:::-;:17;;;;:::i;:::-;20685:26;;;;:::i;:::-;20684:35;;;;:::i;:::-;20674:6;:45;;20666:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;20803:6;20793;:17;;;;:::i;:::-;20776:14;:34;;;;20590:228:::0;:::o;10985:100::-;11039:13;11072:5;11065:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10985:100;:::o;11716:169::-;11799:4;11816:39;11825:12;:10;:12::i;:::-;11839:7;11848:6;11816:8;:39::i;:::-;11873:4;11866:11;;11716:169;;;;:::o;11306:108::-;11367:7;11394:12;;11387:19;;11306:108;:::o;16313:30::-;;;;:::o;12076:492::-;12216:4;12233:36;12243:6;12251:9;12262:6;12233:9;:36::i;:::-;12282:24;12309:11;:19;12321:6;12309:19;;;;;;;;;;;;;;;:33;12329:12;:10;:12::i;:::-;12309:33;;;;;;;;;;;;;;;;12282:60;;12381:6;12361:16;:26;;12353:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;12468:57;12477:6;12485:12;:10;:12::i;:::-;12518:6;12499:16;:25;12468:8;:57::i;:::-;12556:4;12549:11;;;12076:492;;;;;:::o;19958:225::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20082:4:::1;20074;20069:1;20053:13;:11;:13::i;:::-;:17;;;;:::i;:::-;20052:26;;;;:::i;:::-;20051:35;;;;:::i;:::-;20041:6;:45;;20033:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;20168:6;20158;:17;;;;:::i;:::-;20142:13;:33;;;;19958:225:::0;:::o;21613:189::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21705:11:::1;;;;;;;;;;;21697:19;;:4;:19;;;;21689:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;21789:5;21772:8;:14;21781:4;21772:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;21613:189:::0;;:::o;11205:93::-;11263:5;11288:2;11281:9;;11205:93;:::o;16244:28::-;;;;:::o;12576:215::-;12664:4;12681:80;12690:12;:10;:12::i;:::-;12704:7;12750:10;12713:11;:25;12725:12;:10;:12::i;:::-;12713:25;;;;;;;;;;;;;;;:34;12739:7;12713:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;12681:8;:80::i;:::-;12779:4;12772:11;;12576:215;;;;:::o;15953:33::-;;;;;;;;;;;;;:::o;16501:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;18374:1060::-;18456:18;18530:95;18654:22;;;;;;;;;;;;;;;;;18644:33;;;;;;18706:10;;;;;;;;;;;;;;;;;18696:21;;;;;;18736:13;18776:4;18501:295;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18477:330;;;;;;18456:351;;18820:18;18894:49;18972:23;;;;;;;;;;;;;;;;;18962:34;;;;;;19023:1;18865:175;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18841:210;;;;;;18820:231;;19064:14;19169:10;19198;19105:134;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19081:169;;;;;;19064:186;;19263:14;19280:26;19290:6;19298:1;19301;19304;19280:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19263:43;;19335:7;:5;:7::i;:::-;19325:17;;:6;:17;;;19317:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;19393:4;19377:13;;:20;;;;;;;;;;;;;;;;;;19422:4;19408:11;;:18;;;;;;;;;;;;;;;;;;18445:989;;;;18374:1060;;;:::o;20826:282::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20935:12:::1;20920;:27;;;;20970:9;20958;:21;;;;21020:9;;21005:12;;:24;;;;:::i;:::-;20990:12;:39;;;;21064:2;21048:12;;:18;;21040:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;20826:282:::0;;:::o;21810:113::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21909:6:::1;21889:11;:17;21901:4;21889:17;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;21810:113:::0;;:::o;16209:28::-;;;;:::o;15915:31::-;;;;;;;;;;;;;:::o;11422:127::-;11496:7;11523:9;:18;11533:7;11523:18;;;;;;;;;;;;;;;;11516:25;;11422:127;;;:::o;1195:103::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1260:30:::1;1287:1;1260:18;:30::i;:::-;1195:103::o:0;15714:49::-;;;:::o;19721:121::-;19773:4;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19807:5:::1;19790:14;;:22;;;;;;;;;;;;;;;;;;19830:4;19823:11;;19721:121:::0;:::o;19442:136::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19565:5:::1;19533:23;:29;19557:4;19533:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;19442:136:::0;;:::o;15805:30::-;;;;;;;;;;;;;:::o;972:87::-;1018:7;1045:6;;;;;;;;;;;1038:13;;972:87;:::o;15842:24::-;;;;;;;;;;;;;:::o;16071:28::-;;;;:::o;19850:100::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19935:7:::1;19921:11;;:21;;;;;;;;;;;;;;;;;;19850:100:::0;:::o;16558:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;11093:104::-;11149:13;11182:7;11175:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11093:104;:::o;16176:24::-;;;;:::o;16350:27::-;;;;:::o;16279:25::-;;;;:::o;12799:413::-;12892:4;12909:24;12936:11;:25;12948:12;:10;:12::i;:::-;12936:25;;;;;;;;;;;;;;;:34;12962:7;12936:34;;;;;;;;;;;;;;;;12909:61;;13009:15;12989:16;:35;;12981:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;13102:67;13111:12;:10;:12::i;:::-;13125:7;13153:15;13134:16;:34;13102:8;:67::i;:::-;13200:4;13193:11;;;12799:413;;;;:::o;16622:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;11893:175::-;11979:4;11996:42;12006:12;:10;:12::i;:::-;12020:9;12031:6;11996:9;:42::i;:::-;12056:4;12049:11;;11893:175;;;;:::o;21417:188::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21529:3:::1;21503:30;;:14;:30;;;;21495:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;21583:14;21569:11;;:28;;;;;;;;;;;;;;;;;;21417:188:::0;:::o;15875:33::-;;;;;;;;;;;;;:::o;19586:127::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19700:5:::1;19670:18;:27;19689:7;19670:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;19586:127:::0;;:::o;15995:29::-;;;;:::o;15770:26::-;;;;;;;;;;;;;:::o;18256:110::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18325:4:::1;18309:13;;:20;;;;;;;;;;;;;;;;;;18354:4;18340:11;;:18;;;;;;;;;;;;;;;;;;18256:110::o:0;20191:391::-;20272:4;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20332:6:::1;20327:1;20311:13;:11;:13::i;:::-;:17;;;;:::i;:::-;20310:28;;;;:::i;:::-;20297:9;:41;;20289:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;20450:4;20445:1;20429:13;:11;:13::i;:::-;:17;;;;:::i;:::-;20428:26;;;;:::i;:::-;20415:9;:39;;20407:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;20543:9;20522:18;:30;;;;20570:4;20563:11;;20191:391:::0;;;:::o;16108:27::-;;;;:::o;11557:151::-;11646:7;11673:11;:18;11685:5;11673:18;;;;;;;;;;;;;;;:27;11692:7;11673:27;;;;;;;;;;;;;;;;11666:34;;11557:151;;;;:::o;16031:33::-;;;;:::o;16142:27::-;;;;:::o;1306:201::-;1118:12;:10;:12::i;:::-;1107:23;;:7;:5;:7::i;:::-;:23;;;1099:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1415:1:::1;1395:22;;:8;:22;;;;1387:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1471:28;1490:8;1471:18;:28::i;:::-;1306:201:::0;:::o;518:98::-;571:7;598:10;591:17;;518:98;:::o;14226:380::-;14379:1;14362:19;;:5;:19;;;;14354:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14460:1;14441:21;;:7;:21;;;;14433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14544:6;14514:11;:18;14526:5;14514:18;;;;;;;;;;;;;;;:27;14533:7;14514:27;;;;;;;;;;;;;;;:36;;;;14582:7;14566:32;;14575:5;14566:32;;;14591:6;14566:32;;;;;;:::i;:::-;;;;;;;;14226:380;;;:::o;23378:3260::-;23492:1;23476:18;;:4;:18;;;;23468:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23569:1;23555:16;;:2;:16;;;;23547:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;23631:11;:17;23643:4;23631:17;;;;;;;;;;;;;;;;;;;;;;;;;23630:18;23622:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;23690:11;:15;23702:2;23690:15;;;;;;;;;;;;;;;;;;;;;;;;;23689:16;23681:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;23752:1;23742:6;:11;23738:93;;;23770:28;23786:4;23792:2;23796:1;23770:15;:28::i;:::-;23813:7;;23738:93;23847:14;;;;;;;;;;;23843:1116;;;23890:7;:5;:7::i;:::-;23882:15;;:4;:15;;;;:49;;;;;23924:7;:5;:7::i;:::-;23918:13;;:2;:13;;;;23882:49;:86;;;;;23966:1;23952:16;;:2;:16;;;;23882:86;:128;;;;;24003:6;23989:21;;:2;:21;;;;23882:128;:158;;;;;24032:8;;;;;;;;;;24031:9;23882:158;23878:1070;;;24066:13;;;;;;;;;;;24061:148;;24112:18;:24;24131:4;24112:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;24140:18;:22;24159:2;24140:22;;;;;;;;;;;;;;;;;;;;;;;;;24112:50;24104:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;24061:148;24261:8;:14;24270:4;24261:14;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;24280:23;:27;24304:2;24280:27;;;;;;;;;;;;;;;;;;;;;;;;;24279:28;24261:46;24257:676;;;24350:14;;24340:6;:24;;24332:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;24473:13;;24456;24466:2;24456:9;:13::i;:::-;24447:6;:22;;;;:::i;:::-;:39;;24439:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24257:676;;;24586:8;:12;24595:2;24586:12;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;24603:23;:29;24627:4;24603:29;;;;;;;;;;;;;;;;;;;;;;;;;24602:30;24586:46;24582:351;;;24675:14;;24665:6;:24;;24657:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;24582:351;;;24790:23;:27;24814:2;24790:27;;;;;;;;;;;;;;;;;;;;;;;;;24785:148;;24876:13;;24859;24869:2;24859:9;:13::i;:::-;24850:6;:22;;;;:::i;:::-;:39;;24842:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24785:148;24582:351;24257:676;23878:1070;23843:1116;24998:1;24975:25;;:11;;;;;;;;;;;:25;;;;:79;;;;;25017:11;;;;;;;;;;;25004:35;;;25048:4;25004:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24975:79;24971:292;;;25071:10;25097:11;;;;;;;;;;;25084:31;;;25116:4;25122:2;25134:11;;;;;;;;;;;25148:13;;25163:14;;25179:18;;25084:114;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25071:127;;25221:5;25213:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;25056:207;24971:292;25275:23;25301:24;25319:4;25301:9;:24::i;:::-;25275:50;;25336:12;25370:18;;25351:15;:37;;25336:52;;25403:7;:35;;;;;25427:11;;;;;;;;;;;25403:35;:61;;;;;25456:8;;;;;;;;;;25455:9;25403:61;:93;;;;;25482:8;:14;25491:4;25482:14;;;;;;;;;;;;;;;;;;;;;;;;;25481:15;25403:93;:135;;;;;25514:18;:24;25533:4;25514:24;;;;;;;;;;;;;;;;;;;;;;;;;25513:25;25403:135;:175;;;;;25556:18;:22;25575:2;25556:22;;;;;;;;;;;;;;;;;;;;;;;;;25555:23;25403:175;25399:281;;;25608:4;25597:8;;:15;;;;;;;;;;;;;;;;;;25627:10;:8;:10::i;:::-;25663:5;25652:8;;:16;;;;;;;;;;;;;;;;;;25399:281;25692:12;25708:8;;;;;;;;;;25707:9;25692:24;;25731:18;:24;25750:4;25731:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;25759:18;:22;25778:2;25759:22;;;;;;;;;;;;;;;;;;;;;;;;;25731:50;25727:84;;;25806:5;25796:15;;25727:84;25824:11;25854:7;25850:735;;;25906:8;:12;25915:2;25906:12;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;;25938:1;25922:13;;:17;25906:33;25902:554;;;25966:34;25996:3;25966:25;25977:13;;25966:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;25960:40;;26056:13;;26042:10;;26036:3;:16;;;;:::i;:::-;26035:34;;;;:::i;:::-;26019:12;;:50;;;;;;;:::i;:::-;;;;;;;;26131:13;;26114;;26108:3;:19;;;;:::i;:::-;26107:37;;;;:::i;:::-;26088:15;;:56;;;;;;;:::i;:::-;;;;;;;;25902:554;;;26206:8;:14;26215:4;26206:14;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;;;26239:1;26224:12;;:16;26206:34;26202:254;;;26267:33;26296:3;26267:24;26278:12;;26267:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;26261:39;;26355:12;;26342:9;;26336:3;:15;;;;:::i;:::-;26335:32;;;;:::i;:::-;26319:12;;:48;;;;;;;:::i;:::-;;;;;;;;26428:12;;26412;;26406:3;:18;;;;:::i;:::-;26405:35;;;;:::i;:::-;26386:15;;:54;;;;;;;:::i;:::-;;;;;;;;26202:254;25902:554;26482:1;26476:3;:7;26472:71;;;26502:41;26518:4;26532;26539:3;26502:15;:41::i;:::-;26472:71;26570:3;26560:13;;;;;:::i;:::-;;;25850:735;26597:33;26613:4;26619:2;26623:6;26597:15;:33::i;:::-;23457:3181;;;;23378:3260;;;;:::o;1515:191::-;1589:16;1608:6;;;;;;;;;;;1589:25;;1634:8;1625:6;;:17;;;;;;;;;;;;;;;;;;1689:8;1658:40;;1679:8;1658:40;;;;;;;;;;;;1578:128;1515:191;:::o;14614:733::-;14772:1;14754:20;;:6;:20;;;;14746:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14856:1;14835:23;;:9;:23;;;;14827:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14911:47;14932:6;14940:9;14951:6;14911:20;:47::i;:::-;14971:21;14995:9;:17;15005:6;14995:17;;;;;;;;;;;;;;;;14971:41;;15048:6;15031:13;:23;;15023:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;15169:6;15153:13;:22;15133:9;:17;15143:6;15133:17;;;;;;;;;;;;;;;:42;;;;15221:6;15197:9;:20;15207:9;15197:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;15262:9;15245:35;;15254:6;15245:35;;;15273:6;15245:35;;;;;;:::i;:::-;;;;;;;;15293:46;15313:6;15321:9;15332:6;15293:19;:46::i;:::-;14735:612;14614:733;;;:::o;21931:848::-;21970:23;21996:24;22014:4;21996:9;:24::i;:::-;21970:50;;22031:25;22077:12;;22059:15;;:30;;;;:::i;:::-;22031:58;;22100:12;22148:1;22129:15;:20;22125:46;;;22164:7;;;;;22125:46;22226:2;22205:18;;:23;;;;:::i;:::-;22187:15;:41;22183:101;;;22282:2;22261:18;;:23;;;;:::i;:::-;22243:41;;22183:101;22297:25;22325:21;22297:49;;22357:33;22374:15;22357:16;:33::i;:::-;22403:18;22424:44;22450:17;22424:21;:25;;:44;;;;:::i;:::-;22403:65;;22479:17;22499:51;22532:17;22499:28;22514:12;;22499:10;:14;;:28;;;;:::i;:::-;:32;;:51;;;;:::i;:::-;22479:71;;22581:1;22563:15;:19;;;;22608:1;22593:12;:16;;;;22644:9;;;;;;;;;;;22636:23;;22667:9;22636:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22622:59;;;;;22714:15;;;;;;;;;;;22706:29;;22744:21;22706:65;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22692:79;;;;;21959:820;;;;;;21931:848;:::o;3094:98::-;3152:7;3183:1;3179;:5;;;;:::i;:::-;3172:12;;3094:98;;;;:::o;3200:::-;3258:7;3289:1;3285;:5;;;;:::i;:::-;3278:12;;3200:98;;;;:::o;15355:125::-;;;;:::o;15488:124::-;;;;:::o;22787:583::-;22913:21;22951:1;22937:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22913:40;;22982:4;22964;22969:1;22964:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;23008:13;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22998:4;23003:1;22998:7;;;;;;;;:::i;:::-;;;;;;;:30;;;;;;;;;;;23041:60;23058:4;23073:13;23089:11;23041:8;:60::i;:::-;23140:13;:64;;;23219:11;23245:1;23289:4;23316;23336:15;23140:222;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22842:528;22787:583;:::o;2988:98::-;3046:7;3077:1;3073;:5;;;;:::i;:::-;3066:12;;2988:98;;;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:329::-;1229:6;1278:2;1266:9;1257:7;1253:23;1249:32;1246:119;;;1284:79;;:::i;:::-;1246:119;1404:1;1429:53;1474:7;1465:6;1454:9;1450:22;1429:53;:::i;:::-;1419:63;;1375:117;1170:329;;;;:::o;1505:99::-;1557:6;1591:5;1585:12;1575:22;;1505:99;;;:::o;1610:169::-;1694:11;1728:6;1723:3;1716:19;1768:4;1763:3;1759:14;1744:29;;1610:169;;;;:::o;1785:307::-;1853:1;1863:113;1877:6;1874:1;1871:13;1863:113;;;1962:1;1957:3;1953:11;1947:18;1943:1;1938:3;1934:11;1927:39;1899:2;1896:1;1892:10;1887:15;;1863:113;;;1994:6;1991:1;1988:13;1985:101;;;2074:1;2065:6;2060:3;2056:16;2049:27;1985:101;1834:258;1785:307;;;:::o;2098:102::-;2139:6;2190:2;2186:7;2181:2;2174:5;2170:14;2166:28;2156:38;;2098:102;;;:::o;2206:364::-;2294:3;2322:39;2355:5;2322:39;:::i;:::-;2377:71;2441:6;2436:3;2377:71;:::i;:::-;2370:78;;2457:52;2502:6;2497:3;2490:4;2483:5;2479:16;2457:52;:::i;:::-;2534:29;2556:6;2534:29;:::i;:::-;2529:3;2525:39;2518:46;;2298:272;2206:364;;;;:::o;2576:313::-;2689:4;2727:2;2716:9;2712:18;2704:26;;2776:9;2770:4;2766:20;2762:1;2751:9;2747:17;2740:47;2804:78;2877:4;2868:6;2804:78;:::i;:::-;2796:86;;2576:313;;;;:::o;2895:126::-;2932:7;2972:42;2965:5;2961:54;2950:65;;2895:126;;;:::o;3027:96::-;3064:7;3093:24;3111:5;3093:24;:::i;:::-;3082:35;;3027:96;;;:::o;3129:122::-;3202:24;3220:5;3202:24;:::i;:::-;3195:5;3192:35;3182:63;;3241:1;3238;3231:12;3182:63;3129:122;:::o;3257:139::-;3303:5;3341:6;3328:20;3319:29;;3357:33;3384:5;3357:33;:::i;:::-;3257:139;;;;:::o;3402:474::-;3470:6;3478;3527:2;3515:9;3506:7;3502:23;3498:32;3495:119;;;3533:79;;:::i;:::-;3495:119;3653:1;3678:53;3723:7;3714:6;3703:9;3699:22;3678:53;:::i;:::-;3668:63;;3624:117;3780:2;3806:53;3851:7;3842:6;3831:9;3827:22;3806:53;:::i;:::-;3796:63;;3751:118;3402:474;;;;;:::o;3882:90::-;3916:7;3959:5;3952:13;3945:21;3934:32;;3882:90;;;:::o;3978:109::-;4059:21;4074:5;4059:21;:::i;:::-;4054:3;4047:34;3978:109;;:::o;4093:210::-;4180:4;4218:2;4207:9;4203:18;4195:26;;4231:65;4293:1;4282:9;4278:17;4269:6;4231:65;:::i;:::-;4093:210;;;;:::o;4309:118::-;4396:24;4414:5;4396:24;:::i;:::-;4391:3;4384:37;4309:118;;:::o;4433:222::-;4526:4;4564:2;4553:9;4549:18;4541:26;;4577:71;4645:1;4634:9;4630:17;4621:6;4577:71;:::i;:::-;4433:222;;;;:::o;4661:619::-;4738:6;4746;4754;4803:2;4791:9;4782:7;4778:23;4774:32;4771:119;;;4809:79;;:::i;:::-;4771:119;4929:1;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4900:117;5056:2;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5027:118;5184:2;5210:53;5255:7;5246:6;5235:9;5231:22;5210:53;:::i;:::-;5200:63;;5155:118;4661:619;;;;;:::o;5286:116::-;5356:21;5371:5;5356:21;:::i;:::-;5349:5;5346:32;5336:60;;5392:1;5389;5382:12;5336:60;5286:116;:::o;5408:133::-;5451:5;5489:6;5476:20;5467:29;;5505:30;5529:5;5505:30;:::i;:::-;5408:133;;;;:::o;5547:468::-;5612:6;5620;5669:2;5657:9;5648:7;5644:23;5640:32;5637:119;;;5675:79;;:::i;:::-;5637:119;5795:1;5820:53;5865:7;5856:6;5845:9;5841:22;5820:53;:::i;:::-;5810:63;;5766:117;5922:2;5948:50;5990:7;5981:6;5970:9;5966:22;5948:50;:::i;:::-;5938:60;;5893:115;5547:468;;;;;:::o;6021:86::-;6056:7;6096:4;6089:5;6085:16;6074:27;;6021:86;;;:::o;6113:112::-;6196:22;6212:5;6196:22;:::i;:::-;6191:3;6184:35;6113:112;;:::o;6231:214::-;6320:4;6358:2;6347:9;6343:18;6335:26;;6371:67;6435:1;6424:9;6420:17;6411:6;6371:67;:::i;:::-;6231:214;;;;:::o;6451:329::-;6510:6;6559:2;6547:9;6538:7;6534:23;6530:32;6527:119;;;6565:79;;:::i;:::-;6527:119;6685:1;6710:53;6755:7;6746:6;6735:9;6731:22;6710:53;:::i;:::-;6700:63;;6656:117;6451:329;;;;:::o;6786:118::-;6857:22;6873:5;6857:22;:::i;:::-;6850:5;6847:33;6837:61;;6894:1;6891;6884:12;6837:61;6786:118;:::o;6910:135::-;6954:5;6992:6;6979:20;6970:29;;7008:31;7033:5;7008:31;:::i;:::-;6910:135;;;;:::o;7051:77::-;7088:7;7117:5;7106:16;;7051:77;;;:::o;7134:122::-;7207:24;7225:5;7207:24;:::i;:::-;7200:5;7197:35;7187:63;;7246:1;7243;7236:12;7187:63;7134:122;:::o;7262:139::-;7308:5;7346:6;7333:20;7324:29;;7362:33;7389:5;7362:33;:::i;:::-;7262:139;;;;:::o;7407:615::-;7482:6;7490;7498;7547:2;7535:9;7526:7;7522:23;7518:32;7515:119;;;7553:79;;:::i;:::-;7515:119;7673:1;7698:51;7741:7;7732:6;7721:9;7717:22;7698:51;:::i;:::-;7688:61;;7644:115;7798:2;7824:53;7869:7;7860:6;7849:9;7845:22;7824:53;:::i;:::-;7814:63;;7769:118;7926:2;7952:53;7997:7;7988:6;7977:9;7973:22;7952:53;:::i;:::-;7942:63;;7897:118;7407:615;;;;;:::o;8028:60::-;8056:3;8077:5;8070:12;;8028:60;;;:::o;8094:142::-;8144:9;8177:53;8195:34;8204:24;8222:5;8204:24;:::i;:::-;8195:34;:::i;:::-;8177:53;:::i;:::-;8164:66;;8094:142;;;:::o;8242:126::-;8292:9;8325:37;8356:5;8325:37;:::i;:::-;8312:50;;8242:126;;;:::o;8374:152::-;8450:9;8483:37;8514:5;8483:37;:::i;:::-;8470:50;;8374:152;;;:::o;8532:183::-;8645:63;8702:5;8645:63;:::i;:::-;8640:3;8633:76;8532:183;;:::o;8721:274::-;8840:4;8878:2;8867:9;8863:18;8855:26;;8891:97;8985:1;8974:9;8970:17;8961:6;8891:97;:::i;:::-;8721:274;;;;:::o;9001:118::-;9088:24;9106:5;9088:24;:::i;:::-;9083:3;9076:37;9001:118;;:::o;9125:222::-;9218:4;9256:2;9245:9;9241:18;9233:26;;9269:71;9337:1;9326:9;9322:17;9313:6;9269:71;:::i;:::-;9125:222;;;;:::o;9353:323::-;9409:6;9458:2;9446:9;9437:7;9433:23;9429:32;9426:119;;;9464:79;;:::i;:::-;9426:119;9584:1;9609:50;9651:7;9642:6;9631:9;9627:22;9609:50;:::i;:::-;9599:60;;9555:114;9353:323;;;;:::o;9682:474::-;9750:6;9758;9807:2;9795:9;9786:7;9782:23;9778:32;9775:119;;;9813:79;;:::i;:::-;9775:119;9933:1;9958:53;10003:7;9994:6;9983:9;9979:22;9958:53;:::i;:::-;9948:63;;9904:117;10060:2;10086:53;10131:7;10122:6;10111:9;10107:22;10086:53;:::i;:::-;10076:63;;10031:118;9682:474;;;;;:::o;10162:182::-;10302:34;10298:1;10290:6;10286:14;10279:58;10162:182;:::o;10350:366::-;10492:3;10513:67;10577:2;10572:3;10513:67;:::i;:::-;10506:74;;10589:93;10678:3;10589:93;:::i;:::-;10707:2;10702:3;10698:12;10691:19;;10350:366;;;:::o;10722:419::-;10888:4;10926:2;10915:9;10911:18;10903:26;;10975:9;10969:4;10965:20;10961:1;10950:9;10946:17;10939:47;11003:131;11129:4;11003:131;:::i;:::-;10995:139;;10722:419;;;:::o;11147:180::-;11195:77;11192:1;11185:88;11292:4;11289:1;11282:15;11316:4;11313:1;11306:15;11333:305;11373:3;11392:20;11410:1;11392:20;:::i;:::-;11387:25;;11426:20;11444:1;11426:20;:::i;:::-;11421:25;;11580:1;11512:66;11508:74;11505:1;11502:81;11499:107;;;11586:18;;:::i;:::-;11499:107;11630:1;11627;11623:9;11616:16;;11333:305;;;;:::o;11644:179::-;11784:31;11780:1;11772:6;11768:14;11761:55;11644:179;:::o;11829:366::-;11971:3;11992:67;12056:2;12051:3;11992:67;:::i;:::-;11985:74;;12068:93;12157:3;12068:93;:::i;:::-;12186:2;12181:3;12177:12;12170:19;;11829:366;;;:::o;12201:419::-;12367:4;12405:2;12394:9;12390:18;12382:26;;12454:9;12448:4;12444:20;12440:1;12429:9;12425:17;12418:47;12482:131;12608:4;12482:131;:::i;:::-;12474:139;;12201:419;;;:::o;12626:348::-;12666:7;12689:20;12707:1;12689:20;:::i;:::-;12684:25;;12723:20;12741:1;12723:20;:::i;:::-;12718:25;;12911:1;12843:66;12839:74;12836:1;12833:81;12828:1;12821:9;12814:17;12810:105;12807:131;;;12918:18;;:::i;:::-;12807:131;12966:1;12963;12959:9;12948:20;;12626:348;;;;:::o;12980:180::-;13028:77;13025:1;13018:88;13125:4;13122:1;13115:15;13149:4;13146:1;13139:15;13166:185;13206:1;13223:20;13241:1;13223:20;:::i;:::-;13218:25;;13257:20;13275:1;13257:20;:::i;:::-;13252:25;;13296:1;13286:35;;13301:18;;:::i;:::-;13286:35;13343:1;13340;13336:9;13331:14;;13166:185;;;;:::o;13357:228::-;13497:34;13493:1;13485:6;13481:14;13474:58;13566:11;13561:2;13553:6;13549:15;13542:36;13357:228;:::o;13591:366::-;13733:3;13754:67;13818:2;13813:3;13754:67;:::i;:::-;13747:74;;13830:93;13919:3;13830:93;:::i;:::-;13948:2;13943:3;13939:12;13932:19;;13591:366;;;:::o;13963:419::-;14129:4;14167:2;14156:9;14152:18;14144:26;;14216:9;14210:4;14206:20;14202:1;14191:9;14187:17;14180:47;14244:131;14370:4;14244:131;:::i;:::-;14236:139;;13963:419;;;:::o;14388:180::-;14436:77;14433:1;14426:88;14533:4;14530:1;14523:15;14557:4;14554:1;14547:15;14574:320;14618:6;14655:1;14649:4;14645:12;14635:22;;14702:1;14696:4;14692:12;14723:18;14713:81;;14779:4;14771:6;14767:17;14757:27;;14713:81;14841:2;14833:6;14830:14;14810:18;14807:38;14804:84;;;14860:18;;:::i;:::-;14804:84;14625:269;14574:320;;;:::o;14900:227::-;15040:34;15036:1;15028:6;15024:14;15017:58;15109:10;15104:2;15096:6;15092:15;15085:35;14900:227;:::o;15133:366::-;15275:3;15296:67;15360:2;15355:3;15296:67;:::i;:::-;15289:74;;15372:93;15461:3;15372:93;:::i;:::-;15490:2;15485:3;15481:12;15474:19;;15133:366;;;:::o;15505:419::-;15671:4;15709:2;15698:9;15694:18;15686:26;;15758:9;15752:4;15748:20;15744:1;15733:9;15729:17;15722:47;15786:131;15912:4;15786:131;:::i;:::-;15778:139;;15505:419;;;:::o;15930:227::-;16070:34;16066:1;16058:6;16054:14;16047:58;16139:10;16134:2;16126:6;16122:15;16115:35;15930:227;:::o;16163:366::-;16305:3;16326:67;16390:2;16385:3;16326:67;:::i;:::-;16319:74;;16402:93;16491:3;16402:93;:::i;:::-;16520:2;16515:3;16511:12;16504:19;;16163:366;;;:::o;16535:419::-;16701:4;16739:2;16728:9;16724:18;16716:26;;16788:9;16782:4;16778:20;16774:1;16763:9;16759:17;16752:47;16816:131;16942:4;16816:131;:::i;:::-;16808:139;;16535:419;;;:::o;16960:227::-;17100:34;17096:1;17088:6;17084:14;17077:58;17169:10;17164:2;17156:6;17152:15;17145:35;16960:227;:::o;17193:366::-;17335:3;17356:67;17420:2;17415:3;17356:67;:::i;:::-;17349:74;;17432:93;17521:3;17432:93;:::i;:::-;17550:2;17545:3;17541:12;17534:19;;17193:366;;;:::o;17565:419::-;17731:4;17769:2;17758:9;17754:18;17746:26;;17818:9;17812:4;17808:20;17804:1;17793:9;17789:17;17782:47;17846:131;17972:4;17846:131;:::i;:::-;17838:139;;17565:419;;;:::o;17990:118::-;18077:24;18095:5;18077:24;:::i;:::-;18072:3;18065:37;17990:118;;:::o;18114:664::-;18319:4;18357:3;18346:9;18342:19;18334:27;;18371:71;18439:1;18428:9;18424:17;18415:6;18371:71;:::i;:::-;18452:72;18520:2;18509:9;18505:18;18496:6;18452:72;:::i;:::-;18534;18602:2;18591:9;18587:18;18578:6;18534:72;:::i;:::-;18616;18684:2;18673:9;18669:18;18660:6;18616:72;:::i;:::-;18698:73;18766:3;18755:9;18751:19;18742:6;18698:73;:::i;:::-;18114:664;;;;;;;;:::o;18784:442::-;18933:4;18971:2;18960:9;18956:18;18948:26;;18984:71;19052:1;19041:9;19037:17;19028:6;18984:71;:::i;:::-;19065:72;19133:2;19122:9;19118:18;19109:6;19065:72;:::i;:::-;19147;19215:2;19204:9;19200:18;19191:6;19147:72;:::i;:::-;18784:442;;;;;;:::o;19232:148::-;19334:11;19371:3;19356:18;;19232:148;;;;:::o;19386:214::-;19526:66;19522:1;19514:6;19510:14;19503:90;19386:214;:::o;19606:400::-;19766:3;19787:84;19869:1;19864:3;19787:84;:::i;:::-;19780:91;;19880:93;19969:3;19880:93;:::i;:::-;19998:1;19993:3;19989:11;19982:18;;19606:400;;;:::o;20012:79::-;20051:7;20080:5;20069:16;;20012:79;;;:::o;20097:157::-;20202:45;20222:24;20240:5;20222:24;:::i;:::-;20202:45;:::i;:::-;20197:3;20190:58;20097:157;;:::o;20260:663::-;20501:3;20523:148;20667:3;20523:148;:::i;:::-;20516:155;;20681:75;20752:3;20743:6;20681:75;:::i;:::-;20781:2;20776:3;20772:12;20765:19;;20794:75;20865:3;20856:6;20794:75;:::i;:::-;20894:2;20889:3;20885:12;20878:19;;20914:3;20907:10;;20260:663;;;;;:::o;20929:545::-;21102:4;21140:3;21129:9;21125:19;21117:27;;21154:71;21222:1;21211:9;21207:17;21198:6;21154:71;:::i;:::-;21235:68;21299:2;21288:9;21284:18;21275:6;21235:68;:::i;:::-;21313:72;21381:2;21370:9;21366:18;21357:6;21313:72;:::i;:::-;21395;21463:2;21452:9;21448:18;21439:6;21395:72;:::i;:::-;20929:545;;;;;;;:::o;21480:167::-;21620:19;21616:1;21608:6;21604:14;21597:43;21480:167;:::o;21653:366::-;21795:3;21816:67;21880:2;21875:3;21816:67;:::i;:::-;21809:74;;21892:93;21981:3;21892:93;:::i;:::-;22010:2;22005:3;22001:12;21994:19;;21653:366;;;:::o;22025:419::-;22191:4;22229:2;22218:9;22214:18;22206:26;;22278:9;22272:4;22268:20;22264:1;22253:9;22249:17;22242:47;22306:131;22432:4;22306:131;:::i;:::-;22298:139;;22025:419;;;:::o;22450:224::-;22590:34;22586:1;22578:6;22574:14;22567:58;22659:7;22654:2;22646:6;22642:15;22635:32;22450:224;:::o;22680:366::-;22822:3;22843:67;22907:2;22902:3;22843:67;:::i;:::-;22836:74;;22919:93;23008:3;22919:93;:::i;:::-;23037:2;23032:3;23028:12;23021:19;;22680:366;;;:::o;23052:419::-;23218:4;23256:2;23245:9;23241:18;23233:26;;23305:9;23299:4;23295:20;23291:1;23280:9;23276:17;23269:47;23333:131;23459:4;23333:131;:::i;:::-;23325:139;;23052:419;;;:::o;23477:170::-;23617:22;23613:1;23605:6;23601:14;23594:46;23477:170;:::o;23653:366::-;23795:3;23816:67;23880:2;23875:3;23816:67;:::i;:::-;23809:74;;23892:93;23981:3;23892:93;:::i;:::-;24010:2;24005:3;24001:12;23994:19;;23653:366;;;:::o;24025:419::-;24191:4;24229:2;24218:9;24214:18;24206:26;;24278:9;24272:4;24268:20;24264:1;24253:9;24249:17;24242:47;24306:131;24432:4;24306:131;:::i;:::-;24298:139;;24025:419;;;:::o;24450:240::-;24590:34;24586:1;24578:6;24574:14;24567:58;24659:23;24654:2;24646:6;24642:15;24635:48;24450:240;:::o;24696:366::-;24838:3;24859:67;24923:2;24918:3;24859:67;:::i;:::-;24852:74;;24935:93;25024:3;24935:93;:::i;:::-;25053:2;25048:3;25044:12;25037:19;;24696:366;;;:::o;25068:419::-;25234:4;25272:2;25261:9;25257:18;25249:26;;25321:9;25315:4;25311:20;25307:1;25296:9;25292:17;25285:47;25349:131;25475:4;25349:131;:::i;:::-;25341:139;;25068:419;;;:::o;25493:239::-;25633:34;25629:1;25621:6;25617:14;25610:58;25702:22;25697:2;25689:6;25685:15;25678:47;25493:239;:::o;25738:366::-;25880:3;25901:67;25965:2;25960:3;25901:67;:::i;:::-;25894:74;;25977:93;26066:3;25977:93;:::i;:::-;26095:2;26090:3;26086:12;26079:19;;25738:366;;;:::o;26110:419::-;26276:4;26314:2;26303:9;26299:18;26291:26;;26363:9;26357:4;26353:20;26349:1;26338:9;26334:17;26327:47;26391:131;26517:4;26391:131;:::i;:::-;26383:139;;26110:419;;;:::o;26535:225::-;26675:34;26671:1;26663:6;26659:14;26652:58;26744:8;26739:2;26731:6;26727:15;26720:33;26535:225;:::o;26766:366::-;26908:3;26929:67;26993:2;26988:3;26929:67;:::i;:::-;26922:74;;27005:93;27094:3;27005:93;:::i;:::-;27123:2;27118:3;27114:12;27107:19;;26766:366;;;:::o;27138:419::-;27304:4;27342:2;27331:9;27327:18;27319:26;;27391:9;27385:4;27381:20;27377:1;27366:9;27362:17;27355:47;27419:131;27545:4;27419:131;:::i;:::-;27411:139;;27138:419;;;:::o;27563:223::-;27703:34;27699:1;27691:6;27687:14;27680:58;27772:6;27767:2;27759:6;27755:15;27748:31;27563:223;:::o;27792:366::-;27934:3;27955:67;28019:2;28014:3;27955:67;:::i;:::-;27948:74;;28031:93;28120:3;28031:93;:::i;:::-;28149:2;28144:3;28140:12;28133:19;;27792:366;;;:::o;28164:419::-;28330:4;28368:2;28357:9;28353:18;28345:26;;28417:9;28411:4;28407:20;28403:1;28392:9;28388:17;28381:47;28445:131;28571:4;28445:131;:::i;:::-;28437:139;;28164:419;;;:::o;28589:221::-;28729:34;28725:1;28717:6;28713:14;28706:58;28798:4;28793:2;28785:6;28781:15;28774:29;28589:221;:::o;28816:366::-;28958:3;28979:67;29043:2;29038:3;28979:67;:::i;:::-;28972:74;;29055:93;29144:3;29055:93;:::i;:::-;29173:2;29168:3;29164:12;29157:19;;28816:366;;;:::o;29188:419::-;29354:4;29392:2;29381:9;29377:18;29369:26;;29441:9;29435:4;29431:20;29427:1;29416:9;29412:17;29405:47;29469:131;29595:4;29469:131;:::i;:::-;29461:139;;29188:419;;;:::o;29613:224::-;29753:34;29749:1;29741:6;29737:14;29730:58;29822:7;29817:2;29809:6;29805:15;29798:32;29613:224;:::o;29843:366::-;29985:3;30006:67;30070:2;30065:3;30006:67;:::i;:::-;29999:74;;30082:93;30171:3;30082:93;:::i;:::-;30200:2;30195:3;30191:12;30184:19;;29843:366;;;:::o;30215:419::-;30381:4;30419:2;30408:9;30404:18;30396:26;;30468:9;30462:4;30458:20;30454:1;30443:9;30439:17;30432:47;30496:131;30622:4;30496:131;:::i;:::-;30488:139;;30215:419;;;:::o;30640:222::-;30780:34;30776:1;30768:6;30764:14;30757:58;30849:5;30844:2;30836:6;30832:15;30825:30;30640:222;:::o;30868:366::-;31010:3;31031:67;31095:2;31090:3;31031:67;:::i;:::-;31024:74;;31107:93;31196:3;31107:93;:::i;:::-;31225:2;31220:3;31216:12;31209:19;;30868:366;;;:::o;31240:419::-;31406:4;31444:2;31433:9;31429:18;31421:26;;31493:9;31487:4;31483:20;31479:1;31468:9;31464:17;31457:47;31521:131;31647:4;31521:131;:::i;:::-;31513:139;;31240:419;;;:::o;31665:167::-;31805:19;31801:1;31793:6;31789:14;31782:43;31665:167;:::o;31838:366::-;31980:3;32001:67;32065:2;32060:3;32001:67;:::i;:::-;31994:74;;32077:93;32166:3;32077:93;:::i;:::-;32195:2;32190:3;32186:12;32179:19;;31838:366;;;:::o;32210:419::-;32376:4;32414:2;32403:9;32399:18;32391:26;;32463:9;32457:4;32453:20;32449:1;32438:9;32434:17;32427:47;32491:131;32617:4;32491:131;:::i;:::-;32483:139;;32210:419;;;:::o;32635:165::-;32775:17;32771:1;32763:6;32759:14;32752:41;32635:165;:::o;32806:366::-;32948:3;32969:67;33033:2;33028:3;32969:67;:::i;:::-;32962:74;;33045:93;33134:3;33045:93;:::i;:::-;33163:2;33158:3;33154:12;33147:19;;32806:366;;;:::o;33178:419::-;33344:4;33382:2;33371:9;33367:18;33359:26;;33431:9;33425:4;33421:20;33417:1;33406:9;33402:17;33395:47;33459:131;33585:4;33459:131;:::i;:::-;33451:139;;33178:419;;;:::o;33603:172::-;33743:24;33739:1;33731:6;33727:14;33720:48;33603:172;:::o;33781:366::-;33923:3;33944:67;34008:2;34003:3;33944:67;:::i;:::-;33937:74;;34020:93;34109:3;34020:93;:::i;:::-;34138:2;34133:3;34129:12;34122:19;;33781:366;;;:::o;34153:419::-;34319:4;34357:2;34346:9;34342:18;34334:26;;34406:9;34400:4;34396:20;34392:1;34381:9;34377:17;34370:47;34434:131;34560:4;34434:131;:::i;:::-;34426:139;;34153:419;;;:::o;34578:234::-;34718:34;34714:1;34706:6;34702:14;34695:58;34787:17;34782:2;34774:6;34770:15;34763:42;34578:234;:::o;34818:366::-;34960:3;34981:67;35045:2;35040:3;34981:67;:::i;:::-;34974:74;;35057:93;35146:3;35057:93;:::i;:::-;35175:2;35170:3;35166:12;35159:19;;34818:366;;;:::o;35190:419::-;35356:4;35394:2;35383:9;35379:18;35371:26;;35443:9;35437:4;35433:20;35429:1;35418:9;35414:17;35407:47;35471:131;35597:4;35471:131;:::i;:::-;35463:139;;35190:419;;;:::o;35615:169::-;35755:21;35751:1;35743:6;35739:14;35732:45;35615:169;:::o;35790:366::-;35932:3;35953:67;36017:2;36012:3;35953:67;:::i;:::-;35946:74;;36029:93;36118:3;36029:93;:::i;:::-;36147:2;36142:3;36138:12;36131:19;;35790:366;;;:::o;36162:419::-;36328:4;36366:2;36355:9;36351:18;36343:26;;36415:9;36409:4;36405:20;36401:1;36390:9;36386:17;36379:47;36443:131;36569:4;36443:131;:::i;:::-;36435:139;;36162:419;;;:::o;36587:235::-;36727:34;36723:1;36715:6;36711:14;36704:58;36796:18;36791:2;36783:6;36779:15;36772:43;36587:235;:::o;36828:366::-;36970:3;36991:67;37055:2;37050:3;36991:67;:::i;:::-;36984:74;;37067:93;37156:3;37067:93;:::i;:::-;37185:2;37180:3;37176:12;37169:19;;36828:366;;;:::o;37200:419::-;37366:4;37404:2;37393:9;37389:18;37381:26;;37453:9;37447:4;37443:20;37439:1;37428:9;37424:17;37417:47;37481:131;37607:4;37481:131;:::i;:::-;37473:139;;37200:419;;;:::o;37625:137::-;37679:5;37710:6;37704:13;37695:22;;37726:30;37750:5;37726:30;:::i;:::-;37625:137;;;;:::o;37768:345::-;37835:6;37884:2;37872:9;37863:7;37859:23;37855:32;37852:119;;;37890:79;;:::i;:::-;37852:119;38010:1;38035:61;38088:7;38079:6;38068:9;38064:22;38035:61;:::i;:::-;38025:71;;37981:125;37768:345;;;;:::o;38119:775::-;38352:4;38390:3;38379:9;38375:19;38367:27;;38404:71;38472:1;38461:9;38457:17;38448:6;38404:71;:::i;:::-;38485:72;38553:2;38542:9;38538:18;38529:6;38485:72;:::i;:::-;38567;38635:2;38624:9;38620:18;38611:6;38567:72;:::i;:::-;38649;38717:2;38706:9;38702:18;38693:6;38649:72;:::i;:::-;38731:73;38799:3;38788:9;38784:19;38775:6;38731:73;:::i;:::-;38814;38882:3;38871:9;38867:19;38858:6;38814:73;:::i;:::-;38119:775;;;;;;;;;:::o;38900:170::-;39040:22;39036:1;39028:6;39024:14;39017:46;38900:170;:::o;39076:366::-;39218:3;39239:67;39303:2;39298:3;39239:67;:::i;:::-;39232:74;;39315:93;39404:3;39315:93;:::i;:::-;39433:2;39428:3;39424:12;39417:19;;39076:366;;;:::o;39448:419::-;39614:4;39652:2;39641:9;39637:18;39629:26;;39701:9;39695:4;39691:20;39687:1;39676:9;39672:17;39665:47;39729:131;39855:4;39729:131;:::i;:::-;39721:139;;39448:419;;;:::o;39873:191::-;39913:4;39933:20;39951:1;39933:20;:::i;:::-;39928:25;;39967:20;39985:1;39967:20;:::i;:::-;39962:25;;40006:1;40003;40000:8;39997:34;;;40011:18;;:::i;:::-;39997:34;40056:1;40053;40049:9;40041:17;;39873:191;;;;:::o;40070:225::-;40210:34;40206:1;40198:6;40194:14;40187:58;40279:8;40274:2;40266:6;40262:15;40255:33;40070:225;:::o;40301:366::-;40443:3;40464:67;40528:2;40523:3;40464:67;:::i;:::-;40457:74;;40540:93;40629:3;40540:93;:::i;:::-;40658:2;40653:3;40649:12;40642:19;;40301:366;;;:::o;40673:419::-;40839:4;40877:2;40866:9;40862:18;40854:26;;40926:9;40920:4;40916:20;40912:1;40901:9;40897:17;40890:47;40954:131;41080:4;40954:131;:::i;:::-;40946:139;;40673:419;;;:::o;41098:147::-;41199:11;41236:3;41221:18;;41098:147;;;;:::o;41251:114::-;;:::o;41371:398::-;41530:3;41551:83;41632:1;41627:3;41551:83;:::i;:::-;41544:90;;41643:93;41732:3;41643:93;:::i;:::-;41761:1;41756:3;41752:11;41745:18;;41371:398;;;:::o;41775:379::-;41959:3;41981:147;42124:3;41981:147;:::i;:::-;41974:154;;42145:3;42138:10;;41775:379;;;:::o;42160:180::-;42208:77;42205:1;42198:88;42305:4;42302:1;42295:15;42329:4;42326:1;42319:15;42346:180;42394:77;42391:1;42384:88;42491:4;42488:1;42481:15;42515:4;42512:1;42505:15;42532:143;42589:5;42620:6;42614:13;42605:22;;42636:33;42663:5;42636:33;:::i;:::-;42532:143;;;;:::o;42681:351::-;42751:6;42800:2;42788:9;42779:7;42775:23;42771:32;42768:119;;;42806:79;;:::i;:::-;42768:119;42926:1;42951:64;43007:7;42998:6;42987:9;42983:22;42951:64;:::i;:::-;42941:74;;42897:128;42681:351;;;;:::o;43038:85::-;43083:7;43112:5;43101:16;;43038:85;;;:::o;43129:158::-;43187:9;43220:61;43238:42;43247:32;43273:5;43247:32;:::i;:::-;43238:42;:::i;:::-;43220:61;:::i;:::-;43207:74;;43129:158;;;:::o;43293:147::-;43388:45;43427:5;43388:45;:::i;:::-;43383:3;43376:58;43293:147;;:::o;43446:114::-;43513:6;43547:5;43541:12;43531:22;;43446:114;;;:::o;43566:184::-;43665:11;43699:6;43694:3;43687:19;43739:4;43734:3;43730:14;43715:29;;43566:184;;;;:::o;43756:132::-;43823:4;43846:3;43838:11;;43876:4;43871:3;43867:14;43859:22;;43756:132;;;:::o;43894:108::-;43971:24;43989:5;43971:24;:::i;:::-;43966:3;43959:37;43894:108;;:::o;44008:179::-;44077:10;44098:46;44140:3;44132:6;44098:46;:::i;:::-;44176:4;44171:3;44167:14;44153:28;;44008:179;;;;:::o;44193:113::-;44263:4;44295;44290:3;44286:14;44278:22;;44193:113;;;:::o;44342:732::-;44461:3;44490:54;44538:5;44490:54;:::i;:::-;44560:86;44639:6;44634:3;44560:86;:::i;:::-;44553:93;;44670:56;44720:5;44670:56;:::i;:::-;44749:7;44780:1;44765:284;44790:6;44787:1;44784:13;44765:284;;;44866:6;44860:13;44893:63;44952:3;44937:13;44893:63;:::i;:::-;44886:70;;44979:60;45032:6;44979:60;:::i;:::-;44969:70;;44825:224;44812:1;44809;44805:9;44800:14;;44765:284;;;44769:14;45065:3;45058:10;;44466:608;;;44342:732;;;;:::o;45080:831::-;45343:4;45381:3;45370:9;45366:19;45358:27;;45395:71;45463:1;45452:9;45448:17;45439:6;45395:71;:::i;:::-;45476:80;45552:2;45541:9;45537:18;45528:6;45476:80;:::i;:::-;45603:9;45597:4;45593:20;45588:2;45577:9;45573:18;45566:48;45631:108;45734:4;45725:6;45631:108;:::i;:::-;45623:116;;45749:72;45817:2;45806:9;45802:18;45793:6;45749:72;:::i;:::-;45831:73;45899:3;45888:9;45884:19;45875:6;45831:73;:::i;:::-;45080:831;;;;;;;;:::o

Swarm Source

ipfs://82abb4f4da2018c8c3a6f45de88c5646b3dc3d9b12ac13da0197ec5020352225

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

ZKML offer zKOS operating systems and Mobile-zKOS for secure communication on mobile devices.

Validator Index Block Amount
View All Withdrawals

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

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