Token Magnet

DAO  

Overview ERC20

Price
$0.01 @ 0.000603 AVAX
Fully Diluted Market Cap
Total Supply:
3,831,280.878131 MAG

Holders:
627 addresses

Transfers:
-

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
MagERC20Token

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-02
*/

// File: contracts/lib/SafeMath.sol

// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

//u32
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function add32(uint32 a, uint32 b) internal pure returns (uint32) {
        uint32 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

    function sub32(uint32 a, uint32 b) internal pure returns (uint32) {
        return sub32(a, b, "SafeMath: subtraction overflow");
    }

    function sub32(
        uint32 a,
        uint32 b,
        string memory errorMessage
    ) internal pure returns (uint32) {
        require(b <= a, errorMessage);
        uint32 c = a - b;

        return c;
    }

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

    function mul32(uint32 a, uint32 b) internal pure returns (uint32) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

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

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

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

    function sqrrt(uint256 a) internal pure returns (uint256 c) {
        if (a > 3) {
            c = a;
            uint256 b = add(div(a, 2), 1);
            while (b < c) {
                c = b;
                b = div(add(div(a, b), b), 2);
            }
        } else if (a != 0) {
            c = 1;
        }
    }

    /*
     * Expects percentage to be trailed by 00,
     */
    function percentageAmount(uint256 total_, uint8 percentage_)
        internal
        pure
        returns (uint256 percentAmount_)
    {
        return div(mul(total_, percentage_), 1000);
    }

    /*
     * Expects percentage to be trailed by 00,
     */
    function substractPercentage(uint256 total_, uint8 percentageToSub_)
        internal
        pure
        returns (uint256 result_)
    {
        return sub(total_, div(mul(total_, percentageToSub_), 1000));
    }

    function percentageOfTotal(uint256 part_, uint256 total_)
        internal
        pure
        returns (uint256 percent_)
    {
        return div(mul(part_, 100), total_);
    }

    /**
     * Taken from Hypersonic https://github.com/M2629/HyperSonic/blob/main/Math.sol
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2);
    }

    function quadraticPricing(uint256 payment_, uint256 multiplier_)
        internal
        pure
        returns (uint256)
    {
        return sqrrt(mul(multiplier_, payment_));
    }

    function bondingCurve(uint256 supply_, uint256 multiplier_)
        internal
        pure
        returns (uint256)
    {
        return mul(multiplier_, supply_);
    }
}

// File: contracts/lib/Counters.sol

pragma solidity 0.7.5;


library Counters {
    using SafeMath for uint256;

    struct Counter {
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

// File: contracts/lib/ERC20.sol

pragma solidity 0.7.5;


interface IERC20 {
    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

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

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

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

contract ERC20 is IERC20 {
    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 private constant ERC20TOKEN_ERC1820_INTERFACE_ID =
        keccak256("ERC20Token");

    mapping(address => uint256) internal _balances;

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

    uint256 internal _totalSupply;

    string internal _name;

    string internal _symbol;

    uint8 internal _decimals;

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _mint(address account_, uint256 ammount_) internal virtual {
        require(account_ != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(this), account_, ammount_);
        _totalSupply = _totalSupply.add(ammount_);
        _balances[account_] = _balances[account_].add(ammount_);
        emit Transfer(address(this), account_, ammount_);
    }

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

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

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

    function _beforeTokenTransfer(
        address from_,
        address to_,
        uint256 amount_
    ) internal virtual {}
}

// File: contracts/lib/ERC20Permit.sol

pragma solidity 0.7.5;



interface IERC2612Permit {
    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

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

abstract contract ERC20Permit is ERC20, IERC2612Permit {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH =
        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    bytes32 public DOMAIN_SEPARATOR;

    constructor() {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256(
                    "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                ),
                keccak256(bytes(name())),
                keccak256(bytes("1")), // Version
                chainID,
                address(this)
            )
        );
    }

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "Permit: expired deadline");

        bytes32 hashStruct = keccak256(
            abi.encode(
                PERMIT_TYPEHASH,
                owner,
                spender,
                amount,
                _nonces[owner].current(),
                deadline
            )
        );

        bytes32 _hash = keccak256(
            abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct)
        );

        address signer = ecrecover(_hash, v, r, s);
        require(
            signer != address(0) && signer == owner,
            "ZeroSwapPermit: Invalid signature"
        );

        _nonces[owner].increment();
        _approve(owner, spender, amount);
    }

    function nonces(address owner) public view override returns (uint256) {
        return _nonces[owner].current();
    }
}

// File: contracts/lib/Ownable.sol

pragma solidity 0.7.5;

interface IOwnable {
    function policy() external view returns (address);

    function renounceManagement() external;

    function pushManagement(address newOwner_) external;

    function pullManagement() external;
}

contract Ownable is IOwnable {
    address internal _owner;
    address internal _newOwner;

    event OwnershipPushed(
        address indexed previousOwner,
        address indexed newOwner
    );
    event OwnershipPulled(
        address indexed previousOwner,
        address indexed newOwner
    );

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

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

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

    function renounceManagement() public virtual override onlyManager {
        emit OwnershipPushed(_owner, address(0));
        _owner = address(0);
    }

    function pushManagement(address newOwner_)
        public
        virtual
        override
        onlyManager
    {
        require(
            newOwner_ != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipPushed(_owner, newOwner_);
        _newOwner = newOwner_;
    }

    function pullManagement() public virtual override {
        require(msg.sender == _newOwner, "Ownable: must be new owner to pull");
        emit OwnershipPulled(_owner, _newOwner);
        _owner = _newOwner;
    }
}

// File: contracts/MagERC20.sol

pragma solidity 0.7.5;






contract VaultOwned is Ownable {
    address internal _vault;

    function setVault(address vault_) external onlyManager returns (bool) {
        _vault = vault_;

        return true;
    }

    function vault() public view returns (address) {
        return _vault;
    }

    modifier onlyVault() {
        require(_vault == msg.sender, "VaultOwned: caller is not the Vault");
        _;
    }
}

contract MagERC20Token is ERC20Permit, VaultOwned {
    using SafeMath for uint256;

    constructor() ERC20("Magnet", "MAG", 9) {}

    function mint(address account_, uint256 amount_) external onlyVault {
        _mint(account_, amount_);
    }

    function burn(uint256 amount) public virtual {
        _burn(msg.sender, amount);
    }

    function burnFrom(address account_, uint256 amount_) public virtual {
        _burnFrom(account_, amount_);
    }

    function _burnFrom(address account_, uint256 amount_) public virtual {
        uint256 decreasedAllowance_ = allowance(account_, msg.sender).sub(
            amount_,
            "ERC20: burn amount exceeds allowance"
        );

        _approve(account_, msg.sender, decreasedAllowance_);
        _burn(account_, amount_);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","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":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"_burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_","type":"address"}],"name":"setVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405180604001604052806006815260200165135859db995d60d21b815250604051806040016040528060038152602001624d414760e81b815250600982600390805190602001906200006792919062000228565b5081516200007d90600490602085019062000228565b506005805460ff191660ff92909216919091179055504690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c16200018e565b805160209182012060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606084015260808301939093523060a0808401919091528351808403909101815260c0909201928390528151910120600755600880546001600160a01b0319163317908190556001600160a01b0316906000907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a3620002d4565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200021e5780601f10620001f2576101008083540402835291602001916200021e565b820191906000526020600020905b8154815290600101906020018083116200020057829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620002605760008555620002ab565b82601f106200027b57805160ff1916838001178555620002ab565b82800160010185558215620002ab579182015b82811115620002ab5782518255916020019190600101906200028e565b50620002b9929150620002bd565b5090565b5b80821115620002b95760008155600101620002be565b61156880620002e46000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806346f68ee9116100de57806395d89b4111610097578063a9059cbb11610071578063a9059cbb14610482578063d505accf146104ae578063dd62ed3e146104ff578063fbfa77cf1461052d57610173565b806395d89b4114610422578063a22b35ce1461042a578063a457c2d71461045657610173565b806346f68ee9146103565780635a96ac0a1461037c5780636817031b1461038457806370a08231146103aa57806379cc6790146103d05780637ecebe00146103fc57610173565b806330adf81f1161013057806330adf81f146102b3578063313ce567146102bb5780633644e515146102d957806339509351146102e157806340c10f191461030d57806342966c681461033957610173565b80630505c8c91461017857806306fdde031461019c578063089208d814610219578063095ea7b31461022357806318160ddd1461026357806323b872dd1461027d575b600080fd5b610180610535565b604080516001600160a01b039092168252519081900360200190f35b6101a4610544565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101de5781810151838201526020016101c6565b50505050905090810190601f16801561020b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102216105da565b005b61024f6004803603604081101561023957600080fd5b506001600160a01b038135169060200135610683565b604080519115158252519081900360200190f35b61026b610699565b60408051918252519081900360200190f35b61024f6004803603606081101561029357600080fd5b506001600160a01b0381358116916020810135909116906040013561069f565b61026b610708565b6102c361072c565b6040805160ff9092168252519081900360200190f35b61026b610735565b61024f600480360360408110156102f757600080fd5b506001600160a01b03813516906020013561073b565b6102216004803603604081101561032357600080fd5b506001600160a01b038135169060200135610771565b6102216004803603602081101561034f57600080fd5b50356107c8565b6102216004803603602081101561036c57600080fd5b50356001600160a01b03166107d5565b6102216108d5565b61024f6004803603602081101561039a57600080fd5b50356001600160a01b0316610981565b61026b600480360360208110156103c057600080fd5b50356001600160a01b0316610a08565b610221600480360360408110156103e657600080fd5b506001600160a01b038135169060200135610a23565b61026b6004803603602081101561041257600080fd5b50356001600160a01b0316610a2d565b6101a4610a54565b6102216004803603604081101561044057600080fd5b506001600160a01b038135169060200135610ab5565b61024f6004803603604081101561046c57600080fd5b506001600160a01b038135169060200135610b01565b61024f6004803603604081101561049857600080fd5b506001600160a01b038135169060200135610b50565b610221600480360360e08110156104c457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610b5d565b61026b6004803603604081101561051557600080fd5b506001600160a01b0381358116916020013516610d8a565b610180610db5565b6008546001600160a01b031690565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105d05780601f106105a5576101008083540402835291602001916105d0565b820191906000526020600020905b8154815290600101906020018083116105b357829003601f168201915b5050505050905090565b6008546001600160a01b03163314610639576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6008546040516000916001600160a01b0316907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600880546001600160a01b0319169055565b6000610690338484610dc4565b50600192915050565b60025490565b60006106ac848484610eb0565b6106fe84336106f985604051806060016040528060288152602001611435602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061100b565b610dc4565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055460ff1690565b60075481565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106909185906106f990866110a2565b600a546001600160a01b031633146107ba5760405162461bcd60e51b815260040180806020018281038252602381526020018061145d6023913960400191505060405180910390fd5b6107c48282611103565b5050565b6107d233826111f3565b50565b6008546001600160a01b03163314610834576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166108795760405162461bcd60e51b81526004018080602001828103825260268152602001806113846026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461091e5760405162461bcd60e51b81526004018080602001828103825260228152602001806113f26022913960400191505060405180910390fd5b6009546008546040516001600160a01b0392831692909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d90600090a3600954600880546001600160a01b0319166001600160a01b03909216919091179055565b6008546000906001600160a01b031633146109e3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b50600a80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b031660009081526020819052604090205490565b6107c48282610ab5565b6001600160a01b0381166000908152600660205260408120610a4e906112ef565b92915050565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105d05780601f106105a5576101008083540402835291602001916105d0565b6000610ae58260405180606001604052806024815260200161148060249139610ade8633610d8a565b919061100b565b9050610af2833383610dc4565b610afc83836111f3565b505050565b600061069033846106f98560405180606001604052806025815260200161150e602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061100b565b6000610690338484610eb0565b83421115610bb2576040805162461bcd60e51b815260206004820152601860248201527f5065726d69743a206578706972656420646561646c696e650000000000000000604482015290519081900360640190fd5b6001600160a01b03871660009081526006602052604081207f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c990899089908990610bfb906112ef565b604080516020808201979097526001600160a01b0395861681830152939094166060840152608083019190915260a082015260c08082018990528251808303909101815260e08201835280519084012060075461190160f01b610100840152610102830152610122808301829052835180840390910181526101428301808552815191860191909120600091829052610162840180865281905260ff8a166101828501526101a284018990526101c28401889052935191955092936001926101e280820193601f1981019281900390910190855afa158015610ce1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610d175750896001600160a01b0316816001600160a01b0316145b610d525760405162461bcd60e51b81526004018080602001828103825260218152602001806114146021913960400191505060405180910390fd5b6001600160a01b038a166000908152600660205260409020610d73906112f3565b610d7e8a8a8a610dc4565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a546001600160a01b031690565b6001600160a01b038316610e095760405162461bcd60e51b81526004018080602001828103825260248152602001806114ea6024913960400191505060405180910390fd5b6001600160a01b038216610e4e5760405162461bcd60e51b81526004018080602001828103825260228152602001806113aa6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610ef55760405162461bcd60e51b81526004018080602001828103825260258152602001806114c56025913960400191505060405180910390fd5b6001600160a01b038216610f3a5760405162461bcd60e51b815260040180806020018281038252602381526020018061133f6023913960400191505060405180910390fd5b610f45838383610afc565b610f82816040518060600160405280602681526020016113cc602691396001600160a01b038616600090815260208190526040902054919061100b565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610fb190826110a2565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561109a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561105f578181015183820152602001611047565b50505050905090810190601f16801561108c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156110fc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661115e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611169308383610afc565b60025461117690826110a2565b6002556001600160a01b03821660009081526020819052604090205461119c90826110a2565b6001600160a01b038316600081815260208181526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166112385760405162461bcd60e51b81526004018080602001828103825260218152602001806114a46021913960400191505060405180910390fd5b61124482600083610afc565b61128181604051806060016040528060228152602001611362602291396001600160a01b038516600090815260208190526040902054919061100b565b6001600160a01b0383166000908152602081905260409020556002546112a790826112fc565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b80546001019055565b60006110fc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061100b56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c5a65726f537761705065726d69743a20496e76616c6964207369676e617475726545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655661756c744f776e65643a2063616c6c6572206973206e6f7420746865205661756c7445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202f9a7a0c334f2b2154028abb67d2bb00bad6082e8398007557331cb8d51c5aea64736f6c63430007050033

Deployed ByteCode Sourcemap

15521:822:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14078:89;;;:::i;:::-;;;;-1:-1:-1;;;;;14078:89:0;;;;;;;;;;;;;;6522:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14302:155;;;:::i;:::-;;7532:208;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7532:208:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6808:100;;;:::i;:::-;;;;;;;;;;;;;;;;7748:450;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7748:450:0;;;;;;;;;;;;;;;;;:::i;11568:117::-;;;:::i;6708:92::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11694:31;;;:::i;8206:296::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8206:296:0;;;;;;;;:::i;15663:111::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15663:111:0;;;;;;;;:::i;15782:89::-;;;;;;;;;;;;;;;;-1:-1:-1;15782:89:0;;:::i;14465:332::-;;;;;;;;;;;;;;;;-1:-1:-1;14465:332:0;-1:-1:-1;;;;;14465:332:0;;:::i;14805:218::-;;;:::i;15171:128::-;;;;;;;;;;;;;;;;-1:-1:-1;15171:128:0;-1:-1:-1;;;;;15171:128:0;;:::i;6916:177::-;;;;;;;;;;;;;;;;-1:-1:-1;6916:177:0;-1:-1:-1;;;;;6916:177:0;;:::i;15879:115::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15879:115:0;;;;;;;;:::i;13220:120::-;;;;;;;;;;;;;;;;-1:-1:-1;13220:120:0;-1:-1:-1;;;;;13220:120:0;;:::i;6613:87::-;;;:::i;16002:338::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16002:338:0;;;;;;;;:::i;8510:396::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8510:396:0;;;;;;;;:::i;7101:214::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7101:214:0;;;;;;;;:::i;12253:959::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12253:959:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7323:201::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7323:201:0;;;;;;;;;;:::i;15307:79::-;;;:::i;14078:89::-;14153:6;;-1:-1:-1;;;;;14153:6:0;14078:89;:::o;6522:83::-;6592:5;6585:12;;;;;;;;-1:-1:-1;;6585:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6559:13;;6585:12;;6592:5;;6585:12;;6592:5;6585:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6522:83;:::o;14302:155::-;14217:6;;-1:-1:-1;;;;;14217:6:0;14227:10;14217:20;14209:65;;;;;-1:-1:-1;;;14209:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14400:6:::1;::::0;14384:35:::1;::::0;14416:1:::1;::::0;-1:-1:-1;;;;;14400:6:0::1;::::0;14384:35:::1;::::0;14416:1;;14384:35:::1;14430:6;:19:::0;;-1:-1:-1;;;;;;14430:19:0::1;::::0;;14302:155::o;7532:208::-;7651:4;7673:37;7682:10;7694:7;7703:6;7673:8;:37::i;:::-;-1:-1:-1;7728:4:0;7532:208;;;;:::o;6808:100::-;6888:12;;6808:100;:::o;7748:450::-;7888:4;7905:36;7915:6;7923:9;7934:6;7905:9;:36::i;:::-;7952:216;7975:6;7996:10;8021:136;8075:6;8021:136;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8021:19:0;;;;;;:11;:19;;;;;;;;8041:10;8021:31;;;;;;;;;:136;:35;:136::i;:::-;7952:8;:216::i;:::-;-1:-1:-1;8186:4:0;7748:450;;;;;:::o;11568:117::-;11619:66;11568:117;:::o;6708:92::-;6783:9;;;;6708:92;:::o;11694:31::-;;;;:::o;8206:296::-;8366:10;8321:4;8413:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;8413:32:0;;;;;;;;;;8321:4;;8343:129;;8391:7;;8413:48;;8450:10;8413:36;:48::i;15663:111::-;15434:6;;-1:-1:-1;;;;;15434:6:0;15444:10;15434:20;15426:68;;;;-1:-1:-1;;;15426:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15742:24:::1;15748:8;15758:7;15742:5;:24::i;:::-;15663:111:::0;;:::o;15782:89::-;15838:25;15844:10;15856:6;15838:5;:25::i;:::-;15782:89;:::o;14465:332::-;14217:6;;-1:-1:-1;;;;;14217:6:0;14227:10;14217:20;14209:65;;;;;-1:-1:-1;;;14209:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14618:23:0;::::1;14596:111;;;;-1:-1:-1::0;;;14596:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14739:6;::::0;14723:34:::1;::::0;-1:-1:-1;;;;;14723:34:0;;::::1;::::0;14739:6:::1;::::0;14723:34:::1;::::0;14739:6:::1;::::0;14723:34:::1;14768:9;:21:::0;;-1:-1:-1;;;;;;14768:21:0::1;-1:-1:-1::0;;;;;14768:21:0;;;::::1;::::0;;;::::1;::::0;;14465:332::o;14805:218::-;14888:9;;-1:-1:-1;;;;;14888:9:0;14874:10;:23;14866:70;;;;-1:-1:-1;;;14866:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14976:9;;14968:6;;14952:34;;-1:-1:-1;;;;;14976:9:0;;;;14968:6;;;;14952:34;;14976:9;;14952:34;15006:9;;14997:6;:18;;-1:-1:-1;;;;;;14997:18:0;-1:-1:-1;;;;;15006:9:0;;;14997:18;;;;;;14805:218::o;15171:128::-;14217:6;;15235:4;;-1:-1:-1;;;;;14217:6:0;14227:10;14217:20;14209:65;;;;;-1:-1:-1;;;14209:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15252:6:0::1;:15:::0;;-1:-1:-1;;;;;15252:15:0;::::1;-1:-1:-1::0;;;;;;15252:15:0;;::::1;;::::0;;;15171:128;;;:::o;6916:177::-;-1:-1:-1;;;;;7067:18:0;7035:7;7067:18;;;;;;;;;;;;6916:177::o;15879:115::-;15958:28;15968:8;15978:7;15958:9;:28::i;13220:120::-;-1:-1:-1;;;;;13308:14:0;;13281:7;13308:14;;;:7;:14;;;;;:24;;:22;:24::i;:::-;13301:31;13220:120;-1:-1:-1;;13220:120:0:o;6613:87::-;6685:7;6678:14;;;;;;;;-1:-1:-1;;6678:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6652:13;;6678:14;;6685:7;;6678:14;;6685:7;6678:14;;;;;;;;;;;;;;;;;;;;;;;;16002:338;16082:27;16112:121;16162:7;16112:121;;;;;;;;;;;;;;;;;:31;16122:8;16132:10;16112:9;:31::i;:::-;:35;:121;:35;:121::i;:::-;16082:151;;16246:51;16255:8;16265:10;16277:19;16246:8;:51::i;:::-;16308:24;16314:8;16324:7;16308:5;:24::i;:::-;16002:338;;;:::o;8510:396::-;8630:4;8652:224;8675:10;8700:7;8722:143;8777:15;8722:143;;;;;;;;;;;;;;;;;8734:10;8722:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;8722:32:0;;;;;;;;;;;:143;:36;:143::i;7101:214::-;7223:4;7245:40;7255:10;7267:9;7278:6;7245:9;:40::i;12253:959::-;12498:8;12479:15;:27;;12471:64;;;;;-1:-1:-1;;;12471:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12731:14:0;;12548:18;12731:14;;;:7;:14;;;;;11619:66;;12656:5;;12680:7;;12706:6;;12731:24;;:22;:24::i;:::-;12593:204;;;;;;;;;;;-1:-1:-1;;;;;12593:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12569:239;;;;;;12894:16;;-1:-1:-1;;;12861:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12837:97;;;;;;;;;-1:-1:-1;12964:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12569:239;;-1:-1:-1;12837:97:0;;12964:25;;;;;;;-1:-1:-1;;12964:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12964:25:0;;-1:-1:-1;;12964:25:0;;;-1:-1:-1;;;;;;;13022:20:0;;;;;;:39;;;13056:5;-1:-1:-1;;;;;13046:15:0;:6;-1:-1:-1;;;;;13046:15:0;;13022:39;13000:122;;;;-1:-1:-1;;;13000:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13135:14:0;;;;;;:7;:14;;;;;:26;;:24;:26::i;:::-;13172:32;13181:5;13188:7;13197:6;13172:8;:32::i;:::-;12253:959;;;;;;;;;;:::o;7323:201::-;-1:-1:-1;;;;;7489:18:0;;;7457:7;7489:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7323:201::o;15307:79::-;15372:6;;-1:-1:-1;;;;;15372:6:0;15307:79;:::o;10399:380::-;-1:-1:-1;;;;;10535:19:0;;10527:68;;;;-1:-1:-1;;;10527:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10614:21:0;;10606:68;;;;-1:-1:-1;;;10606:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10687:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10739:32;;;;;;;;;;;;;;;;;10399:380;;;:::o;8914:610::-;-1:-1:-1;;;;;9054:20:0;;9046:70;;;;-1:-1:-1;;;9046:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9135:23:0;;9127:71;;;;-1:-1:-1;;;9127:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9211:47;9232:6;9240:9;9251:6;9211:20;:47::i;:::-;9291:108;9327:6;9291:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9291:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;9271:17:0;;;:9;:17;;;;;;;;;;;:128;;;;9433:20;;;;;;;:32;;9458:6;9433:24;:32::i;:::-;-1:-1:-1;;;;;9410:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;9481:35;;;;;;;9410:20;;9481:35;;;;;;;;;;;;;8914:610;;;:::o;663:226::-;783:7;819:12;811:6;;;;803:29;;;;-1:-1:-1;;;803:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;855:5:0;;;663:226::o;143:181::-;201:7;233:5;;;257:6;;;;249:46;;;;;-1:-1:-1;;;249:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;315:1;143:181;-1:-1:-1;;;143:181:0:o;9532:396::-;-1:-1:-1;;;;;9619:22:0;;9611:66;;;;;-1:-1:-1;;;9611:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9688:55;9717:4;9724:8;9734;9688:20;:55::i;:::-;9769:12;;:26;;9786:8;9769:16;:26::i;:::-;9754:12;:41;-1:-1:-1;;;;;9828:19:0;;:9;:19;;;;;;;;;;;:33;;9852:8;9828:23;:33::i;:::-;-1:-1:-1;;;;;9806:19:0;;:9;:19;;;;;;;;;;;;:55;;;;9877:43;;;;;;;9806:19;;9894:4;;9877:43;;;;;;;;;;9532:396;;:::o;9936:455::-;-1:-1:-1;;;;;10020:21:0;;10012:67;;;;-1:-1:-1;;;10012:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10092:49;10113:7;10130:1;10134:6;10092:20;:49::i;:::-;10175:105;10212:6;10175:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10175:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;10154:18:0;;:9;:18;;;;;;;;;;:126;10306:12;;:24;;10323:6;10306:16;:24::i;:::-;10291:12;:39;10346:37;;;;;;;;10372:1;;-1:-1:-1;;;;;10346:37:0;;;;;;;;;;;;9936:455;;:::o;4579:114::-;4671:14;;4579:114::o;4701:91::-;4765:19;;4783:1;4765:19;;;4701:91::o;519:136::-;577:7;604:43;608:1;611;604:43;;;;;;;;;;;;;;;;;:3;:43::i

Swarm Source

ipfs://2f9a7a0c334f2b2154028abb67d2bb00bad6082e8398007557331cb8d51c5aea
Loading