ETH Price: $3,455.98 (-0.45%)
Gas: 4 Gwei

Token

Bestial AI (BESTAI)
 

Overview

Max Total Supply

10,000,000 BESTAI

Holders

159

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
BestialAI

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 7 of 7: _Bestial.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.7;

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

contract BestialAI is BaseErc20, FixedTaxable, Burnable {

    uint256 immutable public mhAmount;
    address immutable public deployer;

    constructor () {
        configure(0x307868f2f59239F43920D8a8868F67dDe032Bad5);
        deployer = msg.sender;

        symbol = "BESTAI";
        name = "Bestial AI";
        decimals = 18;

        // Swap
        address routerAddress = getRouterAddress();
        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, 400, 400);

        // Tax
        minimumTimeBetweenSwaps = 30 seconds;
        minimumTokensBeforeSwap = 10000 * 10 ** decimals;
        excludedFromTax[address(taxDistributor)] = true;
        taxDistributor.createWalletTax("Insight", 158, 158, 0xf5157FB14Aa7Bf18329bbF6853B6b3cd9B8b4E46, true);
        taxDistributor.createWalletTax("Marketing", 158, 158, 0xAd626D137B377906843714303593F040175c0522, true);
        taxDistributor.createWalletTax("Dev", 80, 80, 0xDDE6D88587469f95d43E97C3f48495D8869c5b3b, true);
        taxDistributor.createWalletTax("Neuroni", 4, 4, 0xA281151C22a70d6743F5b31Bc4E3958ce3681985, true);
        autoSwapTax = true;

        // Max Hold
        mhAmount = 100_000 * 10 ** decimals;

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


    // Overrides

    function configure(address _owner) internal override(FixedTaxable, Burnable, BaseErc20) {
        super.configure(_owner);
    }
    
    function preTransfer(address from, address to, uint256 value) override(FixedTaxable, BaseErc20) internal {
        
        if (launched && 
            from != owner && to != owner && 
            from != deployer && to != deployer && 
            exchanges[to] == false && 
            to != address(taxDistributor)
        ) {
            require (_balances[to] + value <= mhAmount, "this is over the max hold amount");
        }
        
        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, Burnable, BaseErc20) internal {
        super.onOwnerChange(from, to);
        ableToBurn[deployer] = true;
    } 
} 

