ETH Price: $2,296.62 (+1.40%)

Token

Landwolf (WOLF)
 

Overview

Max Total Supply

420,690,000,000,000 WOLF

Holders

28

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
7,000,000,000,000 WOLF

Value
$0.00
0x9ca01cd6771d56f7a45f590bd7f1ec501a512d9f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Landwolf

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 6 of 6: _Landwolf.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./BaseErc20.sol";
import "./FixedTaxable.sol";
import "./TaxDistributor.sol";

contract Landwolf is BaseErc20, FixedTaxable {

    constructor () {
        configure(0xfbfEaF0DA0F2fdE5c66dF570133aE35f3eB58c9A);
        deployer = msg.sender;
        symbol = "WOLF";
        name = "Landwolf";
        decimals = 18;

        // Swap
        address routerAddress = getRouterAddress();
        canAlwaysTrade[deployer] = true;
        IDEXRouter router = IDEXRouter(routerAddress);
        address native = router.WETH();
        address pair = IDEXFactory(router.factory()).createPair(native, address(this));
        exchanges[pair] = true;
        taxDistributor = new TaxDistributor(routerAddress, pair, native, 500, 500);

        // Tax
        minimumTimeBetweenSwaps = 1 seconds;
        minimumTokensBeforeSwap = 1 * 10 ** decimals;
        excludedFromTax[address(taxDistributor)] = true;
        taxDistributor.createWalletTax("Marketing", 400, 400, 0x821B2b0a9d1CE32a9e691414F6EDe2B9ACE03138, true);
        autoSwapTax = true;

        // Finalise
        _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1;
        _totalSupply = _totalSupply + (420_690_000_000_000 * 10 ** decimals);
        _balances[deployer] = _balances[deployer] + _totalSupply;
        emit Transfer(address(0), deployer, _totalSupply);
    }

    // Overrides

    function configure(address _owner) internal override(FixedTaxable, BaseErc20) {
        super.configure(_owner);
    }
    
    function preTransfer(address from, address to, uint256 value) override(FixedTaxable, BaseErc20) internal {      
        super.preTransfer(from, to, value);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) override(FixedTaxable, BaseErc20) internal returns (uint256) {
        return super.calculateTransferAmount(from, to, value);
    }

    function onOwnerChange(address from, address to) override(FixedTaxable, BaseErc20) internal {
        super.onOwnerChange(from, to);
    } 

    // Admin methods
    function setTaxWallet(address wallet) external {
        require(msg.sender == taxDistributor.getTaxWallet("Marketing"), "Only the tax wallet can change its address");
        taxDistributor.setTaxWallet("Marketing", wallet);
        emit ConfigurationChanged(msg.sender, "change to tax wallet");
    }
} 

File 1 of 6: AddressLibrary.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity 0.8.7;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 2 of 6: BaseErc20.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./AddressLibrary.sol";

abstract contract BaseErc20 is IERC20, IOwnable {
    using Address for address;

    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowed;
    uint256 internal _totalSupply;
    
    string public symbol;
    string public name;
    uint8 public decimals;
    
    address public override owner;
    address internal deployer;
    bool public launched;
    
    mapping (address => bool) internal canAlwaysTrade;
    mapping (address => bool) internal exchanges;
    
    event ConfigurationChanged(address indexed who, string option);

    modifier onlyOwner() {
        require(msg.sender == deployer, "can only be called by the contract owner");
        _;
    }
    
    modifier isLaunched() {
        require(launched, "can only be called once token is launched");
        _;
    }

    // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list
    modifier tradingEnabled(address from) {
        require(launched || from == owner || canAlwaysTrade[msg.sender], "trading not enabled");
        _;
    }
    
    function configure(address _owner) internal virtual {
        owner = _owner;
        canAlwaysTrade[owner] = true;
    }

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() external override view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param _owner The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address _owner) external override view returns (uint256) {
        return _balances[_owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address _owner, address spender) external override view returns (uint256) {
        return _allowed[_owner][spender];
    }

    /**
    * @dev Transfer token for a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) {
        _allowed[from][msg.sender] = _allowed[from][msg.sender] - value;
        _transfer(from, to, value);
        emit Approval(from, msg.sender, _allowed[from][msg.sender]);
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] + addedValue;
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] - subtractedValue;
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    receive() external payable {}
    
    // Virtual methods
    function launch() virtual external onlyOwner {
        require(launched == false, "contract already launched");
        launched = true;
        emit ConfigurationChanged(msg.sender, "contract launched");
    }
    
    function preTransfer(address from, address to, uint256 value) virtual internal { }

    function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) {
        require(from != to, "you cannot transfer to yourself");
        return value;
    }
    
    function onOwnerChange(address from, address to) virtual internal {
        canAlwaysTrade[from] = false;
        canAlwaysTrade[to] = true;
    }

    function postTransfer(address from, address to) virtual internal { }
    


    // Admin methods
    function changeOwner(address who) external onlyOwner {
        require(who != address(0), "cannot be zero address");
        onOwnerChange(owner, who);
        owner = who;
        emit ConfigurationChanged(msg.sender, "owner changed");
    }

    function removeNative() external onlyOwner {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(owner), balance);
    }

    function transferTokens(address token) external onlyOwner returns(bool){
        uint256 balance = IERC20(token).balanceOf(address(this));
        return IERC20(token).transfer(owner, balance);
    }
    
    function setCanAlwaysTrade(address who, bool on) external onlyOwner {
        require(canAlwaysTrade[who] != on, "already set");
        canAlwaysTrade[who] = on;
        emit ConfigurationChanged(msg.sender, "change to can always trade list");
    }
    
    function setExchange(address who, bool on) external onlyOwner {
        require(exchanges[who] != on, "already set");
        exchanges[who] = on;
        emit ConfigurationChanged(msg.sender, "change to exchange list");
    }
    
   
    // Private methods

    function getRouterAddress() internal view returns (address routerAddress) {
        if (block.chainid == 1 || block.chainid == 3 || block.chainid == 4  || block.chainid == 5) {
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM
        } else if (block.chainid == 56) {
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET
        } else if (block.chainid == 97) {
            routerAddress = 0xc99f3718dB7c90b020cBBbb47eD26b0BA0C6512B; // BSC TESTNET - https://pancakeswap.rainbit.me/
        } else {
            revert("Unknown Chain ID");
        }
    }

    /**
    * @dev Transfer token for a specified addresses
    * @param from The address to transfer from.
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function _transfer(address from, address to, uint256 value) private {
        require(to != address(0), "cannot be zero address");

        preTransfer(from, to, value);

        uint256 modifiedAmount = calculateTransferAmount(from, to, value);
        _balances[from] = _balances[from] - value;
        _balances[to] = _balances[to] + modifiedAmount;

        emit Transfer(from, to, modifiedAmount);

        postTransfer(from, to);
    }
}

File 3 of 6: FixedTaxable.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./BaseErc20.sol";

abstract contract FixedTaxable is BaseErc20 {
    
    ITaxDistributor taxDistributor;

    bool public autoSwapTax;
    uint256 public minimumTimeBetweenSwaps;
    uint256 public minimumTokensBeforeSwap;
    mapping (address => bool) public excludedFromTax;
    uint256 swapStartTime;
    bool taxTransfers;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        excludedFromTax[_owner] = true;
        excludedFromTax[deployer] = true;
        super.configure(_owner);
    }

    function onOwnerChange(address from, address to) internal virtual override {
        excludedFromTax[from] = false;
        excludedFromTax[to] = true;
        super.onOwnerChange(from, to);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        
        uint256 amountAfterTax = value;

        if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) {
            if (exchanges[from]) {
                // we are BUYING
                amountAfterTax = taxDistributor.takeBuyTax(value);
            } else if (exchanges[to]) {
                // we are SELLING
                amountAfterTax = taxDistributor.takeSellTax(value);
            } else if (taxTransfers) {
                // ransfer Tax is enabled
                amountAfterTax = taxDistributor.takeBuyTax(value);
            }
        }

        uint256 taxAmount = value - amountAfterTax;
        if (taxAmount > 0) {
            _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount;
            emit Transfer(from, address(taxDistributor), taxAmount);
        }
        return super.calculateTransferAmount(from, to, amountAfterTax);
    }


    function preTransfer(address from, address to, uint256 value) override virtual internal {
        uint256 timeSinceLastSwap = block.timestamp - taxDistributor.lastSwapTime();
        if (
            launched && 
            autoSwapTax && 
            exchanges[to] && 
            swapStartTime + 60 <= block.timestamp &&
            timeSinceLastSwap >= minimumTimeBetweenSwaps &&
            _balances[address(taxDistributor)] >= minimumTokensBeforeSwap &&
            taxDistributor.inSwap() == false
        ) {
            swapStartTime = block.timestamp;
            try taxDistributor.distribute() {} catch {}
        }
        super.preTransfer(from, to, value);
    }
    
    
    // Public methods
    
    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function sellTax() external view returns (uint256) {
        return taxDistributor.getSellTax();
    }

    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function buyTax() external view returns (uint256) {
        return taxDistributor.getBuyTax();
    }

    /**
     * @dev Return the address of the tax distributor contract
     */
    function taxDistributorAddress() external view returns (address) {
        return address(taxDistributor);
    }    
    
    
    // Admin methods

    function setAutoSwaptax(bool enabled) external onlyOwner {
        autoSwapTax = enabled;
        emit ConfigurationChanged(msg.sender, "change to auto swap");
    }

    function setExcludedFromTax(address who, bool enabled) external onlyOwner {
        require(exchanges[who] == false || enabled == false, "Cannot exclude an exchange from tax");
        excludedFromTax[who] = enabled;
        emit ConfigurationChanged(msg.sender, "change to tax exclusion list");
    }

    function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner {
        minimumTokensBeforeSwap = minAmount;
        minimumTimeBetweenSwaps = minTime;
        emit ConfigurationChanged(msg.sender, "change to auto swap thresholds");
    }
    
    function runSwapManually() external isLaunched {
        taxDistributor.distribute();
    }
}

File 4 of 6: Interfaces.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

interface IOwnable {
    function owner() external view returns (address);
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address _owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

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

interface IBurnable {
    function burn(uint256 value) external;
    function burnFrom(address account, uint256 value) external;
}

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

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);    
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
}

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function depositNative() external payable;
    function depositToken(address from, uint256 amount) external;
    function process(uint256 gas) external;
    function inSwap() external view returns (bool);
}


interface ITaxDistributor {
    receive() external payable;
    function lastSwapTime() external view returns (uint256);
    function inSwap() external view returns (bool);
    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external;
    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external;
    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external;
    function distribute() external payable;
    function getSellTax() external view returns (uint256);
    function getBuyTax() external view returns (uint256);
    function getTaxWallet(string memory taxName) external view returns(address);
    function setTaxWallet(string memory taxName, address wallet) external;
    function setSellTax(string memory taxName, uint256 taxPercentage) external;
    function setBuyTax(string memory taxName, uint256 taxPercentage) external;
    function takeSellTax(uint256 value) external returns (uint256);
    function takeBuyTax(uint256 value) external returns (uint256);
}

interface IWalletDistributor {
    function receiveToken(address token, address from, uint256 amount) external;
}

File 5 of 6: TaxDistributor.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./AddressLibrary.sol";

