Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
2,999 ███
Holders
1,236
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 ███Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GenArtNFT
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 9999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.10; import "@rari-capital/solmate/src/tokens/ERC721.sol"; import "./NFTDescriptor.sol"; contract GenArtNFT is ERC721 { uint256 internal constant MAX_SUPPLY = 3000; bool public mintable; uint16 public dimensionLimits; uint24 public totalSupply; address public tokenDescriptor; address public owner; uint128[MAX_SUPPLY] public tokenData; constructor() ERC721(unicode"███", unicode"███") { owner = msg.sender; dimensionLimits = 0x6166; } function mint(uint128 data) external { require(mintable, "Minting disabled"); uint256 ncol = (data >> 0) & 0x7; uint256 nrow = (data >> 3) & 0x7; uint256 dim = dimensionLimits; //prettier-ignore require( ncol >= ((dim >> 0) & 0xF) && ncol <= ((dim >> 4) & 0xF) && nrow >= ((dim >> 8) & 0xF) && nrow <= ((dim >> 12) & 0xF), "Invalid Data" ); uint256 tokenId = ++totalSupply; require(tokenId <= MAX_SUPPLY, "Exceed max supply"); uint256 rand = uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.number, tokenId))) % 8; tokenData[tokenId] = (uint128(rand) << 120) | uint120(data); _mint(msg.sender, tokenId); } function _getData(uint256 tokenId) internal view returns ( uint256 ncol, uint256 nrow, uint256 result, uint256 salt ) { uint256 data = tokenData[tokenId]; require(data != 0, "Token not exists"); ncol = (data >> 0) & 0x7; nrow = (data >> 3) & 0x7; result = uint120(data) >> 6; salt = data; } function tokenURI(uint256 tokenId) public view override returns (string memory) { if (tokenDescriptor != address(0)) { return IERC721Descriptor(tokenDescriptor).tokenURI(tokenId); } (uint256 ncol, uint256 nrow, uint256 result, uint256 salt) = _getData(tokenId); return NFTDescriptor.constructTokenURI(tokenId, result, ncol, nrow, salt, name); } function imageURI(uint256 tokenId) external view returns (string memory) { (uint256 ncol, uint256 nrow, uint256 result, uint256 salt) = _getData(tokenId); return NFTDescriptor.makeImageURI(result, ncol, nrow, salt); } function squares(uint256 tokenId) external view returns (string memory) { (uint256 ncol, uint256 nrow, uint256 result, ) = _getData(tokenId); return NFTDescriptor.makeSquares(result, ncol, nrow); } // ---------- modifier onlyOwner() { require(msg.sender == owner); _; } function setOwner(address newOwner) external onlyOwner { owner = newOwner; } function setInfo(string calldata _name, string calldata _symbol) external onlyOwner { name = _name; symbol = _symbol; } function setMintable(bool _mintable) external onlyOwner { mintable = _mintable; } function setDimensionLimit(uint16 _dimensionLimits) external onlyOwner { dimensionLimits = _dimensionLimits; } // only in case we need to patch the art logic function setTokenDescriptor(address _descriptor) external onlyOwner { tokenDescriptor = _descriptor; } } interface IERC721Descriptor { function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) /// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC. abstract contract ERC721 { /*/////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*/////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*/////////////////////////////////////////////////////////////// ERC721 STORAGE //////////////////////////////////////////////////////////////*/ mapping(address => uint256) public balanceOf; mapping(uint256 => address) public ownerOf; mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*/////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*/////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { balanceOf[from]--; balanceOf[to]++; } ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes memory data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*/////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*/////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { balanceOf[to]++; } ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = ownerOf[id]; require(ownerOf[id] != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { balanceOf[owner]--; } delete ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*/////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) interface ERC721TokenReceiver { function onERC721Received( address operator, address from, uint256 id, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.10; import "./NFTArt.sol"; import "base64-sol/base64.sol"; library NFTDescriptor { function constructTokenURI( uint256 tokenId, uint256 result, uint256 ncol, uint256 nrow, uint256 salt, string memory collectionName ) internal pure returns (string memory) { string memory image = Base64.encode(NFTArt.drawSVG(result, ncol, nrow, salt)); bytes memory metadata = abi.encodePacked( '{"name":"', collectionName, " #", uintToString(tokenId), '", "description":"', "Completely on-chain generative art collection. Art is uniquely generated based on the minter's result in our rebranding game. Limited edition. \\n\\nThe minter's result:\\n", makeSquares(result, ncol, nrow), '", "image": "', "data:image/svg+xml;base64,", image, '"}' ); return string(abi.encodePacked("data:application/json;base64,", Base64.encode(metadata))); } function makeSquares( uint256 result, uint256 ncol, uint256 nrow ) internal pure returns (string memory) { unchecked { bytes[8] memory rows; for (uint256 q = 0; q < nrow; ++q) { string[8] memory strs; for (uint256 p = ncol - 1; p != type(uint256).max; --p) { uint256 res = result % 3; strs[p] = res == 0 ? hex"e2ac9cefb88f" : res == 1 ? hex"f09f9fa8" : hex"f09f9fa9"; result /= 3; } rows[q] = abi.encodePacked(strs[0], strs[1], strs[2], strs[3], strs[4], strs[5], strs[6], strs[7], "\\n"); } return string(abi.encodePacked(rows[0], rows[1], rows[2], rows[3], rows[4], rows[5], rows[6], rows[7])); } } function makeImageURI( uint256 result, uint256 ncol, uint256 nrow, uint256 salt ) internal pure returns (string memory) { string memory image = Base64.encode(NFTArt.drawSVG(result, ncol, nrow, salt)); return string(abi.encodePacked("data:image/svg+xml;base64,", image)); } function uintToString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.10; import "./RNG.sol"; library NFTArt { using RNG for RNG.Data; uint256 internal constant W_BASE = 30; uint256 internal constant W_RAND = 30; uint256 internal constant L_BASE = 30; uint256 internal constant L_RAND = 30; uint256 internal constant H_BASE = 20; uint256 internal constant H_RAND = 40; uint256 internal constant LAST_ROW_MIN_L = 55; uint256 internal constant FIRST_COL_MIN_W = 25; bytes6 internal constant FRAME_COLOR = "332E22"; bytes6 internal constant COLOR1 = "E8E4DC"; bytes internal constant COLOR2 = "6688EE6688EEFCBC18FDBD2EFE514EF2532DE7AC52EC6B2558C9EDEC6B25457DB6FCD265999999C3B89FF4AB13208793"; bytes internal constant COLOR3 = "EE6666EE666628A7914561CC6CC2820B9594639AA0639AA0EF8FA3623A53DC5357DC505355555550978E9FBBC1C92B28"; bytes internal constant BG_COLOR = "FBF5E9FBF5E9FBECE9F7F2E6ECEBE8EAEAEAF5EEE6"; int256 internal constant LOGO_LENGTH = 112 * 35; // logo scale: 35 int256 internal constant SCALE = 100; int256 internal constant OFFSET_X = ((600 / 2) + 0) * SCALE; int256 internal constant OFFSET_Y = ((600 / 2) + 20) * SCALE; int256 internal constant COS_30 = 86602540; int256 internal constant SIN_30 = 50000000; /** * w: block width * l: block length * h: block height * (p, q): block position in virtual plane * (x, y): block position in projected plane */ function isometric(int256 p, int256 q) internal pure returns (int256 x, int256 y) { unchecked { x = ((p + q) * COS_30) / 1e8 + OFFSET_X; y = ((q - p) * SIN_30) / 1e8 + OFFSET_Y; } } function intToString(int256 value) internal pure returns (bytes5 buffer) { assert(value >= 0 && value <= 99999); unchecked { // prettier-ignore buffer = bytes5(0x3030303030 + uint40( ((((uint256(value) / 1e0) % 10)) << 0) | ((((uint256(value) / 1e1) % 10)) << 8) | ((((uint256(value) / 1e2) % 10)) << 16) | ((((uint256(value) / 1e3) % 10)) << 24) | ((((uint256(value) / 1e4) % 10)) << 32) )); } } function pickColor(bytes memory choices, uint256 rand) internal pure returns (bytes6 picked) { unchecked { uint256 i = (rand % (choices.length / 6)) * 6; assembly { picked := mload(add(add(choices, 32), i)) } } } struct Plane { int256 ax; int256 ay; int256 bx; int256 by; int256 cx; int256 cy; int256 dx; int256 dy; } function makeBlock( int256 p, int256 q, int256 w, int256 l, int256 h, bytes6 color, bool addLogo ) internal pure returns (bytes memory blk) { unchecked { Plane memory ground; (ground.ax, ground.ay) = isometric(p, q); (ground.bx, ground.by) = isometric(p + w, q); (ground.cx, ground.cy) = isometric(p + w, q + l); (ground.dx, ground.dy) = isometric(p, q + l); Plane memory cover = Plane({ ax: ground.ax, ay: ground.ay - h, bx: ground.bx, by: ground.by - h, cx: ground.cx, cy: ground.cy - h, dx: ground.dx, dy: ground.dy - h }); // prettier-ignore bytes memory coverCode = abi.encodePacked( '<path d="M', intToString(cover.ax), ",", intToString(cover.ay), "L", intToString(cover.bx), ",", intToString(cover.by), "L", intToString(cover.cx), ",", intToString(cover.cy), "L", intToString(cover.dx), ",", intToString(cover.dy), 'Z" fill="#', color, '"/>' ); // prettier-ignore bytes memory sides = abi.encodePacked( '<path d="M', intToString(cover.ax), ",", intToString(cover.ay), "L", intToString(cover.dx), ",", intToString(cover.dy), "L", intToString(cover.cx), ",", intToString(cover.cy), "V", intToString(ground.cy), "L", intToString(ground.dx), ",", intToString(ground.dy), "L", intToString(ground.ax), ",", intToString(ground.ay), 'Z"/>' ); blk = abi.encodePacked(sides, coverCode); if (addLogo) { (int256 x, int256 y) = isometric(p + w / 2, q + (l - LOGO_LENGTH) / 2); blk = abi.encodePacked(blk, '<use href="#logo" x="', intToString(x), '" y="', intToString(y - h), '"/>'); } } } function makeBlocks(Config memory cfg) internal pure returns (bytes[8] memory rows) { unchecked { int256 qMemo = 0; for (uint256 q = 0; q < cfg.nrow; q++) { bytes[8] memory bs; int256 l = int256(cfg.ls[q]); uint256 i = 0; for (uint256 p = cfg.ncol - 1; p != type(uint256).max; --p) { bytes6 color = cfg.colors[cfg.result % 3]; int256 w = int256(cfg.ws[p]); int256 h = int256(cfg.hs[q][p]); int256 pAdjusted = cfg.offsetP + int256(p == 0 ? 0 : cfg.wsCumSum[p - 1]); int256 qAdjusted = cfg.offsetQ + qMemo; bool addLogo = q == cfg.nrow - 1 && p == 0; bs[i++] = makeBlock(pAdjusted, qAdjusted, w, l, h, color, addLogo); cfg.result /= 3; } rows[q] = abi.encodePacked(bs[0], bs[1], bs[2], bs[3], bs[4], bs[5], bs[6], bs[7]); qMemo += l; } } } function makeSvg(Config memory cfg) internal pure returns (bytes memory svg) { bytes[8] memory rows = makeBlocks(cfg); svg = abi.encodePacked( '<svg viewBox="0 0 60000 60000" xmlns="http://www.w3.org/2000/svg">' '<def><g id="logo" fill="#332E22" stroke-width="0" transform="scale(35)">' '<path d="M18 20c2 1 2.3 2.3.6 3.2S14 24 12 23c-2-1-2.2-2.4-.6-3.2s4.6-1 6.6.1zm5.3 12.6c1.7-1 1.4-2.3-.6-3.2s-5-1-6.5-.2-1.3 2.3.6 3.2c2 1 4.8 1 6.5.2z"/>' '<path fill-rule="evenodd" d="M80 19.5C84.6 1 29.2-3.6 11 8-8.7 17.8 1 48 35.7 44.4c.2.2.5.3.8.4l23 9.8c1.8.8 4.3.7 6-.2L99.8 35c1.6-1 1.6-2.2.1-3.2l-19-12c-.3-.2-.6-.3-1-.4zM48.6 34C16.5 51-6.8 22.3 16 10.5 10 22 78 15.4 48.6 34zm45.2-.6l-13 7.4c-3-1-9.8-6.7-13.5-4.3-4.4 2 6.6 5.5 8.6 7L71 46.3c-3-1-11-6.5-14-4-3.8 2 7.4 5.2 9.5 6.6l-4 2.3L42.8 43l35-19.7 16 10.2z"/>' "</g></def>" '<rect width="60000" height="60000" fill="#', cfg.frameColor, '"/>' '<rect x="2500" y="2500" width="55000" height="55000" stroke="#332E22" stroke-width="200" fill="#', cfg.bgColor, '"/>' '<g fill="#332E22" stroke="#332E22" stroke-width="100">' ); svg = abi.encodePacked(svg, rows[0], rows[1], rows[2], rows[3], rows[4], rows[5], rows[6], rows[7], "</g></svg>"); } // ------- config ------- struct Config { uint256 result; uint256 ncol; uint256 nrow; int256 offsetP; int256 offsetQ; uint256[8] ws; uint256[8] ls; uint256[8][8] hs; uint256[8] wsCumSum; bytes6[3] colors; bytes6 bgColor; bytes6 frameColor; } function generateConfig( uint256 result, uint256 ncol, uint256 nrow, uint256 salt ) internal pure returns (Config memory cfg) { RNG.Data memory rng = RNG.Data(salt, 0); cfg.result = result; cfg.ncol = ncol; cfg.nrow = nrow; cfg.colors[0] = COLOR1; cfg.colors[1] = pickColor(COLOR2, rng.rand()); cfg.colors[2] = pickColor(COLOR3, rng.rand()); cfg.bgColor = pickColor(BG_COLOR, rng.rand()); cfg.frameColor = FRAME_COLOR; while (true) { // generate widths unchecked { uint256[8] memory ws = cfg.ws; uint256[8] memory wsCumSum = cfg.wsCumSum; uint256 rand = rng.rand(); uint256 memo = 0; for (uint256 p = 0; p < ncol; ++p) { uint256 w = (W_BASE + ((rand >> (8 * p)) % W_RAND)) * uint256(SCALE); if (p == 0 && w < FIRST_COL_MIN_W) w = FIRST_COL_MIN_W; wsCumSum[p] = (memo += (ws[p] = w)); } cfg.offsetP = -int256(memo) / 2; } // generate lengths unchecked { uint256[8] memory ls = cfg.ls; uint256 rand = rng.rand(); uint256 memo = 0; for (uint256 q = 0; q < nrow; ++q) { uint256 l = (L_BASE + ((rand >> (8 * q)) % L_RAND)) * uint256(SCALE); if (q == nrow - 1 && l < LAST_ROW_MIN_L) l = LAST_ROW_MIN_L; memo += (ls[q] = l); } cfg.offsetQ = -int256(memo) / 2; } // ensure no "out of canvas" (int256 x0, ) = isometric(cfg.offsetP, cfg.offsetQ); if (x0 >= 3000) break; } // generate heights unchecked { uint256[8][8] memory hs = cfg.hs; for (uint256 q = 0; q < nrow; ++q) { uint256 rand = rng.rand(); for (uint256 p = 0; p < ncol; ++p) { hs[q][p] = (H_BASE + ((rand >> (8 * p)) % H_RAND)) * uint256(SCALE); } } } } // ------- entry point ------- function drawSVG( uint256 result, uint256 ncol, uint256 nrow, uint256 salt ) internal pure returns (bytes memory svg) { return makeSvg(generateConfig(result, ncol, nrow, salt)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides functions for encoding/decoding base64 library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; bytes internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000" hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000" hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000" hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' 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; } function decode(string memory _data) internal pure returns (bytes memory) { bytes memory data = bytes(_data); if (data.length == 0) return new bytes(0); require(data.length % 4 == 0, "invalid base64 decoder input"); // load the table into memory bytes memory table = TABLE_DECODE; // every 4 characters represent 3 bytes uint256 decodedLen = (data.length / 4) * 3; // add some extra buffer at the end required for the writing bytes memory result = new bytes(decodedLen + 32); assembly { // padding with '=' let lastBytes := mload(add(data, mload(data))) if eq(and(lastBytes, 0xFF), 0x3d) { decodedLen := sub(decodedLen, 1) if eq(and(lastBytes, 0xFFFF), 0x3d3d) { decodedLen := sub(decodedLen, 1) } } // set the actual output length mstore(result, decodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 4 characters at a time for {} lt(dataPtr, endPtr) {} { // read 4 characters dataPtr := add(dataPtr, 4) let input := mload(dataPtr) // write 3 bytes let output := add( add( shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)), shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))), add( shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)), and(mload(add(tablePtr, and( input , 0xFF))), 0xFF) ) ) mstore(resultPtr, shl(232, output)) resultPtr := add(resultPtr, 3) } } return result; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.10; library RNG { struct Data { uint256 seed; uint256 i; } function rand(Data memory rng) internal pure returns (uint256) { unchecked { return uint256(keccak256(abi.encode(rng.seed, rng.i++))); } } }
{ "optimizer": { "enabled": true, "runs": 9999 }, "metadata": { "bytecodeHash": "none" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dimensionLimits","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"imageURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"data","type":"uint128"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","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":"id","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":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dimensionLimits","type":"uint16"}],"name":"setDimensionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintable","type":"bool"}],"name":"setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_descriptor","type":"address"}],"name":"setTokenDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"squares","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenData","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDescriptor","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040805180820182526009808252681c52d11c52d11c52d160bb1b60208084018281528551808701909652928552840152815191929162000056916000916200009a565b5080516200006c9060019060208401906200009a565b5050600780546001600160a01b0319163317905550600680546261660062ffff00199091161790556200017d565b828054620000a89062000140565b90600052602060002090601f016020900481019282620000cc576000855562000117565b82601f10620000e757805160ff191683800117855562000117565b8280016001018555821562000117579182015b8281111562000117578251825591602001919060010190620000fa565b506200012592915062000129565b5090565b5b808211156200012557600081556001016200012a565b600181811c908216806200015557607f821691505b602082108114156200017757634e487b7160e01b600052602260045260246000fd5b50919050565b614049806200018d6000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c806369d3e20e116100f9578063a923fc4011610097578063b88d4fde11610071578063b88d4fde1461045d578063c87b56dd14610470578063d66732b814610483578063e985e9c5146104a957600080fd5b8063a923fc4014610403578063b4b5b48f14610416578063b6dc7ea31461044a57600080fd5b80638da5cb5b116100d35780638da5cb5b146103b55780638f742d16146103d557806395d89b41146103e8578063a22cb465146103f057600080fd5b806369d3e20e146103615780636c73ca101461037457806370a082311461038757600080fd5b80631d1d15d41161016657806342842e0e1161014057806342842e0e146102e15780634bf365df146102f45780635a9d7a68146103015780636352211e1461032b57600080fd5b80631d1d15d4146102a857806323b872dd146102bb578063285d70d4146102ce57600080fd5b8063095ea7b311610197578063095ea7b31461025657806313af40351461026b57806318160ddd1461027e57600080fd5b806301ffc9a7146101be57806306fdde03146101e6578063081812fc146101fb575b600080fd5b6101d16101cc3660046127e0565b6104d7565b60405190151581526020015b60405180910390f35b6101ee6105bc565b6040516101dd919061285c565b61023161020936600461286f565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b6102696102643660046128b1565b61064a565b005b6102696102793660046128db565b61077f565b600654610294906301000000900462ffffff1681565b60405162ffffff90911681526020016101dd565b6101ee6102b636600461286f565b6107ea565b6102696102c93660046128f6565b610815565b6102696102dc366004612942565b610a70565b6102696102ef3660046128f6565b610ac5565b6006546101d19060ff1681565b600654610231906601000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61023161033936600461286f565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61026961036f36600461295d565b610c15565b61026961038236600461298f565b610ea2565b6103a76103953660046128db565b60026020526000908152604090205481565b6040519081526020016101dd565b6007546102319073ffffffffffffffffffffffffffffffffffffffff1681565b6101ee6103e336600461286f565b610f00565b6101ee610f2f565b6102696103fe3660046129b3565b610f3c565b610269610411366004612a2f565b610fd3565b61042961042436600461286f565b611017565b6040516fffffffffffffffffffffffffffffffff90911681526020016101dd565b6102696104583660046128db565b611054565b61026961046b366004612b23565b6110c9565b6101ee61047e36600461286f565b611206565b60065461049690610100900461ffff1681565b60405161ffff90911681526020016101dd565b6101d16104b7366004612bce565b600560209081526000928352604080842090915290825290205460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061056a57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806105b657507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600080546105c990612bf8565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590612bf8565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b505050505081565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16338114806106ad575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b6106fe5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146107a357600080fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606060008060006107fa85611380565b5092509250925061080c818484611444565b95945050505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff84811691161461088b5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d0000000000000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff82166108ee5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016106f5565b3373ffffffffffffffffffffffffffffffffffffffff84161480610935575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610970575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b6109bc5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526002602090815260408083208054600019019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610a9457600080fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610ad0838383610815565b73ffffffffffffffffffffffffffffffffffffffff82163b1580610bc457506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba09190612c4c565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610c105760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016106f5565b505050565b60065460ff16610c675760405162461bcd60e51b815260206004820152601060248201527f4d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016106f5565b600654600782811691600384901c90911690610100900461ffff811690600f168310801590610c9d5750600481901c600f168311155b8015610cb05750600881901c600f168210155b8015610cc35750600c81901c600f168211155b610d0f5760405162461bcd60e51b815260206004820152600c60248201527f496e76616c69642044617461000000000000000000000000000000000000000060448201526064016106f5565b60006006600381819054906101000a900462ffffff16610d2e90612c98565b91906101000a81548162ffffff021916908362ffffff160217905562ffffff169050610bb8811115610da25760405162461bcd60e51b815260206004820152601160248201527f457863656564206d617820737570706c7900000000000000000000000000000060448201526064016106f5565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152426034820152436054820152607481018290526000906008906094016040516020818303038152906040528051906020012060001c610e0f9190612cea565b9050856effffffffffffffffffffffffffffff166078826fffffffffffffffffffffffffffffffff16901b17600883610bb88110610e4f57610e4f612cfe565b600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550610e9a338361161e565b505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610ec657600080fd5b6006805461ffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff909216919091179055565b6060600080600080610f1186611380565b9350935093509350610f2582858584611783565b9695505050505050565b600180546105c990612bf8565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610ff757600080fd5b611003600085856125e6565b50611010600183836125e6565b5050505050565b600881610bb8811061102857600080fd5b60029182820401919006601002915054906101000a90046fffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff16331461107857600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9092166601000000000000027fffffffffffff0000000000000000000000000000000000000000ffffffffffff909216919091179055565b6110d4848484610815565b73ffffffffffffffffffffffffffffffffffffffff83163b15806111b457506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061114d903390899088908890600401612d2d565b6020604051808303816000875af115801561116c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111909190612c4c565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6112005760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016106f5565b50505050565b6006546060906601000000000000900473ffffffffffffffffffffffffffffffffffffffff16156112d1576006546040517fc87b56dd00000000000000000000000000000000000000000000000000000000815260048101849052660100000000000090910473ffffffffffffffffffffffffffffffffffffffff169063c87b56dd90602401600060405180830381865afa1580156112a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105b69190810190612d6c565b6000806000806112e086611380565b9350935093509350610f258683868685600080546112fd90612bf8565b80601f016020809104026020016040519081016040528092919081815260200182805461132990612bf8565b80156113765780601f1061134b57610100808354040283529160200191611376565b820191906000526020600020905b81548152906001019060200180831161135957829003601f168201915b50505050506117c8565b6000806000806000600886610bb8811061139c5761139c612cfe565b60028104919091015460019091166010026101000a90046fffffffffffffffffffffffffffffffff169050806114145760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f74206578697374730000000000000000000000000000000060448201526064016106f5565b600780821697600383901c90911696506e03ffffffffffffffffffffffffffff600683901c169550909350915050565b606061144e612688565b60005b838110156115c557611461612688565b60001986015b6000198114611556576003880680156114f857806001146114bd576040518060400160405280600481526020017ff09f9fa90000000000000000000000000000000000000000000000000000000081525061152f565b6040518060400160405280600481526020017ff09f9fa80000000000000000000000000000000000000000000000000000000081525061152f565b6040518060400160405280600681526020017fe2ac9cefb88f00000000000000000000000000000000000000000000000000008152505b83836008811061154157611541612cfe565b60200201526003890498505060001901611467565b5080516020808301516040808501516060860151608087015160a088015160c089015160e08a015195516115969998959694959394929391929101612df6565b6040516020818303038152906040528383600881106115b7576115b7612cfe565b602002015250600101611451565b5080516020808301516040808501516060860151608087015160a088015160c089015160e08a015195516116059998959694959394929391929101612ec0565b6040516020818303038152906040529150509392505050565b73ffffffffffffffffffffffffffffffffffffffff82166116815760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016106f5565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156116f35760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e54454400000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060600061179b6117968787878761184f565b611865565b9050806040516020016117ae9190612f65565b604051602081830303815290604052915050949350505050565b606060006117db6117968888888861184f565b90506000836117e98a611a20565b6117f48a8a8a611444565b846040516020016118089493929190612faa565b604051602081830303815290604052905061182281611865565b60405160200161183291906131d3565b604051602081830303815290604052925050509695505050505050565b606061080c61186086868686611b5a565b611ec3565b606081516000141561188557505060408051602081019091526000815290565b6000604051806060016040528060408152602001613fd360409139905060006003845160026118b49190613218565b6118be9190613230565b6118c9906004613244565b905060006118d8826020613218565b67ffffffffffffffff8111156118f0576118f0612a9b565b6040519080825280601f01601f19166020018201604052801561191a576020820181803683370190505b509050818152600183018586518101602084015b81831015611986576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161192e565b6003895106600181146119a057600281146119ea57611a12565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152611a12565b7f3d000000000000000000000000000000000000000000000000000000000000006000198301525b509398975050505050505050565b606081611a6057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611a8a5780611a7481613263565b9150611a839050600a83613230565b9150611a64565b60008167ffffffffffffffff811115611aa557611aa5612a9b565b6040519080825280601f01601f191660200182016040528015611acf576020820181803683370190505b5090505b8415611b5257611ae460018361327e565b9150611af1600a86612cea565b611afc906030613218565b60f81b818381518110611b1157611b11612cfe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611b4b600a86613230565b9450611ad3565b949350505050565b611b626126b0565b60408051808201825283815260006020808301919091528784528381018790528383018690526101208401517f4538453444430000000000000000000000000000000000000000000000000000905282516080810190935260608084529192611bdc929091613f7390830139611bd783611f55565b611f9f565b6101208301517fffffffffffff00000000000000000000000000000000000000000000000000009190911660209182015260408051608081019091526060808252611c3192613f1390830139611bd783611f55565b6101208301517fffffffffffff000000000000000000000000000000000000000000000000000091909116604091820152805160608101909152602a808252611c8691906140136020830139611bd783611f55565b7fffffffffffff0000000000000000000000000000000000000000000000000000166101408301527f33333245323200000000000000000000000000000000000000000000000000006101608301525b60a08201516101008301516000611cec84611f55565b90506000805b89811015611d6157601e6008820284901c8190060160640281158015611d185750601981105b15611d21575060195b80868360088110611d3457611d34612cfe565b60200201818152508301925082858360088110611d5357611d53612cfe565b602002015250600101611cf2565b5060028160000381611d7557611d75612cbb565b05606087015250505060c083015190506000611d9083611f55565b90506000805b87811015611df257601e6008820284901c81900601606402600019890182148015611dc15750603781105b15611dca575060375b80858360088110611ddd57611ddd612cfe565b60200201819052929092019150600101611d96565b5060028160000381611e0657611e06612cbb565b056080860181905260608601516175306305f5e10091909201630529732c020501925050610bb882129050611e3b5750611e41565b50611cd6565b60e082015160005b85811015611eb8576000611e5c84611f55565b905060005b88811015611eae57606460286008830284901c0660140102848460088110611e8b57611e8b612cfe565b60200201518260088110611ea157611ea1612cfe565b6020020152600101611e61565b5050600101611e49565b505050949350505050565b60606000611ed083611fd7565b610160840151610140850151604051929350611eee92602001613295565b60408051808303601f190181528282528351602080860151938601516060870151608088015160a089015160c08a015160e08b0151979b50611f3e998c9997989596949593949293919201613751565b604051602081830303815290604052915050919050565b80516020808301805160018101909152604051600093611f819390929101918252602082015260400190565b60408051601f19818403018152919052805160209091012092915050565b6000806006845181611fb357611fb3612cbb565b048381611fc257611fc2612cbb565b60069190060293909301602001519392505050565b611fdf612688565b6000805b83604001518110156121ca57611ff7612688565b60008560c00151836008811061200f5761200f612cfe565b60200201519050600080600188602001510390505b600019811461215557600088610120015160038a600001518161204957612049612cbb565b066003811061205a5761205a612cfe565b6020020151905060008960a00151836008811061207957612079612cfe565b6020020151905060008a60e00151886008811061209857612098612cfe565b602002015184600881106120ae576120ae612cfe565b60200201519050600084156120e1578b610100015160018603600881106120d7576120d7612cfe565b60200201516120e4565b60005b8c6060015101905060008a8d60800151019050600060018e60400151038b14801561210d575086155b905061211e8383878c888b876121d1565b60018901988b906008811061213557612135612cfe565b602002015250508b51600390048c52505050600019919091019050612024565b5082516020808501516040808701516060880151608089015160a08a015160c08b015160e08c015195516121959998959694959394929391929101612ec0565b6040516020818303038152906040528685600881106121b6576121b6612cfe565b602002015250929092019150600101611fe3565b5050919050565b606061221b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6305f5e100630529732c8a8a010281900561753001906302faf0808b8b030205617d0001602083015281526175306305f5e100888b018a8101630529732c028290059290920191617d00908b036302faf080029190910501606083015260408201526305f5e100630529732c8a89018a89018181019290920283900561753001926302faf080919092030205617d000160a083015260808201526175306305f5e100878a01808c01630529732c028290059290920191617d00908c90036302faf0800291909105018260c0018360e001828152508281525050506000604051806101000160405280836000015181526020018784602001510381526020018360400151815260200187846060015103815260200183608001518152602001878460a001510381526020018360c001518152602001878460e00151038152509050600061236a8260000151612583565b6123778360200151612583565b6123848460400151612583565b6123918560600151612583565b61239e8660800151612583565b6123ab8760a00151612583565b6123b88860c00151612583565b6123c58960e00151612583565b8d6040516020016123de9998979695949392919061383a565b604051602081830303815290604052905060006123fe8360000151612583565b61240b8460200151612583565b6124188560c00151612583565b6124258660e00151612583565b6124328760800151612583565b61243f8860a00151612583565b61244c8a60a00151612583565b6124598b60c00151612583565b6124668c60e00151612583565b8c5161247190612583565b61247e8e60200151612583565b6040516020016124989b9a99989796959493929190613a39565b604051602081830303815290604052905080826040516020016124bc929190613df7565b604051602081830303815290604052945085156125745760008061253560028d058f0160027ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b08e01058f016305f5e100630529732c8284010281900561753001936302faf080939092039290920291909105617d000190565b915091508661254383612583565b61254e8c8403612583565b60405160200161256093929190613e26565b604051602081830303815290604052965050505b50505050979650505050505050565b600080821215801561259857506201869f8213155b6125a4576125a4613ee3565b50643030303030600a80830681840482900660081b176064840482900660101b176103e8840482900660181b176127109093040660201b919091170160d81b90565b8280546125f290612bf8565b90600052602060002090601f0160209004810192826126145760008555612678565b82601f1061264b578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555612678565b82800160010185558215612678579182015b8281111561267857823582559160200191906001019061265d565b5061268492915061272f565b5090565b6040518061010001604052806008905b60608152602001906001900390816126985790505090565b60405180610180016040528060008152602001600081526020016000815260200160008152602001600081526020016126e7612744565b81526020016126f4612744565b8152602001612701612763565b815260200161270e612744565b815260200161271b612791565b815260006020820181905260409091015290565b5b808211156126845760008155600101612730565b6040518061010001604052806008906020820280368337509192915050565b6040518061010001604052806008905b61277b612744565b8152602001906001900390816127735790505090565b60405180606001604052806003906020820280368337509192915050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146127dd57600080fd5b50565b6000602082840312156127f257600080fd5b81356127fd816127af565b9392505050565b60005b8381101561281f578181015183820152602001612807565b838111156112005750506000910152565b60008151808452612848816020860160208601612804565b601f01601f19169290920160200192915050565b6020815260006127fd6020830184612830565b60006020828403121561288157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146128ac57600080fd5b919050565b600080604083850312156128c457600080fd5b6128cd83612888565b946020939093013593505050565b6000602082840312156128ed57600080fd5b6127fd82612888565b60008060006060848603121561290b57600080fd5b61291484612888565b925061292260208501612888565b9150604084013590509250925092565b803580151581146128ac57600080fd5b60006020828403121561295457600080fd5b6127fd82612932565b60006020828403121561296f57600080fd5b81356fffffffffffffffffffffffffffffffff811681146127fd57600080fd5b6000602082840312156129a157600080fd5b813561ffff811681146127fd57600080fd5b600080604083850312156129c657600080fd5b6129cf83612888565b91506129dd60208401612932565b90509250929050565b60008083601f8401126129f857600080fd5b50813567ffffffffffffffff811115612a1057600080fd5b602083019150836020828501011115612a2857600080fd5b9250929050565b60008060008060408587031215612a4557600080fd5b843567ffffffffffffffff80821115612a5d57600080fd5b612a69888389016129e6565b90965094506020870135915080821115612a8257600080fd5b50612a8f878288016129e6565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612af357612af3612a9b565b604052919050565b600067ffffffffffffffff821115612b1557612b15612a9b565b50601f01601f191660200190565b60008060008060808587031215612b3957600080fd5b612b4285612888565b9350612b5060208601612888565b925060408501359150606085013567ffffffffffffffff811115612b7357600080fd5b8501601f81018713612b8457600080fd5b8035612b97612b9282612afb565b612aca565b818152886020838501011115612bac57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215612be157600080fd5b612bea83612888565b91506129dd60208401612888565b600181811c90821680612c0c57607f821691505b60208210811415612c46577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215612c5e57600080fd5b81516127fd816127af565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062ffffff80831681811415612cb157612cb1612c69565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612cf957612cf9612cbb565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152610f256080830184612830565b600060208284031215612d7e57600080fd5b815167ffffffffffffffff811115612d9557600080fd5b8201601f81018413612da657600080fd5b8051612db4612b9282612afb565b818152856020838501011115612dc957600080fd5b61080c826020830160208601612804565b60008151612dec818560208601612804565b9290920192915050565b600089516020612e098285838f01612804565b8a5191840191612e1c8184848f01612804565b8a51920191612e2e8184848e01612804565b8951920191612e408184848d01612804565b8851920191612e528184848c01612804565b8751920191612e648184848b01612804565b8651920191612e768184848a01612804565b8551920191612e888184848901612804565b7f5c6e0000000000000000000000000000000000000000000000000000000000009201918252506002019a9950505050505050505050565b600089516020612ed38285838f01612804565b8a5191840191612ee68184848f01612804565b8a51920191612ef88184848e01612804565b8951920191612f0a8184848d01612804565b8851920191612f1c8184848c01612804565b8751920191612f2e8184848b01612804565b8651920191612f408184848a01612804565b8551920191612f528184848901612804565b919091019b9a5050505050505050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612f9d81601a850160208701612804565b91909101601a0192915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000815260008551612fe2816009850160208a01612804565b7f2023000000000000000000000000000000000000000000000000000000000000600991840191820152855161301f81600b840160208a01612804565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600b92909101918201527f436f6d706c6574656c79206f6e2d636861696e2067656e657261746976652061601d8201527f727420636f6c6c656374696f6e2e2041727420697320756e697175656c792067603d8201527f656e657261746564206261736564206f6e20746865206d696e74657227732072605d8201527f6573756c7420696e206f75722072656272616e64696e672067616d652e204c69607d8201527f6d697465642065646974696f6e2e205c6e5c6e546865206d696e746572277320609d8201527f726573756c743a5c6e000000000000000000000000000000000000000000000060bd8201526131c861319f61319961317061314760c686018a612dda565b7f222c2022696d616765223a2022000000000000000000000000000000000000008152600d0190565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152601a0190565b86612dda565b7f227d000000000000000000000000000000000000000000000000000000000000815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161320b81601d850160208701612804565b91909101601d0192915050565b6000821982111561322b5761322b612c69565b500190565b60008261323f5761323f612cbb565b500490565b600081600019048311821515161561325e5761325e612c69565b500290565b600060001982141561327757613277612c69565b5060010190565b60008282101561329057613290612c69565b500390565b7f3c7376672076696577426f783d2230203020363030303020363030303022207881527f6d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766760208201527f223e3c6465663e3c672069643d226c6f676f222066696c6c3d2223333332453260408201527f3222207374726f6b652d77696474683d223022207472616e73666f726d3d227360608201527f63616c6528333529223e3c7061746820643d224d31382032306332203120322e60808201527f3320322e332e3620332e32533134203234203132203233632d322d312d322e3260a08201527f2d322e342d2e362d332e3273342e362d3120362e362e317a6d352e332031322e60c08201527f3663312e372d3120312e342d322e332d2e362d332e32732d352d312d362e352d60e08201527f2e322d312e3320322e332e3620332e326332203120342e38203120362e352e326101008201527f7a222f3e3c706174682066696c6c2d72756c653d226576656e6f64642220643d6101208201527f224d38302031392e354338342e3620312032392e322d332e3620313120382d386101408201527f2e372031372e3820312034382033352e372034342e34632e322e322e352e332e6101608201527f382e346c323320392e3863312e382e3820342e332e3720362d2e324c39392e386101808201527f20333563312e362d3120312e362d322e322e312d332e326c2d31392d3132632d6101a08201527f2e332d2e322d2e362d2e332d312d2e347a4d34382e362033344331362e3520356101c08201527f312d362e382032322e332031362031302e352031302032322037382031352e346101e08201527f2034382e362033347a6d34352e322d2e366c2d313320372e34632d332d312d396102008201527f2e382d362e372d31332e352d342e332d342e34203220362e3620352e3520382e6102208201527f3620374c37312034362e33632d332d312d31312d362e352d31342d342d332e386102408201527f203220372e3420352e3220392e3520362e366c2d3420322e334c34322e3820346102608201527f336c33352d31392e372031362031302e327a222f3e3c2f673e3c2f6465663e3c6102808201527f726563742077696474683d22363030303022206865696768743d2236303030306102a08201527f222066696c6c3d222300000000000000000000000000000000000000000000006102c08201527fffffffffffff000000000000000000000000000000000000000000000000000083166102c98201527f222f3e3c7265637420783d22323530302220793d2232353030222077696474686102cf8201527f3d22353530303022206865696768743d22353530303022207374726f6b653d226102ef8201527f2333333245323222207374726f6b652d77696474683d22323030222066696c6c61030f8201527f3d2223000000000000000000000000000000000000000000000000000000000061032f820152600061033282017fffffffffffff0000000000000000000000000000000000000000000000000000841681527f222f3e3c672066696c6c3d222333333245323222207374726f6b653d2223333360068201527f3245323222207374726f6b652d77696474683d22313030223e000000000000006026820152603f810161080c565b60008a51613763818460208f01612804565b8a516137758183860160208f01612804565b8a51918401019061378a818360208e01612804565b895161379c8183850160208e01612804565b89519290910101906137b2818360208c01612804565b87516137c48183850160208c01612804565b87519290910101906137da818360208a01612804565b85516137ec8183850160208a01612804565b8551929091010190613802818360208801612804565b7f3c2f673e3c2f7376673e000000000000000000000000000000000000000000009101908152600a019b9a5050505050505050505050565b7f3c7061746820643d224d0000000000000000000000000000000000000000000081527fffffffffff0000000000000000000000000000000000000000000000000000008a8116600a8301527f2c00000000000000000000000000000000000000000000000000000000000000600f83015289811660108301527f4c000000000000000000000000000000000000000000000000000000000000006015830152881660168201526000613913601b83017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff00000000000000000000000000000000000000000000000000000098891681527f4c000000000000000000000000000000000000000000000000000000000000006005820181905297891660068201527f2c00000000000000000000000000000000000000000000000000000000000000600b8201819052968916600c8201526011810197909752505091851660128501526017840192909252921660188201527f5a222066696c6c3d222300000000000000000000000000000000000000000000601d8201527fffffffffffff000000000000000000000000000000000000000000000000000090911660278201527f222f3e0000000000000000000000000000000000000000000000000000000000602d8201526030019392505050565b7f3c7061746820643d224d0000000000000000000000000000000000000000000081527fffffffffff0000000000000000000000000000000000000000000000000000008c8116600a8301527f2c00000000000000000000000000000000000000000000000000000000000000600f8301528b1660108201527f4c0000000000000000000000000000000000000000000000000000000000000060158201526000601682017fffffffffff0000000000000000000000000000000000000000000000000000008c1681526005613b348183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008d1681529150613b8a8183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008c1681529150613be08183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008b1681529150613c368183017f5600000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008a1681529150613c8c8183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000891681529150613ce28183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000881681529150613d388183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000871681529150613d8e8183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000861681529150613de48183017f5a222f3e00000000000000000000000000000000000000000000000000000000815260040190565b9f9e505050505050505050505050505050565b60008351613e09818460208801612804565b835190830190613e1d818360208801612804565b01949350505050565b60008451613e38818460208901612804565b7f3c75736520687265663d22236c6f676f2220783d2200000000000000000000009201918252507fffffffffff00000000000000000000000000000000000000000000000000000092831660158201527f2220793d22000000000000000000000000000000000000000000000000000000601a8201529116601f8201527f222f3e00000000000000000000000000000000000000000000000000000000006024820152602701919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfe4545363636364545363636363238413739313435363143433643433238323042393539343633394141303633394141304546384641333632334135334443353335374443353035333535353535353530393738453946424243314339324232383636383845453636383845454643424331384644424432454645353134454632353332444537414335324543364232353538433945444543364232353435374442364643443236353939393939394333423839464634414231333230383739334142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f464246354539464246354539464245434539463746324536454345424538454145414541463545454536a164736f6c634300080a000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101b95760003560e01c806369d3e20e116100f9578063a923fc4011610097578063b88d4fde11610071578063b88d4fde1461045d578063c87b56dd14610470578063d66732b814610483578063e985e9c5146104a957600080fd5b8063a923fc4014610403578063b4b5b48f14610416578063b6dc7ea31461044a57600080fd5b80638da5cb5b116100d35780638da5cb5b146103b55780638f742d16146103d557806395d89b41146103e8578063a22cb465146103f057600080fd5b806369d3e20e146103615780636c73ca101461037457806370a082311461038757600080fd5b80631d1d15d41161016657806342842e0e1161014057806342842e0e146102e15780634bf365df146102f45780635a9d7a68146103015780636352211e1461032b57600080fd5b80631d1d15d4146102a857806323b872dd146102bb578063285d70d4146102ce57600080fd5b8063095ea7b311610197578063095ea7b31461025657806313af40351461026b57806318160ddd1461027e57600080fd5b806301ffc9a7146101be57806306fdde03146101e6578063081812fc146101fb575b600080fd5b6101d16101cc3660046127e0565b6104d7565b60405190151581526020015b60405180910390f35b6101ee6105bc565b6040516101dd919061285c565b61023161020936600461286f565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b6102696102643660046128b1565b61064a565b005b6102696102793660046128db565b61077f565b600654610294906301000000900462ffffff1681565b60405162ffffff90911681526020016101dd565b6101ee6102b636600461286f565b6107ea565b6102696102c93660046128f6565b610815565b6102696102dc366004612942565b610a70565b6102696102ef3660046128f6565b610ac5565b6006546101d19060ff1681565b600654610231906601000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61023161033936600461286f565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61026961036f36600461295d565b610c15565b61026961038236600461298f565b610ea2565b6103a76103953660046128db565b60026020526000908152604090205481565b6040519081526020016101dd565b6007546102319073ffffffffffffffffffffffffffffffffffffffff1681565b6101ee6103e336600461286f565b610f00565b6101ee610f2f565b6102696103fe3660046129b3565b610f3c565b610269610411366004612a2f565b610fd3565b61042961042436600461286f565b611017565b6040516fffffffffffffffffffffffffffffffff90911681526020016101dd565b6102696104583660046128db565b611054565b61026961046b366004612b23565b6110c9565b6101ee61047e36600461286f565b611206565b60065461049690610100900461ffff1681565b60405161ffff90911681526020016101dd565b6101d16104b7366004612bce565b600560209081526000928352604080842090915290825290205460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061056a57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806105b657507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600080546105c990612bf8565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590612bf8565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b505050505081565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16338114806106ad575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b6106fe5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146107a357600080fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606060008060006107fa85611380565b5092509250925061080c818484611444565b95945050505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff84811691161461088b5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d0000000000000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff82166108ee5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016106f5565b3373ffffffffffffffffffffffffffffffffffffffff84161480610935575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610970575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b6109bc5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526002602090815260408083208054600019019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610a9457600080fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610ad0838383610815565b73ffffffffffffffffffffffffffffffffffffffff82163b1580610bc457506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba09190612c4c565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610c105760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016106f5565b505050565b60065460ff16610c675760405162461bcd60e51b815260206004820152601060248201527f4d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016106f5565b600654600782811691600384901c90911690610100900461ffff811690600f168310801590610c9d5750600481901c600f168311155b8015610cb05750600881901c600f168210155b8015610cc35750600c81901c600f168211155b610d0f5760405162461bcd60e51b815260206004820152600c60248201527f496e76616c69642044617461000000000000000000000000000000000000000060448201526064016106f5565b60006006600381819054906101000a900462ffffff16610d2e90612c98565b91906101000a81548162ffffff021916908362ffffff160217905562ffffff169050610bb8811115610da25760405162461bcd60e51b815260206004820152601160248201527f457863656564206d617820737570706c7900000000000000000000000000000060448201526064016106f5565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152426034820152436054820152607481018290526000906008906094016040516020818303038152906040528051906020012060001c610e0f9190612cea565b9050856effffffffffffffffffffffffffffff166078826fffffffffffffffffffffffffffffffff16901b17600883610bb88110610e4f57610e4f612cfe565b600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550610e9a338361161e565b505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610ec657600080fd5b6006805461ffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff909216919091179055565b6060600080600080610f1186611380565b9350935093509350610f2582858584611783565b9695505050505050565b600180546105c990612bf8565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610ff757600080fd5b611003600085856125e6565b50611010600183836125e6565b5050505050565b600881610bb8811061102857600080fd5b60029182820401919006601002915054906101000a90046fffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff16331461107857600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9092166601000000000000027fffffffffffff0000000000000000000000000000000000000000ffffffffffff909216919091179055565b6110d4848484610815565b73ffffffffffffffffffffffffffffffffffffffff83163b15806111b457506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061114d903390899088908890600401612d2d565b6020604051808303816000875af115801561116c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111909190612c4c565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6112005760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016106f5565b50505050565b6006546060906601000000000000900473ffffffffffffffffffffffffffffffffffffffff16156112d1576006546040517fc87b56dd00000000000000000000000000000000000000000000000000000000815260048101849052660100000000000090910473ffffffffffffffffffffffffffffffffffffffff169063c87b56dd90602401600060405180830381865afa1580156112a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105b69190810190612d6c565b6000806000806112e086611380565b9350935093509350610f258683868685600080546112fd90612bf8565b80601f016020809104026020016040519081016040528092919081815260200182805461132990612bf8565b80156113765780601f1061134b57610100808354040283529160200191611376565b820191906000526020600020905b81548152906001019060200180831161135957829003601f168201915b50505050506117c8565b6000806000806000600886610bb8811061139c5761139c612cfe565b60028104919091015460019091166010026101000a90046fffffffffffffffffffffffffffffffff169050806114145760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f74206578697374730000000000000000000000000000000060448201526064016106f5565b600780821697600383901c90911696506e03ffffffffffffffffffffffffffff600683901c169550909350915050565b606061144e612688565b60005b838110156115c557611461612688565b60001986015b6000198114611556576003880680156114f857806001146114bd576040518060400160405280600481526020017ff09f9fa90000000000000000000000000000000000000000000000000000000081525061152f565b6040518060400160405280600481526020017ff09f9fa80000000000000000000000000000000000000000000000000000000081525061152f565b6040518060400160405280600681526020017fe2ac9cefb88f00000000000000000000000000000000000000000000000000008152505b83836008811061154157611541612cfe565b60200201526003890498505060001901611467565b5080516020808301516040808501516060860151608087015160a088015160c089015160e08a015195516115969998959694959394929391929101612df6565b6040516020818303038152906040528383600881106115b7576115b7612cfe565b602002015250600101611451565b5080516020808301516040808501516060860151608087015160a088015160c089015160e08a015195516116059998959694959394929391929101612ec0565b6040516020818303038152906040529150509392505050565b73ffffffffffffffffffffffffffffffffffffffff82166116815760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016106f5565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156116f35760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e54454400000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060600061179b6117968787878761184f565b611865565b9050806040516020016117ae9190612f65565b604051602081830303815290604052915050949350505050565b606060006117db6117968888888861184f565b90506000836117e98a611a20565b6117f48a8a8a611444565b846040516020016118089493929190612faa565b604051602081830303815290604052905061182281611865565b60405160200161183291906131d3565b604051602081830303815290604052925050509695505050505050565b606061080c61186086868686611b5a565b611ec3565b606081516000141561188557505060408051602081019091526000815290565b6000604051806060016040528060408152602001613fd360409139905060006003845160026118b49190613218565b6118be9190613230565b6118c9906004613244565b905060006118d8826020613218565b67ffffffffffffffff8111156118f0576118f0612a9b565b6040519080825280601f01601f19166020018201604052801561191a576020820181803683370190505b509050818152600183018586518101602084015b81831015611986576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161192e565b6003895106600181146119a057600281146119ea57611a12565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152611a12565b7f3d000000000000000000000000000000000000000000000000000000000000006000198301525b509398975050505050505050565b606081611a6057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611a8a5780611a7481613263565b9150611a839050600a83613230565b9150611a64565b60008167ffffffffffffffff811115611aa557611aa5612a9b565b6040519080825280601f01601f191660200182016040528015611acf576020820181803683370190505b5090505b8415611b5257611ae460018361327e565b9150611af1600a86612cea565b611afc906030613218565b60f81b818381518110611b1157611b11612cfe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611b4b600a86613230565b9450611ad3565b949350505050565b611b626126b0565b60408051808201825283815260006020808301919091528784528381018790528383018690526101208401517f4538453444430000000000000000000000000000000000000000000000000000905282516080810190935260608084529192611bdc929091613f7390830139611bd783611f55565b611f9f565b6101208301517fffffffffffff00000000000000000000000000000000000000000000000000009190911660209182015260408051608081019091526060808252611c3192613f1390830139611bd783611f55565b6101208301517fffffffffffff000000000000000000000000000000000000000000000000000091909116604091820152805160608101909152602a808252611c8691906140136020830139611bd783611f55565b7fffffffffffff0000000000000000000000000000000000000000000000000000166101408301527f33333245323200000000000000000000000000000000000000000000000000006101608301525b60a08201516101008301516000611cec84611f55565b90506000805b89811015611d6157601e6008820284901c8190060160640281158015611d185750601981105b15611d21575060195b80868360088110611d3457611d34612cfe565b60200201818152508301925082858360088110611d5357611d53612cfe565b602002015250600101611cf2565b5060028160000381611d7557611d75612cbb565b05606087015250505060c083015190506000611d9083611f55565b90506000805b87811015611df257601e6008820284901c81900601606402600019890182148015611dc15750603781105b15611dca575060375b80858360088110611ddd57611ddd612cfe565b60200201819052929092019150600101611d96565b5060028160000381611e0657611e06612cbb565b056080860181905260608601516175306305f5e10091909201630529732c020501925050610bb882129050611e3b5750611e41565b50611cd6565b60e082015160005b85811015611eb8576000611e5c84611f55565b905060005b88811015611eae57606460286008830284901c0660140102848460088110611e8b57611e8b612cfe565b60200201518260088110611ea157611ea1612cfe565b6020020152600101611e61565b5050600101611e49565b505050949350505050565b60606000611ed083611fd7565b610160840151610140850151604051929350611eee92602001613295565b60408051808303601f190181528282528351602080860151938601516060870151608088015160a089015160c08a015160e08b0151979b50611f3e998c9997989596949593949293919201613751565b604051602081830303815290604052915050919050565b80516020808301805160018101909152604051600093611f819390929101918252602082015260400190565b60408051601f19818403018152919052805160209091012092915050565b6000806006845181611fb357611fb3612cbb565b048381611fc257611fc2612cbb565b60069190060293909301602001519392505050565b611fdf612688565b6000805b83604001518110156121ca57611ff7612688565b60008560c00151836008811061200f5761200f612cfe565b60200201519050600080600188602001510390505b600019811461215557600088610120015160038a600001518161204957612049612cbb565b066003811061205a5761205a612cfe565b6020020151905060008960a00151836008811061207957612079612cfe565b6020020151905060008a60e00151886008811061209857612098612cfe565b602002015184600881106120ae576120ae612cfe565b60200201519050600084156120e1578b610100015160018603600881106120d7576120d7612cfe565b60200201516120e4565b60005b8c6060015101905060008a8d60800151019050600060018e60400151038b14801561210d575086155b905061211e8383878c888b876121d1565b60018901988b906008811061213557612135612cfe565b602002015250508b51600390048c52505050600019919091019050612024565b5082516020808501516040808701516060880151608089015160a08a015160c08b015160e08c015195516121959998959694959394929391929101612ec0565b6040516020818303038152906040528685600881106121b6576121b6612cfe565b602002015250929092019150600101611fe3565b5050919050565b606061221b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6305f5e100630529732c8a8a010281900561753001906302faf0808b8b030205617d0001602083015281526175306305f5e100888b018a8101630529732c028290059290920191617d00908b036302faf080029190910501606083015260408201526305f5e100630529732c8a89018a89018181019290920283900561753001926302faf080919092030205617d000160a083015260808201526175306305f5e100878a01808c01630529732c028290059290920191617d00908c90036302faf0800291909105018260c0018360e001828152508281525050506000604051806101000160405280836000015181526020018784602001510381526020018360400151815260200187846060015103815260200183608001518152602001878460a001510381526020018360c001518152602001878460e00151038152509050600061236a8260000151612583565b6123778360200151612583565b6123848460400151612583565b6123918560600151612583565b61239e8660800151612583565b6123ab8760a00151612583565b6123b88860c00151612583565b6123c58960e00151612583565b8d6040516020016123de9998979695949392919061383a565b604051602081830303815290604052905060006123fe8360000151612583565b61240b8460200151612583565b6124188560c00151612583565b6124258660e00151612583565b6124328760800151612583565b61243f8860a00151612583565b61244c8a60a00151612583565b6124598b60c00151612583565b6124668c60e00151612583565b8c5161247190612583565b61247e8e60200151612583565b6040516020016124989b9a99989796959493929190613a39565b604051602081830303815290604052905080826040516020016124bc929190613df7565b604051602081830303815290604052945085156125745760008061253560028d058f0160027ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b08e01058f016305f5e100630529732c8284010281900561753001936302faf080939092039290920291909105617d000190565b915091508661254383612583565b61254e8c8403612583565b60405160200161256093929190613e26565b604051602081830303815290604052965050505b50505050979650505050505050565b600080821215801561259857506201869f8213155b6125a4576125a4613ee3565b50643030303030600a80830681840482900660081b176064840482900660101b176103e8840482900660181b176127109093040660201b919091170160d81b90565b8280546125f290612bf8565b90600052602060002090601f0160209004810192826126145760008555612678565b82601f1061264b578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555612678565b82800160010185558215612678579182015b8281111561267857823582559160200191906001019061265d565b5061268492915061272f565b5090565b6040518061010001604052806008905b60608152602001906001900390816126985790505090565b60405180610180016040528060008152602001600081526020016000815260200160008152602001600081526020016126e7612744565b81526020016126f4612744565b8152602001612701612763565b815260200161270e612744565b815260200161271b612791565b815260006020820181905260409091015290565b5b808211156126845760008155600101612730565b6040518061010001604052806008906020820280368337509192915050565b6040518061010001604052806008905b61277b612744565b8152602001906001900390816127735790505090565b60405180606001604052806003906020820280368337509192915050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146127dd57600080fd5b50565b6000602082840312156127f257600080fd5b81356127fd816127af565b9392505050565b60005b8381101561281f578181015183820152602001612807565b838111156112005750506000910152565b60008151808452612848816020860160208601612804565b601f01601f19169290920160200192915050565b6020815260006127fd6020830184612830565b60006020828403121561288157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146128ac57600080fd5b919050565b600080604083850312156128c457600080fd5b6128cd83612888565b946020939093013593505050565b6000602082840312156128ed57600080fd5b6127fd82612888565b60008060006060848603121561290b57600080fd5b61291484612888565b925061292260208501612888565b9150604084013590509250925092565b803580151581146128ac57600080fd5b60006020828403121561295457600080fd5b6127fd82612932565b60006020828403121561296f57600080fd5b81356fffffffffffffffffffffffffffffffff811681146127fd57600080fd5b6000602082840312156129a157600080fd5b813561ffff811681146127fd57600080fd5b600080604083850312156129c657600080fd5b6129cf83612888565b91506129dd60208401612932565b90509250929050565b60008083601f8401126129f857600080fd5b50813567ffffffffffffffff811115612a1057600080fd5b602083019150836020828501011115612a2857600080fd5b9250929050565b60008060008060408587031215612a4557600080fd5b843567ffffffffffffffff80821115612a5d57600080fd5b612a69888389016129e6565b90965094506020870135915080821115612a8257600080fd5b50612a8f878288016129e6565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612af357612af3612a9b565b604052919050565b600067ffffffffffffffff821115612b1557612b15612a9b565b50601f01601f191660200190565b60008060008060808587031215612b3957600080fd5b612b4285612888565b9350612b5060208601612888565b925060408501359150606085013567ffffffffffffffff811115612b7357600080fd5b8501601f81018713612b8457600080fd5b8035612b97612b9282612afb565b612aca565b818152886020838501011115612bac57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215612be157600080fd5b612bea83612888565b91506129dd60208401612888565b600181811c90821680612c0c57607f821691505b60208210811415612c46577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215612c5e57600080fd5b81516127fd816127af565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062ffffff80831681811415612cb157612cb1612c69565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612cf957612cf9612cbb565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152610f256080830184612830565b600060208284031215612d7e57600080fd5b815167ffffffffffffffff811115612d9557600080fd5b8201601f81018413612da657600080fd5b8051612db4612b9282612afb565b818152856020838501011115612dc957600080fd5b61080c826020830160208601612804565b60008151612dec818560208601612804565b9290920192915050565b600089516020612e098285838f01612804565b8a5191840191612e1c8184848f01612804565b8a51920191612e2e8184848e01612804565b8951920191612e408184848d01612804565b8851920191612e528184848c01612804565b8751920191612e648184848b01612804565b8651920191612e768184848a01612804565b8551920191612e888184848901612804565b7f5c6e0000000000000000000000000000000000000000000000000000000000009201918252506002019a9950505050505050505050565b600089516020612ed38285838f01612804565b8a5191840191612ee68184848f01612804565b8a51920191612ef88184848e01612804565b8951920191612f0a8184848d01612804565b8851920191612f1c8184848c01612804565b8751920191612f2e8184848b01612804565b8651920191612f408184848a01612804565b8551920191612f528184848901612804565b919091019b9a5050505050505050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612f9d81601a850160208701612804565b91909101601a0192915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000815260008551612fe2816009850160208a01612804565b7f2023000000000000000000000000000000000000000000000000000000000000600991840191820152855161301f81600b840160208a01612804565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600b92909101918201527f436f6d706c6574656c79206f6e2d636861696e2067656e657261746976652061601d8201527f727420636f6c6c656374696f6e2e2041727420697320756e697175656c792067603d8201527f656e657261746564206261736564206f6e20746865206d696e74657227732072605d8201527f6573756c7420696e206f75722072656272616e64696e672067616d652e204c69607d8201527f6d697465642065646974696f6e2e205c6e5c6e546865206d696e746572277320609d8201527f726573756c743a5c6e000000000000000000000000000000000000000000000060bd8201526131c861319f61319961317061314760c686018a612dda565b7f222c2022696d616765223a2022000000000000000000000000000000000000008152600d0190565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152601a0190565b86612dda565b7f227d000000000000000000000000000000000000000000000000000000000000815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161320b81601d850160208701612804565b91909101601d0192915050565b6000821982111561322b5761322b612c69565b500190565b60008261323f5761323f612cbb565b500490565b600081600019048311821515161561325e5761325e612c69565b500290565b600060001982141561327757613277612c69565b5060010190565b60008282101561329057613290612c69565b500390565b7f3c7376672076696577426f783d2230203020363030303020363030303022207881527f6d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766760208201527f223e3c6465663e3c672069643d226c6f676f222066696c6c3d2223333332453260408201527f3222207374726f6b652d77696474683d223022207472616e73666f726d3d227360608201527f63616c6528333529223e3c7061746820643d224d31382032306332203120322e60808201527f3320322e332e3620332e32533134203234203132203233632d322d312d322e3260a08201527f2d322e342d2e362d332e3273342e362d3120362e362e317a6d352e332031322e60c08201527f3663312e372d3120312e342d322e332d2e362d332e32732d352d312d362e352d60e08201527f2e322d312e3320322e332e3620332e326332203120342e38203120362e352e326101008201527f7a222f3e3c706174682066696c6c2d72756c653d226576656e6f64642220643d6101208201527f224d38302031392e354338342e3620312032392e322d332e3620313120382d386101408201527f2e372031372e3820312034382033352e372034342e34632e322e322e352e332e6101608201527f382e346c323320392e3863312e382e3820342e332e3720362d2e324c39392e386101808201527f20333563312e362d3120312e362d322e322e312d332e326c2d31392d3132632d6101a08201527f2e332d2e322d2e362d2e332d312d2e347a4d34382e362033344331362e3520356101c08201527f312d362e382032322e332031362031302e352031302032322037382031352e346101e08201527f2034382e362033347a6d34352e322d2e366c2d313320372e34632d332d312d396102008201527f2e382d362e372d31332e352d342e332d342e34203220362e3620352e3520382e6102208201527f3620374c37312034362e33632d332d312d31312d362e352d31342d342d332e386102408201527f203220372e3420352e3220392e3520362e366c2d3420322e334c34322e3820346102608201527f336c33352d31392e372031362031302e327a222f3e3c2f673e3c2f6465663e3c6102808201527f726563742077696474683d22363030303022206865696768743d2236303030306102a08201527f222066696c6c3d222300000000000000000000000000000000000000000000006102c08201527fffffffffffff000000000000000000000000000000000000000000000000000083166102c98201527f222f3e3c7265637420783d22323530302220793d2232353030222077696474686102cf8201527f3d22353530303022206865696768743d22353530303022207374726f6b653d226102ef8201527f2333333245323222207374726f6b652d77696474683d22323030222066696c6c61030f8201527f3d2223000000000000000000000000000000000000000000000000000000000061032f820152600061033282017fffffffffffff0000000000000000000000000000000000000000000000000000841681527f222f3e3c672066696c6c3d222333333245323222207374726f6b653d2223333360068201527f3245323222207374726f6b652d77696474683d22313030223e000000000000006026820152603f810161080c565b60008a51613763818460208f01612804565b8a516137758183860160208f01612804565b8a51918401019061378a818360208e01612804565b895161379c8183850160208e01612804565b89519290910101906137b2818360208c01612804565b87516137c48183850160208c01612804565b87519290910101906137da818360208a01612804565b85516137ec8183850160208a01612804565b8551929091010190613802818360208801612804565b7f3c2f673e3c2f7376673e000000000000000000000000000000000000000000009101908152600a019b9a5050505050505050505050565b7f3c7061746820643d224d0000000000000000000000000000000000000000000081527fffffffffff0000000000000000000000000000000000000000000000000000008a8116600a8301527f2c00000000000000000000000000000000000000000000000000000000000000600f83015289811660108301527f4c000000000000000000000000000000000000000000000000000000000000006015830152881660168201526000613913601b83017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff00000000000000000000000000000000000000000000000000000098891681527f4c000000000000000000000000000000000000000000000000000000000000006005820181905297891660068201527f2c00000000000000000000000000000000000000000000000000000000000000600b8201819052968916600c8201526011810197909752505091851660128501526017840192909252921660188201527f5a222066696c6c3d222300000000000000000000000000000000000000000000601d8201527fffffffffffff000000000000000000000000000000000000000000000000000090911660278201527f222f3e0000000000000000000000000000000000000000000000000000000000602d8201526030019392505050565b7f3c7061746820643d224d0000000000000000000000000000000000000000000081527fffffffffff0000000000000000000000000000000000000000000000000000008c8116600a8301527f2c00000000000000000000000000000000000000000000000000000000000000600f8301528b1660108201527f4c0000000000000000000000000000000000000000000000000000000000000060158201526000601682017fffffffffff0000000000000000000000000000000000000000000000000000008c1681526005613b348183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008d1681529150613b8a8183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008c1681529150613be08183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008b1681529150613c368183017f5600000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008a1681529150613c8c8183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000891681529150613ce28183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000881681529150613d388183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000871681529150613d8e8183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000861681529150613de48183017f5a222f3e00000000000000000000000000000000000000000000000000000000815260040190565b9f9e505050505050505050505050505050565b60008351613e09818460208801612804565b835190830190613e1d818360208801612804565b01949350505050565b60008451613e38818460208901612804565b7f3c75736520687265663d22236c6f676f2220783d2200000000000000000000009201918252507fffffffffff00000000000000000000000000000000000000000000000000000092831660158201527f2220793d22000000000000000000000000000000000000000000000000000000601a8201529116601f8201527f222f3e00000000000000000000000000000000000000000000000000000000006024820152602701919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfe4545363636364545363636363238413739313435363143433643433238323042393539343633394141303633394141304546384641333632334135334443353335374443353035333535353535353530393738453946424243314339324232383636383845453636383845454643424331384644424432454645353134454632353332444537414335324543364232353538433945444543364232353435374442364643443236353939393939394333423839464634414231333230383739334142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f464246354539464246354539464245434539463746324536454345424538454145414541463545454536a164736f6c634300080a000a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.