ETH Price: $3,119.73 (+1.60%)
Gas: 7 Gwei

Contract

0x7F59B64C6Ee521C0d7E590CF8e4B843cAa236F96
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve201465522024-06-22 10:08:4717 days ago1719050927IN
0x7F59B64C...cAa236F96
0 ETH0.000081433.34445262
Approve201465512024-06-22 10:08:3517 days ago1719050915IN
0x7F59B64C...cAa236F96
0 ETH0.000080533.29947199
Approve201441162024-06-22 1:57:5918 days ago1719021479IN
0x7F59B64C...cAa236F96
0 ETH0.000105132.24680968
Approve200814752024-06-13 7:40:3526 days ago1718264435IN
0x7F59B64C...cAa236F96
0 ETH0.0004882410.44732625
Safe Transfer Fr...200814672024-06-13 7:38:5926 days ago1718264339IN
0x7F59B64C...cAa236F96
0 ETH0.0022166111.69408756
Approve200814252024-06-13 7:30:3526 days ago1718263835IN
0x7F59B64C...cAa236F96
0 ETH0.0005798112.40663068
Approve199799252024-05-30 3:17:1141 days ago1717039031IN
0x7F59B64C...cAa236F96
0 ETH0.000286036.12055053
Approve198058442024-05-05 19:01:2365 days ago1714935683IN
0x7F59B64C...cAa236F96
0 ETH0.000303246.48883651
Approve197210662024-04-23 22:26:3577 days ago1713911195IN
0x7F59B64C...cAa236F96
0 ETH0.0004708110.06145127
Set Approval For...196636272024-04-15 21:36:2385 days ago1713216983IN
0x7F59B64C...cAa236F96
0 ETH0.0006044713.13558817
Approve196636212024-04-15 21:35:1185 days ago1713216911IN
0x7F59B64C...cAa236F96
0 ETH0.0007459415.94111618
Approve196240572024-04-10 8:32:1190 days ago1712737931IN
0x7F59B64C...cAa236F96
0 ETH0.0006303513.48814961
Approve195408672024-03-29 16:33:23102 days ago1711730003IN
0x7F59B64C...cAa236F96
0 ETH0.0016391435.07383367
Approve195285802024-03-27 22:46:35104 days ago1711579595IN
0x7F59B64C...cAa236F96
0 ETH0.0008313130.98009226
Approve195285802024-03-27 22:46:35104 days ago1711579595IN
0x7F59B64C...cAa236F96
0 ETH0.001426630.52599576
Approve194929792024-03-22 21:56:47109 days ago1711144607IN
0x7F59B64C...cAa236F96
0 ETH0.0010563722.6039194
Approve194882592024-03-22 6:03:23109 days ago1711087403IN
0x7F59B64C...cAa236F96
0 ETH0.001005221.5091579
Approve194874372024-03-22 3:17:59110 days ago1711077479IN
0x7F59B64C...cAa236F96
0 ETH0.000958620.48573267
Approve194670962024-03-19 6:45:23112 days ago1710830723IN
0x7F59B64C...cAa236F96
0 ETH0.0010500922.46951222
Approve194639502024-03-18 20:07:35113 days ago1710792455IN
0x7F59B64C...cAa236F96
0 ETH0.0020302743.44323821
Approve194629732024-03-18 16:50:35113 days ago1710780635IN
0x7F59B64C...cAa236F96
0 ETH0.0018213438.97264499
Approve194473772024-03-16 12:12:23115 days ago1710591143IN
0x7F59B64C...cAa236F96
0 ETH0.0013254128.36084817
Approve194348732024-03-14 17:59:35117 days ago1710439175IN
0x7F59B64C...cAa236F96
0 ETH0.0024528752.48580885
Approve194325482024-03-14 10:06:35117 days ago1710410795IN
0x7F59B64C...cAa236F96
0 ETH0.002238947.90741115
Approve194325342024-03-14 10:03:35117 days ago1710410615IN
0x7F59B64C...cAa236F96
0 ETH0.0024032451.3580497
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719672024-02-06 21:49:23154 days ago1707256163
0x7F59B64C...cAa236F96
0.1 ETH
191719652024-02-06 21:48:59154 days ago1707256139
0x7F59B64C...cAa236F96
0.5 ETH
191719652024-02-06 21:48:59154 days ago1707256139
0x7F59B64C...cAa236F96
0.5 ETH
191719652024-02-06 21:48:59154 days ago1707256139
0x7F59B64C...cAa236F96
0.5 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CellMates

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 2 : CellMates.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "./Metadata.sol";

/*

CellMates (CELL)
An experimental hybrid of ERC-20 & ERC-721.

- 256 total supply
- 1 ETH + 128 CELL initial liquidity
- 0.1 ETH mint from contract price
- sellable on both Uniswap and Opensea
- fully on-chain artwork based on cellular automata

https://cellmates.io

*/

interface Receiver {
	function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns (bytes4);
}

interface Router {
	function WETH() external pure returns (address);
	function factory() external pure returns (address);
	function addLiquidityETH(address, uint256, uint256, uint256, address, uint256) external payable returns (uint256, uint256, uint256);
}

interface Factory {
	function createPair(address, address) external returns (address);
}