contract TaxDistributor is ITaxDistributor {
    using Address for address;

    address immutable private tokenPair;
    address immutable private routerAddress;
    address immutable private _token;
    address immutable private _wbnb;

    IDEXRouter private _router;

    bool public override inSwap;
    uint256 public override lastSwapTime;

    uint256 immutable private maxSellTax;
    uint256 immutable private maxBuyTax;

    enum TaxType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN }
    struct Tax {
        string taxName;
        uint256 buyTaxPercentage;
        uint256 sellTaxPercentage;
        uint256 taxPool;
        TaxType taxType;
        address location;
        uint256 share;
        bool convertToNative;
    }
    Tax[] internal taxes;

    event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived);
    event DistributionError(string text);

    modifier onlyToken() {
        require(msg.sender == _token, "no permissions");
        _;
    }

    modifier swapLock() {
        require(inSwap == false, "already swapping");
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor (address router, address pair, address wbnb, uint256 _maxSellTax, uint256 _maxBuyTax) {
        require(wbnb != address(0), "pairedToken cannot be 0 address");
        require(pair != address(0), "pair cannot be 0 address");
        require(router != address(0), "router cannot be 0 address");
        _token = msg.sender;
        _wbnb = wbnb;
        _router = IDEXRouter(router);
        maxSellTax = _maxSellTax;
        maxBuyTax = _maxBuyTax;
        tokenPair = pair;
        routerAddress = router;
    }

    receive() external override payable {}

    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.WALLET, wallet, 0, convertToNative));
    }

    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DISTRIBUTOR, wallet, 0, convertToNative));
    }
    
    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DIVIDEND, dividendDistributor, 0, convertToNative));
    }
    
    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.BURN, address(0), 0, false));
    }

    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.LIQUIDITY, holder, 0, false));
    }

    function checkTaxExists(string memory taxName) private view returns(bool) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                return true;
            }
        }
        return false;
    }

    function distribute() external payable override onlyToken swapLock {
        address[] memory path = new address[](2);
        path[0] = _token;
        path[1] = _wbnb;
        IERC20 token = IERC20(_token);

        uint256 totalTokens;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].taxType == TaxType.LIQUIDITY) {
                uint256 half = taxes[i].taxPool / 2;
                totalTokens += taxes[i].taxPool - half;
            } else if (taxes[i].convertToNative) {
                totalTokens += taxes[i].taxPool;
            }
        }
        totalTokens = checkTokenAmount(token, totalTokens);

        uint256[] memory amts = _router.swapExactTokensForETH(
            totalTokens,
            0,
            path,
            address(this),
            block.timestamp + 300
        );
        uint256 amountBNB = address(this).balance;

        if (totalTokens != amts[0] || amountBNB != amts[1] ) {
            emit DistributionError("Unexpected amounts returned from swap");
        }

        // Calculate the distribution
        uint256 toDistribute = amountBNB;
        for (uint256 i = 0; i < taxes.length; i++) {

            if (taxes[i].convertToNative || taxes[i].taxType == TaxType.LIQUIDITY) {
                if (i == taxes.length - 1) {
                    taxes[i].share = toDistribute;
                } else if (taxes[i].taxType == TaxType.LIQUIDITY) {
                    uint256 half = taxes[i].taxPool / 2;
                    uint256 share = (amountBNB * (taxes[i].taxPool - half)) / totalTokens;
                    taxes[i].share = share;
                    toDistribute = toDistribute - share;
                } else {
                    uint256 share = (amountBNB * taxes[i].taxPool) / totalTokens;
                    taxes[i].share = share;
                    toDistribute = toDistribute - share;
                }
            }
        }

        // Distribute the coins
        for (uint256 i = 0; i < taxes.length; i++) {
            
            if (taxes[i].taxType == TaxType.WALLET) {
                if (taxes[i].convertToNative) {
                    Address.sendValue(payable(taxes[i].location), taxes[i].share);
                } else {
                    require(token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool)), "could not transfer tokens");
                }
            }
            else if (taxes[i].taxType == TaxType.DISTRIBUTOR) {
                if (taxes[i].convertToNative) {
                    Address.sendValue(payable(taxes[i].location), taxes[i].share);
                } else {
                    token.approve(taxes[i].location, taxes[i].taxPool);
                    IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.DIVIDEND) {
               if (taxes[i].convertToNative) {
                    IDividendDistributor(taxes[i].location).depositNative{value: taxes[i].share}();
                } else {
                    IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.BURN) {
                IBurnable(_token).burn(checkTokenAmount(token, taxes[i].taxPool));
            }
            else if (taxes[i].taxType == TaxType.LIQUIDITY) {
                if(taxes[i].share > 0){
                    uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2);
                    _router.addLiquidityETH{value: taxes[i].share}(
                        _token,
                        half,
                        0,
                        0,
                        taxes[i].location,
                        block.timestamp + 300
                    );
                }
            }
            
            taxes[i].taxPool = 0;
            taxes[i].share = 0;
        }

        // Remove any leftoever tokens
        if (address(this).balance > 0) {
            Address.sendValue(payable(_token), address(this).balance);
        }

        if (token.balanceOf(address(this)) > 0) {
            token.transfer(_token, token.balanceOf(address(this)));
        }

        emit TaxesDistributed(totalTokens, amountBNB);

        lastSwapTime = block.timestamp;
    }

    function getSellTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].sellTaxPercentage;
        }
        return taxAmount;
    }

    function getBuyTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].buyTaxPercentage;
        }
        return taxAmount;
    }

    function getTaxWallet(string memory taxName)external override view onlyToken returns (address)  {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                return taxes[i].location;
            }
        }
        revert("could not find tax");
    }
    
    function setTaxWallet(string memory taxName, address wallet) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if ((taxes[i].taxType == TaxType.WALLET || taxes[i].taxType == TaxType.LIQUIDITY || taxes[i].taxType == TaxType.DISTRIBUTOR) && compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].location = wallet;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
    }

    function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].sellTaxPercentage = taxPercentage;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getSellTax() <= maxSellTax, "tax cannot be set this high");
    }

    function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            //if (taxes[i].taxName == taxName) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].buyTaxPercentage = taxPercentage;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getBuyTax() <= maxBuyTax, "tax cannot be set this high");
    }

    function takeSellTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].sellTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }

    function takeBuyTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].buyTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }
    
    
    
    // Private methods
    function compareStrings(string memory a, string memory b) private pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }

    function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) {
        uint256 balance = token.balanceOf(address(this));
        if (balance > amount) {
            return amount;
        }
        return balance;
    }
}

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":"who","type":"address"},{"indexed":false,"internalType":"string","name":"option","type":"string"}],"name":"ConfigurationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runSwapManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"on","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"on","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506200003173fbfeaf0da0f2fde5c66df570133ae35f3eb58c9a6200050a565b600680546001600160a01b03191633179055604080518082019091526004808252632ba7a62360e11b602090920191825262000070916003916200068c565b50604080518082019091526008808252672630b7323bb7b63360c11b6020909201918252620000a2916004916200068c565b506005805460ff191660121790556000620000bc62000523565b6006546001600160a01b039081166000908152600760209081526040808320805460ff1916600117905580516315ab88c960e31b815290519495508594929385169263ad5c464892600480840193919291829003018186803b1580156200012257600080fd5b505afa15801562000137573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015d919062000740565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200019b57600080fd5b505afa158015620001b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d6919062000740565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c6539690604401602060405180830381600087803b1580156200022257600080fd5b505af115801562000237573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025d919062000740565b6001600160a01b03811660009081526008602052604090819020805460ff19166001179055519091508490829084906101f49081906200029d906200071b565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f080158015620002e8573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b03929092169190911790556001600a908155600554620003249160ff90911690620007d6565b6200033190600162000897565b600b55600980546001600160a01b039081166000908152600c602052604090819020805460ff1916600190811790915583549151634693167f60e11b815260a0600482015260a4810194909452684d61726b6574696e6760b81b60c485015261019060248501819052604485015273821b2b0a9d1ce32a9e691414f6ede2b9ace03138606485015260848401521690638d262cfe9060e401600060405180830381600087803b158015620003e457600080fd5b505af1158015620003f9573d6000803e3d6000fd5b50506009805460ff60a01b198116600160a01b179091556001600160a01b039081166000908152600160209081526040808320938a16835292905220600019905550506005546200044f9060ff16600a620007d6565b620004629066017e9d8602b40062000897565b60025462000471919062000772565b60028190556006546001600160a01b03166000908152602081905260409020546200049d919062000772565b600680546001600160a01b0390811660009081526020819052604080822094909455915460025493519116927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620004f891815260200190565b60405180910390a3505050506200090c565b6200052081620005f160201b620016211760201c565b50565b60004660011480620005355750466003145b80620005415750466004145b806200054d5750466005145b156200056c5750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b46603814156200058f57507310ed43c718714eb63d5aa57b78b54704e256024e90565b4660611415620005b2575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b6001600160a01b038181166000908152600c602090815260408083208054600160ff1991821681179092556006549095168452922080549093169091179091556200052090829062000647811b6200166117901c565b60058054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b8280546200069a90620008b9565b90600052602060002090601f016020900481019282620006be576000855562000709565b82601f10620006d957805160ff191683800117855562000709565b8280016001018555821562000709579182015b8281111562000709578251825591602001919060010190620006ec565b506200071792915062000729565b5090565b61312e8062002b1783390190565b5b808211156200071757600081556001016200072a565b6000602082840312156200075357600080fd5b81516001600160a01b03811681146200076b57600080fd5b9392505050565b60008219821115620007885762000788620008f6565b500190565b600181815b80851115620007ce578160001904821115620007b257620007b2620008f6565b80851615620007c057918102915b93841c939080029062000792565b509250929050565b60006200076b60ff841683600082620007f25750600162000891565b81620008015750600062000891565b81600181146200081a5760028114620008255762000845565b600191505062000891565b60ff841115620008395762000839620008f6565b50506001821b62000891565b5060208310610133831016604e8410600b84101617156200086a575081810a62000891565b6200087683836200078d565b80600019048211156200088d576200088d620008f6565b0290505b92915050565b6000816000190483118215151615620008b457620008b4620008f6565b500290565b600181811c90821680620008ce57607f821691505b60208210811415620008f057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6121fb806200091c6000396000f3fe6080604052600436106101dc5760003560e01c80636b8f2f3b11610102578063a9059cbb11610095578063d31acb2811610064578063d31acb2814610563578063dba61c5814610583578063dd62ed3e14610599578063ea414b28146105df57600080fd5b8063a9059cbb146104f8578063c2ed286b14610518578063cc1776d314610538578063d2d7ad831461054d57600080fd5b806395d89b41116100d157806395d89b4114610473578063989763ef14610488578063a457c2d7146104b8578063a6f9dae1146104d857600080fd5b80636b8f2f3b146103d657806370a08231146103f75780638091f3bf1461042d5780638da5cb5b1461044e57600080fd5b806328be90381161017a578063442ef7d211610149578063442ef7d21461036c5780634f7041a5146103815780634f72e2a2146103965780634fbc2775146103b657600080fd5b806328be9038146102eb578063313ce5671461030b5780633567f96c14610337578063395093511461034c57600080fd5b80630c89a0df116101b65780630c89a0df1461025a57806318160ddd1461027a578063185511081461029957806323b872dd146102cb57600080fd5b806301339c21146101e857806306fdde03146101ff578063095ea7b31461022a57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506101fd6105ff565b005b34801561020b57600080fd5b506102146106ed565b6040516102219190611f8f565b60405180910390f35b34801561023657600080fd5b5061024a610245366004611eee565b61077b565b6040519015158152602001610221565b34801561026657600080fd5b5061024a610275366004611e0c565b61086c565b34801561028657600080fd5b506002545b604051908152602001610221565b3480156102a557600080fd5b506009546001600160a01b03165b6040516001600160a01b039091168152602001610221565b3480156102d757600080fd5b5061024a6102e6366004611e7f565b6109a7565b3480156102f757600080fd5b506101fd610306366004611ec0565b610acf565b34801561031757600080fd5b506005546103259060ff1681565b60405160ff9091168152602001610221565b34801561034357600080fd5b506101fd610bd8565b34801561035857600080fd5b5061024a610367366004611eee565b610c22565b34801561037857600080fd5b506101fd610d33565b34801561038d57600080fd5b5061028b610e08565b3480156103a257600080fd5b506101fd6103b1366004611f1a565b610e8a565b3480156103c257600080fd5b506101fd6103d1366004611ec0565b610f1e565b3480156103e257600080fd5b5060095461024a90600160a01b900460ff1681565b34801561040357600080fd5b5061028b610412366004611e0c565b6001600160a01b031660009081526020819052604090205490565b34801561043957600080fd5b5060065461024a90600160a01b900460ff1681565b34801561045a57600080fd5b506005546102b39061010090046001600160a01b031681565b34801561047f57600080fd5b5061021461101b565b34801561049457600080fd5b5061024a6104a3366004611e0c565b600c6020526000908152604090205460ff1681565b3480156104c457600080fd5b5061024a6104d3366004611eee565b611028565b3480156104e457600080fd5b506101fd6104f3366004611e0c565b6110e2565b34801561050457600080fd5b5061024a610513366004611eee565b61121f565b34801561052457600080fd5b506101fd610533366004611ec0565b611299565b34801561054457600080fd5b5061028b6113b7565b34801561055957600080fd5b5061028b600b5481565b34801561056f57600080fd5b506101fd61057e366004611f6d565b6113fc565b34801561058f57600080fd5b5061028b600a5481565b3480156105a557600080fd5b5061028b6105b4366004611e46565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105eb57600080fd5b506101fd6105fa366004611e0c565b611480565b6006546001600160a01b031633146106325760405162461bcd60e51b8152600401610629906120ba565b60405180910390fd5b600654600160a01b900460ff161561068c5760405162461bcd60e51b815260206004820152601960248201527f636f6e747261637420616c7265616479206c61756e63686564000000000000006044820152606401610629565b6006805460ff60a01b1916600160a01b17905560405133906000805160206121a6833981519152906106e39060208082526011908201527018dbdb9d1c9858dd081b185d5b98da1959607a1b604082015260600190565b60405180910390a2565b600480546106fa90612131565b80601f016020809104026020016040519081016040528092919081815260200182805461072690612131565b80156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b505050505081565b6006546000903390600160a01b900460ff16806107aa57506005546001600160a01b0382811661010090920416145b806107c457503360009081526007602052604090205460ff165b6107e05760405162461bcd60e51b81526004016106299061208d565b6001600160a01b0384166108065760405162461bcd60e51b815260040161062990612056565b3360008181526001602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060019392505050565b6006546000906001600160a01b031633146108995760405162461bcd60e51b8152600401610629906120ba565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b1580156108db57600080fd5b505afa1580156108ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109139190611f54565b60055460405163a9059cbb60e01b81526001600160a01b03610100909204821660048201526024810183905291925084169063a9059cbb90604401602060405180830381600087803b15801561096857600080fd5b505af115801561097c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a09190611f37565b9392505050565b6006546000908490600160a01b900460ff16806109d657506005546001600160a01b0382811661010090920416145b806109f057503360009081526007602052604090205460ff165b610a0c5760405162461bcd60e51b81526004016106299061208d565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610a3b90849061211a565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610a6a8585856116a6565b6001600160a01b038516600081815260016020908152604080832033808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b6006546001600160a01b03163314610af95760405162461bcd60e51b8152600401610629906120ba565b6001600160a01b03821660009081526008602052604090205460ff1615158115151415610b565760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610629565b6001600160a01b03821660009081526008602052604090819020805483151560ff199091161790555133906000805160206121a683398151915290610bcc9060208082526017908201527f6368616e676520746f2065786368616e6765206c697374000000000000000000604082015260600190565b60405180910390a25050565b6006546001600160a01b03163314610c025760405162461bcd60e51b8152600401610629906120ba565b6005544790610c1f9061010090046001600160a01b0316826117bd565b50565b6006546000903390600160a01b900460ff1680610c5157506005546001600160a01b0382811661010090920416145b80610c6b57503360009081526007602052604090205460ff165b610c875760405162461bcd60e51b81526004016106299061208d565b6001600160a01b038416610cad5760405162461bcd60e51b815260040161062990612056565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610cdc908490612102565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910161085a565b600654600160a01b900460ff16610d9e5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610629565b600960009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610dee57600080fd5b505af1158015610e02573d6000803e3d6000fd5b50505050565b60095460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b158015610e4d57600080fd5b505afa158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e859190611f54565b905090565b6006546001600160a01b03163314610eb45760405162461bcd60e51b8152600401610629906120ba565b60098054821515600160a01b0260ff60a01b1990911617905560405133906000805160206121a683398151915290610f139060208082526013908201527206368616e676520746f206175746f207377617606c1b604082015260600190565b60405180910390a250565b6006546001600160a01b03163314610f485760405162461bcd60e51b8152600401610629906120ba565b6001600160a01b03821660009081526007602052604090205460ff1615158115151415610fa55760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610629565b6001600160a01b03821660009081526007602052604090819020805483151560ff199091161790555133906000805160206121a683398151915290610bcc906020808252601f908201527f6368616e676520746f2063616e20616c77617973207472616465206c69737400604082015260600190565b600380546106fa90612131565b6006546000903390600160a01b900460ff168061105757506005546001600160a01b0382811661010090920416145b8061107157503360009081526007602052604090205460ff165b61108d5760405162461bcd60e51b81526004016106299061208d565b6001600160a01b0384166110b35760405162461bcd60e51b815260040161062990612056565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610cdc90849061211a565b6006546001600160a01b0316331461110c5760405162461bcd60e51b8152600401610629906120ba565b6001600160a01b03811661115b5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610629565b6005546001600160a01b0361010090910481166000818152600c60209081526040808320805460ff19908116909155948616808452818420805487166001908117909155948452600790925280832080548616905590825290208054909216179055600580546001600160a01b03831661010002610100600160a81b031990911617905560405133906000805160206121a683398151915290610f13906020808252600d908201526c1bdddb995c8818da185b99d959609a1b604082015260600190565b6006546000903390600160a01b900460ff168061124e57506005546001600160a01b0382811661010090920416145b8061126857503360009081526007602052604090205460ff165b6112845760405162461bcd60e51b81526004016106299061208d565b61128f3385856116a6565b5060019392505050565b6006546001600160a01b031633146112c35760405162461bcd60e51b8152600401610629906120ba565b6001600160a01b03821660009081526008602052604090205460ff1615806112e9575080155b6113415760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610629565b6001600160a01b0382166000908152600c602052604090819020805483151560ff199091161790555133906000805160206121a683398151915290610bcc906020808252601c908201527f6368616e676520746f20746178206578636c7573696f6e206c69737400000000604082015260600190565b6009546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b158015610e4d57600080fd5b6006546001600160a01b031633146114265760405162461bcd60e51b8152600401610629906120ba565b600b829055600a81905560405133906000805160206121a683398151915290610bcc906020808252601e908201527f6368616e676520746f206175746f2073776170207468726573686f6c64730000604082015260600190565b600954604051635b22149760e01b81526001600160a01b0390911690635b221497906114ae90600401611fe4565b60206040518083038186803b1580156114c657600080fd5b505afa1580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe9190611e29565b6001600160a01b0316336001600160a01b0316146115715760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c7920746865207461782077616c6c65742063616e206368616e676520696044820152697473206164647265737360b01b6064820152608401610629565b60095460405163583dd79d60e01b81526001600160a01b039091169063583dd79d906115a1908490600401612013565b600060405180830381600087803b1580156115bb57600080fd5b505af11580156115cf573d6000803e3d6000fd5b50505050336001600160a01b03166000805160206121a6833981519152604051610f139060208082526014908201527318da185b99d9481d1bc81d185e081dd85b1b195d60621b604082015260600190565b6001600160a01b038181166000908152600c60205260408082208054600160ff199182168117909255600654909416835291208054909216179055610c1f815b60058054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b6001600160a01b0382166116f55760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610629565b6117008383836118db565b600061170d8484846118e6565b6001600160a01b03851660009081526020819052604090205490915061173490839061211a565b6001600160a01b038086166000908152602081905260408082209390935590851681522054611764908290612102565b6001600160a01b038481166000818152602081815260409182902094909455518481529092918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e02565b8047101561180d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610629565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461185a576040519150601f19603f3d011682016040523d82523d6000602084013e61185f565b606091505b50509050806118d65760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610629565b505050565b6118d68383836118fb565b60006118f3848484611b11565b949350505050565b60095460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b15801561194057600080fd5b505afa158015611954573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119789190611f54565b611982904261211a565b600654909150600160a01b900460ff1680156119a75750600954600160a01b900460ff165b80156119cb57506001600160a01b03831660009081526008602052604090205460ff165b80156119e5575042600d54603c6119e29190612102565b11155b80156119f35750600a548110155b8015611a1b5750600b546009546001600160a01b031660009081526020819052604090205410155b8015611aaa5750600960009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7057600080fd5b505afa158015611a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa89190611f37565b155b15611b0c5742600d556009546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b158015611af957600080fd5b505af1925050508015611b0a575060015b505b610e02565b6001600160a01b0383166000908152600c6020526040812054829060ff16158015611b5557506001600160a01b0384166000908152600c602052604090205460ff16155b8015611b6a5750600654600160a01b900460ff165b15611cf4576001600160a01b03851660009081526008602052604090205460ff1615611c165760095460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024015b602060405180830381600087803b158015611bd757600080fd5b505af1158015611beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0f9190611f54565b9050611cf4565b6001600160a01b03841660009081526008602052604090205460ff1615611c6857600954604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401611bbd565b600e5460ff1615611cf45760095460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b158015611cb957600080fd5b505af1158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf19190611f54565b90505b6000611d00828561211a565b90508015611d8c576009546001600160a01b0316600090815260208190526040902054611d2e908290612102565b600980546001600160a01b0390811660009081526020818152604091829020949094559154915184815291811692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b611d97868684611da1565b9695505050505050565b6000826001600160a01b0316846001600160a01b03161415611e055760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610629565b5092915050565b600060208284031215611e1e57600080fd5b81356109a081612182565b600060208284031215611e3b57600080fd5b81516109a081612182565b60008060408385031215611e5957600080fd5b8235611e6481612182565b91506020830135611e7481612182565b809150509250929050565b600080600060608486031215611e9457600080fd5b8335611e9f81612182565b92506020840135611eaf81612182565b929592945050506040919091013590565b60008060408385031215611ed357600080fd5b8235611ede81612182565b91506020830135611e7481612197565b60008060408385031215611f0157600080fd5b8235611f0c81612182565b946020939093013593505050565b600060208284031215611f2c57600080fd5b81356109a081612197565b600060208284031215611f4957600080fd5b81516109a081612197565b600060208284031215611f6657600080fd5b5051919050565b60008060408385031215611f8057600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015611fbc57858101830151858201604001528201611fa0565b81811115611fce576000604083870101525b50601f01601f1916929092016040019392505050565b60208152600061200d6020830160098152684d61726b6574696e6760b81b602082015260400190565b92915050565b60408152600061203c6040830160098152684d61726b6574696e6760b81b602082015260400190565b6001600160a01b0393909316602092909201919091525090565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600082198211156121155761211561216c565b500190565b60008282101561212c5761212c61216c565b500390565b600181811c9082168061214557607f821691505b6020821081141561216657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610c1f57600080fd5b8015158114610c1f57600080fdfed43eee071b91e7714b533dbf825ec024145ba03675691f363d9a4c47e88b4dc5a2646970667358221220f5c8e500311ba9427f599d8d75ffa80951a135ee522aeadd2825ad143e5393fa64736f6c634300080700336101406040523480156200001257600080fd5b506040516200312e3803806200312e8339810160408190526200003591620001b5565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b33606090811b60c0526001600160601b031993811b841660e052600080546001600160a01b0388166001600160a01b0319909116179055610100929092526101205291821b811660805291901b1660a05262000212565b80516001600160a01b0381168114620001b057600080fd5b919050565b600080600080600060a08688031215620001ce57600080fd5b620001d98662000198565b9450620001e96020870162000198565b9350620001f96040870162000198565b6060870151608090970151959894975095949392505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005161012051612e3a620002f4600039600061048301526000610d3e015260006110e601526000818161031401528181610508015281816106ac0152818161074c015281816107f60152818161091d01528181610adc01528181610c7801528181610d7001528181610e1a01528181610eb601528181610fd3015281816110920152818161113201528181611a2301528181611cc101528181611e0e01528181611f8901528181612054015281816121ac015261234901526000505060005050612e3a6000f3fe6080604052600436106100f75760003560e01c80636508c57e1161008a578063db017dc711610059578063db017dc7146102a1578063e4fc6b6d146102c1578063ed4ce99e146102c9578063fb5a780c146102e957600080fd5b80636508c57e1461021b5780638d262cfe1461023b578063b0bc85de1461025b578063d83067861461027057600080fd5b80632b1fb89e116100c65780632b1fb89e146101835780634fa26fd5146101a3578063583dd79d146101c35780635b221497146101e357600080fd5b806307a1cfbd146101035780630dd8715714610125578063135b4fc01461014e578063252d723a1461016e57600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004612998565b610309565b005b34801561013157600080fd5b5061013b60015481565b6040519081526020015b60405180910390f35b34801561015a57600080fd5b50610123610169366004612a8c565b6104fd565b34801561017a57600080fd5b5061013b61069f565b34801561018f57600080fd5b5061012361019e366004612a8c565b610741565b3480156101af57600080fd5b5061013b6101be366004612b02565b6107e9565b3480156101cf57600080fd5b506101236101de36600461294a565b610912565b3480156101ef57600080fd5b506102036101fe36600461290d565b610acf565b6040516001600160a01b039091168152602001610145565b34801561022757600080fd5b50610123610236366004612998565b610c6d565b34801561024757600080fd5b50610123610256366004612a8c565b610d65565b34801561026757600080fd5b5061013b610e0d565b34801561027c57600080fd5b5060005461029190600160a01b900460ff1681565b6040519015158152602001610145565b3480156102ad57600080fd5b5061013b6102bc366004612b02565b610ea9565b610123610fc8565b3480156102d557600080fd5b506101236102e4366004612a2b565b6121a1565b3480156102f557600080fd5b506101236103043660046129dd565b61233e565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461035a5760405162461bcd60e51b815260040161035190612c0b565b60405180910390fd5b6000805b6002548110156104635761041e6002828154811061037e5761037e612dc7565b9060005260206000209060070201600001805461039a90612d45565b80601f01602080910402602001604051908101604052809291908181526020018280546103c690612d45565b80156104135780601f106103e857610100808354040283529160200191610413565b820191906000526020600020905b8154815290600101906020018083116103f657829003601f168201915b5050505050856124cd565b1561045157826002828154811061043757610437612dc7565b906000526020600020906007020160010181905550600191505b8061045b81612d80565b91505061035e565b50806104815760405162461bcd60e51b815260040161035190612bd4565b7f00000000000000000000000000000000000000000000000000000000000000006104aa61069f565b11156104f85760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610351565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105455760405162461bcd60e51b815260040161035190612c0b565b61054e85612527565b1561056b5760405162461bcd60e51b815260040161035190612b9d565b600260405180610100016040528087815260200186815260200185815260200160008152602001600360048111156105a5576105a5612db1565b81526001600160a01b038516602080830191909152600060408301819052851515606090930192909252835460018101855593825290819020825180519394600702909101926105f89284920190612723565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561064157610641612db1565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106e95760405162461bcd60e51b815260040161035190612c0b565b6000805b60025481101561073b576002818154811061070a5761070a612dc7565b906000526020600020906007020160010154826107279190612cd5565b91508061073381612d80565b9150506106ed565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107895760405162461bcd60e51b815260040161035190612c0b565b61079285612527565b156107af5760405162461bcd60e51b815260040161035190612b9d565b600260405180610100016040528087815260200186815260200185815260200160008152602001600160048111156105a5576105a5612db1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108335760405162461bcd60e51b815260040161035190612c0b565b60005b6002548110156109085760006002828154811061085557610855612dc7565b90600052602060002090600702016002015411156108f65760006127106002838154811061088557610885612dc7565b906000526020600020906007020160020154856108a29190612d0f565b6108ac9190612ced565b905080600283815481106108c2576108c2612dc7565b906000526020600020906007020160030160008282546108e29190612cd5565b909155506108f290508185612d2e565b9350505b8061090081612d80565b915050610836565b508190505b919050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461095a5760405162461bcd60e51b815260040161035190612c0b565b6000805b600254811015610ab15760006002828154811061097d5761097d612dc7565b60009182526020909120600460079092020181015460ff16908111156109a5576109a5612db1565b14806109ea575060028082815481106109c0576109c0612dc7565b60009182526020909120600460079092020181015460ff16908111156109e8576109e8612db1565b145b80610a2f5750600360028281548110610a0557610a05612dc7565b60009182526020909120600460079092020181015460ff1690811115610a2d57610a2d612db1565b145b8015610a4c5750610a4c6002828154811061037e5761037e612dc7565b15610a9f578260028281548110610a6557610a65612dc7565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610aa981612d80565b91505061095e565b50806104f85760405162461bcd60e51b815260040161035190612bd4565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b195760405162461bcd60e51b815260040161035190612c0b565b60005b600254811015610c2f57610bdc60028281548110610b3c57610b3c612dc7565b90600052602060002090600702016000018054610b5890612d45565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8490612d45565b8015610bd15780601f10610ba657610100808354040283529160200191610bd1565b820191906000526020600020905b815481529060010190602001808311610bb457829003601f168201915b5050505050846124cd565b15610c1d5760028181548110610bf457610bf4612dc7565b600091825260209091206007909102016004015461010090046001600160a01b03169392505050565b80610c2781612d80565b915050610b1c565b5060405162461bcd60e51b81526020600482015260126024820152710c6deead8c840dcdee840ccd2dcc840e8c2f60731b6044820152606401610351565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cb55760405162461bcd60e51b815260040161035190612c0b565b6000805b600254811015610d1e57610cd96002828154811061037e5761037e612dc7565b15610d0c578260028281548110610cf257610cf2612dc7565b906000526020600020906007020160020181905550600191505b80610d1681612d80565b915050610cb9565b5080610d3c5760405162461bcd60e51b815260040161035190612bd4565b7f00000000000000000000000000000000000000000000000000000000000000006104aa610e0d565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dad5760405162461bcd60e51b815260040161035190612c0b565b610db685612527565b15610dd35760405162461bcd60e51b815260040161035190612b9d565b600260405180610100016040528087815260200186815260200185815260200160008152602001600060048111156105a5576105a5612db1565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e575760405162461bcd60e51b815260040161035190612c0b565b6000805b60025481101561073b5760028181548110610e7857610e78612dc7565b90600052602060002090600702016002015482610e959190612cd5565b915080610ea181612d80565b915050610e5b565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ef35760405162461bcd60e51b815260040161035190612c0b565b60005b60025481101561090857600060028281548110610f1557610f15612dc7565b9060005260206000209060070201600101541115610fb657600061271060028381548110610f4557610f45612dc7565b90600052602060002090600702016001015485610f629190612d0f565b610f6c9190612ced565b90508060028381548110610f8257610f82612dc7565b90600052602060002090600702016003016000828254610fa29190612cd5565b90915550610fb290508185612d2e565b9350505b80610fc081612d80565b915050610ef6565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110105760405162461bcd60e51b815260040161035190612c0b565b600054600160a01b900460ff161561105d5760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b6044820152606401610351565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106110c4576110c4612dc7565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061111857611118612dc7565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000006000805b60025481101561128b57600280828154811061117357611173612dc7565b60009182526020909120600460079092020181015460ff169081111561119b5761119b612db1565b141561121757600060028083815481106111b7576111b7612dc7565b9060005260206000209060070201600301546111d39190612ced565b905080600283815481106111e9576111e9612dc7565b9060005260206000209060070201600301546112059190612d2e565b61120f9084612cd5565b925050611279565b6002818154811061122a5761122a612dc7565b600091825260209091206006600790920201015460ff1615611279576002818154811061125957611259612dc7565b906000526020600020906007020160030154826112769190612cd5565b91505b8061128381612d80565b915050611155565b506112968282612574565b60008054919250906001600160a01b03166318cbafe5838387306112bc4261012c612cd5565b6040518663ffffffff1660e01b81526004016112dc959493929190612c33565b600060405180830381600087803b1580156112f657600080fd5b505af115801561130a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113329190810190612843565b905060004790508160008151811061134c5761134c612dc7565b60200260200101518314158061137c57508160018151811061137057611370612dc7565b60200260200101518114155b156113f7577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516113ee9060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b60025481101561163d576002818154811061141857611418612dc7565b600091825260209091206006600790920201015460ff16806114735750600280828154811061144957611449612dc7565b60009182526020909120600460079092020181015460ff169081111561147157611471612db1565b145b1561162b5760025461148790600190612d2e565b8114156114bc5781600282815481106114a2576114a2612dc7565b90600052602060002090600702016005018190555061162b565b60028082815481106114d0576114d0612dc7565b60009182526020909120600460079092020181015460ff16908111156114f8576114f8612db1565b14156115b6576000600280838154811061151457611514612dc7565b9060005260206000209060070201600301546115309190612ced565b9050600086826002858154811061154957611549612dc7565b9060005260206000209060070201600301546115659190612d2e565b61156f9087612d0f565b6115799190612ced565b9050806002848154811061158f5761158f612dc7565b60009182526020909120600560079092020101556115ad8185612d2e565b9350505061162b565b600085600283815481106115cc576115cc612dc7565b906000526020600020906007020160030154856115e99190612d0f565b6115f39190612ced565b9050806002838154811061160957611609612dc7565b60009182526020909120600560079092020101556116278184612d2e565b9250505b8061163581612d80565b9150506113fb565b5060005b600254811015611f7d5760006002828154811061166057611660612dc7565b60009182526020909120600460079092020181015460ff169081111561168857611688612db1565b141561186657600281815481106116a1576116a1612dc7565b600091825260209091206006600790920201015460ff161561172757611722600282815481106116d3576116d3612dc7565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002838154811061170b5761170b612dc7565b90600052602060002090600702016005015461260a565b611f18565b856001600160a01b031663a9059cbb6002838154811061174957611749612dc7565b906000526020600020906007020160040160019054906101000a90046001600160a01b031661179c896002868154811061178557611785612dc7565b906000526020600020906007020160030154612574565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156117e257600080fd5b505af11580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a91906128f0565b6117225760405162461bcd60e51b815260206004820152601960248201527f636f756c64206e6f74207472616e7366657220746f6b656e73000000000000006044820152606401610351565b60036002828154811061187b5761187b612dc7565b60009182526020909120600460079092020181015460ff16908111156118a3576118a3612db1565b1415611ac757600281815481106118bc576118bc612dc7565b600091825260209091206006600790920201015460ff16156118ee57611722600282815481106116d3576116d3612dc7565b856001600160a01b031663095ea7b36002838154811061191057611910612dc7565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002848154811061194857611948612dc7565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156119a257600080fd5b505af11580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da91906128f0565b50600281815481106119ee576119ee612dc7565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611a5a8a6002878154811061178557611785612dc7565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611aaa57600080fd5b505af1158015611abe573d6000803e3d6000fd5b50505050611f18565b600160028281548110611adc57611adc612dc7565b60009182526020909120600460079092020181015460ff1690811115611b0457611b04612db1565b1415611c7c5760028181548110611b1d57611b1d612dc7565b600091825260209091206006600790920201015460ff1615611bed5760028181548110611b4c57611b4c612dc7565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660028381548110611b9257611b92612dc7565b9060005260206000209060070201600501546040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bcf57600080fd5b505af1158015611be3573d6000803e3d6000fd5b5050505050611f18565b60028181548110611c0057611c00612dc7565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611c4b896002868154811061178557611785612dc7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a90565b600460028281548110611c9157611c91612dc7565b60009182526020909120600460079092020181015460ff1690811115611cb957611cb9612db1565b1415611d23577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611d05886002858154811061178557611785612dc7565b6040518263ffffffff1660e01b8152600401611a9091815260200190565b6002808281548110611d3757611d37612dc7565b60009182526020909120600460079092020181015460ff1690811115611d5f57611d5f612db1565b1415611f1857600060028281548110611d7a57611d7a612dc7565b9060005260206000209060070201600501541115611f18576000611dcd876002808581548110611dac57611dac612dc7565b906000526020600020906007020160030154611dc89190612ced565b612574565b600054600280549293506001600160a01b039091169163f305d719919085908110611dfa57611dfa612dc7565b9060005260206000209060070201600501547f00000000000000000000000000000000000000000000000000000000000000008460008060028981548110611e4457611e44612dc7565b600091825260209091206007909102016004015461010090046001600160a01b0316611e724261012c612cd5565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b158015611eda57600080fd5b505af1158015611eee573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f139190612b34565b505050505b600060028281548110611f2d57611f2d612dc7565b906000526020600020906007020160030181905550600060028281548110611f5757611f57612dc7565b600091825260209091206005600790920201015580611f7581612d80565b915050611641565b504715611fae57611fae7f00000000000000000000000000000000000000000000000000000000000000004761260a565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b158015611ff057600080fd5b505afa158015612004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120289190612b1b565b111561214f576040516370a0823160e01b81523060048201526001600160a01b0386169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a082319060240160206040518083038186803b15801561209757600080fd5b505afa1580156120ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cf9190612b1b565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561211557600080fd5b505af1158015612129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214d91906128f0565b505b60408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a150504260015550506000805460ff60a01b191690555050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121e95760405162461bcd60e51b815260040161035190612c0b565b6121f284612527565b1561220f5760405162461bcd60e51b815260040161035190612b9d565b6002604051806101000160405280868152602001858152602001848152602001600081526020016002600481111561224957612249612db1565b81526001600160a01b0384166020808301919091526000604083018190526060909201829052835460018101855593825290819020825180519394600702909101926122989284920190612723565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156122e1576122e1612db1565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123865760405162461bcd60e51b815260040161035190612c0b565b61238f83612527565b156123ac5760405162461bcd60e51b815260040161035190612b9d565b6002604051806101000160405280858152602001848152602001838152602001600081526020016004808111156123e5576123e5612db1565b8152600060208083018290526040830182905260609092018190528354600181018555938152819020825180519394600702909101926124289284920190612723565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561247157612471612db1565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b6000816040516020016124e09190612b62565b60405160208183030381529060405280519060200120836040516020016125079190612b62565b604051602081830303815290604052805190602001201490505b92915050565b6000805b60025481101561256b5761254b60028281548110610b3c57610b3c612dc7565b156125595750600192915050565b8061256381612d80565b91505061252b565b50600092915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b1580156125b857600080fd5b505afa1580156125cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f09190612b1b565b9050828111156126035782915050612521565b9392505050565b8047101561265a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610351565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146126a7576040519150601f19603f3d011682016040523d82523d6000602084013e6126ac565b606091505b50509050806104f85760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610351565b82805461272f90612d45565b90600052602060002090601f0160209004810192826127515760008555612797565b82601f1061276a57805160ff1916838001178555612797565b82800160010185558215612797579182015b8281111561279757825182559160200191906001019061277c565b506127a39291506127a7565b5090565b5b808211156127a357600081556001016127a8565b80356001600160a01b038116811461090d57600080fd5b600082601f8301126127e457600080fd5b813567ffffffffffffffff8111156127fe576127fe612ddd565b612811601f8201601f1916602001612ca4565b81815284602083860101111561282657600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561285657600080fd5b825167ffffffffffffffff8082111561286e57600080fd5b818501915085601f83011261288257600080fd5b81518181111561289457612894612ddd565b8060051b91506128a5848301612ca4565b8181528481019084860184860187018a10156128c057600080fd5b600095505b838610156128e35780518352600195909501949186019186016128c5565b5098975050505050505050565b60006020828403121561290257600080fd5b815161260381612df3565b60006020828403121561291f57600080fd5b813567ffffffffffffffff81111561293657600080fd5b612942848285016127d3565b949350505050565b6000806040838503121561295d57600080fd5b823567ffffffffffffffff81111561297457600080fd5b612980858286016127d3565b92505061298f602084016127bc565b90509250929050565b600080604083850312156129ab57600080fd5b823567ffffffffffffffff8111156129c257600080fd5b6129ce858286016127d3565b95602094909401359450505050565b6000806000606084860312156129f257600080fd5b833567ffffffffffffffff811115612a0957600080fd5b612a15868287016127d3565b9660208601359650604090950135949350505050565b60008060008060808587031215612a4157600080fd5b843567ffffffffffffffff811115612a5857600080fd5b612a64878288016127d3565b9450506020850135925060408501359150612a81606086016127bc565b905092959194509250565b600080600080600060a08688031215612aa457600080fd5b853567ffffffffffffffff811115612abb57600080fd5b612ac7888289016127d3565b9550506020860135935060408601359250612ae4606087016127bc565b91506080860135612af481612df3565b809150509295509295909350565b600060208284031215612b1457600080fd5b5035919050565b600060208284031215612b2d57600080fd5b5051919050565b600080600060608486031215612b4957600080fd5b8351925060208401519150604084015190509250925092565b6000825160005b81811015612b835760208186018101518583015201612b69565b81811115612b92576000828501525b509190910192915050565b60208082526017908201527f546869732074617820616c726561647920657869737473000000000000000000604082015260600190565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612c835784516001600160a01b031683529383019391830191600101612c5e565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612ccd57612ccd612ddd565b604052919050565b60008219821115612ce857612ce8612d9b565b500190565b600082612d0a57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612d2957612d29612d9b565b500290565b600082821015612d4057612d40612d9b565b500390565b600181811c90821680612d5957607f821691505b60208210811415612d7a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d9457612d94612d9b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612e0157600080fd5b5056fea26469706673582212203c2ddb5cd893314d896ba2e2d744402247493104c82c39f5c14f67c01f3ce44f64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c80636b8f2f3b11610102578063a9059cbb11610095578063d31acb2811610064578063d31acb2814610563578063dba61c5814610583578063dd62ed3e14610599578063ea414b28146105df57600080fd5b8063a9059cbb146104f8578063c2ed286b14610518578063cc1776d314610538578063d2d7ad831461054d57600080fd5b806395d89b41116100d157806395d89b4114610473578063989763ef14610488578063a457c2d7146104b8578063a6f9dae1146104d857600080fd5b80636b8f2f3b146103d657806370a08231146103f75780638091f3bf1461042d5780638da5cb5b1461044e57600080fd5b806328be90381161017a578063442ef7d211610149578063442ef7d21461036c5780634f7041a5146103815780634f72e2a2146103965780634fbc2775146103b657600080fd5b806328be9038146102eb578063313ce5671461030b5780633567f96c14610337578063395093511461034c57600080fd5b80630c89a0df116101b65780630c89a0df1461025a57806318160ddd1461027a578063185511081461029957806323b872dd146102cb57600080fd5b806301339c21146101e857806306fdde03146101ff578063095ea7b31461022a57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506101fd6105ff565b005b34801561020b57600080fd5b506102146106ed565b6040516102219190611f8f565b60405180910390f35b34801561023657600080fd5b5061024a610245366004611eee565b61077b565b6040519015158152602001610221565b34801561026657600080fd5b5061024a610275366004611e0c565b61086c565b34801561028657600080fd5b506002545b604051908152602001610221565b3480156102a557600080fd5b506009546001600160a01b03165b6040516001600160a01b039091168152602001610221565b3480156102d757600080fd5b5061024a6102e6366004611e7f565b6109a7565b3480156102f757600080fd5b506101fd610306366004611ec0565b610acf565b34801561031757600080fd5b506005546103259060ff1681565b60405160ff9091168152602001610221565b34801561034357600080fd5b506101fd610bd8565b34801561035857600080fd5b5061024a610367366004611eee565b610c22565b34801561037857600080fd5b506101fd610d33565b34801561038d57600080fd5b5061028b610e08565b3480156103a257600080fd5b506101fd6103b1366004611f1a565b610e8a565b3480156103c257600080fd5b506101fd6103d1366004611ec0565b610f1e565b3480156103e257600080fd5b5060095461024a90600160a01b900460ff1681565b34801561040357600080fd5b5061028b610412366004611e0c565b6001600160a01b031660009081526020819052604090205490565b34801561043957600080fd5b5060065461024a90600160a01b900460ff1681565b34801561045a57600080fd5b506005546102b39061010090046001600160a01b031681565b34801561047f57600080fd5b5061021461101b565b34801561049457600080fd5b5061024a6104a3366004611e0c565b600c6020526000908152604090205460ff1681565b3480156104c457600080fd5b5061024a6104d3366004611eee565b611028565b3480156104e457600080fd5b506101fd6104f3366004611e0c565b6110e2565b34801561050457600080fd5b5061024a610513366004611eee565b61121f565b34801561052457600080fd5b506101fd610533366004611ec0565b611299565b34801561054457600080fd5b5061028b6113b7565b34801561055957600080fd5b5061028b600b5481565b34801561056f57600080fd5b506101fd61057e366004611f6d565b6113fc565b34801561058f57600080fd5b5061028b600a5481565b3480156105a557600080fd5b5061028b6105b4366004611e46565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105eb57600080fd5b506101fd6105fa366004611e0c565b611480565b6006546001600160a01b031633146106325760405162461bcd60e51b8152600401610629906120ba565b60405180910390fd5b600654600160a01b900460ff161561068c5760405162461bcd60e51b815260206004820152601960248201527f636f6e747261637420616c7265616479206c61756e63686564000000000000006044820152606401610629565b6006805460ff60a01b1916600160a01b17905560405133906000805160206121a6833981519152906106e39060208082526011908201527018dbdb9d1c9858dd081b185d5b98da1959607a1b604082015260600190565b60405180910390a2565b600480546106fa90612131565b80601f016020809104026020016040519081016040528092919081815260200182805461072690612131565b80156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b505050505081565b6006546000903390600160a01b900460ff16806107aa57506005546001600160a01b0382811661010090920416145b806107c457503360009081526007602052604090205460ff165b6107e05760405162461bcd60e51b81526004016106299061208d565b6001600160a01b0384166108065760405162461bcd60e51b815260040161062990612056565b3360008181526001602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060019392505050565b6006546000906001600160a01b031633146108995760405162461bcd60e51b8152600401610629906120ba565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b1580156108db57600080fd5b505afa1580156108ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109139190611f54565b60055460405163a9059cbb60e01b81526001600160a01b03610100909204821660048201526024810183905291925084169063a9059cbb90604401602060405180830381600087803b15801561096857600080fd5b505af115801561097c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a09190611f37565b9392505050565b6006546000908490600160a01b900460ff16806109d657506005546001600160a01b0382811661010090920416145b806109f057503360009081526007602052604090205460ff165b610a0c5760405162461bcd60e51b81526004016106299061208d565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610a3b90849061211a565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610a6a8585856116a6565b6001600160a01b038516600081815260016020908152604080832033808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b6006546001600160a01b03163314610af95760405162461bcd60e51b8152600401610629906120ba565b6001600160a01b03821660009081526008602052604090205460ff1615158115151415610b565760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610629565b6001600160a01b03821660009081526008602052604090819020805483151560ff199091161790555133906000805160206121a683398151915290610bcc9060208082526017908201527f6368616e676520746f2065786368616e6765206c697374000000000000000000604082015260600190565b60405180910390a25050565b6006546001600160a01b03163314610c025760405162461bcd60e51b8152600401610629906120ba565b6005544790610c1f9061010090046001600160a01b0316826117bd565b50565b6006546000903390600160a01b900460ff1680610c5157506005546001600160a01b0382811661010090920416145b80610c6b57503360009081526007602052604090205460ff165b610c875760405162461bcd60e51b81526004016106299061208d565b6001600160a01b038416610cad5760405162461bcd60e51b815260040161062990612056565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610cdc908490612102565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910161085a565b600654600160a01b900460ff16610d9e5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610629565b600960009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610dee57600080fd5b505af1158015610e02573d6000803e3d6000fd5b50505050565b60095460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b158015610e4d57600080fd5b505afa158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e859190611f54565b905090565b6006546001600160a01b03163314610eb45760405162461bcd60e51b8152600401610629906120ba565b60098054821515600160a01b0260ff60a01b1990911617905560405133906000805160206121a683398151915290610f139060208082526013908201527206368616e676520746f206175746f207377617606c1b604082015260600190565b60405180910390a250565b6006546001600160a01b03163314610f485760405162461bcd60e51b8152600401610629906120ba565b6001600160a01b03821660009081526007602052604090205460ff1615158115151415610fa55760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610629565b6001600160a01b03821660009081526007602052604090819020805483151560ff199091161790555133906000805160206121a683398151915290610bcc906020808252601f908201527f6368616e676520746f2063616e20616c77617973207472616465206c69737400604082015260600190565b600380546106fa90612131565b6006546000903390600160a01b900460ff168061105757506005546001600160a01b0382811661010090920416145b8061107157503360009081526007602052604090205460ff165b61108d5760405162461bcd60e51b81526004016106299061208d565b6001600160a01b0384166110b35760405162461bcd60e51b815260040161062990612056565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610cdc90849061211a565b6006546001600160a01b0316331461110c5760405162461bcd60e51b8152600401610629906120ba565b6001600160a01b03811661115b5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610629565b6005546001600160a01b0361010090910481166000818152600c60209081526040808320805460ff19908116909155948616808452818420805487166001908117909155948452600790925280832080548616905590825290208054909216179055600580546001600160a01b03831661010002610100600160a81b031990911617905560405133906000805160206121a683398151915290610f13906020808252600d908201526c1bdddb995c8818da185b99d959609a1b604082015260600190565b6006546000903390600160a01b900460ff168061124e57506005546001600160a01b0382811661010090920416145b8061126857503360009081526007602052604090205460ff165b6112845760405162461bcd60e51b81526004016106299061208d565b61128f3385856116a6565b5060019392505050565b6006546001600160a01b031633146112c35760405162461bcd60e51b8152600401610629906120ba565b6001600160a01b03821660009081526008602052604090205460ff1615806112e9575080155b6113415760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610629565b6001600160a01b0382166000908152600c602052604090819020805483151560ff199091161790555133906000805160206121a683398151915290610bcc906020808252601c908201527f6368616e676520746f20746178206578636c7573696f6e206c69737400000000604082015260600190565b6009546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b158015610e4d57600080fd5b6006546001600160a01b031633146114265760405162461bcd60e51b8152600401610629906120ba565b600b829055600a81905560405133906000805160206121a683398151915290610bcc906020808252601e908201527f6368616e676520746f206175746f2073776170207468726573686f6c64730000604082015260600190565b600954604051635b22149760e01b81526001600160a01b0390911690635b221497906114ae90600401611fe4565b60206040518083038186803b1580156114c657600080fd5b505afa1580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe9190611e29565b6001600160a01b0316336001600160a01b0316146115715760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c7920746865207461782077616c6c65742063616e206368616e676520696044820152697473206164647265737360b01b6064820152608401610629565b60095460405163583dd79d60e01b81526001600160a01b039091169063583dd79d906115a1908490600401612013565b600060405180830381600087803b1580156115bb57600080fd5b505af11580156115cf573d6000803e3d6000fd5b50505050336001600160a01b03166000805160206121a6833981519152604051610f139060208082526014908201527318da185b99d9481d1bc81d185e081dd85b1b195d60621b604082015260600190565b6001600160a01b038181166000908152600c60205260408082208054600160ff199182168117909255600654909416835291208054909216179055610c1f815b60058054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b6001600160a01b0382166116f55760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610629565b6117008383836118db565b600061170d8484846118e6565b6001600160a01b03851660009081526020819052604090205490915061173490839061211a565b6001600160a01b038086166000908152602081905260408082209390935590851681522054611764908290612102565b6001600160a01b038481166000818152602081815260409182902094909455518481529092918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e02565b8047101561180d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610629565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461185a576040519150601f19603f3d011682016040523d82523d6000602084013e61185f565b606091505b50509050806118d65760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610629565b505050565b6118d68383836118fb565b60006118f3848484611b11565b949350505050565b60095460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b15801561194057600080fd5b505afa158015611954573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119789190611f54565b611982904261211a565b600654909150600160a01b900460ff1680156119a75750600954600160a01b900460ff165b80156119cb57506001600160a01b03831660009081526008602052604090205460ff165b80156119e5575042600d54603c6119e29190612102565b11155b80156119f35750600a548110155b8015611a1b5750600b546009546001600160a01b031660009081526020819052604090205410155b8015611aaa5750600960009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7057600080fd5b505afa158015611a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa89190611f37565b155b15611b0c5742600d556009546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b158015611af957600080fd5b505af1925050508015611b0a575060015b505b610e02565b6001600160a01b0383166000908152600c6020526040812054829060ff16158015611b5557506001600160a01b0384166000908152600c602052604090205460ff16155b8015611b6a5750600654600160a01b900460ff165b15611cf4576001600160a01b03851660009081526008602052604090205460ff1615611c165760095460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024015b602060405180830381600087803b158015611bd757600080fd5b505af1158015611beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0f9190611f54565b9050611cf4565b6001600160a01b03841660009081526008602052604090205460ff1615611c6857600954604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401611bbd565b600e5460ff1615611cf45760095460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b158015611cb957600080fd5b505af1158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf19190611f54565b90505b6000611d00828561211a565b90508015611d8c576009546001600160a01b0316600090815260208190526040902054611d2e908290612102565b600980546001600160a01b0390811660009081526020818152604091829020949094559154915184815291811692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b611d97868684611da1565b9695505050505050565b6000826001600160a01b0316846001600160a01b03161415611e055760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610629565b5092915050565b600060208284031215611e1e57600080fd5b81356109a081612182565b600060208284031215611e3b57600080fd5b81516109a081612182565b60008060408385031215611e5957600080fd5b8235611e6481612182565b91506020830135611e7481612182565b809150509250929050565b600080600060608486031215611e9457600080fd5b8335611e9f81612182565b92506020840135611eaf81612182565b929592945050506040919091013590565b60008060408385031215611ed357600080fd5b8235611ede81612182565b91506020830135611e7481612197565b60008060408385031215611f0157600080fd5b8235611f0c81612182565b946020939093013593505050565b600060208284031215611f2c57600080fd5b81356109a081612197565b600060208284031215611f4957600080fd5b81516109a081612197565b600060208284031215611f6657600080fd5b5051919050565b60008060408385031215611f8057600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015611fbc57858101830151858201604001528201611fa0565b81811115611fce576000604083870101525b50601f01601f1916929092016040019392505050565b60208152600061200d6020830160098152684d61726b6574696e6760b81b602082015260400190565b92915050565b60408152600061203c6040830160098152684d61726b6574696e6760b81b602082015260400190565b6001600160a01b0393909316602092909201919091525090565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600082198211156121155761211561216c565b500190565b60008282101561212c5761212c61216c565b500390565b600181811c9082168061214557607f821691505b6020821081141561216657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610c1f57600080fd5b8015158114610c1f57600080fdfed43eee071b91e7714b533dbf825ec024145ba03675691f363d9a4c47e88b4dc5a2646970667358221220f5c8e500311ba9427f599d8d75ffa80951a135ee522aeadd2825ad143e5393fa64736f6c63430008070033

