Token Char Capital Group

 

Overview [ERC-20]

Max Total Supply:
10,000,000 CCG

Holders:
49

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x9d67db257b495425998a267a887582cfa03a52d8

Contract Name:
TaxableTeamToken

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 7 of 8: TaxableTeamToken.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "./Context.sol";
import "./IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./Ownable.sol";

contract TaxableTeamToken is IERC20, Context, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;

    string private _name;
    string private _symbol;
    uint8 private _decimals;
    uint256 private _feesPercentage;

    modifier checkIsAddressValid(address ethAddress)
    {
        require(ethAddress != address(0), "[Validation] invalid address");
        require(ethAddress == address(ethAddress), "[Validation] invalid address");
        _;
    }
    
    modifier checkIsFeesValid(uint256 fees)
    {
        require(fees > 0, "[Validation] fees should be greater than zero.");
        require(fees < 21, "[Validation] fees should be less than 21.");
        _;
    }

    constructor(
        string memory name,
        string memory symbol,
        uint8 decimals,
        uint256 supply,
        uint256 fees,
        address owner,
        address feeWallet
    ) public checkIsFeesValid(fees) checkIsAddressValid(owner) checkIsAddressValid(feeWallet) {
        
        require(decimals >=8 && decimals <= 18, "[Validation] Not valid decimals");
        require(supply > 0, "[Validation] inital supply should be greater than 0");
        require(owner != feeWallet, "[Validation] fee wallet and owner wallet cannot be same.");
        
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
        _feesPercentage = fees;
        
        _tTotal = supply;
        _rTotal = (MAX - (MAX % _tTotal));
        
        _rOwned[owner] = _rTotal;
        
        emit Transfer(address(0), owner, _tTotal);
    }
    

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

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

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

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }
    
    function fees() public view returns (uint256) {
        return _feesPercentage;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

    function isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function reflect(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeAccount(address account) external onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }
    
    function setFeesPercentage(uint256 feesPercentage) external onlyOwner() checkIsFeesValid(feesPercentage) {
        _feesPercentage = feesPercentage;
    }

    function includeAccount(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

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

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

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);       
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256) {
        uint256 tFee = tAmount.mul(_feesPercentage).div(100);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
}

File 1 of 8: Address.sol
// SPDX-License-Identifier: MIT


pragma solidity >=0.6.2 <0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 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://diligence.consensys.net/posts/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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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 functionCall(target, data, "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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 8: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 8: ERC20.sol
// SPDX-License-Identifier: MIT


pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";
import "./IERC20.sol";
import "./SafeMath.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

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

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

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

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

File 4 of 8: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: 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
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 5 of 8: Ownable.sol
// SPDX-License-Identifier: MIT


pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 6 of 8: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 8 of 8: TeamToken.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;


import "./ERC20.sol";


