Token ElonDAO
Overview ERC-20
Total Supply:
100,000,011 EDAO
Holders:
5 addresses
Profile Summary
Contract:
Decimals:
18
Balance
1.92 EDAO
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TokenWithBal
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-06 */ // Sources flattened with hardhat v2.9.6 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 ); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^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 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @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 Contracts guidelines: functions revert * instead 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, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 this function is * overridden; * * 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 override returns (uint8) { return 18; } /** * @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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); 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) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + 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) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require( fromBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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: * * - `account` 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 += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @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 Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "ERC20: insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @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 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // File @uniswap/v2-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File @uniswap/v2-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File contracts/TokenWithMaticBalance.sol //Here we define the License that this contract will have, in most cases MIT is used. MIT is an opensource license //Here we define the solidity version we are using //The reason we select a specific version is so that we do not face any incompatibility bugs between different compiler versions pragma solidity 0.8.7; //Here we import the ERC20 Openzeppelin contract standard //This is a commonly used & secure token standard //Here we import the ERC20Burnable extension //This will allow users to burn their tokens if they choose to //Here we import the UniswapoV2Router02 interface for depositing into the liquidity pool //Here we import the UniswapV2Factory interface for creating a token pair //Here we import the UniswapV2Pair interface for getting the token reserves //We make our Token contract inherit ERC20 & ERC20Burnable contract TokenWithBal is ERC20, ERC20Burnable { //Here we define what events will be emitted throughout the contract event NewAdmin(address newAdmin); event MintedTokens(address to, uint256 amount); event BatchMintedTokens(address[] to, uint256[] amounts); event newTempAdmin(address temp); event removedTempAdmin(address temp); //Stores the address of the admin //This is private becuase there is a function to retrieve it //The DAO contract will copy this address when it is initialized address private admin; //Stores the address of the DAO/Multi-Sig contract //This is private becuase there is a function to retrieve it address private DAO; //Stores the address of the wallet that liquidity will be locked to //This is public so that everyone can see address public liquidityLockedAddress; //Stores the address of the ERC20 token WMatic //This is private because it is not needed to be retrieved from outside address private WMatic; //This is for storing the contract address of the Uniswap V2 Router //This is private because it is not needed to be retrieved from outside address private uniswapV2RouterAddr; //Stores the token pair address //This is private because it is not needed to be retrieved from outside //We will used this to retrieve the token reserves of this token & Matic address private _pair; //Stores the address of the uniswap factory contract //This is private because it is not needed to be retrieved from outside //This will be used to create a uniswap liquidity pool address private _factory; //Stores a list of all the current signers //This is private becuase there is a function to retrieve it //The DAO contract will copy this array when it is initialised address[] private tempAdmins; //Stores the amount of tokens that a tempAdmin has minted //This is private because it is not needed to be retrieved from outside //The reason we use a uint256 here is because we are storing the tokens in wei value mapping(address => uint256) private tempAdminTokensMinted; //Stores whether an address is a temp admin or not //This is private because it is not needed to be retrieved from outside //By default all uint & bool variables are set to 0 & false mapping(address => bool) private tempAdminAllowed; //Stores a maximum token value that a temp admin can mint //This is private because it is not needed to be retrieved from outside //The reason we use a uint256 here is because we are storing the tokens in wei value uint256 private tempAdminMintLimit; //This is for storing the matic balance //This is private because it is not needed to be retrieved from outside uint256 private balance; //Stores the time that the control of the contract switches from the admins to the DAO //This is private becuase there is a function to retrieve it //The reason we use a uint32 here is because it is the smallest uint that block.timestamp can fit into uint32 private switchTime; //Stores the percent amount in a whole number e.g 1% = 1 //This is private because it is not needed be retreived from outside //The reason we use a uint8 here is because we know the number will not exceed 255, the highest number a uint8 can go to. uint8 private liquidityPercent; //This is for checking whether a liquidity fee has been taken yet //This is private because it is not needed to be retrieved from outside bool private hasTransfered; //On deployment we should pass through the following params //_name => The name of the Token e.g. "Bitcoin" //_symbol => The symbol of the Token e.g. "BTC" //_admin => The address that will be the main admin of the contract //_tempAdmins => A list of addresses that will be approved to mint tokens //_tokenLimit => The maximum number of tokens that a temp admin will be able to mint in wei value //_liquidtyLockAddr => The address that liiquidty will be added to but will not be retrievable //_uniswapV2RouterAddr => The address that we will communicate with to add liquidity to //_WMatic => The address used to interact with the liquidity pool //ERC20(_name, _symbol) => Instantiating the ERC20 token standard constructor( string memory _name, string memory _symbol, address _admin, address[] memory _tempAdmins, uint256 _tokenLimit, address _liquidityLockAddr, address _uniswapV2RouterAddr, address _WMatic, address _factoryAddress, uint8 _liquidityPercent ) ERC20(_name, _symbol) { //Assign _admin to the admin variable admin = _admin; //Assign the WMatic address to local storage WMatic = _WMatic; //Assign _tempAdmins to the tempAdmins variable tempAdmins = _tempAdmins; //Assign _tokenLimit to tempAdminMintLimit tempAdminMintLimit = _tokenLimit; //We state that the time that the contract is no longer in the admins hands is 30 days from the deployment of this contract //Then we convert it into a uint32 & assign to the switchTime variable switchTime = uint32(block.timestamp + 30 days); //Here we iterate through _tempAdmins for (uint8 i = 0; i < _tempAdmins.length; ) { //We store that the address is a temporary admin tempAdminAllowed[_tempAdmins[i]] = true; //In solidity ^0.8.0 safemath is by default checked on every calculation //In this case we know that the length of _tempAdmins will not exceed 255, the maximum number that a uint8 can hold //Adding this in unchecked reduces gas usage unchecked { i++; } } //Here we store the address of the liquidity lock wallet to local storage liquidityLockedAddress = _liquidityLockAddr; //Assign the uniswapV2Router address to local storage uniswapV2RouterAddr = _uniswapV2RouterAddr; //get factory address _factory = _factoryAddress; // Create a uniswap liquidity pair/pool for this new token & Matic _pair = IUniswapV2Factory(_factory).createPair(address(this), _WMatic); //Assign the liquidity percent to local storage liquidityPercent = _liquidityPercent; } //A modifier is a piece of code that we can attach to multiple functions //If the current time is less than the time that the contract ownership switches //Then the msg.sender must equal the admin address OR the msg.sender must be an approved temp admin AND must //not be trying to mint more tokens than the admin is allowed //If the current time has passed the time that the contract ownership switches //Then the msg.sender must equal the dao contract modifier onlyApproved(uint256 amount) { if (uint32(block.timestamp) < switchTime) { require( msg.sender == admin || (tempAdminTokensMinted[msg.sender] + amount <= tempAdminMintLimit && tempAdminAllowed[msg.sender]), "ERR:NA" // NA => Not Allowed ); } else { require(msg.sender == DAO, "ERR:ND"); // ND => Not DAO } //This is here to signify that the code in the function can continue _; } //This modifier is to make sure that msg.sender is the admin of the contract modifier onlyAdmin() { require(msg.sender == admin, "ERR:NA"); // NA => Not Admin _; } //This function can only be called by the admin //This function will only be callable from outside this contract //The admin will pass through the address to be given temporary minting privilledges //We set the address as allowed & add the address to the tempAdmin list function addTempAdmin(address temp) external onlyAdmin { tempAdminAllowed[temp] = true; tempAdmins.push(temp); emit newTempAdmin(temp); } //This function can only be called by the admin //This function will only be callable from outside this contract //The admin will pass through the address to have their temporary minting privilledges removed //The variable allowing the address to mint is deleted refunding gas to the admin //We find the index that the address is at in the tempAdmins array //We delete that value, replace it with the final value in the array, delete the final value in the array //Then we reduce the array size by 1 //Then we break the for loop to stop any further iterations of the loop function removeTempAdmin(address tempToRemove) external onlyAdmin { delete tempAdminAllowed[tempToRemove]; for (uint16 i = 0; i < tempAdmins.length; ) { if (tempToRemove == tempAdmins[i]) { delete tempAdmins[i]; tempAdmins[i] = tempAdmins[tempAdmins.length - 1]; delete tempAdmins[tempAdmins.length - 1]; tempAdmins.pop(); emit removedTempAdmin(tempToRemove); break; } //Removing safe math check unchecked { //Increment counter i++; } } } //This function must only be callable by the admin //This function will only be callable from outside this contract //We assign the new admin & emit an event that is viewable on the blockchain explorer function setAdmin(address _new) external onlyAdmin { admin = _new; emit NewAdmin(_new); } //If time has not passed the ownership switch time //The caller must be the admin //If the time has passed the ownership switch time //The caller must be the DAO function setLiquidityPercent(uint8 _percent) external { if (switchTime > block.timestamp) { require(msg.sender == admin, "ERR:NA"); // NA => Not Admin } else { require(msg.sender == DAO, "ERR:ND"); //ND => Not DAO } //Assign the new percentage to storage liquidityPercent = _percent; } //This function must only be callable once by the admin & then it is only the DAO that can call function setDAO(address _dao) external { //Check that the address passed through is not equal to the burn address require(_dao != address(0x0), "ERR:NA"); //NA => Null Address //Check that either msg.sender is the DAO contract OR that the dao contract hasn't been set & the msg.sender is the admin require( (msg.sender == DAO) || (DAO == address(0x0) && msg.sender == admin), "ERR:NA" ); // NA => Not Allowed //Store the new DAO address in local storage DAO = _dao; } //This function is read only & costs no gas unless used in a transaction //This function will only be callable from outside this contract //This function returns a list of addresses that are currently temporary admins //This function will be called by the DAO contract when it is initialized function getTempAdmins() external view returns (address[] memory) { return tempAdmins; } //This function is read only & costs no gas unless used in a transaction //This function will only be callable from outside this contract //This function returns the time at which the ownership of the contract is switched function getSwitchTime() external view returns (uint32) { return switchTime; } //This function is read only & costs no gas unless used in a transaction //This function will only be callable from outside this contract //This function returns the address of the admin of this contract function getAdmin() external view returns (address) { return admin; } //This function is read only & costs no gas unless used in a transaction //This function will only be callable from outside this contract //This function returns the address of the DAO contract function getDAO() external view returns (address) { return DAO; } //This function takes an address that is being paid to & an amount that is being minted //This function will only be callable from outside this contract //The onlyApproved modifier has been added onto this function & will be executed before the code in this function function mint(address to, uint256 amount) external onlyApproved(amount) { //We make sure that the address that is being minted to is not the burn address require(to != address(0x0), "ERR:ZA"); // ZA => Zero Address //We make sure that the amount that is being minted is over 0 require(amount > 0, "ERR:MA"); // MA => Mint Amount //If the msg.sender is a tempAdmin increase the amount that they have minted if (tempAdminAllowed[msg.sender]) { tempAdminTokensMinted[msg.sender] += amount; } //mint _mint(to, amount); //emit a Minted Tokens event emit MintedTokens(to, amount); } //This function will only be callable from outside this contract //This function takes arrays of addresses that are being paid to & amounts that are being minted //The onlyApproved modifier has been added onto this function & will be performed before the code in this function //The array of amounts are passed through the sum function before being passed as the total value of the array function batchMint(address[] memory addresses, uint256[] memory amounts) external onlyApproved(sum(amounts)) { //We check that the lengths of the arrays passed in match require(addresses.length == amounts.length, "ERR:WL"); //WL => Wrong Length //Instantiate the counter used for both for loops uint8 i; //iterate through the arrays to perform checks for (i = 0; i < amounts.length; ) { //Checking that each address in the array does not equal the burn address; require(addresses[i] != address(0x0), "ERR:ZA"); //ZA => Zero Address //Checking that each amount in the array is larger than zero require(amounts[i] > 0, "ERR:MA"); //MA => Mint Amount //removing safemath check for gas optimiization unchecked { //Increment the counter i++; } } //If msg.sender is a temporary admin if (tempAdminAllowed[msg.sender]) { //initialize a variable for total uint256 total; //Iterate through the amounts array for (i = 0; i < amounts.length; ) { //Add the current index to total total += amounts[i]; //Removing safe math check unchecked { //Increment the counter i++; } } //add the total to the amount that this temp admin has minted tempAdminTokensMinted[msg.sender] += total; } //iterate through the arrays to mint for (i = 0; i < amounts.length; ) { //Mint to each address for the given address _mint(addresses[i], amounts[i]); //removing safemath check unchecked { //Increment the counter i++; } } //emit an event with details on who got airdropped how many tokens emit BatchMintedTokens(addresses, amounts); } //send 4% to the liquidty pool //This function is a part of the ERC20 standard implementation //We are overriding it so that we can send 4% of every transaction to a locked liquidity pool function transfer(address to, uint256 amount) public virtual override returns (bool) { //Call for _msgSender() once to avoid multiple function calls address owner = _msgSender(); //Calculate the liqidity fee uint256 liquidityFee = (amount * liquidityPercent) / 100; //Transfer the amount minus the liquidity fee from the owner address to the to address _transfer(owner, to, amount - liquidityFee); //Transfer the liquidity fee from the owner address to this contracts address _transfer(owner, address(this), liquidityFee); //Add the liquidity fee to the liquidity pool addLiquidity(liquidityFee); //Return a true vulue to signify a complete trade return true; } //This function must only be callable by the transfer function function addLiquidity(uint256 tokenAmount) internal { // Give permission for the router contract to use this contracts token balance for a total of the given token amount _approve(address(this), uniswapV2RouterAddr, tokenAmount); //We define a uint variable to be used later uint256 maticAmount; //If this is the first time this function is being called if (!hasTransfered) { //set maticAmount to 0.5 Matic maticAmount = 500000000000000000; //set has transferred to true hasTransfered = true; } else { //If this isn't the first time this function is being called //get both token pair reserves (uint256 _reserve0, uint256 _reserve1, ) = IUniswapV2Pair(_pair) .getReserves(); //Check that neither reserve balances equal zero require(_reserve0 != 0 && _reserve1 != 0, "ERR:ZA2"); //Find out what tokenA is address tokenA = address(this) < WMatic ? address(this) : WMatic; //calculate matic amount to be sent with $EDAO //formula //xAmount = (yAmount *xReserve) / yReserve if (address(this) == tokenA) { maticAmount = (tokenAmount * _reserve1) / _reserve0; } else { maticAmount = (tokenAmount * _reserve0) / _reserve1; } } //Check that the balance is enough to cover the cost of adding to liquidty require(address(this).balance > maticAmount, "ERR:NF"); //NF => No Funds // Checking that maticAmount is not equal to zero require(maticAmount != 0, "ERR:CA"); //CA => Calculating Amount // add the liquidity IUniswapV2Router02(uniswapV2RouterAddr).addLiquidityETH{ value: maticAmount }( address(this), //TokenA tokenAmount, 0, //minAmount0Out 0, //minAmount1Out liquidityLockedAddress, //Owner of the liquidity block.timestamp + 1 //When it should be processed by, for this we set the time as right now, this only needs to have extra time if calling this function on it's own transaction ); //Reduce the matic balance balance -= maticAmount; } //This function is here to sum up the values in an array //This function will only be called by our own code so it is internal //This function does not effect any storage variables so this function is marked pure //This function returns the sum of the array values passed through, this is defined in the return statement function sum(uint256[] memory amounts) internal pure returns (uint256 total) { //Iterate through the amounts array for (uint8 i = 0; i < amounts.length; ) { //Add the value to the total total += amounts[i]; //Removing safe math check unchecked { //Increment the counter i++; } } } //This allows the contract to receive matic receive() external payable { //Add the matic amount to the balance balance += msg.value; } //This function can only be called by the admin //This function will send the matic stored in the contract to the admin //NOTE: NO TRANSFERS OF TOKENS CAN HAPPEN IN THIS CONTRACT WITHOUT MATIC being stored function withdraw(uint256 amount) external onlyAdmin { //Check that the amount looking to be withdrawn is less than the balance require(balance >= amount, "ERR:IF"); //IF => Insufficient Funcds //Send the requested amount to the admin (bool success, ) = admin.call{value: amount}(""); //Check that the transfer was successful require(success, "ERR:OT"); //OT => On Transfer //Reduce the balance by the requested amount balance -= amount; } }
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address[]","name":"_tempAdmins","type":"address[]"},{"internalType":"uint256","name":"_tokenLimit","type":"uint256"},{"internalType":"address","name":"_liquidityLockAddr","type":"address"},{"internalType":"address","name":"_uniswapV2RouterAddr","type":"address"},{"internalType":"address","name":"_WMatic","type":"address"},{"internalType":"address","name":"_factoryAddress","type":"address"},{"internalType":"uint8","name":"_liquidityPercent","type":"uint8"}],"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":false,"internalType":"address[]","name":"to","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"BatchMintedTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintedTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"temp","type":"address"}],"name":"newTempAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"temp","type":"address"}],"name":"removedTempAdmin","type":"event"},{"inputs":[{"internalType":"address","name":"temp","type":"address"}],"name":"addTempAdmin","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":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwitchTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTempAdmins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityLockedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","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":"tempToRemove","type":"address"}],"name":"removeTempAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"}],"name":"setDAO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_percent","type":"uint8"}],"name":"setLiquidityPercent","outputs":[],"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004ce038038062004ce083398181016040528101906200003791906200069c565b8989816003908051906020019062000051929190620003ba565b5080600490805190602001906200006a929190620003ba565b50505087600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600c9080519060200190620001079291906200044b565b5085600f8190555062278d0042620001209190620008bb565b601160006101000a81548163ffffffff021916908363ffffffff16021790555060005b87518160ff161015620001d6576001600e60008a8460ff16815181106200016f576200016e62000a63565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808060010191505062000143565b5084600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9c6539630856040518363ffffffff1660e01b8152600401620002f992919062000800565b602060405180830381600087803b1580156200031457600080fd5b505af115801562000329573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034f91906200066a565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601160046101000a81548160ff021916908360ff1602179055505050505050505050505062000b39565b828054620003c89062000999565b90600052602060002090601f016020900481019282620003ec576000855562000438565b82601f106200040757805160ff191683800117855562000438565b8280016001018555821562000438579182015b82811115620004375782518255916020019190600101906200041a565b5b509050620004479190620004da565b5090565b828054828255906000526020600020908101928215620004c7579160200282015b82811115620004c65782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906200046c565b5b509050620004d69190620004da565b5090565b5b80821115620004f5576000816000905550600101620004db565b5090565b6000620005106200050a8462000856565b6200082d565b9050808382526020820190508285602086028201111562000536576200053562000ac6565b5b60005b858110156200056a57816200054f8882620005bf565b84526020840193506020830192505060018101905062000539565b5050509392505050565b60006200058b620005858462000885565b6200082d565b905082815260208101848484011115620005aa57620005a962000acb565b5b620005b784828562000963565b509392505050565b600081519050620005d08162000aeb565b92915050565b600082601f830112620005ee57620005ed62000ac1565b5b815162000600848260208601620004f9565b91505092915050565b600082601f83011262000621576200062062000ac1565b5b81516200063384826020860162000574565b91505092915050565b6000815190506200064d8162000b05565b92915050565b600081519050620006648162000b1f565b92915050565b60006020828403121562000683576200068262000ad5565b5b60006200069384828501620005bf565b91505092915050565b6000806000806000806000806000806101408b8d031215620006c357620006c262000ad5565b5b60008b015167ffffffffffffffff811115620006e457620006e362000ad0565b5b620006f28d828e0162000609565b9a505060208b015167ffffffffffffffff81111562000716576200071562000ad0565b5b620007248d828e0162000609565b9950506040620007378d828e01620005bf565b98505060608b015167ffffffffffffffff8111156200075b576200075a62000ad0565b5b620007698d828e01620005d6565b97505060806200077c8d828e016200063c565b96505060a06200078f8d828e01620005bf565b95505060c0620007a28d828e01620005bf565b94505060e0620007b58d828e01620005bf565b935050610100620007c98d828e01620005bf565b925050610120620007dd8d828e0162000653565b9150509295989b9194979a5092959850565b620007fa8162000918565b82525050565b6000604082019050620008176000830185620007ef565b620008266020830184620007ef565b9392505050565b6000620008396200084c565b9050620008478282620009cf565b919050565b6000604051905090565b600067ffffffffffffffff82111562000874576200087362000a92565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620008a357620008a262000a92565b5b620008ae8262000ada565b9050602081019050919050565b6000620008c8826200094c565b9150620008d5836200094c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200090d576200090c62000a05565b5b828201905092915050565b600062000925826200092c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200098357808201518184015260208101905062000966565b8381111562000993576000848401525b50505050565b60006002820490506001821680620009b257607f821691505b60208210811415620009c957620009c862000a34565b5b50919050565b620009da8262000ada565b810181811067ffffffffffffffff82111715620009fc57620009fb62000a92565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000af68162000918565b811462000b0257600080fd5b50565b62000b10816200094c565b811462000b1c57600080fd5b50565b62000b2a8162000956565b811462000b3657600080fd5b50565b6141978062000b496000396000f3fe6080604052600436106101855760003560e01c8063704b6c02116100d1578063a457c2d71161008a578063c8502b2511610064578063c8502b25146105b8578063d7517b11146105e3578063dd62ed3e1461060c578063e73a914c14610649576101a5565b8063a457c2d714610513578063a9059cbb14610550578063bbb332ff1461058d576101a5565b8063704b6c021461040357806370a082311461042c57806379cc6790146104695780637eb5c7321461049257806395d89b41146104bd578063985da726146104e8576101a5565b8063313ce5671161013e57806342966c681161011857806342966c681461035d5780634bd2abb81461038657806368573107146103af5780636e9960c3146103d8576101a5565b8063313ce567146102cc57806339509351146102f757806340c10f1914610334576101a5565b806306fdde03146101aa578063095ea7b3146101d55780630b271d401461021257806318160ddd1461023b57806323b872dd146102665780632e1a7d4d146102a3576101a5565b366101a557346010600082825461019c919061390c565b92505081905550005b600080fd5b3480156101b657600080fd5b506101bf610672565b6040516101cc9190613503565b60405180910390f35b3480156101e157600080fd5b506101fc60048036038101906101f79190612da1565b610704565b60405161020991906134e8565b60405180910390f35b34801561021e57600080fd5b5061023960048036038101906102349190612ce1565b610727565b005b34801561024757600080fd5b50610250610a6b565b60405161025d91906137a5565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612d4e565b610a75565b60405161029a91906134e8565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612eac565b610aa4565b005b3480156102d857600080fd5b506102e1610c64565b6040516102ee91906137db565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190612da1565b610c6d565b60405161032b91906134e8565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190612da1565b610ca4565b005b34801561036957600080fd5b50610384600480360381019061037f9190612eac565b611041565b005b34801561039257600080fd5b506103ad60048036038101906103a89190612f2c565b611055565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190612de1565b6111b9565b005b3480156103e457600080fd5b506103ed61169c565b6040516103fa91906133ea565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190612ce1565b6116c6565b005b34801561043857600080fd5b50610453600480360381019061044e9190612ce1565b6117d1565b60405161046091906137a5565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190612da1565b611819565b005b34801561049e57600080fd5b506104a7611839565b6040516104b4919061348f565b60405180910390f35b3480156104c957600080fd5b506104d26118c7565b6040516104df9190613503565b60405180910390f35b3480156104f457600080fd5b506104fd611959565b60405161050a91906133ea565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190612da1565b611983565b60405161054791906134e8565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190612da1565b6119fa565b60405161058491906134e8565b60405180910390f35b34801561059957600080fd5b506105a2611a6b565b6040516105af91906133ea565b60405180910390f35b3480156105c457600080fd5b506105cd611a91565b6040516105da91906137c0565b60405180910390f35b3480156105ef57600080fd5b5061060a60048036038101906106059190612ce1565b611aab565b005b34801561061857600080fd5b50610633600480360381019061062e9190612d0e565b611c30565b60405161064091906137a5565b60405180910390f35b34801561065557600080fd5b50610670600480360381019061066b9190612ce1565b611cb7565b005b60606003805461068190613ae5565b80601f01602080910402602001604051908101604052809291908181526020018280546106ad90613ae5565b80156106fa5780601f106106cf576101008083540402835291602001916106fa565b820191906000526020600020905b8154815290600101906020018083116106dd57829003601f168201915b5050505050905090565b60008061070f611ead565b905061071c818585611eb5565b600191505092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ae90613685565b60405180910390fd5b600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905560005b600c805490508161ffff161015610a6757600c8161ffff168154811061083257610831613c04565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a5a57600c8161ffff16815481106108a8576108a7613c04565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600c6001600c805490506108e991906139ed565b815481106108fa576108f9613c04565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c8261ffff168154811061093d5761093c613c04565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c6001600c8054905061099991906139ed565b815481106109aa576109a9613c04565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600c8054806109e9576109e8613bd5565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590557fc9023b2beb32e899a5630badbcc6cd472bcf6b267382681db3afdcd20dd457e182604051610a4d91906133ea565b60405180910390a1610a67565b8080600101915050610809565b5050565b6000600254905090565b600080610a80611ead565b9050610a8d858285612080565b610a9885858561210c565b60019150509392505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b90613685565b60405180910390fd5b806010541015610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613665565b60405180910390fd5b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610bc1906133d5565b60006040518083038185875af1925050503d8060008114610bfe576040519150601f19603f3d011682016040523d82523d6000602084013e610c03565b606091505b5050905080610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90613645565b60405180910390fd5b8160106000828254610c5991906139ed565b925050819055505050565b60006012905090565b600080610c78611ead565b9050610c99818585610c8a8589611c30565b610c94919061390c565b611eb5565b600191505092915050565b80601160009054906101000a900463ffffffff1663ffffffff164263ffffffff161015610e0c57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610dc85750600f5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d70919061390c565b11158015610dc75750600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90613685565b60405180910390fd5b610e9d565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e93906136a5565b60405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613565565b60405180910390fd5b60008211610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f47906135c5565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610ff95781600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ff1919061390c565b925050819055505b611003838361238d565b7f3d2292ec6e6bc6a091080c9b9178d2856c5a1ea0748075789514f596e478b9ac8383604051611034929190613405565b60405180910390a1505050565b61105261104c611ead565b826124ed565b50565b42601160009054906101000a900463ffffffff1663ffffffff16111561110a57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90613685565b60405180910390fd5b61119b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461119a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611191906136a5565b60405180910390fd5b5b80601160046101000a81548160ff021916908360ff16021790555050565b6111c2816126c4565b601160009054906101000a900463ffffffff1663ffffffff164263ffffffff16101561132957600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112e55750600f5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461128d919061390c565b111580156112e45750600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613685565b60405180910390fd5b6113ba565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906136a5565b60405180910390fd5b5b81518351146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613625565b60405180910390fd5b60005b82518160ff16101561150757600073ffffffffffffffffffffffffffffffffffffffff16848260ff168151811061143b5761143a613c04565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190613565565b60405180910390fd5b6000838260ff16815181106114b2576114b1613c04565b5b6020026020010151116114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f1906135c5565b60405180910390fd5b8080600101915050611401565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115fb5760008091505b83518260ff1610156115a357838260ff168151811061158157611580613c04565b5b602002602001015181611594919061390c565b9050818060010192505061155f565b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115f2919061390c565b92505081905550505b600090505b82518160ff16101561165d57611650848260ff168151811061162557611624613c04565b5b6020026020010151848360ff168151811061164357611642613c04565b5b602002602001015161238d565b8080600101915050611600565b7f80d15323592788a7b0a0851fc96167e81bdab90ce22b1689cf66bb7929d1d602848460405161168e9291906134b1565b60405180910390a150505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90613685565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c816040516117c691906133ea565b60405180910390a150565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61182b82611825611ead565b83612080565b61183582826124ed565b5050565b6060600c8054806020026020016040519081016040528092919081815260200182805480156118bd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611873575b5050505050905090565b6060600480546118d690613ae5565b80601f016020809104026020016040519081016040528092919081815260200182805461190290613ae5565b801561194f5780601f106119245761010080835404028352916020019161194f565b820191906000526020600020905b81548152906001019060200180831161193257829003601f168201915b5050505050905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008061198e611ead565b9050600061199c8286611c30565b9050838110156119e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d890613765565b60405180910390fd5b6119ee8286868403611eb5565b60019250505092915050565b600080611a05611ead565b905060006064601160049054906101000a900460ff1660ff1685611a299190613993565b611a339190613962565b9050611a4b82868387611a4691906139ed565b61210c565b611a5682308361210c565b611a5f81612716565b60019250505092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601160009054906101000a900463ffffffff16905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3290613685565b60405180910390fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fad586119e9bdcccbb2b603aae0446246f7bb9f2e931460d1c51531ad0e79170f81604051611c2591906133ea565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90613685565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e2a5750600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611e295750600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b5b611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613685565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90613725565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c906135a5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161207391906137a5565b60405180910390a3505050565b600061208c8484611c30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461210657818110156120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906135e5565b60405180910390fd5b6121058484848403611eb5565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561217c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612173906136e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e390613525565b60405180910390fd5b6121f7838383612b1d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561227d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227490613605565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612310919061390c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161237491906137a5565b60405180910390a3612387848484612b22565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490613785565b60405180910390fd5b61240960008383612b1d565b806002600082825461241b919061390c565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612470919061390c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124d591906137a5565b60405180910390a36124e960008383612b22565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561255d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612554906136c5565b60405180910390fd5b61256982600083612b1d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e690613585565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461264691906139ed565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126ab91906137a5565b60405180910390a36126bf83600084612b22565b505050565b600080600090505b82518160ff16101561271057828160ff16815181106126ee576126ed613c04565b5b602002602001015182612701919061390c565b915080806001019150506126cc565b50919050565b61274330600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611eb5565b6000601160059054906101000a900460ff16612784576706f05b59d3b2000090506001601160056101000a81548160ff021916908315150217905550612990565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156127ef57600080fd5b505afa158015612803573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128279190612e59565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000821415801561285e575060008114155b61289d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289490613545565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161061291c57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661291e565b305b90508073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415612972578282866129619190613993565b61296b9190613962565b935061298c565b81838661297f9190613993565b6129899190613962565b93505b5050505b8047116129d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c990613705565b60405180910390fd5b6000811415612a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0d90613745565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600142612a8a919061390c565b6040518863ffffffff1660e01b8152600401612aab9695949392919061342e565b6060604051808303818588803b158015612ac457600080fd5b505af1158015612ad8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612afd9190612ed9565b5050508060106000828254612b1291906139ed565b925050819055505050565b505050565b505050565b6000612b3a612b358461381b565b6137f6565b90508083825260208201905082856020860282011115612b5d57612b5c613c67565b5b60005b85811015612b8d5781612b738882612c07565b845260208401935060208301925050600181019050612b60565b5050509392505050565b6000612baa612ba584613847565b6137f6565b90508083825260208201905082856020860282011115612bcd57612bcc613c67565b5b60005b85811015612bfd5781612be38882612c8d565b845260208401935060208301925050600181019050612bd0565b5050509392505050565b600081359050612c16816140ee565b92915050565b600082601f830112612c3157612c30613c62565b5b8135612c41848260208601612b27565b91505092915050565b600082601f830112612c5f57612c5e613c62565b5b8135612c6f848260208601612b97565b91505092915050565b600081519050612c8781614105565b92915050565b600081359050612c9c8161411c565b92915050565b600081519050612cb18161411c565b92915050565b600081519050612cc681614133565b92915050565b600081359050612cdb8161414a565b92915050565b600060208284031215612cf757612cf6613c71565b5b6000612d0584828501612c07565b91505092915050565b60008060408385031215612d2557612d24613c71565b5b6000612d3385828601612c07565b9250506020612d4485828601612c07565b9150509250929050565b600080600060608486031215612d6757612d66613c71565b5b6000612d7586828701612c07565b9350506020612d8686828701612c07565b9250506040612d9786828701612c8d565b9150509250925092565b60008060408385031215612db857612db7613c71565b5b6000612dc685828601612c07565b9250506020612dd785828601612c8d565b9150509250929050565b60008060408385031215612df857612df7613c71565b5b600083013567ffffffffffffffff811115612e1657612e15613c6c565b5b612e2285828601612c1c565b925050602083013567ffffffffffffffff811115612e4357612e42613c6c565b5b612e4f85828601612c4a565b9150509250929050565b600080600060608486031215612e7257612e71613c71565b5b6000612e8086828701612c78565b9350506020612e9186828701612c78565b9250506040612ea286828701612cb7565b9150509250925092565b600060208284031215612ec257612ec1613c71565b5b6000612ed084828501612c8d565b91505092915050565b600080600060608486031215612ef257612ef1613c71565b5b6000612f0086828701612ca2565b9350506020612f1186828701612ca2565b9250506040612f2286828701612ca2565b9150509250925092565b600060208284031215612f4257612f41613c71565b5b6000612f5084828501612ccc565b91505092915050565b6000612f658383612f89565b60208301905092915050565b6000612f7d8383613399565b60208301905092915050565b612f9281613a21565b82525050565b612fa181613a21565b82525050565b6000612fb282613893565b612fbc81856138ce565b9350612fc783613873565b8060005b83811015612ff8578151612fdf8882612f59565b9750612fea836138b4565b925050600181019050612fcb565b5085935050505092915050565b60006130108261389e565b61301a81856138df565b935061302583613883565b8060005b8381101561305657815161303d8882612f71565b9750613048836138c1565b925050600181019050613029565b5085935050505092915050565b61306c81613a33565b82525050565b61307b81613aa0565b82525050565b600061308c826138a9565b61309681856138fb565b93506130a6818560208601613ab2565b6130af81613c76565b840191505092915050565b60006130c76023836138fb565b91506130d282613c87565b604082019050919050565b60006130ea6007836138fb565b91506130f582613cd6565b602082019050919050565b600061310d6006836138fb565b915061311882613cff565b602082019050919050565b60006131306022836138fb565b915061313b82613d28565b604082019050919050565b60006131536022836138fb565b915061315e82613d77565b604082019050919050565b60006131766006836138fb565b915061318182613dc6565b602082019050919050565b6000613199601d836138fb565b91506131a482613def565b602082019050919050565b60006131bc6026836138fb565b91506131c782613e18565b604082019050919050565b60006131df6006836138fb565b91506131ea82613e67565b602082019050919050565b60006132026006836138fb565b915061320d82613e90565b602082019050919050565b60006132256006836138fb565b915061323082613eb9565b602082019050919050565b60006132486006836138fb565b915061325382613ee2565b602082019050919050565b600061326b6006836138fb565b915061327682613f0b565b602082019050919050565b600061328e6021836138fb565b915061329982613f34565b604082019050919050565b60006132b16025836138fb565b91506132bc82613f83565b604082019050919050565b60006132d46000836138f0565b91506132df82613fd2565b600082019050919050565b60006132f76006836138fb565b915061330282613fd5565b602082019050919050565b600061331a6024836138fb565b915061332582613ffe565b604082019050919050565b600061333d6006836138fb565b91506133488261404d565b602082019050919050565b60006133606025836138fb565b915061336b82614076565b604082019050919050565b6000613383601f836138fb565b915061338e826140c5565b602082019050919050565b6133a281613a79565b82525050565b6133b181613a79565b82525050565b6133c081613a83565b82525050565b6133cf81613a93565b82525050565b60006133e0826132c7565b9150819050919050565b60006020820190506133ff6000830184612f98565b92915050565b600060408201905061341a6000830185612f98565b61342760208301846133a8565b9392505050565b600060c0820190506134436000830189612f98565b61345060208301886133a8565b61345d6040830187613072565b61346a6060830186613072565b6134776080830185612f98565b61348460a08301846133a8565b979650505050505050565b600060208201905081810360008301526134a98184612fa7565b905092915050565b600060408201905081810360008301526134cb8185612fa7565b905081810360208301526134df8184613005565b90509392505050565b60006020820190506134fd6000830184613063565b92915050565b6000602082019050818103600083015261351d8184613081565b905092915050565b6000602082019050818103600083015261353e816130ba565b9050919050565b6000602082019050818103600083015261355e816130dd565b9050919050565b6000602082019050818103600083015261357e81613100565b9050919050565b6000602082019050818103600083015261359e81613123565b9050919050565b600060208201905081810360008301526135be81613146565b9050919050565b600060208201905081810360008301526135de81613169565b9050919050565b600060208201905081810360008301526135fe8161318c565b9050919050565b6000602082019050818103600083015261361e816131af565b9050919050565b6000602082019050818103600083015261363e816131d2565b9050919050565b6000602082019050818103600083015261365e816131f5565b9050919050565b6000602082019050818103600083015261367e81613218565b9050919050565b6000602082019050818103600083015261369e8161323b565b9050919050565b600060208201905081810360008301526136be8161325e565b9050919050565b600060208201905081810360008301526136de81613281565b9050919050565b600060208201905081810360008301526136fe816132a4565b9050919050565b6000602082019050818103600083015261371e816132ea565b9050919050565b6000602082019050818103600083015261373e8161330d565b9050919050565b6000602082019050818103600083015261375e81613330565b9050919050565b6000602082019050818103600083015261377e81613353565b9050919050565b6000602082019050818103600083015261379e81613376565b9050919050565b60006020820190506137ba60008301846133a8565b92915050565b60006020820190506137d560008301846133b7565b92915050565b60006020820190506137f060008301846133c6565b92915050565b6000613800613811565b905061380c8282613b17565b919050565b6000604051905090565b600067ffffffffffffffff82111561383657613835613c33565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561386257613861613c33565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061391782613a79565b915061392283613a79565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561395757613956613b48565b5b828201905092915050565b600061396d82613a79565b915061397883613a79565b92508261398857613987613b77565b5b828204905092915050565b600061399e82613a79565b91506139a983613a79565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139e2576139e1613b48565b5b828202905092915050565b60006139f882613a79565b9150613a0383613a79565b925082821015613a1657613a15613b48565b5b828203905092915050565b6000613a2c82613a59565b9050919050565b60008115159050919050565b60006dffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b6000613aab82613a79565b9050919050565b60005b83811015613ad0578082015181840152602081019050613ab5565b83811115613adf576000848401525b50505050565b60006002820490506001821680613afd57607f821691505b60208210811415613b1157613b10613ba6565b5b50919050565b613b2082613c76565b810181811067ffffffffffffffff82111715613b3f57613b3e613c33565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4552523a5a413200000000000000000000000000000000000000000000000000600082015250565b7f4552523a5a410000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552523a4d410000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4552523a574c0000000000000000000000000000000000000000000000000000600082015250565b7f4552523a4f540000000000000000000000000000000000000000000000000000600082015250565b7f4552523a49460000000000000000000000000000000000000000000000000000600082015250565b7f4552523a4e410000000000000000000000000000000000000000000000000000600082015250565b7f4552523a4e440000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552523a4e460000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552523a43410000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6140f781613a21565b811461410257600080fd5b50565b61410e81613a3f565b811461411957600080fd5b50565b61412581613a79565b811461413057600080fd5b50565b61413c81613a83565b811461414757600080fd5b50565b61415381613a93565b811461415e57600080fd5b5056fea26469706673582212205528a9f71ac5e37961cf350ecf40063811090eac2d76afc29c499d5b9b6d42c464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000004fb8a5b39d69ed9218480f65f41a15694392760800000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000004fb8a5b39d69ed9218480f65f41a1569439276080000000000000000000000002fcd8ebca6f7f39aabb987b2a50dd5ac0c1a65b90000000000000000000000009c3c9283d3e44854697cd22d3faa240cfb032889000000000000000000000000b9bcd707858c815cac77e24bf4ac056fcdd0781b00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007456c6f6e44414f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044544414f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e2913a31494e30ebabeb94857f5f7b1fc0b536c10000000000000000000000004d6ed29ba154b5f4132ca6f1d9de94508adc69b1
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000004fb8a5b39d69ed9218480f65f41a15694392760800000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000004fb8a5b39d69ed9218480f65f41a1569439276080000000000000000000000002fcd8ebca6f7f39aabb987b2a50dd5ac0c1a65b90000000000000000000000009c3c9283d3e44854697cd22d3faa240cfb032889000000000000000000000000b9bcd707858c815cac77e24bf4ac056fcdd0781b00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007456c6f6e44414f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044544414f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e2913a31494e30ebabeb94857f5f7b1fc0b536c10000000000000000000000004d6ed29ba154b5f4132ca6f1d9de94508adc69b1
-----Decoded View---------------
Arg [0] : _name (string): ElonDAO
Arg [1] : _symbol (string): EDAO
Arg [2] : _admin (address): 0x4fb8a5b39d69ed9218480f65f41a156943927608
Arg [3] : _tempAdmins (address[]): 0xe2913a31494e30ebabeb94857f5f7b1fc0b536c1,0x4d6ed29ba154b5f4132ca6f1d9de94508adc69b1
Arg [4] : _tokenLimit (uint256): 1000000000000000000000
Arg [5] : _liquidityLockAddr (address): 0x4fb8a5b39d69ed9218480f65f41a156943927608
Arg [6] : _uniswapV2RouterAddr (address): 0x2fcd8ebca6f7f39aabb987b2a50dd5ac0c1a65b9
Arg [7] : _WMatic (address): 0x9c3c9283d3e44854697cd22d3faa240cfb032889
Arg [8] : _factoryAddress (address): 0xb9bcd707858c815cac77e24bf4ac056fcdd0781b
Arg [9] : _liquidityPercent (uint8): 4
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 0000000000000000000000004fb8a5b39d69ed9218480f65f41a156943927608
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [4] : 00000000000000000000000000000000000000000000003635c9adc5dea00000
Arg [5] : 0000000000000000000000004fb8a5b39d69ed9218480f65f41a156943927608
Arg [6] : 0000000000000000000000002fcd8ebca6f7f39aabb987b2a50dd5ac0c1a65b9
Arg [7] : 0000000000000000000000009c3c9283d3e44854697cd22d3faa240cfb032889
Arg [8] : 000000000000000000000000b9bcd707858c815cac77e24bf4ac056fcdd0781b
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [11] : 456c6f6e44414f00000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [13] : 4544414f00000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [15] : 000000000000000000000000e2913a31494e30ebabeb94857f5f7b1fc0b536c1
Arg [16] : 0000000000000000000000004d6ed29ba154b5f4132ca6f1d9de94508adc69b1
Deployed ByteCode Sourcemap
29832:21304:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50365:9;50354:7;;:20;;;;;;;:::i;:::-;;;;;;;;29832:21304;;;;;6819:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9311:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38782:671;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7939:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10133:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50611:522;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7781:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10837:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42672:701;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18566:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39980:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43789:2128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42003:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39678:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8110:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18976:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41337:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7038:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42303:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11610:505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46128:826;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30673:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41684:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37993:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8790:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40452:565;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6819:100;6873:13;6906:5;6899:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6819:100;:::o;9311:242::-;9430:4;9452:13;9468:12;:10;:12::i;:::-;9452:28;;9491:32;9500:5;9507:7;9516:6;9491:8;:32::i;:::-;9541:4;9534:11;;;9311:242;;;;:::o;38782:671::-;37640:5;;;;;;;;;;;37626:19;;:10;:19;;;37618:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;38866:16:::1;:30;38883:12;38866:30;;;;;;;;;;;;;;;;38859:37;;;;;;;;;;;38912:8;38907:539;38930:10;:17;;;;38926:1;:21;;;38907:539;;;38986:10;38997:1;38986:13;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38970:29;;:12;:29;;;38966:330;;;39027:10;39038:1;39027:13;;;;;;;;;;:::i;:::-;;;;;;;;;;39020:20;;;;;;;;;;;39075:10;39106:1;39086:10;:17;;;;:21;;;;:::i;:::-;39075:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39059:10;39070:1;39059:13;;;;;;;;;;:::i;:::-;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;39134:10;39165:1;39145:10;:17;;;;:21;;;;:::i;:::-;39134:33;;;;;;;;:::i;:::-;;;;;;;;;;39127:40;;;;;;;;;;;39186:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;39226:30;39243:12;39226:30;;;;;;:::i;:::-;;;;;;;;39275:5;;38966:330;39416:3;;;;;;;38907:539;;;;38782:671:::0;:::o;7939:108::-;8000:7;8027:12;;8020:19;;7939:108;:::o;10133:295::-;10264:4;10281:15;10299:12;:10;:12::i;:::-;10281:30;;10322:38;10338:4;10344:7;10353:6;10322:15;:38::i;:::-;10371:27;10381:4;10387:2;10391:6;10371:9;:27::i;:::-;10416:4;10409:11;;;10133:295;;;;;:::o;50611:522::-;37640:5;;;;;;;;;;;37626:19;;:10;:19;;;37618:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50776:6:::1;50765:7;;:17;;50757:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;50885:12;50903:5;;;;;;;;;;;:10;;50921:6;50903:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50884:48;;;51003:7;50995:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;51119:6;51108:7;;:17;;;;;;;:::i;:::-;;;;;;;;50664:469;50611:522:::0;:::o;7781:93::-;7839:5;7864:2;7857:9;;7781:93;:::o;10837:270::-;10952:4;10974:13;10990:12;:10;:12::i;:::-;10974:28;;11013:64;11022:5;11029:7;11066:10;11038:25;11048:5;11055:7;11038:9;:25::i;:::-;:38;;;;:::i;:::-;11013:8;:64::i;:::-;11095:4;11088:11;;;10837:270;;;;:::o;42672:701::-;42736:6;36991:10;;;;;;;;;;;36965:36;;36972:15;36965:36;;;36961:436;;;37058:5;;;;;;;;;;;37044:19;;:10;:19;;;:192;;;;37160:18;;37125:6;37089:21;:33;37111:10;37089:33;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:89;;:146;;;;;37207:16;:28;37224:10;37207:28;;;;;;;;;;;;;;;;;;;;;;;;;37089:146;37044:192;37018:281;;;;;;;;;;;;:::i;:::-;;;;;;;;;36961:436;;;37354:3;;;;;;;;;;;37340:17;;:10;:17;;;37332:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;36961:436;42866:3:::1;42852:18;;:2;:18;;;;42844:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;43004:1;42995:6;:10;42987:29;;;;;;;;;;;;:::i;:::-;;;;;;;;;43140:16;:28;43157:10;43140:28;;;;;;;;;;;;;;;;;;;;;;;;;43136:104;;;43222:6;43185:21;:33;43207:10;43185:33;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;43136:104;43268:17;43274:2;43278:6;43268:5;:17::i;:::-;43341:24;43354:2;43358:6;43341:24;;;;;;;:::i;:::-;;;;;;;;42672:701:::0;;;:::o;18566:91::-;18622:27;18628:12;:10;:12::i;:::-;18642:6;18622:5;:27::i;:::-;18566:91;:::o;39980:363::-;40062:15;40049:10;;;;;;;;;;;:28;;;40045:203;;;40116:5;;;;;;;;;;;40102:19;;:10;:19;;;40094:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;40045:203;;;40206:3;;;;;;;;;;;40192:17;;:10;:17;;;40184:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;40045:203;40327:8;40308:16;;:27;;;;;;;;;;;;;;;;;;39980:363;:::o;43789:2128::-;43902:12;43906:7;43902:3;:12::i;:::-;36991:10;;;;;;;;;;;36965:36;;36972:15;36965:36;;;36961:436;;;37058:5;;;;;;;;;;;37044:19;;:10;:19;;;:192;;;;37160:18;;37125:6;37089:21;:33;37111:10;37089:33;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:89;;:146;;;;;37207:16;:28;37224:10;37207:28;;;;;;;;;;;;;;;;;;;;;;;;;37089:146;37044:192;37018:281;;;;;;;;;;;;:::i;:::-;;;;;;;;;36961:436;;;37354:3;;;;;;;;;;;37340:17;;:10;:17;;;37332:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;36961:436;44027:7:::1;:14;44007:9;:16;:34;43999:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44145:7;44221:527;44237:7;:14;44233:1;:18;;;44221:527;;;44390:3;44366:28;;:9;44376:1;44366:12;;;;;;;;;;:::i;:::-;;;;;;;;:28;;;;44358:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;44538:1;44525:7;44533:1;44525:10;;;;;;;;;;:::i;:::-;;;;;;;;:14;44517:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;44718:3;;;;;;;44221:527;;;44810:16;:28;44827:10;44810:28;;;;;;;;;;;;;;;;;;;;;;;;;44806:621;;;44902:13;44990:1:::0;44986:5:::1;;44981:303;44997:7;:14;44993:1;:18;;;44981:303;;;45093:7;45101:1;45093:10;;;;;;;;;;:::i;:::-;;;;;;;;45084:19;;;;;:::i;:::-;;;45246:3;;;;;;;44981:303;;;45410:5;45373:21;:33;45395:10;45373:33;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;44840:587;44806:621;45494:1;45490:5;;45485:294;45501:7;:14;45497:1;:18;;;45485:294;;;45592:31;45598:9;45608:1;45598:12;;;;;;;;;;:::i;:::-;;;;;;;;45612:7;45620:1;45612:10;;;;;;;;;;:::i;:::-;;;;;;;;45592:5;:31::i;:::-;45749:3;;;;;;;45485:294;;;45872:37;45890:9;45901:7;45872:37;;;;;;;:::i;:::-;;;;;;;;43921:1996;43789:2128:::0;;;:::o;42003:83::-;42046:7;42073:5;;;;;;;;;;;42066:12;;42003:83;:::o;39678:112::-;37640:5;;;;;;;;;;;37626:19;;:10;:19;;;37618:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;39748:4:::1;39740:5;;:12;;;;;;;;;;;;;;;;;;39768:14;39777:4;39768:14;;;;;;:::i;:::-;;;;;;;;39678:112:::0;:::o;8110:177::-;8229:7;8261:9;:18;8271:7;8261:18;;;;;;;;;;;;;;;;8254:25;;8110:177;;;:::o;18976:164::-;19053:46;19069:7;19078:12;:10;:12::i;:::-;19092:6;19053:15;:46::i;:::-;19110:22;19116:7;19125:6;19110:5;:22::i;:::-;18976:164;;:::o;41337:102::-;41385:16;41421:10;41414:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41337:102;:::o;7038:104::-;7094:13;7127:7;7120:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7038:104;:::o;42303:79::-;42344:7;42371:3;;;;;;;;;;;42364:10;;42303:79;:::o;11610:505::-;11730:4;11752:13;11768:12;:10;:12::i;:::-;11752:28;;11791:24;11818:25;11828:5;11835:7;11818:9;:25::i;:::-;11791:52;;11896:15;11876:16;:35;;11854:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;12012:60;12021:5;12028:7;12056:15;12037:16;:34;12012:8;:60::i;:::-;12103:4;12096:11;;;;11610:505;;;;:::o;46128:826::-;46243:4;46336:13;46352:12;:10;:12::i;:::-;46336:28;;46415:20;46468:3;46448:16;;;;;;;;;;;46439:25;;:6;:25;;;;:::i;:::-;46438:33;;;;:::i;:::-;46415:56;;46580:43;46590:5;46597:2;46610:12;46601:6;:21;;;;:::i;:::-;46580:9;:43::i;:::-;46723:45;46733:5;46748:4;46755:12;46723:9;:45::i;:::-;46837:26;46850:12;46837;:26::i;:::-;46942:4;46935:11;;;;46128:826;;;;:::o;30673:37::-;;;;;;;;;;;;;:::o;41684:92::-;41732:6;41758:10;;;;;;;;;;;41751:17;;41684:92;:::o;37993:169::-;37640:5;;;;;;;;;;;37626:19;;:10;:19;;;37618:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;38084:4:::1;38059:16;:22;38076:4;38059:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38099:10;38115:4;38099:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38136:18;38149:4;38136:18;;;;;;:::i;:::-;;;;;;;;37993:169:::0;:::o;8790:201::-;8924:7;8956:11;:18;8968:5;8956:18;;;;;;;;;;;;;;;:27;8975:7;8956:27;;;;;;;;;;;;;;;;8949:34;;8790:201;;;;:::o;40452:565::-;40608:3;40592:20;;:4;:20;;;;40584:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;40825:3;;;;;;;;;;;40811:17;;:10;:17;;;40810:67;;;;40849:3;40834:19;;:3;;;;;;;;;;;:19;;;:42;;;;;40871:5;;;;;;;;;;;40857:19;;:10;:19;;;40834:42;40810:67;40788:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;41005:4;40999:3;;:10;;;;;;;;;;;;;;;;;;40452:565;:::o;4461:98::-;4514:7;4541:10;4534:17;;4461:98;:::o;15350:380::-;15503:1;15486:19;;:5;:19;;;;15478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15584:1;15565:21;;:7;:21;;;;15557:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15668:6;15638:11;:18;15650:5;15638:18;;;;;;;;;;;;;;;:27;15657:7;15638:27;;;;;;;;;;;;;;;:36;;;;15706:7;15690:32;;15699:5;15690:32;;;15715:6;15690:32;;;;;;:::i;:::-;;;;;;;;15350:380;;;:::o;16021:502::-;16156:24;16183:25;16193:5;16200:7;16183:9;:25::i;:::-;16156:52;;16243:17;16223:16;:37;16219:297;;16323:6;16303:16;:26;;16277:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;16438:51;16447:5;16454:7;16482:6;16463:16;:25;16438:8;:51::i;:::-;16219:297;16145:378;16021:502;;;:::o;12594:708::-;12741:1;12725:18;;:4;:18;;;;12717:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12818:1;12804:16;;:2;:16;;;;12796:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12873:38;12894:4;12900:2;12904:6;12873:20;:38::i;:::-;12924:19;12946:9;:15;12956:4;12946:15;;;;;;;;;;;;;;;;12924:37;;13009:6;12994:11;:21;;12972:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;13149:6;13135:11;:20;13117:9;:15;13127:4;13117:15;;;;;;;;;;;;;;;:38;;;;13194:6;13177:9;:13;13187:2;13177:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;13233:2;13218:26;;13227:4;13218:26;;;13237:6;13218:26;;;;;;:::i;:::-;;;;;;;;13257:37;13277:4;13283:2;13287:6;13257:19;:37::i;:::-;12706:596;12594:708;;;:::o;13589:399::-;13692:1;13673:21;;:7;:21;;;;13665:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13743:49;13772:1;13776:7;13785:6;13743:20;:49::i;:::-;13821:6;13805:12;;:22;;;;;;;:::i;:::-;;;;;;;;13860:6;13838:9;:18;13848:7;13838:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;13903:7;13882:37;;13899:1;13882:37;;;13912:6;13882:37;;;;;;:::i;:::-;;;;;;;;13932:48;13960:1;13964:7;13973:6;13932:19;:48::i;:::-;13589:399;;:::o;14321:591::-;14424:1;14405:21;;:7;:21;;;;14397:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14477:49;14498:7;14515:1;14519:6;14477:20;:49::i;:::-;14539:22;14564:9;:18;14574:7;14564:18;;;;;;;;;;;;;;;;14539:43;;14619:6;14601:14;:24;;14593:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14738:6;14721:14;:23;14700:9;:18;14710:7;14700:18;;;;;;;;;;;;;;;:44;;;;14782:6;14766:12;;:22;;;;;;;:::i;:::-;;;;;;;;14832:1;14806:37;;14815:7;14806:37;;;14836:6;14806:37;;;;;;:::i;:::-;;;;;;;;14856:48;14876:7;14893:1;14897:6;14856:19;:48::i;:::-;14386:526;14321:591;;:::o;49767:445::-;49856:13;49937:7;49947:1;49937:11;;49932:273;49954:7;:14;49950:1;:18;;;49932:273;;;50038:7;50046:1;50038:10;;;;;;;;;;:::i;:::-;;;;;;;;50029:19;;;;;:::i;:::-;;;50175:3;;;;;;;49932:273;;;;49767:445;;;:::o;47030:2388::-;47219:57;47236:4;47243:19;;;;;;;;;;;47264:11;47219:8;:57::i;:::-;47343:19;47447:13;;;;;;;;;;;47442:1065;;47535:18;47521:32;;47629:4;47613:13;;:20;;;;;;;;;;;;;;;;;;47442:1065;;;47787:17;47806;47844:5;;;;;;;;;;;47829:51;;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47786:96;;;;;;;;;47982:1;47969:9;:14;;:32;;;;;48000:1;47987:9;:14;;47969:32;47961:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;48069:14;48102:6;;;;;;;;;;;48086:22;;48094:4;48086:22;;;:47;;48127:6;;;;;;;;;;;48086:47;;;48119:4;48086:47;48069:64;;48310:6;48293:23;;48301:4;48293:23;;;48289:207;;;48379:9;48366;48352:11;:23;;;;:::i;:::-;48351:37;;;;:::i;:::-;48337:51;;48289:207;;;48471:9;48458;48444:11;:23;;;;:::i;:::-;48443:37;;;;:::i;:::-;48429:51;;48289:207;47651:856;;;47442:1065;48635:11;48611:21;:35;48603:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48769:1;48754:11;:16;;48746:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;48870:19;;;;;;;;;;;48851:55;;;48928:11;48973:4;49002:11;49028:1;49060;49092:22;;;;;;;;;;;49172:1;49154:15;:19;;;;:::i;:::-;48851:490;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;49399:11;49388:7;;:22;;;;;;;:::i;:::-;;;;;;;;47082:2336;47030:2388;:::o;17123:125::-;;;;:::o;17852:124::-;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1497:139;;;;:::o;1659:370::-;1730:5;1779:3;1772:4;1764:6;1760:17;1756:27;1746:122;;1787:79;;:::i;:::-;1746:122;1904:6;1891:20;1929:94;2019:3;2011:6;2004:4;1996:6;1992:17;1929:94;:::i;:::-;1920:103;;1736:293;1659:370;;;;:::o;2052:::-;2123:5;2172:3;2165:4;2157:6;2153:17;2149:27;2139:122;;2180:79;;:::i;:::-;2139:122;2297:6;2284:20;2322:94;2412:3;2404:6;2397:4;2389:6;2385:17;2322:94;:::i;:::-;2313:103;;2129:293;2052:370;;;;:::o;2428:143::-;2485:5;2516:6;2510:13;2501:22;;2532:33;2559:5;2532:33;:::i;:::-;2428:143;;;;:::o;2577:139::-;2623:5;2661:6;2648:20;2639:29;;2677:33;2704:5;2677:33;:::i;:::-;2577:139;;;;:::o;2722:143::-;2779:5;2810:6;2804:13;2795:22;;2826:33;2853:5;2826:33;:::i;:::-;2722:143;;;;:::o;2871:141::-;2927:5;2958:6;2952:13;2943:22;;2974:32;3000:5;2974:32;:::i;:::-;2871:141;;;;:::o;3018:135::-;3062:5;3100:6;3087:20;3078:29;;3116:31;3141:5;3116:31;:::i;:::-;3018:135;;;;:::o;3159:329::-;3218:6;3267:2;3255:9;3246:7;3242:23;3238:32;3235:119;;;3273:79;;:::i;:::-;3235:119;3393:1;3418:53;3463:7;3454:6;3443:9;3439:22;3418:53;:::i;:::-;3408:63;;3364:117;3159:329;;;;:::o;3494:474::-;3562:6;3570;3619:2;3607:9;3598:7;3594:23;3590:32;3587:119;;;3625:79;;:::i;:::-;3587:119;3745:1;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3716:117;3872:2;3898:53;3943:7;3934:6;3923:9;3919:22;3898:53;:::i;:::-;3888:63;;3843:118;3494:474;;;;;:::o;3974:619::-;4051:6;4059;4067;4116:2;4104:9;4095:7;4091:23;4087:32;4084:119;;;4122:79;;:::i;:::-;4084:119;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:53;4440:7;4431:6;4420:9;4416:22;4395:53;:::i;:::-;4385:63;;4340:118;4497:2;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4468:118;3974:619;;;;;:::o;4599:474::-;4667:6;4675;4724:2;4712:9;4703:7;4699:23;4695:32;4692:119;;;4730:79;;:::i;:::-;4692:119;4850:1;4875:53;4920:7;4911:6;4900:9;4896:22;4875:53;:::i;:::-;4865:63;;4821:117;4977:2;5003:53;5048:7;5039:6;5028:9;5024:22;5003:53;:::i;:::-;4993:63;;4948:118;4599:474;;;;;:::o;5079:894::-;5197:6;5205;5254:2;5242:9;5233:7;5229:23;5225:32;5222:119;;;5260:79;;:::i;:::-;5222:119;5408:1;5397:9;5393:17;5380:31;5438:18;5430:6;5427:30;5424:117;;;5460:79;;:::i;:::-;5424:117;5565:78;5635:7;5626:6;5615:9;5611:22;5565:78;:::i;:::-;5555:88;;5351:302;5720:2;5709:9;5705:18;5692:32;5751:18;5743:6;5740:30;5737:117;;;5773:79;;:::i;:::-;5737:117;5878:78;5948:7;5939:6;5928:9;5924:22;5878:78;:::i;:::-;5868:88;;5663:303;5079:894;;;;;:::o;5979:661::-;6066:6;6074;6082;6131:2;6119:9;6110:7;6106:23;6102:32;6099:119;;;6137:79;;:::i;:::-;6099:119;6257:1;6282:64;6338:7;6329:6;6318:9;6314:22;6282:64;:::i;:::-;6272:74;;6228:128;6395:2;6421:64;6477:7;6468:6;6457:9;6453:22;6421:64;:::i;:::-;6411:74;;6366:129;6534:2;6560:63;6615:7;6606:6;6595:9;6591:22;6560:63;:::i;:::-;6550:73;;6505:128;5979:661;;;;;:::o;6646:329::-;6705:6;6754:2;6742:9;6733:7;6729:23;6725:32;6722:119;;;6760:79;;:::i;:::-;6722:119;6880:1;6905:53;6950:7;6941:6;6930:9;6926:22;6905:53;:::i;:::-;6895:63;;6851:117;6646:329;;;;:::o;6981:663::-;7069:6;7077;7085;7134:2;7122:9;7113:7;7109:23;7105:32;7102:119;;;7140:79;;:::i;:::-;7102:119;7260:1;7285:64;7341:7;7332:6;7321:9;7317:22;7285:64;:::i;:::-;7275:74;;7231:128;7398:2;7424:64;7480:7;7471:6;7460:9;7456:22;7424:64;:::i;:::-;7414:74;;7369:129;7537:2;7563:64;7619:7;7610:6;7599:9;7595:22;7563:64;:::i;:::-;7553:74;;7508:129;6981:663;;;;;:::o;7650:325::-;7707:6;7756:2;7744:9;7735:7;7731:23;7727:32;7724:119;;;7762:79;;:::i;:::-;7724:119;7882:1;7907:51;7950:7;7941:6;7930:9;7926:22;7907:51;:::i;:::-;7897:61;;7853:115;7650:325;;;;:::o;7981:179::-;8050:10;8071:46;8113:3;8105:6;8071:46;:::i;:::-;8149:4;8144:3;8140:14;8126:28;;7981:179;;;;:::o;8166:::-;8235:10;8256:46;8298:3;8290:6;8256:46;:::i;:::-;8334:4;8329:3;8325:14;8311:28;;8166:179;;;;:::o;8351:108::-;8428:24;8446:5;8428:24;:::i;:::-;8423:3;8416:37;8351:108;;:::o;8465:118::-;8552:24;8570:5;8552:24;:::i;:::-;8547:3;8540:37;8465:118;;:::o;8619:732::-;8738:3;8767:54;8815:5;8767:54;:::i;:::-;8837:86;8916:6;8911:3;8837:86;:::i;:::-;8830:93;;8947:56;8997:5;8947:56;:::i;:::-;9026:7;9057:1;9042:284;9067:6;9064:1;9061:13;9042:284;;;9143:6;9137:13;9170:63;9229:3;9214:13;9170:63;:::i;:::-;9163:70;;9256:60;9309:6;9256:60;:::i;:::-;9246:70;;9102:224;9089:1;9086;9082:9;9077:14;;9042:284;;;9046:14;9342:3;9335:10;;8743:608;;;8619:732;;;;:::o;9387:::-;9506:3;9535:54;9583:5;9535:54;:::i;:::-;9605:86;9684:6;9679:3;9605:86;:::i;:::-;9598:93;;9715:56;9765:5;9715:56;:::i;:::-;9794:7;9825:1;9810:284;9835:6;9832:1;9829:13;9810:284;;;9911:6;9905:13;9938:63;9997:3;9982:13;9938:63;:::i;:::-;9931:70;;10024:60;10077:6;10024:60;:::i;:::-;10014:70;;9870:224;9857:1;9854;9850:9;9845:14;;9810:284;;;9814:14;10110:3;10103:10;;9511:608;;;9387:732;;;;:::o;10125:109::-;10206:21;10221:5;10206:21;:::i;:::-;10201:3;10194:34;10125:109;;:::o;10240:147::-;10335:45;10374:5;10335:45;:::i;:::-;10330:3;10323:58;10240:147;;:::o;10393:364::-;10481:3;10509:39;10542:5;10509:39;:::i;:::-;10564:71;10628:6;10623:3;10564:71;:::i;:::-;10557:78;;10644:52;10689:6;10684:3;10677:4;10670:5;10666:16;10644:52;:::i;:::-;10721:29;10743:6;10721:29;:::i;:::-;10716:3;10712:39;10705:46;;10485:272;10393:364;;;;:::o;10763:366::-;10905:3;10926:67;10990:2;10985:3;10926:67;:::i;:::-;10919:74;;11002:93;11091:3;11002:93;:::i;:::-;11120:2;11115:3;11111:12;11104:19;;10763:366;;;:::o;11135:365::-;11277:3;11298:66;11362:1;11357:3;11298:66;:::i;:::-;11291:73;;11373:93;11462:3;11373:93;:::i;:::-;11491:2;11486:3;11482:12;11475:19;;11135:365;;;:::o;11506:::-;11648:3;11669:66;11733:1;11728:3;11669:66;:::i;:::-;11662:73;;11744:93;11833:3;11744:93;:::i;:::-;11862:2;11857:3;11853:12;11846:19;;11506:365;;;:::o;11877:366::-;12019:3;12040:67;12104:2;12099:3;12040:67;:::i;:::-;12033:74;;12116:93;12205:3;12116:93;:::i;:::-;12234:2;12229:3;12225:12;12218:19;;11877:366;;;:::o;12249:::-;12391:3;12412:67;12476:2;12471:3;12412:67;:::i;:::-;12405:74;;12488:93;12577:3;12488:93;:::i;:::-;12606:2;12601:3;12597:12;12590:19;;12249:366;;;:::o;12621:365::-;12763:3;12784:66;12848:1;12843:3;12784:66;:::i;:::-;12777:73;;12859:93;12948:3;12859:93;:::i;:::-;12977:2;12972:3;12968:12;12961:19;;12621:365;;;:::o;12992:366::-;13134:3;13155:67;13219:2;13214:3;13155:67;:::i;:::-;13148:74;;13231:93;13320:3;13231:93;:::i;:::-;13349:2;13344:3;13340:12;13333:19;;12992:366;;;:::o;13364:::-;13506:3;13527:67;13591:2;13586:3;13527:67;:::i;:::-;13520:74;;13603:93;13692:3;13603:93;:::i;:::-;13721:2;13716:3;13712:12;13705:19;;13364:366;;;:::o;13736:365::-;13878:3;13899:66;13963:1;13958:3;13899:66;:::i;:::-;13892:73;;13974:93;14063:3;13974:93;:::i;:::-;14092:2;14087:3;14083:12;14076:19;;13736:365;;;:::o;14107:::-;14249:3;14270:66;14334:1;14329:3;14270:66;:::i;:::-;14263:73;;14345:93;14434:3;14345:93;:::i;:::-;14463:2;14458:3;14454:12;14447:19;;14107:365;;;:::o;14478:::-;14620:3;14641:66;14705:1;14700:3;14641:66;:::i;:::-;14634:73;;14716:93;14805:3;14716:93;:::i;:::-;14834:2;14829:3;14825:12;14818:19;;14478:365;;;:::o;14849:::-;14991:3;15012:66;15076:1;15071:3;15012:66;:::i;:::-;15005:73;;15087:93;15176:3;15087:93;:::i;:::-;15205:2;15200:3;15196:12;15189:19;;14849:365;;;:::o;15220:::-;15362:3;15383:66;15447:1;15442:3;15383:66;:::i;:::-;15376:73;;15458:93;15547:3;15458:93;:::i;:::-;15576:2;15571:3;15567:12;15560:19;;15220:365;;;:::o;15591:366::-;15733:3;15754:67;15818:2;15813:3;15754:67;:::i;:::-;15747:74;;15830:93;15919:3;15830:93;:::i;:::-;15948:2;15943:3;15939:12;15932:19;;15591:366;;;:::o;15963:::-;16105:3;16126:67;16190:2;16185:3;16126:67;:::i;:::-;16119:74;;16202:93;16291:3;16202:93;:::i;:::-;16320:2;16315:3;16311:12;16304:19;;15963:366;;;:::o;16335:398::-;16494:3;16515:83;16596:1;16591:3;16515:83;:::i;:::-;16508:90;;16607:93;16696:3;16607:93;:::i;:::-;16725:1;16720:3;16716:11;16709:18;;16335:398;;;:::o;16739:365::-;16881:3;16902:66;16966:1;16961:3;16902:66;:::i;:::-;16895:73;;16977:93;17066:3;16977:93;:::i;:::-;17095:2;17090:3;17086:12;17079:19;;16739:365;;;:::o;17110:366::-;17252:3;17273:67;17337:2;17332:3;17273:67;:::i;:::-;17266:74;;17349:93;17438:3;17349:93;:::i;:::-;17467:2;17462:3;17458:12;17451:19;;17110:366;;;:::o;17482:365::-;17624:3;17645:66;17709:1;17704:3;17645:66;:::i;:::-;17638:73;;17720:93;17809:3;17720:93;:::i;:::-;17838:2;17833:3;17829:12;17822:19;;17482:365;;;:::o;17853:366::-;17995:3;18016:67;18080:2;18075:3;18016:67;:::i;:::-;18009:74;;18092:93;18181:3;18092:93;:::i;:::-;18210:2;18205:3;18201:12;18194:19;;17853:366;;;:::o;18225:::-;18367:3;18388:67;18452:2;18447:3;18388:67;:::i;:::-;18381:74;;18464:93;18553:3;18464:93;:::i;:::-;18582:2;18577:3;18573:12;18566:19;;18225:366;;;:::o;18597:108::-;18674:24;18692:5;18674:24;:::i;:::-;18669:3;18662:37;18597:108;;:::o;18711:118::-;18798:24;18816:5;18798:24;:::i;:::-;18793:3;18786:37;18711:118;;:::o;18835:115::-;18920:23;18937:5;18920:23;:::i;:::-;18915:3;18908:36;18835:115;;:::o;18956:112::-;19039:22;19055:5;19039:22;:::i;:::-;19034:3;19027:35;18956:112;;:::o;19074:379::-;19258:3;19280:147;19423:3;19280:147;:::i;:::-;19273:154;;19444:3;19437:10;;19074:379;;;:::o;19459:222::-;19552:4;19590:2;19579:9;19575:18;19567:26;;19603:71;19671:1;19660:9;19656:17;19647:6;19603:71;:::i;:::-;19459:222;;;;:::o;19687:332::-;19808:4;19846:2;19835:9;19831:18;19823:26;;19859:71;19927:1;19916:9;19912:17;19903:6;19859:71;:::i;:::-;19940:72;20008:2;19997:9;19993:18;19984:6;19940:72;:::i;:::-;19687:332;;;;;:::o;20025:807::-;20274:4;20312:3;20301:9;20297:19;20289:27;;20326:71;20394:1;20383:9;20379:17;20370:6;20326:71;:::i;:::-;20407:72;20475:2;20464:9;20460:18;20451:6;20407:72;:::i;:::-;20489:80;20565:2;20554:9;20550:18;20541:6;20489:80;:::i;:::-;20579;20655:2;20644:9;20640:18;20631:6;20579:80;:::i;:::-;20669:73;20737:3;20726:9;20722:19;20713:6;20669:73;:::i;:::-;20752;20820:3;20809:9;20805:19;20796:6;20752:73;:::i;:::-;20025:807;;;;;;;;;:::o;20838:373::-;20981:4;21019:2;21008:9;21004:18;20996:26;;21068:9;21062:4;21058:20;21054:1;21043:9;21039:17;21032:47;21096:108;21199:4;21190:6;21096:108;:::i;:::-;21088:116;;20838:373;;;;:::o;21217:634::-;21438:4;21476:2;21465:9;21461:18;21453:26;;21525:9;21519:4;21515:20;21511:1;21500:9;21496:17;21489:47;21553:108;21656:4;21647:6;21553:108;:::i;:::-;21545:116;;21708:9;21702:4;21698:20;21693:2;21682:9;21678:18;21671:48;21736:108;21839:4;21830:6;21736:108;:::i;:::-;21728:116;;21217:634;;;;;:::o;21857:210::-;21944:4;21982:2;21971:9;21967:18;21959:26;;21995:65;22057:1;22046:9;22042:17;22033:6;21995:65;:::i;:::-;21857:210;;;;:::o;22073:313::-;22186:4;22224:2;22213:9;22209:18;22201:26;;22273:9;22267:4;22263:20;22259:1;22248:9;22244:17;22237:47;22301:78;22374:4;22365:6;22301:78;:::i;:::-;22293:86;;22073:313;;;;:::o;22392:419::-;22558:4;22596:2;22585:9;22581:18;22573:26;;22645:9;22639:4;22635:20;22631:1;22620:9;22616:17;22609:47;22673:131;22799:4;22673:131;:::i;:::-;22665:139;;22392:419;;;:::o;22817:::-;22983:4;23021:2;23010:9;23006:18;22998:26;;23070:9;23064:4;23060:20;23056:1;23045:9;23041:17;23034:47;23098:131;23224:4;23098:131;:::i;:::-;23090:139;;22817:419;;;:::o;23242:::-;23408:4;23446:2;23435:9;23431:18;23423:26;;23495:9;23489:4;23485:20;23481:1;23470:9;23466:17;23459:47;23523:131;23649:4;23523:131;:::i;:::-;23515:139;;23242:419;;;:::o;23667:::-;23833:4;23871:2;23860:9;23856:18;23848:26;;23920:9;23914:4;23910:20;23906:1;23895:9;23891:17;23884:47;23948:131;24074:4;23948:131;:::i;:::-;23940:139;;23667:419;;;:::o;24092:::-;24258:4;24296:2;24285:9;24281:18;24273:26;;24345:9;24339:4;24335:20;24331:1;24320:9;24316:17;24309:47;24373:131;24499:4;24373:131;:::i;:::-;24365:139;;24092:419;;;:::o;24517:::-;24683:4;24721:2;24710:9;24706:18;24698:26;;24770:9;24764:4;24760:20;24756:1;24745:9;24741:17;24734:47;24798:131;24924:4;24798:131;:::i;:::-;24790:139;;24517:419;;;:::o;24942:::-;25108:4;25146:2;25135:9;25131:18;25123:26;;25195:9;25189:4;25185:20;25181:1;25170:9;25166:17;25159:47;25223:131;25349:4;25223:131;:::i;:::-;25215:139;;24942:419;;;:::o;25367:::-;25533:4;25571:2;25560:9;25556:18;25548:26;;25620:9;25614:4;25610:20;25606:1;25595:9;25591:17;25584:47;25648:131;25774:4;25648:131;:::i;:::-;25640:139;;25367:419;;;:::o;25792:::-;25958:4;25996:2;25985:9;25981:18;25973:26;;26045:9;26039:4;26035:20;26031:1;26020:9;26016:17;26009:47;26073:131;26199:4;26073:131;:::i;:::-;26065:139;;25792:419;;;:::o;26217:::-;26383:4;26421:2;26410:9;26406:18;26398:26;;26470:9;26464:4;26460:20;26456:1;26445:9;26441:17;26434:47;26498:131;26624:4;26498:131;:::i;:::-;26490:139;;26217:419;;;:::o;26642:::-;26808:4;26846:2;26835:9;26831:18;26823:26;;26895:9;26889:4;26885:20;26881:1;26870:9;26866:17;26859:47;26923:131;27049:4;26923:131;:::i;:::-;26915:139;;26642:419;;;:::o;27067:::-;27233:4;27271:2;27260:9;27256:18;27248:26;;27320:9;27314:4;27310:20;27306:1;27295:9;27291:17;27284:47;27348:131;27474:4;27348:131;:::i;:::-;27340:139;;27067:419;;;:::o;27492:::-;27658:4;27696:2;27685:9;27681:18;27673:26;;27745:9;27739:4;27735:20;27731:1;27720:9;27716:17;27709:47;27773:131;27899:4;27773:131;:::i;:::-;27765:139;;27492:419;;;:::o;27917:::-;28083:4;28121:2;28110:9;28106:18;28098:26;;28170:9;28164:4;28160:20;28156:1;28145:9;28141:17;28134:47;28198:131;28324:4;28198:131;:::i;:::-;28190:139;;27917:419;;;:::o;28342:::-;28508:4;28546:2;28535:9;28531:18;28523:26;;28595:9;28589:4;28585:20;28581:1;28570:9;28566:17;28559:47;28623:131;28749:4;28623:131;:::i;:::-;28615:139;;28342:419;;;:::o;28767:::-;28933:4;28971:2;28960:9;28956:18;28948:26;;29020:9;29014:4;29010:20;29006:1;28995:9;28991:17;28984:47;29048:131;29174:4;29048:131;:::i;:::-;29040:139;;28767:419;;;:::o;29192:::-;29358:4;29396:2;29385:9;29381:18;29373:26;;29445:9;29439:4;29435:20;29431:1;29420:9;29416:17;29409:47;29473:131;29599:4;29473:131;:::i;:::-;29465:139;;29192:419;;;:::o;29617:::-;29783:4;29821:2;29810:9;29806:18;29798:26;;29870:9;29864:4;29860:20;29856:1;29845:9;29841:17;29834:47;29898:131;30024:4;29898:131;:::i;:::-;29890:139;;29617:419;;;:::o;30042:::-;30208:4;30246:2;30235:9;30231:18;30223:26;;30295:9;30289:4;30285:20;30281:1;30270:9;30266:17;30259:47;30323:131;30449:4;30323:131;:::i;:::-;30315:139;;30042:419;;;:::o;30467:::-;30633:4;30671:2;30660:9;30656:18;30648:26;;30720:9;30714:4;30710:20;30706:1;30695:9;30691:17;30684:47;30748:131;30874:4;30748:131;:::i;:::-;30740:139;;30467:419;;;:::o;30892:222::-;30985:4;31023:2;31012:9;31008:18;31000:26;;31036:71;31104:1;31093:9;31089:17;31080:6;31036:71;:::i;:::-;30892:222;;;;:::o;31120:218::-;31211:4;31249:2;31238:9;31234:18;31226:26;;31262:69;31328:1;31317:9;31313:17;31304:6;31262:69;:::i;:::-;31120:218;;;;:::o;31344:214::-;31433:4;31471:2;31460:9;31456:18;31448:26;;31484:67;31548:1;31537:9;31533:17;31524:6;31484:67;:::i;:::-;31344:214;;;;:::o;31564:129::-;31598:6;31625:20;;:::i;:::-;31615:30;;31654:33;31682:4;31674:6;31654:33;:::i;:::-;31564:129;;;:::o;31699:75::-;31732:6;31765:2;31759:9;31749:19;;31699:75;:::o;31780:311::-;31857:4;31947:18;31939:6;31936:30;31933:56;;;31969:18;;:::i;:::-;31933:56;32019:4;32011:6;32007:17;31999:25;;32079:4;32073;32069:15;32061:23;;31780:311;;;:::o;32097:::-;32174:4;32264:18;32256:6;32253:30;32250:56;;;32286:18;;:::i;:::-;32250:56;32336:4;32328:6;32324:17;32316:25;;32396:4;32390;32386:15;32378:23;;32097:311;;;:::o;32414:132::-;32481:4;32504:3;32496:11;;32534:4;32529:3;32525:14;32517:22;;32414:132;;;:::o;32552:::-;32619:4;32642:3;32634:11;;32672:4;32667:3;32663:14;32655:22;;32552:132;;;:::o;32690:114::-;32757:6;32791:5;32785:12;32775:22;;32690:114;;;:::o;32810:::-;32877:6;32911:5;32905:12;32895:22;;32810:114;;;:::o;32930:99::-;32982:6;33016:5;33010:12;33000:22;;32930:99;;;:::o;33035:113::-;33105:4;33137;33132:3;33128:14;33120:22;;33035:113;;;:::o;33154:::-;33224:4;33256;33251:3;33247:14;33239:22;;33154:113;;;:::o;33273:184::-;33372:11;33406:6;33401:3;33394:19;33446:4;33441:3;33437:14;33422:29;;33273:184;;;;:::o;33463:::-;33562:11;33596:6;33591:3;33584:19;33636:4;33631:3;33627:14;33612:29;;33463:184;;;;:::o;33653:147::-;33754:11;33791:3;33776:18;;33653:147;;;;:::o;33806:169::-;33890:11;33924:6;33919:3;33912:19;33964:4;33959:3;33955:14;33940:29;;33806:169;;;;:::o;33981:305::-;34021:3;34040:20;34058:1;34040:20;:::i;:::-;34035:25;;34074:20;34092:1;34074:20;:::i;:::-;34069:25;;34228:1;34160:66;34156:74;34153:1;34150:81;34147:107;;;34234:18;;:::i;:::-;34147:107;34278:1;34275;34271:9;34264:16;;33981:305;;;;:::o;34292:185::-;34332:1;34349:20;34367:1;34349:20;:::i;:::-;34344:25;;34383:20;34401:1;34383:20;:::i;:::-;34378:25;;34422:1;34412:35;;34427:18;;:::i;:::-;34412:35;34469:1;34466;34462:9;34457:14;;34292:185;;;;:::o;34483:348::-;34523:7;34546:20;34564:1;34546:20;:::i;:::-;34541:25;;34580:20;34598:1;34580:20;:::i;:::-;34575:25;;34768:1;34700:66;34696:74;34693:1;34690:81;34685:1;34678:9;34671:17;34667:105;34664:131;;;34775:18;;:::i;:::-;34664:131;34823:1;34820;34816:9;34805:20;;34483:348;;;;:::o;34837:191::-;34877:4;34897:20;34915:1;34897:20;:::i;:::-;34892:25;;34931:20;34949:1;34931:20;:::i;:::-;34926:25;;34970:1;34967;34964:8;34961:34;;;34975:18;;:::i;:::-;34961:34;35020:1;35017;35013:9;35005:17;;34837:191;;;;:::o;35034:96::-;35071:7;35100:24;35118:5;35100:24;:::i;:::-;35089:35;;35034:96;;;:::o;35136:90::-;35170:7;35213:5;35206:13;35199:21;35188:32;;35136:90;;;:::o;35232:114::-;35269:7;35309:30;35302:5;35298:42;35287:53;;35232:114;;;:::o;35352:126::-;35389:7;35429:42;35422:5;35418:54;35407:65;;35352:126;;;:::o;35484:77::-;35521:7;35550:5;35539:16;;35484:77;;;:::o;35567:93::-;35603:7;35643:10;35636:5;35632:22;35621:33;;35567:93;;;:::o;35666:86::-;35701:7;35741:4;35734:5;35730:16;35719:27;;35666:86;;;:::o;35758:121::-;35816:9;35849:24;35867:5;35849:24;:::i;:::-;35836:37;;35758:121;;;:::o;35885:307::-;35953:1;35963:113;35977:6;35974:1;35971:13;35963:113;;;36062:1;36057:3;36053:11;36047:18;36043:1;36038:3;36034:11;36027:39;35999:2;35996:1;35992:10;35987:15;;35963:113;;;36094:6;36091:1;36088:13;36085:101;;;36174:1;36165:6;36160:3;36156:16;36149:27;36085:101;35934:258;35885:307;;;:::o;36198:320::-;36242:6;36279:1;36273:4;36269:12;36259:22;;36326:1;36320:4;36316:12;36347:18;36337:81;;36403:4;36395:6;36391:17;36381:27;;36337:81;36465:2;36457:6;36454:14;36434:18;36431:38;36428:84;;;36484:18;;:::i;:::-;36428:84;36249:269;36198:320;;;:::o;36524:281::-;36607:27;36629:4;36607:27;:::i;:::-;36599:6;36595:40;36737:6;36725:10;36722:22;36701:18;36689:10;36686:34;36683:62;36680:88;;;36748:18;;:::i;:::-;36680:88;36788:10;36784:2;36777:22;36567:238;36524:281;;:::o;36811:180::-;36859:77;36856:1;36849:88;36956:4;36953:1;36946:15;36980:4;36977:1;36970:15;36997:180;37045:77;37042:1;37035:88;37142:4;37139:1;37132:15;37166:4;37163:1;37156:15;37183:180;37231:77;37228:1;37221:88;37328:4;37325:1;37318:15;37352:4;37349:1;37342:15;37369:180;37417:77;37414:1;37407:88;37514:4;37511:1;37504:15;37538:4;37535:1;37528:15;37555:180;37603:77;37600:1;37593:88;37700:4;37697:1;37690:15;37724:4;37721:1;37714:15;37741:180;37789:77;37786:1;37779:88;37886:4;37883:1;37876:15;37910:4;37907:1;37900:15;37927:117;38036:1;38033;38026:12;38050:117;38159:1;38156;38149:12;38173:117;38282:1;38279;38272:12;38296:117;38405:1;38402;38395:12;38419:102;38460:6;38511:2;38507:7;38502:2;38495:5;38491:14;38487:28;38477:38;;38419:102;;;:::o;38527:222::-;38667:34;38663:1;38655:6;38651:14;38644:58;38736:5;38731:2;38723:6;38719:15;38712:30;38527:222;:::o;38755:157::-;38895:9;38891:1;38883:6;38879:14;38872:33;38755:157;:::o;38918:156::-;39058:8;39054:1;39046:6;39042:14;39035:32;38918:156;:::o;39080:221::-;39220:34;39216:1;39208:6;39204:14;39197:58;39289:4;39284:2;39276:6;39272:15;39265:29;39080:221;:::o;39307:::-;39447:34;39443:1;39435:6;39431:14;39424:58;39516:4;39511:2;39503:6;39499:15;39492:29;39307:221;:::o;39534:156::-;39674:8;39670:1;39662:6;39658:14;39651:32;39534:156;:::o;39696:179::-;39836:31;39832:1;39824:6;39820:14;39813:55;39696:179;:::o;39881:225::-;40021:34;40017:1;40009:6;40005:14;39998:58;40090:8;40085:2;40077:6;40073:15;40066:33;39881:225;:::o;40112:156::-;40252:8;40248:1;40240:6;40236:14;40229:32;40112:156;:::o;40274:::-;40414:8;40410:1;40402:6;40398:14;40391:32;40274:156;:::o;40436:::-;40576:8;40572:1;40564:6;40560:14;40553:32;40436:156;:::o;40598:::-;40738:8;40734:1;40726:6;40722:14;40715:32;40598:156;:::o;40760:::-;40900:8;40896:1;40888:6;40884:14;40877:32;40760:156;:::o;40922:220::-;41062:34;41058:1;41050:6;41046:14;41039:58;41131:3;41126:2;41118:6;41114:15;41107:28;40922:220;:::o;41148:224::-;41288:34;41284:1;41276:6;41272:14;41265:58;41357:7;41352:2;41344:6;41340:15;41333:32;41148:224;:::o;41378:114::-;;:::o;41498:156::-;41638:8;41634:1;41626:6;41622:14;41615:32;41498:156;:::o;41660:223::-;41800:34;41796:1;41788:6;41784:14;41777:58;41869:6;41864:2;41856:6;41852:15;41845:31;41660:223;:::o;41889:156::-;42029:8;42025:1;42017:6;42013:14;42006:32;41889:156;:::o;42051:224::-;42191:34;42187:1;42179:6;42175:14;42168:58;42260:7;42255:2;42247:6;42243:15;42236:32;42051:224;:::o;42281:181::-;42421:33;42417:1;42409:6;42405:14;42398:57;42281:181;:::o;42468:122::-;42541:24;42559:5;42541:24;:::i;:::-;42534:5;42531:35;42521:63;;42580:1;42577;42570:12;42521:63;42468:122;:::o;42596:::-;42669:24;42687:5;42669:24;:::i;:::-;42662:5;42659:35;42649:63;;42708:1;42705;42698:12;42649:63;42596:122;:::o;42724:::-;42797:24;42815:5;42797:24;:::i;:::-;42790:5;42787:35;42777:63;;42836:1;42833;42826:12;42777:63;42724:122;:::o;42852:120::-;42924:23;42941:5;42924:23;:::i;:::-;42917:5;42914:34;42904:62;;42962:1;42959;42952:12;42904:62;42852:120;:::o;42978:118::-;43049:22;43065:5;43049:22;:::i;:::-;43042:5;43039:33;43029:61;;43086:1;43083;43076:12;43029:61;42978:118;:::o
Swarm Source
ipfs://5528a9f71ac5e37961cf350ecf40063811090eac2d76afc29c499d5b9b6d42c4