Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 Unicode (for Geeks)
Holders
253
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 Unicode (for Geeks)Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
UnicodeForGeeks
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-11 */ // _ _ _ _ ____ _____ _ __ // | | | | (_) | | / / _| / ____| | | \ \ // | | | |_ __ _ ___ ___ __| | ___ | | |_ ___ _ __ | | __ ___ ___| | _____| | // | | | | '_ \| |/ __/ _ \ / _` |/ _ \ | | _/ _ \| '__| | | |_ |/ _ \/ _ \ |/ / __| | // | |__| | | | | | (_| (_) | (_| | __/ | | || (_) | | | |__| | __/ __/ <\__ \ | // \____/|_| |_|_|\___\___/ \__,_|\___| | |_| \___/|_| \_____|\___|\___|_|\_\___/ | // \_\ /_/ // // An NFT contract for Unicode characters. Strictly limited supply of 143,859, but only one u. // Free to mint - call `mintAny()` or `mintAll()`. // File: UnicodeMap.sol pragma solidity ^0.8.2; library UnicodeMap { function codepointToBlock(uint256 cp) external pure returns(string memory) { if(cp < 66560) { if(cp < 10224) { if(cp < 5920) { if(cp < 2304) { if(cp < 1424) { if(cp < 688) { if(cp < 256) { if(cp < 128) { return "Basic Latin"; } else { return "Latin-1 Supplement"; } } else { if(cp < 384) { return "Latin Extended-A"; } else { if(cp < 592) { return "Latin Extended-B"; } else { return "IPA Extensions"; } } } } else { if(cp < 1024) { if(cp < 768) { return "Spacing Modifier Letters"; } else { if(cp < 880) { return "Combining Diacritical Marks"; } else { return "Greek and Coptic"; } } } else { if(cp < 1280) { return "Cyrillic"; } else { if(cp < 1328) { return "Cyrillic Supplement"; } else { return "Armenian"; } } } } } else { if(cp < 1984) { if(cp < 1792) { if(cp < 1536) { return "Hebrew"; } else { return "Arabic"; } } else { if(cp < 1872) { return "Syriac"; } else { if(cp < 1920) { return "Arabic Supplement"; } else { return "Thaana"; } } } } else { if(cp < 2144) { if(cp < 2048) { return "NKo"; } else { if(cp < 2112) { return "Samaritan"; } else { return "Mandaic"; } } } else { if(cp < 2160) { return "Syriac Supplement"; } else { if(cp < 2208) { return ""; } else { return "Arabic Extended-A"; } } } } } } else { if(cp < 3712) { if(cp < 2944) { if(cp < 2560) { if(cp < 2432) { return "Devanagari"; } else { return "Bengali"; } } else { if(cp < 2688) { return "Gurmukhi"; } else { if(cp < 2816) { return "Gujarati"; } else { return "Oriya"; } } } } else { if(cp < 3328) { if(cp < 3072) { return "Tamil"; } else { if(cp < 3200) { return "Telugu"; } else { return "Kannada"; } } } else { if(cp < 3456) { return "Malayalam"; } else { if(cp < 3584) { return "Sinhala"; } else { return "Thai"; } } } } } else { if(cp < 4992) { if(cp < 4256) { if(cp < 3840) { return "Lao"; } else { if(cp < 4096) { return "Tibetan"; } else { return "Myanmar"; } } } else { if(cp < 4352) { return "Georgian"; } else { if(cp < 4608) { return "Hangul Jamo"; } else { return "Ethiopic"; } } } } else { if(cp < 5760) { if(cp < 5024) { return "Ethiopic Supplement"; } else { if(cp < 5120) { return "Cherokee"; } else { return "Unified Canadian Aboriginal Syllabics"; } } } else { if(cp < 5792) { return "Ogham"; } else { if(cp < 5888) { return "Runic"; } else { return "Tagalog"; } } } } } } } else { if(cp < 7424) { if(cp < 6688) { if(cp < 6320) { if(cp < 5984) { if(cp < 5952) { return "Hanunoo"; } else { return "Buhid"; } } else { if(cp < 6016) { return "Tagbanwa"; } else { if(cp < 6144) { return "Khmer"; } else { return "Mongolian"; } } } } else { if(cp < 6528) { if(cp < 6400) { return "Unified Canadian Aboriginal Syllabics Extended"; } else { if(cp < 6480) { return "Limbu"; } else { return "Tai Le"; } } } else { if(cp < 6624) { return "New Tai Lue"; } else { if(cp < 6656) { return "Khmer Symbols"; } else { return "Buginese"; } } } } } else { if(cp < 7168) { if(cp < 6912) { if(cp < 6832) { return "Tai Tham"; } else { return "Combining Diacritical Marks Extended"; } } else { if(cp < 7040) { return "Balinese"; } else { if(cp < 7104) { return "Sundanese"; } else { return "Batak"; } } } } else { if(cp < 7312) { if(cp < 7248) { return "Lepcha"; } else { if(cp < 7296) { return "Ol Chiki"; } else { return "Cyrillic Extended-C"; } } } else { if(cp < 7360) { return "Georgian Extended"; } else { if(cp < 7376) { return "Sundanese Supplement"; } else { return "Vedic Extensions"; } } } } } } else { if(cp < 8592) { if(cp < 8192) { if(cp < 7616) { if(cp < 7552) { return "Phonetic Extensions"; } else { return "Phonetic Extensions Supplement"; } } else { if(cp < 7680) { return "Combining Diacritical Marks Supplement"; } else { if(cp < 7936) { return "Latin Extended Additional"; } else { return "Greek Extended"; } } } } else { if(cp < 8400) { if(cp < 8304) { return "General Punctuation"; } else { if(cp < 8352) { return "Superscripts and Subscripts"; } else { return "Currency Symbols"; } } } else { if(cp < 8448) { return "Combining Diacritical Marks for Symbols"; } else { if(cp < 8528) { return "Letterlike Symbols"; } else { return "Number Forms"; } } } } } else { if(cp < 9472) { if(cp < 9216) { if(cp < 8704) { return "Arrows"; } else { if(cp < 8960) { return "Mathematical Operators"; } else { return "Miscellaneous Technical"; } } } else { if(cp < 9280) { return "Control Pictures"; } else { if(cp < 9312) { return "Optical Character Recognition"; } else { return "Enclosed Alphanumerics"; } } } } else { if(cp < 9728) { if(cp < 9600) { return "Box Drawing"; } else { if(cp < 9632) { return "Block Elements"; } else { return "Geometric Shapes"; } } } else { if(cp < 9984) { return "Miscellaneous Symbols"; } else { if(cp < 10176) { return "Dingbats"; } else { return "Miscellaneous Mathematical Symbols-A"; } } } } } } } } else { if(cp < 43264) { if(cp < 12592) { if(cp < 11648) { if(cp < 11008) { if(cp < 10496) { if(cp < 10240) { return "Supplemental Arrows-A"; } else { return "Braille Patterns"; } } else { if(cp < 10624) { return "Supplemental Arrows-B"; } else { if(cp < 10752) { return "Miscellaneous Mathematical Symbols-B"; } else { return "Supplemental Mathematical Operators"; } } } } else { if(cp < 11392) { if(cp < 11264) { return "Miscellaneous Symbols and Arrows"; } else { if(cp < 11360) { return "Glagolitic"; } else { return "Latin Extended-C"; } } } else { if(cp < 11520) { return "Coptic"; } else { if(cp < 11568) { return "Georgian Supplement"; } else { return "Tifinagh"; } } } } } else { if(cp < 12256) { if(cp < 11776) { if(cp < 11744) { return "Ethiopic Extended"; } else { return "Cyrillic Extended-A"; } } else { if(cp < 11904) { return "Supplemental Punctuation"; } else { if(cp < 12032) { return "CJK Radicals Supplement"; } else { return "Kangxi Radicals"; } } } } else { if(cp < 12352) { if(cp < 12272) { return ""; } else { if(cp < 12288) { return "Ideographic Description Characters"; } else { return "CJK Symbols and Punctuation"; } } } else { if(cp < 12448) { return "Hiragana"; } else { if(cp < 12544) { return "Katakana"; } else { return "Bopomofo"; } } } } } } else { if(cp < 42128) { if(cp < 12800) { if(cp < 12704) { if(cp < 12688) { return "Hangul Compatibility Jamo"; } else { return "Kanbun"; } } else { if(cp < 12736) { return "Bopomofo Extended"; } else { if(cp < 12784) { return "CJK Strokes"; } else { return "Katakana Phonetic Extensions"; } } } } else { if(cp < 19904) { if(cp < 13056) { return "Enclosed CJK Letters and Months"; } else { if(cp < 13312) { return "CJK Compatibility"; } else { return "CJK Unified Ideographs Extension A"; } } } else { if(cp < 19968) { return "Yijing Hexagram Symbols"; } else { if(cp < 40960) { return "CJK Unified Ideographs"; } else { return "Yi Syllables"; } } } } } else { if(cp < 42784) { if(cp < 42560) { if(cp < 42192) { return "Yi Radicals"; } else { if(cp < 42240) { return "Lisu"; } else { return "Vai"; } } } else { if(cp < 42656) { return "Cyrillic Extended-B"; } else { if(cp < 42752) { return "Bamum"; } else { return "Modifier Tone Letters"; } } } } else { if(cp < 43072) { if(cp < 43008) { return "Latin Extended-D"; } else { if(cp < 43056) { return "Syloti Nagri"; } else { return "Common Indic Number Forms"; } } } else { if(cp < 43136) { return "Phags-pa"; } else { if(cp < 43232) { return "Saurashtra"; } else { return "Devanagari Extended"; } } } } } } } else { if(cp < 65040) { if(cp < 43888) { if(cp < 43520) { if(cp < 43360) { if(cp < 43312) { return "Kayah Li"; } else { return "Rejang"; } } else { if(cp < 43392) { return "Hangul Jamo Extended-A"; } else { if(cp < 43488) { return "Javanese"; } else { return "Myanmar Extended-B"; } } } } else { if(cp < 43744) { if(cp < 43616) { return "Cham"; } else { if(cp < 43648) { return "Myanmar Extended-A"; } else { return "Tai Viet"; } } } else { if(cp < 43776) { return "Meetei Mayek Extensions"; } else { if(cp < 43824) { return "Ethiopic Extended-A"; } else { return "Latin Extended-E"; } } } } } else { if(cp < 56320) { if(cp < 55216) { if(cp < 43968) { return "Cherokee Supplement"; } else { if(cp < 44032) { return "Meetei Mayek"; } else { return "Hangul Syllables"; } } } else { if(cp < 55296) { return "Hangul Jamo Extended-B"; } else { if(cp < 56192) { return "High Surrogates"; } else { return "High Private Use Surrogates"; } } } } else { if(cp < 64256) { if(cp < 57344) { return "Low Surrogates"; } else { if(cp < 63744) { return "Private Use Area"; } else { return "CJK Compatibility Ideographs"; } } } else { if(cp < 64336) { return "Alphabetic Presentation Forms"; } else { if(cp < 65024) { return "Arabic Presentation Forms-A"; } else { return "Variation Selectors"; } } } } } } else { if(cp < 65936) { if(cp < 65280) { if(cp < 65072) { if(cp < 65056) { return "Vertical Forms"; } else { return "Combining Half Marks"; } } else { if(cp < 65104) { return "CJK Compatibility Forms"; } else { if(cp < 65136) { return "Small Form Variants"; } else { return "Arabic Presentation Forms-B"; } } } } else { if(cp < 65664) { if(cp < 65520) { return "Halfwidth and Fullwidth Forms"; } else { if(cp < 65536) { return "Specials"; } else { return "Linear B Syllabary"; } } } else { if(cp < 65792) { return "Linear B Ideograms"; } else { if(cp < 65856) { return "Aegean Numbers"; } else { return "Ancient Greek Numbers"; } } } } } else { if(cp < 66304) { if(cp < 66176) { if(cp < 66000) { return "Ancient Symbols"; } else { if(cp < 66048) { return "Phaistos Disc"; } else { return ""; } } } else { if(cp < 66208) { return "Lycian"; } else { if(cp < 66272) { return "Carian"; } else { return "Coptic Epact Numbers"; } } } } else { if(cp < 66432) { if(cp < 66352) { return "Old Italic"; } else { if(cp < 66384) { return "Gothic"; } else { return "Old Permic"; } } } else { if(cp < 66464) { return "Ugaritic"; } else { if(cp < 66528) { return "Old Persian"; } else { return ""; } } } } } } } } } else { if(cp < 75088) { if(cp < 69840) { if(cp < 68224) { if(cp < 67680) { if(cp < 66864) { if(cp < 66688) { if(cp < 66640) { return "Deseret"; } else { return "Shavian"; } } else { if(cp < 66736) { return "Osmanya"; } else { if(cp < 66816) { return "Osage"; } else { return "Elbasan"; } } } } else { if(cp < 67456) { if(cp < 66928) { return "Caucasian Albanian"; } else { if(cp < 67072) { return ""; } else { return "Linear A"; } } } else { if(cp < 67584) { return ""; } else { if(cp < 67648) { return "Cypriot Syllabary"; } else { return "Imperial Aramaic"; } } } } } else { if(cp < 67872) { if(cp < 67760) { if(cp < 67712) { return "Palmyrene"; } else { return "Nabataean"; } } else { if(cp < 67808) { return ""; } else { if(cp < 67840) { return "Hatran"; } else { return "Phoenician"; } } } } else { if(cp < 68000) { if(cp < 67904) { return "Lydian"; } else { if(cp < 67968) { return ""; } else { return "Meroitic Hieroglyphs"; } } } else { if(cp < 68096) { return "Meroitic Cursive"; } else { if(cp < 68192) { return "Kharoshthi"; } else { return "Old South Arabian"; } } } } } } else { if(cp < 68864) { if(cp < 68448) { if(cp < 68288) { if(cp < 68256) { return "Old North Arabian"; } else { return ""; } } else { if(cp < 68352) { return "Manichaean"; } else { if(cp < 68416) { return "Avestan"; } else { return "Inscriptional Parthian"; } } } } else { if(cp < 68608) { if(cp < 68480) { return "Inscriptional Pahlavi"; } else { if(cp < 68528) { return "Psalter Pahlavi"; } else { return ""; } } } else { if(cp < 68688) { return "Old Turkic"; } else { if(cp < 68736) { return ""; } else { return "Old Hungarian"; } } } } } else { if(cp < 69424) { if(cp < 69248) { if(cp < 68928) { return "Hanifi Rohingya"; } else { if(cp < 69216) { return ""; } else { return "Rumi Numeral Symbols"; } } } else { if(cp < 69312) { return "Yezidi"; } else { if(cp < 69376) { return ""; } else { return "Old Sogdian"; } } } } else { if(cp < 69600) { if(cp < 69488) { return "Sogdian"; } else { if(cp < 69552) { return ""; } else { return "Chorasmian"; } } } else { if(cp < 69632) { return "Elymaic"; } else { if(cp < 69760) { return "Brahmi"; } else { return "Kaithi"; } } } } } } } else { if(cp < 71760) { if(cp < 70656) { if(cp < 70144) { if(cp < 69968) { if(cp < 69888) { return "Sora Sompeng"; } else { return "Chakma"; } } else { if(cp < 70016) { return "Mahajani"; } else { if(cp < 70112) { return "Sharada"; } else { return "Sinhala Archaic Numbers"; } } } } else { if(cp < 70320) { if(cp < 70224) { return "Khojki"; } else { if(cp < 70272) { return ""; } else { return "Multani"; } } } else { if(cp < 70400) { return "Khudawadi"; } else { if(cp < 70528) { return "Grantha"; } else { return ""; } } } } } else { if(cp < 71264) { if(cp < 70880) { if(cp < 70784) { return "Newa"; } else { return "Tirhuta"; } } else { if(cp < 71040) { return ""; } else { if(cp < 71168) { return "Siddham"; } else { return "Modi"; } } } } else { if(cp < 71424) { if(cp < 71296) { return "Mongolian Supplement"; } else { if(cp < 71376) { return "Takri"; } else { return ""; } } } else { if(cp < 71488) { return "Ahom"; } else { if(cp < 71680) { return ""; } else { return "Dogra"; } } } } } } else { if(cp < 72816) { if(cp < 72192) { if(cp < 71936) { if(cp < 71840) { return ""; } else { return "Warang Citi"; } } else { if(cp < 72032) { return "Dives Akuru"; } else { if(cp < 72096) { return ""; } else { return "Nandinagari"; } } } } else { if(cp < 72384) { if(cp < 72272) { return "Zanabazar Square"; } else { if(cp < 72368) { return "Soyombo"; } else { return ""; } } } else { if(cp < 72448) { return "Pau Cin Hau"; } else { if(cp < 72704) { return ""; } else { return "Bhaiksuki"; } } } } } else { if(cp < 73472) { if(cp < 73056) { if(cp < 72896) { return "Marchen"; } else { if(cp < 72960) { return ""; } else { return "Masaram Gondi"; } } } else { if(cp < 73136) { return "Gunjala Gondi"; } else { if(cp < 73440) { return ""; } else { return "Makasar"; } } } } else { if(cp < 73728) { if(cp < 73648) { return ""; } else { if(cp < 73664) { return "Lisu Supplement"; } else { return "Tamil Supplement"; } } } else { if(cp < 74752) { return "Cuneiform"; } else { if(cp < 74880) { return "Cuneiform Numbers and Punctuation"; } else { return "Early Dynastic Cuneiform"; } } } } } } } } else { if(cp < 123584) { if(cp < 110592) { if(cp < 93072) { if(cp < 83584) { if(cp < 78896) { if(cp < 77824) { return ""; } else { return "Egyptian Hieroglyphs"; } } else { if(cp < 78912) { return "Egyptian Hieroglyph Format Controls"; } else { if(cp < 82944) { return ""; } else { return "Anatolian Hieroglyphs"; } } } } else { if(cp < 92784) { if(cp < 92160) { return ""; } else { if(cp < 92736) { return "Bamum Supplement"; } else { return "Mro"; } } } else { if(cp < 92880) { return ""; } else { if(cp < 92928) { return "Bassa Vah"; } else { return "Pahawh Hmong"; } } } } } else { if(cp < 94176) { if(cp < 93856) { if(cp < 93760) { return ""; } else { return "Medefaidrin"; } } else { if(cp < 93952) { return ""; } else { if(cp < 94112) { return "Miao"; } else { return ""; } } } } else { if(cp < 101120) { if(cp < 94208) { return "Ideographic Symbols and Punctuation"; } else { if(cp < 100352) { return "Tangut"; } else { return "Tangut Components"; } } } else { if(cp < 101632) { return "Khitan Small Script"; } else { if(cp < 101776) { return "Tangut Supplement"; } else { return ""; } } } } } } else { if(cp < 119376) { if(cp < 113664) { if(cp < 110896) { if(cp < 110848) { return "Kana Supplement"; } else { return "Kana Extended-A"; } } else { if(cp < 110960) { return "Small Kana Extension"; } else { if(cp < 111360) { return "Nushu"; } else { return ""; } } } } else { if(cp < 118784) { if(cp < 113824) { return "Duployan"; } else { if(cp < 113840) { return "Shorthand Format Controls"; } else { return ""; } } } else { if(cp < 119040) { return "Byzantine Musical Symbols"; } else { if(cp < 119296) { return "Musical Symbols"; } else { return "Ancient Greek Musical Notation"; } } } } } else { if(cp < 120832) { if(cp < 119648) { if(cp < 119520) { return ""; } else { if(cp < 119552) { return "Mayan Numerals"; } else { return "Tai Xuan Jing Symbols"; } } } else { if(cp < 119680) { return "Counting Rod Numerals"; } else { if(cp < 119808) { return ""; } else { return "Mathematical Alphanumeric Symbols"; } } } } else { if(cp < 122928) { if(cp < 121520) { return "Sutton SignWriting"; } else { if(cp < 122880) { return ""; } else { return "Glagolitic Supplement"; } } } else { if(cp < 123136) { return ""; } else { if(cp < 123216) { return "Nyiakeng Puachue Hmong"; } else { return ""; } } } } } } } else { if(cp < 129024) { if(cp < 126720) { if(cp < 125280) { if(cp < 124928) { if(cp < 123648) { return "Wancho"; } else { return ""; } } else { if(cp < 125152) { return "Mende Kikakui"; } else { if(cp < 125184) { return ""; } else { return "Adlam"; } } } } else { if(cp < 126208) { if(cp < 126064) { return ""; } else { if(cp < 126144) { return "Indic Siyaq Numbers"; } else { return ""; } } } else { if(cp < 126288) { return "Ottoman Siyaq Numbers"; } else { if(cp < 126464) { return ""; } else { return "Arabic Mathematical Alphabetic Symbols"; } } } } } else { if(cp < 127744) { if(cp < 127136) { if(cp < 126976) { return ""; } else { if(cp < 127024) { return "Mahjong Tiles"; } else { return "Domino Tiles"; } } } else { if(cp < 127232) { return "Playing Cards"; } else { if(cp < 127488) { return "Enclosed Alphanumeric Supplement"; } else { return "Enclosed Ideographic Supplement"; } } } } else { if(cp < 128640) { if(cp < 128512) { return "Miscellaneous Symbols and Pictographs"; } else { if(cp < 128592) { return "Emoticons"; } else { return "Ornamental Dingbats"; } } } else { if(cp < 128768) { return "Transport and Map Symbols"; } else { if(cp < 128896) { return "Alchemical Symbols"; } else { return "Geometric Shapes Extended"; } } } } } } else { if(cp < 183984) { if(cp < 130048) { if(cp < 129536) { if(cp < 129280) { return "Supplemental Arrows-C"; } else { return "Supplemental Symbols and Pictographs"; } } else { if(cp < 129648) { return "Chess Symbols"; } else { if(cp < 129792) { return "Symbols and Pictographs Extended-A"; } else { return "Symbols for Legacy Computing"; } } } } else { if(cp < 173824) { if(cp < 131072) { return ""; } else { if(cp < 173792) { return "CJK Unified Ideographs Extension B"; } else { return ""; } } } else { if(cp < 177984) { return "CJK Unified Ideographs Extension C"; } else { if(cp < 178208) { return "CJK Unified Ideographs Extension D"; } else { return "CJK Unified Ideographs Extension E"; } } } } } else { if(cp < 917504) { if(cp < 195104) { if(cp < 191472) { return "CJK Unified Ideographs Extension F"; } else { if(cp < 194560) { return ""; } else { return "CJK Compatibility Ideographs Supplement"; } } } else { if(cp < 196608) { return ""; } else { if(cp < 201552) { return "CJK Unified Ideographs Extension G"; } else { return ""; } } } } else { if(cp < 918000) { if(cp < 917632) { return "Tags"; } else { if(cp < 917760) { return ""; } else { return "Variation Selectors Supplement"; } } } else { if(cp < 983040) { return ""; } else { if(cp < 1048576) { return "Supplementary Private Use Area-A"; } else { return "Supplementary Private Use Area-B"; } } } } } } } } } } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/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); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @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; } } // File: @openzeppelin/contracts/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); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/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); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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); } /** * @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); } /** * @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 of token that is not own"); 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); } /** * @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 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 {} } // File: unicode.sol pragma solidity ^0.8.2; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } contract UnicodeForGeeks is ERC721, Ownable { constructor() ERC721("Unicode (for Geeks)", hex"efbfbd") {} /** * @dev Mints all the characters in `chars`. Reverts if any are already minted. * @param to The address that should own the newly minted characters. * @param chars The characters to mint. */ function mintAll(address to, string calldata chars) external { for(uint256 offset = 0; offset < bytes(chars).length;) { (uint256 codepoint, uint256 len) = charToCodepoint(chars, offset); // Check the character is valid require(bytes(UnicodeMap.codepointToBlock(codepoint)).length > 0, "Invalid character"); _safeMint(to, codepoint); offset += len; } } /** * @dev Mints any of the characters in `chars` that are not already minted. * @param to The address that should own the newly minted characters. * @param chars The characters to mint. */ function mintAny(address to, string calldata chars) external { for(uint256 offset = 0; offset < bytes(chars).length;) { (uint256 codepoint, uint256 len) = charToCodepoint(chars, offset); // Check the character is valid require(bytes(UnicodeMap.codepointToBlock(codepoint)).length > 0, "Invalid character"); if(!_exists(codepoint)) { _safeMint(to, codepoint); } offset += len; } } /** * @dev Reads the UTF-8 character starting at `offset` from `char`. * @param char The string containing the chararacter to read. * @param offset The offset to start reading at. * @return codepoint The Unicode codepoint at `offset`. * @return len The length in bytes of the unicode character just read. */ function charToCodepoint(string memory char, uint256 offset) public pure returns(uint256 codepoint, uint256 len) { bytes memory ch = bytes(char); if(ch[offset] & 0x80 == 0) { require(ch.length >= offset + 1, "Invalid unicode chacter"); return (uint256(uint8(ch[offset])), 1); } if(ch[offset] & 0xE0 == 0xC0) { require(ch.length >= offset + 2 && ch[offset + 1] & 0xC0 == 0x80, "Invalid unicode chacter"); return ((uint256(uint8(ch[offset] & 0x1F)) << 6) | uint256(uint8(ch[offset + 1] & 0x3F)), 2); } if(ch[offset] & 0xF0 == 0xE0) { require(ch.length >= offset + 3 && ch[offset + 1] & 0xC0 == 0x80 && ch[offset + 2] & 0xC0 == 0x80, "Invalid unicode chacter"); return ((uint256(uint8(ch[offset] & 0x0F)) << 12) | (uint256(uint8(ch[offset + 1] & 0x3F)) << 6) | uint256(uint8(ch[offset + 2] & 0x3F)), 3); } if(ch[offset] & 0xF8 == 0xF0) { require(ch.length >= offset + 4 && ch[offset + 1] & 0xC0 == 0x80 && ch[offset + 2] & 0xC0 == 0x80 && ch[offset + 3] & 0xC0 == 0x80, "Invalid unicode chacter"); return ((uint256(uint8(ch[offset] & 0x07)) << 18) | (uint256(uint8(ch[offset + 1] & 0x3F)) << 12) | (uint256(uint8(ch[offset + 2] & 0x3F)) << 6) | uint256(uint8(ch[offset + 3] & 0x3F)), 4); } revert("Invalid unicode chacter"); } /** * @dev Converts a Unicode codepoint into a single-character UTF-8 string. * @param cp The codepoint to convert. * @return The UTF-8 string. */ function codepointToChar(uint256 cp) public pure returns(string memory) { if(cp <= 0x7F) { bytes memory ret = new bytes(1); ret[0] = bytes1(uint8(cp)); return string(ret); } if(cp <= 0x7FF) { bytes memory ret = new bytes(2); ret[0] = bytes1(uint8(0xC0 | (cp >> 6))); ret[1] = bytes1(uint8(0x80 | (cp & 0x3F))); return string(ret); } if(cp <= 0xFFFF) { bytes memory ret = new bytes(3); ret[0] = bytes1(uint8(0xE0 | (cp >> 12))); ret[1] = bytes1(uint8(0x80 | ((cp >> 6) & 0x3F))); ret[2] = bytes1(uint8(0x80 | (cp & 0x3F))); return string(ret); } if(cp <= 0x10FFFF) { bytes memory ret = new bytes(4); ret[0] = bytes1(uint8(0xF0 | (cp >> 18))); ret[1] = bytes1(uint8(0x80 | ((cp >> 12) & 0x3F))); ret[2] = bytes1(uint8(0x80 | ((cp >> 6) & 0x3F))); ret[3] = bytes1(uint8(0x80 | (cp & 0x3F))); return string(ret); } revert("Invalid codepoint"); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory svgch = codepointToChar(tokenId); string memory jsonch = svgch; if(tokenId == 60) { // < svgch = "<"; } else if(tokenId == 38) { // & svgch = "&"; } else if(tokenId == 34) { // " jsonch = '\\"'; } string memory svg = string(abi.encodePacked('<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidyMid meet" viewBox="0 0 400 400"><style>.ch { text-anchor: middle; dominant-baseline: middle; fill: white; font-family: serif; font-size: 96px; }</style><rect width="100%" height="100%" fill="black" /><text x="200" y="200" class="ch">', svgch, '</text></svg>')); string memory json = string(abi.encodePacked('{"name":"', jsonch, '","description":"The unicode character ', jsonch, '","attributes":[{"trait_type":"Character Type","value":"', UnicodeMap.codepointToBlock(tokenId) ,'"}],"image":"data:image/svg+xml;base64,', Base64.encode(bytes(svg)), '"}')); return string(abi.encodePacked('data:application/json;base64,', Base64.encode(bytes(json)))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":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":[{"internalType":"string","name":"char","type":"string"},{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"charToCodepoint","outputs":[{"internalType":"uint256","name":"codepoint","type":"uint256"},{"internalType":"uint256","name":"len","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"cp","type":"uint256"}],"name":"codepointToChar","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"chars","type":"string"}],"name":"mintAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"chars","type":"string"}],"name":"mintAny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252601381527f556e69636f64652028666f72204765656b732900000000000000000000000000602080830191825283518085019094526003845262efbfbd60e81b908401528151919291620000729160009162000101565b5080516200008890600190602084019062000101565b505050620000a56200009f620000ab60201b60201c565b620000af565b620001e4565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010f90620001a7565b90600052602060002090601f0160209004810192826200013357600085556200017e565b82601f106200014e57805160ff19168380011785556200017e565b828001600101855582156200017e579182015b828111156200017e57825182559160200191906001019062000161565b506200018c92915062000190565b5090565b5b808211156200018c576000815560010162000191565b600181811c90821680620001bc57607f821691505b60208210811415620001de57634e487b7160e01b600052602260045260246000fd5b50919050565b6125ed80620001f46000396000f3fe608060405234801561001057600080fd5b50600436106100fc5760003560e01c806301ffc9a71461010157806306fdde0314610129578063081812fc1461013e578063095ea7b31461016957806323b872dd1461017e57806342842e0e146101915780636352211e146101a457806370a08231146101b7578063715018a6146101d85780638da5cb5b146101e057806395d89b41146101e8578063a22cb465146101f0578063b88d4fde14610203578063c1baee4614610216578063c87b56dd14610229578063cf9446a71461023c578063e5d7906c14610264578063e985e9c514610277578063f2fde38b1461028a578063fd07bbba1461029d575b600080fd5b61011461010f366004611dc9565b6102b0565b60405190151581526020015b60405180910390f35b610131610302565b604051610120919061228a565b61015161014c366004611ed1565b610394565b6040516001600160a01b039091168152602001610120565b61017c610177366004611d9f565b610421565b005b61017c61018c366004611c2a565b610532565b61017c61019f366004611c2a565b610563565b6101516101b2366004611ed1565b61057e565b6101ca6101c5366004611bd5565b6105f5565b604051908152602001610120565b61017c61067c565b6101516106b7565b6101316106c6565b61017c6101fe366004611ce1565b6106d5565b61017c610211366004611c66565b610796565b610131610224366004611ed1565b6107ce565b610131610237366004611ed1565b610a86565b61024f61024a366004611e79565b610c97565b60408051928352602083019190915201610120565b61017c610272366004611d1d565b611121565b610114610285366004611bf7565b611247565b61017c610298366004611bd5565b611275565b61017c6102ab366004611d1d565b611315565b60006001600160e01b031982166380ac58cd60e01b14806102e157506001600160e01b03198216635b5e139f60e01b145b806102fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610311906124c4565b80601f016020809104026020016040519081016040528092919081815260200182805461033d906124c4565b801561038a5780601f1061035f5761010080835404028352916020019161038a565b820191906000526020600020905b81548152906001019060200180831161036d57829003601f168201915b5050505050905090565b600061039f8261142e565b6104055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061042c8261057e565b9050806001600160a01b0316836001600160a01b0316141561049a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016103fc565b336001600160a01b03821614806104b657506104b68133611247565b6105235760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016103fc565b61052d838361144b565b505050565b61053c33826114b9565b6105585760405162461bcd60e51b81526004016103fc90612355565b61052d838383611583565b61052d83838360405180602001604052806000815250610796565b6000818152600260205260408120546001600160a01b0316806102fc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016103fc565b60006001600160a01b0382166106605760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016103fc565b506001600160a01b031660009081526003602052604090205490565b336106856106b7565b6001600160a01b0316146106ab5760405162461bcd60e51b81526004016103fc90612320565b6106b56000611711565b565b6006546001600160a01b031690565b606060018054610311906124c4565b6001600160a01b03821633141561072a5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016103fc565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6107a033836114b9565b6107bc5760405162461bcd60e51b81526004016103fc90612355565b6107c884848484611763565b50505050565b6060607f821161082d576040805160018082528183019092526000916020820181803683370190505090508260f81b8160008151811061081057610810612515565b60200101906001600160f81b031916908160001a90535092915050565b6107ff82116108a957604080516002808252818301909252600091602082018180368337019050509050600683901c60c01760f81b8160008151811061087557610875612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160018151811061081057610810612515565b61ffff821161095d57604080516003808252818301909252600091602082018180368337019050509050600c83901c60e01760f81b816000815181106108f1576108f1612515565b60200101906001600160f81b031916908160001a905350600683901c603f1660801760f81b8160018151811061092957610929612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160028151811061081057610810612515565b6210ffff8211610a4a57604080516004808252818301909252600091602082018180368337019050509050601283901c60f01760f81b816000815181106109a6576109a6612515565b60200101906001600160f81b031916908160001a905350600c83901c603f1660801760f81b816001815181106109de576109de612515565b60200101906001600160f81b031916908160001a905350600683901c603f1660801760f81b81600281518110610a1657610a16612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160038151811061081057610810612515565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590818dbd9195c1bda5b9d607a1b60448201526064016103fc565b6060610a918261142e565b610af55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016103fc565b6000610b00836107ce565b905080603c841415610b305760405180604001604052806004815260200163266c743b60e01b8152509150610b82565b8360261415610b5e576040518060400160405280600581526020016426616d703b60d81b8152509150610b82565b8360221415610b8257506040805180820190915260028152612e1160f11b60208201525b600082604051602001610b9591906120ac565b60405160208183030381529060405290506000828373fab7e2fb81b083f49fd7089ef3db68e8bbad126363652c9b0a896040518263ffffffff1660e01b8152600401610be391815260200190565b60006040518083038186803b158015610bfb57600080fd5b505af4158015610c0f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c379190810190611e03565b610c4085611796565b604051602001610c539493929190611f32565b6040516020818303038152906040529050610c6d81611796565b604051602001610c7d9190612067565b604051602081830303815290604052945050505050919050565b6000806000849050808481518110610cb157610cb1612515565b0160200151600160ff1b16610d1257610ccb846001612428565b81511015610ceb5760405162461bcd60e51b81526004016103fc906122ef565b808481518110610cfd57610cfd612515565b016020015160f81c92506001915061111a9050565b808481518110610d2457610d24612515565b602091010151600760fd1b16600360fe1b1415610dff57610d46846002612428565b815110158015610d80575080610d5d856001612428565b81518110610d6d57610d6d612515565b602091010151600360fe1b16600160ff1b145b610d9c5760405162461bcd60e51b81526004016103fc906122ef565b80610da8856001612428565b81518110610db857610db8612515565b602001015160f81c60f81b603f60f81b1660f81c60ff166006828681518110610de357610de3612515565b60209101015160f81c601f16901b1792506002915061111a9050565b808481518110610e1157610e11612515565b602091010151600f60fc1b16600760fd1b1415610f4f57610e33846003612428565b815110158015610e6d575080610e4a856001612428565b81518110610e5a57610e5a612515565b602091010151600360fe1b16600160ff1b145b8015610ea3575080610e80856002612428565b81518110610e9057610e90612515565b602091010151600360fe1b16600160ff1b145b610ebf5760405162461bcd60e51b81526004016103fc906122ef565b80610ecb856002612428565b81518110610edb57610edb612515565b60209101015160f81c603f16600682610ef5876001612428565b81518110610f0557610f05612515565b602001015160f81c60f81b603f60f81b1660f81c60ff16901b600c838781518110610f3257610f32612515565b60209101015160f81c600f16901b171792506003915061111a9050565b808481518110610f6157610f61612515565b602091010151601f60fb1b16600f60fc1b141561110257610f83846004612428565b815110158015610fbd575080610f9a856001612428565b81518110610faa57610faa612515565b602091010151600360fe1b16600160ff1b145b8015610ff3575080610fd0856002612428565b81518110610fe057610fe0612515565b602091010151600360fe1b16600160ff1b145b8015611029575080611006856003612428565b8151811061101657611016612515565b602091010151600360fe1b16600160ff1b145b6110455760405162461bcd60e51b81526004016103fc906122ef565b80611051856003612428565b8151811061106157611061612515565b60209101015160f81c603f1660068261107b876002612428565b8151811061108b5761108b612515565b60209101015160f81c603f16901b600c836110a7886001612428565b815181106110b7576110b7612515565b602001015160f81c60f81b603f60f81b1660f81c60ff16901b60128488815181106110e4576110e4612515565b60209101015160f81c600716901b17171792506004915061111a9050565b60405162461bcd60e51b81526004016103fc906122ef565b9250929050565b60005b818110156107c85760008061117085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250610c97915050565b6040516332964d8560e11b815260048101839052919350915060009073fab7e2fb81b083f49fd7089ef3db68e8bbad12639063652c9b0a9060240160006040518083038186803b1580156111c357600080fd5b505af41580156111d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ff9190810190611e03565b511161121d5760405162461bcd60e51b81526004016103fc906123a6565b6112268261142e565b6112345761123486836118fd565b61123e8184612428565b92505050611124565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3361127e6106b7565b6001600160a01b0316146112a45760405162461bcd60e51b81526004016103fc90612320565b6001600160a01b0381166113095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103fc565b61131281611711565b50565b60005b818110156107c85760008061136485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250610c97915050565b6040516332964d8560e11b815260048101839052919350915060009073fab7e2fb81b083f49fd7089ef3db68e8bbad12639063652c9b0a9060240160006040518083038186803b1580156113b757600080fd5b505af41580156113cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113f39190810190611e03565b51116114115760405162461bcd60e51b81526004016103fc906123a6565b61141b86836118fd565b6114258184612428565b92505050611318565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114808261057e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114c48261142e565b6115255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016103fc565b60006115308361057e565b9050806001600160a01b0316846001600160a01b0316148061156b5750836001600160a01b031661156084610394565b6001600160a01b0316145b8061157b575061157b8185611247565b949350505050565b826001600160a01b03166115968261057e565b6001600160a01b0316146115fe5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016103fc565b6001600160a01b0382166116605760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016103fc565b61166b60008261144b565b6001600160a01b0383166000908152600360205260408120805460019290611694908490612481565b90915550506001600160a01b03821660009081526003602052604081208054600192906116c2908490612428565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061259883398151915291a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61176e848484611583565b61177a8484848461191b565b6107c85760405162461bcd60e51b81526004016103fc9061229d565b60608151600014156117b657505060408051602081019091526000815290565b600060405180606001604052806040815260200161255860409139905060006003845160026117e59190612428565b6117ef9190612440565b6117fa906004612462565b90506000611809826020612428565b6001600160401b038111156118205761182061252b565b6040519080825280601f01601f19166020018201604052801561184a576020820181803683370190505b509050818152600183018586518101602084015b818310156118b85760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161185e565b6003895106600181146118d257600281146118e3576118ef565b613d3d60f01b6001198301526118ef565b603d60f81b6000198301525b509398975050505050505050565b611917828260405180602001604052806000815250611a28565b5050565b60006001600160a01b0384163b15611a1d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061195f90339089908890889060040161224d565b602060405180830381600087803b15801561197957600080fd5b505af19250505080156119a9575060408051601f3d908101601f191682019092526119a691810190611de6565b60015b611a03573d8080156119d7576040519150601f19603f3d011682016040523d82523d6000602084013e6119dc565b606091505b5080516119fb5760405162461bcd60e51b81526004016103fc9061229d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061157b565b506001949350505050565b611a328383611a5b565b611a3f600084848461191b565b61052d5760405162461bcd60e51b81526004016103fc9061229d565b6001600160a01b038216611ab15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016103fc565b611aba8161142e565b15611b065760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016103fc565b6001600160a01b0382166000908152600360205260408120805460019290611b2f908490612428565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020612598833981519152908290a45050565b6000611b8e611b8984612401565b6123d1565b9050828152838383011115611ba257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611bd057600080fd5b919050565b600060208284031215611be757600080fd5b611bf082611bb9565b9392505050565b60008060408385031215611c0a57600080fd5b611c1383611bb9565b9150611c2160208401611bb9565b90509250929050565b600080600060608486031215611c3f57600080fd5b611c4884611bb9565b9250611c5660208501611bb9565b9150604084013590509250925092565b60008060008060808587031215611c7c57600080fd5b611c8585611bb9565b9350611c9360208601611bb9565b92506040850135915060608501356001600160401b03811115611cb557600080fd5b8501601f81018713611cc657600080fd5b611cd587823560208401611b7b565b91505092959194509250565b60008060408385031215611cf457600080fd5b611cfd83611bb9565b915060208301358015158114611d1257600080fd5b809150509250929050565b600080600060408486031215611d3257600080fd5b611d3b84611bb9565b925060208401356001600160401b0380821115611d5757600080fd5b818601915086601f830112611d6b57600080fd5b813581811115611d7a57600080fd5b876020828501011115611d8c57600080fd5b6020830194508093505050509250925092565b60008060408385031215611db257600080fd5b611dbb83611bb9565b946020939093013593505050565b600060208284031215611ddb57600080fd5b8135611bf081612541565b600060208284031215611df857600080fd5b8151611bf081612541565b600060208284031215611e1557600080fd5b81516001600160401b03811115611e2b57600080fd5b8201601f81018413611e3c57600080fd5b8051611e4a611b8982612401565b818152856020838501011115611e5f57600080fd5b611e70826020830160208601612498565b95945050505050565b60008060408385031215611e8c57600080fd5b82356001600160401b03811115611ea257600080fd5b8301601f81018513611eb357600080fd5b611ec285823560208401611b7b565b95602094909401359450505050565b600060208284031215611ee357600080fd5b5035919050565b60008151808452611f02816020860160208601612498565b601f01601f19169290920160200192915050565b60008151611f28818560208601612498565b9290920192915050565b683d913730b6b2911d1160b91b81528451600090611f57816009850160208a01612498565b7f222c226465736372697074696f6e223a2254686520756e69636f6465206368616009918401918201526603930b1ba32b9160cd1b60298201528551611fa4816030840160208a01612498565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224360309290910191820152773430b930b1ba32b9102a3cb8329116113b30b63ab2911d1160411b60508201528451612003816068840160208901612498565b7f227d5d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b606892909101918201526618985cd94d8d0b60ca1b608882015261205c61204e608f830186611f16565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161209f81601d850160208701612498565b91909101601d0192915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f64794d6964206d656574222076696577426f783d22302030203430302034303060408201527f223e3c7374796c653e2e6368207b20746578742d616e63686f723a206d69646460608201527f6c653b20646f6d696e616e742d626173656c696e653a206d6964646c653b206660808201527f696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b2060a08201527f666f6e742d73697a653a20393670783b207d3c2f7374796c653e3c726563742060c08201527f77696474683d223130302522206865696768743d2231303025222066696c6c3d60e08201527f22626c61636b22202f3e3c7465787420783d223230302220793d2232303022206101008201526a31b630b9b99e9131b4111f60a91b610120820152600061012b835161222c8183860160208801612498565b611e7082828601016c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061228090830184611eea565b9695505050505050565b602081526000611bf06020830184611eea565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526017908201527624b73b30b634b2103ab734b1b7b2329031b430b1ba32b960491b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526011908201527024b73b30b634b21031b430b930b1ba32b960791b604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156123f9576123f961252b565b604052919050565b60006001600160401b0382111561241a5761241a61252b565b50601f01601f191660200190565b6000821982111561243b5761243b6124ff565b500190565b60008261245d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561247c5761247c6124ff565b500290565b600082821015612493576124936124ff565b500390565b60005b838110156124b357818101518382015260200161249b565b838111156107c85750506000910152565b600181811c908216806124d857607f821691505b602082108114156124f957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461131257600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200d6259840429afb36af7ed32787350e48bbaede54da495838c9e5881ccc4b14b64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100fc5760003560e01c806301ffc9a71461010157806306fdde0314610129578063081812fc1461013e578063095ea7b31461016957806323b872dd1461017e57806342842e0e146101915780636352211e146101a457806370a08231146101b7578063715018a6146101d85780638da5cb5b146101e057806395d89b41146101e8578063a22cb465146101f0578063b88d4fde14610203578063c1baee4614610216578063c87b56dd14610229578063cf9446a71461023c578063e5d7906c14610264578063e985e9c514610277578063f2fde38b1461028a578063fd07bbba1461029d575b600080fd5b61011461010f366004611dc9565b6102b0565b60405190151581526020015b60405180910390f35b610131610302565b604051610120919061228a565b61015161014c366004611ed1565b610394565b6040516001600160a01b039091168152602001610120565b61017c610177366004611d9f565b610421565b005b61017c61018c366004611c2a565b610532565b61017c61019f366004611c2a565b610563565b6101516101b2366004611ed1565b61057e565b6101ca6101c5366004611bd5565b6105f5565b604051908152602001610120565b61017c61067c565b6101516106b7565b6101316106c6565b61017c6101fe366004611ce1565b6106d5565b61017c610211366004611c66565b610796565b610131610224366004611ed1565b6107ce565b610131610237366004611ed1565b610a86565b61024f61024a366004611e79565b610c97565b60408051928352602083019190915201610120565b61017c610272366004611d1d565b611121565b610114610285366004611bf7565b611247565b61017c610298366004611bd5565b611275565b61017c6102ab366004611d1d565b611315565b60006001600160e01b031982166380ac58cd60e01b14806102e157506001600160e01b03198216635b5e139f60e01b145b806102fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610311906124c4565b80601f016020809104026020016040519081016040528092919081815260200182805461033d906124c4565b801561038a5780601f1061035f5761010080835404028352916020019161038a565b820191906000526020600020905b81548152906001019060200180831161036d57829003601f168201915b5050505050905090565b600061039f8261142e565b6104055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061042c8261057e565b9050806001600160a01b0316836001600160a01b0316141561049a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016103fc565b336001600160a01b03821614806104b657506104b68133611247565b6105235760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016103fc565b61052d838361144b565b505050565b61053c33826114b9565b6105585760405162461bcd60e51b81526004016103fc90612355565b61052d838383611583565b61052d83838360405180602001604052806000815250610796565b6000818152600260205260408120546001600160a01b0316806102fc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016103fc565b60006001600160a01b0382166106605760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016103fc565b506001600160a01b031660009081526003602052604090205490565b336106856106b7565b6001600160a01b0316146106ab5760405162461bcd60e51b81526004016103fc90612320565b6106b56000611711565b565b6006546001600160a01b031690565b606060018054610311906124c4565b6001600160a01b03821633141561072a5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016103fc565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6107a033836114b9565b6107bc5760405162461bcd60e51b81526004016103fc90612355565b6107c884848484611763565b50505050565b6060607f821161082d576040805160018082528183019092526000916020820181803683370190505090508260f81b8160008151811061081057610810612515565b60200101906001600160f81b031916908160001a90535092915050565b6107ff82116108a957604080516002808252818301909252600091602082018180368337019050509050600683901c60c01760f81b8160008151811061087557610875612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160018151811061081057610810612515565b61ffff821161095d57604080516003808252818301909252600091602082018180368337019050509050600c83901c60e01760f81b816000815181106108f1576108f1612515565b60200101906001600160f81b031916908160001a905350600683901c603f1660801760f81b8160018151811061092957610929612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160028151811061081057610810612515565b6210ffff8211610a4a57604080516004808252818301909252600091602082018180368337019050509050601283901c60f01760f81b816000815181106109a6576109a6612515565b60200101906001600160f81b031916908160001a905350600c83901c603f1660801760f81b816001815181106109de576109de612515565b60200101906001600160f81b031916908160001a905350600683901c603f1660801760f81b81600281518110610a1657610a16612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160038151811061081057610810612515565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590818dbd9195c1bda5b9d607a1b60448201526064016103fc565b6060610a918261142e565b610af55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016103fc565b6000610b00836107ce565b905080603c841415610b305760405180604001604052806004815260200163266c743b60e01b8152509150610b82565b8360261415610b5e576040518060400160405280600581526020016426616d703b60d81b8152509150610b82565b8360221415610b8257506040805180820190915260028152612e1160f11b60208201525b600082604051602001610b9591906120ac565b60405160208183030381529060405290506000828373fab7e2fb81b083f49fd7089ef3db68e8bbad126363652c9b0a896040518263ffffffff1660e01b8152600401610be391815260200190565b60006040518083038186803b158015610bfb57600080fd5b505af4158015610c0f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c379190810190611e03565b610c4085611796565b604051602001610c539493929190611f32565b6040516020818303038152906040529050610c6d81611796565b604051602001610c7d9190612067565b604051602081830303815290604052945050505050919050565b6000806000849050808481518110610cb157610cb1612515565b0160200151600160ff1b16610d1257610ccb846001612428565b81511015610ceb5760405162461bcd60e51b81526004016103fc906122ef565b808481518110610cfd57610cfd612515565b016020015160f81c92506001915061111a9050565b808481518110610d2457610d24612515565b602091010151600760fd1b16600360fe1b1415610dff57610d46846002612428565b815110158015610d80575080610d5d856001612428565b81518110610d6d57610d6d612515565b602091010151600360fe1b16600160ff1b145b610d9c5760405162461bcd60e51b81526004016103fc906122ef565b80610da8856001612428565b81518110610db857610db8612515565b602001015160f81c60f81b603f60f81b1660f81c60ff166006828681518110610de357610de3612515565b60209101015160f81c601f16901b1792506002915061111a9050565b808481518110610e1157610e11612515565b602091010151600f60fc1b16600760fd1b1415610f4f57610e33846003612428565b815110158015610e6d575080610e4a856001612428565b81518110610e5a57610e5a612515565b602091010151600360fe1b16600160ff1b145b8015610ea3575080610e80856002612428565b81518110610e9057610e90612515565b602091010151600360fe1b16600160ff1b145b610ebf5760405162461bcd60e51b81526004016103fc906122ef565b80610ecb856002612428565b81518110610edb57610edb612515565b60209101015160f81c603f16600682610ef5876001612428565b81518110610f0557610f05612515565b602001015160f81c60f81b603f60f81b1660f81c60ff16901b600c838781518110610f3257610f32612515565b60209101015160f81c600f16901b171792506003915061111a9050565b808481518110610f6157610f61612515565b602091010151601f60fb1b16600f60fc1b141561110257610f83846004612428565b815110158015610fbd575080610f9a856001612428565b81518110610faa57610faa612515565b602091010151600360fe1b16600160ff1b145b8015610ff3575080610fd0856002612428565b81518110610fe057610fe0612515565b602091010151600360fe1b16600160ff1b145b8015611029575080611006856003612428565b8151811061101657611016612515565b602091010151600360fe1b16600160ff1b145b6110455760405162461bcd60e51b81526004016103fc906122ef565b80611051856003612428565b8151811061106157611061612515565b60209101015160f81c603f1660068261107b876002612428565b8151811061108b5761108b612515565b60209101015160f81c603f16901b600c836110a7886001612428565b815181106110b7576110b7612515565b602001015160f81c60f81b603f60f81b1660f81c60ff16901b60128488815181106110e4576110e4612515565b60209101015160f81c600716901b17171792506004915061111a9050565b60405162461bcd60e51b81526004016103fc906122ef565b9250929050565b60005b818110156107c85760008061117085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250610c97915050565b6040516332964d8560e11b815260048101839052919350915060009073fab7e2fb81b083f49fd7089ef3db68e8bbad12639063652c9b0a9060240160006040518083038186803b1580156111c357600080fd5b505af41580156111d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ff9190810190611e03565b511161121d5760405162461bcd60e51b81526004016103fc906123a6565b6112268261142e565b6112345761123486836118fd565b61123e8184612428565b92505050611124565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3361127e6106b7565b6001600160a01b0316146112a45760405162461bcd60e51b81526004016103fc90612320565b6001600160a01b0381166113095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103fc565b61131281611711565b50565b60005b818110156107c85760008061136485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250610c97915050565b6040516332964d8560e11b815260048101839052919350915060009073fab7e2fb81b083f49fd7089ef3db68e8bbad12639063652c9b0a9060240160006040518083038186803b1580156113b757600080fd5b505af41580156113cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113f39190810190611e03565b51116114115760405162461bcd60e51b81526004016103fc906123a6565b61141b86836118fd565b6114258184612428565b92505050611318565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114808261057e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114c48261142e565b6115255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016103fc565b60006115308361057e565b9050806001600160a01b0316846001600160a01b0316148061156b5750836001600160a01b031661156084610394565b6001600160a01b0316145b8061157b575061157b8185611247565b949350505050565b826001600160a01b03166115968261057e565b6001600160a01b0316146115fe5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016103fc565b6001600160a01b0382166116605760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016103fc565b61166b60008261144b565b6001600160a01b0383166000908152600360205260408120805460019290611694908490612481565b90915550506001600160a01b03821660009081526003602052604081208054600192906116c2908490612428565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061259883398151915291a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61176e848484611583565b61177a8484848461191b565b6107c85760405162461bcd60e51b81526004016103fc9061229d565b60608151600014156117b657505060408051602081019091526000815290565b600060405180606001604052806040815260200161255860409139905060006003845160026117e59190612428565b6117ef9190612440565b6117fa906004612462565b90506000611809826020612428565b6001600160401b038111156118205761182061252b565b6040519080825280601f01601f19166020018201604052801561184a576020820181803683370190505b509050818152600183018586518101602084015b818310156118b85760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161185e565b6003895106600181146118d257600281146118e3576118ef565b613d3d60f01b6001198301526118ef565b603d60f81b6000198301525b509398975050505050505050565b611917828260405180602001604052806000815250611a28565b5050565b60006001600160a01b0384163b15611a1d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061195f90339089908890889060040161224d565b602060405180830381600087803b15801561197957600080fd5b505af19250505080156119a9575060408051601f3d908101601f191682019092526119a691810190611de6565b60015b611a03573d8080156119d7576040519150601f19603f3d011682016040523d82523d6000602084013e6119dc565b606091505b5080516119fb5760405162461bcd60e51b81526004016103fc9061229d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061157b565b506001949350505050565b611a328383611a5b565b611a3f600084848461191b565b61052d5760405162461bcd60e51b81526004016103fc9061229d565b6001600160a01b038216611ab15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016103fc565b611aba8161142e565b15611b065760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016103fc565b6001600160a01b0382166000908152600360205260408120805460019290611b2f908490612428565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020612598833981519152908290a45050565b6000611b8e611b8984612401565b6123d1565b9050828152838383011115611ba257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611bd057600080fd5b919050565b600060208284031215611be757600080fd5b611bf082611bb9565b9392505050565b60008060408385031215611c0a57600080fd5b611c1383611bb9565b9150611c2160208401611bb9565b90509250929050565b600080600060608486031215611c3f57600080fd5b611c4884611bb9565b9250611c5660208501611bb9565b9150604084013590509250925092565b60008060008060808587031215611c7c57600080fd5b611c8585611bb9565b9350611c9360208601611bb9565b92506040850135915060608501356001600160401b03811115611cb557600080fd5b8501601f81018713611cc657600080fd5b611cd587823560208401611b7b565b91505092959194509250565b60008060408385031215611cf457600080fd5b611cfd83611bb9565b915060208301358015158114611d1257600080fd5b809150509250929050565b600080600060408486031215611d3257600080fd5b611d3b84611bb9565b925060208401356001600160401b0380821115611d5757600080fd5b818601915086601f830112611d6b57600080fd5b813581811115611d7a57600080fd5b876020828501011115611d8c57600080fd5b6020830194508093505050509250925092565b60008060408385031215611db257600080fd5b611dbb83611bb9565b946020939093013593505050565b600060208284031215611ddb57600080fd5b8135611bf081612541565b600060208284031215611df857600080fd5b8151611bf081612541565b600060208284031215611e1557600080fd5b81516001600160401b03811115611e2b57600080fd5b8201601f81018413611e3c57600080fd5b8051611e4a611b8982612401565b818152856020838501011115611e5f57600080fd5b611e70826020830160208601612498565b95945050505050565b60008060408385031215611e8c57600080fd5b82356001600160401b03811115611ea257600080fd5b8301601f81018513611eb357600080fd5b611ec285823560208401611b7b565b95602094909401359450505050565b600060208284031215611ee357600080fd5b5035919050565b60008151808452611f02816020860160208601612498565b601f01601f19169290920160200192915050565b60008151611f28818560208601612498565b9290920192915050565b683d913730b6b2911d1160b91b81528451600090611f57816009850160208a01612498565b7f222c226465736372697074696f6e223a2254686520756e69636f6465206368616009918401918201526603930b1ba32b9160cd1b60298201528551611fa4816030840160208a01612498565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224360309290910191820152773430b930b1ba32b9102a3cb8329116113b30b63ab2911d1160411b60508201528451612003816068840160208901612498565b7f227d5d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b606892909101918201526618985cd94d8d0b60ca1b608882015261205c61204e608f830186611f16565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161209f81601d850160208701612498565b91909101601d0192915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f64794d6964206d656574222076696577426f783d22302030203430302034303060408201527f223e3c7374796c653e2e6368207b20746578742d616e63686f723a206d69646460608201527f6c653b20646f6d696e616e742d626173656c696e653a206d6964646c653b206660808201527f696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b2060a08201527f666f6e742d73697a653a20393670783b207d3c2f7374796c653e3c726563742060c08201527f77696474683d223130302522206865696768743d2231303025222066696c6c3d60e08201527f22626c61636b22202f3e3c7465787420783d223230302220793d2232303022206101008201526a31b630b9b99e9131b4111f60a91b610120820152600061012b835161222c8183860160208801612498565b611e7082828601016c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061228090830184611eea565b9695505050505050565b602081526000611bf06020830184611eea565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526017908201527624b73b30b634b2103ab734b1b7b2329031b430b1ba32b960491b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526011908201527024b73b30b634b21031b430b930b1ba32b960791b604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156123f9576123f961252b565b604052919050565b60006001600160401b0382111561241a5761241a61252b565b50601f01601f191660200190565b6000821982111561243b5761243b6124ff565b500190565b60008261245d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561247c5761247c6124ff565b500290565b600082821015612493576124936124ff565b500390565b60005b838110156124b357818101518382015260200161249b565b838111156107c85750506000910152565b600181811c908216806124d857607f821691505b602082108114156124f957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461131257600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200d6259840429afb36af7ed32787350e48bbaede54da495838c9e5881ccc4b14b64736f6c63430008070033
Deployed Bytecode Sourcemap
111334:5934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96842:305;;;;;;:::i;:::-;;:::i;:::-;;;10383:14:1;;10376:22;10358:41;;10346:2;10331:18;96842:305:0;;;;;;;;97787:100;;;:::i;:::-;;;;;;;:::i;99346:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9681:32:1;;;9663:51;;9651:2;9636:18;99346:221:0;9517:203:1;98869:411:0;;;;;;:::i;:::-;;:::i;:::-;;100236:339;;;;;;:::i;:::-;;:::i;100646:185::-;;;;;;:::i;:::-;;:::i;97481:239::-;;;;;;:::i;:::-;;:::i;97211:208::-;;;;;;:::i;:::-;;:::i;:::-;;;18214:25:1;;;18202:2;18187:18;97211:208:0;18060:185:1;76405:94:0;;;:::i;75754:87::-;;;:::i;97956:104::-;;;:::i;99639:295::-;;;;;;:::i;:::-;;:::i;100902:328::-;;;;;;:::i;:::-;;:::i;114813:1161::-;;;;;;:::i;:::-;;:::i;115982:1283::-;;;;;;:::i;:::-;;:::i;113203:1422::-;;;;;;:::i;:::-;;:::i;:::-;;;;18606:25:1;;;18662:2;18647:18;;18640:34;;;;18579:18;113203:1422:0;18432:248:1;112345:497:0;;;;;;:::i;:::-;;:::i;100005:164::-;;;;;;:::i;:::-;;:::i;76654:192::-;;;;;;:::i;:::-;;:::i;111675:439::-;;;;;;:::i;:::-;;:::i;96842:305::-;96944:4;-1:-1:-1;;;;;;96981:40:0;;-1:-1:-1;;;96981:40:0;;:105;;-1:-1:-1;;;;;;;97038:48:0;;-1:-1:-1;;;97038:48:0;96981:105;:158;;;-1:-1:-1;;;;;;;;;;78790:40:0;;;97103:36;96961:178;96842:305;-1:-1:-1;;96842:305:0:o;97787:100::-;97841:13;97874:5;97867:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97787:100;:::o;99346:221::-;99422:7;99450:16;99458:7;99450;:16::i;:::-;99442:73;;;;-1:-1:-1;;;99442:73:0;;14798:2:1;99442:73:0;;;14780:21:1;14837:2;14817:18;;;14810:30;14876:34;14856:18;;;14849:62;-1:-1:-1;;;14927:18:1;;;14920:42;14979:19;;99442:73:0;;;;;;;;;-1:-1:-1;99535:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;99535:24:0;;99346:221::o;98869:411::-;98950:13;98966:23;98981:7;98966:14;:23::i;:::-;98950:39;;99014:5;-1:-1:-1;;;;;99008:11:0;:2;-1:-1:-1;;;;;99008:11:0;;;99000:57;;;;-1:-1:-1;;;99000:57:0;;16750:2:1;99000:57:0;;;16732:21:1;16789:2;16769:18;;;16762:30;16828:34;16808:18;;;16801:62;-1:-1:-1;;;16879:18:1;;;16872:31;16920:19;;99000:57:0;16548:397:1;99000:57:0;74620:10;-1:-1:-1;;;;;99092:21:0;;;;:62;;-1:-1:-1;99117:37:0;99134:5;74620:10;100005:164;:::i;99117:37::-;99070:168;;;;-1:-1:-1;;;99070:168:0;;13191:2:1;99070:168:0;;;13173:21:1;13230:2;13210:18;;;13203:30;13269:34;13249:18;;;13242:62;-1:-1:-1;;;13320:18:1;;;13313:54;13384:19;;99070:168:0;12989:420:1;99070:168:0;99251:21;99260:2;99264:7;99251:8;:21::i;:::-;98939:341;98869:411;;:::o;100236:339::-;100431:41;74620:10;100464:7;100431:18;:41::i;:::-;100423:103;;;;-1:-1:-1;;;100423:103:0;;;;;;;:::i;:::-;100539:28;100549:4;100555:2;100559:7;100539:9;:28::i;100646:185::-;100784:39;100801:4;100807:2;100811:7;100784:39;;;;;;;;;;;;:16;:39::i;97481:239::-;97553:7;97589:16;;;:7;:16;;;;;;-1:-1:-1;;;;;97589:16:0;97624:19;97616:73;;;;-1:-1:-1;;;97616:73:0;;14027:2:1;97616:73:0;;;14009:21:1;14066:2;14046:18;;;14039:30;14105:34;14085:18;;;14078:62;-1:-1:-1;;;14156:18:1;;;14149:39;14205:19;;97616:73:0;13825:405:1;97211:208:0;97283:7;-1:-1:-1;;;;;97311:19:0;;97303:74;;;;-1:-1:-1;;;97303:74:0;;13616:2:1;97303:74:0;;;13598:21:1;13655:2;13635:18;;;13628:30;13694:34;13674:18;;;13667:62;-1:-1:-1;;;13745:18:1;;;13738:40;13795:19;;97303:74:0;13414:406:1;97303:74:0;-1:-1:-1;;;;;;97395:16:0;;;;;:9;:16;;;;;;;97211:208::o;76405:94::-;74620:10;75974:7;:5;:7::i;:::-;-1:-1:-1;;;;;75974:23:0;;75966:68;;;;-1:-1:-1;;;75966:68:0;;;;;;;:::i;:::-;76470:21:::1;76488:1;76470:9;:21::i;:::-;76405:94::o:0;75754:87::-;75827:6;;-1:-1:-1;;;;;75827:6:0;;75754:87::o;97956:104::-;98012:13;98045:7;98038:14;;;;;:::i;99639:295::-;-1:-1:-1;;;;;99742:24:0;;74620:10;99742:24;;99734:62;;;;-1:-1:-1;;;99734:62:0;;12424:2:1;99734:62:0;;;12406:21:1;12463:2;12443:18;;;12436:30;-1:-1:-1;;;12482:18:1;;;12475:55;12547:18;;99734:62:0;12222:349:1;99734:62:0;74620:10;99809:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;99809:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;99809:53:0;;;;;;;;;;99878:48;;10358:41:1;;;99809:42:0;;74620:10;99878:48;;10331:18:1;99878:48:0;;;;;;;99639:295;;:::o;100902:328::-;101077:41;74620:10;101110:7;101077:18;:41::i;:::-;101069:103;;;;-1:-1:-1;;;101069:103:0;;;;;;;:::i;:::-;101183:39;101197:4;101203:2;101207:7;101216:5;101183:13;:39::i;:::-;100902:328;;;;:::o;114813:1161::-;114870:13;114905:4;114899:2;:10;114896:147;;114945:12;;;114955:1;114945:12;;;;;;;;;114926:16;;114945:12;;;;;;;;;;-1:-1:-1;114945:12:0;114926:31;;114994:2;114981:17;;114972:3;114976:1;114972:6;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;114972:26:0;;;;;;;;-1:-1:-1;115027:3:0;114813:1161;-1:-1:-1;;114813:1161:0:o;114896:147::-;115062:5;115056:2;:11;115053:219;;115103:12;;;115113:1;115103:12;;;;;;;;;115084:16;;115103:12;;;;;;;;;;-1:-1:-1;115103:12:0;115084:31;;115166:1;115160:2;:7;;115152:4;:16;115139:31;;115130:3;115134:1;115130:6;;;;;;;;:::i;:::-;;;;:40;-1:-1:-1;;;;;115130:40:0;;;;;;;;;115215:2;115220:4;115215:9;115207:4;:18;115194:33;;115185:3;115189:1;115185:6;;;;;;;;:::i;115053:219::-;115291:6;115285:2;:12;115282:285;;115333:12;;;115343:1;115333:12;;;;;;;;;115314:16;;115333:12;;;;;;;;;;-1:-1:-1;115333:12:0;115314:31;;115396:2;115390;:8;;115382:4;:17;115369:32;;115360:3;115364:1;115360:6;;;;;;;;:::i;:::-;;;;:41;-1:-1:-1;;;;;115360:41:0;;;;;;;;;115453:1;115447:2;:7;;115458:4;115446:16;115438:4;:25;115425:40;;115416:3;115420:1;115416:6;;;;;;;;:::i;:::-;;;;:49;-1:-1:-1;;;;;115416:49:0;;;;;;;;;115510:2;115515:4;115510:9;115502:4;:18;115489:33;;115480:3;115484:1;115480:6;;;;;;;;:::i;115282:285::-;115586:8;115580:2;:14;115577:352;;115630:12;;;115640:1;115630:12;;;;;;;;;115611:16;;115630:12;;;;;;;;;;-1:-1:-1;115630:12:0;115611:31;;115693:2;115687;:8;;115679:4;:17;115666:32;;115657:3;115661:1;115657:6;;;;;;;;:::i;:::-;;;;:41;-1:-1:-1;;;;;115657:41:0;;;;;;;;;115750:2;115744;:8;;115756:4;115743:17;115735:4;:26;115722:41;;115713:3;115717:1;115713:6;;;;;;;;:::i;:::-;;;;:50;-1:-1:-1;;;;;115713:50:0;;;;;;;;;115815:1;115809:2;:7;;115820:4;115808:16;115800:4;:25;115787:40;;115778:3;115782:1;115778:6;;;;;;;;:::i;:::-;;;;:49;-1:-1:-1;;;;;115778:49:0;;;;;;;;;115872:2;115877:4;115872:9;115864:4;:18;115851:33;;115842:3;115846:1;115842:6;;;;;;;;:::i;115577:352::-;115939:27;;-1:-1:-1;;;115939:27:0;;17152:2:1;115939:27:0;;;17134:21:1;17191:2;17171:18;;;17164:30;-1:-1:-1;;;17210:18:1;;;17203:47;17267:18;;115939:27:0;16950:341:1;115982:1283:0;116055:13;116089:16;116097:7;116089;:16::i;:::-;116081:76;;;;-1:-1:-1;;;116081:76:0;;16334:2:1;116081:76:0;;;16316:21:1;16373:2;16353:18;;;16346:30;16412:34;16392:18;;;16385:62;-1:-1:-1;;;16463:18:1;;;16456:45;16518:19;;116081:76:0;16132:411:1;116081:76:0;116170:19;116192:24;116208:7;116192:15;:24::i;:::-;116170:46;-1:-1:-1;116170:46:0;116280:2;116269:13;;116266:205;;;116304:14;;;;;;;;;;;;;-1:-1:-1;;;116304:14:0;;;;;116266:205;;;116339:7;116350:2;116339:13;116336:135;;;116374:15;;;;;;;;;;;;;-1:-1:-1;;;116374:15:0;;;;;116336:135;;;116410:7;116421:2;116410:13;116407:64;;;-1:-1:-1;116445:14:0;;;;;;;;;;;;-1:-1:-1;;;116445:14:0;;;;116407:64;116481:17;116828:5;116508:343;;;;;;;;:::i;:::-;;;;;;;;;;;;;116481:371;;116863:18;116921:6;116972;117040:10;:27;117068:7;117040:36;;;;;;;;;;;;;18214:25:1;;18202:2;18187:18;;18060:185;117040:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;117040:36:0;;;;;;;;;;;;:::i;:::-;117121:25;117141:3;117121:13;:25::i;:::-;116891:262;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;116863:291;;117229:26;117249:4;117229:13;:26::i;:::-;117179:77;;;;;;;;:::i;:::-;;;;;;;;;;;;;117165:92;;;;;;115982:1283;;;:::o;113203:1422::-;113284:17;113303:11;113327:15;113351:4;113327:29;;113370:2;113373:6;113370:10;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;113370:17:0;113367:166;;113430:10;:6;113439:1;113430:10;:::i;:::-;113417:2;:9;:23;;113409:59;;;;-1:-1:-1;;;113409:59:0;;;;;;;:::i;:::-;113505:2;113508:6;113505:10;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;113519:1:0;;-1:-1:-1;113483:38:0;;-1:-1:-1;113483:38:0;113367:166;113546:2;113549:6;113546:10;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;113546:17:0;-1:-1:-1;;;113546:25:0;113543:256;;;113609:10;:6;113618:1;113609:10;:::i;:::-;113596:2;:9;:23;;:56;;;;-1:-1:-1;113623:2:0;113626:10;:6;113635:1;113626:10;:::i;:::-;113623:14;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;113623:21:0;-1:-1:-1;;;113623:29:0;113596:56;113588:92;;;;-1:-1:-1;;;113588:92:0;;;;;;;:::i;:::-;113760:2;113763:10;:6;113772:1;113763:10;:::i;:::-;113760:14;;;;;;;;:::i;:::-;;;;;;;;;113777:4;113760:21;;;113754:28;;113746:37;;113741:1;113718:2;113721:6;113718:10;;;;;;;;:::i;:::-;;;;;;;;113731:4;113712:24;113704:38;;113703:80;;-1:-1:-1;113785:1:0;;-1:-1:-1;113695:92:0;;-1:-1:-1;113695:92:0;113543:256;113812:2;113815:6;113812:10;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;113812:17:0;-1:-1:-1;;;113812:25:0;113809:337;;;113875:10;:6;113884:1;113875:10;:::i;:::-;113862:2;:9;:23;;:56;;;;-1:-1:-1;113889:2:0;113892:10;:6;113901:1;113892:10;:::i;:::-;113889:14;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;113889:21:0;-1:-1:-1;;;113889:29:0;113862:56;:89;;;;-1:-1:-1;113922:2:0;113925:10;:6;113934:1;113925:10;:::i;:::-;113922:14;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;113922:21:0;-1:-1:-1;;;113922:29:0;113862:89;113854:125;;;;-1:-1:-1;;;113854:125:0;;;;;;;:::i;:::-;114107:2;114110:10;:6;114119:1;114110:10;:::i;:::-;114107:14;;;;;;;;:::i;:::-;;;;;;;;114124:4;114101:28;114088:1;114061:2;114064:10;:6;114073:1;114064:10;:::i;:::-;114061:14;;;;;;;;:::i;:::-;;;;;;;;;114078:4;114061:21;;;114055:28;;114047:37;;:42;;114040:2;114017;114020:6;114017:10;;;;;;;;:::i;:::-;;;;;;;;114030:4;114011:24;114003:39;;114002:88;:128;;-1:-1:-1;114132:1:0;;-1:-1:-1;113994:140:0;;-1:-1:-1;113994:140:0;113809:337;114159:2;114162:6;114159:10;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;114159:17:0;-1:-1:-1;;;114159:25:0;114156:418;;;114222:10;:6;114231:1;114222:10;:::i;:::-;114209:2;:9;:23;;:56;;;;-1:-1:-1;114236:2:0;114239:10;:6;114248:1;114239:10;:::i;:::-;114236:14;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;114236:21:0;-1:-1:-1;;;114236:29:0;114209:56;:89;;;;-1:-1:-1;114269:2:0;114272:10;:6;114281:1;114272:10;:::i;:::-;114269:14;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;114269:21:0;-1:-1:-1;;;114269:29:0;114209:89;:122;;;;-1:-1:-1;114302:2:0;114305:10;:6;114314:1;114305:10;:::i;:::-;114302:14;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;114302:21:0;-1:-1:-1;;;114302:29:0;114209:122;114201:158;;;;-1:-1:-1;;;114201:158:0;;;;;;;:::i;:::-;114535:2;114538:10;:6;114547:1;114538:10;:::i;:::-;114535:14;;;;;;;;:::i;:::-;;;;;;;;114552:4;114529:28;114516:1;114489:2;114492:10;:6;114501:1;114492:10;:::i;:::-;114489:14;;;;;;;;:::i;:::-;;;;;;;;114506:4;114483:28;114475:42;;114468:2;114441;114444:10;:6;114453:1;114444:10;:::i;:::-;114441:14;;;;;;;;:::i;:::-;;;;;;;;;114458:4;114441:21;;;114435:28;;114427:37;;:43;;114420:2;114397;114400:6;114397:10;;;;;;;;:::i;:::-;;;;;;;;114410:4;114391:24;114383:39;;114382:89;:136;:176;;-1:-1:-1;114560:1:0;;-1:-1:-1;114374:188:0;;-1:-1:-1;114374:188:0;114156:418;114584:33;;-1:-1:-1;;;114584:33:0;;;;;;;:::i;113203:1422::-;;;;;;:::o;112345:497::-;112421:14;112417:418;112441:28;;;112417:418;;;112488:17;112507:11;112522:30;112538:5;;112522:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112545:6:0;;-1:-1:-1;112522:15:0;;-1:-1:-1;;112522:30:0:i;:::-;112626:38;;-1:-1:-1;;;112626:38:0;;;;;18214:25:1;;;112487:65:0;;-1:-1:-1;112487:65:0;-1:-1:-1;112675:1:0;;112626:10;;:27;;18187:18:1;;112626:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;112626:38:0;;;;;;;;;;;;:::i;:::-;112620:52;:56;112612:86;;;;-1:-1:-1;;;112612:86:0;;;;;;;:::i;:::-;112717:18;112725:9;112717:7;:18::i;:::-;112713:83;;112756:24;112766:2;112770:9;112756;:24::i;:::-;112810:13;112820:3;112810:13;;:::i;:::-;;;112472:363;;112417:418;;100005:164;-1:-1:-1;;;;;100126:25:0;;;100102:4;100126:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;100005:164::o;76654:192::-;74620:10;75974:7;:5;:7::i;:::-;-1:-1:-1;;;;;75974:23:0;;75966:68;;;;-1:-1:-1;;;75966:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;76743:22:0;::::1;76735:73;;;::::0;-1:-1:-1;;;76735:73:0;;11255:2:1;76735:73:0::1;::::0;::::1;11237:21:1::0;11294:2;11274:18;;;11267:30;11333:34;11313:18;;;11306:62;-1:-1:-1;;;11384:18:1;;;11377:36;11430:19;;76735:73:0::1;11053:402:1::0;76735:73:0::1;76819:19;76829:8;76819:9;:19::i;:::-;76654:192:::0;:::o;111675:439::-;111751:14;111747:360;111771:28;;;111747:360;;;111818:17;111837:11;111852:30;111868:5;;111852:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111875:6:0;;-1:-1:-1;111852:15:0;;-1:-1:-1;;111852:30:0:i;:::-;111956:38;;-1:-1:-1;;;111956:38:0;;;;;18214:25:1;;;111817:65:0;;-1:-1:-1;111817:65:0;-1:-1:-1;112005:1:0;;111956:10;;:27;;18187:18:1;;111956:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;111956:38:0;;;;;;;;;;;;:::i;:::-;111950:52;:56;111942:86;;;;-1:-1:-1;;;111942:86:0;;;;;;;:::i;:::-;112043:24;112053:2;112057:9;112043;:24::i;:::-;112082:13;112092:3;112082:13;;:::i;:::-;;;111802:305;;111747:360;;102740:127;102805:4;102829:16;;;:7;:16;;;;;;-1:-1:-1;;;;;102829:16:0;:30;;;102740:127::o;106722:174::-;106797:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;106797:29:0;-1:-1:-1;;;;;106797:29:0;;;;;;;;:24;;106851:23;106797:24;106851:14;:23::i;:::-;-1:-1:-1;;;;;106842:46:0;;;;;;;;;;;106722:174;;:::o;103034:348::-;103127:4;103152:16;103160:7;103152;:16::i;:::-;103144:73;;;;-1:-1:-1;;;103144:73:0;;12778:2:1;103144:73:0;;;12760:21:1;12817:2;12797:18;;;12790:30;12856:34;12836:18;;;12829:62;-1:-1:-1;;;12907:18:1;;;12900:42;12959:19;;103144:73:0;12576:408:1;103144:73:0;103228:13;103244:23;103259:7;103244:14;:23::i;:::-;103228:39;;103297:5;-1:-1:-1;;;;;103286:16:0;:7;-1:-1:-1;;;;;103286:16:0;;:51;;;;103330:7;-1:-1:-1;;;;;103306:31:0;:20;103318:7;103306:11;:20::i;:::-;-1:-1:-1;;;;;103306:31:0;;103286:51;:87;;;;103341:32;103358:5;103365:7;103341:16;:32::i;:::-;103278:96;103034:348;-1:-1:-1;;;;103034:348:0:o;106026:578::-;106185:4;-1:-1:-1;;;;;106158:31:0;:23;106173:7;106158:14;:23::i;:::-;-1:-1:-1;;;;;106158:31:0;;106150:85;;;;-1:-1:-1;;;106150:85:0;;15924:2:1;106150:85:0;;;15906:21:1;15963:2;15943:18;;;15936:30;16002:34;15982:18;;;15975:62;-1:-1:-1;;;16053:18:1;;;16046:39;16102:19;;106150:85:0;15722:405:1;106150:85:0;-1:-1:-1;;;;;106254:16:0;;106246:65;;;;-1:-1:-1;;;106246:65:0;;12019:2:1;106246:65:0;;;12001:21:1;12058:2;12038:18;;;12031:30;12097:34;12077:18;;;12070:62;-1:-1:-1;;;12148:18:1;;;12141:34;12192:19;;106246:65:0;11817:400:1;106246:65:0;106428:29;106445:1;106449:7;106428:8;:29::i;:::-;-1:-1:-1;;;;;106470:15:0;;;;;;:9;:15;;;;;:20;;106489:1;;106470:15;:20;;106489:1;;106470:20;:::i;:::-;;;;-1:-1:-1;;;;;;;106501:13:0;;;;;;:9;:13;;;;;:18;;106518:1;;106501:13;:18;;106518:1;;106501:18;:::i;:::-;;;;-1:-1:-1;;106530:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;106530:21:0;-1:-1:-1;;;;;106530:21:0;;;;;;;;;106569:27;;106530:16;;106569:27;;;;-1:-1:-1;;;;;;;;;;;106569:27:0;;106026:578;;;:::o;76854:173::-;76929:6;;;-1:-1:-1;;;;;76946:17:0;;;-1:-1:-1;;;;;;76946:17:0;;;;;;;76979:40;;76929:6;;;76946:17;76929:6;;76979:40;;76910:16;;76979:40;76899:128;76854:173;:::o;102112:315::-;102269:28;102279:4;102285:2;102289:7;102269:9;:28::i;:::-;102316:48;102339:4;102345:2;102349:7;102358:5;102316:22;:48::i;:::-;102308:111;;;;-1:-1:-1;;;102308:111:0;;;;;;;:::i;109290:2037::-;109348:13;109378:4;:11;109393:1;109378:16;109374:31;;;-1:-1:-1;;109396:9:0;;;;;;;;;-1:-1:-1;109396:9:0;;;109290:2037::o;109374:31::-;109465:19;109487:5;;;;;;;;;;;;;;;;;109465:27;;109544:18;109590:1;109571:4;:11;109585:1;109571:15;;;;:::i;:::-;109570:21;;;;:::i;:::-;109565:27;;:1;:27;:::i;:::-;109544:48;-1:-1:-1;109675:20:0;109709:15;109544:48;109722:2;109709:15;:::i;:::-;-1:-1:-1;;;;;109698:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;109698:27:0;;109675:50;;109822:10;109814:6;109807:26;109929:1;109922:5;109918:13;110000:4;110051;110045:11;110036:7;110032:25;110159:2;110151:6;110147:15;110244:810;110263:6;110254:7;110251:19;110244:810;;;110329:1;110316:15;;;110410:14;;110563:4;110551:2;110547:14;;;110543:25;;110529:40;;110523:47;110518:3;110514:57;;;110496:76;;110691:2;110687:14;;;110683:25;;110669:40;;110663:47;110654:57;;110617:1;110602:17;;110636:76;110832:1;110827:14;;;110823:25;;110809:40;;110803:47;110794:57;;110742:17;;;110776:76;110963:25;;110949:40;;110943:47;110934:57;;110882:17;;;110916:76;;;;111022:17;;110244:810;;;111139:1;111132:4;111126:11;111122:19;111160:1;111155:54;;;;111228:1;111223:52;;;;111115:160;;111155:54;-1:-1:-1;;;;;111171:17:0;;111164:43;111155:54;;111223:52;-1:-1:-1;;;;;111239:17:0;;111232:41;111115:160;-1:-1:-1;111313:6:0;;109290:2037;-1:-1:-1;;;;;;;;109290:2037:0:o;103724:110::-;103800:26;103810:2;103814:7;103800:26;;;;;;;;;;;;:9;:26::i;:::-;103724:110;;:::o;107461:799::-;107616:4;-1:-1:-1;;;;;107637:13:0;;82004:20;82052:8;107633:620;;107673:72;;-1:-1:-1;;;107673:72:0;;-1:-1:-1;;;;;107673:36:0;;;;;:72;;74620:10;;107724:4;;107730:7;;107739:5;;107673:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107673:72:0;;;;;;;;-1:-1:-1;;107673:72:0;;;;;;;;;;;;:::i;:::-;;;107669:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107915:13:0;;107911:272;;107958:60;;-1:-1:-1;;;107958:60:0;;;;;;;:::i;107911:272::-;108133:6;108127:13;108118:6;108114:2;108110:15;108103:38;107669:529;-1:-1:-1;;;;;;107796:51:0;-1:-1:-1;;;107796:51:0;;-1:-1:-1;107789:58:0;;107633:620;-1:-1:-1;108237:4:0;107461:799;;;;;;:::o;104061:321::-;104191:18;104197:2;104201:7;104191:5;:18::i;:::-;104242:54;104273:1;104277:2;104281:7;104290:5;104242:22;:54::i;:::-;104220:154;;;;-1:-1:-1;;;104220:154:0;;;;;;;:::i;104718:382::-;-1:-1:-1;;;;;104798:16:0;;104790:61;;;;-1:-1:-1;;;104790:61:0;;14437:2:1;104790:61:0;;;14419:21:1;;;14456:18;;;14449:30;14515:34;14495:18;;;14488:62;14567:18;;104790:61:0;14235:356:1;104790:61:0;104871:16;104879:7;104871;:16::i;:::-;104870:17;104862:58;;;;-1:-1:-1;;;104862:58:0;;11662:2:1;104862:58:0;;;11644:21:1;11701:2;11681:18;;;11674:30;-1:-1:-1;;;11720:18:1;;;11713:58;11788:18;;104862:58:0;11460:352:1;104862:58:0;-1:-1:-1;;;;;104991:13:0;;;;;;:9;:13;;;;;:18;;105008:1;;104991:13;:18;;105008:1;;104991:18;:::i;:::-;;;;-1:-1:-1;;105020:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;105020:21:0;-1:-1:-1;;;;;105020:21:0;;;;;;;;105059:33;;105020:16;;;-1:-1:-1;;;;;;;;;;;105059:33:0;105020:16;;105059:33;104718:382;;:::o;14:336:1:-;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:173::-;423:20;;-1:-1:-1;;;;;472:31:1;;462:42;;452:70;;518:1;515;508:12;452:70;355:173;;;:::o;533:186::-;592:6;645:2;633:9;624:7;620:23;616:32;613:52;;;661:1;658;651:12;613:52;684:29;703:9;684:29;:::i;:::-;674:39;533:186;-1:-1:-1;;;533:186:1:o;724:260::-;792:6;800;853:2;841:9;832:7;828:23;824:32;821:52;;;869:1;866;859:12;821:52;892:29;911:9;892:29;:::i;:::-;882:39;;940:38;974:2;963:9;959:18;940:38;:::i;:::-;930:48;;724:260;;;;;:::o;989:328::-;1066:6;1074;1082;1135:2;1123:9;1114:7;1110:23;1106:32;1103:52;;;1151:1;1148;1141:12;1103:52;1174:29;1193:9;1174:29;:::i;:::-;1164:39;;1222:38;1256:2;1245:9;1241:18;1222:38;:::i;:::-;1212:48;;1307:2;1296:9;1292:18;1279:32;1269:42;;989:328;;;;;:::o;1322:666::-;1417:6;1425;1433;1441;1494:3;1482:9;1473:7;1469:23;1465:33;1462:53;;;1511:1;1508;1501:12;1462:53;1534:29;1553:9;1534:29;:::i;:::-;1524:39;;1582:38;1616:2;1605:9;1601:18;1582:38;:::i;:::-;1572:48;-1:-1:-1;1667:2:1;1652:18;;1639:32;;-1:-1:-1;1722:2:1;1707:18;;1694:32;-1:-1:-1;;;;;1738:30:1;;1735:50;;;1781:1;1778;1771:12;1735:50;1804:22;;1857:4;1849:13;;1845:27;-1:-1:-1;1835:55:1;;1886:1;1883;1876:12;1835:55;1909:73;1974:7;1969:2;1956:16;1951:2;1947;1943:11;1909:73;:::i;:::-;1899:83;;;1322:666;;;;;;;:::o;1993:347::-;2058:6;2066;2119:2;2107:9;2098:7;2094:23;2090:32;2087:52;;;2135:1;2132;2125:12;2087:52;2158:29;2177:9;2158:29;:::i;:::-;2148:39;;2237:2;2226:9;2222:18;2209:32;2284:5;2277:13;2270:21;2263:5;2260:32;2250:60;;2306:1;2303;2296:12;2250:60;2329:5;2319:15;;;1993:347;;;;;:::o;2345:666::-;2425:6;2433;2441;2494:2;2482:9;2473:7;2469:23;2465:32;2462:52;;;2510:1;2507;2500:12;2462:52;2533:29;2552:9;2533:29;:::i;:::-;2523:39;-1:-1:-1;2613:2:1;2598:18;;2585:32;-1:-1:-1;;;;;2666:14:1;;;2663:34;;;2693:1;2690;2683:12;2663:34;2731:6;2720:9;2716:22;2706:32;;2776:7;2769:4;2765:2;2761:13;2757:27;2747:55;;2798:1;2795;2788:12;2747:55;2838:2;2825:16;2864:2;2856:6;2853:14;2850:34;;;2880:1;2877;2870:12;2850:34;2925:7;2920:2;2911:6;2907:2;2903:15;2899:24;2896:37;2893:57;;;2946:1;2943;2936:12;2893:57;2977:2;2973;2969:11;2959:21;;2999:6;2989:16;;;;;2345:666;;;;;:::o;3016:254::-;3084:6;3092;3145:2;3133:9;3124:7;3120:23;3116:32;3113:52;;;3161:1;3158;3151:12;3113:52;3184:29;3203:9;3184:29;:::i;:::-;3174:39;3260:2;3245:18;;;;3232:32;;-1:-1:-1;;;3016:254:1:o;3275:245::-;3333:6;3386:2;3374:9;3365:7;3361:23;3357:32;3354:52;;;3402:1;3399;3392:12;3354:52;3441:9;3428:23;3460:30;3484:5;3460:30;:::i;3525:249::-;3594:6;3647:2;3635:9;3626:7;3622:23;3618:32;3615:52;;;3663:1;3660;3653:12;3615:52;3695:9;3689:16;3714:30;3738:5;3714:30;:::i;3779:635::-;3859:6;3912:2;3900:9;3891:7;3887:23;3883:32;3880:52;;;3928:1;3925;3918:12;3880:52;3955:16;;-1:-1:-1;;;;;3983:30:1;;3980:50;;;4026:1;4023;4016:12;3980:50;4049:22;;4102:4;4094:13;;4090:27;-1:-1:-1;4080:55:1;;4131:1;4128;4121:12;4080:55;4160:2;4154:9;4185:48;4201:31;4229:2;4201:31;:::i;4185:48::-;4256:2;4249:5;4242:17;4296:7;4291:2;4286;4282;4278:11;4274:20;4271:33;4268:53;;;4317:1;4314;4307:12;4268:53;4330:54;4381:2;4376;4369:5;4365:14;4360:2;4356;4352:11;4330:54;:::i;:::-;4403:5;3779:635;-1:-1:-1;;;;;3779:635:1:o;4419:522::-;4497:6;4505;4558:2;4546:9;4537:7;4533:23;4529:32;4526:52;;;4574:1;4571;4564:12;4526:52;4601:23;;-1:-1:-1;;;;;4636:30:1;;4633:50;;;4679:1;4676;4669:12;4633:50;4702:22;;4755:4;4747:13;;4743:27;-1:-1:-1;4733:55:1;;4784:1;4781;4774:12;4733:55;4807:75;4874:7;4869:2;4856:16;4849:4;4845:2;4841:13;4807:75;:::i;:::-;4797:85;4929:4;4914:20;;;;4901:34;;-1:-1:-1;;;;4419:522:1:o;4946:180::-;5005:6;5058:2;5046:9;5037:7;5033:23;5029:32;5026:52;;;5074:1;5071;5064:12;5026:52;-1:-1:-1;5097:23:1;;4946:180;-1:-1:-1;4946:180:1:o;5131:257::-;5172:3;5210:5;5204:12;5237:6;5232:3;5225:19;5253:63;5309:6;5302:4;5297:3;5293:14;5286:4;5279:5;5275:16;5253:63;:::i;:::-;5370:2;5349:15;-1:-1:-1;;5345:29:1;5336:39;;;;5377:4;5332:50;;5131:257;-1:-1:-1;;5131:257:1:o;5393:185::-;5435:3;5473:5;5467:12;5488:52;5533:6;5528:3;5521:4;5514:5;5510:16;5488:52;:::i;:::-;5556:16;;;;;5393:185;-1:-1:-1;;5393:185:1:o;5845:1823::-;-1:-1:-1;;;6643:43:1;;6709:13;;6625:3;;6731:61;6709:13;6781:1;6772:11;;6765:4;6753:17;;6731:61;:::i;:::-;6855:66;6851:1;6811:16;;;6843:10;;;6836:86;-1:-1:-1;;;6946:2:1;6938:11;;6931:30;6986:13;;7008:63;6986:13;7057:2;7049:11;;7042:4;7030:17;;7008:63;:::i;:::-;7136:66;7131:2;7090:17;;;;7123:11;;;7116:87;-1:-1:-1;;;7227:2:1;7219:11;;7212:80;7317:13;;7339:64;7317:13;7388:3;7380:12;;7373:4;7361:17;;7339:64;:::i;:::-;7469:66;7463:3;7422:17;;;;7455:12;;;7448:88;-1:-1:-1;;;7560:3:1;7552:12;;7545:31;7592:70;7622:39;7656:3;7648:12;;7640:6;7622:39;:::i;:::-;-1:-1:-1;;;5780:27:1;;5832:1;5823:11;;5715:125;7592:70;7585:77;5845:1823;-1:-1:-1;;;;;;;5845:1823:1:o;7673:448::-;7935:31;7930:3;7923:44;7905:3;7996:6;7990:13;8012:62;8067:6;8062:2;8057:3;8053:12;8046:4;8038:6;8034:17;8012:62;:::i;:::-;8094:16;;;;8112:2;8090:25;;7673:448;-1:-1:-1;;7673:448:1:o;8126:1386::-;8489:66;8484:3;8477:79;8586:66;8581:2;8576:3;8572:12;8565:88;8683:66;8678:2;8673:3;8669:12;8662:88;8780:66;8775:2;8770:3;8766:12;8759:88;8878:34;8872:3;8867;8863:13;8856:57;8944:34;8938:3;8933;8929:13;8922:57;9010:34;9004:3;8999;8995:13;8988:57;9076:66;9070:3;9065;9061:13;9054:89;9174:66;9168:3;9163;9159:13;9152:89;9281:24;9276:3;9272:34;9266:3;9261;9257:13;9250:57;8459:3;9326;9358:6;9352:13;9374:60;9427:6;9422:2;9417:3;9413:12;9408:2;9400:6;9396:15;9374:60;:::i;:::-;9450:56;9502:2;9493:6;9488:3;9484:16;9480:25;-1:-1:-1;;;5648:28:1;;5701:2;5692:12;;5583:127;9725:488;-1:-1:-1;;;;;9994:15:1;;;9976:34;;10046:15;;10041:2;10026:18;;10019:43;10093:2;10078:18;;10071:34;;;10141:3;10136:2;10121:18;;10114:31;;;9919:4;;10162:45;;10187:19;;10179:6;10162:45;:::i;:::-;10154:53;9725:488;-1:-1:-1;;;;;;9725:488:1:o;10410:219::-;10559:2;10548:9;10541:21;10522:4;10579:44;10619:2;10608:9;10604:18;10596:6;10579:44;:::i;10634:414::-;10836:2;10818:21;;;10875:2;10855:18;;;10848:30;10914:34;10909:2;10894:18;;10887:62;-1:-1:-1;;;10980:2:1;10965:18;;10958:48;11038:3;11023:19;;10634:414::o;15009:347::-;15211:2;15193:21;;;15250:2;15230:18;;;15223:30;-1:-1:-1;;;15284:2:1;15269:18;;15262:53;15347:2;15332:18;;15009:347::o;15361:356::-;15563:2;15545:21;;;15582:18;;;15575:30;15641:34;15636:2;15621:18;;15614:62;15708:2;15693:18;;15361:356::o;17296:413::-;17498:2;17480:21;;;17537:2;17517:18;;;17510:30;17576:34;17571:2;17556:18;;17549:62;-1:-1:-1;;;17642:2:1;17627:18;;17620:47;17699:3;17684:19;;17296:413::o;17714:341::-;17916:2;17898:21;;;17955:2;17935:18;;;17928:30;-1:-1:-1;;;17989:2:1;17974:18;;17967:47;18046:2;18031:18;;17714:341::o;18685:275::-;18756:2;18750:9;18821:2;18802:13;;-1:-1:-1;;18798:27:1;18786:40;;-1:-1:-1;;;;;18841:34:1;;18877:22;;;18838:62;18835:88;;;18903:18;;:::i;:::-;18939:2;18932:22;18685:275;;-1:-1:-1;18685:275:1:o;18965:186::-;19013:4;-1:-1:-1;;;;;19035:30:1;;19032:56;;;19068:18;;:::i;:::-;-1:-1:-1;19134:2:1;19113:15;-1:-1:-1;;19109:29:1;19140:4;19105:40;;18965:186::o;19156:128::-;19196:3;19227:1;19223:6;19220:1;19217:13;19214:39;;;19233:18;;:::i;:::-;-1:-1:-1;19269:9:1;;19156:128::o;19289:217::-;19329:1;19355;19345:132;;19399:10;19394:3;19390:20;19387:1;19380:31;19434:4;19431:1;19424:15;19462:4;19459:1;19452:15;19345:132;-1:-1:-1;19491:9:1;;19289:217::o;19511:168::-;19551:7;19617:1;19613;19609:6;19605:14;19602:1;19599:21;19594:1;19587:9;19580:17;19576:45;19573:71;;;19624:18;;:::i;:::-;-1:-1:-1;19664:9:1;;19511:168::o;19684:125::-;19724:4;19752:1;19749;19746:8;19743:34;;;19757:18;;:::i;:::-;-1:-1:-1;19794:9:1;;19684:125::o;19814:258::-;19886:1;19896:113;19910:6;19907:1;19904:13;19896:113;;;19986:11;;;19980:18;19967:11;;;19960:39;19932:2;19925:10;19896:113;;;20027:6;20024:1;20021:13;20018:48;;;-1:-1:-1;;20062:1:1;20044:16;;20037:27;19814:258::o;20077:380::-;20156:1;20152:12;;;;20199;;;20220:61;;20274:4;20266:6;20262:17;20252:27;;20220:61;20327:2;20319:6;20316:14;20296:18;20293:38;20290:161;;;20373:10;20368:3;20364:20;20361:1;20354:31;20408:4;20405:1;20398:15;20436:4;20433:1;20426:15;20290:161;;20077:380;;;:::o;20462:127::-;20523:10;20518:3;20514:20;20511:1;20504:31;20554:4;20551:1;20544:15;20578:4;20575:1;20568:15;20594:127;20655:10;20650:3;20646:20;20643:1;20636:31;20686:4;20683:1;20676:15;20710:4;20707:1;20700:15;20726:127;20787:10;20782:3;20778:20;20775:1;20768:31;20818:4;20815:1;20808:15;20842:4;20839:1;20832:15;20858:131;-1:-1:-1;;;;;;20932:32:1;;20922:43;;20912:71;;20979:1;20976;20969:12
Swarm Source
ipfs://0d6259840429afb36af7ed32787350e48bbaede54da495838c9e5881ccc4b14b
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.