contract TeamToken is ERC20 {

    modifier checkIsAddressValid(address ethAddress)
    {
        require(ethAddress != address(0), "[Validation] invalid address");
        require(ethAddress == address(ethAddress), "[Validation] invalid address");
        _;
    }

    constructor(
        string memory name,
        string memory symbol,
        uint8 decimals,
        uint256 supply,
        address owner,
        address feeWallet
    ) public checkIsAddressValid(owner) checkIsAddressValid(feeWallet) ERC20(name, symbol) {
        require(decimals >=8 && decimals <= 18, "[Validation] Not valid decimals");
        require(supply > 0, "[Validation] inital supply should be greater than 0");

        _setupDecimals(decimals);
        _mint(owner, supply);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"feeWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"reflect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feesPercentage","type":"uint256"}],"name":"setFeesPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003eb138038062003eb1833981810160405260e08110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b838201915060208201858111156200006f57600080fd5b82518660018202830111640100000000821117156200008d57600080fd5b8083526020830192505050908051906020019080838360005b83811015620000c3578082015181840152602081019050620000a6565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b838201915060208201858111156200012c57600080fd5b82518660018202830111640100000000821117156200014a57600080fd5b8083526020830192505050908051906020019080838360005b838110156200018057808201518184015260208101905062000163565b50505050905090810190601f168015620001ae5780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620001fc6200087f60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508260008111620002f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018062003e18602e913960400191505060405180910390fd5b6015811062000351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018062003def6029913960400191505060405180910390fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620003f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5b56616c69646174696f6e5d20696e76616c696420616464726573730000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5b56616c69646174696f6e5d20696e76616c696420616464726573730000000081525060200191505060405180910390fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5b56616c69646174696f6e5d20696e76616c696420616464726573730000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620005df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5b56616c69646174696f6e5d20696e76616c696420616464726573730000000081525060200191505060405180910390fd5b60088860ff1610158015620005f8575060128860ff1611155b6200066b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5b56616c69646174696f6e5d204e6f742076616c696420646563696d616c730081525060200191505060405180910390fd5b60008711620006c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018062003e466033913960400191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018062003e796038913960400191505060405180910390fd5b89600990805190602001906200076592919062000887565b5088600a90805190602001906200077e92919062000887565b5087600b60006101000a81548160ff021916908360ff16021790555085600c819055508660068190555060065460001981620007b657fe5b0660001903600781905550600754600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6006546040518082815260200191505060405180910390a3505050505050505050506200092d565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620008ca57805160ff1916838001178555620008fb565b82800160010185558215620008fb579182015b82811115620008fa578251825591602001919060010190620008dd565b5b5090506200090a91906200090e565b5090565b5b80821115620009295760008160009055506001016200090f565b5090565b6134b2806200093d6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063c9cb14051161007c578063c9cb14051461063b578063cba0e99614610669578063dd62ed3e146106c3578063f2cc0c181461073b578063f2fde38b1461077f578063f84354f1146107c35761014d565b8063715018a6146104945780638da5cb5b1461049e57806395d89b41146104d25780639af1d35a14610555578063a457c2d714610573578063a9059cbb146105d75761014d565b806323b872dd1161011557806323b872dd146102a35780632d83811914610327578063313ce56714610369578063395093511461038a5780634549b039146103ee57806370a082311461043c5761014d565b8063053ab1821461015257806306fdde0314610180578063095ea7b31461020357806313114a9d1461026757806318160ddd14610285575b600080fd5b61017e6004803603602081101561016857600080fd5b8101908080359060200190929190505050610807565b005b610188610997565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101c85780820151818401526020810190506101ad565b50505050905090810190601f1680156101f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024f6004803603604081101561021957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a39565b60405180821515815260200191505060405180910390f35b61026f610a57565b6040518082815260200191505060405180910390f35b61028d610a61565b6040518082815260200191505060405180910390f35b61030f600480360360608110156102b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a6b565b60405180821515815260200191505060405180910390f35b6103536004803603602081101561033d57600080fd5b8101908080359060200190929190505050610b44565b6040518082815260200191505060405180910390f35b610371610bc8565b604051808260ff16815260200191505060405180910390f35b6103d6600480360360408110156103a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bdf565b60405180821515815260200191505060405180910390f35b6104266004803603604081101561040457600080fd5b8101908080359060200190929190803515159060200190929190505050610c92565b6040518082815260200191505060405180910390f35b61047e6004803603602081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d47565b6040518082815260200191505060405180910390f35b61049c610e32565b005b6104a6610f9f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104da610fc8565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051a5780820151818401526020810190506104ff565b50505050905090810190601f1680156105475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61055d61106a565b6040518082815260200191505060405180910390f35b6105bf6004803603604081101561058957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611074565b60405180821515815260200191505060405180910390f35b610623600480360360408110156105ed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611141565b60405180821515815260200191505060405180910390f35b6106676004803603602081101561065157600080fd5b810190808035906020019092919050505061115f565b005b6106ab6004803603602081101561067f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112cc565b60405180821515815260200191505060405180910390f35b610725600480360360408110156106d957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611322565b6040518082815260200191505060405180910390f35b61077d6004803603602081101561075157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113a9565b005b6107c16004803603602081101561079557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116aa565b005b610805600480360360208110156107d957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061189c565b005b6000610811611c0d565b9050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156108b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061342c602c913960400191505060405180910390fd5b60006108c183611c15565b50505050905061091981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c6d90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061097181600754611c6d90919063ffffffff16565b60078190555061098c83600854611cf090919063ffffffff16565b600881905550505050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a2f5780601f10610a0457610100808354040283529160200191610a2f565b820191906000526020600020905b815481529060010190602001808311610a1257829003601f168201915b5050505050905090565b6000610a4d610a46611c0d565b8484611d78565b6001905092915050565b6000600854905090565b6000600654905090565b6000610a78848484611f6f565b610b3984610a84611c0d565b610b348560405180606001604052806028815260200161339260289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610aea611c0d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123c89092919063ffffffff16565b611d78565b600190509392505050565b6000600754821115610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806132a8602a913960400191505060405180910390fd5b6000610bab612482565b9050610bc081846124ad90919063ffffffff16565b915050919050565b6000600b60009054906101000a900460ff16905090565b6000610c88610bec611c0d565b84610c838560036000610bfd611c0d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf090919063ffffffff16565b611d78565b6001905092915050565b6000600654831115610d0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b81610d2b576000610d1c84611c15565b50505050905080915050610d41565b6000610d3684611c15565b505050915050809150505b92915050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610de257600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610e2d565b610e2a600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b44565b90505b919050565b610e3a611c0d565b73ffffffffffffffffffffffffffffffffffffffff16610e58610f9f565b73ffffffffffffffffffffffffffffffffffffffff1614610ee1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110605780601f1061103557610100808354040283529160200191611060565b820191906000526020600020905b81548152906001019060200180831161104357829003601f168201915b5050505050905090565b6000600c54905090565b6000611137611081611c0d565b846111328560405180606001604052806025815260200161345860259139600360006110ab611c0d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123c89092919063ffffffff16565b611d78565b6001905092915050565b600061115561114e611c0d565b8484611f6f565b6001905092915050565b611167611c0d565b73ffffffffffffffffffffffffffffffffffffffff16611185610f9f565b73ffffffffffffffffffffffffffffffffffffffff161461120e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060008111611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613343602e913960400191505060405180910390fd5b601581106112c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061331a6029913960400191505060405180910390fd5b81600c819055505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113b1611c0d565b73ffffffffffffffffffffffffffffffffffffffff166113cf610f9f565b73ffffffffffffffffffffffffffffffffffffffff1614611458576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156115ec576115a8600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b44565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506005819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6116b2611c0d565b73ffffffffffffffffffffffffffffffffffffffff166116d0610f9f565b73ffffffffffffffffffffffffffffffffffffffff1614611759576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806132d26026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6118a4611c0d565b73ffffffffffffffffffffffffffffffffffffffff166118c2610f9f565b73ffffffffffffffffffffffffffffffffffffffff161461194b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b60005b600580549050811015611c09578173ffffffffffffffffffffffffffffffffffffffff1660058281548110611a3e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bfc57600560016005805490500381548110611a9a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660058281548110611ad257fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506005805480611bc257fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611c09565b8080600101915050611a0d565b5050565b600033905090565b6000806000806000806000611c2988612536565b915091506000611c37612482565b90506000806000611c498c8686612589565b92509250925082828288889a509a509a509a509a5050505050505091939590929450565b600082821115611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b600080828401905083811015611d6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134086024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806132f86022913960400191505060405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ff5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806133e36025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561207b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806132856023913960400191505060405180910390fd5b600081116120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806133ba6029913960400191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156121775750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561218c576121878383836125e7565b6123c3565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561222f5750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122445761223f83838361283a565b6123c2565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122e85750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156122fd576122f8838383612a8d565b6123c1565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561239f5750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156123b4576123af838383612c4b565b6123c0565b6123bf838383612a8d565b5b5b5b5b505050565b6000838311158290612475576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561243a57808201518184015260208101905061241f565b50505050905090810190601f1680156124675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b600080600061248f612f33565b915091506124a681836124ad90919063ffffffff16565b9250505090565b6000808211612524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b81838161252d57fe5b04905092915050565b60008060006125636064612555600c54876131c490919063ffffffff16565b6124ad90919063ffffffff16565b9050600061257a8286611c6d90919063ffffffff16565b90508082935093505050915091565b6000806000806125a285886131c490919063ffffffff16565b905060006125b986886131c490919063ffffffff16565b905060006125d08284611c6d90919063ffffffff16565b905082818395509550955050505093509350939050565b60008060008060006125f886611c15565b9450945094509450945061265486600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c6d90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506126e985600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c6d90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061277e84600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf090919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127cb838261324a565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b600080600080600061284b86611c15565b945094509450945094506128a785600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c6d90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061293c82600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf090919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506129d184600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf090919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a1e838261324a565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000806000612a9e86611c15565b94509450945094509450612afa85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c6d90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b8f84600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf090919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612bdc838261324a565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000806000612c5c86611c15565b94509450945094509450612cb886600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c6d90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612d4d85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c6d90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612de282600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf090919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e7784600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf090919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612ec4838261324a565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b600080600060075490506000600654905060005b60058054905081101561318757826001600060058481548110612f6657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061304d5750816002600060058481548110612fe557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561306457600754600654945094505050506131c0565b6130ed600160006005848154811061307857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484611c6d90919063ffffffff16565b9250613178600260006005848154811061310357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611c6d90919063ffffffff16565b91508080600101915050612f47565b5061319f6006546007546124ad90919063ffffffff16565b8210156131b7576007546006549350935050506131c0565b81819350935050505b9091565b6000808314156131d75760009050613244565b60008284029050828482816131e857fe5b041461323f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806133716021913960400191505060405180910390fd5b809150505b92915050565b61325f82600754611c6d90919063ffffffff16565b60078190555061327a81600854611cf090919063ffffffff16565b600881905550505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735b56616c69646174696f6e5d20666565732073686f756c64206265206c657373207468616e2032312e5b56616c69646174696f6e5d20666565732073686f756c642062652067726561746572207468616e207a65726f2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206c202e9f5ca13ee953ea8d023727fea33c1cc840b9c09ec10750d539582004b264736f6c634300060c00335b56616c69646174696f6e5d20666565732073686f756c64206265206c657373207468616e2032312e5b56616c69646174696f6e5d20666565732073686f756c642062652067726561746572207468616e207a65726f2e5b56616c69646174696f6e5d20696e6974616c20737570706c792073686f756c642062652067726561746572207468616e20305b56616c69646174696f6e5d206665652077616c6c657420616e64206f776e65722077616c6c65742063616e6e6f742062652073616d652e00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000075a5287ae81bd8f33b66e728c44c94f8660acf97000000000000000000000000b1bc5fac6a082f59c97f2989b3c31b5996d3a483000000000000000000000000000000000000000000000000000000000000000b527975752054656d706c6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045259555500000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

189:11634:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4448:376;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2231:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3242:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4353:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2508:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3411:313;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5274:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2417:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3732:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4832:434;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2710:198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1765:148:4;;;:::i;:::-;;1114:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2322::6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2615;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3958:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2916:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5879:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4235:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3091:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5535:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2068:244:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6043:478:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4448:376;4500:14;4517:12;:10;:12::i;:::-;4500:29;;4549:11;:19;4561:6;4549:19;;;;;;;;;;;;;;;;;;;;;;;;;4548:20;4540:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4629:15;4652:19;4663:7;4652:10;:19::i;:::-;4628:43;;;;;;4700:28;4720:7;4700;:15;4708:6;4700:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;4682:7;:15;4690:6;4682:15;;;;;;;;;;;;;;;:46;;;;4749:20;4761:7;4749;;:11;;:20;;;;:::i;:::-;4739:7;:30;;;;4793:23;4808:7;4793:10;;:14;;:23;;;;:::i;:::-;4780:10;:36;;;;4448:376;;;:::o;2231:83::-;2268:13;2301:5;2294:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2231:83;:::o;3242:161::-;3317:4;3334:39;3343:12;:10;:12::i;:::-;3357:7;3366:6;3334:8;:39::i;:::-;3391:4;3384:11;;3242:161;;;;:::o;4353:87::-;4395:7;4422:10;;4415:17;;4353:87;:::o;2508:95::-;2561:7;2588;;2581:14;;2508:95;:::o;3411:313::-;3509:4;3526:36;3536:6;3544:9;3555:6;3526:9;:36::i;:::-;3573:121;3582:6;3590:12;:10;:12::i;:::-;3604:89;3642:6;3604:89;;;;;;;;;;;;;;;;;:11;:19;3616:6;3604:19;;;;;;;;;;;;;;;:33;3624:12;:10;:12::i;:::-;3604:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;3573:8;:121::i;:::-;3712:4;3705:11;;3411:313;;;;;:::o;5274:253::-;5340:7;5379;;5368;:18;;5360:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5444:19;5467:10;:8;:10::i;:::-;5444:33;;5495:24;5507:11;5495:7;:11;;:24;;;;:::i;:::-;5488:31;;;5274:253;;;:::o;2417:83::-;2458:5;2483:9;;;;;;;;;;;2476:16;;2417:83;:::o;3732:218::-;3820:4;3837:83;3846:12;:10;:12::i;:::-;3860:7;3869:50;3908:10;3869:11;:25;3881:12;:10;:12::i;:::-;3869:25;;;;;;;;;;;;;;;:34;3895:7;3869:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;3837:8;:83::i;:::-;3938:4;3931:11;;3732:218;;;;:::o;4832:434::-;4922:7;4961;;4950;:18;;4942:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5020:17;5015:244;;5055:15;5078:19;5089:7;5078:10;:19::i;:::-;5054:43;;;;;;5119:7;5112:14;;;;;5015:244;5161:23;5191:19;5202:7;5191:10;:19::i;:::-;5159:51;;;;;;5232:15;5225:22;;;4832:434;;;;;:::o;2710:198::-;2776:7;2800:11;:20;2812:7;2800:20;;;;;;;;;;;;;;;;;;;;;;;;;2796:49;;;2829:7;:16;2837:7;2829:16;;;;;;;;;;;;;;;;2822:23;;;;2796:49;2863:37;2883:7;:16;2891:7;2883:16;;;;;;;;;;;;;;;;2863:19;:37::i;:::-;2856:44;;2710:198;;;;:::o;1765:148:4:-;1345:12;:10;:12::i;:::-;1334:23;;:7;:5;:7::i;:::-;:23;;;1326:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1872:1:::1;1835:40;;1856:6;::::0;::::1;;;;;;;;1835:40;;;;;;;;;;;;1903:1;1886:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1765:148::o:0;1114:87::-;1160:7;1187:6;;;;;;;;;;;1180:13;;1114:87;:::o;2322::6:-;2361:13;2394:7;2387:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2322:87;:::o;2615:::-;2652:7;2679:15;;2672:22;;2615:87;:::o;3958:269::-;4051:4;4068:129;4077:12;:10;:12::i;:::-;4091:7;4100:96;4139:15;4100:96;;;;;;;;;;;;;;;;;:11;:25;4112:12;:10;:12::i;:::-;4100:25;;;;;;;;;;;;;;;:34;4126:7;4100:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;4068:8;:129::i;:::-;4215:4;4208:11;;3958:269;;;;:::o;2916:167::-;2994:4;3011:42;3021:12;:10;:12::i;:::-;3035:9;3046:6;3011:9;:42::i;:::-;3071:4;3064:11;;2916:167;;;;:::o;5879:156::-;1345:12:4;:10;:12::i;:::-;1334:23;;:7;:5;:7::i;:::-;:23;;;1326:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5968:14:6::1;1173:1;1166:4;:8;1158:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1251:2;1244:4;:9;1236:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6013:14:::2;5995:15;:32;;;;1405:1:4::1;5879:156:6::0;:::o;4235:110::-;4293:4;4317:11;:20;4329:7;4317:20;;;;;;;;;;;;;;;;;;;;;;;;;4310:27;;4235:110;;;:::o;3091:143::-;3172:7;3199:11;:18;3211:5;3199:18;;;;;;;;;;;;;;;:27;3218:7;3199:27;;;;;;;;;;;;;;;;3192:34;;3091:143;;;;:::o;5535:332::-;1345:12:4;:10;:12::i;:::-;1334:23;;:7;:5;:7::i;:::-;:23;;;1326:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5617:11:6::1;:20;5629:7;5617:20;;;;;;;;;;;;;;;;;;;;;;;;;5616:21;5608:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;5702:1;5683:7;:16;5691:7;5683:16;;;;;;;;;;;;;;;;:20;5680:108;;;5739:37;5759:7;:16;5767:7;5759:16;;;;;;;;;;;;;;;;5739:19;:37::i;:::-;5720:7;:16;5728:7;5720:16;;;;;;;;;;;;;;;:56;;;;5680:108;5821:4;5798:11;:20;5810:7;5798:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;5836:9;5851:7;5836:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5535:332:::0;:::o;2068:244:4:-;1345:12;:10;:12::i;:::-;1334:23;;:7;:5;:7::i;:::-;:23;;;1326:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2177:1:::1;2157:22;;:8;:22;;;;2149:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2267:8;2238:38;;2259:6;::::0;::::1;;;;;;;;2238:38;;;;;;;;;;;;2296:8;2287:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;2068:244:::0;:::o;6043:478:6:-;1345:12:4;:10;:12::i;:::-;1334:23;;:7;:5;:7::i;:::-;:23;;;1326:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6124:11:6::1;:20;6136:7;6124:20;;;;;;;;;;;;;;;;;;;;;;;;;6116:60;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;6192:9;6187:327;6211:9;:16;;;;6207:1;:20;6187:327;;;6269:7;6253:23;;:9;6263:1;6253:12;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;6249:254;;;6312:9;6341:1;6322:9;:16;;;;:20;6312:31;;;;;;;;;;;;;;;;;;;;;;;;;6297:9;6307:1;6297:12;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;6381:1;6362:7;:16;6370:7;6362:16;;;;;;;;;;;;;;;:20;;;;6424:5;6401:11;:20;6413:7;6401:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;6448:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6482:5;;6249:254;6229:3;;;;;;;6187:327;;;;6043:478:::0;:::o;613:106:1:-;666:15;701:10;694:17;;613:106;:::o;10075:411:6:-;10134:7;10143;10152;10161;10170;10191:23;10216:12;10232:20;10244:7;10232:11;:20::i;:::-;10190:62;;;;10263:19;10286:10;:8;:10::i;:::-;10263:33;;10308:15;10325:23;10350:12;10366:39;10378:7;10387:4;10393:11;10366;:39::i;:::-;10307:98;;;;;;10424:7;10433:15;10450:4;10456:15;10473:4;10416:62;;;;;;;;;;;;;;;;10075:411;;;;;;;:::o;3236:158:5:-;3294:7;3327:1;3322;:6;;3314:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3385:1;3381;:5;3374:12;;3236:158;;;;:::o;2774:179::-;2832:7;2852:9;2868:1;2864;:5;2852:17;;2893:1;2888;:6;;2880:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2944:1;2937:8;;;2774:179;;;;:::o;6529:337:6:-;6639:1;6622:19;;:5;:19;;;;6614:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6720:1;6701:21;;:7;:21;;;;6693:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6804:6;6774:11;:18;6786:5;6774:18;;;;;;;;;;;;;;;:27;6793:7;6774:27;;;;;;;;;;;;;;;:36;;;;6842:7;6826:32;;6835:5;6826:32;;;6851:6;6826:32;;;;;;;;;;;;;;;;;;6529:337;;;:::o;6874:931::-;6989:1;6971:20;;:6;:20;;;;6963:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7073:1;7052:23;;:9;:23;;;;7044:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7143:1;7134:6;:10;7126:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7205:11;:19;7217:6;7205:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;7229:11;:22;7241:9;7229:22;;;;;;;;;;;;;;;;;;;;;;;;;7228:23;7205:46;7201:597;;;7268:48;7290:6;7298:9;7309:6;7268:21;:48::i;:::-;7201:597;;;7339:11;:19;7351:6;7339:19;;;;;;;;;;;;;;;;;;;;;;;;;7338:20;:46;;;;;7362:11;:22;7374:9;7362:22;;;;;;;;;;;;;;;;;;;;;;;;;7338:46;7334:464;;;7401:46;7421:6;7429:9;7440:6;7401:19;:46::i;:::-;7334:464;;;7470:11;:19;7482:6;7470:19;;;;;;;;;;;;;;;;;;;;;;;;;7469:20;:47;;;;;7494:11;:22;7506:9;7494:22;;;;;;;;;;;;;;;;;;;;;;;;;7493:23;7469:47;7465:333;;;7533:44;7551:6;7559:9;7570:6;7533:17;:44::i;:::-;7465:333;;;7599:11;:19;7611:6;7599:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;7622:11;:22;7634:9;7622:22;;;;;;;;;;;;;;;;;;;;;;;;;7599:45;7595:203;;;7661:48;7683:6;7691:9;7702:6;7661:21;:48::i;:::-;7595:203;;;7742:44;7760:6;7768:9;7779:6;7742:17;:44::i;:::-;7595:203;7465:333;7334:464;7201:597;6874:931;;;:::o;5601:166:5:-;5687:7;5720:1;5715;:6;;5723:12;5707:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5758:1;5754;:5;5747:12;;5601:166;;;;;:::o;11088:163:6:-;11129:7;11150:15;11167;11186:19;:17;:19::i;:::-;11149:56;;;;11223:20;11235:7;11223;:11;;:20;;;;:::i;:::-;11216:27;;;;11088:163;:::o;4351:153:5:-;4409:7;4441:1;4437;:5;4429:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4495:1;4491;:5;;;;;;4484:12;;4351:153;;;;:::o;10494:244:6:-;10554:7;10563;10583:12;10598:37;10631:3;10598:28;10610:15;;10598:7;:11;;:28;;;;:::i;:::-;:32;;:37;;;;:::i;:::-;10583:52;;10646:23;10672:17;10684:4;10672:7;:11;;:17;;;;:::i;:::-;10646:43;;10708:15;10725:4;10700:30;;;;;;10494:244;;;:::o;10746:334::-;10841:7;10850;10859;10879:15;10897:24;10909:11;10897:7;:11;;:24;;;;:::i;:::-;10879:42;;10932:12;10947:21;10956:11;10947:4;:8;;:21;;;;:::i;:::-;10932:36;;10979:23;11005:17;11017:4;11005:7;:11;;:17;;;;:::i;:::-;10979:43;;11041:7;11050:15;11067:4;11033:39;;;;;;;;;10746:334;;;;;;;:::o;8810:509::-;8913:15;8930:23;8955:12;8969:23;8994:12;9010:19;9021:7;9010:10;:19::i;:::-;8912:117;;;;;;;;;;9058:28;9078:7;9058;:15;9066:6;9058:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;9040:7;:15;9048:6;9040:15;;;;;;;;;;;;;;;:46;;;;9115:28;9135:7;9115;:15;9123:6;9115:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;9097:7;:15;9105:6;9097:15;;;;;;;;;;;;;;;:46;;;;9175:39;9198:15;9175:7;:18;9183:9;9175:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;9154:7;:18;9162:9;9154:18;;;;;;;;;;;;;;;:60;;;;9228:23;9240:4;9246;9228:11;:23::i;:::-;9284:9;9267:44;;9276:6;9267:44;;;9295:15;9267:44;;;;;;;;;;;;;;;;;;8810:509;;;;;;;;:::o;8273:529::-;8374:15;8391:23;8416:12;8430:23;8455:12;8471:19;8482:7;8471:10;:19::i;:::-;8373:117;;;;;;;;;;8519:28;8539:7;8519;:15;8527:6;8519:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;8501:7;:15;8509:6;8501:15;;;;;;;;;;;;;;;:46;;;;8579:39;8602:15;8579:7;:18;8587:9;8579:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;8558:7;:18;8566:9;8558:18;;;;;;;;;;;;;;;:60;;;;8650:39;8673:15;8650:7;:18;8658:9;8650:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;8629:7;:18;8637:9;8629:18;;;;;;;;;;;;;;;:60;;;;8711:23;8723:4;8729;8711:11;:23::i;:::-;8767:9;8750:44;;8759:6;8750:44;;;8778:15;8750:44;;;;;;;;;;;;;;;;;;8273:529;;;;;;;;:::o;7813:452::-;7912:15;7929:23;7954:12;7968:23;7993:12;8009:19;8020:7;8009:10;:19::i;:::-;7911:117;;;;;;;;;;8057:28;8077:7;8057;:15;8065:6;8057:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;8039:7;:15;8047:6;8039:15;;;;;;;;;;;;;;;:46;;;;8117:39;8140:15;8117:7;:18;8125:9;8117:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;8096:7;:18;8104:9;8096:18;;;;;;;;;;;;;;;:60;;;;8174:23;8186:4;8192;8174:11;:23::i;:::-;8230:9;8213:44;;8222:6;8213:44;;;8241:15;8213:44;;;;;;;;;;;;;;;;;;7813:452;;;;;;;;:::o;9327:585::-;9430:15;9447:23;9472:12;9486:23;9511:12;9527:19;9538:7;9527:10;:19::i;:::-;9429:117;;;;;;;;;;9575:28;9595:7;9575;:15;9583:6;9575:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;9557:7;:15;9565:6;9557:15;;;;;;;;;;;;;;;:46;;;;9632:28;9652:7;9632;:15;9640:6;9632:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;9614:7;:15;9622:6;9614:15;;;;;;;;;;;;;;;:46;;;;9692:39;9715:15;9692:7;:18;9700:9;9692:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;9671:7;:18;9679:9;9671:18;;;;;;;;;;;;;;;:60;;;;9763:39;9786:15;9763:7;:18;9771:9;9763:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;9742:7;:18;9750:9;9742:18;;;;;;;;;;;;;;;:60;;;;9821:23;9833:4;9839;9821:11;:23::i;:::-;9877:9;9860:44;;9869:6;9860:44;;;9888:15;9860:44;;;;;;;;;;;;;;;;;;9327:585;;;;;;;;:::o;11259:561::-;11309:7;11318;11338:15;11356:7;;11338:25;;11374:15;11392:7;;11374:25;;11421:9;11416:289;11440:9;:16;;;;11436:1;:20;11416:289;;;11506:7;11482;:21;11490:9;11500:1;11490:12;;;;;;;;;;;;;;;;;;;;;;;;;11482:21;;;;;;;;;;;;;;;;:31;:66;;;;11541:7;11517;:21;11525:9;11535:1;11525:12;;;;;;;;;;;;;;;;;;;;;;;;;11517:21;;;;;;;;;;;;;;;;:31;11482:66;11478:97;;;11558:7;;11567;;11550:25;;;;;;;;;11478:97;11600:34;11612:7;:21;11620:9;11630:1;11620:12;;;;;;;;;;;;;;;;;;;;;;;;;11612:21;;;;;;;;;;;;;;;;11600:7;:11;;:34;;;;:::i;:::-;11590:44;;11659:34;11671:7;:21;11679:9;11689:1;11679:12;;;;;;;;;;;;;;;;;;;;;;;;;11671:21;;;;;;;;;;;;;;;;11659:7;:11;;:34;;;;:::i;:::-;11649:44;;11458:3;;;;;;;11416:289;;;;11729:20;11741:7;;11729;;:11;;:20;;;;:::i;:::-;11719:7;:30;11715:61;;;11759:7;;11768;;11751:25;;;;;;;;11715:61;11795:7;11804;11787:25;;;;;;11259:561;;;:::o;3653:220:5:-;3711:7;3740:1;3735;:6;3731:20;;;3750:1;3743:8;;;;3731:20;3762:9;3778:1;3774;:5;3762:17;;3807:1;3802;3798;:5;;;;;;:10;3790:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3864:1;3857:8;;;3653:220;;;;;:::o;9920:147:6:-;9998:17;10010:4;9998:7;;:11;;:17;;;;:::i;:::-;9988:7;:27;;;;10039:20;10054:4;10039:10;;:14;;:20;;;;:::i;:::-;10026:10;:33;;;;9920:147;;:::o

Swarm Source

ipfs://6c202e9f5ca13ee953ea8d023727fea33c1cc840b9c09ec10750d539582004b2

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.