Deployed Bytecode Sourcemap

186:2321:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6435:214:1;;;;;;;;;;;;;:::i;:::-;;415:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3440:314;;;;;;;;;;-1:-1:-1;3440:314:1;;;;;:::i;:::-;;:::i;:::-;;;4045:14:6;;4038:22;4020:41;;4008:2;3993:18;3440:314:1;3880:187:6;7648:202:1;;;;;;;;;;-1:-1:-1;7648:202:1;;;;;:::i;:::-;;:::i;1522:102::-;;;;;;;;;;-1:-1:-1;1604:12:1;;1522:102;;;12823:25:6;;;12811:2;12796:18;1522:102:1;12677:177:6;3185:114:2;;;;;;;;;;-1:-1:-1;3276:14:2;;-1:-1:-1;;;;;3276:14:2;3185:114;;;-1:-1:-1;;;;;3557:32:6;;;3539:51;;3527:2;3512:18;3185:114:2;3393:203:6;4227:328:1;;;;;;;;;;-1:-1:-1;4227:328:1;;;;;:::i;:::-;;:::i;8128:230::-;;;;;;;;;;-1:-1:-1;8128:230:1;;;;;:::i;:::-;;:::i;440:21::-;;;;;;;;;;-1:-1:-1;440:21:1;;;;;;;;;;;13031:4:6;13019:17;;;13001:36;;12989:2;12974:18;440:21:1;12859:184:6;7486:154:1;;;;;;;;;;;;;:::i;5070:381::-;;;;;;;;;;-1:-1:-1;5070:381:1;;;;;:::i;:::-;;:::i;4119:93:2:-;;;;;;;;;;;;;:::i;2993:102::-;;;;;;;;;;;;;:::i;3345:168::-;;;;;;;;;;-1:-1:-1;3345:168:2;;;;;:::i;:::-;;:::i;7862:254:1:-;;;;;;;;;;-1:-1:-1;7862:254:1;;;;;:::i;:::-;;:::i;220:23:2:-;;;;;;;;;;-1:-1:-1;220:23:2;;;;-1:-1:-1;;;220:23:2;;;;;;1841:119:1;;;;;;;;;;-1:-1:-1;1841:119:1;;;;;:::i;:::-;-1:-1:-1;;;;;1935:17:1;1908:7;1935:17;;;;;;;;;;;;1841:119;542:20;;;;;;;;;;-1:-1:-1;542:20:1;;;;-1:-1:-1;;;542:20:1;;;;;;474:29;;;;;;;;;;-1:-1:-1;474:29:1;;;;;;;-1:-1:-1;;;;;474:29:1;;;388:20;;;;;;;;;;;;;:::i;340:48:2:-;;;;;;;;;;-1:-1:-1;340:48:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;5971:391:1;;;;;;;;;;-1:-1:-1;5971:391:1;;;;;:::i;:::-;;:::i;7231:247::-;;;;;;;;;;-1:-1:-1;7231:247:1;;;;;:::i;:::-;;:::i;2615:178::-;;;;;;;;;;-1:-1:-1;2615:178:1;;;;;:::i;:::-;;:::i;3521:305:2:-;;;;;;;;;;-1:-1:-1;3521:305:2;;;;;:::i;:::-;;:::i;2791:104::-;;;;;;;;;;;;;:::i;295:38::-;;;;;;;;;;;;;;;;3834:273;;;;;;;;;;-1:-1:-1;3834:273:2;;;;;:::i;:::-;;:::i;250:38::-;;;;;;;;;;;;;;;;2300:144:1;;;;;;;;;;-1:-1:-1;2300:144:1;;;;;:::i;:::-;-1:-1:-1;;;;;2411:16:1;;;2384:7;2411:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;2300:144;2198:306:5;;;;;;;;;;-1:-1:-1;2198:306:5;;;;;:::i;:::-;;:::i;6435:214:1:-;813:8;;-1:-1:-1;;;;;813:8:1;799:10;:22;791:75;;;;-1:-1:-1;;;791:75:1;;;;;;;:::i;:::-;;;;;;;;;6499:8:::1;::::0;-1:-1:-1;;;6499:8:1;::::1;;;:17;6491:55;;;::::0;-1:-1:-1;;;6491:55:1;;10760:2:6;6491:55:1::1;::::0;::::1;10742:21:6::0;10799:2;10779:18;;;10772:30;10838:27;10818:18;;;10811:55;10883:18;;6491:55:1::1;10558:349:6::0;6491:55:1::1;6557:8;:15:::0;;-1:-1:-1;;;;6557:15:1::1;-1:-1:-1::0;;;6557:15:1::1;::::0;;6588:53:::1;::::0;6609:10:::1;::::0;-1:-1:-1;;;;;;;;;;;6588:53:1;::::1;::::0;4876:2:6;4858:21;;;4915:2;4895:18;;;4888:30;-1:-1:-1;;;4949:2:6;4934:18;;4927:47;5006:2;4991:18;;4674:341;6588:53:1::1;;;;;;;;6435:214::o:0;415:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3440:314::-;1214:8;;3543:4;;3522:10;;-1:-1:-1;;;1214:8:1;;;;;:25;;-1:-1:-1;1234:5:1;;-1:-1:-1;;;;;1226:13:1;;;1234:5;;;;;1226:13;1214:25;:55;;;-1:-1:-1;1258:10:1;1243:26;;;;:14;:26;;;;;;;;1214:55;1206:87;;;;-1:-1:-1;;;1206:87:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3568:21:1;::::1;3560:62;;;;-1:-1:-1::0;;;3560:62:1::1;;;;;;;:::i;:::-;3644:10;3635:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;3635:29:1;::::1;::::0;;;;;;;;;;:37;;;3688:36;12823:25:6;;;3635:29:1;;3644:10;3688:36:::1;::::0;12796:18:6;3688:36:1::1;;;;;;;;-1:-1:-1::0;3742:4:1::1;::::0;3440:314;-1:-1:-1;;;3440:314:1:o;7648:202::-;813:8;;7714:4;;-1:-1:-1;;;;;813:8:1;799:10;:22;791:75;;;;-1:-1:-1;;;791:75:1;;;;;;;:::i;:::-;7748:38:::1;::::0;-1:-1:-1;;;7748:38:1;;7780:4:::1;7748:38;::::0;::::1;3539:51:6::0;7730:15:1::1;::::0;-1:-1:-1;;;;;7748:23:1;::::1;::::0;::::1;::::0;3512:18:6;;7748:38:1::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7827:5;::::0;7804:38:::1;::::0;-1:-1:-1;;;7804:38:1;;-1:-1:-1;;;;;7827:5:1::1;::::0;;::::1;::::0;::::1;7804:38;::::0;::::1;3775:51:6::0;3842:18;;;3835:34;;;;;-1:-1:-1;7804:22:1;::::1;::::0;::::1;::::0;3748:18:6;;7804:38:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7797:45:::0;7648:202;-1:-1:-1;;;7648:202:1:o;4227:328::-;1214:8;;4338:4;;4323;;-1:-1:-1;;;1214:8:1;;;;;:25;;-1:-1:-1;1234:5:1;;-1:-1:-1;;;;;1226:13:1;;;1234:5;;;;;1226:13;1214:25;:55;;;-1:-1:-1;1258:10:1;1243:26;;;;:14;:26;;;;;;;;1214:55;1206:87;;;;-1:-1:-1;;;1206:87:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;4384:14:1;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4399:10:::1;4384:26:::0;;;;;;;;:34:::1;::::0;4413:5;;4384:34:::1;:::i;:::-;-1:-1:-1::0;;;;;4355:14:1;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4370:10:::1;4355:26:::0;;;;;;;:63;4429:26:::1;4364:4:::0;4445:2;4449:5;4429:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;4471:54:1;::::1;4498:14;::::0;;;:8:::1;:14;::::0;;;;;;;4486:10:::1;4498:26:::0;;;;;;;;;;;4471:54;;12823:25:6;;;4486:10:1;;4471:54;::::1;::::0;12796:18:6;4471:54:1::1;;;;;;;-1:-1:-1::0;4543:4:1::1;::::0;4227:328;-1:-1:-1;;;;4227:328:1:o;8128:230::-;813:8;;-1:-1:-1;;;;;813:8:1;799:10;:22;791:75;;;;-1:-1:-1;;;791:75:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;8209:14:1;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:20;;::::0;::::1;;;;8201:44;;;::::0;-1:-1:-1;;;8201:44:1;;12539:2:6;8201:44:1::1;::::0;::::1;12521:21:6::0;12578:2;12558:18;;;12551:30;-1:-1:-1;;;12597:18:6;;;12590:41;12648:18;;8201:44:1::1;12337:335:6::0;8201:44:1::1;-1:-1:-1::0;;;;;8256:14:1;::::1;;::::0;;;:9:::1;:14;::::0;;;;;;:19;;;::::1;;-1:-1:-1::0;;8256:19:1;;::::1;;::::0;;8291:59;8312:10:::1;::::0;-1:-1:-1;;;;;;;;;;;8291:59:1;::::1;::::0;6225:2:6;6207:21;;;6264:2;6244:18;;;6237:30;6303:25;6298:2;6283:18;;6276:53;6361:2;6346:18;;6023:347;8291:59:1::1;;;;;;;;8128:230:::0;;:::o;7486:154::-;813:8;;-1:-1:-1;;;;;813:8:1;799:10;:22;791:75;;;;-1:-1:-1;;;791:75:1;;;;;;;:::i;:::-;7616:5:::1;::::0;7558:21:::1;::::0;7590:42:::1;::::0;7616:5:::1;::::0;::::1;-1:-1:-1::0;;;;;7616:5:1::1;7558:21:::0;7590:17:::1;:42::i;:::-;7529:111;7486:154::o:0;5070:381::-;1214:8;;5179:4;;5158:10;;-1:-1:-1;;;1214:8:1;;;;;:25;;-1:-1:-1;1234:5:1;;-1:-1:-1;;;;;1226:13:1;;;1234:5;;;;;1226:13;1214:25;:55;;;-1:-1:-1;1258:10:1;1243:26;;;;:14;:26;;;;;;;;1214:55;1206:87;;;;-1:-1:-1;;;1206:87:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;5204:21:1;::::1;5196:62;;;;-1:-1:-1::0;;;5196:62:1::1;;;;;;;:::i;:::-;5312:10;5303:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5303:29:1;::::1;::::0;;;;;;;;:42:::1;::::0;5335:10;;5303:42:::1;:::i;:::-;5280:10;5271:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5271:29:1;::::1;::::0;;;;;;;;;;:74;;;5361:60;12823:25:6;;;5271:29:1;;5361:60:::1;::::0;12796:18:6;5361:60:1::1;12677:177:6::0;4119:93:2;939:8:1;;-1:-1:-1;;;939:8:1;;;;931:62;;;;-1:-1:-1;;;931:62:1;;6934:2:6;931:62:1;;;6916:21:6;6973:2;6953:18;;;6946:30;7012:34;6992:18;;;6985:62;-1:-1:-1;;;7063:18:6;;;7056:39;7112:19;;931:62:1;6732:405:6;931:62:1;4177:14:2::1;;;;;;;;;-1:-1:-1::0;;;;;4177:14:2::1;-1:-1:-1::0;;;;;4177:25:2::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4119:93::o:0;2993:102::-;3061:14;;:26;;;-1:-1:-1;;;3061:26:2;;;;3034:7;;-1:-1:-1;;;;;3061:14:2;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3054:33;;2993:102;:::o;3345:168::-;813:8:1;;-1:-1:-1;;;;;813:8:1;799:10;:22;791:75;;;;-1:-1:-1;;;791:75:1;;;;;;;:::i;:::-;3413:11:2::1;:21:::0;;;::::1;;-1:-1:-1::0;;;3413:21:2::1;-1:-1:-1::0;;;;3413:21:2;;::::1;;::::0;;3450:55:::1;::::0;3471:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3450:55:2;::::1;::::0;8888:2:6;8870:21;;;8927:2;8907:18;;;8900:30;-1:-1:-1;;;8961:2:6;8946:18;;8939:49;9020:2;9005:18;;8686:343;3450:55:2::1;;;;;;;;3345:168:::0;:::o;7862:254:1:-;813:8;;-1:-1:-1;;;;;813:8:1;799:10;:22;791:75;;;;-1:-1:-1;;;791:75:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7949:19:1;::::1;;::::0;;;:14:::1;:19;::::0;;;;;::::1;;:25;;::::0;::::1;;;;7941:49;;;::::0;-1:-1:-1;;;7941:49:1;;12539:2:6;7941:49:1::1;::::0;::::1;12521:21:6::0;12578:2;12558:18;;;12551:30;-1:-1:-1;;;12597:18:6;;;12590:41;12648:18;;7941:49:1::1;12337:335:6::0;7941:49:1::1;-1:-1:-1::0;;;;;8001:19:1;::::1;;::::0;;;:14:::1;:19;::::0;;;;;;:24;;;::::1;;-1:-1:-1::0;;8001:24:1;;::::1;;::::0;;8041:67;8062:10:::1;::::0;-1:-1:-1;;;;;;;;;;;8041:67:1;::::1;::::0;9645:2:6;9627:21;;;9684:2;9664:18;;;9657:30;9723:33;9718:2;9703:18;;9696:61;9789:2;9774:18;;9443:355;388:20:1;;;;;;;:::i;5971:391::-;1214:8;;6085:4;;6064:10;;-1:-1:-1;;;1214:8:1;;;;;:25;;-1:-1:-1;1234:5:1;;-1:-1:-1;;;;;1226:13:1;;;1234:5;;;;;1226:13;1214:25;:55;;;-1:-1:-1;1258:10:1;1243:26;;;;:14;:26;;;;;;;;1214:55;1206:87;;;;-1:-1:-1;;;1206:87:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;6110:21:1;::::1;6102:62;;;;-1:-1:-1::0;;;6102:62:1::1;;;;;;;:::i;:::-;6218:10;6209:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;6209:29:1;::::1;::::0;;;;;;;;:47:::1;::::0;6241:15;;6209:47:::1;:::i;7231:247::-:0;813:8;;-1:-1:-1;;;;;813:8:1;799:10;:22;791:75;;;;-1:-1:-1;;;791:75:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7303:17:1;::::1;7295:52;;;::::0;-1:-1:-1;;;7295:52:1;;10005:2:6;7295:52:1::1;::::0;::::1;9987:21:6::0;10044:2;10024:18;;;10017:30;-1:-1:-1;;;10063:18:6;;;10056:52;10125:18;;7295:52:1::1;9803:346:6::0;7295:52:1::1;7372:5;::::0;-1:-1:-1;;;;;7372:5:1::1;::::0;;::::1;::::0;::::1;782::2::0;758:21;;;:15;:21;;;;;;;;:29;;-1:-1:-1;;758:29:2;;;;;;798:19;;;;;;;;;:26;;;;-1:-1:-1;798:26:2;;;;;;7045:20:1;;;:14;:20;;;;;;:28;;;;;;7084:18;;;;;:25;;;;;;;;7394:5:::1;:11:::0;;-1:-1:-1;;;;;7394:11:1;::::1;;;-1:-1:-1::0;;;;;;7394:11:1;;::::1;;::::0;;7421:49:::1;::::0;7442:10:::1;::::0;-1:-1:-1;;;;;;;;;;;7421:49:1;::::1;::::0;5883:2:6;5865:21;;;5922:2;5902:18;;;5895:30;-1:-1:-1;;;5956:2:6;5941:18;;5934:43;6009:2;5994:18;;5681:337;2615:178:1;1214:8;;2714:4;;2693:10;;-1:-1:-1;;;1214:8:1;;;;;:25;;-1:-1:-1;1234:5:1;;-1:-1:-1;;;;;1226:13:1;;;1234:5;;;;;1226:13;1214:25;:55;;;-1:-1:-1;1258:10:1;1243:26;;;;:14;:26;;;;;;;;1214:55;1206:87;;;;-1:-1:-1;;;1206:87:1;;;;;;;:::i;:::-;2731:32:::1;2741:10;2753:2;2757:5;2731:9;:32::i;:::-;-1:-1:-1::0;2781:4:1::1;::::0;2615:178;-1:-1:-1;;;2615:178:1:o;3521:305:2:-;813:8:1;;-1:-1:-1;;;;;813:8:1;799:10;:22;791:75;;;;-1:-1:-1;;;791:75:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3614:14:2;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;3641:16:2;::::1;3614:43;3606:91;;;::::0;-1:-1:-1;;;3606:91:2;;10356:2:6;3606:91:2::1;::::0;::::1;10338:21:6::0;10395:2;10375:18;;;10368:30;10434:34;10414:18;;;10407:62;-1:-1:-1;;;10485:18:6;;;10478:33;10528:19;;3606:91:2::1;10154:399:6::0;3606:91:2::1;-1:-1:-1::0;;;;;3708:20:2;::::1;;::::0;;;:15:::1;:20;::::0;;;;;;:30;;;::::1;;-1:-1:-1::0;;3708:30:2;;::::1;;::::0;;3754:64;3775:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3754:64:2;::::1;::::0;11463:2:6;11445:21;;;11502:2;11482:18;;;11475:30;11541;11536:2;11521:18;;11514:58;11604:2;11589:18;;11261:352;2791:104:2;2860:14;;:27;;;-1:-1:-1;;;2860:27:2;;;;2833:7;;-1:-1:-1;;;;;2860:14:2;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;3834:273;813:8:1;;-1:-1:-1;;;;;813:8:1;799:10;:22;791:75;;;;-1:-1:-1;;;791:75:1;;;;;;;:::i;:::-;3938:23:2::1;:35:::0;;;3984:23:::1;:33:::0;;;4033:66:::1;::::0;4054:10:::1;::::0;-1:-1:-1;;;;;;;;;;;4033:66:2;::::1;::::0;12180:2:6;12162:21;;;12219:2;12199:18;;;12192:30;12258:32;12253:2;12238:18;;12231:60;12323:2;12308:18;;11978:354;2198:306:5;2278:14;;:40;;-1:-1:-1;;;2278:40:5;;-1:-1:-1;;;;;2278:14:5;;;;:27;;:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2264:54:5;:10;-1:-1:-1;;;;;2264:54:5;;2256:109;;;;-1:-1:-1;;;2256:109:5;;7344:2:6;2256:109:5;;;7326:21:6;7383:2;7363:18;;;7356:30;7422:34;7402:18;;;7395:62;-1:-1:-1;;;7473:18:6;;;7466:40;7523:19;;2256:109:5;7142:406:6;2256:109:5;2376:14;;:48;;-1:-1:-1;;;2376:48:5;;-1:-1:-1;;;;;2376:14:5;;;;:27;;:48;;2417:6;;2376:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2461:10;-1:-1:-1;;;;;2440:56:5;-1:-1:-1;;;;;;;;;;;2440:56:5;;;;11114:2:6;11096:21;;;11153:2;11133:18;;;11126:30;-1:-1:-1;;;11187:2:6;11172:18;;11165:50;11247:2;11232:18;;10912:344;477:187:2;-1:-1:-1;;;;;549:23:2;;;;;;;:15;:23;;;;;;:30;;575:4;-1:-1:-1;;549:30:2;;;;;;;;606:8;;;;;590:25;;;;:32;;;;;;;;633:23;549;1325:124:1;1388:5;:14;;-1:-1:-1;;;;;;1388:14:1;;-1:-1:-1;;;;;1388:14:1;;;;;;;;;;;;;1428:5;;;-1:-1:-1;1413:21:1;;;:14;:21;;;;;:28;;-1:-1:-1;;1413:28:1;-1:-1:-1;1413:28:1;;;1325:124::o;9259:453::-;-1:-1:-1;;;;;9346:16:1;;9338:51;;;;-1:-1:-1;;;9338:51:1;;10005:2:6;9338:51:1;;;9987:21:6;10044:2;10024:18;;;10017:30;-1:-1:-1;;;10063:18:6;;;10056:52;10125:18;;9338:51:1;9803:346:6;9338:51:1;9402:28;9414:4;9420:2;9424:5;9402:11;:28::i;:::-;9443:22;9468:40;9492:4;9498:2;9502:5;9468:23;:40::i;:::-;-1:-1:-1;;;;;9537:15:1;;:9;:15;;;;;;;;;;;9443:65;;-1:-1:-1;9537:23:1;;9555:5;;9537:23;:::i;:::-;-1:-1:-1;;;;;9519:15:1;;;:9;:15;;;;;;;;;;;:41;;;;9587:13;;;;;;;:30;;9603:14;;9587:30;:::i;:::-;-1:-1:-1;;;;;9571:13:1;;;:9;:13;;;;;;;;;;;;:46;;;;9635:34;12823:25:6;;;9571:13:1;;9635:34;;;;;;12796:18:6;9635:34:1;;;;;;;9682:22;2027:140:5;2710:317:0;2825:6;2800:21;:31;;2792:73;;;;-1:-1:-1;;;2792:73:0;;8530:2:6;2792:73:0;;;8512:21:6;8569:2;8549:18;;;8542:30;8608:31;8588:18;;;8581:59;8657:18;;2792:73:0;8328:353:6;2792:73:0;2879:12;2897:9;-1:-1:-1;;;;;2897:14:0;2919:6;2897:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2878:52;;;2949:7;2941:78;;;;-1:-1:-1;;;2941:78:0;;8103:2:6;2941:78:0;;;8085:21:6;8142:2;8122:18;;;8115:30;8181:34;8161:18;;;8154:62;8252:28;8232:18;;;8225:56;8298:19;;2941:78:0;7901:422:6;2941:78:0;2781:246;2710:317;;:::o;1636:164:5:-;1758:34;1776:4;1782:2;1786:5;1758:17;:34::i;1812:207::-;1938:7;1965:46;1995:4;2001:2;2005:5;1965:29;:46::i;:::-;1958:53;1812:207;-1:-1:-1;;;;1812:207:5:o;1961:693:2:-;2106:14;;:29;;;-1:-1:-1;;;2106:29:2;;;;2060:25;;-1:-1:-1;;;;;2106:14:2;;:27;;:29;;;;;;;;;;;;;;:14;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2088:47;;:15;:47;:::i;:::-;2164:8;;2060:75;;-1:-1:-1;;;;2164:8:2;;;;:37;;;;-1:-1:-1;2190:11:2;;-1:-1:-1;;;2190:11:2;;;;2164:37;:68;;;;-1:-1:-1;;;;;;2219:13:2;;;;;;:9;:13;;;;;;;;2164:68;:123;;;;;2272:15;2250:13;;2266:2;2250:18;;;;:::i;:::-;:37;;2164:123;:184;;;;;2325:23;;2304:17;:44;;2164:184;:262;;;;-1:-1:-1;2403:23:2;;2383:14;;-1:-1:-1;;;;;2383:14:2;2365:9;:34;;;;;;;;;;;:61;;2164:262;:311;;;;;2443:14;;;;;;;;;-1:-1:-1;;;;;2443:14:2;-1:-1:-1;;;;;2443:21:2;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;2164:311;2146:456;;;2518:15;2502:13;:31;2552:14;;:27;;;-1:-1:-1;;;2552:27:2;;;;-1:-1:-1;;;;;2552:14:2;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;2548:43;;2612:34;2710:317:0;884:1067:2;-1:-1:-1;;;;;1070:21:2;;993:7;1070:21;;;:15;:21;;;;;;1048:5;;1070:21;;:30;;;:62;;-1:-1:-1;;;;;;1104:19:2;;;;;;:15;:19;;;;;;;;:28;1070:62;:74;;;;-1:-1:-1;1136:8:2;;-1:-1:-1;;;1136:8:2;;;;1070:74;1066:541;;;-1:-1:-1;;;;;1165:15:2;;;;;;:9;:15;;;;;;;;1161:435;;;1252:14;;:32;;-1:-1:-1;;;1252:32:2;;;;;12823:25:6;;;-1:-1:-1;;;;;1252:14:2;;;;:25;;12796:18:6;;1252:32:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1235:49;;1161:435;;;-1:-1:-1;;;;;1310:13:2;;;;;;:9;:13;;;;;;;;1306:290;;;1396:14;;:33;;-1:-1:-1;;;1396:33:2;;;;;12823:25:6;;;-1:-1:-1;;;;;1396:14:2;;;;:26;;12796:18:6;;1396:33:2;12677:177:6;1306:290:2;1455:12;;;;1451:145;;;1548:14;;:32;;-1:-1:-1;;;1548:32:2;;;;;12823:25:6;;;-1:-1:-1;;;;;1548:14:2;;;;:25;;12796:18:6;;1548:32:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1531:49;;1451:145;1619:17;1639:22;1647:14;1639:5;:22;:::i;:::-;1619:42;-1:-1:-1;1676:13:2;;1672:199;;1761:14;;-1:-1:-1;;;;;1761:14:2;1743:9;:34;;;;;;;;;;;:46;;1780:9;;1743:46;:::i;:::-;1724:14;;;-1:-1:-1;;;;;1724:14:2;;;1706:9;:34;;;;;;;;;;;;:83;;;;1832:14;;1809:50;;12823:25:6;;;1832:14:2;;;;1809:50;;;;;;12796:18:6;1809:50:2;;;;;;;1672:199;1888:55;1918:4;1924:2;1928:14;1888:29;:55::i;:::-;1881:62;884:1067;-1:-1:-1;;;;;;884:1067:2:o;6751:205:1:-;6851:7;6887:2;-1:-1:-1;;;;;6879:10:1;:4;-1:-1:-1;;;;;6879:10:1;;;6871:54;;;;-1:-1:-1;;;6871:54:1;;11820:2:6;6871:54:1;;;11802:21:6;11859:2;11839:18;;;11832:30;11898:33;11878:18;;;11871:61;11949:18;;6871:54:1;11618:355:6;6871:54:1;-1:-1:-1;6943:5:1;6751:205;-1:-1:-1;;6751:205:1:o;14:247:6:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:6;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:6;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:6;1346:18;;;;1333:32;;915:456::o;1376:382::-;1441:6;1449;1502:2;1490:9;1481:7;1477:23;1473:32;1470:52;;;1518:1;1515;1508:12;1470:52;1557:9;1544:23;1576:31;1601:5;1576:31;:::i;:::-;1626:5;-1:-1:-1;1683:2:6;1668:18;;1655:32;1696:30;1655:32;1696:30;:::i;1763:315::-;1831:6;1839;1892:2;1880:9;1871:7;1867:23;1863:32;1860:52;;;1908:1;1905;1898:12;1860:52;1947:9;1934:23;1966:31;1991:5;1966:31;:::i;:::-;2016:5;2068:2;2053:18;;;;2040:32;;-1:-1:-1;;;1763:315:6:o;2083:241::-;2139:6;2192:2;2180:9;2171:7;2167:23;2163:32;2160:52;;;2208:1;2205;2198:12;2160:52;2247:9;2234:23;2266:28;2288:5;2266:28;:::i;2329:245::-;2396:6;2449:2;2437:9;2428:7;2424:23;2420:32;2417:52;;;2465:1;2462;2455:12;2417:52;2497:9;2491:16;2516:28;2538:5;2516:28;:::i;2579:184::-;2649:6;2702:2;2690:9;2681:7;2677:23;2673:32;2670:52;;;2718:1;2715;2708:12;2670:52;-1:-1:-1;2741:16:6;;2579:184;-1:-1:-1;2579:184:6:o;2768:248::-;2836:6;2844;2897:2;2885:9;2876:7;2872:23;2868:32;2865:52;;;2913:1;2910;2903:12;2865:52;-1:-1:-1;;2936:23:6;;;3006:2;2991:18;;;2978:32;;-1:-1:-1;2768:248:6:o;4072:597::-;4184:4;4213:2;4242;4231:9;4224:21;4274:6;4268:13;4317:6;4312:2;4301:9;4297:18;4290:34;4342:1;4352:140;4366:6;4363:1;4360:13;4352:140;;;4461:14;;;4457:23;;4451:30;4427:17;;;4446:2;4423:26;4416:66;4381:10;;4352:140;;;4510:6;4507:1;4504:13;4501:91;;;4580:1;4575:2;4566:6;4555:9;4551:22;4547:31;4540:42;4501:91;-1:-1:-1;4653:2:6;4632:15;-1:-1:-1;;4628:29:6;4613:45;;;;4660:2;4609:54;;4072:597;-1:-1:-1;;;4072:597:6:o;5020:277::-;5222:2;5211:9;5204:21;5185:4;5242:49;5287:2;5276:9;5272:18;3098:1;3086:14;;-1:-1:-1;;;3125:4:6;3116:14;;3109:35;3169:2;3160:12;;3021:157;5242:49;5234:57;5020:277;-1:-1:-1;;5020:277:6:o;5302:374::-;5532:2;5521:9;5514:21;5495:4;5552:49;5597:2;5586:9;5582:18;3098:1;3086:14;;-1:-1:-1;;;3125:4:6;3116:14;;3109:35;3169:2;3160:12;;3021:157;5552:49;-1:-1:-1;;;;;5637:32:6;;;;5632:2;5617:18;;;;5610:60;;;;-1:-1:-1;5544:57:6;5302:374::o;6375:352::-;6577:2;6559:21;;;6616:2;6596:18;;;6589:30;6655;6650:2;6635:18;;6628:58;6718:2;6703:18;;6375:352::o;7553:343::-;7755:2;7737:21;;;7794:2;7774:18;;;7767:30;-1:-1:-1;;;7828:2:6;7813:18;;7806:49;7887:2;7872:18;;7553:343::o;9034:404::-;9236:2;9218:21;;;9275:2;9255:18;;;9248:30;9314:34;9309:2;9294:18;;9287:62;-1:-1:-1;;;9380:2:6;9365:18;;9358:38;9428:3;9413:19;;9034:404::o;13048:128::-;13088:3;13119:1;13115:6;13112:1;13109:13;13106:39;;;13125:18;;:::i;:::-;-1:-1:-1;13161:9:6;;13048:128::o;13181:125::-;13221:4;13249:1;13246;13243:8;13240:34;;;13254:18;;:::i;:::-;-1:-1:-1;13291:9:6;;13181:125::o;13311:380::-;13390:1;13386:12;;;;13433;;;13454:61;;13508:4;13500:6;13496:17;13486:27;;13454:61;13561:2;13553:6;13550:14;13530:18;13527:38;13524:161;;;13607:10;13602:3;13598:20;13595:1;13588:31;13642:4;13639:1;13632:15;13670:4;13667:1;13660:15;13524:161;;13311:380;;;:::o;13696:127::-;13757:10;13752:3;13748:20;13745:1;13738:31;13788:4;13785:1;13778:15;13812:4;13809:1;13802:15;13828:131;-1:-1:-1;;;;;13903:31:6;;13893:42;;13883:70;;13949:1;13946;13939:12;13964:118;14050:5;14043:13;14036:21;14029:5;14026:32;14016:60;;14072:1;14069;14062:12

Swarm Source

ipfs://3c2ddb5cd893314d896ba2e2d744402247493104c82c39f5c14f67c01f3ce44f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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