contract CellMates {

	uint256 constant private UINT_MAX = type(uint256).max;
	uint256 constant private TOTAL_SUPPLY = 256;
	uint256 constant private LIQUIDITY_TOKENS = 128;
	Router constant private ROUTER = Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

	uint256 constant private M1 = 0x5555555555555555555555555555555555555555555555555555555555555555;
	uint256 constant private M2 = 0x3333333333333333333333333333333333333333333333333333333333333333;
	uint256 constant private M4 = 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f;
	uint256 constant private H01 = 0x0101010101010101010101010101010101010101010101010101010101010101;
	bytes32 constant private TRANSFER_TOPIC = keccak256(bytes("Transfer(address,address,uint256)"));
	bytes32 constant private APPROVAL_TOPIC = keccak256(bytes("Approval(address,address,uint256)"));

	uint256 constant public MINT_COST = 0.1 ether;

	uint8 constant public decimals = 0;

	struct User {
		bytes32 mask;
		mapping(address => uint256) allowance;
		mapping(address => bool) approved;
	}

	struct Info {
		bytes32 salt;
		address pair;
		address owner;
		Metadata metadata;
		mapping(address => User) users;
		mapping(uint256 => address) approved;
		address[] holders;
	}
	Info private info;

	mapping(bytes4 => bool) public supportsInterface;


	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
	event ERC20Transfer(bytes32 indexed topic0, address indexed from, address indexed to, uint256 tokens) anonymous;
	event Approval(address indexed owner, address indexed spender, uint256 indexed tokenId);
	event ERC20Approval(bytes32 indexed topic0, address indexed owner, address indexed spender, uint256 tokens) anonymous;
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);


	modifier _onlyOwner() {
		require(msg.sender == owner());
		_;
	}


	constructor() payable {
		require(msg.value > 0);
		info.owner = 0xFaDED72464D6e76e37300B467673b36ECc4d2ccF;
		info.metadata = new Metadata();
		supportsInterface[0x01ffc9a7] = true; // ERC-165
		supportsInterface[0x80ac58cd] = true; // ERC-721
		supportsInterface[0x5b5e139f] = true; // Metadata
		info.salt = keccak256(abi.encodePacked("Salt:", blockhash(block.number - 1)));
	}

	function setOwner(address _owner) external _onlyOwner {
		info.owner = _owner;
	}

	function setMetadata(Metadata _metadata) external _onlyOwner {
		info.metadata = _metadata;
	}


	function initialize() external {
		require(pair() == address(0x0));
		address _this = address(this);
		address _weth = ROUTER.WETH();
		info.users[_this].mask = bytes32(UINT_MAX);
		info.holders.push(_this);
		emit ERC20Transfer(TRANSFER_TOPIC, address(0x0), _this, TOTAL_SUPPLY);
		for (uint256 i = 0; i < TOTAL_SUPPLY; i++) {
			emit Transfer(address(0x0), _this, TOTAL_SUPPLY + i + 1);
		}
		_approveERC20(_this, address(ROUTER), LIQUIDITY_TOKENS);
		info.pair = Factory(ROUTER.factory()).createPair(_weth, _this);
		ROUTER.addLiquidityETH{value:_this.balance}(_this, LIQUIDITY_TOKENS, 0, 0, owner(), block.timestamp);
		_transferERC20(_this, 0xEC513e5959dBB02F314fc2F30041FCA2685119F3, 10); // marketing + giveaways
		_transferERC20(_this, owner(), 10); // developer tokens
	}

	function mint(uint256 _tokens) external payable {
		address _this = address(this);
		uint256 _available = balanceOf(_this);
		require(_tokens <= _available);
		uint256 _cost = _tokens * MINT_COST;
		require(msg.value >= _cost);
		_transferERC20(_this, msg.sender, _tokens);
		payable(owner()).transfer(_cost);
		if (msg.value > _cost) {
			payable(msg.sender).transfer(msg.value - _cost);
		}
	}
	
	function approve(address _spender, uint256 _tokens) external returns (bool) {
		if (_tokens > TOTAL_SUPPLY && _tokens <= 2 * TOTAL_SUPPLY) {
			_approveNFT(_spender, _tokens);
		} else {
			_approveERC20(msg.sender, _spender, _tokens);
		}
		return true;
	}

	function setApprovalForAll(address _operator, bool _approved) external {
		info.users[msg.sender].approved[_operator] = _approved;
		emit ApprovalForAll(msg.sender, _operator, _approved);
	}

	function transfer(address _to, uint256 _tokens) external returns (bool) {
		_transferERC20(msg.sender, _to, _tokens);
		return true;
	}

	function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) {
		if (_tokens > TOTAL_SUPPLY && _tokens <= 2 * TOTAL_SUPPLY) {
			_transferNFT(_from, _to, _tokens);
		} else {
			uint256 _allowance = allowance(_from, msg.sender);
			require(_allowance >= _tokens);
			if (_allowance != UINT_MAX) {
				info.users[_from].allowance[msg.sender] -= _tokens;
			}
			_transferERC20(_from, _to, _tokens);
		}
		return true;
	}

	function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
		safeTransferFrom(_from, _to, _tokenId, "");
	}

	function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public {
		_transferNFT(_from, _to, _tokenId);
		uint32 _size;
		assembly {
			_size := extcodesize(_to)
		}
		if (_size > 0) {
			require(Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) == 0x150b7a02);
		}
	}

	function bulkTransfer(address _to, uint256[] memory _tokenIds) external {
		_transferNFTs(_to, _tokenIds);
	}
	

	function owner() public view returns (address) {
		return info.owner;
	}

	function pair() public view returns (address) {
		return info.pair;
	}

	function holders() public view returns (address[] memory) {
		return info.holders;
	}

	function salt() external view returns (bytes32) {
		return info.salt;
	}

	function metadata() external view returns (address) {
		return address(info.metadata);
	}

	function name() external view returns (string memory) {
		return info.metadata.name();
	}

	function symbol() external view returns (string memory) {
		return info.metadata.symbol();
	}

	function tokenURI(uint256 _tokenId) public view returns (string memory) {
		return info.metadata.tokenURI(_tokenId);
	}

	function totalSupply() public pure returns (uint256) {
		return TOTAL_SUPPLY;
	}

	function maskOf(address _user) public view returns (bytes32) {
		return info.users[_user].mask;
	}

	function balanceOf(address _user) public view returns (uint256) {
		return _popcount(maskOf(_user));
	}

	function allowance(address _user, address _spender) public view returns (uint256) {
		return info.users[_user].allowance[_spender];
	}

	function ownerOf(uint256 _tokenId) public view returns (address) {
		unchecked {
			require(_tokenId > TOTAL_SUPPLY && _tokenId <= 2 * TOTAL_SUPPLY);
			bytes32 _mask = bytes32(1 << (_tokenId - TOTAL_SUPPLY - 1));
			address[] memory _holders = holders();
			for (uint256 i = 0; i < _holders.length; i++) {
				if (maskOf(_holders[i]) & _mask == _mask) {
					return _holders[i];
				}
			}
			return address(0x0);
		}
	}

	function getApproved(uint256 _tokenId) public view returns (address) {
		require(_tokenId > TOTAL_SUPPLY && _tokenId <= 2 * TOTAL_SUPPLY);
		return info.approved[_tokenId];
	}

	function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
		return info.users[_owner].approved[_operator];
	}

	function getToken(uint256 _tokenId) public view returns (address tokenOwner, address approved, string memory uri) {
		return (ownerOf(_tokenId), getApproved(_tokenId), tokenURI(_tokenId));
	}

	function getTokens(uint256[] memory _tokenIds) external view returns (address[] memory owners, address[] memory approveds, string[] memory uris) {
		uint256 _length = _tokenIds.length;
		owners = new address[](_length);
		approveds = new address[](_length);
		uris = new string[](_length);
		for (uint256 i = 0; i < _length; i++) {
			(owners[i], approveds[i], uris[i]) = getToken(_tokenIds[i]);
		}
	}


	function _approveERC20(address _owner, address _spender, uint256 _tokens) internal {
		info.users[_owner].allowance[_spender] = _tokens;
		emit ERC20Approval(APPROVAL_TOPIC, _owner, _spender, _tokens);
	}

	function _approveNFT(address _spender, uint256 _tokenId) internal {
		bytes32 _mask = bytes32(1 << (_tokenId - TOTAL_SUPPLY - 1));
		require(maskOf(msg.sender) & _mask == _mask);
		info.approved[_tokenId] = _spender;
		emit Approval(msg.sender, _spender, _tokenId);
	}
	
	function _transferERC20(address _from, address _to, uint256 _tokens) internal {
		unchecked {
			bytes32 _mask;
			uint256 _pos = 0;
			uint256 _count = 0;
			uint256 _n = uint256(maskOf(_from));
			uint256[] memory _tokenIds = new uint256[](_tokens);
			while (_n > 0 && _count < _tokens) {
				if (_n & 1 == 1) {
					_mask |= bytes32(1 << _pos);
					_tokenIds[_count++] = TOTAL_SUPPLY + _pos + 1;
				}
				_pos++;
				_n >>= 1;
			}
			require(_count == _tokens);
			require(maskOf(_from) & _mask == _mask);
			_transfer(_from, _to, _mask, _tokenIds);
		}
	}
	
	function _transferNFT(address _from, address _to, uint256 _tokenId) internal {
		unchecked {
			require(_tokenId > TOTAL_SUPPLY && _tokenId <= 2 * TOTAL_SUPPLY);
			bytes32 _mask = bytes32(1 << (_tokenId - TOTAL_SUPPLY - 1));
			require(maskOf(_from) & _mask == _mask);
			require(msg.sender == _from || msg.sender == getApproved(_tokenId) || isApprovedForAll(_from, msg.sender));
			uint256[] memory _tokenIds = new uint256[](1);
			_tokenIds[0] = _tokenId;
			_transfer(_from, _to, _mask, _tokenIds);
		}
	}
	
	function _transferNFTs(address _to, uint256[] memory _tokenIds) internal {
		unchecked {
			bytes32 _mask;
			for (uint256 i = 0; i < _tokenIds.length; i++) {
				_mask |= bytes32(1 << (_tokenIds[i] - TOTAL_SUPPLY - 1));
			}
			require(_popcount(_mask) == _tokenIds.length);
			require(maskOf(msg.sender) & _mask == _mask);
			_transfer(msg.sender, _to, _mask, _tokenIds);
		}
	}

	function _transfer(address _from, address _to, bytes32 _mask, uint256[] memory _tokenIds) internal {
		unchecked {
			require(_tokenIds.length > 0);
			for (uint256 i = 0; i < _tokenIds.length; i++) {
				if (getApproved(_tokenIds[i]) != address(0x0)) {
					info.approved[_tokenIds[i]] = address(0x0);
					emit Approval(address(0x0), address(0x0), _tokenIds[i]);
				}
				emit Transfer(_from, _to, _tokenIds[i]);
			}
			info.users[_from].mask ^= _mask;
			bool _from0 = maskOf(_from) == 0x0;
			bool _to0 = maskOf(_to) == 0x0;
			info.users[_to].mask |= _mask;
			if (_from0) {
				uint256 _index;
				address[] memory _holders = holders();
				for (uint256 i = 0; i < _holders.length; i++) {
					if (_holders[i] == _from) {
						_index = i;
						break;
					}
				}
				if (_to0) {
					info.holders[_index] = _to;
				} else {
					info.holders[_index] = _holders[_holders.length - 1];
					info.holders.pop();
				}
			} else if (_to0) {
				info.holders.push(_to);
			}
			require(maskOf(_from) & maskOf(_to) == 0x0);
			emit ERC20Transfer(TRANSFER_TOPIC, _from, _to, _tokenIds.length);
		}
	}


	function _popcount(bytes32 _b) internal pure returns (uint256) {
		uint256 _n = uint256(_b);
		if (_n == UINT_MAX) {
			return 256;
		}
		unchecked {
			_n -= (_n >> 1) & M1;
			_n = (_n & M2) + ((_n >> 2) & M2);
			_n = (_n + (_n >> 4)) & M4;
			_n = (_n * H01) >> 248;
		}
		return _n;
	}
}


contract Deploy {
	CellMates immutable public cellmates;
	constructor() payable {
		cellmates = new CellMates{value:msg.value}();
		cellmates.initialize();
	}
}

File 2 of 2 : Metadata.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

interface CM {
	function salt() external view returns (bytes32);
}

