Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
99 QRU
Holders
42
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 QRULoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
QRyou
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.26; /// @title QRyou: a collection of on-chain writable qrcodes /// @author germyjohn import "./ERC721.sol"; import "./Counters.sol"; import "./Ownable.sol"; import "./IERC2981.sol"; import "./IERC4906.sol"; interface IstorageTools{ function read(address) external view returns (bytes memory); function bytesToUint16Array(bytes memory) external pure returns(uint16[] memory); function b64encode(bytes memory) external pure returns(string memory); } interface IgifBuilder{ function getImageBlock(uint8[] memory) external view returns(bytes memory); } interface IcensoredText{ function getCensoredText(bytes10) external view returns(string memory); } contract QRyou is ERC721, IERC2981, IERC4906, Ownable { using Counters for Counters.Counter; struct Token { bytes10 salt; bool locked; address writer; uint8 writeCount; bytes message; } address internal constant censoredTextAddress = 0x2aDF11840B50e4019b81F8AbC5F7de7E86A4337E; address internal constant toolsAddress = 0x744F25b06DEbc03a909c8CED93Fa121C6c47B773; address internal constant positionsAddress = 0x88462a7c26b8F9f88C7f8472E2bB1B76775964E0; address internal constant stencilAddress = 0xB3956Fa40418c5282f0D15881Ac374f6a7c371Fa; address internal constant gifLzwAddress = 0x4563C42456CA63f68e0dE8bc84dc7988F9D6950D; mapping(uint256 => Token) internal tokens; /// @notice the number of mints by given address mapping(address => uint256) public mintsBy; Counters.Counter private supply; /// @notice the value to be sent for each mint uint256 public mintFee = 0.0069 ether; /// @notice the number of mints allowed per address uint256 public constant maxMints = 10; /// @notice the max supply for this collection. may changed to a lower value by calling lockMint. uint256 public maxSupply = 4200; /// @notice minting state. toggled by toggleMint. bool public mintEnabled = false; uint256 royaltyPercent = 2; string public externalURL = "https://nometa.online/qryou"; string public constant description = "Writable qrcodes fully on-chained"; string internal constant nameStart = "QRyou #"; constructor() payable ERC721('QRyou','QRU') {} /* interface id for IERC2981: '0x2a55205a' */ /* interface id for IERC4906: '0x49064906' */ function supportsInterface(bytes4 interfaceId) public view override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC2981).interfaceId || interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId); } receive() external payable {} // token logic =================================================== modifier tokenExists(uint256 _tokenId) { require(_exists(_tokenId), "token does not exist"); _; } /// @notice returns the number of tokens in the collection function totalSupply() external view returns (uint256) { return supply.current(); } /// @notice Mint given number of tokens /// @param _mints The number of tokens to mint. Max 10. function mint(uint256 _mints) external payable { address msgSender = msg.sender; uint256 mints = _mints; unchecked { require((supply.current() + mints) <= maxSupply, "exceeds max supply"); if (msgSender != owner()) { require(msg.value == mints * mintFee, "invald value for tranasction"); require(mintEnabled, "minting is disabled"); } require((mintsBy[msgSender] + mints) <= maxMints, "mint limit of 10"); mintsBy[msgSender] += mints; for (uint256 count = 1; count <= mints; count++) { supply.increment(); uint256 tokenId = supply.current(); tokens[tokenId].salt = bytes10(keccak256(abi.encodePacked( tokenId, block.prevrandao ))); _safeMint(msgSender, tokenId); } } } /// @notice encode a message into a qrcode. a holder can write to any unlocked token /// @param _tokenId the token id to write to /// @param _message the message to encode. max 78 characters. function writeMessage(uint256 _tokenId, string memory _message) external tokenExists(_tokenId) { uint256 tokenId = _tokenId; bytes memory messageBytes = bytes(_message); Token storage thisToken = tokens[tokenId]; address writer = msg.sender; address tokenOwner = ownerOf(tokenId); require(messageBytes.length <= 78, "message too long"); if (thisToken.locked) { require(writer == tokenOwner, "only owner can write"); } else { require(balanceOf(writer) > 0, "only holders can write"); } thisToken.writer = (writer == tokenOwner) ? address(0) : writer; unchecked { thisToken.writeCount += 1; } thisToken.message = messageBytes; emit MetadataUpdate(tokenId); } /// @notice lock a token from being written by other token holders. this can not be undone. function lockPublicWrite(uint256 _tokenId) external tokenExists(_tokenId) { uint256 tokenId = _tokenId; Token storage thisToken = tokens[tokenId]; require(msg.sender == ownerOf(tokenId), "not the owner"); require(! thisToken.locked, "token is locked"); thisToken.locked = true; emit MetadataUpdate(tokenId); } /// @notice builds attributes to include in meatdata function getAttributes(uint256 _tokenId) internal view returns (string memory) { Token memory thisToken = tokens[_tokenId]; string memory attributes = '","attributes":[{"trait_type":"state","value":'; string memory lockedStr = thisToken.locked ? '"locked"}' : '"unlocked"}'; attributes = string.concat( attributes, lockedStr ); if (thisToken.writeCount > 0) { attributes = string.concat( attributes, ',{"trait_type":"writeCount","value":', Strings.toString(thisToken.writeCount), '}' ); } if (thisToken.writer != address(0)) { attributes = string.concat( attributes, ',{"trait_type":"messageFrom","value":"', string(getbyteStringAddress(thisToken.writer)), '"}' ); } return string.concat(attributes, "]" ); } /// @notice returns metadata for the token function tokenURI(uint256 _tokenId) public view virtual override tokenExists(_tokenId) returns (string memory) { uint256 tokenId = _tokenId; IstorageTools tools = IstorageTools(toolsAddress); return string.concat( 'data:application/json;base64,', tools.b64encode(bytes(string.concat( '{"name":"', getName(tokenId), /* nameStart, */ /* ' #', */ /* Strings.toString(tokenId), */ '","description":"', description, '","external_url":"', externalURL, getAttributes(tokenId), ',"image":"', packSvg(tokenId), '"}' ))) ); } function packSvg(uint256 _tokenId) internal view returns(string memory) { IstorageTools tools = IstorageTools(toolsAddress); Token memory thisToken = tokens[_tokenId]; string memory colour; if (thisToken.locked) { colour = 'c32'; } else if (thisToken.writeCount == 0) { colour = 'fff'; } else if (thisToken.writer == address(0)) { colour = '000'; } else { string[5] memory colours = ['e82', 'ed2', '0a1', '08d', '85b']; colour = colours[(tokens[_tokenId].writeCount - 1) % 5]; } return string.concat( "data:image/svg+xml;base64,", tools.b64encode(bytes(string.concat( '<svg id="q" width="740" height="740" xmlns="http://www.w3.org/2000/svg">', '<style>img{width:100%;height:100%;', 'image-rendering:pixelated;border-radius:14px;}</style>', '<rect rx="40" width="740" height="740" fill="#000"></rect>', '<rect rx="28" x="15" y="15" width="710" height="710" stroke="#', colour, '" stroke-width="10"></rect>', '<foreignObject width="656" height="656" x="42" y="42">', '<img xmlns="http://www.w3.org/1999/xhtml" src="data:image/gif;base64,', tools.b64encode(packGif(_tokenId)), '"/></foreignObject>', '<animate attributeName="opacity" dur="2.2s" from="1" to="0.999" ', 'repeatCount="indefinite"/>', '<script type="text/javascript"><![CDATA[', 'let q=document.getElementById("q");', 'q.style=`margin:${(q.parent == undefined)?"', 'calc((100vh - 740px)/2)":"0"} auto;background-color:#2e2e2e;`;]]>', '</script></svg>' ))) ); } function genImageBlock(uint256 _tokenId) internal view returns(bytes memory) { uint256 tokenId = _tokenId; bytes memory message = tokens[tokenId].message; /* if no message written */ if (message.length == 0) { message = bytes(IcensoredText(censoredTextAddress).getCensoredText(tokens[tokenId].salt)); } if (message.length == 0) { message = bytes.concat( bytes(getName(tokenId)), ' ', bytes(getbyteStringAddress(ownerOf(tokenId))) ); } uint8[] memory imageArray = getImageArray(addEcc(encodeMessage(message))); return IgifBuilder(gifLzwAddress).getImageBlock(imageArray); } // public only for testing function packGif(uint256 _tokenId) public view returns(bytes memory) { (bytes memory light, bytes memory dark, uint8[] memory glitches) = parseSalt(_tokenId); bytes memory imageBlock = genImageBlock(_tokenId); bytes1 bigTime = bytes1((glitches[0] % 3) + 1); return bytes.concat( hex'47494638396129002900f00000', light, dark, // aeb: repeat indefinitely hex'21FF0B4E45545343415045322E300301000000', // gce: 3 sec (2c01), disposal (packed 04) // 5 sec => f401 /* hex'21F90404f4010000', */ hex'21F90404', bytes1(glitches[0] << 4), bigTime, hex'0000', /* hex'010000', */ // id + code size hex'2C00000000290029000002', imageBlock, hex'00', // long invert 1st // gce: 0.4 sec (2800), disposal (packed 04) /* hex'21F9040428000000', */ hex'21F90404', bytes1((glitches[1] % 50) + 10), hex'000000', // id: last byte flags local colour table (80) hex'2C000000002900290080', dark, light, hex'02', // mincode imageBlock, hex'00', // gce: 0.1 sec (0a00), disposal (packed 04) hex'21F904040a000000', // id hex'2C00000000290029000002', this.glitch(imageBlock, glitches[2]), hex'00', // gce: 0.1 sec (0a00), disposal (packed 04) hex'21F904040a000000', // id hex'2C00000000290029000002', this.glitch(imageBlock, glitches[3]), hex'003b' ); } /// @notice this function is external only for the sake of slicing bytes function glitch(bytes calldata _imageBlock, uint8 _glitch) external pure returns(bytes memory) { uint8 position = (_glitch % 60) + 10; return bytes.concat( _imageBlock[:position], // might try ^ 85 bytes1(_glitch & 85), /* bytes1(hex'55'), */ _imageBlock[position+1:] ); } /// @notice parse stored salt as light, dark colours and values for glitches function parseSalt(uint256 _tokenId) internal view returns(bytes memory, bytes memory, uint8[] memory) { bytes10 salt = tokens[_tokenId].salt; uint8[] memory glitches = new uint8[](4); bytes memory light = ''; bytes memory dark = ''; uint16 contrast; //gen light uint8 count = 0; // saves 2514 gas unchecked { for (uint256 i=0; i<3; i++) { uint8 value = 255 - (uint8(salt[i]) % 90); uint8 rgb; if (value > 240) {rgb = 255;} else if (value < 200 && count < 2) { rgb = count == 0 || i == 2 ? 80:160; count++; } else rgb = value; contrast += rgb; light = bytes.concat(light, bytes1(rgb)); } // gen dark // determine black or colour from adding rgb count = 0; for (uint256 i=0; i<3; i++) { uint8 value = 0 + (uint8(salt[i+3]) % 70); uint8 rgb; if (contrast < 620) {rgb = 0;} else if (value > 40 && count < 2) { rgb = count == 0 || i == 0 ? 140 : 70; count++; } else rgb = value; dark = bytes.concat(dark, bytes1(rgb)); } for (uint256 i=0; i<4; i++) { glitches[i] = uint8(salt[i+6]); } } return (light, dark, glitches); } /// @notice prepares the message with the qrcode mode and appropriate padding function encodeMessage(bytes memory message) internal pure returns (uint8[] memory) { uint8[] memory md = new uint8[](80); uint8 length = uint8(message.length); // saves 23574 gas unchecked { md[0] = uint8((0x04 << 4) + (length >> 4)); md[1] = uint8((length << 4) + uint8(message[0] >> 4)); for (uint8 i=0; i<length-1; i++) { md[i+2] = uint8(message[i] << 4) + uint8(message[i+1] >> 4); } md[length+1] = uint8((message[length-1] << 4)); uint8[2] memory pad = [236,17]; // need to start with pad[0] uint8 padShift = (length+2) % 2; for (uint8 i=length+2; i<80; i++) { md[i] = pad[(i + padShift) % 2]; } } return md; } /// @notice generates the error correction codes function addEcc(uint8[] memory _message) internal pure returns(uint8[] memory) { uint256 genLen = 21; uint256 msgLen = 80; uint8[] memory mc = new uint8[](msgLen + genLen); uint8[21] memory ga = [0,17,60,79,50,61,163,26,187,202,180,221,225,83,239,156,164,212,212,188,190]; // create tables uint8[] memory exp = new uint8[](256); uint256[] memory log = new uint256[](256); // saves 709906 gas unchecked { // moved next line from above for (uint256 i ; i<msgLen; i++) { mc[i] = _message[i]; } for (uint8 i=0; i<8; i++) { exp[i] = uint8(1) << i; } for (uint256 i=8; i<256; i++) { exp[i] = (((exp[i - 4] ^ exp[i - 5]) ^ exp[i - 6]) ^ exp[i - 8]); } for (uint256 i=0; i<255; i++) { log[exp[i]] = i; } for (uint8 i=0; i<msgLen; i++) { uint8[] memory q = new uint8[](21); for (uint8 j; j<genLen; j++) { if (mc[i] == 0) break; q[j] = exp[(log[mc[i]] + ga[j]) % 255]; } for (uint8 j=1; j<genLen; j++) { mc[i+j] ^= q[j]; } // rewrite the original _message code to first position mc[i] = _message[i]; } } return mc; } //====================================================== function getImageArray(uint8[] memory _data) internal view returns(uint8[] memory) { IstorageTools tools = IstorageTools(toolsAddress); uint16[] memory positions = tools.bytesToUint16Array(tools.read(positionsAddress)); uint8[] memory imageArray = new uint8[](1681); uint16[] memory stencil = tools.bytesToUint16Array(tools.read(stencilAddress)); uint256 stencilLength = stencil.length; //153 uint16 count = 807; // unpack data bits and add to imageArray using positions uint8 bit; // saves 306566 gas unchecked { for (uint256 i=0; i<count; i++) { bit = (_data[i/8] >> (7-(i % 8))) % 2; // applying mask before placing if (positions[i] % 2 == 0) { bit ^= 1; } imageArray[positions[i]] = bit; } // apply stencil for (uint256 i=0; i<stencilLength; i++) { imageArray[stencil[i]] = 1; } } return imageArray; } // utilities function getName(uint256 _tokenId) internal pure returns(string memory) { return string.concat( nameStart, Strings.toString(_tokenId) ); } /// @notice converts an address to a hexadecimal string with leading 0x /// @param _address the address to convert /// @return address as a string function getbyteStringAddress(address _address) internal pure returns(bytes memory) { bytes memory addressBytes = abi.encodePacked(_address); bytes memory addressStringBytes = '0x'; bytes memory alphabet = "0123456789abcdef"; for (uint256 i=0; i<20; i++) { addressStringBytes = bytes.concat( addressStringBytes, alphabet[uint8(addressBytes[i] >> 4)], alphabet[uint8(addressBytes[i] & 0x0f)] ); } return addressStringBytes ; } /// @notice called with the sale price to determine how much royalty is owed and to whom. /// @param _tokenId the NFT asset queried for royalty information /// @param _salePrice the sale price of the NFT asset specified by _tokenId /// @return receiver address of who should be sent the royalty payment /// @return royaltyAmount the royalty payment amount for _salePrice function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view tokenExists(_tokenId) returns(address receiver, uint256 royaltyAmount) { return (owner(), _salePrice * royaltyPercent / 100); } /* owner control */ /// @notice Set the external address for metadata. onlyOwner /// @param _url The new external url. function setExternalURL(string calldata _url) external onlyOwner { externalURL = _url; } /// @notice Toggles bool mintEnabled function toggleMint() external onlyOwner { require(supply.current() < maxSupply, "minting has ended"); mintEnabled = !mintEnabled; } /// @notice will permanently disable minting. This cannot be undone. function lockMint() external onlyOwner { maxSupply = supply.current(); mintEnabled = false; } function withdraw() external onlyOwner { (bool success, ) = payable(owner()).call{value: address(this).balance}(""); require(success, "failed to withdraw"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // from: https://eips.ethereum.org/EIPS/eip-2981#simple-summary import "./IERC165.sol"; /// /// @dev Interface for the NFT Royalty Standard /// interface IERC2981 is IERC165 { /// ERC165 bytes to add to interface array - set in parent contract /// implementing this standard /// /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; /// _registerInterface(_INTERFACE_ID_ERC2981); /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _salePrice - the sale price of the NFT asset specified by _tokenId /// @return receiver - address of who should be sent the royalty payment /// @return royaltyAmount - the royalty payment amount for _salePrice function royaltyInfo( uint256 _tokenId, uint256 _salePrice ) external view returns ( address receiver, uint256 royaltyAmount ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; // from: https://eips.ethereum.org/EIPS/eip-4906 import "./IERC165.sol"; import "./IERC721.sol"; // interface id for IERC4906: '0x49064906' /// @title EIP-721 Metadata Update Extension interface IERC4906 is IERC165, IERC721 { /// @dev This event emits when the metadata of a token is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFT. event MetadataUpdate(uint256 _tokenId); /// @dev This event emits when the metadata of a range of tokens is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFTs. event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol 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); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"externalURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_imageBlock","type":"bytes"},{"internalType":"uint8","name":"_glitch","type":"uint8"}],"name":"glitch","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"lockPublicWrite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"packGif","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setExternalURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_message","type":"string"}],"name":"writeMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6618838370f34000600a55611068600b55600c805460ff191690556002600d5560c0604052601b60809081527f68747470733a2f2f6e6f6d6574612e6f6e6c696e652f7172796f75000000000060a052600e9061005c90826101bd565b50604051806040016040528060058152602001645152796f7560d81b8152506040518060400160405280600381526020016251525560e81b815250815f90816100a591906101bd565b5060016100b282826101bd565b5050506100cb6100c66100d060201b60201c565b6100d4565b610277565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061014d57607f821691505b60208210810361016b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101b857805f5260205f20601f840160051c810160208510156101965750805b601f840160051c820191505b818110156101b5575f81556001016101a2565b50505b505050565b81516001600160401b038111156101d6576101d6610125565b6101ea816101e48454610139565b84610171565b6020601f82116001811461021c575f83156102055750848201515b5f19600385901b1c1916600184901b1784556101b5565b5f84815260208120601f198516915b8281101561024b578785015182556020948501946001909201910161022b565b508482101561026857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b614844806102845f395ff3fe6080604052600436106101f4575f3560e01c806395d89b4111610108578063c87b56dd1161009d578063da084fd01161006d578063da084fd01461056c578063e0b6bb671461058b578063e985e9c51461059f578063f2fde38b146105be578063f6e5eea5146105dd575f80fd5b8063c87b56dd1461050b578063d12397301461052a578063d3dd5fe014610543578063d5abeb0114610557575f80fd5b8063a22cb465116100d8578063a22cb465146104a5578063b6b6f0c3146104c4578063b88d4fde146104d8578063b99edfb2146104f7575f80fd5b806395d89b41146104405780639be347a9146104545780639e1bd83b14610473578063a0712d6814610492575f80fd5b80632a55205a116101895780636352211e116101595780636352211e146103bd57806370a08231146103dc578063715018a6146103fb5780637284e4161461040f5780638da5cb5b14610423575f80fd5b80632a55205a14610321578063368660381461035f5780633ccfd60b1461038a57806342842e0e1461039e575f80fd5b8063095ea7b3116101c4578063095ea7b3146102ac57806313966db5146102cb57806318160ddd146102ee57806323b872dd14610302575f80fd5b806301dbcd4a146101ff57806301ffc9a71461022057806306fdde0314610254578063081812fc14610275575f80fd5b366101fb57005b5f80fd5b34801561020a575f80fd5b5061021e610219366004613559565b6105fc565b005b34801561022b575f80fd5b5061023f61023a3660046135ac565b610641565b60405190151581526020015b60405180910390f35b34801561025f575f80fd5b506102686106bc565b60405161024b91906135fc565b348015610280575f80fd5b5061029461028f36600461360e565b61074b565b6040516001600160a01b03909116815260200161024b565b3480156102b7575f80fd5b5061021e6102c6366004613640565b6107d1565b3480156102d6575f80fd5b506102e0600a5481565b60405190815260200161024b565b3480156102f9575f80fd5b506102e06108e0565b34801561030d575f80fd5b5061021e61031c366004613668565b6108ef565b34801561032c575f80fd5b5061034061033b3660046136a2565b610920565b604080516001600160a01b03909316835260208301919091520161024b565b34801561036a575f80fd5b506102e06103793660046136c2565b60086020525f908152604090205481565b348015610395575f80fd5b5061021e61097a565b3480156103a9575f80fd5b5061021e6103b8366004613668565b610a4c565b3480156103c8575f80fd5b506102946103d736600461360e565b610a66565b3480156103e7575f80fd5b506102e06103f63660046136c2565b610adc565b348015610406575f80fd5b5061021e610b61565b34801561041a575f80fd5b50610268610b96565b34801561042e575f80fd5b506006546001600160a01b0316610294565b34801561044b575f80fd5b50610268610bb2565b34801561045f575f80fd5b5061026861046e3660046136db565b610bc1565b34801561047e575f80fd5b5061026861048d36600461360e565b610c42565b61021e6104a036600461360e565b610e40565b3480156104b0575f80fd5b5061021e6104bf366004613732565b611057565b3480156104cf575f80fd5b506102e0600a81565b3480156104e3575f80fd5b5061021e6104f2366004613810565b611066565b348015610502575f80fd5b50610268611098565b348015610516575f80fd5b5061026861052536600461360e565b611124565b348015610535575f80fd5b50600c5461023f9060ff1681565b34801561054e575f80fd5b5061021e611248565b348015610562575f80fd5b506102e0600b5481565b348015610577575f80fd5b5061021e610586366004613886565b6112cd565b348015610596575f80fd5b5061021e6114f0565b3480156105aa575f80fd5b5061023f6105b93660046138dc565b61152c565b3480156105c9575f80fd5b5061021e6105d83660046136c2565b611559565b3480156105e8575f80fd5b5061021e6105f736600461360e565b6115f1565b6006546001600160a01b0316331461062f5760405162461bcd60e51b81526004016106269061390d565b60405180910390fd5b600e61063c8284836139bf565b505050565b5f6001600160e01b031982166380ac58cd60e01b148061067157506001600160e01b03198216635b5e139f60e01b145b8061068c57506001600160e01b0319821663152a902d60e11b145b806106a757506001600160e01b03198216632483248360e11b145b806106b657506106b68261171b565b92915050565b60605f80546106ca90613942565b80601f01602080910402602001604051908101604052809291908181526020018280546106f690613942565b80156107415780601f1061071857610100808354040283529160200191610741565b820191905f5260205f20905b81548152906001019060200180831161072457829003601f168201915b5050505050905090565b5f6107558261176a565b6107b65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610626565b505f908152600460205260409020546001600160a01b031690565b5f6107db82610a66565b9050806001600160a01b0316836001600160a01b0316036108485760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610626565b336001600160a01b03821614806108645750610864813361152c565b6108d65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610626565b61063c8383611786565b5f6108ea60095490565b905090565b6108f933826117f3565b6109155760405162461bcd60e51b815260040161062690613a78565b61063c8383836118bb565b5f808361092c8161176a565b6109485760405162461bcd60e51b815260040161062690613ac9565b6006546001600160a01b03166064600d54866109649190613b0b565b61096e9190613b36565b92509250509250929050565b6006546001600160a01b031633146109a45760405162461bcd60e51b81526004016106269061390d565b5f6109b76006546001600160a01b031690565b6001600160a01b0316476040515f6040518083038185875af1925050503d805f81146109fe576040519150601f19603f3d011682016040523d82523d5f602084013e610a03565b606091505b5050905080610a495760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610626565b50565b61063c83838360405180602001604052805f815250611066565b5f818152600260205260408120546001600160a01b0316806106b65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610626565b5f6001600160a01b038216610b465760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610626565b506001600160a01b03165f9081526003602052604090205490565b6006546001600160a01b03163314610b8b5760405162461bcd60e51b81526004016106269061390d565b610b945f611a53565b565b6040518060600160405280602181526020016147ee6021913981565b6060600180546106ca90613942565b60605f610bcf603c84613b49565b610bda90600a613b6a565b9050610beb60ff82165f8688613b83565b605560f81b60f886901b168787610c03866001613b6a565b60ff16908092610c1593929190613b83565b604051602001610c29959493929190613baa565b6040516020818303038152906040529150509392505050565b60605f805f610c5085611aa4565b9250925092505f610c6086611cf4565b90505f6003835f81518110610c7757610c77613bd6565b6020026020010151610c899190613b49565b610c94906001613b6a565b60f81b905084846004855f81518110610caf57610caf613bd6565b602002602001015160ff16901b60f81b8385603288600181518110610cd657610cd6613bd6565b6020026020010151610ce89190613b49565b610cf390600a613b6a565b60f81b898b89306001600160a01b0316639be347a98c8e600281518110610d1c57610d1c613bd6565b60200260200101516040518363ffffffff1660e01b8152600401610d41929190613bea565b5f60405180830381865afa158015610d5b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d829190810190613c44565b306001600160a01b0316639be347a98d8f600381518110610da557610da5613bd6565b60200260200101516040518363ffffffff1660e01b8152600401610dca929190613bea565b5f60405180830381865afa158015610de4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e0b9190810190613c44565b604051602001610e259b9a99989796959493929190613c9f565b60405160208183030381529060405295505050505050919050565b600b543390829081610e5160095490565b011115610e955760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b6044820152606401610626565b6006546001600160a01b03838116911614610f4557600a5481023414610efd5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c642076616c756520666f72207472616e61736374696f6e000000006044820152606401610626565b600c5460ff16610f455760405162461bcd60e51b81526020600482015260136024820152721b5a5b9d1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610626565b6001600160a01b0382165f90815260086020526040902054600a9082011115610fa35760405162461bcd60e51b815260206004820152601060248201526f06d696e74206c696d6974206f662031360841b6044820152606401610626565b6001600160a01b0382165f90815260086020526040902080548201905560015b81811161105157610fd8600980546001019055565b5f610fe260095490565b90508044604051602001611000929190918252602082015260400190565b60408051808303601f1901815291815281516020928301205f84815260079093529120805469ffffffffffffffffffff191660b09290921c9190911790556110488482611f1b565b50600101610fc3565b50505050565b611062338383611f34565b5050565b61107033836117f3565b61108c5760405162461bcd60e51b815260040161062690613a78565b61105184848484612001565b600e80546110a590613942565b80601f01602080910402602001604051908101604052809291908181526020018280546110d190613942565b801561111c5780601f106110f35761010080835404028352916020019161111c565b820191905f5260205f20905b8154815290600101906020018083116110ff57829003601f168201915b505050505081565b6060816111308161176a565b61114c5760405162461bcd60e51b815260040161062690613ac9565b8273744f25b06debc03a909c8ced93fa121c6c47b7738063227183d861117184612034565b6040518060600160405280602181526020016147ee60219139600e61119587612086565b61119e886122bb565b6040516020016111b2959493929190613e1b565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016111dd91906135fc565b5f60405180830381865afa1580156111f7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261121e9190810190613c44565b60405160200161122e9190613f31565b604051602081830303815290604052935050505b50919050565b6006546001600160a01b031633146112725760405162461bcd60e51b81526004016106269061390d565b600b54600954106112b95760405162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610626565b600c805460ff19811660ff90911615179055565b816112d78161176a565b6112f35760405162461bcd60e51b815260040161062690613ac9565b5f8381526007602052604081208491849190339061131085610a66565b9050604e845111156113575760405162461bcd60e51b815260206004820152601060248201526f6d65737361676520746f6f206c6f6e6760801b6044820152606401610626565b8254600160501b900460ff16156113c557806001600160a01b0316826001600160a01b0316146113c05760405162461bcd60e51b81526020600482015260146024820152736f6e6c79206f776e65722063616e20777269746560601b6044820152606401610626565b611415565b5f6113cf83610adc565b116114155760405162461bcd60e51b81526020600482015260166024820152756f6e6c7920686f6c646572732063616e20777269746560501b6044820152606401610626565b806001600160a01b0316826001600160a01b0316146114345781611436565b5f5b83546affffffffffffffffffffff81166001600160f81b03600160581b6001600160a01b039490941693909302928316176001600160f81b7fff0000000000000000000000000000000000000000ffffffffffffffffffffff90931690931782900460ff90811684011690910217845583016114b28582613f62565b506040518581527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050505050505050565b6006546001600160a01b0316331461151a5760405162461bcd60e51b81526004016106269061390d565b600954600b55600c805460ff19169055565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b031633146115835760405162461bcd60e51b81526004016106269061390d565b6001600160a01b0381166115e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610626565b610a4981611a53565b806115fb8161176a565b6116175760405162461bcd60e51b815260040161062690613ac9565b5f828152600760205260409020829061162f82610a66565b6001600160a01b0316336001600160a01b03161461167f5760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b6044820152606401610626565b8054600160501b900460ff16156116ca5760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b881a5cc81b1bd8dad959608a1b6044820152606401610626565b805460ff60501b1916600160501b1781556040517ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79061170d9084815260200190565b60405180910390a150505050565b5f6001600160e01b031982166380ac58cd60e01b148061174b57506001600160e01b03198216635b5e139f60e01b145b806106b657506301ffc9a760e01b6001600160e01b03198316146106b6565b5f908152600260205260409020546001600160a01b0316151590565b5f81815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117ba82610a66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f6117fd8261176a565b61185e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610626565b5f61186883610a66565b9050806001600160a01b0316846001600160a01b031614806118a35750836001600160a01b03166118988461074b565b6001600160a01b0316145b806118b357506118b3818561152c565b949350505050565b826001600160a01b03166118ce82610a66565b6001600160a01b0316146119325760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610626565b6001600160a01b0382166119945760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610626565b61199e5f82611786565b6001600160a01b0383165f9081526003602052604081208054600192906119c690849061401c565b90915550506001600160a01b0382165f9081526003602052604081208054600192906119f390849061402f565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81815260076020526040808220548151600480825260a082019093526060938493849360b01b9290816020016020820280368337505060408051602080820183525f808352835191820190935282815293945092915080805b6003811015611bc8575f605a8883600a8110611b1c57611b1c613bd6565b1a81611b2a57611b2a613b22565b0660ff0390505f60f08260ff161115611b45575060ff611b8e565b60c88260ff16108015611b5b575060028460ff16105b15611b8b5760ff84161580611b705750826002145b611b7b5760a0611b7e565b60505b6001909401939050611b8e565b50805b8060ff1685019450868160f81b604051602001611bac929190614042565b60408051808303601f1901815291905296505050600101611afe565b505f90505f5b6003811015611c8f575f60468883600301600a8110611bef57611bef613bd6565b1a81611bfd57611bfd613b22565b0690505f61026c61ffff86161015611c1657505f611c5d565b60288260ff16118015611c2c575060028460ff16105b15611c5a5760ff84161580611c3f575082155b611c4a576046611c4d565b608c5b6001909401939050611c5d565b50805b858160f81b604051602001611c73929190614042565b60408051808303601f1901815291905295505050600101611bce565b505f5b6004811015611ce3578681600601600a8110611cb057611cb0613bd6565b1a60f81b60f81c868281518110611cc957611cc9613bd6565b60ff90921660209283029190910190910152600101611c92565b509299919850929650945050505050565b5f818152600760205260408120600101805460609284929091611d1690613942565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4290613942565b8015611d8d5780601f10611d6457610100808354040283529160200191611d8d565b820191905f5260205f20905b815481529060010190602001808311611d7057829003601f168201915b5050505050905080515f03611e38575f8281526007602052604090819020549051635e214fe960e01b8152732adf11840b50e4019b81f8abc5f7de7e86a4337e91635e214fe991611df49160b01b906004016001600160b01b031991909116815260200190565b5f60405180830381865afa158015611e0e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e359190810190613c44565b90505b80515f03611e7d57611e4982612034565b611e5a611e5584610a66565b61264a565b604051602001611e6b929190614066565b60405160208183030381529060405290505b5f611e97611e92611e8d8461277f565b6129c8565b612e77565b6040516306480f1b60e21b8152909150734563c42456ca63f68e0de8bc84dc7988f9d6950d906319203c6c90611ed1908490600401614085565b5f60405180830381865afa158015611eeb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f129190810190613c44565b95945050505050565b611062828260405180602001604052805f8152506131b9565b816001600160a01b0316836001600160a01b031603611f955760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610626565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61200c8484846118bb565b612018848484846131eb565b6110515760405162461bcd60e51b8152600401610626906140ca565b6060604051806040016040528060078152602001665152796f75202360c81b81525061205f836132e8565b60405160200161207092919061411c565b6040516020818303038152906040529050919050565b5f818152600760209081526040808320815160a08101835281546001600160b01b031960b082901b16825260ff600160501b820481161515958301959095526001600160a01b03600160581b82041693820193909352600160f81b9092049092166060828101919091526001830180549194939160808401919061210990613942565b80601f016020809104026020016040519081016040528092919081815260200182805461213590613942565b80156121805780601f1061215757610100808354040283529160200191612180565b820191905f5260205f20905b81548152906001019060200180831161216357829003601f168201915b50505050508152505090505f6040518060600160405280602e81526020016147c0602e913990505f82602001516121da576040518060400160405280600b81526020016a22756e6c6f636b6564227d60a81b8152506121fd565b60405180604001604052806009815260200168226c6f636b6564227d60b81b8152505b9050818160405160200161221292919061411c565b60405160208183030381529060405291505f836060015160ff1611156122665781612243846060015160ff166132e8565b604051602001612254929190614130565b60405160208183030381529060405291505b60408301516001600160a01b0316156122aa5781612287846040015161264a565b60405160200161229892919061418b565b60405160208183030381529060405291505b8160405160200161122e91906141e9565b5f818152600760209081526040808320815160a08101835281546001600160b01b031960b082901b16825260ff600160501b820481161515958301959095526001600160a01b03600160581b82041693820193909352600160f81b909204909216606082810191909152600183018054919473744f25b06debc03a909c8ced93fa121c6c47b773949093929091608084019161235690613942565b80601f016020809104026020016040519081016040528092919081815260200182805461238290613942565b80156123cd5780601f106123a4576101008083540402835291602001916123cd565b820191905f5260205f20905b8154815290600101906020018083116123b057829003601f168201915b50505050508152505090506060816020015115612404575060408051808201909152600381526231999960e91b6020820152612545565b816060015160ff165f03612432575060408051808201909152600381526233333360e91b6020820152612545565b60408201516001600160a01b0316612464575060408051808201909152600381526203030360ec1b6020820152612545565b6040805160e081018252600360a0820181815262329c1960e91b60c08401528252825180840184528181526232b21960e91b60208083019190915280840191909152835180850185528281526230613160e81b818301528385015283518085018552828152620c0e1960ea1b81830152606084015283518085018552918252621c1ab160e91b8282015260808301919091525f88815260079091529190912054819060059061251f90600190600160f81b900460ff16614205565b6125299190613b49565b60ff166005811061253c5761253c613bd6565b60200201519150505b6001600160a01b03831663227183d88282826125608a610c42565b6040518263ffffffff1660e01b815260040161257c91906135fc565b5f60405180830381865afa158015612596573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125bd9190810190613c44565b6040516020016125ce92919061421e565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016125f991906135fc565b5f60405180830381865afa158015612613573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261263a9190810190613c44565b60405160200161122e9190614628565b604051606082811b6bffffffffffffffffffffffff19166020830152905f9060340160408051601f1981840301815282820182526002835261060f60f31b6020848101919091528251808401909352601083526f181899199a1a9b1b9c1cb0b131b232b360811b9083015292505f5b601481101561277557828260048684815181106126d8576126d8613bd6565b016020015182516001600160f81b031990911690911c60f81c90811061270057612700613bd6565b602001015160f81c60f81b8386848151811061271e5761271e613bd6565b602091010151815160f89190911c600f1690811061273e5761273e613bd6565b602001015160f81c60f81b60405160200161275b93929190614659565b60408051601f1981840301815291905292506001016126b9565b5090949350505050565b604080516050808252610a2082019092526060915f919060208201610a00803683370190505090505f8351905060048160ff16901c604001825f815181106127c9576127c9613bd6565b602002602001019060ff16908160ff16815250506004845f815181106127f1576127f1613bd6565b602001015160f81c60f81b6001600160f81b031916901c60f81c60048260ff16901b018260018151811061282757612827613bd6565b602002602001019060ff16908160ff16815250505f5b6001820360ff168160ff1610156128e6576004858260010160ff168151811061286857612868613bd6565b602001015160f81c60f81b6001600160f81b031916901c60f81c6004868360ff168151811061289957612899613bd6565b602001015160f81c60f81b6001600160f81b031916901b60f81c01838260020160ff16815181106128cc576128cc613bd6565b60ff9092166020928302919091019091015260010161283d565b506004846001830360ff168151811061290157612901613bd6565b602001015160f81c60f81b6001600160f81b031916901b60f81c828260010160ff168151811061293357612933613bd6565b60ff929092166020928302919091018201526040805180820190915260ec81526011918101919091526002820160018116905b60508160ff1610156129bd57826001838301166002811061298957612989613bd6565b6020020151858260ff16815181106129a3576129a3613bd6565b60ff90921660209283029190910190910152600101612966565b509295945050505050565b6060601560505f6129d9838361402f565b6001600160401b038111156129f0576129f061376b565b604051908082528060200260200182016040528015612a19578160200160208202803683370190505b50604080516102a0810182525f80825260116020830152603c82840152604f606083015260326080830152603d60a083015260a360c0830152601a60e083015260bb6101008084019190915260ca61012084015260b461014084015260dd61016084015260e161018084015260536101a084015260ef6101c0840152609c6101e084015260a461020084015260d4610220840181905261024084015260bc61026084015260be61028084015283518181526120208101909452939450909290919081602001602082028036833750506040805161010080825261202082019092529293505f92915060208201612000803683370190505090505f5b85811015612b6257888181518110612b2e57612b2e613bd6565b6020026020010151858281518110612b4857612b48613bd6565b60ff90921660209283029190910190910152600101612b14565b505f5b60088160ff161015612ba8578251600160ff831690811b918591908110612b8e57612b8e613bd6565b60ff90921660209283029190910190910152600101612b65565b5060085b610100811015612c5957826008820381518110612bcb57612bcb613bd6565b6020026020010151836006830381518110612be857612be8613bd6565b6020026020010151846005840381518110612c0557612c05613bd6565b6020026020010151856004850381518110612c2257612c22613bd6565b6020026020010151181818838281518110612c3f57612c3f613bd6565b60ff90921660209283029190910190910152600101612bac565b505f5b60ff811015612ca7578082848381518110612c7957612c79613bd6565b602002602001015160ff1681518110612c9457612c94613bd6565b6020908102919091010152600101612c5c565b505f5b858160ff161015612e6a576040805160158082526102c082019092525f91602082016102a0803683370190505090505f5b888160ff161015612dbc57868360ff1681518110612cfb57612cfb613bd6565b602002602001015160ff165f0315612dbc578460ff878360ff1660158110612d2557612d25613bd6565b602002015160ff16868a8760ff1681518110612d4357612d43613bd6565b602002602001015160ff1681518110612d5e57612d5e613bd6565b60200260200101510181612d7457612d74613b22565b0681518110612d8557612d85613bd6565b6020026020010151828260ff1681518110612da257612da2613bd6565b60ff90921660209283029190910190910152600101612cdb565b5060015b888160ff161015612e1c57818160ff1681518110612de057612de0613bd6565b60200260200101518782850160ff1681518110612dff57612dff613bd6565b6020908102919091010180519190911860ff169052600101612dc0565b50898260ff1681518110612e3257612e32613bd6565b6020026020010151868360ff1681518110612e4f57612e4f613bd6565b60ff9092166020928302919091019091015250600101612caa565b5092979650505050505050565b604051635043d43f60e11b81527388462a7c26b8f9f88c7f8472e2bb1b76775964e0600482015260609073744f25b06debc03a909c8ced93fa121c6c47b773905f908290632ed7fd6f90829063a087a87e906024015f60405180830381865afa158015612ee6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f0d9190810190613c44565b6040518263ffffffff1660e01b8152600401612f2991906135fc565b5f60405180830381865afa158015612f43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f6a9190810190614685565b6040805161069180825261d24082019092529192505f91906020820161d2208036833701905050604051635043d43f60e11b815273b3956fa40418c5282f0d15881ac374f6a7c371fa60048201529091505f906001600160a01b03851690632ed7fd6f90829063a087a87e906024015f60405180830381865afa158015612ff3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261301a9190810190613c44565b6040518263ffffffff1660e01b815260040161303691906135fc565b5f60405180830381865afa158015613050573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526130779190810190614685565b80519091506103275f805b8261ffff16811015613155576002600882066007038b60088404815181106130ac576130ac613bd6565b602002602001015160ff16901c60ff16816130c9576130c9613b22565b06915060028782815181106130e0576130e0613bd6565b602002602001015161ffff16816130f9576130f9613b22565b0661ffff165f0361310b576001821891505b818688838151811061311f5761311f613bd6565b602002602001015161ffff168151811061313b5761313b613bd6565b60ff90921660209283029190910190910152600101613082565b505f5b838110156131ab5760018686838151811061317557613175613bd6565b602002602001015161ffff168151811061319157613191613bd6565b60ff90921660209283029190910190910152600101613158565b509398975050505050505050565b6131c383836133e4565b6131cf5f8484846131eb565b61063c5760405162461bcd60e51b8152600401610626906140ca565b5f6001600160a01b0384163b156132dd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061322e90339089908890889060040161473d565b6020604051808303815f875af1925050508015613268575060408051601f3d908101601f1916820190925261326591810190614779565b60015b6132c3573d808015613295576040519150601f19603f3d011682016040523d82523d5f602084013e61329a565b606091505b5080515f036132bb5760405162461bcd60e51b8152600401610626906140ca565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118b3565b506001949350505050565b6060815f0361330e5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115613337578061332181614794565b91506133309050600a83613b36565b9150613311565b5f816001600160401b038111156133505761335061376b565b6040519080825280601f01601f19166020018201604052801561337a576020820181803683370190505b5090505b84156118b35761338f60018361401c565b915061339c600a866147ac565b6133a790603061402f565b60f81b8183815181106133bc576133bc613bd6565b60200101906001600160f81b03191690815f1a9053506133dd600a86613b36565b945061337e565b6001600160a01b03821661343a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610626565b6134438161176a565b156134905760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610626565b6001600160a01b0382165f9081526003602052604081208054600192906134b890849061402f565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8083601f840112613525575f80fd5b5081356001600160401b0381111561353b575f80fd5b602083019150836020828501011115613552575f80fd5b9250929050565b5f806020838503121561356a575f80fd5b82356001600160401b0381111561357f575f80fd5b61358b85828601613515565b90969095509350505050565b6001600160e01b031981168114610a49575f80fd5b5f602082840312156135bc575f80fd5b81356135c781613597565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6135c760208301846135ce565b5f6020828403121561361e575f80fd5b5035919050565b80356001600160a01b038116811461363b575f80fd5b919050565b5f8060408385031215613651575f80fd5b61365a83613625565b946020939093013593505050565b5f805f6060848603121561367a575f80fd5b61368384613625565b925061369160208501613625565b929592945050506040919091013590565b5f80604083850312156136b3575f80fd5b50508035926020909101359150565b5f602082840312156136d2575f80fd5b6135c782613625565b5f805f604084860312156136ed575f80fd5b83356001600160401b03811115613702575f80fd5b61370e86828701613515565b909450925050602084013560ff81168114613727575f80fd5b809150509250925092565b5f8060408385031215613743575f80fd5b61374c83613625565b915060208301358015158114613760575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156137a7576137a761376b565b604052919050565b5f6001600160401b038211156137c7576137c761376b565b50601f01601f191660200190565b5f6137e76137e2846137af565b61377f565b90508281528383830111156137fa575f80fd5b828260208301375f602084830101529392505050565b5f805f8060808587031215613823575f80fd5b61382c85613625565b935061383a60208601613625565b92506040850135915060608501356001600160401b0381111561385b575f80fd5b8501601f8101871361386b575f80fd5b61387a878235602084016137d5565b91505092959194509250565b5f8060408385031215613897575f80fd5b8235915060208301356001600160401b038111156138b3575f80fd5b8301601f810185136138c3575f80fd5b6138d2858235602084016137d5565b9150509250929050565b5f80604083850312156138ed575f80fd5b6138f683613625565b915061390460208401613625565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061395657607f821691505b60208210810361124257634e487b7160e01b5f52602260045260245ffd5b601f82111561063c57805f5260205f20601f840160051c810160208510156139995750805b601f840160051c820191505b818110156139b8575f81556001016139a5565b5050505050565b6001600160401b038311156139d6576139d661376b565b6139ea836139e48354613942565b83613974565b5f601f841160018114613a1b575f8515613a045750838201355b5f19600387901b1c1916600186901b1783556139b8565b5f83815260208120601f198716915b82811015613a4a5786850135825560209485019460019092019101613a2a565b5086821015613a66575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601490820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176106b6576106b6613af7565b634e487b7160e01b5f52601260045260245ffd5b5f82613b4457613b44613b22565b500490565b5f60ff831680613b5b57613b5b613b22565b8060ff84160691505092915050565b60ff81811683821601908111156106b6576106b6613af7565b5f8085851115613b91575f80fd5b83861115613b9d575f80fd5b5050820193919092039150565b848682375f85820160ff60f81b86168152838560018301375f9301600101928352509095945050505050565b634e487b7160e01b5f52603260045260245ffd5b604081525f613bfc60408301856135ce565b905060ff831660208301529392505050565b5f613c1b6137e2846137af565b9050828152838383011115613c2e575f80fd5b8282602083015e5f602084830101529392505050565b5f60208284031215613c54575f80fd5b81516001600160401b03811115613c69575f80fd5b8201601f81018413613c79575f80fd5b6118b384825160208401613c0e565b5f81518060208401855e5f93019283525090919050565b6a047494638396129002900f60ac1b81525f613cc7613cc1600d84018f613c88565b8d613c88565b6f21ff0b4e45545343415045322e30030160801b815263087e410160e21b60138201526001600160f81b03198c1660178201526001600160f81b03198b1660188201525f60198201526a160000000014801480000160a91b601b820152613d31602682018b613c88565b5f815263087e410160e21b600182015290506001600160f81b0319891660058201525f60068201526858000000005200520160b71b6009820152613d81613d7b601383018a613c88565b88613c88565b600160f91b81529050613d976001820187613c88565b5f81526410fc82020560d91b600182015290506a160000000014801480000160a91b6009820152613dcb6014820186613c88565b5f81526410fc82020560d91b600182015290506a160000000014801480000160a91b6009820152613dff6014820185613c88565b603b60f01b81526002019e9d5050505050505050505050505050565b683d913730b6b2911d1160b91b81525f613e386009830188613c88565b701116113232b9b1b934b83a34b7b7111d1160791b8152613e5c6011820188613c88565b90507111161132bc3a32b93730b62fbab936111d1160711b81525f8654613e8281613942565b600182168015613e995760018114613eb457613ee7565b60ff1983166012860152601282151583028601019350613ee7565b895f5260205f205f5b83811015613edc57815487820160120152600190910190602001613ebd565b505060128286010193505b505050613ef48187613c88565b915050613f0d8169161134b6b0b3b2911d1160b11b9052565b613f1a600a820185613c88565b61227d60f01b815260020198975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f6135c7601d830184613c88565b81516001600160401b03811115613f7b57613f7b61376b565b613f8f81613f898454613942565b84613974565b6020601f821160018114613fc1575f8315613faa5750848201515b5f19600385901b1c1916600184901b1784556139b8565b5f84815260208120601f198516915b82811015613ff05787850151825560209485019460019092019101613fd0565b508482101561400d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b818103818111156106b6576106b6613af7565b808201808211156106b6576106b6613af7565b5f61404d8285613c88565b6001600160f81b03199390931683525050600101919050565b5f6140718285613c88565b600160fd1b8152611f126001820185613c88565b602080825282518282018190525f918401906040840190835b818110156140bf57835160ff1683526020938401939092019160010161409e565b509095945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f6118b361412a8386613c88565b84613c88565b5f61413b8285613c88565b7f2c7b2274726169745f74797065223a227772697465436f756e74222c2276616c8152633ab2911d60e11b60208201526141786024820185613c88565b607d60f81b815260010195945050505050565b5f6141968285613c88565b7f2c7b2274726169745f74797065223a226d65737361676546726f6d222c227661815265363ab2911d1160d11b60208201526141d56026820185613c88565b61227d60f01b815260020195945050505050565b5f6141f48284613c88565b605d60f81b81526001019392505050565b60ff82811682821603908111156106b6576106b6613af7565b7f3c7376672069643d2271222077696474683d2237343022206865696768743d2281527f3734302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3230602082015267181817b9bb33911f60c11b60408201527f3c7374796c653e696d677b77696474683a313030253b6865696768743a313030604882015261253b60f01b60688201527f696d6167652d72656e646572696e673a706978656c617465643b626f72646572606a82019081527516b930b234bab99d189a383c1dbe9e17b9ba3cb6329f60511b608a8301525f9060a083016143a461439e61434f837f3c726563742072783d223430222077696474683d22373430222068656967687481527f3d22373430222066696c6c3d2223303030223e3c2f726563743e0000000000006020820152603a0190565b7f3c726563742072783d2232382220783d2231352220793d22313522207769647481527f683d2237313022206865696768743d2237313022207374726f6b653d222300006020820152603e0190565b87613c88565b9150506143d0817f22207374726f6b652d77696474683d223130223e3c2f726563743e00000000009052565b7f3c666f726569676e4f626a6563742077696474683d2236353622206865696768601b820152753a1e911b1a9b11103c1e911a1911103c9e911a19111f60511b603b8201527f3c696d6720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313960518201527f39392f7868746d6c22207372633d22646174613a696d6167652f6769663b62616071820152641cd94d8d0b60da1b609182015261447c6096820185613c88565b7211179f1e17b337b932b4b3b727b13532b1ba1f60691b81527f3c616e696d617465206174747269627574654e616d653d226f7061636974792260138201527f206475723d22322e3273222066726f6d3d22312220746f3d22302e393939222060338201527f726570656174436f756e743d22696e646566696e697465222f3e00000000000060538201527f3c73637269707420747970653d22746578742f6a617661736372697074223e3c606d82015267215b43444154415b60c01b608d8201527f6c657420713d646f63756d656e742e676574456c656d656e744279496428227160958201526222293b60e81b60b58201527f712e7374796c653d606d617267696e3a247b28712e706172656e74203d3d207560b88201526a373232b334b732b2149f9160a91b60d88201527f63616c6328283130307668202d203734307078292f3229223a2230227d20617560e38201527f746f3b6261636b67726f756e642d636f6c6f723a233265326532653b603b5d5d610103820152601f60f91b6101238201526e1e17b9b1b934b83a1f1e17b9bb339f60891b6101248201526101330195945050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525f6135c7601a830184613c88565b5f6146648286613c88565b6001600160f81b031994851681529290931660018301525060020192915050565b5f60208284031215614695575f80fd5b81516001600160401b038111156146aa575f80fd5b8201601f810184136146ba575f80fd5b80516001600160401b038111156146d3576146d361376b565b8060051b6146e36020820161377f565b918252602081840181019290810190878411156146fe575f80fd5b6020850194505b83851015614732578451925061ffff83168314614720575f80fd5b82825260209485019490910190614705565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061476f908301846135ce565b9695505050505050565b5f60208284031215614789575f80fd5b81516135c781613597565b5f600182016147a5576147a5613af7565b5060010190565b5f826147ba576147ba613b22565b50069056fe222c2261747472696275746573223a5b7b2274726169745f74797065223a227374617465222c2276616c7565223a5772697461626c65207172636f6465732066756c6c79206f6e2d636861696e6564a2646970667358221220d16749a3fa0636c1695a800ccb7755b0d8d531d56b296d439308bea9c602f85964736f6c634300081a0033
Deployed Bytecode
0x6080604052600436106101f4575f3560e01c806395d89b4111610108578063c87b56dd1161009d578063da084fd01161006d578063da084fd01461056c578063e0b6bb671461058b578063e985e9c51461059f578063f2fde38b146105be578063f6e5eea5146105dd575f80fd5b8063c87b56dd1461050b578063d12397301461052a578063d3dd5fe014610543578063d5abeb0114610557575f80fd5b8063a22cb465116100d8578063a22cb465146104a5578063b6b6f0c3146104c4578063b88d4fde146104d8578063b99edfb2146104f7575f80fd5b806395d89b41146104405780639be347a9146104545780639e1bd83b14610473578063a0712d6814610492575f80fd5b80632a55205a116101895780636352211e116101595780636352211e146103bd57806370a08231146103dc578063715018a6146103fb5780637284e4161461040f5780638da5cb5b14610423575f80fd5b80632a55205a14610321578063368660381461035f5780633ccfd60b1461038a57806342842e0e1461039e575f80fd5b8063095ea7b3116101c4578063095ea7b3146102ac57806313966db5146102cb57806318160ddd146102ee57806323b872dd14610302575f80fd5b806301dbcd4a146101ff57806301ffc9a71461022057806306fdde0314610254578063081812fc14610275575f80fd5b366101fb57005b5f80fd5b34801561020a575f80fd5b5061021e610219366004613559565b6105fc565b005b34801561022b575f80fd5b5061023f61023a3660046135ac565b610641565b60405190151581526020015b60405180910390f35b34801561025f575f80fd5b506102686106bc565b60405161024b91906135fc565b348015610280575f80fd5b5061029461028f36600461360e565b61074b565b6040516001600160a01b03909116815260200161024b565b3480156102b7575f80fd5b5061021e6102c6366004613640565b6107d1565b3480156102d6575f80fd5b506102e0600a5481565b60405190815260200161024b565b3480156102f9575f80fd5b506102e06108e0565b34801561030d575f80fd5b5061021e61031c366004613668565b6108ef565b34801561032c575f80fd5b5061034061033b3660046136a2565b610920565b604080516001600160a01b03909316835260208301919091520161024b565b34801561036a575f80fd5b506102e06103793660046136c2565b60086020525f908152604090205481565b348015610395575f80fd5b5061021e61097a565b3480156103a9575f80fd5b5061021e6103b8366004613668565b610a4c565b3480156103c8575f80fd5b506102946103d736600461360e565b610a66565b3480156103e7575f80fd5b506102e06103f63660046136c2565b610adc565b348015610406575f80fd5b5061021e610b61565b34801561041a575f80fd5b50610268610b96565b34801561042e575f80fd5b506006546001600160a01b0316610294565b34801561044b575f80fd5b50610268610bb2565b34801561045f575f80fd5b5061026861046e3660046136db565b610bc1565b34801561047e575f80fd5b5061026861048d36600461360e565b610c42565b61021e6104a036600461360e565b610e40565b3480156104b0575f80fd5b5061021e6104bf366004613732565b611057565b3480156104cf575f80fd5b506102e0600a81565b3480156104e3575f80fd5b5061021e6104f2366004613810565b611066565b348015610502575f80fd5b50610268611098565b348015610516575f80fd5b5061026861052536600461360e565b611124565b348015610535575f80fd5b50600c5461023f9060ff1681565b34801561054e575f80fd5b5061021e611248565b348015610562575f80fd5b506102e0600b5481565b348015610577575f80fd5b5061021e610586366004613886565b6112cd565b348015610596575f80fd5b5061021e6114f0565b3480156105aa575f80fd5b5061023f6105b93660046138dc565b61152c565b3480156105c9575f80fd5b5061021e6105d83660046136c2565b611559565b3480156105e8575f80fd5b5061021e6105f736600461360e565b6115f1565b6006546001600160a01b0316331461062f5760405162461bcd60e51b81526004016106269061390d565b60405180910390fd5b600e61063c8284836139bf565b505050565b5f6001600160e01b031982166380ac58cd60e01b148061067157506001600160e01b03198216635b5e139f60e01b145b8061068c57506001600160e01b0319821663152a902d60e11b145b806106a757506001600160e01b03198216632483248360e11b145b806106b657506106b68261171b565b92915050565b60605f80546106ca90613942565b80601f01602080910402602001604051908101604052809291908181526020018280546106f690613942565b80156107415780601f1061071857610100808354040283529160200191610741565b820191905f5260205f20905b81548152906001019060200180831161072457829003601f168201915b5050505050905090565b5f6107558261176a565b6107b65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610626565b505f908152600460205260409020546001600160a01b031690565b5f6107db82610a66565b9050806001600160a01b0316836001600160a01b0316036108485760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610626565b336001600160a01b03821614806108645750610864813361152c565b6108d65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610626565b61063c8383611786565b5f6108ea60095490565b905090565b6108f933826117f3565b6109155760405162461bcd60e51b815260040161062690613a78565b61063c8383836118bb565b5f808361092c8161176a565b6109485760405162461bcd60e51b815260040161062690613ac9565b6006546001600160a01b03166064600d54866109649190613b0b565b61096e9190613b36565b92509250509250929050565b6006546001600160a01b031633146109a45760405162461bcd60e51b81526004016106269061390d565b5f6109b76006546001600160a01b031690565b6001600160a01b0316476040515f6040518083038185875af1925050503d805f81146109fe576040519150601f19603f3d011682016040523d82523d5f602084013e610a03565b606091505b5050905080610a495760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610626565b50565b61063c83838360405180602001604052805f815250611066565b5f818152600260205260408120546001600160a01b0316806106b65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610626565b5f6001600160a01b038216610b465760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610626565b506001600160a01b03165f9081526003602052604090205490565b6006546001600160a01b03163314610b8b5760405162461bcd60e51b81526004016106269061390d565b610b945f611a53565b565b6040518060600160405280602181526020016147ee6021913981565b6060600180546106ca90613942565b60605f610bcf603c84613b49565b610bda90600a613b6a565b9050610beb60ff82165f8688613b83565b605560f81b60f886901b168787610c03866001613b6a565b60ff16908092610c1593929190613b83565b604051602001610c29959493929190613baa565b6040516020818303038152906040529150509392505050565b60605f805f610c5085611aa4565b9250925092505f610c6086611cf4565b90505f6003835f81518110610c7757610c77613bd6565b6020026020010151610c899190613b49565b610c94906001613b6a565b60f81b905084846004855f81518110610caf57610caf613bd6565b602002602001015160ff16901b60f81b8385603288600181518110610cd657610cd6613bd6565b6020026020010151610ce89190613b49565b610cf390600a613b6a565b60f81b898b89306001600160a01b0316639be347a98c8e600281518110610d1c57610d1c613bd6565b60200260200101516040518363ffffffff1660e01b8152600401610d41929190613bea565b5f60405180830381865afa158015610d5b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d829190810190613c44565b306001600160a01b0316639be347a98d8f600381518110610da557610da5613bd6565b60200260200101516040518363ffffffff1660e01b8152600401610dca929190613bea565b5f60405180830381865afa158015610de4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e0b9190810190613c44565b604051602001610e259b9a99989796959493929190613c9f565b60405160208183030381529060405295505050505050919050565b600b543390829081610e5160095490565b011115610e955760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b6044820152606401610626565b6006546001600160a01b03838116911614610f4557600a5481023414610efd5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c642076616c756520666f72207472616e61736374696f6e000000006044820152606401610626565b600c5460ff16610f455760405162461bcd60e51b81526020600482015260136024820152721b5a5b9d1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610626565b6001600160a01b0382165f90815260086020526040902054600a9082011115610fa35760405162461bcd60e51b815260206004820152601060248201526f06d696e74206c696d6974206f662031360841b6044820152606401610626565b6001600160a01b0382165f90815260086020526040902080548201905560015b81811161105157610fd8600980546001019055565b5f610fe260095490565b90508044604051602001611000929190918252602082015260400190565b60408051808303601f1901815291815281516020928301205f84815260079093529120805469ffffffffffffffffffff191660b09290921c9190911790556110488482611f1b565b50600101610fc3565b50505050565b611062338383611f34565b5050565b61107033836117f3565b61108c5760405162461bcd60e51b815260040161062690613a78565b61105184848484612001565b600e80546110a590613942565b80601f01602080910402602001604051908101604052809291908181526020018280546110d190613942565b801561111c5780601f106110f35761010080835404028352916020019161111c565b820191905f5260205f20905b8154815290600101906020018083116110ff57829003601f168201915b505050505081565b6060816111308161176a565b61114c5760405162461bcd60e51b815260040161062690613ac9565b8273744f25b06debc03a909c8ced93fa121c6c47b7738063227183d861117184612034565b6040518060600160405280602181526020016147ee60219139600e61119587612086565b61119e886122bb565b6040516020016111b2959493929190613e1b565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016111dd91906135fc565b5f60405180830381865afa1580156111f7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261121e9190810190613c44565b60405160200161122e9190613f31565b604051602081830303815290604052935050505b50919050565b6006546001600160a01b031633146112725760405162461bcd60e51b81526004016106269061390d565b600b54600954106112b95760405162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610626565b600c805460ff19811660ff90911615179055565b816112d78161176a565b6112f35760405162461bcd60e51b815260040161062690613ac9565b5f8381526007602052604081208491849190339061131085610a66565b9050604e845111156113575760405162461bcd60e51b815260206004820152601060248201526f6d65737361676520746f6f206c6f6e6760801b6044820152606401610626565b8254600160501b900460ff16156113c557806001600160a01b0316826001600160a01b0316146113c05760405162461bcd60e51b81526020600482015260146024820152736f6e6c79206f776e65722063616e20777269746560601b6044820152606401610626565b611415565b5f6113cf83610adc565b116114155760405162461bcd60e51b81526020600482015260166024820152756f6e6c7920686f6c646572732063616e20777269746560501b6044820152606401610626565b806001600160a01b0316826001600160a01b0316146114345781611436565b5f5b83546affffffffffffffffffffff81166001600160f81b03600160581b6001600160a01b039490941693909302928316176001600160f81b7fff0000000000000000000000000000000000000000ffffffffffffffffffffff90931690931782900460ff90811684011690910217845583016114b28582613f62565b506040518581527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050505050505050565b6006546001600160a01b0316331461151a5760405162461bcd60e51b81526004016106269061390d565b600954600b55600c805460ff19169055565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b031633146115835760405162461bcd60e51b81526004016106269061390d565b6001600160a01b0381166115e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610626565b610a4981611a53565b806115fb8161176a565b6116175760405162461bcd60e51b815260040161062690613ac9565b5f828152600760205260409020829061162f82610a66565b6001600160a01b0316336001600160a01b03161461167f5760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b6044820152606401610626565b8054600160501b900460ff16156116ca5760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b881a5cc81b1bd8dad959608a1b6044820152606401610626565b805460ff60501b1916600160501b1781556040517ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79061170d9084815260200190565b60405180910390a150505050565b5f6001600160e01b031982166380ac58cd60e01b148061174b57506001600160e01b03198216635b5e139f60e01b145b806106b657506301ffc9a760e01b6001600160e01b03198316146106b6565b5f908152600260205260409020546001600160a01b0316151590565b5f81815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117ba82610a66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f6117fd8261176a565b61185e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610626565b5f61186883610a66565b9050806001600160a01b0316846001600160a01b031614806118a35750836001600160a01b03166118988461074b565b6001600160a01b0316145b806118b357506118b3818561152c565b949350505050565b826001600160a01b03166118ce82610a66565b6001600160a01b0316146119325760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610626565b6001600160a01b0382166119945760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610626565b61199e5f82611786565b6001600160a01b0383165f9081526003602052604081208054600192906119c690849061401c565b90915550506001600160a01b0382165f9081526003602052604081208054600192906119f390849061402f565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81815260076020526040808220548151600480825260a082019093526060938493849360b01b9290816020016020820280368337505060408051602080820183525f808352835191820190935282815293945092915080805b6003811015611bc8575f605a8883600a8110611b1c57611b1c613bd6565b1a81611b2a57611b2a613b22565b0660ff0390505f60f08260ff161115611b45575060ff611b8e565b60c88260ff16108015611b5b575060028460ff16105b15611b8b5760ff84161580611b705750826002145b611b7b5760a0611b7e565b60505b6001909401939050611b8e565b50805b8060ff1685019450868160f81b604051602001611bac929190614042565b60408051808303601f1901815291905296505050600101611afe565b505f90505f5b6003811015611c8f575f60468883600301600a8110611bef57611bef613bd6565b1a81611bfd57611bfd613b22565b0690505f61026c61ffff86161015611c1657505f611c5d565b60288260ff16118015611c2c575060028460ff16105b15611c5a5760ff84161580611c3f575082155b611c4a576046611c4d565b608c5b6001909401939050611c5d565b50805b858160f81b604051602001611c73929190614042565b60408051808303601f1901815291905295505050600101611bce565b505f5b6004811015611ce3578681600601600a8110611cb057611cb0613bd6565b1a60f81b60f81c868281518110611cc957611cc9613bd6565b60ff90921660209283029190910190910152600101611c92565b509299919850929650945050505050565b5f818152600760205260408120600101805460609284929091611d1690613942565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4290613942565b8015611d8d5780601f10611d6457610100808354040283529160200191611d8d565b820191905f5260205f20905b815481529060010190602001808311611d7057829003601f168201915b5050505050905080515f03611e38575f8281526007602052604090819020549051635e214fe960e01b8152732adf11840b50e4019b81f8abc5f7de7e86a4337e91635e214fe991611df49160b01b906004016001600160b01b031991909116815260200190565b5f60405180830381865afa158015611e0e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e359190810190613c44565b90505b80515f03611e7d57611e4982612034565b611e5a611e5584610a66565b61264a565b604051602001611e6b929190614066565b60405160208183030381529060405290505b5f611e97611e92611e8d8461277f565b6129c8565b612e77565b6040516306480f1b60e21b8152909150734563c42456ca63f68e0de8bc84dc7988f9d6950d906319203c6c90611ed1908490600401614085565b5f60405180830381865afa158015611eeb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f129190810190613c44565b95945050505050565b611062828260405180602001604052805f8152506131b9565b816001600160a01b0316836001600160a01b031603611f955760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610626565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61200c8484846118bb565b612018848484846131eb565b6110515760405162461bcd60e51b8152600401610626906140ca565b6060604051806040016040528060078152602001665152796f75202360c81b81525061205f836132e8565b60405160200161207092919061411c565b6040516020818303038152906040529050919050565b5f818152600760209081526040808320815160a08101835281546001600160b01b031960b082901b16825260ff600160501b820481161515958301959095526001600160a01b03600160581b82041693820193909352600160f81b9092049092166060828101919091526001830180549194939160808401919061210990613942565b80601f016020809104026020016040519081016040528092919081815260200182805461213590613942565b80156121805780601f1061215757610100808354040283529160200191612180565b820191905f5260205f20905b81548152906001019060200180831161216357829003601f168201915b50505050508152505090505f6040518060600160405280602e81526020016147c0602e913990505f82602001516121da576040518060400160405280600b81526020016a22756e6c6f636b6564227d60a81b8152506121fd565b60405180604001604052806009815260200168226c6f636b6564227d60b81b8152505b9050818160405160200161221292919061411c565b60405160208183030381529060405291505f836060015160ff1611156122665781612243846060015160ff166132e8565b604051602001612254929190614130565b60405160208183030381529060405291505b60408301516001600160a01b0316156122aa5781612287846040015161264a565b60405160200161229892919061418b565b60405160208183030381529060405291505b8160405160200161122e91906141e9565b5f818152600760209081526040808320815160a08101835281546001600160b01b031960b082901b16825260ff600160501b820481161515958301959095526001600160a01b03600160581b82041693820193909352600160f81b909204909216606082810191909152600183018054919473744f25b06debc03a909c8ced93fa121c6c47b773949093929091608084019161235690613942565b80601f016020809104026020016040519081016040528092919081815260200182805461238290613942565b80156123cd5780601f106123a4576101008083540402835291602001916123cd565b820191905f5260205f20905b8154815290600101906020018083116123b057829003601f168201915b50505050508152505090506060816020015115612404575060408051808201909152600381526231999960e91b6020820152612545565b816060015160ff165f03612432575060408051808201909152600381526233333360e91b6020820152612545565b60408201516001600160a01b0316612464575060408051808201909152600381526203030360ec1b6020820152612545565b6040805160e081018252600360a0820181815262329c1960e91b60c08401528252825180840184528181526232b21960e91b60208083019190915280840191909152835180850185528281526230613160e81b818301528385015283518085018552828152620c0e1960ea1b81830152606084015283518085018552918252621c1ab160e91b8282015260808301919091525f88815260079091529190912054819060059061251f90600190600160f81b900460ff16614205565b6125299190613b49565b60ff166005811061253c5761253c613bd6565b60200201519150505b6001600160a01b03831663227183d88282826125608a610c42565b6040518263ffffffff1660e01b815260040161257c91906135fc565b5f60405180830381865afa158015612596573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125bd9190810190613c44565b6040516020016125ce92919061421e565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016125f991906135fc565b5f60405180830381865afa158015612613573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261263a9190810190613c44565b60405160200161122e9190614628565b604051606082811b6bffffffffffffffffffffffff19166020830152905f9060340160408051601f1981840301815282820182526002835261060f60f31b6020848101919091528251808401909352601083526f181899199a1a9b1b9c1cb0b131b232b360811b9083015292505f5b601481101561277557828260048684815181106126d8576126d8613bd6565b016020015182516001600160f81b031990911690911c60f81c90811061270057612700613bd6565b602001015160f81c60f81b8386848151811061271e5761271e613bd6565b602091010151815160f89190911c600f1690811061273e5761273e613bd6565b602001015160f81c60f81b60405160200161275b93929190614659565b60408051601f1981840301815291905292506001016126b9565b5090949350505050565b604080516050808252610a2082019092526060915f919060208201610a00803683370190505090505f8351905060048160ff16901c604001825f815181106127c9576127c9613bd6565b602002602001019060ff16908160ff16815250506004845f815181106127f1576127f1613bd6565b602001015160f81c60f81b6001600160f81b031916901c60f81c60048260ff16901b018260018151811061282757612827613bd6565b602002602001019060ff16908160ff16815250505f5b6001820360ff168160ff1610156128e6576004858260010160ff168151811061286857612868613bd6565b602001015160f81c60f81b6001600160f81b031916901c60f81c6004868360ff168151811061289957612899613bd6565b602001015160f81c60f81b6001600160f81b031916901b60f81c01838260020160ff16815181106128cc576128cc613bd6565b60ff9092166020928302919091019091015260010161283d565b506004846001830360ff168151811061290157612901613bd6565b602001015160f81c60f81b6001600160f81b031916901b60f81c828260010160ff168151811061293357612933613bd6565b60ff929092166020928302919091018201526040805180820190915260ec81526011918101919091526002820160018116905b60508160ff1610156129bd57826001838301166002811061298957612989613bd6565b6020020151858260ff16815181106129a3576129a3613bd6565b60ff90921660209283029190910190910152600101612966565b509295945050505050565b6060601560505f6129d9838361402f565b6001600160401b038111156129f0576129f061376b565b604051908082528060200260200182016040528015612a19578160200160208202803683370190505b50604080516102a0810182525f80825260116020830152603c82840152604f606083015260326080830152603d60a083015260a360c0830152601a60e083015260bb6101008084019190915260ca61012084015260b461014084015260dd61016084015260e161018084015260536101a084015260ef6101c0840152609c6101e084015260a461020084015260d4610220840181905261024084015260bc61026084015260be61028084015283518181526120208101909452939450909290919081602001602082028036833750506040805161010080825261202082019092529293505f92915060208201612000803683370190505090505f5b85811015612b6257888181518110612b2e57612b2e613bd6565b6020026020010151858281518110612b4857612b48613bd6565b60ff90921660209283029190910190910152600101612b14565b505f5b60088160ff161015612ba8578251600160ff831690811b918591908110612b8e57612b8e613bd6565b60ff90921660209283029190910190910152600101612b65565b5060085b610100811015612c5957826008820381518110612bcb57612bcb613bd6565b6020026020010151836006830381518110612be857612be8613bd6565b6020026020010151846005840381518110612c0557612c05613bd6565b6020026020010151856004850381518110612c2257612c22613bd6565b6020026020010151181818838281518110612c3f57612c3f613bd6565b60ff90921660209283029190910190910152600101612bac565b505f5b60ff811015612ca7578082848381518110612c7957612c79613bd6565b602002602001015160ff1681518110612c9457612c94613bd6565b6020908102919091010152600101612c5c565b505f5b858160ff161015612e6a576040805160158082526102c082019092525f91602082016102a0803683370190505090505f5b888160ff161015612dbc57868360ff1681518110612cfb57612cfb613bd6565b602002602001015160ff165f0315612dbc578460ff878360ff1660158110612d2557612d25613bd6565b602002015160ff16868a8760ff1681518110612d4357612d43613bd6565b602002602001015160ff1681518110612d5e57612d5e613bd6565b60200260200101510181612d7457612d74613b22565b0681518110612d8557612d85613bd6565b6020026020010151828260ff1681518110612da257612da2613bd6565b60ff90921660209283029190910190910152600101612cdb565b5060015b888160ff161015612e1c57818160ff1681518110612de057612de0613bd6565b60200260200101518782850160ff1681518110612dff57612dff613bd6565b6020908102919091010180519190911860ff169052600101612dc0565b50898260ff1681518110612e3257612e32613bd6565b6020026020010151868360ff1681518110612e4f57612e4f613bd6565b60ff9092166020928302919091019091015250600101612caa565b5092979650505050505050565b604051635043d43f60e11b81527388462a7c26b8f9f88c7f8472e2bb1b76775964e0600482015260609073744f25b06debc03a909c8ced93fa121c6c47b773905f908290632ed7fd6f90829063a087a87e906024015f60405180830381865afa158015612ee6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f0d9190810190613c44565b6040518263ffffffff1660e01b8152600401612f2991906135fc565b5f60405180830381865afa158015612f43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f6a9190810190614685565b6040805161069180825261d24082019092529192505f91906020820161d2208036833701905050604051635043d43f60e11b815273b3956fa40418c5282f0d15881ac374f6a7c371fa60048201529091505f906001600160a01b03851690632ed7fd6f90829063a087a87e906024015f60405180830381865afa158015612ff3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261301a9190810190613c44565b6040518263ffffffff1660e01b815260040161303691906135fc565b5f60405180830381865afa158015613050573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526130779190810190614685565b80519091506103275f805b8261ffff16811015613155576002600882066007038b60088404815181106130ac576130ac613bd6565b602002602001015160ff16901c60ff16816130c9576130c9613b22565b06915060028782815181106130e0576130e0613bd6565b602002602001015161ffff16816130f9576130f9613b22565b0661ffff165f0361310b576001821891505b818688838151811061311f5761311f613bd6565b602002602001015161ffff168151811061313b5761313b613bd6565b60ff90921660209283029190910190910152600101613082565b505f5b838110156131ab5760018686838151811061317557613175613bd6565b602002602001015161ffff168151811061319157613191613bd6565b60ff90921660209283029190910190910152600101613158565b509398975050505050505050565b6131c383836133e4565b6131cf5f8484846131eb565b61063c5760405162461bcd60e51b8152600401610626906140ca565b5f6001600160a01b0384163b156132dd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061322e90339089908890889060040161473d565b6020604051808303815f875af1925050508015613268575060408051601f3d908101601f1916820190925261326591810190614779565b60015b6132c3573d808015613295576040519150601f19603f3d011682016040523d82523d5f602084013e61329a565b606091505b5080515f036132bb5760405162461bcd60e51b8152600401610626906140ca565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118b3565b506001949350505050565b6060815f0361330e5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115613337578061332181614794565b91506133309050600a83613b36565b9150613311565b5f816001600160401b038111156133505761335061376b565b6040519080825280601f01601f19166020018201604052801561337a576020820181803683370190505b5090505b84156118b35761338f60018361401c565b915061339c600a866147ac565b6133a790603061402f565b60f81b8183815181106133bc576133bc613bd6565b60200101906001600160f81b03191690815f1a9053506133dd600a86613b36565b945061337e565b6001600160a01b03821661343a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610626565b6134438161176a565b156134905760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610626565b6001600160a01b0382165f9081526003602052604081208054600192906134b890849061402f565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8083601f840112613525575f80fd5b5081356001600160401b0381111561353b575f80fd5b602083019150836020828501011115613552575f80fd5b9250929050565b5f806020838503121561356a575f80fd5b82356001600160401b0381111561357f575f80fd5b61358b85828601613515565b90969095509350505050565b6001600160e01b031981168114610a49575f80fd5b5f602082840312156135bc575f80fd5b81356135c781613597565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6135c760208301846135ce565b5f6020828403121561361e575f80fd5b5035919050565b80356001600160a01b038116811461363b575f80fd5b919050565b5f8060408385031215613651575f80fd5b61365a83613625565b946020939093013593505050565b5f805f6060848603121561367a575f80fd5b61368384613625565b925061369160208501613625565b929592945050506040919091013590565b5f80604083850312156136b3575f80fd5b50508035926020909101359150565b5f602082840312156136d2575f80fd5b6135c782613625565b5f805f604084860312156136ed575f80fd5b83356001600160401b03811115613702575f80fd5b61370e86828701613515565b909450925050602084013560ff81168114613727575f80fd5b809150509250925092565b5f8060408385031215613743575f80fd5b61374c83613625565b915060208301358015158114613760575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156137a7576137a761376b565b604052919050565b5f6001600160401b038211156137c7576137c761376b565b50601f01601f191660200190565b5f6137e76137e2846137af565b61377f565b90508281528383830111156137fa575f80fd5b828260208301375f602084830101529392505050565b5f805f8060808587031215613823575f80fd5b61382c85613625565b935061383a60208601613625565b92506040850135915060608501356001600160401b0381111561385b575f80fd5b8501601f8101871361386b575f80fd5b61387a878235602084016137d5565b91505092959194509250565b5f8060408385031215613897575f80fd5b8235915060208301356001600160401b038111156138b3575f80fd5b8301601f810185136138c3575f80fd5b6138d2858235602084016137d5565b9150509250929050565b5f80604083850312156138ed575f80fd5b6138f683613625565b915061390460208401613625565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061395657607f821691505b60208210810361124257634e487b7160e01b5f52602260045260245ffd5b601f82111561063c57805f5260205f20601f840160051c810160208510156139995750805b601f840160051c820191505b818110156139b8575f81556001016139a5565b5050505050565b6001600160401b038311156139d6576139d661376b565b6139ea836139e48354613942565b83613974565b5f601f841160018114613a1b575f8515613a045750838201355b5f19600387901b1c1916600186901b1783556139b8565b5f83815260208120601f198716915b82811015613a4a5786850135825560209485019460019092019101613a2a565b5086821015613a66575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601490820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176106b6576106b6613af7565b634e487b7160e01b5f52601260045260245ffd5b5f82613b4457613b44613b22565b500490565b5f60ff831680613b5b57613b5b613b22565b8060ff84160691505092915050565b60ff81811683821601908111156106b6576106b6613af7565b5f8085851115613b91575f80fd5b83861115613b9d575f80fd5b5050820193919092039150565b848682375f85820160ff60f81b86168152838560018301375f9301600101928352509095945050505050565b634e487b7160e01b5f52603260045260245ffd5b604081525f613bfc60408301856135ce565b905060ff831660208301529392505050565b5f613c1b6137e2846137af565b9050828152838383011115613c2e575f80fd5b8282602083015e5f602084830101529392505050565b5f60208284031215613c54575f80fd5b81516001600160401b03811115613c69575f80fd5b8201601f81018413613c79575f80fd5b6118b384825160208401613c0e565b5f81518060208401855e5f93019283525090919050565b6a047494638396129002900f60ac1b81525f613cc7613cc1600d84018f613c88565b8d613c88565b6f21ff0b4e45545343415045322e30030160801b815263087e410160e21b60138201526001600160f81b03198c1660178201526001600160f81b03198b1660188201525f60198201526a160000000014801480000160a91b601b820152613d31602682018b613c88565b5f815263087e410160e21b600182015290506001600160f81b0319891660058201525f60068201526858000000005200520160b71b6009820152613d81613d7b601383018a613c88565b88613c88565b600160f91b81529050613d976001820187613c88565b5f81526410fc82020560d91b600182015290506a160000000014801480000160a91b6009820152613dcb6014820186613c88565b5f81526410fc82020560d91b600182015290506a160000000014801480000160a91b6009820152613dff6014820185613c88565b603b60f01b81526002019e9d5050505050505050505050505050565b683d913730b6b2911d1160b91b81525f613e386009830188613c88565b701116113232b9b1b934b83a34b7b7111d1160791b8152613e5c6011820188613c88565b90507111161132bc3a32b93730b62fbab936111d1160711b81525f8654613e8281613942565b600182168015613e995760018114613eb457613ee7565b60ff1983166012860152601282151583028601019350613ee7565b895f5260205f205f5b83811015613edc57815487820160120152600190910190602001613ebd565b505060128286010193505b505050613ef48187613c88565b915050613f0d8169161134b6b0b3b2911d1160b11b9052565b613f1a600a820185613c88565b61227d60f01b815260020198975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f6135c7601d830184613c88565b81516001600160401b03811115613f7b57613f7b61376b565b613f8f81613f898454613942565b84613974565b6020601f821160018114613fc1575f8315613faa5750848201515b5f19600385901b1c1916600184901b1784556139b8565b5f84815260208120601f198516915b82811015613ff05787850151825560209485019460019092019101613fd0565b508482101561400d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b818103818111156106b6576106b6613af7565b808201808211156106b6576106b6613af7565b5f61404d8285613c88565b6001600160f81b03199390931683525050600101919050565b5f6140718285613c88565b600160fd1b8152611f126001820185613c88565b602080825282518282018190525f918401906040840190835b818110156140bf57835160ff1683526020938401939092019160010161409e565b509095945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f6118b361412a8386613c88565b84613c88565b5f61413b8285613c88565b7f2c7b2274726169745f74797065223a227772697465436f756e74222c2276616c8152633ab2911d60e11b60208201526141786024820185613c88565b607d60f81b815260010195945050505050565b5f6141968285613c88565b7f2c7b2274726169745f74797065223a226d65737361676546726f6d222c227661815265363ab2911d1160d11b60208201526141d56026820185613c88565b61227d60f01b815260020195945050505050565b5f6141f48284613c88565b605d60f81b81526001019392505050565b60ff82811682821603908111156106b6576106b6613af7565b7f3c7376672069643d2271222077696474683d2237343022206865696768743d2281527f3734302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3230602082015267181817b9bb33911f60c11b60408201527f3c7374796c653e696d677b77696474683a313030253b6865696768743a313030604882015261253b60f01b60688201527f696d6167652d72656e646572696e673a706978656c617465643b626f72646572606a82019081527516b930b234bab99d189a383c1dbe9e17b9ba3cb6329f60511b608a8301525f9060a083016143a461439e61434f837f3c726563742072783d223430222077696474683d22373430222068656967687481527f3d22373430222066696c6c3d2223303030223e3c2f726563743e0000000000006020820152603a0190565b7f3c726563742072783d2232382220783d2231352220793d22313522207769647481527f683d2237313022206865696768743d2237313022207374726f6b653d222300006020820152603e0190565b87613c88565b9150506143d0817f22207374726f6b652d77696474683d223130223e3c2f726563743e00000000009052565b7f3c666f726569676e4f626a6563742077696474683d2236353622206865696768601b820152753a1e911b1a9b11103c1e911a1911103c9e911a19111f60511b603b8201527f3c696d6720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313960518201527f39392f7868746d6c22207372633d22646174613a696d6167652f6769663b62616071820152641cd94d8d0b60da1b609182015261447c6096820185613c88565b7211179f1e17b337b932b4b3b727b13532b1ba1f60691b81527f3c616e696d617465206174747269627574654e616d653d226f7061636974792260138201527f206475723d22322e3273222066726f6d3d22312220746f3d22302e393939222060338201527f726570656174436f756e743d22696e646566696e697465222f3e00000000000060538201527f3c73637269707420747970653d22746578742f6a617661736372697074223e3c606d82015267215b43444154415b60c01b608d8201527f6c657420713d646f63756d656e742e676574456c656d656e744279496428227160958201526222293b60e81b60b58201527f712e7374796c653d606d617267696e3a247b28712e706172656e74203d3d207560b88201526a373232b334b732b2149f9160a91b60d88201527f63616c6328283130307668202d203734307078292f3229223a2230227d20617560e38201527f746f3b6261636b67726f756e642d636f6c6f723a233265326532653b603b5d5d610103820152601f60f91b6101238201526e1e17b9b1b934b83a1f1e17b9bb339f60891b6101248201526101330195945050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525f6135c7601a830184613c88565b5f6146648286613c88565b6001600160f81b031994851681529290931660018301525060020192915050565b5f60208284031215614695575f80fd5b81516001600160401b038111156146aa575f80fd5b8201601f810184136146ba575f80fd5b80516001600160401b038111156146d3576146d361376b565b8060051b6146e36020820161377f565b918252602081840181019290810190878411156146fe575f80fd5b6020850194505b83851015614732578451925061ffff83168314614720575f80fd5b82825260209485019490910190614705565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061476f908301846135ce565b9695505050505050565b5f60208284031215614789575f80fd5b81516135c781613597565b5f600182016147a5576147a5613af7565b5060010190565b5f826147ba576147ba613b22565b50069056fe222c2261747472696275746573223a5b7b2274726169745f74797065223a227374617465222c2276616c7565223a5772697461626c65207172636f6465732066756c6c79206f6e2d636861696e6564a2646970667358221220d16749a3fa0636c1695a800ccb7755b0d8d531d56b296d439308bea9c602f85964736f6c634300081a0033
Deployed Bytecode Sourcemap
718:19148:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19231:96;;;;;;;;;;-1:-1:-1;19231:96:13;;;;;:::i;:::-;;:::i;:::-;;2333:380;;;;;;;;;;-1:-1:-1;2333:380:13;;;;;:::i;:::-;;:::i;:::-;;;1334:14:14;;1327:22;1309:41;;1297:2;1282:18;2333:380:13;;;;;;;;2423:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3934:217::-;;;;;;;;;;-1:-1:-1;3934:217:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2275:32:14;;;2257:51;;2245:2;2230:18;3934:217:4;2111:203:14;3472:401:4;;;;;;;;;;-1:-1:-1;3472:401:4;;;;;:::i;:::-;;:::i;1611:37:13:-;;;;;;;;;;;;;;;;;;;2948:25:14;;;2936:2;2921:18;1611:37:13;2802:177:14;2992:91:13;;;;;;;;;;;;;:::i;4661:330:4:-;;;;;;;;;;-1:-1:-1;4661:330:4;;;;;:::i;:::-;;:::i;18863:238:13:-;;;;;;;;;;-1:-1:-1;18863:238:13;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3906:32:14;;;3888:51;;3970:2;3955:18;;3948:34;;;;3861:18;18863:238:13;3714:274:14;1480:42:13;;;;;;;;;;-1:-1:-1;1480:42:13;;;;;:::i;:::-;;;;;;;;;;;;;;19695:168;;;;;;;;;;;;;:::i;5057:179:4:-;;;;;;;;;;-1:-1:-1;5057:179:4;;;;;:::i;:::-;;:::i;2126:235::-;;;;;;;;;;-1:-1:-1;2126:235:4;;;;;:::i;:::-;;:::i;1864:205::-;;;;;;;;;;-1:-1:-1;1864:205:4;;;;;:::i;:::-;;:::i;1661:101:11:-;;;;;;;;;;;;;:::i;2060:72:13:-;;;;;;;;;;;;;:::i;1029:85:11:-;;;;;;;;;;-1:-1:-1;1101:6:11;;-1:-1:-1;;;;;1101:6:11;1029:85;;2585:102:4;;;;;;;;;;;;;:::i;12697:390:13:-;;;;;;;;;;-1:-1:-1;12697:390:13;;;;;:::i;:::-;;:::i;10342:2276::-;;;;;;;;;;-1:-1:-1;10342:2276:13;;;;;:::i;:::-;;:::i;3187:938::-;;;;;;:::i;:::-;;:::i;4218:153:4:-;;;;;;;;;;-1:-1:-1;4218:153:4;;;;;:::i;:::-;;:::i;1706:37:13:-;;;;;;;;;;;;1741:2;1706:37;;5302:320:4;;;;;;;;;;-1:-1:-1;5302:320:4;;;;;:::i;:::-;;:::i;1999:57:13:-;;;;;;;;;;;;;:::i;6714:906::-;;;;;;;;;;-1:-1:-1;6714:906:13;;;;;:::i;:::-;;:::i;1934:31::-;;;;;;;;;;-1:-1:-1;1934:31:13;;;;;;;;19370:142;;;;;;;;;;;;;:::i;1847:31::-;;;;;;;;;;;;;;;;4327:723;;;;;;;;;;-1:-1:-1;4327:723:13;;;;;:::i;:::-;;:::i;19587:103::-;;;;;;;;;;;;;:::i;4437:162:4:-;;;;;;;;;;-1:-1:-1;4437:162:4;;;;;:::i;:::-;;:::i;1911:198:11:-;;;;;;;;;;-1:-1:-1;1911:198:11;;;;;:::i;:::-;;:::i;5148:336:13:-;;;;;;;;;;-1:-1:-1;5148:336:13;;;;;:::i;:::-;;:::i;19231:96::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;;;;;;;;;19304:11:13::1;:18;19318:4:::0;;19304:11;:18:::1;:::i;:::-;;19231:96:::0;;:::o;2333:380::-;2435:4;-1:-1:-1;;;;;;2462:40:13;;-1:-1:-1;;;2462:40:13;;:100;;-1:-1:-1;;;;;;;2514:48:13;;-1:-1:-1;;;2514:48:13;2462:100;:153;;;-1:-1:-1;;;;;;;2574:41:13;;-1:-1:-1;;;2574:41:13;2462:153;:198;;;-1:-1:-1;;;;;;;2627:33:13;;-1:-1:-1;;;2627:33:13;2462:198;:246;;;;2672:36;2696:11;2672:23;:36::i;:::-;2447:261;2333:380;-1:-1:-1;;2333:380:13:o;2423:98:4:-;2477:13;2509:5;2502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2423:98;:::o;3934:217::-;4010:7;4037:16;4045:7;4037;:16::i;:::-;4029:73;;;;-1:-1:-1;;;4029:73:4;;10797:2:14;4029:73:4;;;10779:21:14;10836:2;10816:18;;;10809:30;10875:34;10855:18;;;10848:62;-1:-1:-1;;;10926:18:14;;;10919:42;10978:19;;4029:73:4;10595:408:14;4029:73:4;-1:-1:-1;4120:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4120:24:4;;3934:217::o;3472:401::-;3552:13;3568:23;3583:7;3568:14;:23::i;:::-;3552:39;;3615:5;-1:-1:-1;;;;;3609:11:4;:2;-1:-1:-1;;;;;3609:11:4;;3601:57;;;;-1:-1:-1;;;3601:57:4;;11210:2:14;3601:57:4;;;11192:21:14;11249:2;11229:18;;;11222:30;11288:34;11268:18;;;11261:62;-1:-1:-1;;;11339:18:14;;;11332:31;11380:19;;3601:57:4;11008:397:14;3601:57:4;719:10:1;-1:-1:-1;;;;;3690:21:4;;;;:62;;-1:-1:-1;3715:37:4;3732:5;719:10:1;4437:162:4;:::i;3715:37::-;3669:165;;;;-1:-1:-1;;;3669:165:4;;11612:2:14;3669:165:4;;;11594:21:14;11651:2;11631:18;;;11624:30;11690:34;11670:18;;;11663:62;11761:26;11741:18;;;11734:54;11805:19;;3669:165:4;11410:420:14;3669:165:4;3845:21;3854:2;3858:7;3845:8;:21::i;2992:91:13:-;3038:7;3062:16;:6;918:14:2;;827:112;3062:16:13;3055:23;;2992:91;:::o;4661:330:4:-;4850:41;719:10:1;4883:7:4;4850:18;:41::i;:::-;4842:103;;;;-1:-1:-1;;;4842:103:4;;;;;;;:::i;:::-;4956:28;4966:4;4972:2;4976:7;4956:9;:28::i;18863:238:13:-;18998:16;19016:21;18964:8;2873:17;2881:8;2873:7;:17::i;:::-;2865:50;;;;-1:-1:-1;;;2865:50:13;;;;;;;:::i;:::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;19092:3:13::1;19075:14;;19062:10;:27;;;;:::i;:::-;:33;;;;:::i;:::-;19045:51;;;;18863:238:::0;;;;;;:::o;19695:168::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;19741:12:13::1;19767:7;1101:6:11::0;;-1:-1:-1;;;;;1101:6:11;;1029:85;19767:7:13::1;-1:-1:-1::0;;;;;19759:21:13::1;19788;19759:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19740:74;;;19828:7;19820:38;;;::::0;-1:-1:-1;;;19820:38:13;;13576:2:14;19820:38:13::1;::::0;::::1;13558:21:14::0;13615:2;13595:18;;;13588:30;-1:-1:-1;;;13634:18:14;;;13627:48;13692:18;;19820:38:13::1;13374:342:14::0;19820:38:13::1;19734:129;19695:168::o:0;5057:179:4:-;5190:39;5207:4;5213:2;5217:7;5190:39;;;;;;;;;;;;:16;:39::i;2126:235::-;2198:7;2233:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2233:16:4;;2259:73;;;;-1:-1:-1;;;2259:73:4;;13923:2:14;2259:73:4;;;13905:21:14;13962:2;13942:18;;;13935:30;14001:34;13981:18;;;13974:62;-1:-1:-1;;;14052:18:14;;;14045:39;14101:19;;2259:73:4;13721:405:14;1864:205:4;1936:7;-1:-1:-1;;;;;1963:19:4;;1955:74;;;;-1:-1:-1;;;1955:74:4;;14333:2:14;1955:74:4;;;14315:21:14;14372:2;14352:18;;;14345:30;14411:34;14391:18;;;14384:62;-1:-1:-1;;;14462:18:14;;;14455:40;14512:19;;1955:74:4;14131:406:14;1955:74:4;-1:-1:-1;;;;;;2046:16:4;;;;;:9;:16;;;;;;;1864:205::o;1661:101:11:-;1101:6;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;2060:72:13:-;;;;;;;;;;;;;;;;;;;:::o;2585:102:4:-;2641:13;2673:7;2666:14;;;;;:::i;12697:390:13:-;12778:12;12798:14;12816:12;12826:2;12816:7;:12;:::i;:::-;12815:19;;12832:2;12815:19;:::i;:::-;12798:36;-1:-1:-1;12879:22:13;;;;;:11;;:22;:::i;:::-;-1:-1:-1;;;12957:20:13;;;;;13038:11;;13050:10;:8;13059:1;13050:10;:::i;:::-;13038:24;;;;;;;;;;;:::i;:::-;12847:235;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12840:242;;;12697:390;;;;;:::o;10342:2276::-;10397:12;10418:18;10438:17;10457:23;10484:19;10494:8;10484:9;:19::i;:::-;10417:86;;;;;;10509:23;10535;10549:8;10535:13;:23::i;:::-;10509:49;;10564:14;10603:1;10589:8;10598:1;10589:11;;;;;;;;:::i;:::-;;;;;;;:15;;;;:::i;:::-;10588:21;;10608:1;10588:21;:::i;:::-;10581:29;;10564:46;;10718:5;10749:4;11122:1;11107:8;11116:1;11107:11;;;;;;;;:::i;:::-;;;;;;;:16;;;;11100:24;;11150:7;11356:10;11653:2;11639:8;11648:1;11639:11;;;;;;;;:::i;:::-;;;;;;;:16;;;;:::i;:::-;11638:23;;11659:2;11638:23;:::i;:::-;11631:31;;11847:4;11877:5;11952:10;12221:4;-1:-1:-1;;;;;12221:11:13;;12233:10;12245:8;12254:1;12245:11;;;;;;;;:::i;:::-;;;;;;;12221:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12221:36:13;;;;;;;;;;;;:::i;:::-;12516:4;-1:-1:-1;;;;;12516:11:13;;12528:10;12540:8;12549:1;12540:11;;;;;;;;:::i;:::-;;;;;;;12516:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12516:36:13;;;;;;;;;;;;:::i;:::-;10623:1990;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10616:1997;;;;;;;10342:2276;;;:::o;3187:938::-;3360:9;;3260:10;;3292:6;;;3331:16;:6;918:14:2;;827:112;3331:16:13;:24;3330:39;;3322:70;;;;-1:-1:-1;;;3322:70:13;;22057:2:14;3322:70:13;;;22039:21:14;22096:2;22076:18;;;22069:30;-1:-1:-1;;;22115:18:14;;;22108:48;22173:18;;3322:70:13;21855:342:14;3322:70:13;1101:6:11;;-1:-1:-1;;;;;3404:20:13;;;1101:6:11;;3404:20:13;3400:167;;3465:7;;3457:5;:15;3444:9;:28;3436:69;;;;-1:-1:-1;;;3436:69:13;;22404:2:14;3436:69:13;;;22386:21:14;22443:2;22423:18;;;22416:30;22482;22462:18;;;22455:58;22530:18;;3436:69:13;22202:352:14;3436:69:13;3523:11;;;;3515:43;;;;-1:-1:-1;;;3515:43:13;;22761:2:14;3515:43:13;;;22743:21:14;22800:2;22780:18;;;22773:30;-1:-1:-1;;;22819:18:14;;;22812:49;22878:18;;3515:43:13;22559:343:14;3515:43:13;-1:-1:-1;;;;;3583:18:13;;;;;;:7;:18;;;;;;1741:2;3583:26;;;3582:40;;3574:69;;;;-1:-1:-1;;;3574:69:13;;23109:2:14;3574:69:13;;;23091:21:14;23148:2;23128:18;;;23121:30;-1:-1:-1;;;23167:18:14;;;23160:46;23223:18;;3574:69:13;22907:340:14;3574:69:13;-1:-1:-1;;;;;3651:18:13;;;;;;:7;:18;;;;;:27;;;;;;-1:-1:-1;3686:429:13;3719:5;3710;:14;3686:429;;3745:18;:6;1032:19:2;;1050:1;1032:19;;;945:123;3745:18:13;3773:15;3791:16;:6;918:14:2;;827:112;3791:16:13;3773:34;;3930:7;3993:16;3858:207;;;;;;;;23409:19:14;;;23453:2;23444:12;;23437:28;23490:2;23481:12;;23252:247;3858:207:13;;;;;;;-1:-1:-1;;3858:207:13;;;;;;3848:218;;3858:207;3848:218;;;;3817:15;;;;:6;:15;;;;;:250;;-1:-1:-1;;3817:250:13;;;;;;;;;;;;4077:29;4087:9;3817:15;4077:9;:29::i;:::-;-1:-1:-1;3726:7:13;;3686:429;;;;3234:891;;3187:938;:::o;4218:153:4:-;4312:52;719:10:1;4345:8:4;4355;4312:18;:52::i;:::-;4218:153;;:::o;5302:320::-;5471:41;719:10:1;5504:7:4;5471:18;:41::i;:::-;5463:103;;;;-1:-1:-1;;;5463:103:4;;;;;;;:::i;:::-;5576:39;5590:4;5596:2;5600:7;5609:5;5576:13;:39::i;1999:57:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6714:906::-;6818:13;6799:8;2873:17;2881:8;2873:7;:17::i;:::-;2865:50;;;;-1:-1:-1;;;2865:50:13;;;;;;;:::i;:::-;6857:8;1069:42:::1;::::0;7022:15:::1;7116:16;6857:8:::0;7116:7:::1;:16::i;:::-;7327:11;;;;;;;;;;;;;;;;;7406;7441:22;7455:7;7441:13;:22::i;:::-;7523:16;7531:7;7523;:16::i;:::-;7044:547;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7022:571;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;7022:571:13::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;6934:681;;;;;;;;:::i;:::-;;;;;;;;;;;;;6927:688;;;;2921:1;6714:906:::0;;;;:::o;19370:142::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;19444:9:13::1;::::0;19425:6:::1;918:14:2::0;19425:28:13::1;19417:58;;;::::0;-1:-1:-1;;;19417:58:13;;26735:2:14;19417:58:13::1;::::0;::::1;26717:21:14::0;26774:2;26754:18;;;26747:30;-1:-1:-1;;;26793:18:14;;;26786:47;26850:18;;19417:58:13::1;26533:341:14::0;19417:58:13::1;19496:11;::::0;;-1:-1:-1;;19481:26:13;::::1;19496:11;::::0;;::::1;19495:12;19481:26;::::0;;19370:142::o;4327:723::-;4412:8;2873:17;2881:8;2873:7;:17::i;:::-;2865:50;;;;-1:-1:-1;;;2865:50:13;;;;;;;:::i;:::-;4428:15:::1;4535::::0;;;:6:::1;:15;::::0;;;;4446:8;;4494;;4535:15;4573:10:::1;::::0;4610:16:::1;4446:8:::0;4610:7:::1;:16::i;:::-;4589:37;;4663:2;4640:12;:19;:25;;4632:54;;;::::0;-1:-1:-1;;;4632:54:13;;27081:2:14;4632:54:13::1;::::0;::::1;27063:21:14::0;27120:2;27100:18;;;27093:30;-1:-1:-1;;;27139:18:14;;;27132:46;27195:18;;4632:54:13::1;26879:340:14::0;4632:54:13::1;4696:16:::0;;-1:-1:-1;;;4696:16:13;::::1;;;4692:167;;;4740:10;-1:-1:-1::0;;;;;4730:20:13::1;:6;-1:-1:-1::0;;;;;4730:20:13::1;;4722:53;;;::::0;-1:-1:-1;;;4722:53:13;;27426:2:14;4722:53:13::1;::::0;::::1;27408:21:14::0;27465:2;27445:18;;;27438:30;-1:-1:-1;;;27484:18:14;;;27477:50;27544:18;;4722:53:13::1;27224:344:14::0;4722:53:13::1;4692:167;;;4824:1;4804:17;4814:6;4804:9;:17::i;:::-;:21;4796:56;;;::::0;-1:-1:-1;;;4796:56:13;;27775:2:14;4796:56:13::1;::::0;::::1;27757:21:14::0;27814:2;27794:18;;;27787:30;-1:-1:-1;;;27833:18:14;;;27826:52;27895:18;;4796:56:13::1;27573:346:14::0;4796:56:13::1;4894:10;-1:-1:-1::0;;;;;4884:20:13::1;:6;-1:-1:-1::0;;;;;4884:20:13::1;;4883:44;;4921:6;4883:44;;;4916:1;4883:44;4864:63:::0;;4945:25;;;-1:-1:-1;;;;;;;;;;;;;4864:63:13;;;::::1;::::0;;;::::1;4945:25:::0;;;;-1:-1:-1;;;;4864:63:13;;;::::1;::::0;;::::1;4945:25:::0;;::::1;;::::0;;::::1;::::0;::::1;;::::0;;::::1;;::::0;;4978:17;::::1;:32;4998:12:::0;4978:17;:32:::1;:::i;:::-;-1:-1:-1::0;5022:23:13::1;::::0;2948:25:14;;;5022:23:13::1;::::0;2936:2:14;2921:18;5022:23:13::1;;;;;;;4422:628;;;;;4327:723:::0;;;:::o;19587:103::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;19644:6:13::1;918:14:2::0;19632:9:13::1;:28:::0;19666:11:::1;:19:::0;;-1:-1:-1;;19666:19:13::1;::::0;;19587:103::o;4437:162:4:-;-1:-1:-1;;;;;4557:25:4;;;4534:4;4557:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4437:162::o;1911:198:11:-;1101:6;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:11;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:11;;29428:2:14;1991:73:11::1;::::0;::::1;29410:21:14::0;29467:2;29447:18;;;29440:30;29506:34;29486:18;;;29479:62;-1:-1:-1;;;29557:18:14;;;29550:36;29603:19;;1991:73:11::1;29226:402:14::0;1991:73:11::1;2074:28;2093:8;2074:18;:28::i;5148:336:13:-:0;5212:8;2873:17;2881:8;2873:7;:17::i;:::-;2865:50;;;;-1:-1:-1;;;2865:50:13;;;;;;;:::i;:::-;5228:15:::1;5286::::0;;;:6:::1;:15;::::0;;;;5246:8;;5329:16:::1;5246:8:::0;5329:7:::1;:16::i;:::-;-1:-1:-1::0;;;;;5315:30:13::1;:10;-1:-1:-1::0;;;;;5315:30:13::1;;5307:56;;;::::0;-1:-1:-1;;;5307:56:13;;29835:2:14;5307:56:13::1;::::0;::::1;29817:21:14::0;29874:2;29854:18;;;29847:30;-1:-1:-1;;;29893:18:14;;;29886:43;29946:18;;5307:56:13::1;29633:337:14::0;5307:56:13::1;5379:16:::0;;-1:-1:-1;;;5379:16:13;::::1;;;5377:18;5369:46;;;::::0;-1:-1:-1;;;5369:46:13;;30177:2:14;5369:46:13::1;::::0;::::1;30159:21:14::0;30216:2;30196:18;;;30189:30;-1:-1:-1;;;30235:18:14;;;30228:45;30290:18;;5369:46:13::1;29975:339:14::0;5369:46:13::1;5421:23:::0;;-1:-1:-1;;;;5421:23:13::1;-1:-1:-1::0;;;5421:23:13::1;::::0;;5456::::1;::::0;::::1;::::0;::::1;::::0;5471:7;2948:25:14;;2936:2;2921:18;;2802:177;5456:23:13::1;;;;;;;;5222:262;;5148:336:::0;;:::o;1505:300:4:-;1607:4;-1:-1:-1;;;;;;1642:40:4;;-1:-1:-1;;;1642:40:4;;:104;;-1:-1:-1;;;;;;;1698:48:4;;-1:-1:-1;;;1698:48:4;1642:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:3;;;1762:36:4;829:155:3;7094:125:4;7159:4;7182:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7182:16:4;:30;;;7094:125::o;11103:171::-;11177:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11177:29:4;-1:-1:-1;;;;;11177:29:4;;;;;;;;:24;;11230:23;11177:24;11230:14;:23::i;:::-;-1:-1:-1;;;;;11221:46:4;;;;;;;;;;;11103:171;;:::o;7377:344::-;7470:4;7494:16;7502:7;7494;:16::i;:::-;7486:73;;;;-1:-1:-1;;;7486:73:4;;30521:2:14;7486:73:4;;;30503:21:14;30560:2;30540:18;;;30533:30;30599:34;30579:18;;;30572:62;-1:-1:-1;;;30650:18:14;;;30643:42;30702:19;;7486:73:4;30319:408:14;7486:73:4;7569:13;7585:23;7600:7;7585:14;:23::i;:::-;7569:39;;7637:5;-1:-1:-1;;;;;7626:16:4;:7;-1:-1:-1;;;;;7626:16:4;;:51;;;;7670:7;-1:-1:-1;;;;;7646:31:4;:20;7658:7;7646:11;:20::i;:::-;-1:-1:-1;;;;;7646:31:4;;7626:51;:87;;;;7681:32;7698:5;7705:7;7681:16;:32::i;:::-;7618:96;7377:344;-1:-1:-1;;;;7377:344:4:o;10387:605::-;10541:4;-1:-1:-1;;;;;10514:31:4;:23;10529:7;10514:14;:23::i;:::-;-1:-1:-1;;;;;10514:31:4;;10506:81;;;;-1:-1:-1;;;10506:81:4;;30934:2:14;10506:81:4;;;30916:21:14;30973:2;30953:18;;;30946:30;31012:34;30992:18;;;30985:62;-1:-1:-1;;;31063:18:14;;;31056:35;31108:19;;10506:81:4;30732:401:14;10506:81:4;-1:-1:-1;;;;;10605:16:4;;10597:65;;;;-1:-1:-1;;;10597:65:4;;31340:2:14;10597:65:4;;;31322:21:14;31379:2;31359:18;;;31352:30;31418:34;31398:18;;;31391:62;-1:-1:-1;;;31469:18:14;;;31462:34;31513:19;;10597:65:4;31138:400:14;10597:65:4;10774:29;10791:1;10795:7;10774:8;:29::i;:::-;-1:-1:-1;;;;;10814:15:4;;;;;;:9;:15;;;;;:20;;10833:1;;10814:15;:20;;10833:1;;10814:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10844:13:4;;;;;;:9;:13;;;;;:18;;10861:1;;10844:13;:18;;10861:1;;10844:18;:::i;:::-;;;;-1:-1:-1;;10872:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10872:21:4;-1:-1:-1;;;;;10872:21:4;;;;;;;;;10909:27;;10872:16;;10909:27;;;;;;;19304:18:13::1;19231:96:::0;;:::o;2263:187:11:-;2355:6;;;-1:-1:-1;;;;;2371:17:11;;;-1:-1:-1;;;;;;2371:17:11;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;13170:1294:13:-;13287:12;13302:16;;;:6;:16;;;;;;:21;13355:14;;13367:1;13355:14;;;;;;;;;13237:12;;;;;;13302:21;;;13355:14;;;;;;;;;;;-1:-1:-1;;13375:23:13;;;;;;;;;-1:-1:-1;13375:23:13;;;13404:22;;;;;;;;;;;13329:40;;-1:-1:-1;13375:23:13;13404:22;-1:-1:-1;;;13530:368:13;13550:1;13548;:3;13530:368;;;13568:11;13607:2;13596:4;13601:1;13596:7;;;;;;;:::i;:::-;;13590:19;;;;;:::i;:::-;;13583:3;:27;13568:42;;13620:9;13651:3;13643:5;:11;;;13639:175;;;-1:-1:-1;13663:3:13;13639:175;;;13694:3;13686:5;:11;;;:24;;;;;13709:1;13701:5;:9;;;13686:24;13682:132;;;13730:10;;;;;:20;;;13744:1;13749;13744:6;13730:20;:29;;13756:3;13730:29;;;13753:2;13730:29;13771:7;;;;;13724:35;-1:-1:-1;13682:132:13;;;-1:-1:-1;13809:5:13;13682:132;13836:3;13824:15;;;;;;13870:5;13884:3;13877:11;;13857:32;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;13857:32:13;;;;;;;-1:-1:-1;;;13553:3:13;;13530:368;;;;13982:1;13974:9;;13996;13991:343;14011:1;14009;:3;13991:343;;;14029:11;14068:2;14055:4;14060:1;14062;14060:3;14055:9;;;;;;;:::i;:::-;;14049:21;;;;;:::i;:::-;;;-1:-1:-1;14044:1:13;14115:3;14104:14;;;;14100:177;;;-1:-1:-1;14127:1:13;14100:177;;;14156:2;14148:5;:10;;;:23;;;;;14170:1;14162:5;:9;;;14148:23;14144:133;;;14191:10;;;;;:20;;-1:-1:-1;14205:6:13;;14191:20;:31;;14220:2;14191:31;;;14214:3;14191:31;14234:7;;;;;14185:37;-1:-1:-1;14144:133:13;;;-1:-1:-1;14272:5:13;14144:133;14307:4;14320:3;14313:11;;14294:31;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;14294:31:13;;;;;;;-1:-1:-1;;;14014:3:13;;13991:343;;;;14346:9;14341:77;14361:1;14359;:3;14341:77;;;14399:4;14404:1;14406;14404:3;14399:9;;;;;;;:::i;:::-;;;;14393:16;;14379:8;14388:1;14379:11;;;;;;;;:::i;:::-;:30;;;;:11;;;;;;;;;;;:30;14364:3;;14341:77;;;-1:-1:-1;14437:5:13;;14444:4;;-1:-1:-1;14450:8:13;;-1:-1:-1;13170:1294:13;-1:-1:-1;;;;;13170:1294:13:o;9591:718::-;9674:15;9729;;;:6;:15;;;;;:23;;9706:46;;9654:12;;9692:8;;9674:15;;9706:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9794:7;:14;9812:1;9794:19;9790:129;;9890:15;;;;:6;:15;;;;;;;:20;9839:72;;-1:-1:-1;;;9839:72:13;;982:42;;9839:50;;:72;;9890:20;;;9839:72;;-1:-1:-1;;;;;;32275:45:14;;;;32257:64;;32245:2;32230:18;;32111:216;9839:72:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9839:72:13;;;;;;;;;;;;:::i;:::-;9823:89;;9790:129;9928:7;:14;9946:1;9928:19;9924:237;;10011:16;10019:7;10011;:16::i;:::-;10089:38;10110:16;10118:7;10110;:16::i;:::-;10089:20;:38::i;:::-;9967:187;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9957:197;;9924:237;10166:25;10194:45;10208:30;10215:22;10229:7;10215:13;:22::i;:::-;10208:6;:30::i;:::-;10194:13;:45::i;:::-;10252:52;;-1:-1:-1;;;10252:52:13;;10166:73;;-1:-1:-1;1337:42:13;;10252:40;;:52;;10166:73;;10252:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10252:52:13;;;;;;;;;;;;:::i;:::-;10245:59;9591:718;-1:-1:-1;;;;;9591:718:13:o;8051:108:4:-;8126:26;8136:2;8140:7;8126:26;;;;;;;;;;;;:9;:26::i;11409:307::-;11559:8;-1:-1:-1;;;;;11550:17:4;:5;-1:-1:-1;;;;;11550:17:4;;11542:55;;;;-1:-1:-1;;;11542:55:4;;33575:2:14;11542:55:4;;;33557:21:14;33614:2;33594:18;;;33587:30;33653:27;33633:18;;;33626:55;33698:18;;11542:55:4;33373:349:14;11542:55:4;-1:-1:-1;;;;;11607:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11607:46:4;;;;;;;;;;11668:41;;1309::14;;;11668::4;;1282:18:14;11668:41:4;;;;;;;11409:307;;;:::o;6484:::-;6635:28;6645:4;6651:2;6655:7;6635:9;:28::i;:::-;6681:48;6704:4;6710:2;6714:7;6723:5;6681:22;:48::i;:::-;6673:111;;;;-1:-1:-1;;;6673:111:4;;;;;;;:::i;17510:210:13:-;17567:13;17632:9;;;;;;;;;;;;;-1:-1:-1;;;17632:9:13;;;17665:26;17682:8;17665:16;:26::i;:::-;17595:120;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17588:127;;17510:210;;;:::o;5543:1122::-;5628:22;5653:16;;;:6;:16;;;;;;;;5628:41;;;;;;;;;-1:-1:-1;;;;;;5628:41:13;;;;;;;;-1:-1:-1;;;5628:41:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;5628:41:13;;;;;;;;;;-1:-1:-1;;;5628:41:13;;;;;;5607:13;5628:41;;;;;;;;;;;;5607:13;;5628:22;5653:16;5628:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5675:24;:75;;;;;;;;;;;;;;;;;;;5756:23;5782:9;:16;;;:46;;;;;;;;;;;;;;;-1:-1:-1;;;5782:46:13;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5782:46:13;;;;5756:72;;5890:10;5930:9;5847:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5834:135;;6002:1;5979:9;:20;;;:24;;;5975:310;;;6069:10;6177:38;6194:9;:20;;;6177:38;;:16;:38::i;:::-;6026:252;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6013:265;;5975:310;6294:16;;;;-1:-1:-1;;;;;6294:30:13;;6290:327;;6390:10;6507:38;6528:9;:16;;;6507:20;:38::i;:::-;6347:263;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6334:276;;6290:327;6643:10;6629:31;;;;;;;;:::i;7624:1963::-;7702:19;7782:16;;;:6;:16;;;;;;;;7757:41;;;;;;;;;-1:-1:-1;;;;;;7757:41:13;;;;;;;;-1:-1:-1;;;7757:41:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;7757:41:13;;;;;;;;;;-1:-1:-1;;;7757:41:13;;;;;;7681:13;7757:41;;;;;;;;;;;;7681:13;;1069:42;;7702:19;;7757:41;7782:16;;7757:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7804:20;7834:9;:16;;;7830:334;;;-1:-1:-1;7860:14:13;;;;;;;;;;;;-1:-1:-1;;;7860:14:13;;;;7830:334;;;7891:9;:20;;;:25;;7915:1;7891:25;7887:277;;-1:-1:-1;7926:14:13;;;;;;;;;;;;-1:-1:-1;;;7926:14:13;;;;7887:277;;;7957:16;;;;-1:-1:-1;;;;;7957:30:13;7953:211;;-1:-1:-1;7997:14:13;;;;;;;;;;;;-1:-1:-1;;;7997:14:13;;;;7953:211;;;8032:62;;;;;;;;;;;;;;;-1:-1:-1;;;8032:62:13;;;;;;;;;;;;;;;;-1:-1:-1;;;8032:62:13;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8032:62:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8032:62:13;;;;-1:-1:-1;;;8032:62:13;;;;;;;;;;;-1:-1:-1;;;8032:62:13;;;;-1:-1:-1;;;8032:62:13;;;;-1:-1:-1;8120:16:13;;;:6;:16;;;;;;;:27;8032:62;;8155:1;;8120:31;;8150:1;;-1:-1:-1;;;8120:27:13;;;;:31;:::i;:::-;8119:37;;;;:::i;:::-;8111:46;;;;;;;;;:::i;:::-;;;;;8102:55;;8024:140;7953:211;-1:-1:-1;;;;;8257:15:13;;;8726:6;8257:15;;9000:17;9008:8;9000:7;:17::i;:::-;8984:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8984:34:13;;;;;;;;;;;;:::i;:::-;8279:1279;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8257:1303;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8257:1303:13;;;;;;;;;;;;:::i;:::-;8176:1406;;;;;;;;:::i;17877:601::-;17995:26;;17947:12;42704:15:14;;;-1:-1:-1;;42700:53:14;17995:26:13;;;42688:66:14;17947:12:13;17967:25;;42770:12:14;;17995:26:13;;;-1:-1:-1;;17995:26:13;;;;;;18027:38;;;;;;;;-1:-1:-1;;;17995:26:13;18027:38;;;;;;;18071:42;;;;;;;;;;;-1:-1:-1;;;18071:42:13;;;;17995:26;-1:-1:-1;18027:31:13;18119:323;18139:2;18137:1;:4;18119:323;;;18227:18;18283:8;18317:1;18298:12;18311:1;18298:15;;;;;;;;:::i;:::-;;;;;18283:37;;-1:-1:-1;;;;;;18298:15:13;;;:20;;;:15;18292:27;;18283:37;;;;;;:::i;:::-;;;;;;;;;18358:8;18373:12;18386:1;18373:15;;;;;;;;:::i;:::-;;;;;;18358:39;;18373:15;;;;;18391:4;18367:29;;18358:39;;;;;;:::i;:::-;;;;;;;;;18177:258;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18177:258:13;;;;;;;;;;-1:-1:-1;18143:3:13;;18119:323;;;-1:-1:-1;18454:18:13;;17877:601;-1:-1:-1;;;;17877:601:13:o;14548:718::-;14658:15;;;14670:2;14658:15;;;;;;;;;14616:14;;14638:17;;14658:15;;;;;;;;;;;-1:-1:-1;14658:15:13;14638:35;;14679:12;14700:7;:14;14679:36;;14801:1;14791:6;:11;;;;14777:9;14776:27;14762:2;14765:1;14762:5;;;;;;;;:::i;:::-;;;;;;:42;;;;;;;;;;;14862:1;14848:7;14856:1;14848:10;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;14848:15:13;;;;14842:22;;14837:1;14827:6;:11;;;;14826:38;14812:2;14815:1;14812:5;;;;;;;;:::i;:::-;;;;;;:53;;;;;;;;;;;14878:7;14873:111;14898:1;14891:6;:8;14889:10;;:1;:10;;;14873:111;;;14973:1;14957:7;14965:1;14967;14965:3;14957:12;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;14957:17:13;;;;14951:24;;14946:1;14932:7;14940:1;14932:10;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;14932:15:13;;;;14926:22;;:49;14916:2;14919:1;14921;14919:3;14916:7;;;;;;;;;;:::i;:::-;:59;;;;:7;;;;;;;;;;;:59;14901:3;;14873:111;;;;15034:1;15013:7;15028:1;15021:6;:8;15013:17;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;15013:22:13;;;;15006:31;;14991:2;14994:6;15001:1;14994:8;14991:12;;;;;;;;;;:::i;:::-;:46;;;;;:12;;;;;;;;;;:46;15045:30;;;;;;;;;15068:3;15045:30;;15072:2;15045:30;;;;;;;15148:1;15136:8;;15135:14;;;;15157:84;15182:2;15180:1;:4;;;15157:84;;;15209:3;15213:18;15214:12;;;15213:18;15230:1;15209:23;;;;;;:::i;:::-;;;;;15201:2;15204:1;15201:5;;;;;;;;;;:::i;:::-;:31;;;;:5;;;;;;;;;;;:31;15186:3;;15157:84;;;-1:-1:-1;15259:2:13;;14548:718;-1:-1:-1;;;;;14548:718:13:o;15321:1180::-;15384:14;15423:2;15448;15406:14;15488:15;15423:2;15448;15488:15;:::i;:::-;-1:-1:-1;;;;;15476:28:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15476:28:13;-1:-1:-1;15510:98:13;;;;;;;;-1:-1:-1;15510:98:13;;;15535:2;15510:98;;;;15538:2;15510:98;;;;15541:2;15510:98;;;;15544:2;15510:98;;;;15547:2;15510:98;;;;15550:3;15510:98;;;;15554:2;15510:98;;;;15557:3;15510:98;;;;;;;;15561:3;15510:98;;;;15565:3;15510:98;;;;15569:3;15510:98;;;;15573:3;15510:98;;;;15577:2;15510:98;;;;15580:3;15510:98;;;;15584:3;15510:98;;;;15588:3;15510:98;;;;15592:3;15510:98;;;;;;;;;;15600:3;15510:98;;;;15604:3;15510:98;;;;15656:16;;;;;;;;;;;15456:48;;-1:-1:-1;15510:98:13;;-1:-1:-1;;15656:16:13;;;;;;;;;;;-1:-1:-1;;15701:18:13;;;15715:3;15701:18;;;;;;;;;15635:37;;-1:-1:-1;15678:20:13;;15701:18;-1:-1:-1;15701:18:13;;;;;;;;;;-1:-1:-1;15701:18:13;15678:41;;15808:9;15803:56;15822:6;15820:1;:8;15803:56;;;15845:8;15854:1;15845:11;;;;;;;;:::i;:::-;;;;;;;15837:2;15840:1;15837:5;;;;;;;;:::i;:::-;:19;;;;:5;;;;;;;;;;;:19;15830:3;;15803:56;;;;15871:7;15866:53;15884:1;15882;:3;;;15866:53;;;15894:6;;15909:1;15903:13;;;;;;;15894:3;;15903:13;15894:6;;;;;;:::i;:::-;:22;;;;:6;;;;;;;;;;;:22;15887:3;;15866:53;;;-1:-1:-1;15941:1:13;15926:99;15946:3;15944:1;:5;15926:99;;;16011:3;16019:1;16015;:5;16011:10;;;;;;;;:::i;:::-;;;;;;;15997:3;16005:1;16001;:5;15997:10;;;;;;;;:::i;:::-;;;;;;;15983:3;15991:1;15987;:5;15983:10;;;;;;;;:::i;:::-;;;;;;;15970:3;15978:1;15974;:5;15970:10;;;;;;;;:::i;:::-;;;;;;;:23;15969:38;15968:53;15958:3;15962:1;15958:6;;;;;;;;:::i;:::-;:64;;;;:6;;;;;;;;;;;:64;15951:3;;15926:99;;;;16037:9;16032:50;16052:3;16050:1;:5;16032:50;;;16078:1;16064:3;16068;16072:1;16068:6;;;;;;;;:::i;:::-;;;;;;;16064:11;;;;;;;;;;:::i;:::-;;;;;;;;;;:15;16057:3;;16032:50;;;;16094:7;16089:387;16107:6;16105:1;:8;;;16089:387;;;16149:15;;;16161:2;16149:15;;;;;;;;;16130:16;;16149:15;;;;;;;;;;-1:-1:-1;16149:15:13;16130:34;;16179:7;16174:123;16190:6;16188:1;:8;;;16174:123;;;16219:2;16222:1;16219:5;;;;;;;;;;:::i;:::-;;;;;;;:10;;16228:1;16219:10;16215:21;16231:5;16215:21;16255:3;16282;16273:2;16276:1;16273:5;;;;;;;;;:::i;:::-;;;;;16260:18;;:3;16264:2;16267:1;16264:5;;;;;;;;;;:::i;:::-;;;;;;;16260:10;;;;;;;;;;:::i;:::-;;;;;;;:18;16259:26;;;;;:::i;:::-;;16255:31;;;;;;;;:::i;:::-;;;;;;;16248:1;16250;16248:4;;;;;;;;;;:::i;:::-;:38;;;;:4;;;;;;;;;;;:38;16198:3;;16174:123;;;-1:-1:-1;16319:1:13;16306:69;16324:6;16322:1;:8;;;16306:69;;;16360:1;16362;16360:4;;;;;;;;;;:::i;:::-;;;;;;;16349:2;16354:1;16352;:3;16349:7;;;;;;;;;;:::i;:::-;;;;;;;;;;:15;;;;;;;;;;16332:3;;16306:69;;;;16456:8;16465:1;16456:11;;;;;;;;;;:::i;:::-;;;;;;;16448:2;16451:1;16448:5;;;;;;;;;;:::i;:::-;:19;;;;:5;;;;;;;;;;;:19;-1:-1:-1;16115:3:13;;16089:387;;;-1:-1:-1;16494:2:13;;15321:1180;-1:-1:-1;;;;;;;15321:1180:13:o;16565:925::-;16762:28;;-1:-1:-1;;;16762:28:13;;1160:42;16762:28;;;2257:51:14;16632:14:13;;1069:42;;16654:19;;1069:42;;16737:24;;1069:42;;16762:10;;2230:18:14;;16762:28:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16762:28:13;;;;;;;;;;;;:::i;:::-;16737:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16737:54:13;;;;;;;;;;;;:::i;:::-;16825:17;;;16837:4;16825:17;;;;;;;;;16709:82;;-1:-1:-1;16797:25:13;;16825:17;;;;;;;;;;;-1:-1:-1;;16899:26:13;;-1:-1:-1;;;16899:26:13;;1249:42;16899:26;;;2257:51:14;16797:45:13;;-1:-1:-1;16848:23:13;;-1:-1:-1;;;;;16874:24:13;;;;;;;16899:10;;2230:18:14;;16899:26:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16899:26:13;;;;;;;;;;;;:::i;:::-;16874:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16874:52:13;;;;;;;;;;;;:::i;:::-;16956:14;;16848:78;;-1:-1:-1;16997:3:13;16932:21;;17125:217;17145:5;17143:7;;:1;:7;17125:217;;;17203:1;17196;17192;:5;17189:1;:9;17174:5;17182:1;17180;:3;17174:10;;;;;;;;:::i;:::-;;;;;;;:25;;;;17173:31;;;;;;;:::i;:::-;;17167:37;;17273:1;17258:9;17268:1;17258:12;;;;;;;;:::i;:::-;;;;;;;:16;;;;;;;:::i;:::-;;:21;;17278:1;17258:21;17254:40;;17290:1;17283:8;;;;17254:40;17330:3;17303:10;17314:9;17324:1;17314:12;;;;;;;;:::i;:::-;;;;;;;17303:24;;;;;;;;;;:::i;:::-;:30;;;;:24;;;;;;;;;;;:30;17152:3;;17125:217;;;;17377:9;17372:85;17392:13;17390:1;:15;17372:85;;;17447:1;17422:10;17433:7;17441:1;17433:10;;;;;;;;:::i;:::-;;;;;;;17422:22;;;;;;;;;;:::i;:::-;:26;;;;:22;;;;;;;;;;;:26;17407:3;;17372:85;;;-1:-1:-1;17475:10:13;;16565:925;-1:-1:-1;;;;;;;;16565:925:13:o;8380:311:4:-;8505:18;8511:2;8515:7;8505:5;:18::i;:::-;8554:54;8585:1;8589:2;8593:7;8602:5;8554:22;:54::i;:::-;8533:151;;;;-1:-1:-1;;;8533:151:4;;;;;;;:::i;12269:778::-;12419:4;-1:-1:-1;;;;;12439:13:4;;1465:19:0;:23;12435:606:4;;12474:72;;-1:-1:-1;;;12474:72:4;;-1:-1:-1;;;;;12474:36:4;;;;;:72;;719:10:1;;12525:4:4;;12531:7;;12540:5;;12474:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12474:72:4;;;;;;;;-1:-1:-1;;12474:72:4;;;;;;;;;;;;:::i;:::-;;;12470:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12713:6;:13;12730:1;12713:18;12709:266;;12755:60;;-1:-1:-1;;;12755:60:4;;;;;;;:::i;12709:266::-;12927:6;12921:13;12912:6;12908:2;12904:15;12897:38;12470:519;-1:-1:-1;;;;;;12596:51:4;-1:-1:-1;;;12596:51:4;;-1:-1:-1;12589:58:4;;12435:606;-1:-1:-1;13026:4:4;12269:778;;;;;;:::o;328:703:12:-;384:13;601:5;610:1;601:10;597:51;;-1:-1:-1;;627:10:12;;;;;;;;;;;;-1:-1:-1;;;627:10:12;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:12;;-1:-1:-1;773:2:12;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:12;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:12;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:12;;;;;;;;-1:-1:-1;972:11:12;981:2;972:11;;:::i;:::-;;;844:150;;9013:427:4;-1:-1:-1;;;;;9092:16:4;;9084:61;;;;-1:-1:-1;;;9084:61:4;;45416:2:14;9084:61:4;;;45398:21:14;;;45435:18;;;45428:30;45494:34;45474:18;;;45467:62;45546:18;;9084:61:4;45214:356:14;9084:61:4;9164:16;9172:7;9164;:16::i;:::-;9163:17;9155:58;;;;-1:-1:-1;;;9155:58:4;;45777:2:14;9155:58:4;;;45759:21:14;45816:2;45796:18;;;45789:30;45855;45835:18;;;45828:58;45903:18;;9155:58:4;45575:352:14;9155:58:4;-1:-1:-1;;;;;9280:13:4;;;;;;:9;:13;;;;;:18;;9297:1;;9280:13;:18;;9297:1;;9280:18;:::i;:::-;;;;-1:-1:-1;;9308:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9308:21:4;-1:-1:-1;;;;;9308:21:4;;;;;;;;9345:33;;9308:16;;;9345:33;;9308:16;;9345:33;4218:153;;:::o;14:348:14:-;66:8;76:6;130:3;123:4;115:6;111:17;107:27;97:55;;148:1;145;138:12;97:55;-1:-1:-1;171:20:14;;-1:-1:-1;;;;;203:30:14;;200:50;;;246:1;243;236:12;200:50;283:4;275:6;271:17;259:29;;335:3;328:4;319:6;311;307:19;303:30;300:39;297:59;;;352:1;349;342:12;297:59;14:348;;;;;:::o;367:411::-;438:6;446;499:2;487:9;478:7;474:23;470:32;467:52;;;515:1;512;505:12;467:52;555:9;542:23;-1:-1:-1;;;;;580:6:14;577:30;574:50;;;620:1;617;610:12;574:50;659:59;710:7;701:6;690:9;686:22;659:59;:::i;:::-;737:8;;633:85;;-1:-1:-1;367:411:14;-1:-1:-1;;;;367:411:14:o;783:131::-;-1:-1:-1;;;;;;857:32:14;;847:43;;837:71;;904:1;901;894:12;919:245;977:6;1030:2;1018:9;1009:7;1005:23;1001:32;998:52;;;1046:1;1043;1036:12;998:52;1085:9;1072:23;1104:30;1128:5;1104:30;:::i;:::-;1153:5;919:245;-1:-1:-1;;;919:245:14:o;1361:289::-;1403:3;1441:5;1435:12;1468:6;1463:3;1456:19;1524:6;1517:4;1510:5;1506:16;1499:4;1494:3;1490:14;1484:47;1576:1;1569:4;1560:6;1555:3;1551:16;1547:27;1540:38;1639:4;1632:2;1628:7;1623:2;1615:6;1611:15;1607:29;1602:3;1598:39;1594:50;1587:57;;;1361:289;;;;:::o;1655:220::-;1804:2;1793:9;1786:21;1767:4;1824:45;1865:2;1854:9;1850:18;1842:6;1824:45;:::i;1880:226::-;1939:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:52;;;2008:1;2005;1998:12;1960:52;-1:-1:-1;2053:23:14;;1880:226;-1:-1:-1;1880:226:14:o;2319:173::-;2387:20;;-1:-1:-1;;;;;2436:31:14;;2426:42;;2416:70;;2482:1;2479;2472:12;2416:70;2319:173;;;:::o;2497:300::-;2565:6;2573;2626:2;2614:9;2605:7;2601:23;2597:32;2594:52;;;2642:1;2639;2632:12;2594:52;2665:29;2684:9;2665:29;:::i;:::-;2655:39;2763:2;2748:18;;;;2735:32;;-1:-1:-1;;;2497:300:14:o;2984:374::-;3061:6;3069;3077;3130:2;3118:9;3109:7;3105:23;3101:32;3098:52;;;3146:1;3143;3136:12;3098:52;3169:29;3188:9;3169:29;:::i;:::-;3159:39;;3217:38;3251:2;3240:9;3236:18;3217:38;:::i;:::-;2984:374;;3207:48;;-1:-1:-1;;;3324:2:14;3309:18;;;;3296:32;;2984:374::o;3363:346::-;3431:6;3439;3492:2;3480:9;3471:7;3467:23;3463:32;3460:52;;;3508:1;3505;3498:12;3460:52;-1:-1:-1;;3553:23:14;;;3673:2;3658:18;;;3645:32;;-1:-1:-1;3363:346:14:o;3993:186::-;4052:6;4105:2;4093:9;4084:7;4080:23;4076:32;4073:52;;;4121:1;4118;4111:12;4073:52;4144:29;4163:9;4144:29;:::i;4184:567::-;4261:6;4269;4277;4330:2;4318:9;4309:7;4305:23;4301:32;4298:52;;;4346:1;4343;4336:12;4298:52;4386:9;4373:23;-1:-1:-1;;;;;4411:6:14;4408:30;4405:50;;;4451:1;4448;4441:12;4405:50;4490:59;4541:7;4532:6;4521:9;4517:22;4490:59;:::i;:::-;4568:8;;-1:-1:-1;4464:85:14;-1:-1:-1;;4653:2:14;4638:18;;4625:32;4697:4;4686:16;;4676:27;;4666:55;;4717:1;4714;4707:12;4666:55;4740:5;4730:15;;;4184:567;;;;;:::o;4979:347::-;5044:6;5052;5105:2;5093:9;5084:7;5080:23;5076:32;5073:52;;;5121:1;5118;5111:12;5073:52;5144:29;5163:9;5144:29;:::i;:::-;5134:39;;5223:2;5212:9;5208:18;5195:32;5270:5;5263:13;5256:21;5249:5;5246:32;5236:60;;5292:1;5289;5282:12;5236:60;5315:5;5305:15;;;4979:347;;;;;:::o;5331:127::-;5392:10;5387:3;5383:20;5380:1;5373:31;5423:4;5420:1;5413:15;5447:4;5444:1;5437:15;5463:275;5534:2;5528:9;5599:2;5580:13;;-1:-1:-1;;5576:27:14;5564:40;;-1:-1:-1;;;;;5619:34:14;;5655:22;;;5616:62;5613:88;;;5681:18;;:::i;:::-;5717:2;5710:22;5463:275;;-1:-1:-1;5463:275:14:o;5743:186::-;5791:4;-1:-1:-1;;;;;5816:6:14;5813:30;5810:56;;;5846:18;;:::i;:::-;-1:-1:-1;5912:2:14;5891:15;-1:-1:-1;;5887:29:14;5918:4;5883:40;;5743:186::o;5934:336::-;5998:5;6027:52;6043:35;6071:6;6043:35;:::i;:::-;6027:52;:::i;:::-;6018:61;;6102:6;6095:5;6088:21;6142:3;6133:6;6128:3;6124:16;6121:25;6118:45;;;6159:1;6156;6149:12;6118:45;6208:6;6203:3;6196:4;6189:5;6185:16;6172:43;6262:1;6255:4;6246:6;6239:5;6235:18;6231:29;6224:40;5934:336;;;;;:::o;6275:712::-;6370:6;6378;6386;6394;6447:3;6435:9;6426:7;6422:23;6418:33;6415:53;;;6464:1;6461;6454:12;6415:53;6487:29;6506:9;6487:29;:::i;:::-;6477:39;;6535:38;6569:2;6558:9;6554:18;6535:38;:::i;:::-;6525:48;-1:-1:-1;6642:2:14;6627:18;;6614:32;;-1:-1:-1;6721:2:14;6706:18;;6693:32;-1:-1:-1;;;;;6737:30:14;;6734:50;;;6780:1;6777;6770:12;6734:50;6803:22;;6856:4;6848:13;;6844:27;-1:-1:-1;6834:55:14;;6885:1;6882;6875:12;6834:55;6908:73;6973:7;6968:2;6955:16;6950:2;6946;6942:11;6908:73;:::i;:::-;6898:83;;;6275:712;;;;;;;:::o;6992:564::-;7070:6;7078;7131:2;7119:9;7110:7;7106:23;7102:32;7099:52;;;7147:1;7144;7137:12;7099:52;7192:23;;;-1:-1:-1;7290:2:14;7275:18;;7262:32;-1:-1:-1;;;;;7306:30:14;;7303:50;;;7349:1;7346;7339:12;7303:50;7372:22;;7425:4;7417:13;;7413:27;-1:-1:-1;7403:55:14;;7454:1;7451;7444:12;7403:55;7477:73;7542:7;7537:2;7524:16;7519:2;7515;7511:11;7477:73;:::i;:::-;7467:83;;;6992:564;;;;;:::o;7561:260::-;7629:6;7637;7690:2;7678:9;7669:7;7665:23;7661:32;7658:52;;;7706:1;7703;7696:12;7658:52;7729:29;7748:9;7729:29;:::i;:::-;7719:39;;7777:38;7811:2;7800:9;7796:18;7777:38;:::i;:::-;7767:48;;7561:260;;;;;:::o;7826:356::-;8028:2;8010:21;;;8047:18;;;8040:30;8106:34;8101:2;8086:18;;8079:62;8173:2;8158:18;;7826:356::o;8187:380::-;8266:1;8262:12;;;;8309;;;8330:61;;8384:4;8376:6;8372:17;8362:27;;8330:61;8437:2;8429:6;8426:14;8406:18;8403:38;8400:161;;8483:10;8478:3;8474:20;8471:1;8464:31;8518:4;8515:1;8508:15;8546:4;8543:1;8536:15;8698:518;8800:2;8795:3;8792:11;8789:421;;;8836:5;8833:1;8826:16;8880:4;8877:1;8867:18;8950:2;8938:10;8934:19;8931:1;8927:27;8921:4;8917:38;8986:4;8974:10;8971:20;8968:47;;;-1:-1:-1;9009:4:14;8968:47;9064:2;9059:3;9055:12;9052:1;9048:20;9042:4;9038:31;9028:41;;9119:81;9137:2;9130:5;9127:13;9119:81;;;9196:1;9182:16;;9163:1;9152:13;9119:81;;;9123:3;;8698:518;;;:::o;9392:1198::-;-1:-1:-1;;;;;9511:3:14;9508:27;9505:53;;;9538:18;;:::i;:::-;9567:94;9657:3;9617:38;9649:4;9643:11;9617:38;:::i;:::-;9611:4;9567:94;:::i;:::-;9687:1;9712:2;9707:3;9704:11;9729:1;9724:608;;;;10376:1;10393:3;10390:93;;;-1:-1:-1;10449:19:14;;;10436:33;10390:93;-1:-1:-1;;9349:1:14;9345:11;;;9341:24;9337:29;9327:40;9373:1;9369:11;;;9324:57;10496:78;;9697:887;;9724:608;8645:1;8638:14;;;8682:4;8669:18;;-1:-1:-1;;9760:17:14;;;9875:229;9889:7;9886:1;9883:14;9875:229;;;9978:19;;;9965:33;9950:49;;10085:4;10070:20;;;;10038:1;10026:14;;;;9905:12;9875:229;;;9879:3;10132;10123:7;10120:16;10117:159;;;10256:1;10252:6;10246:3;10240;10237:1;10233:11;10229:21;10225:34;10221:39;10208:9;10203:3;10199:19;10186:33;10182:79;10174:6;10167:95;10117:159;;;10319:1;10313:3;10310:1;10306:11;10302:19;10296:4;10289:33;9697:887;;9392:1198;;;:::o;11835:413::-;12037:2;12019:21;;;12076:2;12056:18;;;12049:30;12115:34;12110:2;12095:18;;12088:62;-1:-1:-1;;;12181:2:14;12166:18;;12159:47;12238:3;12223:19;;11835:413::o;12253:344::-;12455:2;12437:21;;;12494:2;12474:18;;;12467:30;-1:-1:-1;;;12528:2:14;12513:18;;12506:50;12588:2;12573:18;;12253:344::o;12602:127::-;12663:10;12658:3;12654:20;12651:1;12644:31;12694:4;12691:1;12684:15;12718:4;12715:1;12708:15;12734:168;12807:9;;;12838;;12855:15;;;12849:22;;12835:37;12825:71;;12876:18;;:::i;12907:127::-;12968:10;12963:3;12959:20;12956:1;12949:31;12999:4;12996:1;12989:15;13023:4;13020:1;13013:15;13039:120;13079:1;13105;13095:35;;13110:18;;:::i;:::-;-1:-1:-1;13144:9:14;;13039:120::o;14542:157::-;14572:1;14606:4;14603:1;14599:12;14630:3;14620:37;;14637:18;;:::i;:::-;14689:3;14682:4;14679:1;14675:12;14671:22;14666:27;;;14542:157;;;;:::o;14704:148::-;14792:4;14771:12;;;14785;;;14767:31;;14810:13;;14807:39;;;14826:18;;:::i;14857:331::-;14962:9;14973;15015:8;15003:10;15000:24;14997:44;;;15037:1;15034;15027:12;14997:44;15066:6;15056:8;15053:20;15050:40;;;15086:1;15083;15076:12;15050:40;-1:-1:-1;;15112:23:14;;;15157:25;;;;;-1:-1:-1;14857:331:14:o;15295:503::-;15572:6;15564;15559:3;15546:33;15528:3;15607:6;15602:3;15598:16;15655:3;15650;15646:13;15638:6;15634:26;15630:2;15623:38;15703:6;15695;15691:1;15687:2;15683:10;15670:40;15772:1;15733:15;;15750:1;15729:23;15761:13;;;-1:-1:-1;15729:23:14;;15295:503;-1:-1:-1;;;;;15295:503:14:o;15803:127::-;15864:10;15859:3;15855:20;15852:1;15845:31;15895:4;15892:1;15885:15;15919:4;15916:1;15909:15;15935:296;16106:2;16095:9;16088:21;16069:4;16126:45;16167:2;16156:9;16152:18;16144:6;16126:45;:::i;:::-;16118:53;;16219:4;16211:6;16207:17;16202:2;16191:9;16187:18;16180:45;15935:296;;;;;:::o;16236:340::-;16311:5;16340:52;16356:35;16384:6;16356:35;:::i;16340:52::-;16331:61;;16415:6;16408:5;16401:21;16455:3;16446:6;16441:3;16437:16;16434:25;16431:45;;;16472:1;16469;16462:12;16431:45;16514:6;16509:3;16502:4;16495:5;16491:16;16485:36;16568:1;16561:4;16552:6;16545:5;16541:18;16537:29;16530:40;16236:340;;;;;:::o;16581:457::-;16660:6;16713:2;16701:9;16692:7;16688:23;16684:32;16681:52;;;16729:1;16726;16719:12;16681:52;16762:9;16756:16;-1:-1:-1;;;;;16787:6:14;16784:30;16781:50;;;16827:1;16824;16817:12;16781:50;16850:22;;16903:4;16895:13;;16891:27;-1:-1:-1;16881:55:14;;16932:1;16929;16922:12;16881:55;16955:77;17024:7;17019:2;17013:9;17008:2;17004;17000:11;16955:77;:::i;17159:211::-;17200:3;17238:5;17232:12;17282:6;17275:4;17268:5;17264:16;17259:3;17253:36;17344:1;17308:16;;17333:13;;;-1:-1:-1;17308:16:14;;17159:211;-1:-1:-1;17159:211:14:o;18098:3752::-;-1:-1:-1;;;17101:47:14;;20164:3;20238:64;20263:38;20297:2;20292:3;20288:12;20280:6;20263:38;:::i;:::-;20255:6;20238:64;:::i;:::-;-1:-1:-1;;;17433:57:14;;-1:-1:-1;;;20397:2:14;20386:14;;17559:33;-1:-1:-1;;;;;;15258:25:14;;20447:2;20436:14;;15246:38;-1:-1:-1;;;;;;15258:25:14;;20497:2;20486:14;;15246:38;20533:66;20528:2;20517:14;;20510:90;-1:-1:-1;;;20650:2:14;20639:14;;17661:47;20676:40;20712:2;20705:5;20701:14;20693:6;20676:40;:::i;:::-;20739:66;20725:81;;-1:-1:-1;;;20856:1:14;20845:13;;17559:33;20663:53;-1:-1:-1;;;;;;;15258:25:14;;20905:1;20894:13;;15246:38;20939:66;20935:1;20924:13;;20917:89;-1:-1:-1;;;21056:1:14;21045:13;;17777:43;21081:66;21106:40;21142:2;21135:5;21131:14;21123:6;21106:40;:::i;:::-;21098:6;21081:66;:::i;:::-;-1:-1:-1;;;17881:24:14;;21068:79;-1:-1:-1;21214:39:14;21250:1;21243:5;21239:13;21231:6;21214:39;:::i;:::-;21276:66;21262:81;;-1:-1:-1;;;21393:1:14;21382:13;;17970:35;21201:52;-1:-1:-1;;;;21446:1:14;21435:13;;17661:47;21471:40;21507:2;21500:5;21496:14;21488:6;21471:40;:::i;:::-;21534:66;21520:81;;-1:-1:-1;;;21651:1:14;21640:13;;17970:35;21458:53;-1:-1:-1;;;;21704:1:14;21693:13;;17661:47;21729:41;21766:2;21759:5;21755:14;21746:7;21729:41;:::i;:::-;-1:-1:-1;;;18066:25:14;;21842:1;21831:13;;;-1:-1:-1;;;;;;;;;;;;;;18098:3752:14:o;23702:2014::-;-1:-1:-1;;;24493:43:14;;24475:3;24558:37;24592:1;24583:11;;24575:6;24558:37;:::i;:::-;-1:-1:-1;;;24604:61:14;;24687:40;24723:2;24712:14;;24704:6;24687:40;:::i;:::-;24674:53;;24759:38;24754:3;24750:48;24743:5;24736:63;24819:1;24852:6;24846:13;24882:36;24908:9;24882:36;:::i;:::-;24949:1;24934:17;;24960:155;;;;25129:1;25124:354;;;;24927:551;;24960:155;25023:3;25019:8;25008:9;25004:24;24999:2;24992:5;24988:14;24981:48;25102:2;25090:6;25083:14;25076:22;25068:6;25064:35;25057:5;25053:47;25049:56;25042:63;;24960:155;;25124:354;25155:6;25152:1;25145:17;25203:4;25200:1;25190:18;25230:1;25244:177;25258:6;25255:1;25252:13;25244:177;;;25349:14;;25329:13;;;25344:2;25325:22;25318:46;25405:1;25392:15;;;;25280:4;25273:12;25244:177;;;25248:3;;25465:2;25456:6;25449:5;25445:18;25441:27;25434:34;;24927:551;;;;25500:29;25525:3;25517:6;25500:29;:::i;:::-;25487:42;;;25538:36;25568:5;-1:-1:-1;;;23562:45:14;;23504:109;25538:36;25596:40;25632:2;25625:5;25621:14;25613:6;25596:40;:::i;:::-;-1:-1:-1;;;23668:27:14;;25708:1;25697:13;;;-1:-1:-1;;;;;;;;23702:2014:14:o;26184:344::-;26436:31;26431:3;26424:44;26406:3;26484:38;26518:2;26513:3;26509:12;26501:6;26484:38;:::i;27924:1297::-;28048:3;28042:10;-1:-1:-1;;;;;28067:6:14;28064:30;28061:56;;;28097:18;;:::i;:::-;28126:97;28216:6;28176:38;28208:4;28202:11;28176:38;:::i;:::-;28170:4;28126:97;:::i;:::-;28272:4;28303:2;28292:14;;28320:1;28315:649;;;;29008:1;29025:6;29022:89;;;-1:-1:-1;29077:19:14;;;29071:26;29022:89;-1:-1:-1;;9349:1:14;9345:11;;;9341:24;9337:29;9327:40;9373:1;9369:11;;;9324:57;29124:81;;28285:930;;28315:649;8645:1;8638:14;;;8682:4;8669:18;;-1:-1:-1;;28351:20:14;;;28469:222;28483:7;28480:1;28477:14;28469:222;;;28565:19;;;28559:26;28544:42;;28672:4;28657:20;;;;28625:1;28613:14;;;;28499:12;28469:222;;;28473:3;28719:6;28710:7;28707:19;28704:201;;;28780:19;;;28774:26;-1:-1:-1;;28863:1:14;28859:14;;;28875:3;28855:24;28851:37;28847:42;28832:58;28817:74;;28704:201;-1:-1:-1;;;;28951:1:14;28935:14;;;28931:22;28918:36;;-1:-1:-1;27924:1297:14:o;31543:128::-;31610:9;;;31631:11;;;31628:37;;;31645:18;;:::i;31676:125::-;31741:9;;;31762:10;;;31759:36;;;31775:18;;:::i;31806:300::-;31961:3;31992:29;32017:3;32009:6;31992:29;:::i;:::-;-1:-1:-1;;;;;;32044:26:14;;;;32030:41;;-1:-1:-1;;32098:1:14;32087:13;;31806:300;-1:-1:-1;31806:300:14:o;32332:413::-;32597:3;32628:29;32653:3;32645:6;32628:29;:::i;:::-;-1:-1:-1;;;32673:5:14;32666:18;32700:39;32736:1;32729:5;32725:13;32717:6;32700:39;:::i;32750:618::-;32936:2;32948:21;;;33018:13;;32921:18;;;33040:22;;;32888:4;;33119:15;;;33093:2;33078:18;;;32888:4;33162:180;33176:6;33173:1;33170:13;33162:180;;;33241:13;;33256:4;33237:24;33225:37;;33291:2;33317:15;;;;33282:12;;;;33198:1;33191:9;33162:180;;;-1:-1:-1;33359:3:14;;32750:618;-1:-1:-1;;;;;32750:618:14:o;33727:414::-;33929:2;33911:21;;;33968:2;33948:18;;;33941:30;34007:34;34002:2;33987:18;;33980:62;-1:-1:-1;;;34073:2:14;34058:18;;34051:48;34131:3;34116:19;;33727:414::o;34146:265::-;34325:3;34350:55;34375:29;34400:3;34392:6;34375:29;:::i;:::-;34367:6;34350:55;:::i;34416:685::-;34786:3;34814:29;34839:3;34831:6;34814:29;:::i;:::-;34863:66;34852:78;;-1:-1:-1;;;34954:2:14;34946:11;;34939:41;35002:37;35035:2;35027:11;;35019:6;35002:37;:::i;:::-;-1:-1:-1;;;35048:18:14;;35093:1;35082:13;;34416:685;-1:-1:-1;;;;;34416:685:14:o;35106:700::-;35476:3;35504:29;35529:3;35521:6;35504:29;:::i;:::-;35553:66;35542:78;;-1:-1:-1;;;35644:2:14;35636:11;;35629:45;35696:37;35729:2;35721:11;;35713:6;35696:37;:::i;:::-;-1:-1:-1;;;35742:29:14;;35798:1;35787:13;;35106:700;-1:-1:-1;;;;;35106:700:14:o;35811:343::-;36032:3;36063:29;36088:3;36080:6;36063:29;:::i;:::-;-1:-1:-1;;;36101:18:14;;36146:1;36135:13;;35811:343;-1:-1:-1;;;35811:343:14:o;36159:151::-;36249:4;36242:12;;;36228;;;36224:31;;36267:14;;36264:40;;;36284:18;;:::i;39217:2991::-;41002:66;40990:79;;41099:66;41094:2;41085:12;;41078:88;-1:-1:-1;;;41191:2:14;41182:12;;41175:50;41255:34;41250:2;41241:12;;41234:56;-1:-1:-1;;;41315:3:14;41306:13;;41299:27;41407:34;41357:3;41348:13;;41393:49;;;-1:-1:-1;;;41458:14:14;;;41451:48;-1:-1:-1;;41517:14:14;;;41553:88;41578:62;41603:36;41517:14;36392:66;36380:79;;36489:66;36484:2;36475:12;;36468:88;36581:2;36572:12;;36315:275;41603:36;36667:66;36655:79;;36764:66;36759:2;36750:12;;36743:88;36856:2;36847:12;;36595:270;41578:62;41570:6;41553:88;:::i;:::-;41540:101;;;41650:36;41680:5;36940:66;36928:79;;36870:143;41650:36;37095:66;41804:2;41793:14;;37083:79;-1:-1:-1;;;37178:12:14;;;37171:77;37364:66;37264:12;;;37352:79;37461:66;37447:12;;;37440:88;-1:-1:-1;;;37544:12:14;;;37537:29;41708:102;37582:12;;;41725:6;41708:102;:::i;:::-;-1:-1:-1;;;37663:63:14;;37814:66;41918:2;41907:14;;37802:79;37911:66;37897:12;;;37890:88;38087:66;37994:12;;;38075:79;38242:66;42109:14;;;38230:79;-1:-1:-1;;;38325:12:14;;;38318:32;38466:66;38366:12;;;38454:79;-1:-1:-1;;;38549:12:14;;;38542:39;38697:34;38597:12;;;38685:47;-1:-1:-1;;;38748:12:14;;;38741:56;38913:66;38813:12;;;38901:79;39010:34;38996:12;;;38989:56;-1:-1:-1;;;39061:12:14;;;39054:25;-1:-1:-1;;;39095:12:14;;;39176:30;42188:14;;;;-1:-1:-1;;;;;39217:2991:14:o;42213:341::-;42465:28;42460:3;42453:41;42435:3;42510:38;42544:2;42539:3;42535:12;42527:6;42510:38;:::i;42793:384::-;42974:3;43005:29;43030:3;43022:6;43005:29;:::i;:::-;-1:-1:-1;;;;;;43057:26:14;;;43043:41;;43115:26;;;;43111:1;43100:13;;43093:49;-1:-1:-1;43169:1:14;43158:13;;42793:384;-1:-1:-1;;42793:384:14:o;43182:1026::-;43276:6;43329:2;43317:9;43308:7;43304:23;43300:32;43297:52;;;43345:1;43342;43335:12;43297:52;43378:9;43372:16;-1:-1:-1;;;;;43403:6:14;43400:30;43397:50;;;43443:1;43440;43433:12;43397:50;43466:22;;43519:4;43511:13;;43507:27;-1:-1:-1;43497:55:14;;43548:1;43545;43538:12;43497:55;43581:2;43575:9;-1:-1:-1;;;;;43599:6:14;43596:30;43593:56;;;43629:18;;:::i;:::-;43675:6;43672:1;43668:14;43702:28;43726:2;43722;43718:11;43702:28;:::i;:::-;43764:19;;;43808:2;43838:11;;;43834:20;;;43799:12;;;;43866:19;;;43863:39;;;43898:1;43895;43888:12;43863:39;43930:2;43926;43922:11;43911:22;;43942:236;43958:6;43953:3;43950:15;43942:236;;;44031:3;44025:10;44012:23;;44079:6;44072:5;44068:18;44061:5;44058:29;44048:57;;44101:1;44098;44091:12;44048:57;44118:18;;;44165:2;43975:12;;;;44156;;;;43942:236;;;44197:5;43182:1026;-1:-1:-1;;;;;;;43182:1026:14:o;44213:485::-;-1:-1:-1;;;;;44444:32:14;;;44426:51;;44513:32;;44508:2;44493:18;;44486:60;44577:2;44562:18;;44555:34;;;44625:3;44620:2;44605:18;;44598:31;;;-1:-1:-1;;44646:46:14;;44672:19;;44664:6;44646:46;:::i;:::-;44638:54;44213:485;-1:-1:-1;;;;;;44213:485:14:o;44703:249::-;44772:6;44825:2;44813:9;44804:7;44800:23;44796:32;44793:52;;;44841:1;44838;44831:12;44793:52;44873:9;44867:16;44892:30;44916:5;44892:30;:::i;44957:135::-;44996:3;45017:17;;;45014:43;;45037:18;;:::i;:::-;-1:-1:-1;45084:1:14;45073:13;;44957:135::o;45097:112::-;45129:1;45155;45145:35;;45160:18;;:::i;:::-;-1:-1:-1;45194:9:14;;45097:112::o
Swarm Source
ipfs://d16749a3fa0636c1695a800ccb7755b0d8d531d56b296d439308bea9c602f859
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.