Overview [ERC-20]
Price
$0.00
@ 0.000000 Eth
Fully Diluted Market Cap
Max Total Supply:
210,000,000
JEDI
Holders:
228
Contract:
Decimals:
9
Balance
7,285.678686562 JEDIValue
$0.00
[ Download
CSV Export
]
[ Download
CSV Export
]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Fungi
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes
with
200
runs
Other Settings:
london
EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; import "./Erc20.sol"; import "./PoolCreatableErc20i.sol"; import "../Generator.sol"; library ExtraSeedLibrary { function extra( address account, uint extraSeed ) internal pure returns (uint256) { return uint(keccak256(abi.encodePacked(account, extraSeed))); } function seed_data( address account, uint seed, uint extraSeed ) internal pure returns (SeedData memory) { return SeedData(seed, extra(account, extraSeed)); } } abstract contract Inscriptions is PoolCreatableErc20i { using ExtraSeedLibrary for address; mapping(address owner => uint) _counts; mapping(address owner => mapping(uint index => SeedData seed_data)) _ownedTokens; mapping(address owner => mapping(uint tokenId => uint)) _ownedTokensIndex; mapping(address owner => mapping(uint => bool)) _owns; mapping(address owner => SeedData seed_data) _dynamicInscription; mapping(uint index => address user) _holderList; mapping(address user => uint index) _holderListIndexes; uint _inscriptionsTotalCount; uint _holdersCount; uint _dynamicInscriptionTotalCount; uint _random_nonce; event OnMushroomTransfer( address indexed from, address indexed to, SeedData seed_data ); event OnSporesGrow(address indexed holder, SeedData seed_data); event OnSporesShrink(address indexed holder, SeedData seed_data); constructor() PoolCreatableErc20i("Jedi", "JEDI", msg.sender) {} modifier holder_calculate(address acc1, address acc2) { bool before1 = _isHolder(acc1); bool before2 = _isHolder(acc2); _; bool after1 = _isHolder(acc1); bool after2 = _isHolder(acc2); if (!before1 && after1) _addHolder(acc1); if (before1 && !after1) _removeHolder(acc1); if (!before2 && after2) _addHolder(acc2); if (before2 && !after2) _removeHolder(acc2); } function _isHolder(address account) private view returns (bool) { if ( account == address(this) || account == _pool || account == address(0) ) return false; return (_dynamicInscription[account].seed + this.inscriptionCount(account)) > 0; } function trySeedTransfer( address from, address to, uint amount ) internal holder_calculate(from, to) { if (from == address(this)) return; uint seed = amount / (10 ** decimals()); if (seed > 0 && from != _pool && to != _pool) { // transfer growing inscription if (_dynamicInscription[from].seed == seed && !_owns[to][seed]) { SeedData memory data = _dynamicInscription[from]; _removeSeedCount(from, seed); _addTokenToOwnerEnumeration(to, data); emit OnMushroomTransfer(from, to, data); return; } // transfer collected inscription if (_owns[from][seed] && !_owns[to][seed]) { SeedData memory data = _ownedTokens[from][ _ownedTokensIndex[from][seed] ]; _removeTokenFromOwnerEnumeration(from, seed); _addTokenToOwnerEnumeration(to, data); emit OnMushroomTransfer(from, to, data); return; } } // transfer dynamicInscription uint lastBalanceFromSeed = _balances[from] / (10 ** decimals()); uint newBalanceFromSeed = (_balances[from] - amount) / (10 ** decimals()); _removeSeedCount(from, lastBalanceFromSeed - newBalanceFromSeed); _addSeedCount(to, seed); } function _addHolder(address account) private { _holderList[_holdersCount] = account; _holderListIndexes[account] = _holdersCount; ++_holdersCount; } function _removeHolder(address account) private { if (_holdersCount == 0) return; uint removingIndex = _holderListIndexes[account]; if (removingIndex != _holdersCount - 1) { address lastHolder = _holderList[_holdersCount - 1]; _holderList[removingIndex] = lastHolder; _holderListIndexes[lastHolder] = removingIndex; } --_holdersCount; delete _holderListIndexes[account]; delete _holderList[_holdersCount]; } function getHolderByIndex(uint index) public view returns (address) { return _holderList[index]; } function getHoldersList( uint startIndex, uint count ) public view returns (address[] memory) { address[] memory holders = new address[](count); for (uint i = 0; i < count; ++i) holders[i] = getHolderByIndex(startIndex + i); return holders; } function _addSeedCount(address account, uint seed) private { if (seed == 0) return; if (account == _pool) return; SeedData memory last = _dynamicInscription[account]; _dynamicInscription[account].seed += seed; _dynamicInscription[account].extra = account.extra(++_random_nonce); if (last.seed == 0 && _dynamicInscription[account].seed > 0) ++_dynamicInscriptionTotalCount; emit OnSporesGrow(account, _dynamicInscription[account]); } function _removeSeedCount(address account, uint seed) private { if (seed == 0) return; if (account == _pool) return; SeedData memory lastSpores = _dynamicInscription[account]; if (_dynamicInscription[account].seed >= seed) { _dynamicInscription[account].seed -= seed; _dynamicInscription[account].extra = account.extra(++_random_nonce); if (lastSpores.seed > 0 && _dynamicInscription[account].seed == 0) --_dynamicInscriptionTotalCount; emit OnSporesShrink(account, _dynamicInscription[account]); return; } uint seedRemains = seed - _dynamicInscription[account].seed; _dynamicInscription[account].seed = 0; _dynamicInscription[account].extra = account.extra(++_random_nonce); // remove inscriptions uint count = _counts[account]; uint removed; for (uint i = 0; i < count && removed < seedRemains; ++i) { removed += _removeFirstTokenFromOwner(account); } if (removed > seedRemains) { _dynamicInscription[account].seed += removed - seedRemains; _dynamicInscription[account].extra = account.extra(++_random_nonce); } if (lastSpores.seed > 0 && _dynamicInscription[account].seed == 0) --_dynamicInscriptionTotalCount; if (lastSpores.seed == 0 && _dynamicInscription[account].seed > 0) ++_dynamicInscriptionTotalCount; emit OnSporesShrink(account, _dynamicInscription[account]); } function _addTokenToOwnerEnumeration( address to, SeedData memory data ) private { if (to == _pool) return; ++_counts[to]; ++_inscriptionsTotalCount; uint length = _counts[to] - 1; _ownedTokens[to][length] = data; _ownedTokensIndex[to][data.seed] = length; _owns[to][data.seed] = true; } function _removeTokenFromOwnerEnumeration(address from, uint seed) private { if (from == _pool) return; --_counts[from]; --_inscriptionsTotalCount; _owns[from][seed] = false; uint lastTokenIndex = _counts[from]; uint tokenIndex = _ownedTokensIndex[from][seed]; SeedData memory data = _ownedTokens[from][tokenIndex]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { SeedData memory lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[from][lastTokenId.seed] = tokenIndex; // Update the moved token's index } delete _ownedTokensIndex[from][data.seed]; delete _ownedTokens[from][lastTokenIndex]; } function _removeFirstTokenFromOwner(address owner) private returns (uint) { uint count = _counts[owner]; if (count == 0) return 0; uint seed = _ownedTokens[owner][0].seed; _removeTokenFromOwnerEnumeration(owner, seed); return seed; } function isOwnerOf(address owner, uint seed) external view returns (bool) { return _owns[owner][seed]; } function dynamicInscription( address owner ) external view returns (SeedData memory data) { return _dynamicInscription[owner]; } function inscriptionCount(address owner) external view returns (uint) { return _counts[owner]; } function inscriptionOfOwnerByIndex( address owner, uint index ) external view returns (SeedData memory data) { return _ownedTokens[owner][index]; } function inscriptionsTotalCount() external view returns (uint) { return _inscriptionsTotalCount; } function holdersCount() external view returns (uint) { return _holdersCount; } function dynamicInscriptionTotalCount() external view returns (uint) { return _dynamicInscriptionTotalCount; } function getHolderIndex(address account) external view returns (uint) { return _holderListIndexes[account]; } } contract Fungi is Inscriptions, Generator, ReentrancyGuard { uint constant _startTotalSupply = 210e6 * (10 ** _decimals); uint constant _startMaxBuyCount = (_startTotalSupply * 5) / 10000; uint constant _addMaxBuyPercentPerSec = 5; // 100%=_addMaxBuyPrecesion add 0.005%/second uint constant _addMaxBuyPrecesion = 100000; constructor() { _mint(msg.sender, _startTotalSupply); } modifier maxBuyLimit(uint256 amount) { require(amount <= maxBuy(), "max buy limit"); _; } function maxBuy() public view returns (uint256) { if (!isStarted()) return _startTotalSupply; uint256 count = _startMaxBuyCount + (_startTotalSupply * (block.timestamp - _startTime) * _addMaxBuyPercentPerSec) / _addMaxBuyPrecesion; if (count > _startTotalSupply) count = _startTotalSupply; return count; } function _transfer( address from, address to, uint256 amount ) internal override { if (isStarted()) { trySeedTransfer(from, to, amount); } else { require(from == _owner || to == _owner, "not started"); } // allow burning if (to == address(0)) { _burn(from, amount); return; } // system transfers if (from == address(this)) { super._transfer(from, to, amount); return; } if (_feeLocked) { super._transfer(from, to, amount); return; } else { if (from == _pool) { buy(to, amount); return; } } super._transfer(from, to, amount); } function buy( address to, uint256 amount ) private maxBuyLimit(amount) lockFee { super._transfer(_pool, to, amount); } function burnCount() public view returns (uint256) { return _startTotalSupply - totalSupply(); } function getSvg(SeedData memory seed_data) public view returns (string memory) { if (isStarted()){ return toSvg(seed_data); } return ""; } function getMeta(SeedData memory seed_data) public view returns (string memory) { if (isStarted()){ return toMeta(seed_data); } return ""; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } }
pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "@openzeppelin/contracts/utils/Context.sol"; contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) internal _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 internal _totalSupply; uint8 internal constant _decimals = 9; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * 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 default value returned by this function, unless * it's 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 pure returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `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 `from` to `to`. * * 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"); uint256 fromBalance = _balances[from]; require( fromBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(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"); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); } /** * @dev Erases `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"); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev 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); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import "./Erc20.sol"; abstract contract PoolCreatableErc20i is ERC20 { address internal _pool; uint256 internal _startTime; bool internal _feeLocked; address immutable _pairCreator; constructor( string memory name_, string memory symbol_, address pairCreator ) ERC20(name_, symbol_) { _pairCreator = pairCreator; } modifier lockFee() { _feeLocked = true; _; _feeLocked = false; } function launch(address poolAddress) external payable { require(msg.sender == _pairCreator); require(!isStarted()); _pool = poolAddress; _startTime = block.timestamp; } function isStarted() internal view returns (bool) { return _pool != address(0); } function pool() external view returns (address) { return _pool; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "./lib/Ownable.sol"; import "forge-std/console.sol"; uint constant levelsCount = 5; uint constant seedLevel1 = 1050; uint constant seedLevel2 = 10500; uint constant seedLevel3 = 105000; uint constant seedLevel4 = 1050000; string constant description = "Jedi, $JEDI. May the force be with you."; string constant web = "https://jedi.army/"; string constant viewBox="0 0 320.25 320.25"; uint constant pixelsCount = 256; struct SaberData { uint lvl; string uuid; string hilt_color; uint hilt_colors_index; string beam_color; string beam_glow_color;//_1; string background_color; // string beam_glow_color_2; uint saber_shape_id; SaberShape saberShape; } // struct HiltColors{ // string base; // string darkerBase; // string highlight; // } struct SaberShape { string[] hilt; string[] beam; glowParts beam_glow; } struct glowParts { string[] defs; string[] outline; string[] radial; } struct ColorsData { string[] lvl0; string[] lvl1; string[] lvl2; string[] lvl3; string[] lvl4; } struct SeedData { uint seed; uint extra; } struct Rand { uint seed; uint nonce; uint extra; } struct Rect { uint8 x; uint8 y; uint8 width; uint8 height; } struct FileData { uint lvl; uint file; SaberShape[] saberShape; } library RandLib { function next(Rand memory rnd) internal pure returns (uint) { return uint( keccak256( abi.encodePacked(rnd.seed + rnd.nonce++ - 1, rnd.extra) ) ); } function lvl(Rand memory rnd) internal pure returns (uint) { if (rnd.seed < seedLevel1) return 0; if (rnd.seed < seedLevel2) return 1; if (rnd.seed < seedLevel3) return 2; if (rnd.seed < seedLevel4) return 3; return 4; } function random( string[] memory data, Rand memory rnd ) internal pure returns (string memory) { return data[randomIndex(data, rnd)]; } function randomIndex( string[] memory data, Rand memory rnd ) internal pure returns (uint) { return next(rnd) % data.length; } } library LayersLib { function getLvl( mapping(uint => SaberShape[]) storage saberShapes, uint lvl ) internal view returns (SaberShape[] storage) { return saberShapes[lvl]; } function to_lvl_1(uint l) internal pure returns (uint) { if (l > 0) --l; return l; } } library Converter { function toString(uint value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint temp = value; uint digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } } library RectLib { using RectLib for Rect; using RandLib for Rand; using RandLib for string[]; using Converter for uint8; function toSvg( Rect memory r, string memory color ) internal pure returns (string memory) { return string( abi.encodePacked( "<rect x='", r.x.toString(), "' y='", r.y.toString(), "' width='", r.width.toString(), "' height='", r.height.toString(), "' fill='", color, "'/>" ) ); } function toSvg( Rect[] storage rects, string[] storage colors, Rand memory rnd ) internal view returns (string memory) { string memory res; for (uint i = 0; i < rects.length; ++i) { res = string( abi.encodePacked(res, rects[i].toSvg(colors.random(rnd))) ); } return res; } function toSvg( Rect[] storage rects, string memory color ) internal view returns (string memory) { string memory res; for (uint i = 0; i < rects.length; ++i) { res = string(abi.encodePacked(res, rects[i].toSvg(color))); } return res; } } contract Generator is Ownable { using LayersLib for mapping(uint => SaberShape[]); using LayersLib for mapping(uint => string[]); using LayersLib for uint; using RectLib for Rect; using RectLib for Rect[]; using RandLib for Rand; using RandLib for string[]; using Converter for uint; // uint8 spores_count = 7; // uint8[levelsCount] stemLevelCounts = [5, 5, 5, 6, 10]; // uint8[levelsCount] capLevelCounts = [5, 7, 10, 10, 10]; // uint8[levelsCount] dotLevelCounts = [5, 7, 10, 10, 10]; string stars; // mapping(uint => Rect[]) spores; // mapping(uint => mapping(uint => Rect[])) stems; // mapping(uint => mapping(uint => Rect[])) caps; // mapping(uint => mapping(uint => Rect[])) dots; // mapping(uint => Rect[]) grounds; mapping(uint => SaberShape[]) saberShapes; string coreColor = "#fff"; string[] backgroundColors = [ "#190518", "#07071C", "#102421", "#05110B", "#000000" ]; string[][] colors = [ ['#f9e2dc', '#ffaa94'], ['#f7da8a', '#ffcc41'], ['#dbd1b8', '#ffdd89'], ['#bd9e32', '#ffc600'], ['#dad2c7', '#ffd59c'], ['#7eba72', '#6cff4f'], ['#070707', '#533a3a'], ['#79818c', '#7aa1d8'], ['#253c42', '#25788e'], ['#793695', '#a30ee1'], ['#e1bfa4', '#ffad6d'], ['#ad73b0', '#f459fc'], ['#a7a37e', '#f3e66e'], ['#1174b7', '#0098ff'], ['#475363', '#4975af'], ['#3e894a', '#20d53d'], ['#ede9ea', '#ffaec2'], ['#4f1f1d', '#9b100a'], ['#2b4f5f', '#1a7eab'], ['#df7bb2', '#ff40a9'], ['#daa478', '#ff953f'], ['#bfcf6c', '#deff38'], ['#5f5c33', '#aba228'], ['#203064', '#032cb0'], ['#2c3942', '#34698e'], ['#354a5b', '#2f71a7'], ['#a7a49b', '#f3dc98'], ['#771e16', '#c31000'], ['#4c7c92', '#31a7de'], ['#f1d34f', '#ffd107'], ['#79533e', '#c56129'], ['#74bf48', '#6aff13'], ['#266751', '#0cb37a'], ['#edecda', '#fff99e'], ['#745a63', '#c05b7e'], ['#303680', '#0f1dcc'], ['#cf463c', '#ff1100'], ['#c23a2a', '#ff1a00'], ['#70a9c6', '#43bfff'], ['#3195d3', '#009dff'], ['#e4422d', '#ff1d00'], ['#5c88b7', '#3395ff'], ['#face61', '#ffbc16'], ['#562912', '#a23600'], ['#3f6d50', '#33b965'], ['#704e33', '#bc631d'], ['#f2842d', '#ff7000'], ['#fefefe', '#ffb2b2'], ['#b0d0dd', '#7ed9ff'], ['#155fa6', '#007bf2'], ['#ad2e28', '#f90b00'], ['#103056', '#004aa2'], ['#f6944d', '#ff6d03'], ['#d94129', '#ff2200'], ['#3d5531', '#53a12c'], ['#762c1f', '#c21d00'], ['#f0ec55', '#fff80d'], ['#98d5f1', '#54c9ff'], ['#dcded3', '#eeffa5'], ['#bc7d2e', '#ff8d00'], ['#707070', '#bc8383'], ['#41143b', '#8d017a'], ['#f04730', '#ff1e00'], ['#0d0c11', '#31255d'], ['#f59f66', '#ff771d'], ['#ddd9da', '#ffadc2'], ['#2f705a', '#16bc84'], ['#5ea0c3', '#2eb6ff'], ['#919f9f', '#90ebeb'], ['#753d18', '#c14c00'], ['#070707', '#533a3a'], ['#452216', '#912702'], ['#4e1d0c', '#9a2700'], ['#389ecb', '#00b0ff'], ['#f07050', '#ff3908'], ['#1d1d1d', '#694949'], ['#3d7aba', '#0780ff'], ['#78808b', '#79a1d7'], ['#784a28', '#c45706'], ['#c0982f', '#ffb800'] ]; // string[] private beam_glow_color_1_lvl0 = [ // "#493114" // ]; // string[] private beam_glow_color_2_lvl0 = [ // "#453879" // ]; // string[] private beam_color_lvl0 = [ // "#656565" // ]; // HiltColors[] private hilt_colors_lvl0 = [ // HiltColors("#acacac","","") // ]; // string[] private beam_glow_color_1_lvl1 = [ // "#493114" // ]; // string[] private beam_glow_color_2_lvl1 = [ // "#453879" // ]; // string[] private beam_color_lvl1 = [ // "#231b32" // ]; // HiltColors[] private hilt_colors_lvl1 = [ // HiltColors("#acacac","","") // ]; // string[] private beam_glow_color_1_lvl2 = [ // "#493114" // ]; // string[] private beam_glow_color_2_lvl2 = [ // "#453879" // ]; // string[] private beam_color_lvl2 = [ // "#231b32" // ]; // HiltColors[] private hilt_colors_lvl2 = [ // HiltColors("#acacac","","") // ]; // string[] private beam_glow_color_1_lvl3 = [ // "#493114" // ]; // string[] private beam_glow_color_2_lvl3 = [ // "#453879" // ]; // string[] private beam_color_lvl3 = [ // "#231b32" // ]; // HiltColors[] private hilt_colors_lvl3 = [ // HiltColors("#acacac","","") // ]; // string[] private beam_glow_color_1_lvl4 = [ // "#493114" // ]; // string[] private beam_glow_color_2_lvl4 = [ // "#453879" // ]; // string[] private beam_color_lvl4 = [ // "#231b32" // ]; // HiltColors[] private hilt_colors_lvl4 = [ // HiltColors("#acacac","","") // ]; // SaberShape[] private saberShapes_lvl0; // SaberShape[] private saberShapes_lvl1; // SaberShape[] private saberShapes_lvl2; // SaberShape[] private saberShapes_lvl3; // SaberShape[] private saberShapes_lvl4; // SaberShape[][] private saberShapes = [saberShapes_lvl0, saberShapes_lvl1, saberShapes_lvl2, saberShapes_lvl3, saberShapes_lvl4]; constructor() {} // function get_color(uint index) public view returns (string[] memory) { // return colors[index]; // } // function beam_glow_color_1( // uint index // ) private view returns (string[] storage) { // if (index == 0) return beam_glow_color_1_lvl0; // if (index == 1) return beam_glow_color_1_lvl1; // if (index == 2) return beam_glow_color_1_lvl2; // if (index == 3) return beam_glow_color_1_lvl3; // if (index == 4) return beam_glow_color_1_lvl4; // return beam_glow_color_1_lvl0; // } // function beam_glow_color_2( // uint index // ) private view returns (string[] storage) { // if (index == 0) return beam_glow_color_2_lvl0; // if (index == 1) return beam_glow_color_2_lvl1; // if (index == 2) return beam_glow_color_2_lvl2; // if (index == 3) return beam_glow_color_2_lvl3; // if (index == 4) return beam_glow_color_2_lvl4; // return beam_glow_color_2_lvl0; // } // function beam_color( // uint index // ) private view returns (string[] storage) { // if (index == 0) return beam_color_lvl0; // if (index == 1) return beam_color_lvl1; // if (index == 2) return beam_color_lvl2; // if (index == 3) return beam_color_lvl3; // if (index == 4) return beam_color_lvl4; // return beam_color_lvl0; // } // function hilt_colors( // uint index // ) private view returns (HiltColors[] storage) { // if (index == 0) return hilt_colors_lvl0; // if (index == 1) return hilt_colors_lvl1; // if (index == 2) return hilt_colors_lvl2; // if (index == 3) return hilt_colors_lvl3; // if (index == 4) return hilt_colors_lvl4; // return hilt_colors_lvl0; // } // function setSaberShape(SaberShape calldata shape, uint8 lvl) external onlyOwner { // saberShapes[lvl].push(shape); // } // function setSaberShapes(SaberShape[] calldata shape, uint8 lvl) external onlyOwner { // console.log('setSaberShapes', shape.length); // console.log('lvl', lvl); // for (uint i = 0; i < shape.length; ++i) { // saberShapes[lvl].push(shape[i]); // } // } function addSaberShape(SaberShape calldata shape, uint8 lvl) external onlyOwner { console.log('addSaberShape'); saberShapes[lvl].push(shape); } function setStars(string memory _stars) public onlyOwner { stars = _stars; } function toString(uint value) private pure returns (string memory) { if (value == 0) { return "0"; } uint temp = value; uint digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function setData(SeedData memory seed_data) private view returns (SaberData memory) { Rand memory rnd = Rand(seed_data.seed, 0, seed_data.extra); SaberData memory data; data.lvl = rnd.lvl().to_lvl_1(); console.log('data.lvl', data.lvl); data.uuid = string(abi.encodePacked(seed_data.seed.toString(), '_', seed_data.extra.toString())); uint backgroundIndex = rnd.next() % backgroundColors.length; data.background_color = backgroundColors[backgroundIndex]; uint hiltColorIndex = rnd.next() % colors.length; data.hilt_color = colors[hiltColorIndex][0]; uint beamColorPairId = rnd.next() % colors.length; string[] memory beamColorPair = colors[beamColorPairId]; data.beam_color = coreColor; //beamColorPair[1]; data.beam_glow_color = beamColorPair[1]; console.log('2'); // data.beam_glow_color_1 = beam_glow_color_1(data.lvl).random(rnd); // data.beam_glow_color_2 = beam_glow_color_2(data.lvl).random(rnd); uint saberShapeId = rnd.next() % saberShapes[data.lvl].length; console.log('3'); SaberShape memory saberShape = saberShapes[data.lvl][saberShapeId]; data.saber_shape_id = saberShapeId; data.saberShape = saberShape; return data; } function toSvg( SeedData memory seed_data ) internal view returns (string memory) { return toSvg(setData(seed_data)); } function toMeta( SeedData memory seed_data ) internal view returns (string memory) { SaberData memory data = setData(seed_data); string memory meta = string(abi.encodePacked( "{", '"Level":', data.lvl.toString(), ', "Hilt Color":"', data.hilt_color, '"', // ', "hilt_color_darker_base":"', // data.hilt_colors.darkerBase, // '"', // ', "hilt_color_highlight":"', // data.hilt_colors.highlight, // '"', ', "Beam Color":"', data.beam_color, '"', ', "Beam Glow Color":"', data.beam_glow_color, '"', ', "Background Color":"', data.background_color, '"', // ', "beam_glow_color_2":"', // data.beam_glow_color_2, // '"', ', "Saber Shape id":', data.saber_shape_id.toString(), ', "Description":"', description, '"', ', "Web":"', web, '"', "}" )); return meta; } // function generateGlowClass(SaberData memory data) private pure returns (string memory) { // string memory radialGradientClass = string(abi.encodePacked('radial-gradient-', data.uuid)); // string memory full_glow_class = string(abi.encodePacked( // "<svg viewBox='", viewBox, "'>", // data.saberShape.beam_glow.defs[0], // radialGradientClass, // data.saberShape.beam_glow.defs[1], // data.beam_glow_color_1, // data.saberShape.beam_glow.defs[2], // data.beam_glow_color_1, // data.saberShape.beam_glow.defs[3], // data.saberShape.beam_glow.rest[0], // radialGradientClass, // data.saberShape.beam_glow.rest[1], // "</svg>" // )); // return full_glow_class; // } function addColor(string[] memory parts, string memory color) private view returns (string memory) { string memory res; if (parts.length == 0) return res; for (uint i = 0; i < parts.length-1; ++i) { console.log('parts[i]', parts[i]); res = string(abi.encodePacked(res, parts[i], color)); } return string(abi.encodePacked(res, parts[parts.length-1])); return res; } function generateGlowSvg(SaberData memory data) private view returns (string memory) { console.log('generateGlowSvg'); if (data.saberShape.beam_glow.defs.length == 0) return ""; string memory radialGradientClass = string(abi.encodePacked('radial-gradient-', data.uuid)); string memory full_glow = string(abi.encodePacked( "<svg viewBox='", viewBox, "'>", "<defs>", data.saberShape.beam_glow.defs[0], radialGradientClass, data.saberShape.beam_glow.defs[1], data.beam_glow_color, data.saberShape.beam_glow.defs[2], data.beam_glow_color, data.saberShape.beam_glow.defs[3], "</defs>", addColor(data.saberShape.beam_glow.outline, data.beam_glow_color), data.saberShape.beam_glow.radial[0], radialGradientClass, data.saberShape.beam_glow.radial[1], "</svg>" )); console.log('done generateGlowSvg'); // string memory full_glow_class = generateGlowClass(data); // string memory glow_class = string(abi.encodePacked('glow_', data.uuid)); // string memory full_glow = addColor(data.saberShape.beam_glow, glow_class); // string memory result = string(abi.encodePacked( // "<svg viewBox='", viewBox, "'>", // "<defs>", // "<style>", // full_glow_class, // "</style>", // "</defs>", // full_glow, // "</svg>" // )); return full_glow; } function generateBeamSvg(SaberData memory data) private view returns (string memory) { console.log('generateBeamSvg'); string memory beam = addColor(data.saberShape.beam, data.beam_color); string memory result = string(abi.encodePacked( "<svg viewBox='", viewBox, "'>", beam, "</svg>" )); console.log('done generateBeamSvg'); return result; } function generateHiltSvg(SaberData memory data) private view returns (string memory) { console.log('generateHiltSvg'); string memory hilt; hilt = string(abi.encodePacked( addColor(data.saberShape.hilt, data.hilt_color) // addColor(data.saberShape.hilt.darkerBase, data.hilt_colors.darkerBase), // addColor(data.saberShape.hilt.highlight, data.hilt_colors.highlight) )); string memory result = string(abi.encodePacked( "<svg viewBox='", viewBox, "'>", hilt, "</svg>" )); console.log('done generateHiltSvg'); return result; } function generateBackground(SaberData memory data) private view returns (string memory) { console.log('generateBackground'); string memory background = string(abi.encodePacked( "<rect x='0' y='0' width='100%' height='100%' fill='", data.background_color, "' />", stars )); console.log('done generateBackground'); return background; } function toSvg( SaberData memory data ) private view returns (string memory) { console.log('toSvg'); bytes memory svgStart = abi.encodePacked( "<svg xmlns='http://www.w3.org/2000/svg' viewBox='", viewBox, "'>" ); return string( abi.encodePacked( svgStart, generateBackground(data), generateGlowSvg(data), generateBeamSvg(data), generateHiltSvg(data), "</svg>" ) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract Ownable { address _owner; event RenounceOwnership(); constructor() { _owner = msg.sender; } modifier onlyOwner() { require(_owner == msg.sender, "only owner"); _; } function owner() external view virtual returns (address) { return _owner; } function ownerRenounce() public onlyOwner { _owner = address(0); emit RenounceOwnership(); } function transferOwnership(address newOwner) external onlyOwner { _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "remappings": [ "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "v3-core/=lib/v3-core/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted - Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnMushroomTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnSporesGrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnSporesShrink","type":"event"},{"anonymous":false,"inputs":[],"name":"RenounceOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"components":[{"internalType":"string[]","name":"hilt","type":"string[]"},{"internalType":"string[]","name":"beam","type":"string[]"},{"components":[{"internalType":"string[]","name":"defs","type":"string[]"},{"internalType":"string[]","name":"outline","type":"string[]"},{"internalType":"string[]","name":"radial","type":"string[]"}],"internalType":"struct glowParts","name":"beam_glow","type":"tuple"}],"internalType":"struct SaberShape","name":"shape","type":"tuple"},{"internalType":"uint8","name":"lvl","type":"uint8"}],"name":"addSaberShape","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":[],"name":"burnCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"dynamicInscription","outputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicInscriptionTotalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getHolderByIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getHolderIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getHoldersList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getMeta","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getSvg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"inscriptionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"inscriptionOfOwnerByIndex","outputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inscriptionsTotalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolAddress","type":"address"}],"name":"launch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_stars","type":"string"}],"name":"setStars","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
604060a0815234620021105762000015620021b7565b600490818152602090634a65646960e01b8282015262000034620021b7565b838152634a45444960e01b8382015281516001600160401b0391828211620020fb5760039162000065835462002115565b94601f95868111620020c9575b5086908683116001146200205e57620000a592916000918362001c2d575b50508160011b916000199060031b1c19161790565b82555b80519083821162001f7d57620000bf875462002115565b85811162002021575b50859085831160011462001fb657620000fa92916000918362001c2d5750508160011b916000199060031b1c19161790565b85555b336080523360018060a01b031960135416176013556200011f60165462002115565b83811162001f92575b5060086311b3333360e11b01601655855160a081018381118282101762001f7d57875262000155620021b7565b90600791828152660466272606a62760cb1b87820152815262000177620021b7565b828152662330373037314360c81b878201528682015262000197620021b7565b828152662331303234323160c81b8782015288820152620001b7620021b7565b8281526611981a9898982160c91b878201526060820152620001d8620021b7565b828152660233030303030360cc1b87820152608082015260175460056017558060051062001f00575b50601760005285600020906000905b6005821062001e0957505050865190610a0082018281108582111762001df45788526200023c620021b7565b62000246620021b7565b828152662366396532646360c81b88820152815262000264620021b7565b8281526608d99998584e4d60ca1b8882015287820152825262000286620021b7565b62000290620021b7565b828152662366376461386160c81b888201528152620002ae620021b7565b828152662366666363343160c81b888201528782015286830152620002d2620021b7565b620002dc620021b7565b82815266046c8c4c862c4760cb1b888201528152620002fa620021b7565b828152662366666464383960c81b8882015287820152888301526200031e620021b7565b62000328620021b7565b8281526611b1321cb2999960c91b88820152815262000346620021b7565b828152660236666633630360cc1b888201528782015260608301526200036b620021b7565b62000375620021b7565b828152662364616432633760c81b88820152815262000393620021b7565b828152662366666435396360c81b88820152878201526080830152620003b8620021b7565b620003c2620021b7565b82815266119bb2b1309b9960c91b888201528152620003e0620021b7565b82815266119b31b3331a3360c91b888201528782015260a083015262000405620021b7565b6200040f620021b7565b90828252662330373037303760c81b918289820152815262000430620021b7565b90838252662335333361336160c81b91828a8201528982015260c085015262000458620021b7565b62000462620021b7565b848152662337393831386360c81b8a820152815262000480620021b7565b848152660466ec2c262c8760cb1b8a8201528982015260e0850152620004a5620021b7565b620004af620021b7565b8481526611991a99b19a1960c91b8a8201528152620004cd620021b7565b848152662332353738386560c81b8a82015289820152610100850152620004f3620021b7565b620004fd620021b7565b848152662337393336393560c81b8a82015281526200051b620021b7565b848152662361333065653160c81b8a8201528982015261012085015262000541620021b7565b6200054b620021b7565b8481526608d94c5899984d60ca1b8a820152815262000569620021b7565b8481526608d99998590d9960ca1b8a820152898201526101408501526200058f620021b7565b62000599620021b7565b848152660236164373362360cc1b8a8201528152620005b7620021b7565b848152662366343539666360c81b8a82015289820152610160850152620005dd620021b7565b620005e7620021b7565b848152662361376133376560c81b8a820152815262000605620021b7565b848152662366336536366560c81b8a820152898201526101808501526200062b620021b7565b62000635620021b7565b848152662331313734623760c81b8a820152815262000653620021b7565b848152661198181c9c333360c91b8a820152898201526101a085015262000679620021b7565b62000683620021b7565b848152662334373533363360c81b8a8201528152620006a1620021b7565b84815266119a1c9b9ab0b360c91b8a820152898201526101c0850152620006c7620021b7565b620006d1620021b7565b848152662333653839346160c81b8a8201528152620006ef620021b7565b8481526608cc8c190d4cd960ca1b8a820152898201526101e085015262000715620021b7565b6200071f620021b7565b848152662365646539656160c81b8a82015281526200073d620021b7565b8481526611b33330b2b19960c91b8a8201528982015261020085015262000763620021b7565b6200076d620021b7565b8481526608cd198c598c5960ca1b8a82015281526200078b620021b7565b848152662339623130306160c81b8a82015289820152610220850152620007b1620021b7565b620007bb620021b7565b848152661199311a331ab360c91b8a8201528152620007d9620021b7565b848152661198b09bb2b0b160c91b8a82015289820152610240850152620007ff620021b7565b62000809620021b7565b8481526611b2331bb1311960c91b8a820152815262000827620021b7565b848152662366663430613960c81b8a820152898201526102608501526200084d620021b7565b62000857620021b7565b84815266046c8c2c2686e760cb1b8a820152815262000875620021b7565b8481526611b3331c9a99b360c91b8a820152898201526102808501526200089b620021b7565b620008a5620021b7565b848152662362666366366360c81b8a8201528152620008c3620021b7565b84815266046c8cacccc66760cb1b8a820152898201526102a0850152620008e9620021b7565b620008f3620021b7565b848152662335663563333360c81b8a820152815262000911620021b7565b84815266046c2c4c26464760cb1b8a820152898201526102c085015262000937620021b7565b62000941620021b7565b8481526608cc8c0ccc0d8d60ca1b8a82015281526200095f620021b7565b848152660233033326362360cc1b8a820152898201526102e085015262000985620021b7565b6200098f620021b7565b84815266119931999c9a1960c91b8a8201528152620009ad620021b7565b848152662333343639386560c81b8a82015289820152610300850152620009d3620021b7565b620009dd620021b7565b8481526611999a9a309ab160c91b8a8201528152620009fb620021b7565b848152662332663731613760c81b8a8201528982015261032085015262000a21620021b7565b62000a2b620021b7565b8481526611b09bb09a1cb160c91b8a820152815262000a49620021b7565b84815266046cc66c8c672760cb1b8a8201528982015261034085015262000a6f620021b7565b62000a79620021b7565b84815266119b9b98b2989b60c91b8a820152815262000a97620021b7565b848152660236333313030360cc1b8a8201528982015261036085015262000abd620021b7565b62000ac7620021b7565b84815266119a319bb19c9960c91b8a820152815262000ae5620021b7565b848152662333316137646560c81b8a8201528982015261038085015262000b0b620021b7565b62000b15620021b7565b8481526611b318b2199a3360c91b8a820152815262000b33620021b7565b848152662366666431303760c81b8a820152898201526103a085015262000b59620021b7565b62000b63620021b7565b848152662337393533336560c81b8a820152815262000b81620021b7565b848152662363353631323960c81b8a820152898201526103c085015262000ba7620021b7565b62000bb1620021b7565b848152660466e68c4cc68760cb1b8a820152815262000bcf620021b7565b848152662336616666313360c81b8a820152898201526103e085015262000bf5620021b7565b62000bff620021b7565b848152662332363637353160c81b8a820152815262000c1d620021b7565b848152662330636233376160c81b8a8201528982015261040085015262000c43620021b7565b62000c4d620021b7565b848152662365646563646160c81b8a820152815262000c6b620021b7565b848152662366666639396560c81b8a8201528982015261042085015262000c91620021b7565b62000c9b620021b7565b848152662337343561363360c81b8a820152815262000cb9620021b7565b848152662363303562376560c81b8a8201528982015261044085015262000cdf620021b7565b62000ce9620021b7565b848152660233330333638360cc1b8a820152815262000d07620021b7565b848152662330663164636360c81b8a8201528982015261046085015262000d2d620021b7565b62000d37620021b7565b848152662363663436336360c81b8a820152815262000d55620021b7565b848152660236666313130360cc1b8a8201528982015261048085015262000d7b620021b7565b62000d85620021b7565b848152662363323361326160c81b8a820152815262000da3620021b7565b848152660236666316130360cc1b8a820152898201526104a085015262000dc9620021b7565b62000dd3620021b7565b84815266119b98309cb19b60c91b8a820152815262000df1620021b7565b84815266119a19b133333360c91b8a820152898201526104c085015262000e17620021b7565b62000e21620021b7565b848152662333313935643360c81b8a820152815262000e3f620021b7565b848152661198181cb2333360c91b8a820152898201526104e085015262000e65620021b7565b62000e6f620021b7565b8481526608d94d0d0c8c9960ca1b8a820152815262000e8d620021b7565b848152660236666316430360cc1b8a8201528982015261050085015262000eb3620021b7565b62000ebd620021b7565b848152662335633838623760c81b8a820152815262000edb620021b7565b848152661199999c9ab33360c91b8a8201528982015261052085015262000f01620021b7565b62000f0b620021b7565b848152662366616365363160c81b8a820152815262000f29620021b7565b8481526611b3333131989b60c91b8a8201528982015261054085015262000f4f620021b7565b62000f59620021b7565b84815266119a9b191c989960c91b8a820152815262000f77620021b7565b848152660236132333630360cc1b8a8201528982015261056085015262000f9d620021b7565b62000fa7620021b7565b848152660233366366435360cc1b8a820152815262000fc5620021b7565b848152662333336239363560c81b8a8201528982015261058085015262000feb620021b7565b62000ff5620021b7565b848152662337303465333360c81b8a820152815262001013620021b7565b8481526608d898cd8ccc5960ca1b8a820152898201526105a085015262001039620021b7565b62001043620021b7565b8481526608d98c8e0d0c9960ca1b8a820152815262001061620021b7565b848152660236666373030360cc1b8a820152898201526105c085015262001087620021b7565b62001091620021b7565b848152662366656665666560c81b8a8201528152620010af620021b7565b8481526611b3333119311960c91b8a820152898201526105e0850152620010d5620021b7565b620010df620021b7565b8481526608d88c190c191960ca1b8a8201528152620010fd620021b7565b84815266119bb2b21cb33360c91b8a8201528982015261060085015262001123620021b7565b6200112d620021b7565b8481526611989a9ab3309b60c91b8a82015281526200114b620021b7565b848152661198181bb1331960c91b8a8201528982015261062085015262001171620021b7565b6200117b620021b7565b84815266046c2c864ca64760cb1b8a820152815262001199620021b7565b848152660236639306230360cc1b8a82015289820152610640850152620011bf620021b7565b620011c9620021b7565b8481526611989819981a9b60c91b8a8201528152620011e7620021b7565b848152661198181a30b09960c91b8a820152898201526106608501526200120d620021b7565b62001217620021b7565b8481526608d98d8e4d0d1960ca1b8a820152815262001235620021b7565b848152662366663664303360c81b8a820152898201526106808501526200125b620021b7565b62001265620021b7565b848152662364393431323960c81b8a820152815262001283620021b7565b848152660236666323230360cc1b8a820152898201526106a0850152620012a9620021b7565b620012b3620021b7565b848152662333643535333160c81b8a8201528152620012d1620021b7565b848152662335336131326360c81b8a820152898201526106c0850152620012f7620021b7565b62001301620021b7565b84815266119b9b193198b360c91b8a82015281526200131f620021b7565b848152660236332316430360cc1b8a820152898201526106e085015262001345620021b7565b6200134f620021b7565b848152662366306563353560c81b8a82015281526200136d620021b7565b8481526608d999998e0c1960ca1b8a8201528982015261070085015262001393620021b7565b6200139d620021b7565b848152662339386435663160c81b8a8201528152620013bb620021b7565b84815266119a9a319cb33360c91b8a82015289820152610720850152620013e1620021b7565b620013eb620021b7565b848152662364636465643360c81b8a820152815262001409620021b7565b848152662365656666613560c81b8a820152898201526107408501526200142f620021b7565b62001439620021b7565b848152662362633764326560c81b8a820152815262001457620021b7565b848152660236666386430360cc1b8a820152898201526107608501526200147d620021b7565b62001487620021b7565b848152660233730373037360cc1b8a8201528152620014a5620021b7565b848152662362633833383360c81b8a82015289820152610780850152620014cb620021b7565b620014d5620021b7565b84815266119a18989a19b160c91b8a8201528152620014f3620021b7565b848152662338643031376160c81b8a820152898201526107a085015262001519620021b7565b62001523620021b7565b848152660236630343733360cc1b8a820152815262001541620021b7565b848152660236666316530360cc1b8a820152898201526107c085015262001567620021b7565b62001571620021b7565b848152662330643063313160c81b8a82015281526200158f620021b7565b8481526608cccc4c8d4d5960ca1b8a820152898201526107e0850152620015b5620021b7565b620015bf620021b7565b8481526611b31a9cb31b1b60c91b8a8201528152620015dd620021b7565b8481526608d9998dcdcc5960ca1b8a8201528982015261080085015262001603620021b7565b6200160d620021b7565b848152662364646439646160c81b8a82015281526200162b620021b7565b8481526611b33330b2319960c91b8a8201528982015261082085015262001651620021b7565b6200165b620021b7565b848152662332663730356160c81b8a820152815262001679620021b7565b8481526608cc4d9898ce0d60ca1b8a820152898201526108408501526200169f620021b7565b620016a9620021b7565b848152662335656130633360c81b8a8201528152620016c7620021b7565b84815266119932b11b333360c91b8a82015289820152610860850152620016ed620021b7565b620016f7620021b7565b84815266119c989cb31cb360c91b8a820152815262001715620021b7565b84815266119c9832b132b160c91b8a820152898201526108808501526200173b620021b7565b62001745620021b7565b848152660466e6a66c862760cb1b8a820152815262001763620021b7565b848152660236331346330360cc1b8a820152898201526108a085015262001789620021b7565b9162001794620021b7565b90848252898201528252620017a8620021b7565b9083825288820152878201526108c0830152620017c4620021b7565b620017ce620021b7565b82815266119a1a9919189b60c91b888201528152620017ec620021b7565b82815266119c98991b981960c91b88820152878201526108e083015262001812620021b7565b6200181c620021b7565b828152662334653164306360c81b8882015281526200183a620021b7565b828152660233961323730360cc1b888201528782015261090083015262001860620021b7565b6200186a620021b7565b8281526611999c1cb2b1b160c91b88820152815262001888620021b7565b828152661198183118333360c91b8882015287820152610920830152620018ae620021b7565b620018b8620021b7565b828152660236630373035360cc1b888201528152620018d6620021b7565b82815266046cccc667260760cb1b8882015287820152610940830152620018fc620021b7565b62001906620021b7565b8281526608cc590c590c5960ca1b88820152815262001924620021b7565b828152662336393439343960c81b88820152878201526109608301526200194a620021b7565b62001954620021b7565b828152662333643761626160c81b88820152815262001972620021b7565b8281526611981b9c18333360c91b888201528782015261098083015262001998620021b7565b620019a2620021b7565b82815266119b9c1c181c3160c91b888201528152620019c0620021b7565b828152662337396131643760c81b88820152878201526109a0830152620019e6620021b7565b620019f0620021b7565b828152660466e7068c264760cb1b88820152815262001a0e620021b7565b8281526611b19a1a9b981b60c91b88820152878201526109c083015262001a34620021b7565b9062001a3f620021b7565b8181526611b1981c9c193360c91b88820152825262001a5d620021b7565b908152660236666623830360cc1b87820152868201526109e082015260185460506018558060501062001d44575b5090601860005284600020906000925b6050841062001b795750505050506001601955331562001b3a57506002546702ea11e32ad500009283820180921162001b2557506000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9160025533835282815284832084815401905584519384523393a351613c9f9081620021ee8239608051816115b20152f35b601190634e487b7160e01b6000525260246000fd5b90606493519262461bcd60e51b845283015260248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b80518354600285558060021062001cc3575b509087918460005282600020906000905b6002821062001bba5750505060019182910193019301929162001a9b565b8091929394505180519089821162001cae5762001be48262001bdd875462002115565b876200216b565b8b908b831160011462001c39579262001c1c83600195948f94879660009262001c2d5750508160011b916000199060031b1c19161790565b86555b019301910189939262001b9c565b01519050388062000090565b90601f9e9d9e19831691866000528d6000209260005b81811062001c965750929e9f9e600195928f9492868897941062001c7d575b505050831b8301865562001c1f565b0151600019838c1b60f8161c1916905538808062001c6e565b92938f60018192878601518155019501930162001c4f565b60418d634e487b7160e01b6000525260246000fd5b8460005260028960002091820191015b81811062001ce2575062001b8b565b808962001cf26001935462002115565b8062001d02575b50500162001cd3565b8c828211851462001d1d57505050600081555b893862001cf9565b60009262001d3a918585528420920160051c820185830162002152565b8183555562001d15565b601860005260508660002091820191015b81811062001d64575062001a8b565b8054600082558062001d7b575b5060010162001d55565b8160005287600020908101905b81811062001d97575062001d71565b8062001da66001925462002115565b8062001db5575b500162001d88565b898111831462001dcc5750600081555b3862001dad565b60009082825262001dea8b8d8420920160051c820185830162002152565b8183555562001dc5565b604188634e487b7160e01b6000525260246000fd5b805180519087821162001eeb579089929162001e328262001e2b885462002115565b886200216b565b83908a831160011462001e7957826001959386959362001e699360009262001c2d5750508160011b916000199060031b1c19161790565b86555b0193019101909162000210565b90601f9493941983169187600052846000209260005b81811062001ed2575091600196939185889796941062001eb9575b505050831b8301865562001e6c565b0151600019838c1b60f8161c1916905538808062001eaa565b8284015185558e96600190950194938401930162001e8f565b60418b634e487b7160e01b6000525260246000fd5b601760005260058760002091820191015b81811062001f20575062000201565b8062001f2f6001925462002115565b8062001f3e575b500162001f11565b888111831462001f555750600081555b3862001f36565b60009082825262001f738a8c8420920160051c820185830162002152565b8183555562001f4e565b604187634e487b7160e01b6000525260246000fd5b62001faf9060166000528486600020910160051c81019062002152565b3862000128565b90601f1983169188600052876000209260005b898282106200200a57505090846001959493921062001ff1575b505050811b018555620000fd565b015160001983861b60f8161c1916905538808062001fe3565b600185968293968601518155019501930162001fc9565b6200204d9088600052876000208780860160051c8201928a871062002054575b0160051c019062002152565b38620000c8565b9250819262002041565b90601f1983169185600052886000209260005b8a828210620020b257505090846001959493921062002099575b505050811b018255620000a8565b015160001983871b60f8161c191690553880806200208b565b600185968293968601518155019501930162002071565b620020f49085600052886000208880860160051c8201928b871062002054570160051c019062002152565b3862000072565b604186634e487b7160e01b6000525260246000fd5b600080fd5b90600182811c9216801562002147575b60208310146200213157565b634e487b7160e01b600052602260045260246000fd5b91607f169162002125565b8181106200215e575050565b6000815560010162002152565b9190601f81116200217b57505050565b620021aa926000526020600020906020601f840160051c83019310620021ac575b601f0160051c019062002152565b565b90915081906200219c565b60408051919082016001600160401b03811183821017620021d757604052565b634e487b7160e01b600052604160045260246000fdfe60a0604090808252600436101561001557600080fd5b60003560e01c90816306fdde031461166d57508063095ea7b31461164457806316f0115b1461161b57806318160ddd146115fc578063214013ca1461159457806323b872dd146114cb5780632bd1a01114611473578063313ce56714611457578063333a0072146113fb57806335ad0cea1461130f57806339509351146112bf578063422b9e23146112a4578063524773ce1461125d5780636b4ed21b1461123e57806370a082311461120557806370db69d6146111e15780638da5cb5b146111b857806395d89b41146110d257806395e4b21b1461109957806399f65c8f1461107a578063a457c2d714610fd3578063a9059cbb14610fa3578063bbb1e3f814610587578063c3f4552a14610559578063c5b8f77214610510578063c7218d5b14610485578063cb8106f414610440578063cda5fefc14610271578063dd62ed3e14610224578063e0d9750214610205578063f2fde38b146101be5763fb700e5b1461018157600080fd5b346101b95760203660031901126101b9576020906001600160a01b036101a5611766565b166000526008825280600020549051908152f35b600080fd5b346101b95760203660031901126101b9576101d7611766565b601354906001600160a01b03906101f18284163314611926565b6001600160a01b0319909216911617601355005b50346101b95760003660031901126101b9576020906011549051908152f35b50346101b957806003193601126101b957602090610240611766565b61024861177c565b9060018060a01b0380911660005260018452826000209116600052825280600020549051908152f35b50346101b9576020806003193601126101b9576001600160401b03906004358281116101b957366023820112156101b9578060040135906102bd6102b48361182c565b955195866117e3565b81855236602483830101116101b95781600092602485930183880137850101526102f260018060a01b03601354163314611926565b825191821161042a57610306601454611847565b601f81116103d1575b5080601f83116001146103505750819061034093600092610345575b50508160011b916000199060031b1c19161790565b601455005b01519050388061032b565b90601f1983169360146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec926000905b8682106103b957505083600195106103a0575b505050811b01601455005b015160001960f88460031b161c19169055388080610395565b80600185968294968601518155019501930190610382565b61041a9060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec601f850160051c810191848610610420575b601f0160051c0190611f94565b3861030f565b909150819061040d565b634e487b7160e01b600052604160045260246000fd5b50346101b95760203660031901126101b957602090610474600435600052600d60205260018060a01b036040600020541690565b90516001600160a01b039091168152f35b50346101b957806003193601126101b95761050c906104a2611766565b6000602083516104b181611792565b828152015260018060a01b0316600052600960205280600020602435600052602052806000209060018151926104e684611792565b805484520154602083015251918291829190916020806040830194805184520151910152565b0390f35b50346101b957806003193601126101b9576020906001600160a01b03610534611766565b16600052600b825280600020602435600052825260ff81600020541690519015158152f35b50346101b95761050c9061057461056f36611804565b611fe5565b9051918291602083526020830190611741565b50346101b95760031981813601126101b9576001600160401b03600435116101b957606090600435360301126101b95760243560ff81168091036101b9576105da60018060a01b03601354163314611926565b61060782516105e881611792565b600d81526c6164645361626572536861706560981b602082015261265e565b60005260156020526000208054600160401b81101561042a5761062f91600182018155611f43565b610f8d57610641600480350180611f5f565b600160401b811161042a578254818455808210610f18575b5081836000526020600020906000935b838510610df3578560018101610689602460043501600435600401611f5f565b9091600160401b821161042a578054828255808310610d7e575b506000908152602081209092805b838510610c5957600435604481013590879060028201903603606219018312156101b9576106e56004803585010180611f5f565b9091600160401b821161042a578054828255808310610be4575b506000908152602081209092805b838510610ace57868661072a600480358401602481019101611f5f565b600160401b811161042a576003830154816003850155808210610a55575b5081600384016000526020600020906000935b8385106109295760048681019061077b9080358a01604481019101611f5f565b90600160401b821161042a5782548284558083106108b4575b506000928352602083209290805b8383106107ab57005b8035601e19833603018112156101b95782018035906001600160401b0382116101b95781360360208201136101b9576107ee826107e88954611847565b89611fab565b600090601f83116001146108425792610826836001959460209487966000926108355750508160011b916000199060031b1c19161790565b88555b019501920191936107a2565b8692500101358b8061032b565b601f198316918860005260206000209260005b81811061089a575093602093600196938796938388951061087e575b505050811b018855610829565b01850135600019600384901b60f8161c191690558a8080610871565b919360206001819282888801013581550195019201610855565b8360005282602060002091820191015b8181106108d15750610794565b806108de60019254611847565b806108eb575b50016108c4565b601f908181118414610904575050600081555b866108e4565b61092060009284845260208420920160051c8201858301611f94565b818355556108fe565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b9576109728184013561096c8654611847565b86611fab565b600090601f81850135116001146109d0576001926109b28493602093600091818901356109c1575b50870135908160011b916000199060031b1c19161790565b86555b0193019401939161075b565b8882010185013591508d61099a565b908460005260206000209060005b85840135601f19168110610a3957506001938493602093919285929088830135601f19811610610a18575b5050860135811b0186556109b5565b8560001960f8858c013560031b161c1991848b010101351690558c80610a09565b90916020600181928286888b01010135815501930191016109de565b600384016000526020600020908282015b8183018110610a76575050610748565b80610a8360019254611847565b80610a90575b5001610a66565b601f908181118414610aa9575050600081555b88610a89565b610ac560009284845260208420920160051c8201858301611f94565b81835555610aa3565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610b118184013561096c8654611847565b600090601f8185013511600114610b5f57600192610b508493602093600091818901356109c15750870135908160011b916000199060031b1c19161790565b86555b0193019401939161070d565b908460005260206000209060005b85840135601f19168110610bc857506001938493602093919285929088830135601f19811610610ba7575b5050860135811b018655610b53565b8560001960f8858c013560031b161c1991848b010101351690558c80610b98565b90916020600181928286888b0101013581550193019101610b6d565b8160005282602060002091820191015b818110610c0157506106ff565b80610c0e60019254611847565b80610c1b575b5001610bf4565b601f908181118414610c34575050600081555b88610c14565b610c5060009284845260208420920160051c8201858301611f94565b81835555610c2e565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610c9c8184013561096c8654611847565b600090601f8185013511600114610cf957600192610cdb849360209360009181890135610cea5750870135908160011b916000199060031b1c19161790565b86555b019301940193916106b1565b8882010185013591508c61099a565b908460005260206000209060005b85840135601f19168110610d6257506001938493602093919285929088830135601f19811610610d41575b5050860135811b018655610cde565b8560001960f8858c013560031b161c1991848b010101351690558b80610d32565b90916020600181928286888b0101013581550193019101610d07565b8160005282602060002091820191015b818110610d9b57506106a3565b80610da860019254611847565b80610db5575b5001610d8e565b601f908181118414610dce575050600081555b87610dae565b610dea60009284845260208420920160051c8201858301611f94565b81835555610dc8565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610e368184013561096c8654611847565b600090601f8185013511600114610e9357600192610e75849360209360009181890135610e845750870135908160011b916000199060031b1c19161790565b86555b01930194019391610669565b8882010185013591503861099a565b908460005260206000209060005b85840135601f19168110610efc57506001938493602093919285929088830135601f19811610610edb575b5050860135811b018655610e78565b8560001960f8858c013560031b161c1991848b010101351690553880610ecc565b90916020600181928286888b0101013581550193019101610ea1565b8360005281602060002091820191015b818110610f355750610659565b80610f4260019254611847565b80610f4f575b5001610f28565b601f908181118414610f68575050600081555b38610f48565b610f8460009284845260208420920160051c8201858301611f94565b81835555610f62565b634e487b7160e01b600052600060045260246000fd5b50346101b957806003193601126101b957602090610fcc610fc2611766565b6024359033612381565b5160018152f35b50346101b957806003193601126101b957610fec611766565b906024353360005260016020528160002060018060a01b03841660005260205281600020548181106110285792610fcc9160209403903361227f565b825162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b50346101b95760003660031901126101b957602090600f549051908152f35b50346101b95760203660031901126101b9576020906001600160a01b036110be611766565b16600052600e825280600020549051908152f35b50346101b95760003660031901126101b957805160045490918260006110f784611847565b80835260209460019086600182169182600014611196575050600114611139575b505061050c929161112a9103856117e3565b51928284938452830190611741565b9085925060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000925b82841061117e575050508201018161112a611118565b8054848a018601528895508794909301928101611168565b60ff19168682015292151560051b8501909201925083915061112a9050611118565b50346101b95760003660031901126101b95760135490516001600160a01b039091168152602090f35b50346101b95760003660031901126101b9576020906111fe611ec5565b9051908152f35b50346101b95760203660031901126101b9576020906001600160a01b0361122a611766565b166000526000825280600020549051908152f35b50346101b95760003660031901126101b9576020906010549051908152f35b50346101b95760003660031901126101b9576002546702ea11e32ad5000090810390811161128e5760209151908152f35b634e487b7160e01b600052601160045260246000fd5b50346101b95761050c906105746112ba36611804565b6119ca565b50346101b957806003193601126101b957602090610fcc6112de611766565b33600052600184528260002060018060a01b03821660005284526113086024358460002054611976565b903361227f565b50346101b957806003193601126101b957600435906024356113308161195f565b9261133d835194856117e3565b8184526113498261195f565b916020916020860193601f190136853760005b8281106113ae575050508251938493602085019160208652518092528401929160005b82811061138e57505050500390f35b83516001600160a01b03168552869550938101939281019260010161137f565b806113dd6113c2600193859a98999a611976565b6000908152600d60205260409020546001600160a01b031690565b6113e782886119b6565b90838060a01b03169052019594939561135c565b346101b95760003660031901126101b9576013546114236001600160a01b0382163314611926565b6001600160a01b0319166013557f6e4ee811a17215345b89e3506064ff2d62f4feedff3566e9d09219cda7e8cadb600080a1005b50346101b95760003660031901126101b9576020905160098152f35b50346101b95760203660031901126101b95761050c90611491611766565b6000602083516114a081611792565b82815201526001600160a01b03166000908152600c602052819020815191906001906104e684611792565b50346101b95760603660031901126101b9576114e5611766565b906114ee61177c565b6044359260018060a01b038116600052600160205282600020336000526020528260002054600019810361152b575b5092610fcc91602094612381565b84811061155057918491611547602096610fcc9503338361227f565b9194509161151d565b835162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b60203660031901126101b9576115a8611766565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811633036101b957600554918183166101b9576001600160a01b031990921691161760055542600655005b50346101b95760003660031901126101b9576020906002549051908152f35b50346101b95760003660031901126101b95760055490516001600160a01b039091168152602090f35b50346101b957806003193601126101b957602090610fcc611663611766565b602435903361227f565b82346101b95760003660031901126101b9576003549082600061168f84611847565b808352602094600190866001821691826000146111965750506001146116c157505061050c929161112a9103856117e3565b9085925060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000925b828410611706575050508201018161112a611118565b8054848a0186015288955087949093019281016116f0565b60005b8381106117315750506000910152565b8181015183820152602001611721565b9060209161175a8151809281855285808601910161171e565b601f01601f1916010190565b600435906001600160a01b03821682036101b957565b602435906001600160a01b03821682036101b957565b604081019081106001600160401b0382111761042a57604052565b606081019081106001600160401b0382111761042a57604052565b602081019081106001600160401b0382111761042a57604052565b90601f801991011681019081106001600160401b0382111761042a57604052565b60409060031901126101b95760405161181c81611792565b6004358152602435602082015290565b6001600160401b03811161042a57601f01601f191660200190565b90600182811c92168015611877575b602083101461186157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611856565b9060405191826000825461189481611847565b9081845260209460019160018116908160001461190457506001146118c5575b5050506118c3925003836117e3565b565b600090815285812095935091905b8183106118ec5750506118c393508201013880806118b4565b855488840185015294850194879450918301916118d3565b925050506118c394925060ff191682840152151560051b8201013880806118b4565b1561192d57565b60405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606490fd5b6001600160401b03811161042a5760051b60200190565b9190820180921161128e57565b8051600110156119935760400190565b634e487b7160e01b600052603260045260246000fd5b8051156119935760200190565b80518210156119935760209160051b010190565b6005546001600160a01b03166119ee57506040516119e7816117c8565b6000815290565b6119f790612b08565b60408051611a0481611792565b60058152611a2060209164746f53766760d81b8382015261265e565b611a28612eb1565b9282519282808501957f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323087527030302f737667272076696577426f783d2760781b83870152611a80815180928460518a01910161171e565b850191611aa460538761139f60f11b958660518201520360338101895201876117e3565b611ad58151611ab281611792565b601281527119d95b995c985d19509858dad9dc9bdd5b9960721b8482015261265e565b60c08401519381519485848101917f3c7265637420783d27302720793d2730272077696474683d273130302527206883527265696768743d2731303025272066696c6c3d2760681b85830152611b34815180928860538601910161171e565b8101631390179f60e11b6053820152605760009160145491611b5583611847565b92600190818116908115611e965750600114611e37575b5050505003601f1981018752611b8290876117e3565b8251611b8d81611792565b601781527f646f6e652067656e65726174654261636b67726f756e6400000000000000000085820152611bbf9061265e565b611bc8826137c1565b908351611bd481611792565b600f81526e67656e65726174654265616d53766760881b86820152611bf89061265e565b61010083019685885101516080850151611c1191613b10565b94611c1a612eb1565b9781519582898801986d3c7376672076696577426f783d2760901b9b8c8b52805190818d602e8d01920191611c4e9261171e565b890184602e820152815191828d60308401920191611c6b9261171e565b019b88651e17b9bb339f60d11b9d8e603082015203601681018a52603601611c93908a6117e3565b8151611c9e81611792565b6014815273646f6e652067656e65726174654265616d53766760601b8c820152611cc79061265e565b8151611cd281611792565b600f81526e67656e657261746548696c7453766760881b8c820152611cf69061265e565b5151910151611d0491613b10565b825191898381808201858196519283910191611d1f9261171e565b81010380855201611d3090846117e3565b611d38612eb1565b9284519a8b948186019d8e5280518092602e8801920191611d589261171e565b840191602e83015251918260308301611d709261171e565b018a603082015203601681018852603601611d8b90886117e3565b8051611d9681611792565b6014815273646f6e652067656e657261746548696c7453766760601b8b820152611dbf9061265e565b519a8b9a5190818b8d01611dd29261171e565b8a01905191828a8301611de49261171e565b018151918289808401920191611df99261171e565b0190519182878301611e0a9261171e565b0190519182858301611e1b9261171e565b019182015203600681018252602601611e3490826117e3565b90565b909192935060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec6000905b858210611e7e57505050500160570138808080611b6c565b80548583018501528d9a8d9750909101908201611e66565b925050506057935060ff92919219168383015280151502010138808080611b6c565b9190820391821161128e57565b6005546001600160a01b031615611f3757611ee260065442611eb8565b6702ea11e32ad5000081810291818304810361128e57670e92596fd629000002918083046005149015171561128e57620186a0655f7f37b390009204820180921161128e57808211611f32575090565b905090565b6702ea11e32ad5000090565b8054821015611993576000526005602060002091020190600090565b903590601e19813603018212156101b957018035906001600160401b0382116101b957602001918160051b360383136101b957565b818110611f9f575050565b60008155600101611f94565b9190601f8111611fba57505050565b6118c3926000526020600020906020601f840160051c8301931061042057601f0160051c0190611f94565b6005546001600160a01b031661200257506040516119e7816117c8565b61200b90612b08565b805161201690612eed565b604082015160808301519060a084015160c08501519460e0015161203990612eed565b94604051612046816117ad565b6027815260208097818301937f4a6564692c20244a4544492e204d61792074686520666f726365206265207769855260408401663a34103cb7ba9760c91b90526040519561209387611792565b60128752838701977168747470733a2f2f6a6564692e61726d792f60701b89526040519b8c9b818d01607b60f81b90528c67112632bb32b6111d60c11b90602101528c81519260298492019201916120ea9261171e565b8b016f1610112434b63a1021b7b637b9111d1160811b602982015281519182876039840192019161211a9261171e565b0198601160f91b998a60398201526f1610112132b0b69021b7b637b9111d1160811b603a8201528151918287604a84019201916121569261171e565b0189604a820152741610112132b0b69023b637bb9021b7b637b9111d1160591b604b8201528151918286606084019201916121909261171e565b01886060820152751610112130b1b5b3b937bab7321021b7b637b9111d1160511b60618201528151918285607784019201916121cb9261171e565b01908760778301527216101129b0b132b91029b430b8329034b2111d60691b607883015280518093608b84019201916122039261171e565b0190701610112232b9b1b934b83a34b7b7111d1160791b608b830152519182609c830161222f9261171e565b019083609c830152681610112bb2b1111d1160b91b609d83015251918260a683016122599261171e565b019060a682015260a78101607d60f81b90520360888101825260a801611e3490826117e3565b6001600160a01b0390811691821561233057169182156122e05760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6005546001600160a01b0393929190841615612608576123a081612fb2565b6123a983612fb2565b906123b58585856126ad565b6123be83612fb2565b906123c885612fb2565b91811580612601575b6125f3575b816125ea575b506125dc575b8115806125d5575b6125c7575b816125be575b506125b0575b838216156124ac578381163081146124a1576007549460ff8616156124265750506118c393506128bc565b6005541680911461243c57506118c393506128bc565b92919050612448611ec5565b821161246c5760ff19938416600117600755612463926128bc565b60075416600755565b60405162461bcd60e51b815260206004820152600d60248201526c1b585e08189d5e481b1a5b5a5d609a1b6044820152606490fd5b506118c393506128bc565b90509190911680156125615760009181835282602052604083205481811061251157817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928587528684520360408620558060025403600255604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b6125b9826130e1565b6123fb565b905015386123f5565b6125d084613087565b6123ef565b50806123ea565b6125e5836130e1565b6123e2565b905015386123dc565b6125fc85613087565b6123d6565b50806123d1565b83601354168085831614908115612652575b506123fb5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606490fd5b9050848316143861261a565b6000809160405161269a8161268c602082019463104c13eb60e21b8652602060248401526044830190611741565b03601f1981018352826117e3565b51906a636f6e736f6c652e6c6f675afa50565b916001600160a01b0391908284163081146128b557633b9aca009081830494851515806128a7575b80612897575b61271a575b50612715926118c3969261270f926000526000602052806127076040600020549384611eb8565b049104611eb8565b906131a9565b61363b565b600090828252602091600c835260409088828220541480612878575b61281e57848152600b8452818120898252845260ff8282205416806127ff575b612762575050506126e0565b6127d39296507f882cd5197c658fe29ff1ed21d4a9c2c50495592e1e9337e75267eff5a3c6530297955098818a866127fa979b94969c5260098c52818120600a8d528282208583528d528282205482528c522099600185519b6127c48d611792565b80548d520154908b0152613501565b6127dd8784613458565b519283921695829190916020806040830194805184520151910152565b0390a3565b508288168152600b8452818120898252845260ff828220541615612756565b6127d39296507f882cd5197c658fe29ff1ed21d4a9c2c50495592e1e9337e75267eff5a3c6530297955098818a866127fa979b94969c52600c8c522099600185519b6128698d611792565b80548d520154908b01526131a9565b508288168152600b8452818120898252845260ff828220541615612736565b50806005541681861614156126db565b5080600554168214156126d5565b5050505050565b6001600160a01b039081169182156129815760009383855284602052604085205481811061292d577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209383604093888a528987520383892055169586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b60409081519161012083018381106001600160401b0382111761042a5781526101008360008152606080602083015280848301526000818301528060808301528060a08301528060c0830152600060e0830152835193612a33856117ad565b818552816020860152805191612a48836117ad565b808352806020840152818301528401520152565b8115612a66570690565b634e487b7160e01b600052601260045260246000fd5b6018548110156119935760186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0190600090565b908154612abf8161195f565b92612acd60405194856117e3565b818452600090815260208082208186015b848410612aec575050505050565b6001838192612afa85611881565b815201920193019290612ade565b612b106129d4565b508051602090818301918251604092835190612b2b826117ad565b8152600091828483015284820152612bd7612bd0612b476129d4565b97848088612b548761372e565b80612ea3575b808d52612bb98a835192612b6d84611792565b600884526719185d184b9b1d9b60c21b82850152612ba585519485938401966309710a9d60e41b885260248501526064840190611741565b90604483015203601f1981018352826117e3565b51906a636f6e736f6c652e6c6f675afa5051612eed565b9551612eed565b9484519581612bef889351809288808701910161171e565b8201605f60f81b86820152612c0d825180938860218501910161171e565b010394612c246021600197888101845201826117e3565b83870152612c3181613770565b612c3e6017548092612a5c565b90811015612e8f57612c7590601784527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1501611881565b60c0870152612c8381613770565b612c98612c936018548093612a5c565b612a7c565b50805415612e7b57612ccd612c93859493612cd393899752612cbb888720611881565b878c0152612cc885613770565b612a5c565b50612ab3565b83518884601654612ce381611847565b90818552898c82169182600014612e5d575050600114612e01575b50600494612d2a612d9695856080612d6696612d23612dec9c99612d549803846117e3565b0152611983565b5160a08d0152612d4f8851612d3e81611792565b8c8152601960f91b8b82015261265e565b613770565b8a518352601588528683205490612a5c565b968791612d888251612d7781611792565b8b8152603360f81b8a82015261265e565b8a5181526015885220611f43565b50612db8845197612da6896117ad565b612daf83612ab3565b89528201612ab3565b85880152835194612dc8866117ad565b612dd460028301612ab3565b8652612de260038301612ab3565b9086015201612ab3565b8183015283015260e083015261010082015290565b6016875288915086908b7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242895b828410612e41575050508301016004612cfe565b80548488018601528c9a508e95508b94909301928d9101612e2d565b60ff19168187015291151560051b8501909101915060049050612cfe565b634e487b7160e01b84526032600452602484fd5b634e487b7160e01b83526032600452602483fd5b612eac906130d4565b612b5a565b60405190612ebe82611792565b6011825270302030203332302e3235203332302e323560781b6020830152565b600019811461128e5760010190565b8015612f9457600081805b612f805750612f068161182c565b90612f1460405192836117e3565b808252601f19612f238261182c565b013660208401375b80928015612f7957600019820191821161128e578193600a92603090848406820180921161128e57855111156119935760f81b6001600160f81b03191660001a908401601f01530491612f2b565b5050905090565b90612f8c600a91612ede565b910480612ef8565b50604051612fa181611792565b60018152600360fc1b602082015290565b6001600160a01b039081169190308314908115613079575b508015613071575b61306b57600091808352600c60205260408320546040519163fb700e5b60e01b83526004830152602082602481305afa918215613060578492613021575b5061301c929350611976565b151590565b9091506020813d602011613058575b8161303d602093836117e3565b810103126130545761301c92935051908392613010565b8380fd5b3d9150613030565b6040513d86823e3d90fd5b60009150565b508115612fd2565b905060055416821438612fca565b6130cf90601054600052600d60205260406000209060018060a01b031690816001600160601b0360a01b82541617905560105490600052600e60205280604060002055612ede565b601055565b801561128e576000190190565b60105480156131a5576001600160a01b039182166000818152600e6020526040808220549094919390919060001981019081116131915780830361315a575b50505061312e6010546130d4565b6010558152600e60205280828120556010548152600d602052206001600160601b0360a01b8154169055565b8452600d6020528484205416818452848420816001600160601b0360a01b8254161790558352600e60205283832055388080613120565b634e487b7160e01b85526011600452602485fd5b5050565b91908015613453576005546001600160a01b03848116929116821461344d576000828152600c6020818152604093848420978551916131e783611792565b895483526001809a0154848401528786528484528686208054828110156133bb5750508786528484528686205461321d91611eb8565b908786528484528587812055613241613237601254612ede565b8060125582613aa9565b8887528585526001888820015560088452868620549980879b88925b613377575b505050918187969492938b6132dc9997957faa626bf76e4a6a5b23f2cd43ad5451ce8410ccdca0112dc86a79b5964f177edc9b9c9d1161332a575b5050508051151580613319575b613306575b5115806132f4575b6132e1575b878352522090518154815260019091015460208201529081906040820190565b0390a2565b6132ec601154612ede565b6011556132bc565b508783528181528383205415156132b7565b6133116011546130d4565b6011556132af565b5088845282825284842054156132aa565b6133629261333791611eb8565b8b875285855261334b888820918254611976565b9055613358601254612ede565b9081601255613aa9565b8985528383526001868620015538808061329d565b90919b818d10806133b2575b156133ac5761339e6133a49161339886613ad5565b90611976565b9c612ede565b91908161325d565b9b613262565b50848110613383565b7faa626bf76e4a6a5b23f2cd43ad5451ce8410ccdca0112dc86a79b5964f177edc999a9b50926133f99161334b8a999795946132dc9b999795611eb8565b908985528383528585209160018301555115159081613443575b5061343857878352522090518154815260019091015460208201529081906040820190565b6132ec6011546130d4565b9050541538613413565b50509050565b509050565b6005546001600160a01b0391821692911682146131a55760009082825260206008815260409384842061348b8154612ede565b9055613498600f54612ede565b600f55808452600882528484205460001981019081116131915781855260098352858520818652835285852084518155600184860151910155818552600a8352858520845186528352858520558352600b8152838320915183525220600160ff19825416179055565b6005546001600160a01b03918216911681146131a55760019060009281845260206008815260409283862061353681546130d4565b9055613543600f546130d4565b600f55808652600b8252838620838752825283862060ff198154169055808652600882528386205492600a8352848720908752825283862054818752600983528487208188528352848720908686519261359c84611792565b805484520154848301528481036135da575b50818752600a835284872090518752825285848120558552600981528285209185525282208281550155565b828852600984528588208589528452858820878751916135f983611792565b805483520154858201908152848a5260098652878a20838b52865288888b20918351835551910155838952600a855286892090518952845285882055386135ae565b9080156131a5576005546001600160a01b038381169391168314613729576136c46132dc917efb093446d003bea3dc7db8b593d37cc6a34ea254b80cd1aa5d942b828a5d6d93600090868252600c60205260409384938484209260018651946136a386611792565b8054865201546020850152898552600c60205261334b868620918254611976565b90878352600c6020528383209160018301555115908161371e575b5061370b575b858152600c60205220905191829182919091602060016040830194805484520154910152565b613716601154612ede565b6011556136e5565b9050541515386136df565b505050565b5161041a811061376a5761290481106137645762019a28811061375e57621005901161375957600490565b600390565b50600290565b50600190565b50600090565b61378d8151602083019081519161378683612ede565b9052611976565b60001981019190821161128e576040015160405190602082019283526040820152604081526137bb816117ad565b51902090565b60408051916137cf83611792565b600f83526137f56020936e67656e6572617465476c6f7753766760881b8582015261265e565b61010081018281510151515115613a9b57838201519061384e6030855180946f72616469616c2d6772616469656e742d60801b8983015261383e815180928b868601910161171e565b81010360108101855201836117e3565b613856612eb1565b926138658583510151516119a9565b5160a0613876878551015151611983565b519201805187855101515180516002101561199357606001518251918987510151518051600310156119935760808c91015194818c8a510151015190516138bc91613b10565b968b8080808c51015101516138d0906119a9565b519a51015101516138e090611983565b519a8c5160805282608051016d3c7376672076696577426f783d2760901b90528051908184608051602e019201916139179261171e565b6080510196602e880161139f60f11b905260308801651e3232b3399f60d11b905260369781519182858b840192019161394f9261171e565b8b519101613962828a8301868f0161171e565b0190805180938984019201916139779261171e565b01815191828d88840192019161398c9261171e565b01815191828c8784019201916139a19261171e565b01815191828b8684019201916139b69261171e565b01815191828a8584019201916139cb9261171e565b01908101661e17b232b3399f60c91b90528151918288603d84019201916139f19261171e565b018151918287603d8401920191613a079261171e565b018151918286603d8401920191613a1d9261171e565b018151918285603d8401920191613a339261171e565b01603d8101651e17b9bb339f60d11b90526080519003602381016080515260430160805190613a61916117e3565b5190613a6c82611792565b60148252810173646f6e652067656e6572617465476c6f7753766760601b9052613a959061265e565b60805190565b50509050516119e7816117c8565b906040519060208201926001600160601b03199060601b1683526034820152603481526137bb816117ad565b6001600160a01b03811660009081526008602052604081205415611f32576040611e3491600960205281812081805260205220548092613501565b80516060939290156131a5576000935b8251600019810190811161128e57851015613c1a57600190613c12613b4587866119b6565b516040926000808551613b5781611792565b6008815261268c613bac6020966770617274735b695d60c01b888501528951928391613b9a8a840196634b5c427760e01b88528d60248601526064850190611741565b83810360231901604485015290611741565b51906a636f6e736f6c652e6c6f675afa50613bc789886119b6565b5193519381613bdf869351809286808701910161171e565b8201613bf38251809386808501910161171e565b01865190613c0682858301868b0161171e565b010380845201826117e3565b940193613b20565b929350508051600019810190811161128e57613c3b602091611e34936119b6565b51926040519381613c55869351809286808701910161171e565b8201613c068251809386808501910161171e56fea26469706673582212208f59e6ddf88531330a563a841c3b11226b2c933bc251b5cf603630be830835cd64736f6c63430008170033
Deployed Bytecode
0x60a0604090808252600436101561001557600080fd5b60003560e01c90816306fdde031461166d57508063095ea7b31461164457806316f0115b1461161b57806318160ddd146115fc578063214013ca1461159457806323b872dd146114cb5780632bd1a01114611473578063313ce56714611457578063333a0072146113fb57806335ad0cea1461130f57806339509351146112bf578063422b9e23146112a4578063524773ce1461125d5780636b4ed21b1461123e57806370a082311461120557806370db69d6146111e15780638da5cb5b146111b857806395d89b41146110d257806395e4b21b1461109957806399f65c8f1461107a578063a457c2d714610fd3578063a9059cbb14610fa3578063bbb1e3f814610587578063c3f4552a14610559578063c5b8f77214610510578063c7218d5b14610485578063cb8106f414610440578063cda5fefc14610271578063dd62ed3e14610224578063e0d9750214610205578063f2fde38b146101be5763fb700e5b1461018157600080fd5b346101b95760203660031901126101b9576020906001600160a01b036101a5611766565b166000526008825280600020549051908152f35b600080fd5b346101b95760203660031901126101b9576101d7611766565b601354906001600160a01b03906101f18284163314611926565b6001600160a01b0319909216911617601355005b50346101b95760003660031901126101b9576020906011549051908152f35b50346101b957806003193601126101b957602090610240611766565b61024861177c565b9060018060a01b0380911660005260018452826000209116600052825280600020549051908152f35b50346101b9576020806003193601126101b9576001600160401b03906004358281116101b957366023820112156101b9578060040135906102bd6102b48361182c565b955195866117e3565b81855236602483830101116101b95781600092602485930183880137850101526102f260018060a01b03601354163314611926565b825191821161042a57610306601454611847565b601f81116103d1575b5080601f83116001146103505750819061034093600092610345575b50508160011b916000199060031b1c19161790565b601455005b01519050388061032b565b90601f1983169360146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec926000905b8682106103b957505083600195106103a0575b505050811b01601455005b015160001960f88460031b161c19169055388080610395565b80600185968294968601518155019501930190610382565b61041a9060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec601f850160051c810191848610610420575b601f0160051c0190611f94565b3861030f565b909150819061040d565b634e487b7160e01b600052604160045260246000fd5b50346101b95760203660031901126101b957602090610474600435600052600d60205260018060a01b036040600020541690565b90516001600160a01b039091168152f35b50346101b957806003193601126101b95761050c906104a2611766565b6000602083516104b181611792565b828152015260018060a01b0316600052600960205280600020602435600052602052806000209060018151926104e684611792565b805484520154602083015251918291829190916020806040830194805184520151910152565b0390f35b50346101b957806003193601126101b9576020906001600160a01b03610534611766565b16600052600b825280600020602435600052825260ff81600020541690519015158152f35b50346101b95761050c9061057461056f36611804565b611fe5565b9051918291602083526020830190611741565b50346101b95760031981813601126101b9576001600160401b03600435116101b957606090600435360301126101b95760243560ff81168091036101b9576105da60018060a01b03601354163314611926565b61060782516105e881611792565b600d81526c6164645361626572536861706560981b602082015261265e565b60005260156020526000208054600160401b81101561042a5761062f91600182018155611f43565b610f8d57610641600480350180611f5f565b600160401b811161042a578254818455808210610f18575b5081836000526020600020906000935b838510610df3578560018101610689602460043501600435600401611f5f565b9091600160401b821161042a578054828255808310610d7e575b506000908152602081209092805b838510610c5957600435604481013590879060028201903603606219018312156101b9576106e56004803585010180611f5f565b9091600160401b821161042a578054828255808310610be4575b506000908152602081209092805b838510610ace57868661072a600480358401602481019101611f5f565b600160401b811161042a576003830154816003850155808210610a55575b5081600384016000526020600020906000935b8385106109295760048681019061077b9080358a01604481019101611f5f565b90600160401b821161042a5782548284558083106108b4575b506000928352602083209290805b8383106107ab57005b8035601e19833603018112156101b95782018035906001600160401b0382116101b95781360360208201136101b9576107ee826107e88954611847565b89611fab565b600090601f83116001146108425792610826836001959460209487966000926108355750508160011b916000199060031b1c19161790565b88555b019501920191936107a2565b8692500101358b8061032b565b601f198316918860005260206000209260005b81811061089a575093602093600196938796938388951061087e575b505050811b018855610829565b01850135600019600384901b60f8161c191690558a8080610871565b919360206001819282888801013581550195019201610855565b8360005282602060002091820191015b8181106108d15750610794565b806108de60019254611847565b806108eb575b50016108c4565b601f908181118414610904575050600081555b866108e4565b61092060009284845260208420920160051c8201858301611f94565b818355556108fe565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b9576109728184013561096c8654611847565b86611fab565b600090601f81850135116001146109d0576001926109b28493602093600091818901356109c1575b50870135908160011b916000199060031b1c19161790565b86555b0193019401939161075b565b8882010185013591508d61099a565b908460005260206000209060005b85840135601f19168110610a3957506001938493602093919285929088830135601f19811610610a18575b5050860135811b0186556109b5565b8560001960f8858c013560031b161c1991848b010101351690558c80610a09565b90916020600181928286888b01010135815501930191016109de565b600384016000526020600020908282015b8183018110610a76575050610748565b80610a8360019254611847565b80610a90575b5001610a66565b601f908181118414610aa9575050600081555b88610a89565b610ac560009284845260208420920160051c8201858301611f94565b81835555610aa3565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610b118184013561096c8654611847565b600090601f8185013511600114610b5f57600192610b508493602093600091818901356109c15750870135908160011b916000199060031b1c19161790565b86555b0193019401939161070d565b908460005260206000209060005b85840135601f19168110610bc857506001938493602093919285929088830135601f19811610610ba7575b5050860135811b018655610b53565b8560001960f8858c013560031b161c1991848b010101351690558c80610b98565b90916020600181928286888b0101013581550193019101610b6d565b8160005282602060002091820191015b818110610c0157506106ff565b80610c0e60019254611847565b80610c1b575b5001610bf4565b601f908181118414610c34575050600081555b88610c14565b610c5060009284845260208420920160051c8201858301611f94565b81835555610c2e565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610c9c8184013561096c8654611847565b600090601f8185013511600114610cf957600192610cdb849360209360009181890135610cea5750870135908160011b916000199060031b1c19161790565b86555b019301940193916106b1565b8882010185013591508c61099a565b908460005260206000209060005b85840135601f19168110610d6257506001938493602093919285929088830135601f19811610610d41575b5050860135811b018655610cde565b8560001960f8858c013560031b161c1991848b010101351690558b80610d32565b90916020600181928286888b0101013581550193019101610d07565b8160005282602060002091820191015b818110610d9b57506106a3565b80610da860019254611847565b80610db5575b5001610d8e565b601f908181118414610dce575050600081555b87610dae565b610dea60009284845260208420920160051c8201858301611f94565b81835555610dc8565b8035601e19833603018112156101b9576001600160401b0381840135116101b957808301353603602082850101136101b957610e368184013561096c8654611847565b600090601f8185013511600114610e9357600192610e75849360209360009181890135610e845750870135908160011b916000199060031b1c19161790565b86555b01930194019391610669565b8882010185013591503861099a565b908460005260206000209060005b85840135601f19168110610efc57506001938493602093919285929088830135601f19811610610edb575b5050860135811b018655610e78565b8560001960f8858c013560031b161c1991848b010101351690553880610ecc565b90916020600181928286888b0101013581550193019101610ea1565b8360005281602060002091820191015b818110610f355750610659565b80610f4260019254611847565b80610f4f575b5001610f28565b601f908181118414610f68575050600081555b38610f48565b610f8460009284845260208420920160051c8201858301611f94565b81835555610f62565b634e487b7160e01b600052600060045260246000fd5b50346101b957806003193601126101b957602090610fcc610fc2611766565b6024359033612381565b5160018152f35b50346101b957806003193601126101b957610fec611766565b906024353360005260016020528160002060018060a01b03841660005260205281600020548181106110285792610fcc9160209403903361227f565b825162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b50346101b95760003660031901126101b957602090600f549051908152f35b50346101b95760203660031901126101b9576020906001600160a01b036110be611766565b16600052600e825280600020549051908152f35b50346101b95760003660031901126101b957805160045490918260006110f784611847565b80835260209460019086600182169182600014611196575050600114611139575b505061050c929161112a9103856117e3565b51928284938452830190611741565b9085925060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000925b82841061117e575050508201018161112a611118565b8054848a018601528895508794909301928101611168565b60ff19168682015292151560051b8501909201925083915061112a9050611118565b50346101b95760003660031901126101b95760135490516001600160a01b039091168152602090f35b50346101b95760003660031901126101b9576020906111fe611ec5565b9051908152f35b50346101b95760203660031901126101b9576020906001600160a01b0361122a611766565b166000526000825280600020549051908152f35b50346101b95760003660031901126101b9576020906010549051908152f35b50346101b95760003660031901126101b9576002546702ea11e32ad5000090810390811161128e5760209151908152f35b634e487b7160e01b600052601160045260246000fd5b50346101b95761050c906105746112ba36611804565b6119ca565b50346101b957806003193601126101b957602090610fcc6112de611766565b33600052600184528260002060018060a01b03821660005284526113086024358460002054611976565b903361227f565b50346101b957806003193601126101b957600435906024356113308161195f565b9261133d835194856117e3565b8184526113498261195f565b916020916020860193601f190136853760005b8281106113ae575050508251938493602085019160208652518092528401929160005b82811061138e57505050500390f35b83516001600160a01b03168552869550938101939281019260010161137f565b806113dd6113c2600193859a98999a611976565b6000908152600d60205260409020546001600160a01b031690565b6113e782886119b6565b90838060a01b03169052019594939561135c565b346101b95760003660031901126101b9576013546114236001600160a01b0382163314611926565b6001600160a01b0319166013557f6e4ee811a17215345b89e3506064ff2d62f4feedff3566e9d09219cda7e8cadb600080a1005b50346101b95760003660031901126101b9576020905160098152f35b50346101b95760203660031901126101b95761050c90611491611766565b6000602083516114a081611792565b82815201526001600160a01b03166000908152600c602052819020815191906001906104e684611792565b50346101b95760603660031901126101b9576114e5611766565b906114ee61177c565b6044359260018060a01b038116600052600160205282600020336000526020528260002054600019810361152b575b5092610fcc91602094612381565b84811061155057918491611547602096610fcc9503338361227f565b9194509161151d565b835162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b60203660031901126101b9576115a8611766565b6001600160a01b037f000000000000000000000000e454971f7f1ac59d0251f1803e6d240ed199aad6811633036101b957600554918183166101b9576001600160a01b031990921691161760055542600655005b50346101b95760003660031901126101b9576020906002549051908152f35b50346101b95760003660031901126101b95760055490516001600160a01b039091168152602090f35b50346101b957806003193601126101b957602090610fcc611663611766565b602435903361227f565b82346101b95760003660031901126101b9576003549082600061168f84611847565b808352602094600190866001821691826000146111965750506001146116c157505061050c929161112a9103856117e3565b9085925060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000925b828410611706575050508201018161112a611118565b8054848a0186015288955087949093019281016116f0565b60005b8381106117315750506000910152565b8181015183820152602001611721565b9060209161175a8151809281855285808601910161171e565b601f01601f1916010190565b600435906001600160a01b03821682036101b957565b602435906001600160a01b03821682036101b957565b604081019081106001600160401b0382111761042a57604052565b606081019081106001600160401b0382111761042a57604052565b602081019081106001600160401b0382111761042a57604052565b90601f801991011681019081106001600160401b0382111761042a57604052565b60409060031901126101b95760405161181c81611792565b6004358152602435602082015290565b6001600160401b03811161042a57601f01601f191660200190565b90600182811c92168015611877575b602083101461186157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611856565b9060405191826000825461189481611847565b9081845260209460019160018116908160001461190457506001146118c5575b5050506118c3925003836117e3565b565b600090815285812095935091905b8183106118ec5750506118c393508201013880806118b4565b855488840185015294850194879450918301916118d3565b925050506118c394925060ff191682840152151560051b8201013880806118b4565b1561192d57565b60405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606490fd5b6001600160401b03811161042a5760051b60200190565b9190820180921161128e57565b8051600110156119935760400190565b634e487b7160e01b600052603260045260246000fd5b8051156119935760200190565b80518210156119935760209160051b010190565b6005546001600160a01b03166119ee57506040516119e7816117c8565b6000815290565b6119f790612b08565b60408051611a0481611792565b60058152611a2060209164746f53766760d81b8382015261265e565b611a28612eb1565b9282519282808501957f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323087527030302f737667272076696577426f783d2760781b83870152611a80815180928460518a01910161171e565b850191611aa460538761139f60f11b958660518201520360338101895201876117e3565b611ad58151611ab281611792565b601281527119d95b995c985d19509858dad9dc9bdd5b9960721b8482015261265e565b60c08401519381519485848101917f3c7265637420783d27302720793d2730272077696474683d273130302527206883527265696768743d2731303025272066696c6c3d2760681b85830152611b34815180928860538601910161171e565b8101631390179f60e11b6053820152605760009160145491611b5583611847565b92600190818116908115611e965750600114611e37575b5050505003601f1981018752611b8290876117e3565b8251611b8d81611792565b601781527f646f6e652067656e65726174654261636b67726f756e6400000000000000000085820152611bbf9061265e565b611bc8826137c1565b908351611bd481611792565b600f81526e67656e65726174654265616d53766760881b86820152611bf89061265e565b61010083019685885101516080850151611c1191613b10565b94611c1a612eb1565b9781519582898801986d3c7376672076696577426f783d2760901b9b8c8b52805190818d602e8d01920191611c4e9261171e565b890184602e820152815191828d60308401920191611c6b9261171e565b019b88651e17b9bb339f60d11b9d8e603082015203601681018a52603601611c93908a6117e3565b8151611c9e81611792565b6014815273646f6e652067656e65726174654265616d53766760601b8c820152611cc79061265e565b8151611cd281611792565b600f81526e67656e657261746548696c7453766760881b8c820152611cf69061265e565b5151910151611d0491613b10565b825191898381808201858196519283910191611d1f9261171e565b81010380855201611d3090846117e3565b611d38612eb1565b9284519a8b948186019d8e5280518092602e8801920191611d589261171e565b840191602e83015251918260308301611d709261171e565b018a603082015203601681018852603601611d8b90886117e3565b8051611d9681611792565b6014815273646f6e652067656e657261746548696c7453766760601b8b820152611dbf9061265e565b519a8b9a5190818b8d01611dd29261171e565b8a01905191828a8301611de49261171e565b018151918289808401920191611df99261171e565b0190519182878301611e0a9261171e565b0190519182858301611e1b9261171e565b019182015203600681018252602601611e3490826117e3565b90565b909192935060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec6000905b858210611e7e57505050500160570138808080611b6c565b80548583018501528d9a8d9750909101908201611e66565b925050506057935060ff92919219168383015280151502010138808080611b6c565b9190820391821161128e57565b6005546001600160a01b031615611f3757611ee260065442611eb8565b6702ea11e32ad5000081810291818304810361128e57670e92596fd629000002918083046005149015171561128e57620186a0655f7f37b390009204820180921161128e57808211611f32575090565b905090565b6702ea11e32ad5000090565b8054821015611993576000526005602060002091020190600090565b903590601e19813603018212156101b957018035906001600160401b0382116101b957602001918160051b360383136101b957565b818110611f9f575050565b60008155600101611f94565b9190601f8111611fba57505050565b6118c3926000526020600020906020601f840160051c8301931061042057601f0160051c0190611f94565b6005546001600160a01b031661200257506040516119e7816117c8565b61200b90612b08565b805161201690612eed565b604082015160808301519060a084015160c08501519460e0015161203990612eed565b94604051612046816117ad565b6027815260208097818301937f4a6564692c20244a4544492e204d61792074686520666f726365206265207769855260408401663a34103cb7ba9760c91b90526040519561209387611792565b60128752838701977168747470733a2f2f6a6564692e61726d792f60701b89526040519b8c9b818d01607b60f81b90528c67112632bb32b6111d60c11b90602101528c81519260298492019201916120ea9261171e565b8b016f1610112434b63a1021b7b637b9111d1160811b602982015281519182876039840192019161211a9261171e565b0198601160f91b998a60398201526f1610112132b0b69021b7b637b9111d1160811b603a8201528151918287604a84019201916121569261171e565b0189604a820152741610112132b0b69023b637bb9021b7b637b9111d1160591b604b8201528151918286606084019201916121909261171e565b01886060820152751610112130b1b5b3b937bab7321021b7b637b9111d1160511b60618201528151918285607784019201916121cb9261171e565b01908760778301527216101129b0b132b91029b430b8329034b2111d60691b607883015280518093608b84019201916122039261171e565b0190701610112232b9b1b934b83a34b7b7111d1160791b608b830152519182609c830161222f9261171e565b019083609c830152681610112bb2b1111d1160b91b609d83015251918260a683016122599261171e565b019060a682015260a78101607d60f81b90520360888101825260a801611e3490826117e3565b6001600160a01b0390811691821561233057169182156122e05760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6005546001600160a01b0393929190841615612608576123a081612fb2565b6123a983612fb2565b906123b58585856126ad565b6123be83612fb2565b906123c885612fb2565b91811580612601575b6125f3575b816125ea575b506125dc575b8115806125d5575b6125c7575b816125be575b506125b0575b838216156124ac578381163081146124a1576007549460ff8616156124265750506118c393506128bc565b6005541680911461243c57506118c393506128bc565b92919050612448611ec5565b821161246c5760ff19938416600117600755612463926128bc565b60075416600755565b60405162461bcd60e51b815260206004820152600d60248201526c1b585e08189d5e481b1a5b5a5d609a1b6044820152606490fd5b506118c393506128bc565b90509190911680156125615760009181835282602052604083205481811061251157817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928587528684520360408620558060025403600255604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b6125b9826130e1565b6123fb565b905015386123f5565b6125d084613087565b6123ef565b50806123ea565b6125e5836130e1565b6123e2565b905015386123dc565b6125fc85613087565b6123d6565b50806123d1565b83601354168085831614908115612652575b506123fb5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606490fd5b9050848316143861261a565b6000809160405161269a8161268c602082019463104c13eb60e21b8652602060248401526044830190611741565b03601f1981018352826117e3565b51906a636f6e736f6c652e6c6f675afa50565b916001600160a01b0391908284163081146128b557633b9aca009081830494851515806128a7575b80612897575b61271a575b50612715926118c3969261270f926000526000602052806127076040600020549384611eb8565b049104611eb8565b906131a9565b61363b565b600090828252602091600c835260409088828220541480612878575b61281e57848152600b8452818120898252845260ff8282205416806127ff575b612762575050506126e0565b6127d39296507f882cd5197c658fe29ff1ed21d4a9c2c50495592e1e9337e75267eff5a3c6530297955098818a866127fa979b94969c5260098c52818120600a8d528282208583528d528282205482528c522099600185519b6127c48d611792565b80548d520154908b0152613501565b6127dd8784613458565b519283921695829190916020806040830194805184520151910152565b0390a3565b508288168152600b8452818120898252845260ff828220541615612756565b6127d39296507f882cd5197c658fe29ff1ed21d4a9c2c50495592e1e9337e75267eff5a3c6530297955098818a866127fa979b94969c52600c8c522099600185519b6128698d611792565b80548d520154908b01526131a9565b508288168152600b8452818120898252845260ff828220541615612736565b50806005541681861614156126db565b5080600554168214156126d5565b5050505050565b6001600160a01b039081169182156129815760009383855284602052604085205481811061292d577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209383604093888a528987520383892055169586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b60409081519161012083018381106001600160401b0382111761042a5781526101008360008152606080602083015280848301526000818301528060808301528060a08301528060c0830152600060e0830152835193612a33856117ad565b818552816020860152805191612a48836117ad565b808352806020840152818301528401520152565b8115612a66570690565b634e487b7160e01b600052601260045260246000fd5b6018548110156119935760186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0190600090565b908154612abf8161195f565b92612acd60405194856117e3565b818452600090815260208082208186015b848410612aec575050505050565b6001838192612afa85611881565b815201920193019290612ade565b612b106129d4565b508051602090818301918251604092835190612b2b826117ad565b8152600091828483015284820152612bd7612bd0612b476129d4565b97848088612b548761372e565b80612ea3575b808d52612bb98a835192612b6d84611792565b600884526719185d184b9b1d9b60c21b82850152612ba585519485938401966309710a9d60e41b885260248501526064840190611741565b90604483015203601f1981018352826117e3565b51906a636f6e736f6c652e6c6f675afa5051612eed565b9551612eed565b9484519581612bef889351809288808701910161171e565b8201605f60f81b86820152612c0d825180938860218501910161171e565b010394612c246021600197888101845201826117e3565b83870152612c3181613770565b612c3e6017548092612a5c565b90811015612e8f57612c7590601784527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1501611881565b60c0870152612c8381613770565b612c98612c936018548093612a5c565b612a7c565b50805415612e7b57612ccd612c93859493612cd393899752612cbb888720611881565b878c0152612cc885613770565b612a5c565b50612ab3565b83518884601654612ce381611847565b90818552898c82169182600014612e5d575050600114612e01575b50600494612d2a612d9695856080612d6696612d23612dec9c99612d549803846117e3565b0152611983565b5160a08d0152612d4f8851612d3e81611792565b8c8152601960f91b8b82015261265e565b613770565b8a518352601588528683205490612a5c565b968791612d888251612d7781611792565b8b8152603360f81b8a82015261265e565b8a5181526015885220611f43565b50612db8845197612da6896117ad565b612daf83612ab3565b89528201612ab3565b85880152835194612dc8866117ad565b612dd460028301612ab3565b8652612de260038301612ab3565b9086015201612ab3565b8183015283015260e083015261010082015290565b6016875288915086908b7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242895b828410612e41575050508301016004612cfe565b80548488018601528c9a508e95508b94909301928d9101612e2d565b60ff19168187015291151560051b8501909101915060049050612cfe565b634e487b7160e01b84526032600452602484fd5b634e487b7160e01b83526032600452602483fd5b612eac906130d4565b612b5a565b60405190612ebe82611792565b6011825270302030203332302e3235203332302e323560781b6020830152565b600019811461128e5760010190565b8015612f9457600081805b612f805750612f068161182c565b90612f1460405192836117e3565b808252601f19612f238261182c565b013660208401375b80928015612f7957600019820191821161128e578193600a92603090848406820180921161128e57855111156119935760f81b6001600160f81b03191660001a908401601f01530491612f2b565b5050905090565b90612f8c600a91612ede565b910480612ef8565b50604051612fa181611792565b60018152600360fc1b602082015290565b6001600160a01b039081169190308314908115613079575b508015613071575b61306b57600091808352600c60205260408320546040519163fb700e5b60e01b83526004830152602082602481305afa918215613060578492613021575b5061301c929350611976565b151590565b9091506020813d602011613058575b8161303d602093836117e3565b810103126130545761301c92935051908392613010565b8380fd5b3d9150613030565b6040513d86823e3d90fd5b60009150565b508115612fd2565b905060055416821438612fca565b6130cf90601054600052600d60205260406000209060018060a01b031690816001600160601b0360a01b82541617905560105490600052600e60205280604060002055612ede565b601055565b801561128e576000190190565b60105480156131a5576001600160a01b039182166000818152600e6020526040808220549094919390919060001981019081116131915780830361315a575b50505061312e6010546130d4565b6010558152600e60205280828120556010548152600d602052206001600160601b0360a01b8154169055565b8452600d6020528484205416818452848420816001600160601b0360a01b8254161790558352600e60205283832055388080613120565b634e487b7160e01b85526011600452602485fd5b5050565b91908015613453576005546001600160a01b03848116929116821461344d576000828152600c6020818152604093848420978551916131e783611792565b895483526001809a0154848401528786528484528686208054828110156133bb5750508786528484528686205461321d91611eb8565b908786528484528587812055613241613237601254612ede565b8060125582613aa9565b8887528585526001888820015560088452868620549980879b88925b613377575b505050918187969492938b6132dc9997957faa626bf76e4a6a5b23f2cd43ad5451ce8410ccdca0112dc86a79b5964f177edc9b9c9d1161332a575b5050508051151580613319575b613306575b5115806132f4575b6132e1575b878352522090518154815260019091015460208201529081906040820190565b0390a2565b6132ec601154612ede565b6011556132bc565b508783528181528383205415156132b7565b6133116011546130d4565b6011556132af565b5088845282825284842054156132aa565b6133629261333791611eb8565b8b875285855261334b888820918254611976565b9055613358601254612ede565b9081601255613aa9565b8985528383526001868620015538808061329d565b90919b818d10806133b2575b156133ac5761339e6133a49161339886613ad5565b90611976565b9c612ede565b91908161325d565b9b613262565b50848110613383565b7faa626bf76e4a6a5b23f2cd43ad5451ce8410ccdca0112dc86a79b5964f177edc999a9b50926133f99161334b8a999795946132dc9b999795611eb8565b908985528383528585209160018301555115159081613443575b5061343857878352522090518154815260019091015460208201529081906040820190565b6132ec6011546130d4565b9050541538613413565b50509050565b509050565b6005546001600160a01b0391821692911682146131a55760009082825260206008815260409384842061348b8154612ede565b9055613498600f54612ede565b600f55808452600882528484205460001981019081116131915781855260098352858520818652835285852084518155600184860151910155818552600a8352858520845186528352858520558352600b8152838320915183525220600160ff19825416179055565b6005546001600160a01b03918216911681146131a55760019060009281845260206008815260409283862061353681546130d4565b9055613543600f546130d4565b600f55808652600b8252838620838752825283862060ff198154169055808652600882528386205492600a8352848720908752825283862054818752600983528487208188528352848720908686519261359c84611792565b805484520154848301528481036135da575b50818752600a835284872090518752825285848120558552600981528285209185525282208281550155565b828852600984528588208589528452858820878751916135f983611792565b805483520154858201908152848a5260098652878a20838b52865288888b20918351835551910155838952600a855286892090518952845285882055386135ae565b9080156131a5576005546001600160a01b038381169391168314613729576136c46132dc917efb093446d003bea3dc7db8b593d37cc6a34ea254b80cd1aa5d942b828a5d6d93600090868252600c60205260409384938484209260018651946136a386611792565b8054865201546020850152898552600c60205261334b868620918254611976565b90878352600c6020528383209160018301555115908161371e575b5061370b575b858152600c60205220905191829182919091602060016040830194805484520154910152565b613716601154612ede565b6011556136e5565b9050541515386136df565b505050565b5161041a811061376a5761290481106137645762019a28811061375e57621005901161375957600490565b600390565b50600290565b50600190565b50600090565b61378d8151602083019081519161378683612ede565b9052611976565b60001981019190821161128e576040015160405190602082019283526040820152604081526137bb816117ad565b51902090565b60408051916137cf83611792565b600f83526137f56020936e67656e6572617465476c6f7753766760881b8582015261265e565b61010081018281510151515115613a9b57838201519061384e6030855180946f72616469616c2d6772616469656e742d60801b8983015261383e815180928b868601910161171e565b81010360108101855201836117e3565b613856612eb1565b926138658583510151516119a9565b5160a0613876878551015151611983565b519201805187855101515180516002101561199357606001518251918987510151518051600310156119935760808c91015194818c8a510151015190516138bc91613b10565b968b8080808c51015101516138d0906119a9565b519a51015101516138e090611983565b519a8c5160805282608051016d3c7376672076696577426f783d2760901b90528051908184608051602e019201916139179261171e565b6080510196602e880161139f60f11b905260308801651e3232b3399f60d11b905260369781519182858b840192019161394f9261171e565b8b519101613962828a8301868f0161171e565b0190805180938984019201916139779261171e565b01815191828d88840192019161398c9261171e565b01815191828c8784019201916139a19261171e565b01815191828b8684019201916139b69261171e565b01815191828a8584019201916139cb9261171e565b01908101661e17b232b3399f60c91b90528151918288603d84019201916139f19261171e565b018151918287603d8401920191613a079261171e565b018151918286603d8401920191613a1d9261171e565b018151918285603d8401920191613a339261171e565b01603d8101651e17b9bb339f60d11b90526080519003602381016080515260430160805190613a61916117e3565b5190613a6c82611792565b60148252810173646f6e652067656e6572617465476c6f7753766760601b9052613a959061265e565b60805190565b50509050516119e7816117c8565b906040519060208201926001600160601b03199060601b1683526034820152603481526137bb816117ad565b6001600160a01b03811660009081526008602052604081205415611f32576040611e3491600960205281812081805260205220548092613501565b80516060939290156131a5576000935b8251600019810190811161128e57851015613c1a57600190613c12613b4587866119b6565b516040926000808551613b5781611792565b6008815261268c613bac6020966770617274735b695d60c01b888501528951928391613b9a8a840196634b5c427760e01b88528d60248601526064850190611741565b83810360231901604485015290611741565b51906a636f6e736f6c652e6c6f675afa50613bc789886119b6565b5193519381613bdf869351809286808701910161171e565b8201613bf38251809386808501910161171e565b01865190613c0682858301868b0161171e565b010380845201826117e3565b940193613b20565b929350508051600019810190811161128e57613c3b602091611e34936119b6565b51926040519381613c55869351809286808701910161171e565b8201613c068251809386808501910161171e56fea26469706673582212208f59e6ddf88531330a563a841c3b11226b2c933bc251b5cf603630be830835cd64736f6c63430008170033