contract Metadata {
	
	string public name = "CellMates";
	string public symbol = "CELL";

	string constant private TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	bytes3 constant private BG_COLOR = 0xd1d3dc;
	uint256 constant private PADDING = 2;

	struct Size {
		uint248 size;
		uint8 chance;
	}
	Size[] private sizes;

	struct Color {
		bytes3 primaryColor;
		bytes3 outlineColor;
		uint8 chance;
		string name;
	}
	Color[] private colors;

	CM immutable public cellmates;


	constructor() {
		cellmates = CM(msg.sender);

		// sizes
		sizes.push(Size(14, 120));
		sizes.push(Size(16, 80));
		sizes.push(Size(18, 50));
		sizes.push(Size(20, 20));
		sizes.push(Size(22, 10));
		sizes.push(Size(24, 5));
		
		// colors
		colors.push(Color(0x179629, 0x15491f, 100, "Slimy Green"));
		colors.push(Color(0xc9a91c, 0x5f5120, 75, "Pacific Blue"));
		colors.push(Color(0x009fff, 0x144d79, 55, "Orange Peel"));
		colors.push(Color(0x3bb5cf, 0x235763, 35, "Old Gold"));
		colors.push(Color(0x908070, 0x463f38, 25, "Slate Gray"));
		colors.push(Color(0xac8fe6, 0x53466d, 15, "Charm Pink"));
		colors.push(Color(0x2b2ca6, 0x191d52, 10, "Metallic Red"));
		colors.push(Color(0xa95178, 0x522b3d, 5, "Royal Purple"));
	}

	function tokenURI(uint256 _tokenId) external view returns (string memory) {
		unchecked {
			( , uint256 _size, uint256 _colorIndex) = _getTokenInfo(_tokenId);
			string memory _json = string(abi.encodePacked('{"name":"CELL #', _uint2str(_tokenId), '","description":"An experimental hybrid of ERC-20 & ERC-721.","external_url":"https://cellmates.io/#/token/', _uint2str(_tokenId), '",'));
			_json = string(abi.encodePacked(_json, '"image":"', svgURI(_tokenId), '","attributes":['));
			_json = string(abi.encodePacked(_json, '{"trait_type":"Size","value":', _uint2str(_size - 2 * PADDING), '},'));
			_json = string(abi.encodePacked(_json, '{"trait_type":"Color","value":"', colors[_colorIndex].name, '"}'));
			_json = string(abi.encodePacked(_json, ']}'));
			return string(abi.encodePacked('data:application/json;base64,', _encode(bytes(_json))));
		}
	}

	function svgURI(uint256 _tokenId) public view returns (string memory) {
		return string(abi.encodePacked('data:image/svg+xml;base64,', _encode(bytes(getSVG(_tokenId)))));
	}
	
	function bmpURI(uint256 _tokenId) public view returns (string memory) {
		return string(abi.encodePacked('data:image/bmp;base64,', _encode(getBMP(_tokenId))));
	}

	function getSVG(uint256 _tokenId) public view returns (string memory) {
		return string(abi.encodePacked('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512" width="100%" height="100%"><defs><style type="text/css">svg{image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:pixelated;image-rendering:optimize-contrast;-ms-interpolation-mode:nearest-neighbor;background-color:', _col2str(BG_COLOR), ';background-image:url(', bmpURI(_tokenId), ');background-repeat:no-repeat;background-size:contain;background-position:50% 50%;}</style></defs></svg>'));
	}
	
	function getBMP(uint256 _tokenId) public view returns (bytes memory) {
		(bytes32 _seed, uint256 _size, uint256 _colorIndex) = _getTokenInfo(_tokenId);
		return _getBMP(_makePalette(colors[_colorIndex].primaryColor, colors[_colorIndex].outlineColor), _convertToColors(_addOutline(_expandAndReflect(_step(_step(_getInitialState(_seed, _size)))))), _size);
	}
	
	
	function _getTokenInfo(uint256 _tokenId) internal view returns (bytes32 seed, uint256 size, uint256 colorIndex) {
		unchecked {
			seed = keccak256(abi.encodePacked("Seed:", _tokenId, cellmates.salt()));
			size = _sampleSize(seed);
			colorIndex = _sampleColor(seed);
		}
	}

	function _sampleSize(bytes32 _seed) internal view returns (uint256 size) {
		unchecked {
			uint256 _total = 0;
			for (uint256 i = 0; i < sizes.length; i++) {
				_total += sizes[i].chance;
			}
			uint256 _target = uint256(keccak256(abi.encodePacked("Size:", _seed))) % _total;
			_total = 0;
			for (uint256 i = 0; i < sizes.length; i++) {
				_total += sizes[i].chance;
				if (_target < _total) {
					return sizes[i].size;
				}
			}
		}
	}

	function _sampleColor(bytes32 _seed) internal view returns (uint256 colorIndex) {
		unchecked {
			uint256 _total = 0;
			for (uint256 i = 0; i < colors.length; i++) {
				_total += colors[i].chance;
			}
			uint256 _target = uint256(keccak256(abi.encodePacked("Color:", _seed))) % _total;
			_total = 0;
			for (uint256 i = 0; i < colors.length; i++) {
				_total += colors[i].chance;
				if (_target < _total) {
					return i;
				}
			}
		}
	}

	function _getInitialState(bytes32 _seed, uint256 _size) internal pure returns (uint8[][] memory state) {
		unchecked {
			uint256 _rollingSeed = uint256(keccak256(abi.encodePacked("State:", _seed)));
			state = new uint8[][](_size - 2 * PADDING - 2);
			for (uint256 y = 0; y < state.length; y++) {
				state[y] = new uint8[](_size / 2 - PADDING - 1);
				for (uint256 x = 0; x < state[y].length; x++) {
					state[y][x] = uint8(_rollingSeed % 2);
					if (_rollingSeed < type(uint16).max) {
						_rollingSeed = uint256(keccak256(abi.encodePacked("Roll:", _seed, _rollingSeed)));
					} else {
						_rollingSeed /= 2;
					}
				}
			}
		}
	}

	function _getNeighborhood(uint8[][] memory _state) internal pure returns (uint8[][] memory neighborhood) {
		unchecked {
			neighborhood = new uint8[][](_state.length);
			for (uint256 y = 0; y < _state.length; y++) {
				neighborhood[y] = new uint8[](_state[y].length);
				for (uint256 x = 0; x < _state[y].length; x++) {
					uint8 _count = 0;
					if (y > 0) {
						_count += _state[y - 1][x];
					}
					if (y < _state.length - 1) {
						_count += _state[y + 1][x];
					}
					if (x > 0) {
						_count += _state[y][x - 1];
					}
					if (x < _state[y].length - 1) {
						_count += _state[y][x + 1];
					}
					neighborhood[y][x] = _count;
				}
			}
		}
	}

	function _step(uint8[][] memory _state) internal pure returns (uint8[][] memory newState) {
		unchecked {
			uint8[][] memory _neighborhood = _getNeighborhood(_state);
			newState = new uint8[][](_state.length);
			for (uint256 y = 0; y < _state.length; y++) {
				newState[y] = new uint8[](_state[y].length);
				for (uint256 x = 0; x < _state[y].length; x++) {
					newState[y][x] = ((_state[y][x] == 0 && _neighborhood[y][x] <= 1) || (_state[y][x] == 1 && (_neighborhood[y][x] == 2 || _neighborhood[y][x] == 3))) ? 1 : 0;
				}
			}
		}
	}

	function _expandAndReflect(uint8[][] memory _state) internal pure returns (uint8[][] memory newState) {
		unchecked {
			newState = new uint8[][](_state.length + 2 * PADDING + 2);
			for (uint256 y = 0; y < newState.length; y++) {
				newState[y] = new uint8[](_state.length + 2 * PADDING + 2);
				for (uint256 x = 0; x < newState[y].length; x++) {
					if (y > PADDING && y <= _state.length + PADDING && x > PADDING && x <= _state.length + PADDING) {
						newState[y][x] = _state[y - PADDING - 1][x > _state[y - PADDING - 1].length + PADDING ? _state.length + PADDING - x : x - PADDING - 1];
					} else {
						newState[y][x] = 0;
					}
				}
			}
		}
	}

	function _addOutline(uint8[][] memory _state) internal pure returns (uint8[][] memory newState) {
		unchecked {
			uint8[][] memory _neighborhood = _getNeighborhood(_state);
			newState = new uint8[][](_state.length);
			for (uint256 y = 0; y < _state.length; y++) {
				newState[y] = new uint8[](_state[y].length);
				for (uint256 x = 0; x < _state[y].length; x++) {
					newState[y][x] = _state[y][x] == 0 && _neighborhood[y][x] > 0 ? 2 : _state[y][x];
				}
			}
		}
	}

	function _convertToColors(uint8[][] memory _state) internal pure returns (bytes memory cols) {
		unchecked {
			uint256 _scanline = _state[0].length;
			if (_scanline % 4 != 0) {
				_scanline += 4 - (_scanline % 4);
			}
			cols = new bytes(_state.length * _scanline);
			for (uint256 y = 0; y < _state.length; y++) {
				for (uint256 x = 0; x < _state[y].length; x++) {
					cols[(_state.length - y - 1) * _scanline + x] = bytes1(_state[y][x]);
				}
			}
		}
	}
	
	function _makePalette(bytes3 _primaryColor, bytes3 _outlineColor) internal pure returns (bytes memory) {
		unchecked {
			return abi.encodePacked(BG_COLOR, bytes1(0), _primaryColor, bytes1(0), _outlineColor, bytes1(0));
		}
	}

	function _getBMP(bytes memory _palette, bytes memory _colors, uint256 _size) internal pure returns (bytes memory) {
		unchecked {
			uint32 _bufSize = 14 + 40 + uint32(_palette.length);
			bytes memory _buf = new bytes(_bufSize - _palette.length);
			_buf[0] = 0x42;
			_buf[1] = 0x4d;
			uint32 _tmp = _bufSize + uint32(_colors.length);
			uint32 b;
			for (uint i = 2; i < 6; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
			}
			_tmp = _bufSize;
			for (uint i = 10; i < 14; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
			}
			_buf[14] = 0x28;
			_tmp = uint32(_size);
			for (uint i = 18; i < 22; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
				_buf[i + 4] = bytes1(uint8(b));
			}
			_buf[26] = 0x01;
			_buf[28] = 0x08;
			_tmp = uint32(_colors.length);
			for (uint i = 34; i < 38; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
			}
			_tmp = uint32(_palette.length / 4);
			for (uint i = 46; i < 50; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
				_buf[i + 4] = bytes1(uint8(b));
			}
			return abi.encodePacked(_buf, _palette, _colors);
		}
	}

	function _uint2str(uint256 _value) internal pure returns (string memory) {
		unchecked {
			uint256 _digits = 1;
			uint256 _n = _value;
			while (_n > 9) {
				_n /= 10;
				_digits++;
			}
			bytes memory _out = new bytes(_digits);
			for (uint256 i = 0; i < _out.length; i++) {
				uint256 _dec = (_value / (10**(_out.length - i - 1))) % 10;
				_out[i] = bytes1(uint8(_dec) + 48);
			}
			return string(_out);
		}
	}

	function _col2str(bytes3 _col) internal pure returns (string memory str) {
		unchecked {
			str = "#";
			for (uint256 i = 0; i < 6; i++) {
				uint256 _hex = (uint24(_col) >> (4 * (i + 1 - 2 * (i % 2)))) % 16;
				bytes memory _char = new bytes(1);
				_char[0] = bytes1(uint8(_hex) + (_hex > 9 ? 87 : 48));
				str = string(abi.encodePacked(str, string(_char)));
			}
		}
	}

	function _encode(bytes memory _data) internal pure returns (string memory result) {
		unchecked {
			if (_data.length == 0) return '';
			string memory _table = TABLE;
			uint256 _encodedLen = 4 * ((_data.length + 2) / 3);
			result = new string(_encodedLen + 32);

			assembly {
				mstore(result, _encodedLen)
				let tablePtr := add(_table, 1)
				let dataPtr := _data
				let endPtr := add(dataPtr, mload(_data))
				let resultPtr := add(result, 32)

				for {} lt(dataPtr, endPtr) {}
				{
					dataPtr := add(dataPtr, 3)
					let input := mload(dataPtr)
					mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
					resultPtr := add(resultPtr, 1)
					mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
					resultPtr := add(resultPtr, 1)
					mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
					resultPtr := add(resultPtr, 1)
					mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
					resultPtr := add(resultPtr, 1)
				}
				switch mod(mload(_data), 3)
				case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
				case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
			}
			return result;
		}
	}
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","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":"_tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"bulkTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getToken","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"approved","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTokens","outputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"address[]","name":"approveds","type":"address[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"maskOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Metadata","name":"_metadata","type":"address"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","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":"_tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040525f341162000010575f80fd5b600280546001600160a01b03191673faded72464d6e76e37300b467673b36ecc4d2ccf179055604051620000449062000159565b604051809103905ff0801580156200005e573d5f803e3d5ffd5b50600380546001600160a01b0319166001600160a01b039290921691909117905560076020527f1142c8ae8ad77901cd97fce843895a9ccf91a8cbd5b191350a94c1d957b07f74805460ff1990811660019081179092557f2379132be4428a30bdcf8f40c0757cba23c7e3f4204cd933dabcc3d42093e8048054821683179055635b5e139f60e01b5f527f7108cf076693445f3e0461801864e91d74eb5e0eee196ef60b5961a16cd35b938054909116821790556200011e904362000167565b6040516429b0b63a1d60d91b60208201529040602582015260450160408051601f1981840301815291905280516020909101205f556200018d565b612cfd80620021aa83390190565b818103818111156200018757634e487b7160e01b5f52601160045260245ffd5b92915050565b61200f806200019b5f395ff3fe6080604052600436106101d0575f3560e01c80638188f71c116100fd578063bfa0b13311610092578063dd62ed3e11610062578063dd62ed3e14610537578063e4b50cb81461057f578063e985e9c5146105ad578063f3cb8385146105f8575f80fd5b8063bfa0b133146104cb578063c662e481146104de578063c87b56dd146104f9578063d28a476114610518575f80fd5b8063a22cb465116100cd578063a22cb46514610451578063a8aa1b3114610470578063a9059cbb1461048d578063b88d4fde146104ac575f80fd5b80638188f71c146103ec5780638da5cb5b1461040d57806395d89b411461042a578063a0712d681461043e575f80fd5b80632497ab151161017357806342842e0e1161014357806342842e0e1461037b5780636352211e1461039a57806370a08231146103b95780638129fc1c146103d8575f80fd5b80632497ab15146102ec578063313ce5671461030b57806332ba0a1e14610330578063392f37e91461035e575f80fd5b8063095ea7b3116101ae578063095ea7b31461026f57806313af40351461028e57806318160ddd146102af57806323b872dd146102cd575f80fd5b806301ffc9a7146101d457806306fdde0314610217578063081812fc14610238575b5f80fd5b3480156101df575f80fd5b506102026101ee36600461195c565b60076020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610222575f80fd5b5061022b610617565b60405161020e91906119cb565b348015610243575f80fd5b506102576102523660046119dd565b61068a565b6040516001600160a01b03909116815260200161020e565b34801561027a575f80fd5b50610202610289366004611a08565b6106cb565b348015610299575f80fd5b506102ad6102a8366004611a32565b610712565b005b3480156102ba575f80fd5b506101005b60405190815260200161020e565b3480156102d8575f80fd5b506102026102e7366004611a4d565b61074a565b3480156102f7575f80fd5b506102bf610306366004611a32565b610809565b348015610316575f80fd5b5061031e5f81565b60405160ff909116815260200161020e565b34801561033b575f80fd5b5061034f61034a366004611b4d565b610823565b60405161020e93929190611bca565b348015610369575f80fd5b506003546001600160a01b0316610257565b348015610386575f80fd5b506102ad610395366004611a4d565b6109a7565b3480156103a5575f80fd5b506102576103b43660046119dd565b6109c6565b3480156103c4575f80fd5b506102bf6103d3366004611a32565b610a61565b3480156103e3575f80fd5b506102ad610a73565b3480156103f7575f80fd5b50610400610e38565b60405161020e9190611c4f565b348015610418575f80fd5b506002546001600160a01b0316610257565b348015610435575f80fd5b5061022b610e9a565b6102ad61044c3660046119dd565b610ee1565b34801561045c575f80fd5b506102ad61046b366004611c61565b610fa1565b34801561047b575f80fd5b506001546001600160a01b0316610257565b348015610498575f80fd5b506102026104a7366004611a08565b611010565b3480156104b7575f80fd5b506102ad6104c6366004611cc3565b61101c565b3480156104d6575f80fd5b505f546102bf565b3480156104e9575f80fd5b506102bf67016345785d8a000081565b348015610504575f80fd5b5061022b6105133660046119dd565b6110c2565b348015610523575f80fd5b506102ad610532366004611d6b565b611130565b348015610542575f80fd5b506102bf610551366004611db8565b6001600160a01b039182165f9081526004602090815260408083209390941682526001909201909152205490565b34801561058a575f80fd5b5061059e6105993660046119dd565b61113a565b60405161020e93929190611de4565b3480156105b8575f80fd5b506102026105c7366004611db8565b6001600160a01b039182165f9081526004602090815260408083209390941682526002909201909152205460ff1690565b348015610603575f80fd5b506102ad610612366004611a32565b611166565b600354604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301925f9291908290030181865afa15801561065e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106859190810190611e18565b905090565b5f610100821180156106a857506106a46101006002611e95565b8211155b6106b0575f80fd5b505f908152600560205260409020546001600160a01b031690565b5f610100821180156106e957506106e56101006002611e95565b8211155b156106fd576106f8838361119e565b610708565b61070833848461122b565b5060015b92915050565b6002546001600160a01b03163314610728575f80fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f6101008211801561076857506107646101006002611e95565b8211155b1561077d57610778848484611294565b6107ff565b6001600160a01b0384165f908152600460209081526040808320338452600101909152902054828110156107af575f80fd5b5f1981146107f2576001600160a01b0385165f908152600460209081526040808320338452600101909152812080548592906107ec908490611eac565b90915550505b6107fd858585611381565b505b5060019392505050565b6001600160a01b03165f9081526004602052604090205490565b60608060605f845190508067ffffffffffffffff81111561084657610846611a8b565b60405190808252806020026020018201604052801561086f578160200160208202803683370190505b5093508067ffffffffffffffff81111561088b5761088b611a8b565b6040519080825280602002602001820160405280156108b4578160200160208202803683370190505b5092508067ffffffffffffffff8111156108d0576108d0611a8b565b60405190808252806020026020018201604052801561090357816020015b60608152602001906001900390816108ee5790505b5091505f5b8181101561099e5761093286828151811061092557610925611ebf565b602002602001015161113a565b87848151811061094457610944611ebf565b6020026020010187858151811061095d5761095d611ebf565b6020026020010187868151811061097657610976611ebf565b60209081029190910101929092526001600160a01b0392831690915291169052600101610908565b50509193909250565b6109c183838360405180602001604052805f81525061101c565b505050565b5f610100821180156109da57506102008211155b6109e2575f80fd5b60016101001983011b5f6109f4610e38565b90505f5b8151811015610a57578283610a25848481518110610a1857610a18611ebf565b6020026020010151610809565b1603610a4f57818181518110610a3d57610a3d611ebf565b60200260200101519350505050919050565b6001016109f8565b505f949350505050565b5f61070c610a6e83610809565b61146e565b5f610a866001546001600160a01b031690565b6001600160a01b031614610a98575f80fd5b5f3090505f737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b119190611ed3565b6001600160a01b0383165f8181526004602090815260408083205f199055600680546001810182559084527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b031916851790558051606081019091526021808252949550929391929190611fb99083013980519060200120610100604051610ba591815260200190565b60405180910390a35f5b610100811015610c0d57610bc581610100611eee565b610bd0906001611eee565b6040516001600160a01b038516905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610baf565b50610c2e82737a250d5630b4cf539739df2c5dacb4c659f2488d608061122b565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca29190611ed3565b6040516364e329cb60e11b81526001600160a01b0383811660048301528481166024830152919091169063c9c65396906044016020604051808303815f875af1158015610cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190611ed3565b600180546001600160a01b039283166001600160a01b0319909116179055737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d719908416318460805f80610d696002546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610dcf573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610df49190611f01565b505050610e178273ec513e5959dbb02f314fc2f30041fca2685119f3600a611381565b610e3482610e2d6002546001600160a01b031690565b600a611381565b5050565b60605f600601805480602002602001604051908101604052809291908181526020018280548015610e9057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610e72575b5050505050905090565b600354604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa15801561065e573d5f803e3d5ffd5b305f610eec82610a61565b905080831115610efa575f80fd5b5f610f0d67016345785d8a000085611e95565b905080341015610f1b575f80fd5b610f26833386611381565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015610f5d573d5f803e3d5ffd5b5080341115610f9b57336108fc610f748334611eac565b6040518115909202915f818181858888f19350505050158015610f99573d5f803e3d5ffd5b505b50505050565b335f8181526004602090815260408083206001600160a01b0387168085526002909101835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610708338484611381565b611027848484611294565b823b63ffffffff811615610f9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611067903390899088908890600401611f2c565b6020604051808303815f875af1158015611083573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a79190611f68565b6001600160e01b03191663150b7a0260e01b14610f99575f80fd5b60035460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd906024015f60405180830381865afa158015611109573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261070c9190810190611e18565b610e34828261152b565b5f806060611147846109c6565b6111508561068a565b611159866110c2565b9250925092509193909250565b6002546001600160a01b0316331461117c575f80fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f60016111ad61010084611eac565b6111b79190611eac565b6001901b905080806111c833610809565b16146111d2575f80fd5b5f8281526005602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6001600160a01b038084165f8181526004602090815260408083209487168084526001909501825291829020859055815160608101909252602180835290611f9890830139805190602001208360405161128791815260200190565b60405180910390a3505050565b610100811180156112a757506102008111155b6112af575f80fd5b60016101001982011b80806112c386610809565b16146112cd575f80fd5b336001600160a01b03851614806112fd57506112e88261068a565b6001600160a01b0316336001600160a01b0316145b8061132d57506001600160a01b0384165f90815260046020908152604080832033845260020190915290205460ff165b611335575f80fd5b6040805160018082528183019092525f916020808301908036833701905050905082815f8151811061136957611369611ebf565b602002602001018181525050610f99858584846115a1565b5f80808061138e87610809565b90505f8567ffffffffffffffff8111156113aa576113aa611a8b565b6040519080825280602002602001820160405280156113d3578160200160208202803683370190505b5090505b5f821180156113e557508583105b156114385781600116600103611428578051600180861b9690961795840193610101860191839190811061141b5761141b611ebf565b6020026020010181815250505b6001938401939190911c906113d7565b858314611443575f80fd5b848561144e8a610809565b1614611458575f80fd5b611464888887846115a1565b5050505050505050565b5f8160018101611482575061010092915050565b7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c92915050565b5f805b825181101561156f57600161010084838151811061154e5761154e611ebf565b602002602001015103036001901b5f1b82179150808060010191505061152e565b50815161157b8261146e565b14611584575f80fd5b808161158f33610809565b1614611599575f80fd5b6109c1338483855b5f8151116115ad575f80fd5b5f5b81518110156116ee575f6001600160a01b03166115e48383815181106115d7576115d7611ebf565b602002602001015161068a565b6001600160a01b03161461168c575f806005015f84848151811061160a5761160a611ebf565b602002602001015181526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555081818151811061165457611654611ebf565b60209081029190910101516040515f9081907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908290a45b81818151811061169e5761169e611ebf565b6020026020010151846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001016115af565b506001600160a01b0384165f90815260046020526040812080548418905561171585610809565b1590505f61172285610809565b6001600160a01b0386165f9081526004602052604090208054861790551590508115611882575f80611752610e38565b90505f5b81518110156117a157886001600160a01b031682828151811061177b5761177b611ebf565b60200260200101516001600160a01b031603611799578092506117a1565b600101611756565b5082156117ee57865f60060183815481106117be576117be611ebf565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555061187b565b8060018251038151811061180457611804611ebf565b60200260200101515f600601838154811061182157611821611ebf565b5f91825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600680548061185a5761185a611f83565b5f8281526020902081015f1990810180546001600160a01b03191690550190555b50506118d3565b80156118d357600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0387161790555b6118dc85610809565b6118e587610809565b16156118ef575f80fd5b846001600160a01b0316866001600160a01b0316604051806060016040528060218152602001611fb96021913980519060200120855160405161193491815260200190565b60405180910390a3505050505050565b6001600160e01b031981168114611959575f80fd5b50565b5f6020828403121561196c575f80fd5b813561197781611944565b9392505050565b5f5b83811015611998578181015183820152602001611980565b50505f910152565b5f81518084526119b781602086016020860161197e565b601f01601f19169290920160200192915050565b602081525f61197760208301846119a0565b5f602082840312156119ed575f80fd5b5035919050565b6001600160a01b0381168114611959575f80fd5b5f8060408385031215611a19575f80fd5b8235611a24816119f4565b946020939093013593505050565b5f60208284031215611a42575f80fd5b8135611977816119f4565b5f805f60608486031215611a5f575f80fd5b8335611a6a816119f4565b92506020840135611a7a816119f4565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ac857611ac8611a8b565b604052919050565b5f82601f830112611adf575f80fd5b8135602067ffffffffffffffff821115611afb57611afb611a8b565b8160051b611b0a828201611a9f565b9283528481018201928281019087851115611b23575f80fd5b83870192505b84831015611b4257823582529183019190830190611b29565b979650505050505050565b5f60208284031215611b5d575f80fd5b813567ffffffffffffffff811115611b73575f80fd5b611b7f84828501611ad0565b949350505050565b5f815180845260208085019450602084015f5b83811015611bbf5781516001600160a01b031687529582019590820190600101611b9a565b509495945050505050565b606081525f611bdc6060830186611b87565b602083820381850152611bef8287611b87565b915083820360408501528185518084528284019150828160051b8501018388015f5b83811015611c3f57601f19878403018552611c2d8383516119a0565b94860194925090850190600101611c11565b50909a9950505050505050505050565b602081525f6119776020830184611b87565b5f8060408385031215611c72575f80fd5b8235611c7d816119f4565b915060208301358015158114611c91575f80fd5b809150509250929050565b5f67ffffffffffffffff821115611cb557611cb5611a8b565b50601f01601f191660200190565b5f805f8060808587031215611cd6575f80fd5b8435611ce1816119f4565b93506020850135611cf1816119f4565b925060408501359150606085013567ffffffffffffffff811115611d13575f80fd5b8501601f81018713611d23575f80fd5b8035611d36611d3182611c9c565b611a9f565b818152886020838501011115611d4a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215611d7c575f80fd5b8235611d87816119f4565b9150602083013567ffffffffffffffff811115611da2575f80fd5b611dae85828601611ad0565b9150509250929050565b5f8060408385031215611dc9575f80fd5b8235611dd4816119f4565b91506020830135611c91816119f4565b6001600160a01b038481168252831660208201526060604082018190525f90611e0f908301846119a0565b95945050505050565b5f60208284031215611e28575f80fd5b815167ffffffffffffffff811115611e3e575f80fd5b8201601f81018413611e4e575f80fd5b8051611e5c611d3182611c9c565b818152856020838501011115611e70575f80fd5b611e0f82602083016020860161197e565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761070c5761070c611e81565b8181038181111561070c5761070c611e81565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611ee3575f80fd5b8151611977816119f4565b8082018082111561070c5761070c611e81565b5f805f60608486031215611f13575f80fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611f5e908301846119a0565b9695505050505050565b5f60208284031215611f78575f80fd5b815161197781611944565b634e487b7160e01b5f52603160045260245ffdfe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a2646970667358221220f4b836ae68fc88d6c843ec14fd1046bbaf04ffa4e944e597dc5263124291361d64736f6c6343000818003360e0604052600960a09081526843656c6c4d6174657360b81b60c0525f9062000029908262000950565b5060408051808201909152600481526310d1531360e21b602082015260019062000054908262000950565b5034801562000061575f80fd5b50336080908152604080518082018252600e81526078602080830191825260028054600181810183555f8381529551945160ff908116600160f81b9081026001600160f81b03978816177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948501558851808a018a5260108152605081880190815286548086018855878b52915190518416830290891617908501558851808a018a5260128152603281880190815286548086018855878b52915190518416830290891617908501558851808a018a52601480825281880190815286548086018855878b52915190518416830290891617908501558851808a018a5260168152600a81880190815286548086018855878b52915190518416830290891617908501558851808a018a5260188152600581880190815286548086018855878b5291519051841690920291909716179590920194909455855196870186526217962960e81b87526215491f60e81b87840190815260648888019081528751808901909852600b88526a29b634b6bc9023b932b2b760a91b94880194909452606088019687526003805495860181559095528651939091025f8051602062002cdd833981519152810180549551935190921666010000000000000260ff60301b1960e894851c63010000000265ffffffffffff199097169590941c94909417949094179190911691909117815591515f8051602062002cbd833981519152909101906200028c908262000950565b50506040805160808101825262326a4760ea1b81526202fa8960ed1b6020808301918252604b8385019081528451808601909552600c85526b5061636966696320426c756560a01b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd83398151915201906200036d908262000950565b505060408051608081018252619fff60e81b815262144d7960e81b602080830191825260378385019081528451808601909552600b85526a13dc985b99d9481419595b60aa1b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd83398151915201906200044c908262000950565b505060408051608081018252623bb5cf60e81b81526223576360e81b602080830191825260238385019081528451808601909552600885526713db190811dbdb1960c21b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd833981519152019062000529908262000950565b5050604080516080810182526209080760ec1b81526208c7e760eb1b602080830191825260198385019081528451808601909552600a855269536c617465204772617960b01b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd833981519152019062000608908262000950565b505060408051608081018252625647f360e91b81526253466d60e81b6020808301918252600f8385019081528451808601909552600a855269436861726d2050696e6b60b01b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd8339815191520190620006e7908262000950565b5050604080516080810182526215965360e91b8152620c8ea960e91b6020808301918252600a8385019081528451808601909552600c85526b13595d185b1b1a58c814995960a21b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd8339815191520190620007c8908262000950565b50506040805160808101825262152a2f60eb1b815262522b3d60e81b602080830191825260058385019081528451808601909552600c85526b526f79616c20507572706c6560a01b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd8339815191520190620008a9908262000950565b50505062000a1c565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620008db57607f821691505b602082108103620008fa57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200094b57805f5260205f20601f840160051c81016020851015620009275750805b601f840160051c820191505b8181101562000948575f815560010162000933565b50505b505050565b81516001600160401b038111156200096c576200096c620008b2565b62000984816200097d8454620008c6565b8462000900565b602080601f831160018114620009ba575f8415620009a25750858301515b5f19600386901b1c1916600185901b17855562000a14565b5f85815260208120601f198616915b82811015620009ea57888601518255948401946001909101908401620009c9565b508582101562000a0857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60805161228262000a3b5f395f818160be01526105f801526122825ff3fe608060405234801561000f575f80fd5b5060043610610084575f3560e01c806395d89b411161005857806395d89b411461010b578063be985ac914610113578063c87b56dd14610126578063ca54cc3f14610139575f80fd5b8062b958f31461008857806306fdde03146100b15780633dd860b3146100b957806348b62fe4146100f8575b5f80fd5b61009b610096366004611a26565b61014c565b6040516100a89190611a8a565b60405180910390f35b61009b610185565b6100e07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100a8565b61009b610106366004611a26565b610210565b61009b610316565b61009b610121366004611a26565b610323565b61009b610134366004611a26565b61034e565b61009b610147366004611a26565b61048b565b606061015f61015a83610210565b6104a9565b60405160200161016f9190611abe565b6040516020818303038152906040529050919050565b5f805461019190611afb565b80601f01602080910402602001604051908101604052809291908181526020018280546101bd90611afb565b80156102085780601f106101df57610100808354040283529160200191610208565b820191905f5260205f20905b8154815290600101906020018083116101eb57829003601f168201915b505050505081565b60605f805f61021e856105f2565b92509250925061030d6102da6003838154811061023d5761023d611b2d565b5f9182526020909120600290910201546003805460e89290921b918590811061026857610268611b2d565b5f9182526020909120600290910201546301000000900460e81b604051623474f760ea1b60208201525f602382018190526001600160e81b031980851660248401526027830182905283166028830152602b820152606090602c01604051602081830303815290604052905092915050565b6103076103026102fd6102f86102f36102f38a8a6106cb565b610899565b610b39565b610d65565b610f6f565b8461109e565b95945050505050565b6001805461019190611afb565b6060610334623474f760ea1b61140e565b61033d8361014c565b60405160200161016f929190611b41565b60605f8061035b846105f2565b92509250505f61036a856114d7565b610373866114d7565b604051602001610384929190611e12565b60405160208183030381529060405290508061039f8661048b565b6040516020016103b0929190611ef4565b60408051601f198184030181529190529050806103d060031985016114d7565b6040516020016103e1929190611f54565b6040516020818303038152906040529050806003838154811061040657610406611b2d565b905f5260205f209060020201600101604051602001610426929190611fba565b60405160208183030381529060405290508060405160200161044891906120b0565b6040516020818303038152906040529050610462816104a9565b60405160200161047291906120d5565b6040516020818303038152906040529350505050919050565b606061049961015a83610323565b60405160200161016f9190612119565b606081515f036104c657505060408051602081019091525f815290565b5f60405180606001604052806040815260200161220d6040913990505f60038451600201816104f7576104f761215d565b046004029050806020016001600160401b0381111561051857610518612171565b6040519080825280601f01601f191660200182016040528015610542576020820181803683370190505b509250808352600182018485518101602086015b818310156105b05760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401610556565b6003885106600181146105ca57600281146105db576105e6565b613d3d60f01b6001198301526105e6565b603d60f81b5f198301525b50505050505050919050565b5f805f837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bfa0b1336040518163ffffffff1660e01b8152600401602060405180830381865afa158015610652573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106769190612185565b6040516429b2b2b21d60d91b6020820152602581019290925260458201526065016040516020818303038152906040528051906020012092506106b8836115b4565b91506106c3836116c3565b929491935050565b6040516529ba30ba329d60d11b6020820152602681018390526060905f9060460160408051601f198184030181529190528051602090910120905060051983016001600160401b0381111561072257610722612171565b60405190808252806020026020018201604052801561075557816020015b60608152602001906001900390816107405790505b5091505f5b82518110156108915760021960028504016001600160401b0381111561078257610782612171565b6040519080825280602002602001820160405280156107ab578160200160208202803683370190505b508382815181106107be576107be611b2d565b60200260200101819052505f5b8382815181106107dd576107dd611b2d565b602002602001015151811015610888576002830684838151811061080357610803611b2d565b6020026020010151828151811061081c5761081c611b2d565b60ff9092166020928302919091019091015261ffff83101561087957604051642937b6361d60d91b60208201526025810187905260458101849052606501604051602081830303815290604052805190602001205f1c9250610880565b6002830492505b6001016107cb565b5060010161075a565b505092915050565b60605f6108a5836117b3565b905082516001600160401b038111156108c0576108c0612171565b6040519080825280602002602001820160405280156108f357816020015b60608152602001906001900390816108de5790505b5091505f5b8351811015610b325783818151811061091357610913611b2d565b6020026020010151516001600160401b0381111561093357610933612171565b60405190808252806020026020018201604052801561095c578160200160208202803683370190505b5083828151811061096f5761096f611b2d565b60200260200101819052505f5b84828151811061098e5761098e611b2d565b602002602001015151811015610b29578482815181106109b0576109b0611b2d565b602002602001015181815181106109c9576109c9611b2d565b602002602001015160ff165f148015610a18575060018383815181106109f1576109f1611b2d565b60200260200101518281518110610a0a57610a0a611b2d565b602002602001015160ff1611155b80610ad75750848281518110610a3057610a30611b2d565b60200260200101518181518110610a4957610a49611b2d565b602002602001015160ff166001148015610ad75750828281518110610a7057610a70611b2d565b60200260200101518181518110610a8957610a89611b2d565b602002602001015160ff1660021480610ad75750828281518110610aaf57610aaf611b2d565b60200260200101518181518110610ac857610ac8611b2d565b602002602001015160ff166003145b610ae1575f610ae4565b60015b848381518110610af657610af6611b2d565b60200260200101518281518110610b0f57610b0f611b2d565b60ff9092166020928302919091019091015260010161097c565b506001016108f8565b5050919050565b80516060906006016001600160401b03811115610b5857610b58612171565b604051908082528060200260200182016040528015610b8b57816020015b6060815260200190600190039081610b765790505b5090505f5b8151811015610d5f5782516006016001600160401b03811115610bb557610bb5612171565b604051908082528060200260200182016040528015610bde578160200160208202803683370190505b50828281518110610bf157610bf1611b2d565b60200260200101819052505f5b828281518110610c1057610c10611b2d565b602002602001015151811015610d5657600282118015610c34575060028451018211155b8015610c405750600281115b8015610c50575060028451018111155b15610d0d57836001600284030381518110610c6d57610c6d611b2d565b60200260200101516002856001600286030381518110610c8f57610c8f611b2d565b602002602001015151018211610ca9576002198201610cb1565b816002865101035b81518110610cc157610cc1611b2d565b6020026020010151838381518110610cdb57610cdb611b2d565b60200260200101518281518110610cf457610cf4611b2d565b602002602001019060ff16908160ff1681525050610d4e565b5f838381518110610d2057610d20611b2d565b60200260200101518281518110610d3957610d39611b2d565b602002602001019060ff16908160ff16815250505b600101610bfe565b50600101610b90565b50919050565b60605f610d71836117b3565b905082516001600160401b03811115610d8c57610d8c612171565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b5091505f5b8351811015610b3257838181518110610ddf57610ddf611b2d565b6020026020010151516001600160401b03811115610dff57610dff612171565b604051908082528060200260200182016040528015610e28578160200160208202803683370190505b50838281518110610e3b57610e3b611b2d565b60200260200101819052505f5b848281518110610e5a57610e5a611b2d565b602002602001015151811015610f6657848281518110610e7c57610e7c611b2d565b60200260200101518181518110610e9557610e95611b2d565b602002602001015160ff165f148015610ee257505f838381518110610ebc57610ebc611b2d565b60200260200101518281518110610ed557610ed5611b2d565b602002602001015160ff16115b610f1e57848281518110610ef857610ef8611b2d565b60200260200101518181518110610f1157610f11611b2d565b6020026020010151610f21565b60025b848381518110610f3357610f33611b2d565b60200260200101518281518110610f4c57610f4c611b2d565b60ff90921660209283029190910190910152600101610e48565b50600101610dc4565b60605f825f81518110610f8457610f84611b2d565b602002602001015151905060048181610f9f57610f9f61215d565b0615610fae5760048106600403015b808351026001600160401b03811115610fc957610fc9612171565b6040519080825280601f01601f191660200182016040528015610ff3576020820181803683370190505b5091505f5b8351811015610b32575f5b84828151811061101557611015611b2d565b6020026020010151518110156110955784828151811061103757611037611b2d565b6020026020010151818151811061105057611050611b2d565b602002602001015160f81b8482856001868a51030302018151811061107757611077611b2d565b60200101906001600160f81b03191690815f1a905350600101611003565b50600101610ff8565b825160609060368101905f9063ffffffff8316036001600160401b038111156110c9576110c9612171565b6040519080825280601f01601f1916602001820160405280156110f3576020820181803683370190505b509050604260f81b815f8151811061110d5761110d611b2d565b60200101906001600160f81b03191690815f1a905350604d60f81b8160018151811061113b5761113b611b2d565b60200101906001600160f81b03191690815f1a905350845182015f60025b60068110156111a25760ff831691508260081c92508160f81b84828151811061118457611184611b2d565b60200101906001600160f81b03191690815f1a905350600101611159565b50839150600a5b600e8110156111f25760ff831691508260081c92508160f81b8482815181106111d4576111d4611b2d565b60200101906001600160f81b03191690815f1a9053506001016111a9565b50602860f81b83600e8151811061120b5761120b611b2d565b60200101906001600160f81b03191690815f1a90535085915060125b601681101561129f5760ff831691508260081c92508160f81b84828151811061125257611252611b2d565b60200101906001600160f81b03191690815f1a9053508160f81b84826004018151811061128157611281611b2d565b60200101906001600160f81b03191690815f1a905350600101611227565b50600160f81b83601a815181106112b8576112b8611b2d565b60200101906001600160f81b03191690815f1a905350600860f81b83601c815181106112e6576112e6611b2d565b60200101906001600160f81b03191690815f1a9053508651915060225b602681101561134c5760ff831691508260081c92508160f81b84828151811061132e5761132e611b2d565b60200101906001600160f81b03191690815f1a905350600101611303565b50600488518161135e5761135e61215d565b049150602e5b60328110156113dc5760ff831691508260081c92508160f81b84828151811061138f5761138f611b2d565b60200101906001600160f81b03191690815f1a9053508160f81b8482600401815181106113be576113be611b2d565b60200101906001600160f81b03191690815f1a905350600101611364565b508288886040516020016113f29392919061219c565b6040516020818303038152906040529450505050509392505050565b6040805180820190915260018152602360f81b60208201525f5b6006811015610d5f57604080516001808252818301909252600f60e886901c600285851602850384016004021c16915f91906020820181803683370190505090506009821161147857603061147b565b60575b820160f81b815f8151811061149257611492611b2d565b60200101906001600160f81b03191690815f1a90535083816040516020016114bb9291906121de565b60408051808303601f1901815291905293505050600101611428565b60606001825b60098111156114f65760019190910190600a90046114dd565b5f826001600160401b0381111561150f5761150f612171565b6040519080825280601f01601f191660200182016040528015611539576020820181803683370190505b5090505f5b81518110156115ab575f600a60018385510303600a0a88816115625761156261215d565b04816115705761157061215d565b0690508060300160f81b83838151811061158c5761158c611b2d565b60200101906001600160f81b03191690815f1a9053505060010161153e565b50949350505050565b5f80805b6002548110156115f757600281815481106115d5576115d5611b2d565b5f91825260209091200154600160f81b900460ff1691909101906001016115b8565b506040516429b4bd329d60d91b6020820152602581018490525f908290604501604051602081830303815290604052805190602001205f1c8161163c5761163c61215d565b0690505f91505f5b6002548110156116bb576002818154811061166157611661611b2d565b5f91825260209091200154600160f81b900460ff169290920191828210156116b3576002818154811061169657611696611b2d565b5f918252602090912001546001600160f81b031695945050505050565b600101611644565b505050919050565b5f80805b60035481101561170e57600381815481106116e4576116e4611b2d565b5f9182526020909120600290910201546601000000000000900460ff1691909101906001016116c7565b506040516521b7b637b91d60d11b6020820152602681018490525f908290604601604051602081830303815290604052805190602001205f1c816117545761175461215d565b0690505f91505f5b6003548110156116bb576003818154811061177957611779611b2d565b5f9182526020909120600290910201546601000000000000900460ff169290920191828210156117ab57949350505050565b60010161175c565b606081516001600160401b038111156117ce576117ce612171565b60405190808252806020026020018201604052801561180157816020015b60608152602001906001900390816117ec5790505b5090505f5b8251811015610d5f5782818151811061182157611821611b2d565b6020026020010151516001600160401b0381111561184157611841612171565b60405190808252806020026020018201604052801561186a578160200160208202803683370190505b5082828151811061187d5761187d611b2d565b60200260200101819052505f5b83828151811061189c5761189c611b2d565b602002602001015151811015611a1d575f82156118ee578460018403815181106118c8576118c8611b2d565b602002602001015182815181106118e1576118e1611b2d565b6020026020010151810190505b60018551038310156119355784836001018151811061190f5761190f611b2d565b6020026020010151828151811061192857611928611b2d565b6020026020010151810190505b81156119765784838151811061194d5761194d611b2d565b6020026020010151600183038151811061196957611969611b2d565b6020026020010151810190505b600185848151811061198a5761198a611b2d565b602002602001015151038210156119d6578483815181106119ad576119ad611b2d565b602002602001015182600101815181106119c9576119c9611b2d565b6020026020010151810190505b808484815181106119e9576119e9611b2d565b60200260200101518381518110611a0257611a02611b2d565b60ff909216602092830291909101909101525060010161188a565b50600101611806565b5f60208284031215611a36575f80fd5b5035919050565b5f5b83811015611a57578181015183820152602001611a3f565b50505f910152565b5f8151808452611a76816020860160208601611a3d565b601f01601f19169290920160200192915050565b602081525f611a9c6020830184611a5f565b9392505050565b5f8151611ab4818560208601611a3d565b9290920192915050565b7519185d184e9a5b5859d94bd89b5c0ed8985cd94d8d0b60521b81525f8251611aee816016850160208701611a3d565b9190910160160192915050565b600181811c90821680611b0f57607f821691505b602082108103610d5f57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222076657273696f6e3d22312e3122207072657365727665417360208201527f70656374526174696f3d22784d6964594d6964206d656574222076696577426f60408201527f783d223020302035313220353132222077696474683d2231303025222068656960608201527f6768743d2231303025223e3c646566733e3c7374796c6520747970653d22746560808201527f78742f637373223e7376677b696d6167652d72656e646572696e673a6f70746960a08201527f6d697a6553706565643b696d6167652d72656e646572696e673a2d6d6f7a2d6360c08201527f726973702d65646765733b696d6167652d72656e646572696e673a2d6f2d637260e08201527f6973702d65646765733b696d6167652d72656e646572696e673a2d7765626b696101008201527f742d6f7074696d697a652d636f6e74726173743b696d6167652d72656e6465726101208201527f696e673a706978656c617465643b696d6167652d72656e646572696e673a6f706101408201527f74696d697a652d636f6e74726173743b2d6d732d696e746572706f6c6174696f6101608201527f6e2d6d6f64653a6e6561726573742d6e65696768626f723b6261636b67726f7561018082015268373216b1b7b637b91d60b91b6101a08201525f611e0a611d84611d7e611d5c6101a9860188611aa3565b75076c4c2c6d6cee4deeadcc85ad2dac2ceca74eae4d8560531b815260160190565b85611aa3565b7f293b6261636b67726f756e642d7265706561743a6e6f2d7265706561743b626181527f636b67726f756e642d73697a653a636f6e7461696e3b6261636b67726f756e6460208201527f2d706f736974696f6e3a353025203530253b7d3c2f7374796c653e3c2f646566604082015267399f1e17b9bb339f60c11b606082015260680190565b949350505050565b6e7b226e616d65223a2243454c4c202360881b815282515f90611e3c81600f850160208801611a3d565b7f222c226465736372697074696f6e223a22416e206578706572696d656e74616c600f918401918201527f20687962726964206f66204552432d32302026204552432d3732312e222c2265602f8201527f787465726e616c5f75726c223a2268747470733a2f2f63656c6c6d617465732e604f8201526a696f2f232f746f6b656e2f60a81b606f8201528351611ed981607a840160208801611a3d565b61088b60f21b607a9290910191820152607c01949350505050565b5f8351611f05818460208801611a3d565b681134b6b0b3b2911d1160b91b9083019081528351611f2b816009840160208801611a3d565b6f222c2261747472696275746573223a5b60801b60099290910191820152601901949350505050565b5f8351611f65818460208801611a3d565b7f7b2274726169745f74797065223a2253697a65222c2276616c7565223a0000009083019081528351611f9f81601d840160208801611a3d565b611f4b60f21b601d9290910191820152601f01949350505050565b5f83516020611fcd828560208901611a3d565b7f7b2274726169745f74797065223a22436f6c6f72222c2276616c7565223a22009184019182528454601f905f90600181811c908083168061201057607f831692505b60208310810361202e57634e487b7160e01b5f52602260045260245ffd5b808015612042576001811461205d5761208d565b60ff198516601f8a0152601f84151585028a0101955061208d565b5f8c8152602090205f5b858110156120825781548b82018a0152908401908901612067565b5050601f848a010195505b50505050506120a48161227d60f01b815260020190565b98975050505050505050565b5f82516120c1818460208701611a3d565b615d7d60f01b920191825250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161210c81601d850160208701611a3d565b91909101601d0192915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525f825161215081601a850160208701611a3d565b91909101601a0192915050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612195575f80fd5b5051919050565b5f84516121ad818460208901611a3d565b8451908301906121c1818360208901611a3d565b84519101906121d4818360208801611a3d565b0195945050505050565b5f83516121ef818460208801611a3d565b835190830190612203818360208801611a3d565b0194935050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122026ff2cc1347cca993fc184052b2f8387d820d65e13c63a98168aa60b662b448264736f6c63430008180033c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85cc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b

Deployed Bytecode

0x6080604052600436106101d0575f3560e01c80638188f71c116100fd578063bfa0b13311610092578063dd62ed3e11610062578063dd62ed3e14610537578063e4b50cb81461057f578063e985e9c5146105ad578063f3cb8385146105f8575f80fd5b8063bfa0b133146104cb578063c662e481146104de578063c87b56dd146104f9578063d28a476114610518575f80fd5b8063a22cb465116100cd578063a22cb46514610451578063a8aa1b3114610470578063a9059cbb1461048d578063b88d4fde146104ac575f80fd5b80638188f71c146103ec5780638da5cb5b1461040d57806395d89b411461042a578063a0712d681461043e575f80fd5b80632497ab151161017357806342842e0e1161014357806342842e0e1461037b5780636352211e1461039a57806370a08231146103b95780638129fc1c146103d8575f80fd5b80632497ab15146102ec578063313ce5671461030b57806332ba0a1e14610330578063392f37e91461035e575f80fd5b8063095ea7b3116101ae578063095ea7b31461026f57806313af40351461028e57806318160ddd146102af57806323b872dd146102cd575f80fd5b806301ffc9a7146101d457806306fdde0314610217578063081812fc14610238575b5f80fd5b3480156101df575f80fd5b506102026101ee36600461195c565b60076020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610222575f80fd5b5061022b610617565b60405161020e91906119cb565b348015610243575f80fd5b506102576102523660046119dd565b61068a565b6040516001600160a01b03909116815260200161020e565b34801561027a575f80fd5b50610202610289366004611a08565b6106cb565b348015610299575f80fd5b506102ad6102a8366004611a32565b610712565b005b3480156102ba575f80fd5b506101005b60405190815260200161020e565b3480156102d8575f80fd5b506102026102e7366004611a4d565b61074a565b3480156102f7575f80fd5b506102bf610306366004611a32565b610809565b348015610316575f80fd5b5061031e5f81565b60405160ff909116815260200161020e565b34801561033b575f80fd5b5061034f61034a366004611b4d565b610823565b60405161020e93929190611bca565b348015610369575f80fd5b506003546001600160a01b0316610257565b348015610386575f80fd5b506102ad610395366004611a4d565b6109a7565b3480156103a5575f80fd5b506102576103b43660046119dd565b6109c6565b3480156103c4575f80fd5b506102bf6103d3366004611a32565b610a61565b3480156103e3575f80fd5b506102ad610a73565b3480156103f7575f80fd5b50610400610e38565b60405161020e9190611c4f565b348015610418575f80fd5b506002546001600160a01b0316610257565b348015610435575f80fd5b5061022b610e9a565b6102ad61044c3660046119dd565b610ee1565b34801561045c575f80fd5b506102ad61046b366004611c61565b610fa1565b34801561047b575f80fd5b506001546001600160a01b0316610257565b348015610498575f80fd5b506102026104a7366004611a08565b611010565b3480156104b7575f80fd5b506102ad6104c6366004611cc3565b61101c565b3480156104d6575f80fd5b505f546102bf565b3480156104e9575f80fd5b506102bf67016345785d8a000081565b348015610504575f80fd5b5061022b6105133660046119dd565b6110c2565b348015610523575f80fd5b506102ad610532366004611d6b565b611130565b348015610542575f80fd5b506102bf610551366004611db8565b6001600160a01b039182165f9081526004602090815260408083209390941682526001909201909152205490565b34801561058a575f80fd5b5061059e6105993660046119dd565b61113a565b60405161020e93929190611de4565b3480156105b8575f80fd5b506102026105c7366004611db8565b6001600160a01b039182165f9081526004602090815260408083209390941682526002909201909152205460ff1690565b348015610603575f80fd5b506102ad610612366004611a32565b611166565b600354604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301925f9291908290030181865afa15801561065e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106859190810190611e18565b905090565b5f610100821180156106a857506106a46101006002611e95565b8211155b6106b0575f80fd5b505f908152600560205260409020546001600160a01b031690565b5f610100821180156106e957506106e56101006002611e95565b8211155b156106fd576106f8838361119e565b610708565b61070833848461122b565b5060015b92915050565b6002546001600160a01b03163314610728575f80fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f6101008211801561076857506107646101006002611e95565b8211155b1561077d57610778848484611294565b6107ff565b6001600160a01b0384165f908152600460209081526040808320338452600101909152902054828110156107af575f80fd5b5f1981146107f2576001600160a01b0385165f908152600460209081526040808320338452600101909152812080548592906107ec908490611eac565b90915550505b6107fd858585611381565b505b5060019392505050565b6001600160a01b03165f9081526004602052604090205490565b60608060605f845190508067ffffffffffffffff81111561084657610846611a8b565b60405190808252806020026020018201604052801561086f578160200160208202803683370190505b5093508067ffffffffffffffff81111561088b5761088b611a8b565b6040519080825280602002602001820160405280156108b4578160200160208202803683370190505b5092508067ffffffffffffffff8111156108d0576108d0611a8b565b60405190808252806020026020018201604052801561090357816020015b60608152602001906001900390816108ee5790505b5091505f5b8181101561099e5761093286828151811061092557610925611ebf565b602002602001015161113a565b87848151811061094457610944611ebf565b6020026020010187858151811061095d5761095d611ebf565b6020026020010187868151811061097657610976611ebf565b60209081029190910101929092526001600160a01b0392831690915291169052600101610908565b50509193909250565b6109c183838360405180602001604052805f81525061101c565b505050565b5f610100821180156109da57506102008211155b6109e2575f80fd5b60016101001983011b5f6109f4610e38565b90505f5b8151811015610a57578283610a25848481518110610a1857610a18611ebf565b6020026020010151610809565b1603610a4f57818181518110610a3d57610a3d611ebf565b60200260200101519350505050919050565b6001016109f8565b505f949350505050565b5f61070c610a6e83610809565b61146e565b5f610a866001546001600160a01b031690565b6001600160a01b031614610a98575f80fd5b5f3090505f737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b119190611ed3565b6001600160a01b0383165f8181526004602090815260408083205f199055600680546001810182559084527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b031916851790558051606081019091526021808252949550929391929190611fb99083013980519060200120610100604051610ba591815260200190565b60405180910390a35f5b610100811015610c0d57610bc581610100611eee565b610bd0906001611eee565b6040516001600160a01b038516905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610baf565b50610c2e82737a250d5630b4cf539739df2c5dacb4c659f2488d608061122b565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca29190611ed3565b6040516364e329cb60e11b81526001600160a01b0383811660048301528481166024830152919091169063c9c65396906044016020604051808303815f875af1158015610cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190611ed3565b600180546001600160a01b039283166001600160a01b0319909116179055737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d719908416318460805f80610d696002546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610dcf573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610df49190611f01565b505050610e178273ec513e5959dbb02f314fc2f30041fca2685119f3600a611381565b610e3482610e2d6002546001600160a01b031690565b600a611381565b5050565b60605f600601805480602002602001604051908101604052809291908181526020018280548015610e9057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610e72575b5050505050905090565b600354604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa15801561065e573d5f803e3d5ffd5b305f610eec82610a61565b905080831115610efa575f80fd5b5f610f0d67016345785d8a000085611e95565b905080341015610f1b575f80fd5b610f26833386611381565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015610f5d573d5f803e3d5ffd5b5080341115610f9b57336108fc610f748334611eac565b6040518115909202915f818181858888f19350505050158015610f99573d5f803e3d5ffd5b505b50505050565b335f8181526004602090815260408083206001600160a01b0387168085526002909101835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610708338484611381565b611027848484611294565b823b63ffffffff811615610f9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611067903390899088908890600401611f2c565b6020604051808303815f875af1158015611083573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a79190611f68565b6001600160e01b03191663150b7a0260e01b14610f99575f80fd5b60035460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd906024015f60405180830381865afa158015611109573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261070c9190810190611e18565b610e34828261152b565b5f806060611147846109c6565b6111508561068a565b611159866110c2565b9250925092509193909250565b6002546001600160a01b0316331461117c575f80fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f60016111ad61010084611eac565b6111b79190611eac565b6001901b905080806111c833610809565b16146111d2575f80fd5b5f8281526005602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6001600160a01b038084165f8181526004602090815260408083209487168084526001909501825291829020859055815160608101909252602180835290611f9890830139805190602001208360405161128791815260200190565b60405180910390a3505050565b610100811180156112a757506102008111155b6112af575f80fd5b60016101001982011b80806112c386610809565b16146112cd575f80fd5b336001600160a01b03851614806112fd57506112e88261068a565b6001600160a01b0316336001600160a01b0316145b8061132d57506001600160a01b0384165f90815260046020908152604080832033845260020190915290205460ff165b611335575f80fd5b6040805160018082528183019092525f916020808301908036833701905050905082815f8151811061136957611369611ebf565b602002602001018181525050610f99858584846115a1565b5f80808061138e87610809565b90505f8567ffffffffffffffff8111156113aa576113aa611a8b565b6040519080825280602002602001820160405280156113d3578160200160208202803683370190505b5090505b5f821180156113e557508583105b156114385781600116600103611428578051600180861b9690961795840193610101860191839190811061141b5761141b611ebf565b6020026020010181815250505b6001938401939190911c906113d7565b858314611443575f80fd5b848561144e8a610809565b1614611458575f80fd5b611464888887846115a1565b5050505050505050565b5f8160018101611482575061010092915050565b7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c92915050565b5f805b825181101561156f57600161010084838151811061154e5761154e611ebf565b602002602001015103036001901b5f1b82179150808060010191505061152e565b50815161157b8261146e565b14611584575f80fd5b808161158f33610809565b1614611599575f80fd5b6109c1338483855b5f8151116115ad575f80fd5b5f5b81518110156116ee575f6001600160a01b03166115e48383815181106115d7576115d7611ebf565b602002602001015161068a565b6001600160a01b03161461168c575f806005015f84848151811061160a5761160a611ebf565b602002602001015181526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555081818151811061165457611654611ebf565b60209081029190910101516040515f9081907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908290a45b81818151811061169e5761169e611ebf565b6020026020010151846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001016115af565b506001600160a01b0384165f90815260046020526040812080548418905561171585610809565b1590505f61172285610809565b6001600160a01b0386165f9081526004602052604090208054861790551590508115611882575f80611752610e38565b90505f5b81518110156117a157886001600160a01b031682828151811061177b5761177b611ebf565b60200260200101516001600160a01b031603611799578092506117a1565b600101611756565b5082156117ee57865f60060183815481106117be576117be611ebf565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555061187b565b8060018251038151811061180457611804611ebf565b60200260200101515f600601838154811061182157611821611ebf565b5f91825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600680548061185a5761185a611f83565b5f8281526020902081015f1990810180546001600160a01b03191690550190555b50506118d3565b80156118d357600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0387161790555b6118dc85610809565b6118e587610809565b16156118ef575f80fd5b846001600160a01b0316866001600160a01b0316604051806060016040528060218152602001611fb96021913980519060200120855160405161193491815260200190565b60405180910390a3505050505050565b6001600160e01b031981168114611959575f80fd5b50565b5f6020828403121561196c575f80fd5b813561197781611944565b9392505050565b5f5b83811015611998578181015183820152602001611980565b50505f910152565b5f81518084526119b781602086016020860161197e565b601f01601f19169290920160200192915050565b602081525f61197760208301846119a0565b5f602082840312156119ed575f80fd5b5035919050565b6001600160a01b0381168114611959575f80fd5b5f8060408385031215611a19575f80fd5b8235611a24816119f4565b946020939093013593505050565b5f60208284031215611a42575f80fd5b8135611977816119f4565b5f805f60608486031215611a5f575f80fd5b8335611a6a816119f4565b92506020840135611a7a816119f4565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ac857611ac8611a8b565b604052919050565b5f82601f830112611adf575f80fd5b8135602067ffffffffffffffff821115611afb57611afb611a8b565b8160051b611b0a828201611a9f565b9283528481018201928281019087851115611b23575f80fd5b83870192505b84831015611b4257823582529183019190830190611b29565b979650505050505050565b5f60208284031215611b5d575f80fd5b813567ffffffffffffffff811115611b73575f80fd5b611b7f84828501611ad0565b949350505050565b5f815180845260208085019450602084015f5b83811015611bbf5781516001600160a01b031687529582019590820190600101611b9a565b509495945050505050565b606081525f611bdc6060830186611b87565b602083820381850152611bef8287611b87565b915083820360408501528185518084528284019150828160051b8501018388015f5b83811015611c3f57601f19878403018552611c2d8383516119a0565b94860194925090850190600101611c11565b50909a9950505050505050505050565b602081525f6119776020830184611b87565b5f8060408385031215611c72575f80fd5b8235611c7d816119f4565b915060208301358015158114611c91575f80fd5b809150509250929050565b5f67ffffffffffffffff821115611cb557611cb5611a8b565b50601f01601f191660200190565b5f805f8060808587031215611cd6575f80fd5b8435611ce1816119f4565b93506020850135611cf1816119f4565b925060408501359150606085013567ffffffffffffffff811115611d13575f80fd5b8501601f81018713611d23575f80fd5b8035611d36611d3182611c9c565b611a9f565b818152886020838501011115611d4a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215611d7c575f80fd5b8235611d87816119f4565b9150602083013567ffffffffffffffff811115611da2575f80fd5b611dae85828601611ad0565b9150509250929050565b5f8060408385031215611dc9575f80fd5b8235611dd4816119f4565b91506020830135611c91816119f4565b6001600160a01b038481168252831660208201526060604082018190525f90611e0f908301846119a0565b95945050505050565b5f60208284031215611e28575f80fd5b815167ffffffffffffffff811115611e3e575f80fd5b8201601f81018413611e4e575f80fd5b8051611e5c611d3182611c9c565b818152856020838501011115611e70575f80fd5b611e0f82602083016020860161197e565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761070c5761070c611e81565b8181038181111561070c5761070c611e81565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611ee3575f80fd5b8151611977816119f4565b8082018082111561070c5761070c611e81565b5f805f60608486031215611f13575f80fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611f5e908301846119a0565b9695505050505050565b5f60208284031215611f78575f80fd5b815161197781611944565b634e487b7160e01b5f52603160045260245ffdfe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a2646970667358221220f4b836ae68fc88d6c843ec14fd1046bbaf04ffa4e944e597dc5263124291361d64736f6c63430008180033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.