File 1 of 7: 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 7: 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;
    bool public launched;
    
    mapping (address => bool) public canAlwaysTrade;
    mapping (address => bool) public exchanges;
    
    event ConfigurationChanged(address indexed who, string option);

    modifier onlyOwner() {
        require(msg.sender == owner, "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 public 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 enabled) external onlyOwner {
        canAlwaysTrade[who] = enabled;
        emit ConfigurationChanged(msg.sender, "change to can always trade list");
    }
    
    function setExchange(address who, bool isExchange) external onlyOwner {
        exchanges[who] = isExchange;
        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 7: Burnable.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

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

abstract contract Burnable is BaseErc20, IBurnable {
    
    mapping (address => bool) public ableToBurn;

    modifier onlyBurner() {
        require(ableToBurn[msg.sender], "no burn permissions");
        _;
    }

    // Overrides
    
    function configure(address _owner) internal virtual override {
        ableToBurn[_owner] = true;
        super.configure(_owner);
    }
    
    function onOwnerChange(address from, address to) internal virtual override {
        ableToBurn[from] = false;
        ableToBurn[to] = true;
        super.onOwnerChange(from, to);
    }
    
    
    // Admin methods

    function setAbleToBurn(address who, bool enabled) external onlyOwner {
        ableToBurn[who] = enabled;
        emit ConfigurationChanged(msg.sender, "change to burners list");
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account.
     * @param value The amount that will be burnt.
     */
    function burn(uint256 value) external override onlyBurner {
        _burn(msg.sender, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account, deducting from the sender's allowance for said account. Uses the
     * internal burn function.
     * Emits an Approval event (reflecting the reduced allowance).
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function burnFrom(address account, uint256 value) external override onlyBurner {
        _allowed[account][msg.sender] = _allowed[account][msg.sender] - value;
        _burn(account, value);
        emit Approval(account, msg.sender, _allowed[account][msg.sender]);
    }


    // Private methods

    function _burn(address account, uint256 value) internal {
        require(account != address(0), "Cannot burn from null address");

        _totalSupply = _totalSupply - value;
        _balances[account] = _balances[account] - value;
        emit Transfer(account, address(0), value);
    }
}

File 4 of 7: 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;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        excludedFromTax[_owner] = 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);
            }
        }

        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 5 of 7: 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 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 6 of 7: 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 public tokenPair;
    address immutable public routerAddress;
    address immutable private _token;
    address immutable private _wbnb;

    IDEXRouter private _router;

    bool public override inSwap;
    uint256 public override lastSwapTime;

    uint256 immutable public maxSellTax;
    uint256 immutable public 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[] public 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 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":"","type":"address"}],"name":"ableToBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"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":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAlwaysTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAbleToBurn","outputs":[],"stateMutability":"nonpayable","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":"enabled","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExchange","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":[],"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"}]

60c06040523480156200001157600080fd5b506200003173307868f2f59239f43920d8a8868f67dde032bad5620006fe565b3360601b60a0526040805180820190915260068082526542455354414960d01b60209092019182526200006791600391620008a2565b5060408051808201909152600a808252694265737469616c20414960b01b60209092019182526200009b91600491620008a2565b506005805460ff191660121790556000620000b562000717565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f857600080fd5b505afa1580156200010d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000133919062000956565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200017157600080fd5b505afa15801562000186573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ac919062000956565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c6539690604401602060405180830381600087803b158015620001f857600080fd5b505af11580156200020d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000233919062000956565b6001600160a01b03811660009081526007602052604090819020805460ff1916600117905551909150849082908490610190908190620002739062000931565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f080158015620002be573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b0392909216919091179055601e600955600554620002f79060ff16600a620009ec565b620003059061271062000aad565b600a55600880546001600160a01b039081166000908152600b602052604090819020805460ff1916600190811790915592549051634693167f60e11b815260a06004820152600760a482015266125b9cda59da1d60ca1b60c4820152609e60248201819052604482015273f5157fb14aa7bf18329bbf6853b6b3cd9b8b4e46606482015260848101939093521690638d262cfe9060e401600060405180830381600087803b158015620003b757600080fd5b505af1158015620003cc573d6000803e3d6000fd5b5050600854604051634693167f60e11b815260a06004820152600960a4820152684d61726b6574696e6760b81b60c4820152609e60248201819052604482015273ad626d137b377906843714303593f040175c05226064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200045f57600080fd5b505af115801562000474573d6000803e3d6000fd5b5050600854604051634693167f60e11b815260a06004820152600360a4820152622232bb60e91b60c4820152605060248201819052604482015273dde6d88587469f95d43e97c3f48495d8869c5b3b6064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200050157600080fd5b505af115801562000516573d6000803e3d6000fd5b5050600854604051634693167f60e11b815260a0600480830191909152600760a4830152664e6575726f6e6960c81b60c483015260248201819052604482015273a281151c22a70d6743f5b31bc4e3958ce36819856064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b158015620005a957600080fd5b505af1158015620005be573d6000803e3d6000fd5b50506008805460ff60a01b1916600160a01b1790555050600554620005e89060ff16600a620009ec565b620005f790620186a062000aad565b6080526008546001600160a01b03908116600090815260016020908152604080832093881683529290522060001990556005546200063a9060ff16600a620009ec565b62000649906298968062000aad565b60025462000658919062000988565b600281905560055461010090046001600160a01b031660009081526020819052604090205462000689919062000988565b600580546001600160a01b03610100918290048116600090815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620006ec91815260200190565b60405180910390a35050505062000b22565b6200071481620007e560201b620017901760201c565b50565b60004660011480620007295750466003145b80620007355750466004145b80620007415750466005145b15620007605750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b46603814156200078357507310ed43c718714eb63d5aa57b78b54704e256024e90565b4660611415620007a6575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b6001600160a01b0381166000908152600d60209081526040909120805460ff1916600117905562000714908290620017b862000821821b17901c565b6001600160a01b0381166000908152600b60209081526040909120805460ff1916600117905562000714908290620017e06200085d821b17901c565b60058054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600660205260409020805460ff19166001179055565b828054620008b09062000acf565b90600052602060002090601f016020900481019282620008d457600085556200091f565b82601f10620008ef57805160ff19168380011785556200091f565b828001600101855582156200091f579182015b828111156200091f57825182559160200191906001019062000902565b506200092d9291506200093f565b5090565b6132b280620030c783390190565b5b808211156200092d576000815560010162000940565b6000602082840312156200096957600080fd5b81516001600160a01b03811681146200098157600080fd5b9392505050565b600082198211156200099e576200099e62000b0c565b500190565b600181815b80851115620009e4578160001904821115620009c857620009c862000b0c565b80851615620009d657918102915b93841c9390800290620009a8565b509250929050565b60006200098160ff84168360008262000a085750600162000aa7565b8162000a175750600062000aa7565b816001811462000a30576002811462000a3b5762000a5b565b600191505062000aa7565b60ff84111562000a4f5762000a4f62000b0c565b50506001821b62000aa7565b5060208310610133831016604e8410600b841016171562000a80575081810a62000aa7565b62000a8c8383620009a3565b806000190482111562000aa35762000aa362000b0c565b0290505b92915050565b600081600019048311821515161562000aca5762000aca62000b0c565b500290565b600181811c9082168062000ae457607f821691505b6020821081141562000b0657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805160a05160601c61256062000b67600039600081816107060152818161149201528181611b850152611bc30152600081816104a50152611c5701526125606000f3fe6080604052600436106102295760003560e01c80636b8f2f3b11610123578063a6f9dae1116100ab578063d2d7ad831161006f578063d2d7ad83146106be578063d31acb28146106d4578063d5f39488146106f4578063dba61c5814610728578063dd62ed3e1461073e57600080fd5b8063a6f9dae114610619578063a9059cbb14610639578063b0ad3ebf14610659578063c2ed286b14610689578063cc1776d3146106a957600080fd5b80638091f3bf116100f25780638091f3bf1461056e5780638da5cb5b1461058f57806395d89b41146105b4578063989763ef146105c9578063a457c2d7146105f957600080fd5b80636b8f2f3b146104c757806370a08231146104e85780637412dbb31461051e57806379cc67901461054e57600080fd5b8063313ce567116101b1578063442ef7d211610175578063442ef7d2146104295780634f7041a51461043e5780634f72e2a2146104535780634fbc2775146104735780636331bf651461049357600080fd5b8063313ce567146103785780633164df8b146103a45780633567f96c146103d457806339509351146103e957806342966c681461040957600080fd5b806318160ddd116101f857806318160ddd146102c757806318551108146102e65780631e19ae771461031857806323b872dd1461033857806328be90381461035857600080fd5b806301339c211461023557806306fdde031461024c578063095ea7b3146102775780630c89a0df146102a757600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a610784565b005b34801561025857600080fd5b50610261610877565b60405161026e919061235b565b60405180910390f35b34801561028357600080fd5b506102976102923660046122a3565b610905565b604051901515815260200161026e565b3480156102b357600080fd5b506102976102c23660046121db565b6109e4565b3480156102d357600080fd5b506002545b60405190815260200161026e565b3480156102f257600080fd5b506008546001600160a01b03165b6040516001600160a01b03909116815260200161026e565b34801561032457600080fd5b5061024a61033336600461226c565b610b26565b34801561034457600080fd5b50610297610353366004612230565b610bd0565b34801561036457600080fd5b5061024a61037336600461226c565b610ce6565b34801561038457600080fd5b506005546103929060ff1681565b60405160ff909116815260200161026e565b3480156103b057600080fd5b506102976103bf3660046121db565b600d6020526000908152604090205460ff1681565b3480156103e057600080fd5b5061024a610d8b565b3480156103f557600080fd5b506102976104043660046122a3565b610dda565b34801561041557600080fd5b5061024a610424366004612307565b610ed9565b34801561043557600080fd5b5061024a610f38565b34801561044a57600080fd5b506102d861100d565b34801561045f57600080fd5b5061024a61046e3660046122cd565b61108f565b34801561047f57600080fd5b5061024a61048e36600461226c565b611128565b34801561049f57600080fd5b506102d87f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d357600080fd5b5060085461029790600160a01b900460ff1681565b3480156104f457600080fd5b506102d86105033660046121db565b6001600160a01b031660009081526020819052604090205490565b34801561052a57600080fd5b506102976105393660046121db565b60076020526000908152604090205460ff1681565b34801561055a57600080fd5b5061024a6105693660046122a3565b6111cd565b34801561057a57600080fd5b5060055461029790600160a81b900460ff1681565b34801561059b57600080fd5b506005546103009061010090046001600160a01b031681565b3480156105c057600080fd5b506102616112cc565b3480156105d557600080fd5b506102976105e43660046121db565b600b6020526000908152604090205460ff1681565b34801561060557600080fd5b506102976106143660046122a3565b6112d9565b34801561062557600080fd5b5061024a6106343660046121db565b611393565b34801561064557600080fd5b506102976106543660046122a3565b611525565b34801561066557600080fd5b506102976106743660046121db565b60066020526000908152604090205460ff1681565b34801561069557600080fd5b5061024a6106a436600461226c565b61159f565b3480156106b557600080fd5b506102d86116c2565b3480156106ca57600080fd5b506102d8600a5481565b3480156106e057600080fd5b5061024a6106ef366004612339565b611707565b34801561070057600080fd5b506103007f000000000000000000000000000000000000000000000000000000000000000081565b34801561073457600080fd5b506102d860095481565b34801561074a57600080fd5b506102d86107593660046121fd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60055461010090046001600160a01b031633146107bc5760405162461bcd60e51b81526004016107b390612414565b60405180910390fd5b600554600160a81b900460ff16156108165760405162461bcd60e51b815260206004820152601960248201527f636f6e747261637420616c7265616479206c61756e636865640000000000000060448201526064016107b3565b6005805460ff60a81b1916600160a81b17905560405133906000805160206124eb8339815191529061086d9060208082526011908201527018dbdb9d1c9858dd081b185d5b98da1959607a1b604082015260600190565b60405180910390a2565b600480546108849061248b565b80601f01602080910402602001604051908101604052809291908181526020018280546108b09061248b565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b505050505081565b6005546000903390600160a81b900460ff168061093457506005546001600160a01b0382811661010090920416145b8061094e57503360009081526006602052604090205460ff165b61096a5760405162461bcd60e51b81526004016107b3906123e7565b6001600160a01b0384166109905760405162461bcd60e51b81526004016107b3906123b0565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061250b83398151915291015b60405180910390a35060019392505050565b60055460009061010090046001600160a01b03163314610a165760405162461bcd60e51b81526004016107b390612414565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015610a5857600080fd5b505afa158015610a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a909190612320565b60055460405163a9059cbb60e01b81526001600160a01b03610100909204821660048201526024810183905291925084169063a9059cbb90604401602060405180830381600087803b158015610ae557600080fd5b505af1158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d91906122ea565b9150505b919050565b60055461010090046001600160a01b03163314610b555760405162461bcd60e51b81526004016107b390612414565b6001600160a01b0382166000908152600d602052604090819020805483151560ff199091161790555133906000805160206124eb83398151915290610bc49060208082526016908201527518da185b99d9481d1bc8189d5c9b995c9cc81b1a5cdd60521b604082015260600190565b60405180910390a25050565b6005546000908490600160a81b900460ff1680610bff57506005546001600160a01b0382811661010090920416145b80610c1957503360009081526006602052604090205460ff165b610c355760405162461bcd60e51b81526004016107b3906123e7565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610c64908490612474565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610c93858585611825565b6001600160a01b0385166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061250b833981519152910160405180910390a3506001949350505050565b60055461010090046001600160a01b03163314610d155760405162461bcd60e51b81526004016107b390612414565b6001600160a01b03821660009081526007602052604090819020805483151560ff199091161790555133906000805160206124eb83398151915290610bc49060208082526017908201527f6368616e676520746f2065786368616e6765206c697374000000000000000000604082015260600190565b60055461010090046001600160a01b03163314610dba5760405162461bcd60e51b81526004016107b390612414565b6005544790610dd79061010090046001600160a01b03168261193c565b50565b6005546000903390600160a81b900460ff1680610e0957506005546001600160a01b0382811661010090920416145b80610e2357503360009081526006602052604090205460ff165b610e3f5760405162461bcd60e51b81526004016107b3906123e7565b6001600160a01b038416610e655760405162461bcd60e51b81526004016107b3906123b0565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610e9490849061245c565b3360008181526001602090815260408083206001600160a01b038a168085529083529281902085905551938452909260008051602061250b83398151915291016109d2565b336000908152600d602052604090205460ff16610f2e5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b60448201526064016107b3565b610dd73382611a5a565b600554600160a81b900460ff16610fa35760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b60648201526084016107b3565b600860009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ff357600080fd5b505af1158015611007573d6000803e3d6000fd5b50505050565b60085460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b15801561105257600080fd5b505afa158015611066573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108a9190612320565b905090565b60055461010090046001600160a01b031633146110be5760405162461bcd60e51b81526004016107b390612414565b60088054821515600160a01b0260ff60a01b1990911617905560405133906000805160206124eb8339815191529061111d9060208082526013908201527206368616e676520746f206175746f207377617606c1b604082015260600190565b60405180910390a250565b60055461010090046001600160a01b031633146111575760405162461bcd60e51b81526004016107b390612414565b6001600160a01b03821660009081526006602052604090819020805483151560ff199091161790555133906000805160206124eb83398151915290610bc4906020808252601f908201527f6368616e676520746f2063616e20616c77617973207472616465206c69737400604082015260600190565b336000908152600d602052604090205460ff166112225760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b60448201526064016107b3565b6001600160a01b0382166000908152600160209081526040808320338452909152902054611251908290612474565b6001600160a01b038316600090815260016020908152604080832033845290915290205561127f8282611a5a565b6001600160a01b0382166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061250b83398151915291015b60405180910390a35050565b600380546108849061248b565b6005546000903390600160a81b900460ff168061130857506005546001600160a01b0382811661010090920416145b8061132257503360009081526006602052604090205460ff165b61133e5760405162461bcd60e51b81526004016107b3906123e7565b6001600160a01b0384166113645760405162461bcd60e51b81526004016107b3906123b0565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610e94908490612474565b60055461010090046001600160a01b031633146113c25760405162461bcd60e51b81526004016107b390612414565b6001600160a01b0381166114115760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b60448201526064016107b3565b6005546001600160a01b0361010090910481166000818152600d60208181526040808420805460ff19908116909155878716808652828620805483166001908117909155878752600b8552838720805484169055818752838720805484168217905596865260068452828620805483169055855281852080548216871790557f0000000000000000000000000000000000000000000000000000000000000000909616845291905290208054909216179055600580546001600160a01b03831661010002610100600160a81b031990911617905560405133906000805160206124eb8339815191529061111d906020808252600d908201526c1bdddb995c8818da185b99d959609a1b604082015260600190565b6005546000903390600160a81b900460ff168061155457506005546001600160a01b0382811661010090920416145b8061156e57503360009081526006602052604090205460ff165b61158a5760405162461bcd60e51b81526004016107b3906123e7565b611595338585611825565b5060019392505050565b60055461010090046001600160a01b031633146115ce5760405162461bcd60e51b81526004016107b390612414565b6001600160a01b03821660009081526007602052604090205460ff1615806115f4575080155b61164c5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b60648201526084016107b3565b6001600160a01b0382166000908152600b602052604090819020805483151560ff199091161790555133906000805160206124eb83398151915290610bc4906020808252601c908201527f6368616e676520746f20746178206578636c7573696f6e206c69737400000000604082015260600190565b6008546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b15801561105257600080fd5b60055461010090046001600160a01b031633146117365760405162461bcd60e51b81526004016107b390612414565b600a829055600981905560405133906000805160206124eb83398151915290610bc4906020808252601e908201527f6368616e676520746f206175746f2073776170207468726573686f6c64730000604082015260600190565b6001600160a01b0381166000908152600d60205260409020805460ff19166001179055610dd7815b6001600160a01b0381166000908152600b60205260409020805460ff19166001179055610dd7815b60058054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600660205260409020805460ff19166001179055565b6001600160a01b0382166118745760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b60448201526064016107b3565b61187f838383611b31565b600061188c848484611cdb565b6001600160a01b0385166000908152602081905260409020549091506118b3908390612474565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546118e390829061245c565b6001600160a01b038481166000818152602081815260409182902094909455518481529092918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611007565b8047101561198c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107b3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146119d9576040519150601f19603f3d011682016040523d82523d6000602084013e6119de565b606091505b5050905080611a555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107b3565b505050565b6001600160a01b038216611ab05760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206275726e2066726f6d206e756c6c206164647265737300000060448201526064016107b3565b80600254611abe9190612474565b6002556001600160a01b038216600090815260208190526040902054611ae5908290612474565b6001600160a01b03831660008181526020818152604080832094909455925184815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016112c0565b600554600160a81b900460ff168015611b5d57506005546001600160a01b038481166101009092041614155b8015611b7c57506005546001600160a01b038381166101009092041614155b8015611bba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b8015611bf857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015611c1d57506001600160a01b03821660009081526007602052604090205460ff16155b8015611c3757506008546001600160a01b03838116911614155b15611cd0576001600160a01b0382166000908152602081905260409020547f000000000000000000000000000000000000000000000000000000000000000090611c8290839061245c565b1115611cd05760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e7460448201526064016107b3565b611a55838383611cf0565b6000611ce8848484611f06565b949350505050565b60085460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b158015611d3557600080fd5b505afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d9190612320565b611d779042612474565b600554909150600160a81b900460ff168015611d9c5750600854600160a01b900460ff165b8015611dc057506001600160a01b03831660009081526007602052604090205460ff165b8015611dda575042600c54603c611dd7919061245c565b11155b8015611de857506009548110155b8015611e105750600a546008546001600160a01b031660009081526020819052604090205410155b8015611e9f5750600860009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b158015611e6557600080fd5b505afa158015611e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9d91906122ea565b155b15611f015742600c556008546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b158015611eee57600080fd5b505af1925050508015611eff575060015b505b611007565b6001600160a01b0383166000908152600b6020526040812054829060ff16158015611f4a57506001600160a01b0384166000908152600b602052604090205460ff16155b8015611f5f5750600554600160a81b900460ff165b156120ac576001600160a01b03851660009081526007602052604090205460ff161561200a5760085460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b158015611fcb57600080fd5b505af1158015611fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120039190612320565b90506120ac565b6001600160a01b03841660009081526007602052604090205460ff16156120ac57600854604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b15801561207157600080fd5b505af1158015612085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a99190612320565b90505b60006120b88285612474565b90508015612144576008546001600160a01b03166000908152602081905260409020546120e690829061245c565b600880546001600160a01b0390811660009081526020818152604091829020949094559154915184815291811692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b61214f868684612159565b9695505050505050565b6000826001600160a01b0316846001600160a01b031614156121bd5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c660060448201526064016107b3565b5092915050565b80356001600160a01b0381168114610b2157600080fd5b6000602082840312156121ed57600080fd5b6121f6826121c4565b9392505050565b6000806040838503121561221057600080fd5b612219836121c4565b9150612227602084016121c4565b90509250929050565b60008060006060848603121561224557600080fd5b61224e846121c4565b925061225c602085016121c4565b9150604084013590509250925092565b6000806040838503121561227f57600080fd5b612288836121c4565b91506020830135612298816124dc565b809150509250929050565b600080604083850312156122b657600080fd5b6122bf836121c4565b946020939093013593505050565b6000602082840312156122df57600080fd5b81356121f6816124dc565b6000602082840312156122fc57600080fd5b81516121f6816124dc565b60006020828403121561231957600080fd5b5035919050565b60006020828403121561233257600080fd5b5051919050565b6000806040838503121561234c57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b818110156123885785810183015185820160400152820161236c565b8181111561239a576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b6000821982111561246f5761246f6124c6565b500190565b600082821015612486576124866124c6565b500390565b600181811c9082168061249f57607f821691505b602082108114156124c057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8015158114610dd757600080fdfed43eee071b91e7714b533dbf825ec024145ba03675691f363d9a4c47e88b4dc58c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212208061640d7c033bc00ab355b8a21e43e40efa380add9f37a38d5b5d32d2d91c1064736f6c634300080700336101406040523480156200001257600080fd5b50604051620032b2380380620032b28339810160408190526200003591620001b5565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b33606090811b60c0526001600160601b031993811b841660e052600080546001600160a01b0388166001600160a01b0319909116179055610100929092526101205291821b811660805291901b1660a05262000212565b80516001600160a01b0381168114620001b057600080fd5b919050565b600080600080600060a08688031215620001ce57600080fd5b620001d98662000198565b9450620001e96020870162000198565b9350620001f96040870162000198565b6060870151608090970151959894975095949392505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005161012051612fb1620003016000396000818161032a01526105930152600081816102ad0152610cb00152600061114a01526000818161042401528181610618015281816107bc0152818161085c0152818161090601528181610a2d01528181610bea01528181610ce201528181610d8c01528181610f1a01528181611037015281816110f60152818161119601528181611a8701528181611d2501528181611e7201528181611fed015281816120b80152818161221001526123ad015260006101e1015260006103d70152612fb16000f3fe6080604052600436106101235760003560e01c8063a411209a116100a0578063db017dc711610064578063db017dc71461037d578063e4fc6b6d1461039d578063ed4ce99e146103a5578063ee16c160146103c5578063fb5a780c146103f957600080fd5b8063a411209a1461029b578063b0bc85de146102cf578063c5be2bc7146102e4578063c8e956ab14610318578063d83067861461034c57600080fd5b80633268cc56116100e75780633268cc56146101cf5780634fa26fd51461021b578063583dd79d1461023b5780636508c57e1461025b5780638d262cfe1461027b57600080fd5b806307a1cfbd1461012f5780630dd8715714610151578063135b4fc01461017a578063252d723a1461019a5780632b1fb89e146101af57600080fd5b3661012a57005b600080fd5b34801561013b57600080fd5b5061014f61014a366004612a5f565b610419565b005b34801561015d57600080fd5b5061016760015481565b6040519081526020015b60405180910390f35b34801561018657600080fd5b5061014f610195366004612b53565b61060d565b3480156101a657600080fd5b506101676107af565b3480156101bb57600080fd5b5061014f6101ca366004612b53565b610851565b3480156101db57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b34801561022757600080fd5b50610167610236366004612bc9565b6108f9565b34801561024757600080fd5b5061014f610256366004612a11565b610a22565b34801561026757600080fd5b5061014f610276366004612a5f565b610bdf565b34801561028757600080fd5b5061014f610296366004612b53565b610cd7565b3480156102a757600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b3480156102db57600080fd5b50610167610d7f565b3480156102f057600080fd5b506103046102ff366004612bc9565b610e1b565b604051610171989796959493929190612c45565b34801561032457600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b5060005461036d90600160a01b900460ff1681565b6040519015158152602001610171565b34801561038957600080fd5b50610167610398366004612bc9565b610f0d565b61014f61102c565b3480156103b157600080fd5b5061014f6103c0366004612af2565b612205565b3480156103d157600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561040557600080fd5b5061014f610414366004612aa4565b6123a2565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461046a5760405162461bcd60e51b815260040161046190612d52565b60405180910390fd5b6000805b6002548110156105735761052e6002828154811061048e5761048e612f3e565b906000526020600020906007020160000180546104aa90612ebc565b80601f01602080910402602001604051908101604052809291908181526020018280546104d690612ebc565b80156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b505050505085612531565b1561056157826002828154811061054757610547612f3e565b906000526020600020906007020160010181905550600191505b8061056b81612ef7565b91505061046e565b50806105915760405162461bcd60e51b815260040161046190612d1b565b7f00000000000000000000000000000000000000000000000000000000000000006105ba6107af565b11156106085760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610461565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106555760405162461bcd60e51b815260040161046190612d52565b61065e8561258b565b1561067b5760405162461bcd60e51b815260040161046190612ce4565b600260405180610100016040528087815260200186815260200185815260200160008152602001600360048111156106b5576106b5612f28565b81526001600160a01b038516602080830191909152600060408301819052851515606090930192909252835460018101855593825290819020825180519394600702909101926107089284920190612827565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561075157610751612f28565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107f95760405162461bcd60e51b815260040161046190612d52565b6000805b60025481101561084b576002818154811061081a5761081a612f3e565b906000526020600020906007020160010154826108379190612e1c565b91508061084381612ef7565b9150506107fd565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108995760405162461bcd60e51b815260040161046190612d52565b6108a28561258b565b156108bf5760405162461bcd60e51b815260040161046190612ce4565b600260405180610100016040528087815260200186815260200185815260200160008152602001600160048111156106b5576106b5612f28565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109435760405162461bcd60e51b815260040161046190612d52565b60005b600254811015610a185760006002828154811061096557610965612f3e565b9060005260206000209060070201600201541115610a065760006127106002838154811061099557610995612f3e565b906000526020600020906007020160020154856109b29190612e56565b6109bc9190612e34565b905080600283815481106109d2576109d2612f3e565b906000526020600020906007020160030160008282546109f29190612e1c565b90915550610a0290508185612e75565b9350505b80610a1081612ef7565b915050610946565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a6a5760405162461bcd60e51b815260040161046190612d52565b6000805b600254811015610bc157600060028281548110610a8d57610a8d612f3e565b60009182526020909120600460079092020181015460ff1690811115610ab557610ab5612f28565b1480610afa57506002808281548110610ad057610ad0612f3e565b60009182526020909120600460079092020181015460ff1690811115610af857610af8612f28565b145b80610b3f5750600360028281548110610b1557610b15612f3e565b60009182526020909120600460079092020181015460ff1690811115610b3d57610b3d612f28565b145b8015610b5c5750610b5c6002828154811061048e5761048e612f3e565b15610baf578260028281548110610b7557610b75612f3e565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610bb981612ef7565b915050610a6e565b50806106085760405162461bcd60e51b815260040161046190612d1b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c275760405162461bcd60e51b815260040161046190612d52565b6000805b600254811015610c9057610c4b6002828154811061048e5761048e612f3e565b15610c7e578260028281548110610c6457610c64612f3e565b906000526020600020906007020160020181905550600191505b80610c8881612ef7565b915050610c2b565b5080610cae5760405162461bcd60e51b815260040161046190612d1b565b7f00000000000000000000000000000000000000000000000000000000000000006105ba610d7f565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d1f5760405162461bcd60e51b815260040161046190612d52565b610d288561258b565b15610d455760405162461bcd60e51b815260040161046190612ce4565b600260405180610100016040528087815260200186815260200185815260200160008152602001600060048111156106b5576106b5612f28565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dc95760405162461bcd60e51b815260040161046190612d52565b6000805b60025481101561084b5760028181548110610dea57610dea612f3e565b90600052602060002090600702016002015482610e079190612e1c565b915080610e1381612ef7565b915050610dcd565b60028181548110610e2b57600080fd5b9060005260206000209060070201600091509050806000018054610e4e90612ebc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7a90612ebc565b8015610ec75780601f10610e9c57610100808354040283529160200191610ec7565b820191906000526020600020905b815481529060010190602001808311610eaa57829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f575760405162461bcd60e51b815260040161046190612d52565b60005b600254811015610a1857600060028281548110610f7957610f79612f3e565b906000526020600020906007020160010154111561101a57600061271060028381548110610fa957610fa9612f3e565b90600052602060002090600702016001015485610fc69190612e56565b610fd09190612e34565b90508060028381548110610fe657610fe6612f3e565b906000526020600020906007020160030160008282546110069190612e1c565b9091555061101690508185612e75565b9350505b8061102481612ef7565b915050610f5a565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110745760405162461bcd60e51b815260040161046190612d52565b600054600160a01b900460ff16156110c15760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b6044820152606401610461565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061112857611128612f3e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061117c5761117c612f3e565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000006000805b6002548110156112ef5760028082815481106111d7576111d7612f3e565b60009182526020909120600460079092020181015460ff16908111156111ff576111ff612f28565b141561127b576000600280838154811061121b5761121b612f3e565b9060005260206000209060070201600301546112379190612e34565b9050806002838154811061124d5761124d612f3e565b9060005260206000209060070201600301546112699190612e75565b6112739084612e1c565b9250506112dd565b6002818154811061128e5761128e612f3e565b600091825260209091206006600790920201015460ff16156112dd57600281815481106112bd576112bd612f3e565b906000526020600020906007020160030154826112da9190612e1c565b91505b806112e781612ef7565b9150506111b9565b506112fa8282612678565b60008054919250906001600160a01b03166318cbafe5838387306113204261012c612e1c565b6040518663ffffffff1660e01b8152600401611340959493929190612d7a565b600060405180830381600087803b15801561135a57600080fd5b505af115801561136e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113969190810190612947565b90506000479050816000815181106113b0576113b0612f3e565b6020026020010151831415806113e05750816001815181106113d4576113d4612f3e565b60200260200101518114155b1561145b577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516114529060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b6002548110156116a1576002818154811061147c5761147c612f3e565b600091825260209091206006600790920201015460ff16806114d7575060028082815481106114ad576114ad612f3e565b60009182526020909120600460079092020181015460ff16908111156114d5576114d5612f28565b145b1561168f576002546114eb90600190612e75565b81141561152057816002828154811061150657611506612f3e565b90600052602060002090600702016005018190555061168f565b600280828154811061153457611534612f3e565b60009182526020909120600460079092020181015460ff169081111561155c5761155c612f28565b141561161a576000600280838154811061157857611578612f3e565b9060005260206000209060070201600301546115949190612e34565b905060008682600285815481106115ad576115ad612f3e565b9060005260206000209060070201600301546115c99190612e75565b6115d39087612e56565b6115dd9190612e34565b905080600284815481106115f3576115f3612f3e565b60009182526020909120600560079092020101556116118185612e75565b9350505061168f565b6000856002838154811061163057611630612f3e565b9060005260206000209060070201600301548561164d9190612e56565b6116579190612e34565b9050806002838154811061166d5761166d612f3e565b600091825260209091206005600790920201015561168b8184612e75565b9250505b8061169981612ef7565b91505061145f565b5060005b600254811015611fe1576000600282815481106116c4576116c4612f3e565b60009182526020909120600460079092020181015460ff16908111156116ec576116ec612f28565b14156118ca576002818154811061170557611705612f3e565b600091825260209091206006600790920201015460ff161561178b576117866002828154811061173757611737612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002838154811061176f5761176f612f3e565b90600052602060002090600702016005015461270e565b611f7c565b856001600160a01b031663a9059cbb600283815481106117ad576117ad612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b031661180089600286815481106117e9576117e9612f3e565b906000526020600020906007020160030154612678565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561184657600080fd5b505af115801561185a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187e91906129f4565b6117865760405162461bcd60e51b815260206004820152601960248201527f636f756c64206e6f74207472616e7366657220746f6b656e73000000000000006044820152606401610461565b6003600282815481106118df576118df612f3e565b60009182526020909120600460079092020181015460ff169081111561190757611907612f28565b1415611b2b576002818154811061192057611920612f3e565b600091825260209091206006600790920201015460ff1615611952576117866002828154811061173757611737612f3e565b856001600160a01b031663095ea7b36002838154811061197457611974612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b0316600284815481106119ac576119ac612f3e565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611a0657600080fd5b505af1158015611a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3e91906129f4565b5060028181548110611a5257611a52612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611abe8a600287815481106117e9576117e9612f3e565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611b0e57600080fd5b505af1158015611b22573d6000803e3d6000fd5b50505050611f7c565b600160028281548110611b4057611b40612f3e565b60009182526020909120600460079092020181015460ff1690811115611b6857611b68612f28565b1415611ce05760028181548110611b8157611b81612f3e565b600091825260209091206006600790920201015460ff1615611c515760028181548110611bb057611bb0612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660028381548110611bf657611bf6612f3e565b9060005260206000209060070201600501546040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c3357600080fd5b505af1158015611c47573d6000803e3d6000fd5b5050505050611f7c565b60028181548110611c6457611c64612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611caf89600286815481106117e9576117e9612f3e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611af4565b600460028281548110611cf557611cf5612f3e565b60009182526020909120600460079092020181015460ff1690811115611d1d57611d1d612f28565b1415611d87577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611d6988600285815481106117e9576117e9612f3e565b6040518263ffffffff1660e01b8152600401611af491815260200190565b6002808281548110611d9b57611d9b612f3e565b60009182526020909120600460079092020181015460ff1690811115611dc357611dc3612f28565b1415611f7c57600060028281548110611dde57611dde612f3e565b9060005260206000209060070201600501541115611f7c576000611e31876002808581548110611e1057611e10612f3e565b906000526020600020906007020160030154611e2c9190612e34565b612678565b600054600280549293506001600160a01b039091169163f305d719919085908110611e5e57611e5e612f3e565b9060005260206000209060070201600501547f00000000000000000000000000000000000000000000000000000000000000008460008060028981548110611ea857611ea8612f3e565b600091825260209091206007909102016004015461010090046001600160a01b0316611ed64261012c612e1c565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b158015611f3e57600080fd5b505af1158015611f52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f779190612bfb565b505050505b600060028281548110611f9157611f91612f3e565b906000526020600020906007020160030181905550600060028281548110611fbb57611fbb612f3e565b600091825260209091206005600790920201015580611fd981612ef7565b9150506116a5565b504715612012576120127f00000000000000000000000000000000000000000000000000000000000000004761270e565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b15801561205457600080fd5b505afa158015612068573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208c9190612be2565b11156121b3576040516370a0823160e01b81523060048201526001600160a01b0386169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a082319060240160206040518083038186803b1580156120fb57600080fd5b505afa15801561210f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121339190612be2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561217957600080fd5b505af115801561218d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b191906129f4565b505b60408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a150504260015550506000805460ff60a01b191690555050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461224d5760405162461bcd60e51b815260040161046190612d52565b6122568461258b565b156122735760405162461bcd60e51b815260040161046190612ce4565b600260405180610100016040528086815260200185815260200184815260200160008152602001600260048111156122ad576122ad612f28565b81526001600160a01b0384166020808301919091526000604083018190526060909201829052835460018101855593825290819020825180519394600702909101926122fc9284920190612827565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561234557612345612f28565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123ea5760405162461bcd60e51b815260040161046190612d52565b6123f38361258b565b156124105760405162461bcd60e51b815260040161046190612ce4565b60026040518061010001604052808581526020018481526020018381526020016000815260200160048081111561244957612449612f28565b81526000602080830182905260408301829052606090920181905283546001810185559381528190208251805193946007029091019261248c9284920190612827565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156124d5576124d5612f28565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b6000816040516020016125449190612c29565b604051602081830303815290604052805190602001208360405160200161256b9190612c29565b604051602081830303815290604052805190602001201490505b92915050565b6000805b60025481101561266f5761264f600282815481106125af576125af612f3e565b906000526020600020906007020160000180546125cb90612ebc565b80601f01602080910402602001604051908101604052809291908181526020018280546125f790612ebc565b80156126445780601f1061261957610100808354040283529160200191612644565b820191906000526020600020905b81548152906001019060200180831161262757829003601f168201915b505050505084612531565b1561265d5750600192915050565b8061266781612ef7565b91505061258f565b50600092915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b1580156126bc57600080fd5b505afa1580156126d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f49190612be2565b9050828111156127075782915050612585565b9392505050565b8047101561275e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610461565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146127ab576040519150601f19603f3d011682016040523d82523d6000602084013e6127b0565b606091505b50509050806106085760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610461565b82805461283390612ebc565b90600052602060002090601f016020900481019282612855576000855561289b565b82601f1061286e57805160ff191683800117855561289b565b8280016001018555821561289b579182015b8281111561289b578251825591602001919060010190612880565b506128a79291506128ab565b5090565b5b808211156128a757600081556001016128ac565b80356001600160a01b0381168114610a1d57600080fd5b600082601f8301126128e857600080fd5b813567ffffffffffffffff81111561290257612902612f54565b612915601f8201601f1916602001612deb565b81815284602083860101111561292a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561295a57600080fd5b825167ffffffffffffffff8082111561297257600080fd5b818501915085601f83011261298657600080fd5b81518181111561299857612998612f54565b8060051b91506129a9848301612deb565b8181528481019084860184860187018a10156129c457600080fd5b600095505b838610156129e75780518352600195909501949186019186016129c9565b5098975050505050505050565b600060208284031215612a0657600080fd5b815161270781612f6a565b60008060408385031215612a2457600080fd5b823567ffffffffffffffff811115612a3b57600080fd5b612a47858286016128d7565b925050612a56602084016128c0565b90509250929050565b60008060408385031215612a7257600080fd5b823567ffffffffffffffff811115612a8957600080fd5b612a95858286016128d7565b95602094909401359450505050565b600080600060608486031215612ab957600080fd5b833567ffffffffffffffff811115612ad057600080fd5b612adc868287016128d7565b9660208601359650604090950135949350505050565b60008060008060808587031215612b0857600080fd5b843567ffffffffffffffff811115612b1f57600080fd5b612b2b878288016128d7565b9450506020850135925060408501359150612b48606086016128c0565b905092959194509250565b600080600080600060a08688031215612b6b57600080fd5b853567ffffffffffffffff811115612b8257600080fd5b612b8e888289016128d7565b9550506020860135935060408601359250612bab606087016128c0565b91506080860135612bbb81612f6a565b809150509295509295909350565b600060208284031215612bdb57600080fd5b5035919050565b600060208284031215612bf457600080fd5b5051919050565b600080600060608486031215612c1057600080fd5b8351925060208401519150604084015190509250925092565b60008251612c3b818460208701612e8c565b9190910192915050565b60006101008083528a5180828501526101209150612c698183860160208f01612e8c565b602084018b9052604084018a905260608401899052601f01601f1916830101905060058610612ca857634e487b7160e01b600052602160045260246000fd5b856080830152612cc360a08301866001600160a01b03169052565b8360c0830152612cd760e083018415159052565b9998505050505050505050565b60208082526017908201527f546869732074617820616c726561647920657869737473000000000000000000604082015260600190565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612dca5784516001600160a01b031683529383019391830191600101612da5565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e1457612e14612f54565b604052919050565b60008219821115612e2f57612e2f612f12565b500190565b600082612e5157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612e7057612e70612f12565b500290565b600082821015612e8757612e87612f12565b500390565b60005b83811015612ea7578181015183820152602001612e8f565b83811115612eb6576000848401525b50505050565b600181811c90821680612ed057607f821691505b60208210811415612ef157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f0b57612f0b612f12565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612f7857600080fd5b5056fea26469706673582212207b879f4c5c1e6b48e23d43772037ccaf290458485917adac09c58e8c4e9ad81d64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102295760003560e01c80636b8f2f3b11610123578063a6f9dae1116100ab578063d2d7ad831161006f578063d2d7ad83146106be578063d31acb28146106d4578063d5f39488146106f4578063dba61c5814610728578063dd62ed3e1461073e57600080fd5b8063a6f9dae114610619578063a9059cbb14610639578063b0ad3ebf14610659578063c2ed286b14610689578063cc1776d3146106a957600080fd5b80638091f3bf116100f25780638091f3bf1461056e5780638da5cb5b1461058f57806395d89b41146105b4578063989763ef146105c9578063a457c2d7146105f957600080fd5b80636b8f2f3b146104c757806370a08231146104e85780637412dbb31461051e57806379cc67901461054e57600080fd5b8063313ce567116101b1578063442ef7d211610175578063442ef7d2146104295780634f7041a51461043e5780634f72e2a2146104535780634fbc2775146104735780636331bf651461049357600080fd5b8063313ce567146103785780633164df8b146103a45780633567f96c146103d457806339509351146103e957806342966c681461040957600080fd5b806318160ddd116101f857806318160ddd146102c757806318551108146102e65780631e19ae771461031857806323b872dd1461033857806328be90381461035857600080fd5b806301339c211461023557806306fdde031461024c578063095ea7b3146102775780630c89a0df146102a757600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a610784565b005b34801561025857600080fd5b50610261610877565b60405161026e919061235b565b60405180910390f35b34801561028357600080fd5b506102976102923660046122a3565b610905565b604051901515815260200161026e565b3480156102b357600080fd5b506102976102c23660046121db565b6109e4565b3480156102d357600080fd5b506002545b60405190815260200161026e565b3480156102f257600080fd5b506008546001600160a01b03165b6040516001600160a01b03909116815260200161026e565b34801561032457600080fd5b5061024a61033336600461226c565b610b26565b34801561034457600080fd5b50610297610353366004612230565b610bd0565b34801561036457600080fd5b5061024a61037336600461226c565b610ce6565b34801561038457600080fd5b506005546103929060ff1681565b60405160ff909116815260200161026e565b3480156103b057600080fd5b506102976103bf3660046121db565b600d6020526000908152604090205460ff1681565b3480156103e057600080fd5b5061024a610d8b565b3480156103f557600080fd5b506102976104043660046122a3565b610dda565b34801561041557600080fd5b5061024a610424366004612307565b610ed9565b34801561043557600080fd5b5061024a610f38565b34801561044a57600080fd5b506102d861100d565b34801561045f57600080fd5b5061024a61046e3660046122cd565b61108f565b34801561047f57600080fd5b5061024a61048e36600461226c565b611128565b34801561049f57600080fd5b506102d87f00000000000000000000000000000000000000000000152d02c7e14af680000081565b3480156104d357600080fd5b5060085461029790600160a01b900460ff1681565b3480156104f457600080fd5b506102d86105033660046121db565b6001600160a01b031660009081526020819052604090205490565b34801561052a57600080fd5b506102976105393660046121db565b60076020526000908152604090205460ff1681565b34801561055a57600080fd5b5061024a6105693660046122a3565b6111cd565b34801561057a57600080fd5b5060055461029790600160a81b900460ff1681565b34801561059b57600080fd5b506005546103009061010090046001600160a01b031681565b3480156105c057600080fd5b506102616112cc565b3480156105d557600080fd5b506102976105e43660046121db565b600b6020526000908152604090205460ff1681565b34801561060557600080fd5b506102976106143660046122a3565b6112d9565b34801561062557600080fd5b5061024a6106343660046121db565b611393565b34801561064557600080fd5b506102976106543660046122a3565b611525565b34801561066557600080fd5b506102976106743660046121db565b60066020526000908152604090205460ff1681565b34801561069557600080fd5b5061024a6106a436600461226c565b61159f565b3480156106b557600080fd5b506102d86116c2565b3480156106ca57600080fd5b506102d8600a5481565b3480156106e057600080fd5b5061024a6106ef366004612339565b611707565b34801561070057600080fd5b506103007f000000000000000000000000307868f2f59239f43920d8a8868f67dde032bad581565b34801561073457600080fd5b506102d860095481565b34801561074a57600080fd5b506102d86107593660046121fd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60055461010090046001600160a01b031633146107bc5760405162461bcd60e51b81526004016107b390612414565b60405180910390fd5b600554600160a81b900460ff16156108165760405162461bcd60e51b815260206004820152601960248201527f636f6e747261637420616c7265616479206c61756e636865640000000000000060448201526064016107b3565b6005805460ff60a81b1916600160a81b17905560405133906000805160206124eb8339815191529061086d9060208082526011908201527018dbdb9d1c9858dd081b185d5b98da1959607a1b604082015260600190565b60405180910390a2565b600480546108849061248b565b80601f01602080910402602001604051908101604052809291908181526020018280546108b09061248b565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b505050505081565b6005546000903390600160a81b900460ff168061093457506005546001600160a01b0382811661010090920416145b8061094e57503360009081526006602052604090205460ff165b61096a5760405162461bcd60e51b81526004016107b3906123e7565b6001600160a01b0384166109905760405162461bcd60e51b81526004016107b3906123b0565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061250b83398151915291015b60405180910390a35060019392505050565b60055460009061010090046001600160a01b03163314610a165760405162461bcd60e51b81526004016107b390612414565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015610a5857600080fd5b505afa158015610a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a909190612320565b60055460405163a9059cbb60e01b81526001600160a01b03610100909204821660048201526024810183905291925084169063a9059cbb90604401602060405180830381600087803b158015610ae557600080fd5b505af1158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d91906122ea565b9150505b919050565b60055461010090046001600160a01b03163314610b555760405162461bcd60e51b81526004016107b390612414565b6001600160a01b0382166000908152600d602052604090819020805483151560ff199091161790555133906000805160206124eb83398151915290610bc49060208082526016908201527518da185b99d9481d1bc8189d5c9b995c9cc81b1a5cdd60521b604082015260600190565b60405180910390a25050565b6005546000908490600160a81b900460ff1680610bff57506005546001600160a01b0382811661010090920416145b80610c1957503360009081526006602052604090205460ff165b610c355760405162461bcd60e51b81526004016107b3906123e7565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610c64908490612474565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610c93858585611825565b6001600160a01b0385166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061250b833981519152910160405180910390a3506001949350505050565b60055461010090046001600160a01b03163314610d155760405162461bcd60e51b81526004016107b390612414565b6001600160a01b03821660009081526007602052604090819020805483151560ff199091161790555133906000805160206124eb83398151915290610bc49060208082526017908201527f6368616e676520746f2065786368616e6765206c697374000000000000000000604082015260600190565b60055461010090046001600160a01b03163314610dba5760405162461bcd60e51b81526004016107b390612414565b6005544790610dd79061010090046001600160a01b03168261193c565b50565b6005546000903390600160a81b900460ff1680610e0957506005546001600160a01b0382811661010090920416145b80610e2357503360009081526006602052604090205460ff165b610e3f5760405162461bcd60e51b81526004016107b3906123e7565b6001600160a01b038416610e655760405162461bcd60e51b81526004016107b3906123b0565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610e9490849061245c565b3360008181526001602090815260408083206001600160a01b038a168085529083529281902085905551938452909260008051602061250b83398151915291016109d2565b336000908152600d602052604090205460ff16610f2e5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b60448201526064016107b3565b610dd73382611a5a565b600554600160a81b900460ff16610fa35760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b60648201526084016107b3565b600860009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ff357600080fd5b505af1158015611007573d6000803e3d6000fd5b50505050565b60085460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b15801561105257600080fd5b505afa158015611066573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108a9190612320565b905090565b60055461010090046001600160a01b031633146110be5760405162461bcd60e51b81526004016107b390612414565b60088054821515600160a01b0260ff60a01b1990911617905560405133906000805160206124eb8339815191529061111d9060208082526013908201527206368616e676520746f206175746f207377617606c1b604082015260600190565b60405180910390a250565b60055461010090046001600160a01b031633146111575760405162461bcd60e51b81526004016107b390612414565b6001600160a01b03821660009081526006602052604090819020805483151560ff199091161790555133906000805160206124eb83398151915290610bc4906020808252601f908201527f6368616e676520746f2063616e20616c77617973207472616465206c69737400604082015260600190565b336000908152600d602052604090205460ff166112225760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b60448201526064016107b3565b6001600160a01b0382166000908152600160209081526040808320338452909152902054611251908290612474565b6001600160a01b038316600090815260016020908152604080832033845290915290205561127f8282611a5a565b6001600160a01b0382166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061250b83398151915291015b60405180910390a35050565b600380546108849061248b565b6005546000903390600160a81b900460ff168061130857506005546001600160a01b0382811661010090920416145b8061132257503360009081526006602052604090205460ff165b61133e5760405162461bcd60e51b81526004016107b3906123e7565b6001600160a01b0384166113645760405162461bcd60e51b81526004016107b3906123b0565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610e94908490612474565b60055461010090046001600160a01b031633146113c25760405162461bcd60e51b81526004016107b390612414565b6001600160a01b0381166114115760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b60448201526064016107b3565b6005546001600160a01b0361010090910481166000818152600d60208181526040808420805460ff19908116909155878716808652828620805483166001908117909155878752600b8552838720805484169055818752838720805484168217905596865260068452828620805483169055855281852080548216871790557f000000000000000000000000307868f2f59239f43920d8a8868f67dde032bad5909616845291905290208054909216179055600580546001600160a01b03831661010002610100600160a81b031990911617905560405133906000805160206124eb8339815191529061111d906020808252600d908201526c1bdddb995c8818da185b99d959609a1b604082015260600190565b6005546000903390600160a81b900460ff168061155457506005546001600160a01b0382811661010090920416145b8061156e57503360009081526006602052604090205460ff165b61158a5760405162461bcd60e51b81526004016107b3906123e7565b611595338585611825565b5060019392505050565b60055461010090046001600160a01b031633146115ce5760405162461bcd60e51b81526004016107b390612414565b6001600160a01b03821660009081526007602052604090205460ff1615806115f4575080155b61164c5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b60648201526084016107b3565b6001600160a01b0382166000908152600b602052604090819020805483151560ff199091161790555133906000805160206124eb83398151915290610bc4906020808252601c908201527f6368616e676520746f20746178206578636c7573696f6e206c69737400000000604082015260600190565b6008546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b15801561105257600080fd5b60055461010090046001600160a01b031633146117365760405162461bcd60e51b81526004016107b390612414565b600a829055600981905560405133906000805160206124eb83398151915290610bc4906020808252601e908201527f6368616e676520746f206175746f2073776170207468726573686f6c64730000604082015260600190565b6001600160a01b0381166000908152600d60205260409020805460ff19166001179055610dd7815b6001600160a01b0381166000908152600b60205260409020805460ff19166001179055610dd7815b60058054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600660205260409020805460ff19166001179055565b6001600160a01b0382166118745760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b60448201526064016107b3565b61187f838383611b31565b600061188c848484611cdb565b6001600160a01b0385166000908152602081905260409020549091506118b3908390612474565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546118e390829061245c565b6001600160a01b038481166000818152602081815260409182902094909455518481529092918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611007565b8047101561198c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107b3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146119d9576040519150601f19603f3d011682016040523d82523d6000602084013e6119de565b606091505b5050905080611a555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107b3565b505050565b6001600160a01b038216611ab05760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206275726e2066726f6d206e756c6c206164647265737300000060448201526064016107b3565b80600254611abe9190612474565b6002556001600160a01b038216600090815260208190526040902054611ae5908290612474565b6001600160a01b03831660008181526020818152604080832094909455925184815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016112c0565b600554600160a81b900460ff168015611b5d57506005546001600160a01b038481166101009092041614155b8015611b7c57506005546001600160a01b038381166101009092041614155b8015611bba57507f000000000000000000000000307868f2f59239f43920d8a8868f67dde032bad56001600160a01b0316836001600160a01b031614155b8015611bf857507f000000000000000000000000307868f2f59239f43920d8a8868f67dde032bad56001600160a01b0316826001600160a01b031614155b8015611c1d57506001600160a01b03821660009081526007602052604090205460ff16155b8015611c3757506008546001600160a01b03838116911614155b15611cd0576001600160a01b0382166000908152602081905260409020547f00000000000000000000000000000000000000000000152d02c7e14af680000090611c8290839061245c565b1115611cd05760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e7460448201526064016107b3565b611a55838383611cf0565b6000611ce8848484611f06565b949350505050565b60085460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b158015611d3557600080fd5b505afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d9190612320565b611d779042612474565b600554909150600160a81b900460ff168015611d9c5750600854600160a01b900460ff165b8015611dc057506001600160a01b03831660009081526007602052604090205460ff165b8015611dda575042600c54603c611dd7919061245c565b11155b8015611de857506009548110155b8015611e105750600a546008546001600160a01b031660009081526020819052604090205410155b8015611e9f5750600860009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b158015611e6557600080fd5b505afa158015611e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9d91906122ea565b155b15611f015742600c556008546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b158015611eee57600080fd5b505af1925050508015611eff575060015b505b611007565b6001600160a01b0383166000908152600b6020526040812054829060ff16158015611f4a57506001600160a01b0384166000908152600b602052604090205460ff16155b8015611f5f5750600554600160a81b900460ff165b156120ac576001600160a01b03851660009081526007602052604090205460ff161561200a5760085460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b158015611fcb57600080fd5b505af1158015611fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120039190612320565b90506120ac565b6001600160a01b03841660009081526007602052604090205460ff16156120ac57600854604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b15801561207157600080fd5b505af1158015612085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a99190612320565b90505b60006120b88285612474565b90508015612144576008546001600160a01b03166000908152602081905260409020546120e690829061245c565b600880546001600160a01b0390811660009081526020818152604091829020949094559154915184815291811692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b61214f868684612159565b9695505050505050565b6000826001600160a01b0316846001600160a01b031614156121bd5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c660060448201526064016107b3565b5092915050565b80356001600160a01b0381168114610b2157600080fd5b6000602082840312156121ed57600080fd5b6121f6826121c4565b9392505050565b6000806040838503121561221057600080fd5b612219836121c4565b9150612227602084016121c4565b90509250929050565b60008060006060848603121561224557600080fd5b61224e846121c4565b925061225c602085016121c4565b9150604084013590509250925092565b6000806040838503121561227f57600080fd5b612288836121c4565b91506020830135612298816124dc565b809150509250929050565b600080604083850312156122b657600080fd5b6122bf836121c4565b946020939093013593505050565b6000602082840312156122df57600080fd5b81356121f6816124dc565b6000602082840312156122fc57600080fd5b81516121f6816124dc565b60006020828403121561231957600080fd5b5035919050565b60006020828403121561233257600080fd5b5051919050565b6000806040838503121561234c57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b818110156123885785810183015185820160400152820161236c565b8181111561239a576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b6000821982111561246f5761246f6124c6565b500190565b600082821015612486576124866124c6565b500390565b600181811c9082168061249f57607f821691505b602082108114156124c057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8015158114610dd757600080fdfed43eee071b91e7714b533dbf825ec024145ba03675691f363d9a4c47e88b4dc58c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212208061640d7c033bc00ab355b8a21e43e40efa380add9f37a38d5b5d32d2d91c1064736f6c63430008070033

Deployed Bytecode Sourcemap

213:2823:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6396:212:1;;;;;;;;;;;;;:::i;:::-;;415:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3401:314;;;;;;;;;;-1:-1:-1;3401:314:1;;;;;:::i;:::-;;:::i;:::-;;;3545:14:7;;3538:22;3520:41;;3508:2;3493:18;3401:314:1;3380:187:7;7607:202:1;;;;;;;;;;-1:-1:-1;7607:202:1;;;;;:::i;:::-;;:::i;1483:102::-;;;;;;;;;;-1:-1:-1;1565:12:1;;1483:102;;;11980:25:7;;;11968:2;11953:18;1483:102:1;11834:177:7;2967:114:3;;;;;;;;;;-1:-1:-1;3058:14:3;;-1:-1:-1;;;;;3058:14:3;2967:114;;;-1:-1:-1;;;;;3057:32:7;;;3039:51;;3027:2;3012:18;2967:114:3;2893:203:7;762:187:2;;;;;;;;;;-1:-1:-1;762:187:2;;;;;:::i;:::-;;:::i;4188:328:1:-;;;;;;;;;;-1:-1:-1;4188:328:1;;;;;:::i;:::-;;:::i;8037:191::-;;;;;;;;;;-1:-1:-1;8037:191:1;;;;;:::i;:::-;;:::i;440:21::-;;;;;;;;;;-1:-1:-1;440:21:1;;;;;;;;;;;12188:4:7;12176:17;;;12158:36;;12146:2;12131:18;440:21:1;12016:184:7;188:43:2;;;;;;;;;;-1:-1:-1;188:43:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;7445:154:1;;;;;;;;;;;;;:::i;5031:381::-;;;;;;;;;;-1:-1:-1;5031:381:1;;;;;:::i;:::-;;:::i;1120:101:2:-;;;;;;;;;;-1:-1:-1;1120:101:2;;;;;:::i;:::-;;:::i;3901:93:3:-;;;;;;;;;;;;;:::i;2775:102::-;;;;;;;;;;;;;:::i;3127:168::-;;;;;;;;;;-1:-1:-1;3127:168:3;;;;;:::i;:::-;;:::i;7821:204:1:-;;;;;;;;;;-1:-1:-1;7821:204:1;;;;;:::i;:::-;;:::i;278:33:6:-;;;;;;;;;;;;;;;220:23:3;;;;;;;;;;-1:-1:-1;220:23:3;;;;-1:-1:-1;;;220:23:3;;;;;;1802:119:1;;;;;;;;;;-1:-1:-1;1802:119:1;;;;;:::i;:::-;-1:-1:-1;;;;;1896:17:1;1869:7;1896:17;;;;;;;;;;;;1802:119;597:42;;;;;;;;;;-1:-1:-1;597:42:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;1620:275:2;;;;;;;;;;-1:-1:-1;1620:275:2;;;;;:::i;:::-;;:::i;510:20:1:-;;;;;;;;;;-1:-1:-1;510:20:1;;;;-1:-1:-1;;;510:20:1;;;;;;474:29;;;;;;;;;;-1:-1:-1;474:29:1;;;;;;;-1:-1:-1;;;;;474:29:1;;;388:20;;;;;;;;;;;;;:::i;340:48:3:-;;;;;;;;;;-1:-1:-1;340:48:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;5932:391:1;;;;;;;;;;-1:-1:-1;5932:391:1;;;;;:::i;:::-;;:::i;7190:247::-;;;;;;;;;;-1:-1:-1;7190:247:1;;;;;:::i;:::-;;:::i;2576:178::-;;;;;;;;;;-1:-1:-1;2576:178:1;;;;;:::i;:::-;;:::i;543:47::-;;;;;;;;;;-1:-1:-1;543:47:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;3303:305:3;;;;;;;;;;-1:-1:-1;3303:305:3;;;;;:::i;:::-;;:::i;2573:104::-;;;;;;;;;;;;;:::i;295:38::-;;;;;;;;;;;;;;;;3616:273;;;;;;;;;;-1:-1:-1;3616:273:3;;;;;:::i;:::-;;:::i;318:33:6:-;;;;;;;;;;;;;;;250:38:3;;;;;;;;;;;;;;;;2261:144:1;;;;;;;;;;-1:-1:-1;2261:144:1;;;;;:::i;:::-;-1:-1:-1;;;;;2372:16:1;;;2345:7;2372:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;2261:144;6396:212;777:5;;;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;;;;;;;;;6458:8:::1;::::0;-1:-1:-1;;;6458:8:1;::::1;;;:17;6450:55;;;::::0;-1:-1:-1;;;6450:55:1;;10606:2:7;6450:55:1::1;::::0;::::1;10588:21:7::0;10645:2;10625:18;;;10618:30;10684:27;10664:18;;;10657:55;10729:18;;6450:55:1::1;10404:349:7::0;6450:55:1::1;6516:8;:15:::0;;-1:-1:-1;;;;6516:15:1::1;-1:-1:-1::0;;;6516:15:1::1;::::0;;6547:53:::1;::::0;6568:10:::1;::::0;-1:-1:-1;;;;;;;;;;;6547:53:1;::::1;::::0;4727:2:7;4709:21;;;4766:2;4746:18;;;4739:30;-1:-1:-1;;;4800:2:7;4785:18;;4778:47;4857:2;4842:18;;4525:341;6547:53:1::1;;;;;;;;6396:212::o:0;415:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3401:314::-;1175:8;;3504:4;;3483:10;;-1:-1:-1;;;1175:8:1;;;;;:25;;-1:-1:-1;1195:5:1;;-1:-1:-1;;;;;1187:13:1;;;1195:5;;;;;1187:13;1175:25;:55;;;-1:-1:-1;1219:10:1;1204:26;;;;:14;:26;;;;;;;;1175:55;1167:87;;;;-1:-1:-1;;;1167:87:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3529:21:1;::::1;3521:62;;;;-1:-1:-1::0;;;3521:62:1::1;;;;;;;:::i;:::-;3605:10;3596:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;3596:29:1;::::1;::::0;;;;;;;;;;:37;;;3649:36;11980:25:7;;;3596:29:1;;3605:10;-1:-1:-1;;;;;;;;;;;3649:36:1;11953:18:7;3649:36:1::1;;;;;;;;-1:-1:-1::0;3703:4:1::1;::::0;3401:314;-1:-1:-1;;;3401:314:1:o;7607:202::-;777:5;;7673:4;;777:5;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;7707:38:::1;::::0;-1:-1:-1;;;7707:38:1;;7739:4:::1;7707:38;::::0;::::1;3039:51:7::0;7689:15:1::1;::::0;-1:-1:-1;;;;;7707:23:1;::::1;::::0;::::1;::::0;3012:18:7;;7707:38:1::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7786:5;::::0;7763:38:::1;::::0;-1:-1:-1;;;7763:38:1;;-1:-1:-1;;;;;7786:5:1::1;::::0;;::::1;::::0;::::1;7763:38;::::0;::::1;3275:51:7::0;3342:18;;;3335:34;;;;;-1:-1:-1;7763:22:1;::::1;::::0;::::1;::::0;3248:18:7;;7763:38:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7756:45;;;838:1;7607:202:::0;;;:::o;762:187:2:-;777:5:1;;;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;842:15:2;::::1;;::::0;;;:10:::1;:15;::::0;;;;;;:25;;;::::1;;-1:-1:-1::0;;842:25:2;;::::1;;::::0;;883:58;904:10:::1;::::0;-1:-1:-1;;;;;;;;;;;883:58:2;::::1;::::0;4376:2:7;4358:21;;;4415:2;4395:18;;;4388:30;-1:-1:-1;;;4449:2:7;4434:18;;4427:52;4511:2;4496:18;;4174:346;883:58:2::1;;;;;;;;762:187:::0;;:::o;4188:328:1:-;1175:8;;4299:4;;4284;;-1:-1:-1;;;1175:8:1;;;;;:25;;-1:-1:-1;1195:5:1;;-1:-1:-1;;;;;1187:13:1;;;1195:5;;;;;1187:13;1175:25;:55;;;-1:-1:-1;1219:10:1;1204:26;;;;:14;:26;;;;;;;;1175:55;1167:87;;;;-1:-1:-1;;;1167:87:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;4345:14:1;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4360:10:::1;4345:26:::0;;;;;;;;:34:::1;::::0;4374:5;;4345:34:::1;:::i;:::-;-1:-1:-1::0;;;;;4316:14:1;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4331:10:::1;4316:26:::0;;;;;;;:63;4390:26:::1;4325:4:::0;4406:2;4410:5;4390:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;4432:54:1;::::1;4459:14;::::0;;;:8:::1;:14;::::0;;;;;;;4447:10:::1;4459:26:::0;;;;;;;;;;;4432:54;;11980:25:7;;;4447:10:1;;4432:54;-1:-1:-1;;;;;;;;;;;4432:54:1;11953:18:7;4432:54:1::1;;;;;;;-1:-1:-1::0;4504:4:1::1;::::0;4188:328;-1:-1:-1;;;;4188:328:1:o;8037:191::-;777:5;;;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;8118:14:1;::::1;;::::0;;;:9:::1;:14;::::0;;;;;;:27;;;::::1;;-1:-1:-1::0;;8118:27:1;;::::1;;::::0;;8161:59;8182:10:::1;::::0;-1:-1:-1;;;;;;;;;;;8161:59:1;::::1;::::0;6121:2:7;6103:21;;;6160:2;6140:18;;;6133:30;6199:25;6194:2;6179:18;;6172:53;6257:2;6242:18;;5919:347;7445:154:1;777:5;;;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;7575:5:::1;::::0;7517:21:::1;::::0;7549:42:::1;::::0;7575:5:::1;::::0;::::1;-1:-1:-1::0;;;;;7575:5:1::1;7517:21:::0;7549:17:::1;:42::i;:::-;7488:111;7445:154::o:0;5031:381::-;1175:8;;5140:4;;5119:10;;-1:-1:-1;;;1175:8:1;;;;;:25;;-1:-1:-1;1195:5:1;;-1:-1:-1;;;;;1187:13:1;;;1195:5;;;;;1187:13;1175:25;:55;;;-1:-1:-1;1219:10:1;1204:26;;;;:14;:26;;;;;;;;1175:55;1167:87;;;;-1:-1:-1;;;1167:87:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;5165:21:1;::::1;5157:62;;;;-1:-1:-1::0;;;5157:62:1::1;;;;;;;:::i;:::-;5273:10;5264:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5264:29:1;::::1;::::0;;;;;;;;:42:::1;::::0;5296:10;;5264:42:::1;:::i;:::-;5241:10;5232:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5232:29:1;::::1;::::0;;;;;;;;;;:74;;;5322:60;11980:25:7;;;5232:29:1;;-1:-1:-1;;;;;;;;;;;5322:60:1;11953:18:7;5322:60:1::1;11834:177:7::0;1120:101:2;292:10;281:22;;;;:10;:22;;;;;;;;273:54;;;;-1:-1:-1;;;273:54:2;;5431:2:7;273:54:2;;;5413:21:7;5470:2;5450:18;;;5443:30;-1:-1:-1;;;5489:18:7;;;5482:49;5548:18;;273:54:2;5229:343:7;273:54:2;1189:24:::1;1195:10;1207:5;1189;:24::i;3901:93:3:-:0;900:8:1;;-1:-1:-1;;;900:8:1;;;;892:62;;;;-1:-1:-1;;;892:62:1;;6830:2:7;892:62:1;;;6812:21:7;6869:2;6849:18;;;6842:30;6908:34;6888:18;;;6881:62;-1:-1:-1;;;6959:18:7;;;6952:39;7008:19;;892:62:1;6628:405:7;892:62:1;3959:14:3::1;;;;;;;;;-1:-1:-1::0;;;;;3959:14:3::1;-1:-1:-1::0;;;;;3959:25:3::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3901:93::o:0;2775:102::-;2843:14;;:26;;;-1:-1:-1;;;2843:26:3;;;;2816:7;;-1:-1:-1;;;;;2843:14:3;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2836:33;;2775:102;:::o;3127:168::-;777:5:1;;;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;3195:11:3::1;:21:::0;;;::::1;;-1:-1:-1::0;;;3195:21:3::1;-1:-1:-1::0;;;;3195:21:3;;::::1;;::::0;;3232:55:::1;::::0;3253:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3232:55:3;::::1;::::0;8734:2:7;8716:21;;;8773:2;8753:18;;;8746:30;-1:-1:-1;;;8807:2:7;8792:18;;8785:49;8866:2;8851:18;;8532:343;3232:55:3::1;;;;;;;;3127:168:::0;:::o;7821:204:1:-;777:5;;;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7905:19:1;::::1;;::::0;;;:14:::1;:19;::::0;;;;;;:29;;;::::1;;-1:-1:-1::0;;7905:29:1;;::::1;;::::0;;7950:67;7971:10:::1;::::0;-1:-1:-1;;;;;;;;;;;7950:67:1;::::1;::::0;9491:2:7;9473:21;;;9530:2;9510:18;;;9503:30;9569:33;9564:2;9549:18;;9542:61;9635:2;9620:18;;9289:355;1620:275:2;292:10;281:22;;;;:10;:22;;;;;;;;273:54;;;;-1:-1:-1;;;273:54:2;;5431:2:7;273:54:2;;;5413:21:7;5470:2;5450:18;;;5443:30;-1:-1:-1;;;5489:18:7;;;5482:49;5548:18;;273:54:2;5229:343:7;273:54:2;-1:-1:-1;;;;;1742:17:2;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;1760:10:::1;1742:29:::0;;;;;;;;:37:::1;::::0;1774:5;;1742:37:::1;:::i;:::-;-1:-1:-1::0;;;;;1710:17:2;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;1728:10:::1;1710:29:::0;;;;;;;:69;1790:21:::1;1719:7:::0;1805:5;1790::::1;:21::i;:::-;-1:-1:-1::0;;;;;1827:60:2;::::1;1857:17;::::0;;;:8:::1;:17;::::0;;;;;;;1845:10:::1;1857:29:::0;;;;;;;;;;;1827:60;;11980:25:7;;;1845:10:2;;1827:60;-1:-1:-1;;;;;;;;;;;1827:60:2;11953:18:7;1827:60:2::1;;;;;;;;1620:275:::0;;:::o;388:20:1:-;;;;;;;:::i;5932:391::-;1175:8;;6046:4;;6025:10;;-1:-1:-1;;;1175:8:1;;;;;:25;;-1:-1:-1;1195:5:1;;-1:-1:-1;;;;;1187:13:1;;;1195:5;;;;;1187:13;1175:25;:55;;;-1:-1:-1;1219:10:1;1204:26;;;;:14;:26;;;;;;;;1175:55;1167:87;;;;-1:-1:-1;;;1167:87:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;6071:21:1;::::1;6063:62;;;;-1:-1:-1::0;;;6063:62:1::1;;;;;;;:::i;:::-;6179:10;6170:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;6170:29:1;::::1;::::0;;;;;;;;:47:::1;::::0;6202:15;;6170:47:::1;:::i;7190:247::-:0;777:5;;;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7262:17:1;::::1;7254:52;;;::::0;-1:-1:-1;;;7254:52:1;;9851:2:7;7254:52:1::1;::::0;::::1;9833:21:7::0;9890:2;9870:18;;;9863:30;-1:-1:-1;;;9909:18:7;;;9902:52;9971:18;;7254:52:1::1;9649:346:7::0;7254:52:1::1;7331:5;::::0;-1:-1:-1;;;;;7331:5:1::1;::::0;;::::1;::::0;::::1;635::2::0;616:16;;;:10;:16;;;;;;;;:24;;-1:-1:-1;;616:24:2;;;;;;651:14;;;;;;;;;:21;;;;-1:-1:-1;651:21:2;;;;;;691::3;;;:15;:21;;;;;:29;;;;;;731:19;;;;;;:26;;;;;;;;7004:20:1;;;:14;:20;;;;;:28;;;;;;7043:18;;;;;:25;;;;;;;;3008:8:6;2997:20;;;;;;;;;;:27;;;;;;;;7353:5:1::1;:11:::0;;-1:-1:-1;;;;;7353:11:1;::::1;;;-1:-1:-1::0;;;;;;7353:11:1;;::::1;;::::0;;7380:49:::1;::::0;7401:10:::1;::::0;-1:-1:-1;;;;;;;;;;;7380:49:1;::::1;::::0;5779:2:7;5761:21;;;5818:2;5798:18;;;5791:30;-1:-1:-1;;;5852:2:7;5837:18;;5830:43;5905:2;5890:18;;5577:337;2576:178:1;1175:8;;2675:4;;2654:10;;-1:-1:-1;;;1175:8:1;;;;;:25;;-1:-1:-1;1195:5:1;;-1:-1:-1;;;;;1187:13:1;;;1195:5;;;;;1187:13;1175:25;:55;;;-1:-1:-1;1219:10:1;1204:26;;;;:14;:26;;;;;;;;1175:55;1167:87;;;;-1:-1:-1;;;1167:87:1;;;;;;;:::i;:::-;2692:32:::1;2702:10;2714:2;2718:5;2692:9;:32::i;:::-;-1:-1:-1::0;2742:4:1::1;::::0;2576:178;-1:-1:-1;;;2576:178:1:o;3303:305:3:-;777:5:1;;;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3396:14:3;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;3423:16:3;::::1;3396:43;3388:91;;;::::0;-1:-1:-1;;;3388:91:3;;10202:2:7;3388:91:3::1;::::0;::::1;10184:21:7::0;10241:2;10221:18;;;10214:30;10280:34;10260:18;;;10253:62;-1:-1:-1;;;10331:18:7;;;10324:33;10374:19;;3388:91:3::1;10000:399:7::0;3388:91:3::1;-1:-1:-1::0;;;;;3490:20:3;::::1;;::::0;;;:15:::1;:20;::::0;;;;;;:30;;;::::1;;-1:-1:-1::0;;3490:30:3;;::::1;;::::0;;3536:64;3557:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3536:64:3;::::1;::::0;10960:2:7;10942:21;;;10999:2;10979:18;;;10972:30;11038;11033:2;11018:18;;11011:58;11101:2;11086:18;;10758:352;2573:104:3;2642:14;;:27;;;-1:-1:-1;;;2642:27:3;;;;2615:7;;-1:-1:-1;;;;;2642:14:3;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;3616:273;777:5:1;;;;;-1:-1:-1;;;;;777:5:1;763:10;:19;755:72;;;;-1:-1:-1;;;755:72:1;;;;;;;:::i;:::-;3720:23:3::1;:35:::0;;;3766:23:::1;:33:::0;;;3815:66:::1;::::0;3836:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3815:66:3;::::1;::::0;11677:2:7;11659:21;;;11716:2;11696:18;;;11689:30;11755:32;11750:2;11735:18;;11728:60;11820:2;11805:18;;11475:354;379:139:2;-1:-1:-1;;;;;451:18:2;;;;;;:10;:18;;;;;:25;;-1:-1:-1;;451:25:2;472:4;451:25;;;487:23;462:6;453:144:3;-1:-1:-1;;;;;525:23:3;;;;;;:15;:23;;;;;:30;;-1:-1:-1;;525:30:3;551:4;525:30;;;566:23;541:6;1286:124:1;1349:5;:14;;-1:-1:-1;;;;;;1349:14:1;;-1:-1:-1;;;;;1349:14:1;;;;;;;;;;;;;1389:5;;;-1:-1:-1;1374:21:1;;;:14;:21;;;;;:28;;-1:-1:-1;;1374:28:1;-1:-1:-1;1374:28:1;;;1286:124::o;9129:453::-;-1:-1:-1;;;;;9216:16:1;;9208:51;;;;-1:-1:-1;;;9208:51:1;;9851:2:7;9208:51:1;;;9833:21:7;9890:2;9870:18;;;9863:30;-1:-1:-1;;;9909:18:7;;;9902:52;9971:18;;9208:51:1;9649:346:7;9208:51:1;9272:28;9284:4;9290:2;9294:5;9272:11;:28::i;:::-;9313:22;9338:40;9362:4;9368:2;9372:5;9338:23;:40::i;:::-;-1:-1:-1;;;;;9407:15:1;;:9;:15;;;;;;;;;;;9313:65;;-1:-1:-1;9407:23:1;;9425:5;;9407:23;:::i;:::-;-1:-1:-1;;;;;9389:15:1;;;:9;:15;;;;;;;;;;;:41;;;;9457:13;;;;;;;:30;;9473:14;;9457:30;:::i;:::-;-1:-1:-1;;;;;9441:13:1;;;:9;:13;;;;;;;;;;;;:46;;;;9505:34;11980:25:7;;;9441:13:1;;9505:34;;;;;;11953:18:7;9505:34:1;;;;;;;9552:22;7084:68;2710:317:0;2825:6;2800:21;:31;;2792:73;;;;-1:-1:-1;;;2792:73:0;;8376:2:7;2792:73:0;;;8358:21:7;8415:2;8395:18;;;8388:30;8454:31;8434:18;;;8427:59;8503:18;;2792:73:0;8174:353:7;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;;7949:2:7;2941:78:0;;;7931:21:7;7988:2;7968:18;;;7961:30;8027:34;8007:18;;;8000:62;8098:28;8078:18;;;8071:56;8144:19;;2941:78:0;7747:422:7;2941:78:0;2781:246;2710:317;;:::o;1931:296:2:-;-1:-1:-1;;;;;2006:21:2;;1998:63;;;;-1:-1:-1;;;1998:63:2;;5073:2:7;1998:63:2;;;5055:21:7;5112:2;5092:18;;;5085:30;5151:31;5131:18;;;5124:59;5200:18;;1998:63:2;4871:353:7;1998:63:2;2104:5;2089:12;;:20;;;;:::i;:::-;2074:12;:35;-1:-1:-1;;;;;2141:18:2;;:9;:18;;;;;;;;;;;:26;;2162:5;;2141:26;:::i;:::-;-1:-1:-1;;;;;2120:18:2;;:9;:18;;;;;;;;;;;:47;;;;2183:36;;11980:25:7;;;2120:9:2;;2183:36;;11953:18:7;2183:36:2;11834:177:7;2114:503:6;2244:8;;-1:-1:-1;;;2244:8:6;;;;:39;;;;-1:-1:-1;2278:5:6;;-1:-1:-1;;;;;2270:13:6;;;2278:5;;;;;2270:13;;2244:39;:54;;;;-1:-1:-1;2293:5:6;;-1:-1:-1;;;;;2287:11:6;;;2293:5;;;;;2287:11;;2244:54;:88;;;;;2324:8;-1:-1:-1;;;;;2316:16:6;:4;-1:-1:-1;;;;;2316:16:6;;;2244:88;:106;;;;;2342:8;-1:-1:-1;;;;;2336:14:6;:2;-1:-1:-1;;;;;2336:14:6;;;2244:106;:146;;;;-1:-1:-1;;;;;;2368:13:6;;;;;;:9;:13;;;;;;;;:22;2244:146;:193;;;;-1:-1:-1;2422:14:6;;-1:-1:-1;;;;;2408:29:6;;;2422:14;;2408:29;;2244:193;2240:315;;;-1:-1:-1;;;;;2473:13:6;;:9;:13;;;;;;;;;;;2498:8;;2473:21;;2489:5;;2473:21;:::i;:::-;:33;;2464:79;;;;-1:-1:-1;;;2464:79:6;;7240:2:7;2464:79:6;;;7222:21:7;;;7259:18;;;7252:30;7318:34;7298:18;;;7291:62;7370:18;;2464:79:6;7038:356:7;2464:79:6;2575:34;2593:4;2599:2;2603:5;2575:17;:34::i;2629:207::-;2755:7;2782:46;2812:4;2818:2;2822:5;2782:29;:46::i;:::-;2775:53;2629:207;-1:-1:-1;;;;2629:207:6:o;1743:693:3:-;1888:14;;:29;;;-1:-1:-1;;;1888:29:3;;;;1842:25;;-1:-1:-1;;;;;1888:14:3;;:27;;:29;;;;;;;;;;;;;;:14;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1870:47;;:15;:47;:::i;:::-;1946:8;;1842:75;;-1:-1:-1;;;;1946:8:3;;;;:37;;;;-1:-1:-1;1972:11:3;;-1:-1:-1;;;1972:11:3;;;;1946:37;:68;;;;-1:-1:-1;;;;;;2001:13:3;;;;;;:9;:13;;;;;;;;1946:68;:123;;;;;2054:15;2032:13;;2048:2;2032:18;;;;:::i;:::-;:37;;1946:123;:184;;;;;2107:23;;2086:17;:44;;1946:184;:262;;;;-1:-1:-1;2185:23:3;;2165:14;;-1:-1:-1;;;;;2165:14:3;2147:9;:34;;;;;;;;;;;:61;;1946:262;:311;;;;;2225:14;;;;;;;;;-1:-1:-1;;;;;2225:14:3;-1:-1:-1;;;;;2225:21:3;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;1946:311;1928:456;;;2300:15;2284:13;:31;2334:14;;:27;;;-1:-1:-1;;;2334:27:3;;;;-1:-1:-1;;;;;2334:14:3;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;2330:43;;2394:34;2710:317:0;817:916:3;-1:-1:-1;;;;;1003:21:3;;926:7;1003:21;;;:15;:21;;;;;;981:5;;1003:21;;:30;;;:62;;-1:-1:-1;;;;;;1037:19:3;;;;;;:15;:19;;;;;;;;:28;1003:62;:74;;;;-1:-1:-1;1069:8:3;;-1:-1:-1;;;1069:8:3;;;;1003:74;999:390;;;-1:-1:-1;;;;;1098:15:3;;;;;;:9;:15;;;;;;;;1094:284;;;1185:14;;:32;;-1:-1:-1;;;1185:32:3;;;;;11980:25:7;;;-1:-1:-1;;;;;1185:14:3;;;;:25;;11953:18:7;;1185:32:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1168:49;;1094:284;;;-1:-1:-1;;;;;1243:13:3;;;;;;:9;:13;;;;;;;;1239:139;;;1329:14;;:33;;-1:-1:-1;;;1329:33:3;;;;;11980:25:7;;;-1:-1:-1;;;;;1329:14:3;;;;:26;;11953:18:7;;1329:33:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1312:50;;1239:139;1401:17;1421:22;1429:14;1421:5;:22;:::i;:::-;1401:42;-1:-1:-1;1458:13:3;;1454:199;;1543:14;;-1:-1:-1;;;;;1543:14:3;1525:9;:34;;;;;;;;;;;:46;;1562:9;;1525:46;:::i;:::-;1506:14;;;-1:-1:-1;;;;;1506:14:3;;;1488:9;:34;;;;;;;;;;;;:83;;;;1614:14;;1591:50;;11980:25:7;;;1614:14:3;;;;1591:50;;;;;;11953:18:7;1591:50:3;;;;;;;1454:199;1670:55;1700:4;1706:2;1710:14;1670:29;:55::i;:::-;1663:62;817:916;-1:-1:-1;;;;;;817:916:3:o;6710:205:1:-;6810:7;6846:2;-1:-1:-1;;;;;6838:10:1;:4;-1:-1:-1;;;;;6838:10:1;;;6830:54;;;;-1:-1:-1;;;6830:54:1;;11317:2:7;6830:54:1;;;11299:21:7;11356:2;11336:18;;;11329:30;11395:33;11375:18;;;11368:61;11446:18;;6830:54:1;11115:355:7;6830:54:1;-1:-1:-1;6902:5:1;6710:205;-1:-1:-1;;6710:205:1:o;14:173:7:-;82:20;;-1:-1:-1;;;;;131:31:7;;121:42;;111:70;;177:1;174;167:12;192:186;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:7:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:315::-;1046:6;1054;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1146:29;1165:9;1146:29;:::i;:::-;1136:39;;1225:2;1214:9;1210:18;1197:32;1238:28;1260:5;1238:28;:::i;:::-;1285:5;1275:15;;;981:315;;;;;:::o;1301:254::-;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;1545:2;1530:18;;;;1517:32;;-1:-1:-1;;;1301:254:7:o;1560:241::-;1616:6;1669:2;1657:9;1648:7;1644:23;1640:32;1637:52;;;1685:1;1682;1675:12;1637:52;1724:9;1711:23;1743:28;1765:5;1743:28;:::i;1806:245::-;1873:6;1926:2;1914:9;1905:7;1901:23;1897:32;1894:52;;;1942:1;1939;1932:12;1894:52;1974:9;1968:16;1993:28;2015:5;1993:28;:::i;2056:180::-;2115:6;2168:2;2156:9;2147:7;2143:23;2139:32;2136:52;;;2184:1;2181;2174:12;2136:52;-1:-1:-1;2207:23:7;;2056:180;-1:-1:-1;2056:180:7:o;2241:184::-;2311:6;2364:2;2352:9;2343:7;2339:23;2335:32;2332:52;;;2380:1;2377;2370:12;2332:52;-1:-1:-1;2403:16:7;;2241:184;-1:-1:-1;2241:184:7:o;2430:248::-;2498:6;2506;2559:2;2547:9;2538:7;2534:23;2530:32;2527:52;;;2575:1;2572;2565:12;2527:52;-1:-1:-1;;2598:23:7;;;2668:2;2653:18;;;2640:32;;-1:-1:-1;2430:248:7:o;3572:597::-;3684:4;3713:2;3742;3731:9;3724:21;3774:6;3768:13;3817:6;3812:2;3801:9;3797:18;3790:34;3842:1;3852:140;3866:6;3863:1;3860:13;3852:140;;;3961:14;;;3957:23;;3951:30;3927:17;;;3946:2;3923:26;3916:66;3881:10;;3852:140;;;4010:6;4007:1;4004:13;4001:91;;;4080:1;4075:2;4066:6;4055:9;4051:22;4047:31;4040:42;4001:91;-1:-1:-1;4153:2:7;4132:15;-1:-1:-1;;4128:29:7;4113:45;;;;4160:2;4109:54;;3572:597;-1:-1:-1;;;3572:597:7:o;6271:352::-;6473:2;6455:21;;;6512:2;6492:18;;;6485:30;6551;6546:2;6531:18;;6524:58;6614:2;6599:18;;6271:352::o;7399:343::-;7601:2;7583:21;;;7640:2;7620:18;;;7613:30;-1:-1:-1;;;7674:2:7;7659:18;;7652:49;7733:2;7718:18;;7399:343::o;8880:404::-;9082:2;9064:21;;;9121:2;9101:18;;;9094:30;9160:34;9155:2;9140:18;;9133:62;-1:-1:-1;;;9226:2:7;9211:18;;9204:38;9274:3;9259:19;;8880:404::o;12205:128::-;12245:3;12276:1;12272:6;12269:1;12266:13;12263:39;;;12282:18;;:::i;:::-;-1:-1:-1;12318:9:7;;12205:128::o;12338:125::-;12378:4;12406:1;12403;12400:8;12397:34;;;12411:18;;:::i;:::-;-1:-1:-1;12448:9:7;;12338:125::o;12468:380::-;12547:1;12543:12;;;;12590;;;12611:61;;12665:4;12657:6;12653:17;12643:27;;12611:61;12718:2;12710:6;12707:14;12687:18;12684:38;12681:161;;;12764:10;12759:3;12755:20;12752:1;12745:31;12799:4;12796:1;12789:15;12827:4;12824:1;12817:15;12681:161;;12468:380;;;:::o;12853:127::-;12914:10;12909:3;12905:20;12902:1;12895:31;12945:4;12942:1;12935:15;12969:4;12966:1;12959:15;12985:118;13071:5;13064:13;13057:21;13050:5;13047:32;13037:60;;13093:1;13090;13083:12

Swarm Source

ipfs://7b879f4c5c1e6b48e23d43772037ccaf290458485917adac09c58e8c4e9ad81d
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.