ETH Price: $3,398.60 (-1.75%)
Gas: 6 Gwei

Token

Unicode (for Geeks) ()
 

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
Filtered by Token Holder
pepecope.eth
Balance
16 Unicode (for Geeks)
0xd5e81c75b48172a38afeca96e8f07f5107abec13
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# 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 Source Code Verified (Exact Match)

Contract Name:
UnicodeForGeeks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license

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 = "&lt;";
        } else if(tokenId == 38) { // &
            svgch = "&amp;";
        } 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

Contract ABI

[{"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"}]

60806040523480156200001157600080fd5b50604080518082018252601381527f556e69636f64652028666f72204765656b732900000000000000000000000000602080830191825283518085019094526003845262efbfbd60e81b908401528151919291620000729160009162000101565b5080516200008890600190602084019062000101565b505050620000a56200009f620000ab60201b60201c565b620000af565b620001e4565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010f90620001a7565b90600052602060002090601f0160209004810192826200013357600085556200017e565b82601f106200014e57805160ff19168380011785556200017e565b828001600101855582156200017e579182015b828111156200017e57825182559160200191906001019062000161565b506200018c92915062000190565b5090565b5b808211156200018c576000815560010162000191565b600181811c90821680620001bc57607f821691505b60208210811415620001de57634e487b7160e01b600052602260045260246000fd5b50919050565b6125ed80620001f46000396000f3fe608060405234801561001057600080fd5b50600436106100fc5760003560e01c806301ffc9a71461010157806306fdde0314610129578063081812fc1461013e578063095ea7b31461016957806323b872dd1461017e57806342842e0e146101915780636352211e146101a457806370a08231146101b7578063715018a6146101d85780638da5cb5b146101e057806395d89b41146101e8578063a22cb465146101f0578063b88d4fde14610203578063c1baee4614610216578063c87b56dd14610229578063cf9446a71461023c578063e5d7906c14610264578063e985e9c514610277578063f2fde38b1461028a578063fd07bbba1461029d575b600080fd5b61011461010f366004611dc9565b6102b0565b60405190151581526020015b60405180910390f35b610131610302565b604051610120919061228a565b61015161014c366004611ed1565b610394565b6040516001600160a01b039091168152602001610120565b61017c610177366004611d9f565b610421565b005b61017c61018c366004611c2a565b610532565b61017c61019f366004611c2a565b610563565b6101516101b2366004611ed1565b61057e565b6101ca6101c5366004611bd5565b6105f5565b604051908152602001610120565b61017c61067c565b6101516106b7565b6101316106c6565b61017c6101fe366004611ce1565b6106d5565b61017c610211366004611c66565b610796565b610131610224366004611ed1565b6107ce565b610131610237366004611ed1565b610a86565b61024f61024a366004611e79565b610c97565b60408051928352602083019190915201610120565b61017c610272366004611d1d565b611121565b610114610285366004611bf7565b611247565b61017c610298366004611bd5565b611275565b61017c6102ab366004611d1d565b611315565b60006001600160e01b031982166380ac58cd60e01b14806102e157506001600160e01b03198216635b5e139f60e01b145b806102fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610311906124c4565b80601f016020809104026020016040519081016040528092919081815260200182805461033d906124c4565b801561038a5780601f1061035f5761010080835404028352916020019161038a565b820191906000526020600020905b81548152906001019060200180831161036d57829003601f168201915b5050505050905090565b600061039f8261142e565b6104055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061042c8261057e565b9050806001600160a01b0316836001600160a01b0316141561049a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016103fc565b336001600160a01b03821614806104b657506104b68133611247565b6105235760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016103fc565b61052d838361144b565b505050565b61053c33826114b9565b6105585760405162461bcd60e51b81526004016103fc90612355565b61052d838383611583565b61052d83838360405180602001604052806000815250610796565b6000818152600260205260408120546001600160a01b0316806102fc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016103fc565b60006001600160a01b0382166106605760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016103fc565b506001600160a01b031660009081526003602052604090205490565b336106856106b7565b6001600160a01b0316146106ab5760405162461bcd60e51b81526004016103fc90612320565b6106b56000611711565b565b6006546001600160a01b031690565b606060018054610311906124c4565b6001600160a01b03821633141561072a5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016103fc565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6107a033836114b9565b6107bc5760405162461bcd60e51b81526004016103fc90612355565b6107c884848484611763565b50505050565b6060607f821161082d576040805160018082528183019092526000916020820181803683370190505090508260f81b8160008151811061081057610810612515565b60200101906001600160f81b031916908160001a90535092915050565b6107ff82116108a957604080516002808252818301909252600091602082018180368337019050509050600683901c60c01760f81b8160008151811061087557610875612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160018151811061081057610810612515565b61ffff821161095d57604080516003808252818301909252600091602082018180368337019050509050600c83901c60e01760f81b816000815181106108f1576108f1612515565b60200101906001600160f81b031916908160001a905350600683901c603f1660801760f81b8160018151811061092957610929612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160028151811061081057610810612515565b6210ffff8211610a4a57604080516004808252818301909252600091602082018180368337019050509050601283901c60f01760f81b816000815181106109a6576109a6612515565b60200101906001600160f81b031916908160001a905350600c83901c603f1660801760f81b816001815181106109de576109de612515565b60200101906001600160f81b031916908160001a905350600683901c603f1660801760f81b81600281518110610a1657610a16612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160038151811061081057610810612515565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590818dbd9195c1bda5b9d607a1b60448201526064016103fc565b6060610a918261142e565b610af55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016103fc565b6000610b00836107ce565b905080603c841415610b305760405180604001604052806004815260200163266c743b60e01b8152509150610b82565b8360261415610b5e576040518060400160405280600581526020016426616d703b60d81b8152509150610b82565b8360221415610b8257506040805180820190915260028152612e1160f11b60208201525b600082604051602001610b9591906120ac565b60405160208183030381529060405290506000828373fab7e2fb81b083f49fd7089ef3db68e8bbad126363652c9b0a896040518263ffffffff1660e01b8152600401610be391815260200190565b60006040518083038186803b158015610bfb57600080fd5b505af4158015610c0f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c379190810190611e03565b610c4085611796565b604051602001610c539493929190611f32565b6040516020818303038152906040529050610c6d81611796565b604051602001610c7d9190612067565b604051602081830303815290604052945050505050919050565b6000806000849050808481518110610cb157610cb1612515565b0160200151600160ff1b16610d1257610ccb846001612428565b81511015610ceb5760405162461bcd60e51b81526004016103fc906122ef565b808481518110610cfd57610cfd612515565b016020015160f81c92506001915061111a9050565b808481518110610d2457610d24612515565b602091010151600760fd1b16600360fe1b1415610dff57610d46846002612428565b815110158015610d80575080610d5d856001612428565b81518110610d6d57610d6d612515565b602091010151600360fe1b16600160ff1b145b610d9c5760405162461bcd60e51b81526004016103fc906122ef565b80610da8856001612428565b81518110610db857610db8612515565b602001015160f81c60f81b603f60f81b1660f81c60ff166006828681518110610de357610de3612515565b60209101015160f81c601f16901b1792506002915061111a9050565b808481518110610e1157610e11612515565b602091010151600f60fc1b16600760fd1b1415610f4f57610e33846003612428565b815110158015610e6d575080610e4a856001612428565b81518110610e5a57610e5a612515565b602091010151600360fe1b16600160ff1b145b8015610ea3575080610e80856002612428565b81518110610e9057610e90612515565b602091010151600360fe1b16600160ff1b145b610ebf5760405162461bcd60e51b81526004016103fc906122ef565b80610ecb856002612428565b81518110610edb57610edb612515565b60209101015160f81c603f16600682610ef5876001612428565b81518110610f0557610f05612515565b602001015160f81c60f81b603f60f81b1660f81c60ff16901b600c838781518110610f3257610f32612515565b60209101015160f81c600f16901b171792506003915061111a9050565b808481518110610f6157610f61612515565b602091010151601f60fb1b16600f60fc1b141561110257610f83846004612428565b815110158015610fbd575080610f9a856001612428565b81518110610faa57610faa612515565b602091010151600360fe1b16600160ff1b145b8015610ff3575080610fd0856002612428565b81518110610fe057610fe0612515565b602091010151600360fe1b16600160ff1b145b8015611029575080611006856003612428565b8151811061101657611016612515565b602091010151600360fe1b16600160ff1b145b6110455760405162461bcd60e51b81526004016103fc906122ef565b80611051856003612428565b8151811061106157611061612515565b60209101015160f81c603f1660068261107b876002612428565b8151811061108b5761108b612515565b60209101015160f81c603f16901b600c836110a7886001612428565b815181106110b7576110b7612515565b602001015160f81c60f81b603f60f81b1660f81c60ff16901b60128488815181106110e4576110e4612515565b60209101015160f81c600716901b17171792506004915061111a9050565b60405162461bcd60e51b81526004016103fc906122ef565b9250929050565b60005b818110156107c85760008061117085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250610c97915050565b6040516332964d8560e11b815260048101839052919350915060009073fab7e2fb81b083f49fd7089ef3db68e8bbad12639063652c9b0a9060240160006040518083038186803b1580156111c357600080fd5b505af41580156111d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ff9190810190611e03565b511161121d5760405162461bcd60e51b81526004016103fc906123a6565b6112268261142e565b6112345761123486836118fd565b61123e8184612428565b92505050611124565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3361127e6106b7565b6001600160a01b0316146112a45760405162461bcd60e51b81526004016103fc90612320565b6001600160a01b0381166113095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103fc565b61131281611711565b50565b60005b818110156107c85760008061136485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250610c97915050565b6040516332964d8560e11b815260048101839052919350915060009073fab7e2fb81b083f49fd7089ef3db68e8bbad12639063652c9b0a9060240160006040518083038186803b1580156113b757600080fd5b505af41580156113cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113f39190810190611e03565b51116114115760405162461bcd60e51b81526004016103fc906123a6565b61141b86836118fd565b6114258184612428565b92505050611318565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114808261057e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114c48261142e565b6115255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016103fc565b60006115308361057e565b9050806001600160a01b0316846001600160a01b0316148061156b5750836001600160a01b031661156084610394565b6001600160a01b0316145b8061157b575061157b8185611247565b949350505050565b826001600160a01b03166115968261057e565b6001600160a01b0316146115fe5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016103fc565b6001600160a01b0382166116605760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016103fc565b61166b60008261144b565b6001600160a01b0383166000908152600360205260408120805460019290611694908490612481565b90915550506001600160a01b03821660009081526003602052604081208054600192906116c2908490612428565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061259883398151915291a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61176e848484611583565b61177a8484848461191b565b6107c85760405162461bcd60e51b81526004016103fc9061229d565b60608151600014156117b657505060408051602081019091526000815290565b600060405180606001604052806040815260200161255860409139905060006003845160026117e59190612428565b6117ef9190612440565b6117fa906004612462565b90506000611809826020612428565b6001600160401b038111156118205761182061252b565b6040519080825280601f01601f19166020018201604052801561184a576020820181803683370190505b509050818152600183018586518101602084015b818310156118b85760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161185e565b6003895106600181146118d257600281146118e3576118ef565b613d3d60f01b6001198301526118ef565b603d60f81b6000198301525b509398975050505050505050565b611917828260405180602001604052806000815250611a28565b5050565b60006001600160a01b0384163b15611a1d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061195f90339089908890889060040161224d565b602060405180830381600087803b15801561197957600080fd5b505af19250505080156119a9575060408051601f3d908101601f191682019092526119a691810190611de6565b60015b611a03573d8080156119d7576040519150601f19603f3d011682016040523d82523d6000602084013e6119dc565b606091505b5080516119fb5760405162461bcd60e51b81526004016103fc9061229d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061157b565b506001949350505050565b611a328383611a5b565b611a3f600084848461191b565b61052d5760405162461bcd60e51b81526004016103fc9061229d565b6001600160a01b038216611ab15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016103fc565b611aba8161142e565b15611b065760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016103fc565b6001600160a01b0382166000908152600360205260408120805460019290611b2f908490612428565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020612598833981519152908290a45050565b6000611b8e611b8984612401565b6123d1565b9050828152838383011115611ba257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611bd057600080fd5b919050565b600060208284031215611be757600080fd5b611bf082611bb9565b9392505050565b60008060408385031215611c0a57600080fd5b611c1383611bb9565b9150611c2160208401611bb9565b90509250929050565b600080600060608486031215611c3f57600080fd5b611c4884611bb9565b9250611c5660208501611bb9565b9150604084013590509250925092565b60008060008060808587031215611c7c57600080fd5b611c8585611bb9565b9350611c9360208601611bb9565b92506040850135915060608501356001600160401b03811115611cb557600080fd5b8501601f81018713611cc657600080fd5b611cd587823560208401611b7b565b91505092959194509250565b60008060408385031215611cf457600080fd5b611cfd83611bb9565b915060208301358015158114611d1257600080fd5b809150509250929050565b600080600060408486031215611d3257600080fd5b611d3b84611bb9565b925060208401356001600160401b0380821115611d5757600080fd5b818601915086601f830112611d6b57600080fd5b813581811115611d7a57600080fd5b876020828501011115611d8c57600080fd5b6020830194508093505050509250925092565b60008060408385031215611db257600080fd5b611dbb83611bb9565b946020939093013593505050565b600060208284031215611ddb57600080fd5b8135611bf081612541565b600060208284031215611df857600080fd5b8151611bf081612541565b600060208284031215611e1557600080fd5b81516001600160401b03811115611e2b57600080fd5b8201601f81018413611e3c57600080fd5b8051611e4a611b8982612401565b818152856020838501011115611e5f57600080fd5b611e70826020830160208601612498565b95945050505050565b60008060408385031215611e8c57600080fd5b82356001600160401b03811115611ea257600080fd5b8301601f81018513611eb357600080fd5b611ec285823560208401611b7b565b95602094909401359450505050565b600060208284031215611ee357600080fd5b5035919050565b60008151808452611f02816020860160208601612498565b601f01601f19169290920160200192915050565b60008151611f28818560208601612498565b9290920192915050565b683d913730b6b2911d1160b91b81528451600090611f57816009850160208a01612498565b7f222c226465736372697074696f6e223a2254686520756e69636f6465206368616009918401918201526603930b1ba32b9160cd1b60298201528551611fa4816030840160208a01612498565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224360309290910191820152773430b930b1ba32b9102a3cb8329116113b30b63ab2911d1160411b60508201528451612003816068840160208901612498565b7f227d5d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b606892909101918201526618985cd94d8d0b60ca1b608882015261205c61204e608f830186611f16565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161209f81601d850160208701612498565b91909101601d0192915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f64794d6964206d656574222076696577426f783d22302030203430302034303060408201527f223e3c7374796c653e2e6368207b20746578742d616e63686f723a206d69646460608201527f6c653b20646f6d696e616e742d626173656c696e653a206d6964646c653b206660808201527f696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b2060a08201527f666f6e742d73697a653a20393670783b207d3c2f7374796c653e3c726563742060c08201527f77696474683d223130302522206865696768743d2231303025222066696c6c3d60e08201527f22626c61636b22202f3e3c7465787420783d223230302220793d2232303022206101008201526a31b630b9b99e9131b4111f60a91b610120820152600061012b835161222c8183860160208801612498565b611e7082828601016c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061228090830184611eea565b9695505050505050565b602081526000611bf06020830184611eea565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526017908201527624b73b30b634b2103ab734b1b7b2329031b430b1ba32b960491b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526011908201527024b73b30b634b21031b430b930b1ba32b960791b604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156123f9576123f961252b565b604052919050565b60006001600160401b0382111561241a5761241a61252b565b50601f01601f191660200190565b6000821982111561243b5761243b6124ff565b500190565b60008261245d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561247c5761247c6124ff565b500290565b600082821015612493576124936124ff565b500390565b60005b838110156124b357818101518382015260200161249b565b838111156107c85750506000910152565b600181811c908216806124d857607f821691505b602082108114156124f957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461131257600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200d6259840429afb36af7ed32787350e48bbaede54da495838c9e5881ccc4b14b64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100fc5760003560e01c806301ffc9a71461010157806306fdde0314610129578063081812fc1461013e578063095ea7b31461016957806323b872dd1461017e57806342842e0e146101915780636352211e146101a457806370a08231146101b7578063715018a6146101d85780638da5cb5b146101e057806395d89b41146101e8578063a22cb465146101f0578063b88d4fde14610203578063c1baee4614610216578063c87b56dd14610229578063cf9446a71461023c578063e5d7906c14610264578063e985e9c514610277578063f2fde38b1461028a578063fd07bbba1461029d575b600080fd5b61011461010f366004611dc9565b6102b0565b60405190151581526020015b60405180910390f35b610131610302565b604051610120919061228a565b61015161014c366004611ed1565b610394565b6040516001600160a01b039091168152602001610120565b61017c610177366004611d9f565b610421565b005b61017c61018c366004611c2a565b610532565b61017c61019f366004611c2a565b610563565b6101516101b2366004611ed1565b61057e565b6101ca6101c5366004611bd5565b6105f5565b604051908152602001610120565b61017c61067c565b6101516106b7565b6101316106c6565b61017c6101fe366004611ce1565b6106d5565b61017c610211366004611c66565b610796565b610131610224366004611ed1565b6107ce565b610131610237366004611ed1565b610a86565b61024f61024a366004611e79565b610c97565b60408051928352602083019190915201610120565b61017c610272366004611d1d565b611121565b610114610285366004611bf7565b611247565b61017c610298366004611bd5565b611275565b61017c6102ab366004611d1d565b611315565b60006001600160e01b031982166380ac58cd60e01b14806102e157506001600160e01b03198216635b5e139f60e01b145b806102fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610311906124c4565b80601f016020809104026020016040519081016040528092919081815260200182805461033d906124c4565b801561038a5780601f1061035f5761010080835404028352916020019161038a565b820191906000526020600020905b81548152906001019060200180831161036d57829003601f168201915b5050505050905090565b600061039f8261142e565b6104055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061042c8261057e565b9050806001600160a01b0316836001600160a01b0316141561049a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016103fc565b336001600160a01b03821614806104b657506104b68133611247565b6105235760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016103fc565b61052d838361144b565b505050565b61053c33826114b9565b6105585760405162461bcd60e51b81526004016103fc90612355565b61052d838383611583565b61052d83838360405180602001604052806000815250610796565b6000818152600260205260408120546001600160a01b0316806102fc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016103fc565b60006001600160a01b0382166106605760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016103fc565b506001600160a01b031660009081526003602052604090205490565b336106856106b7565b6001600160a01b0316146106ab5760405162461bcd60e51b81526004016103fc90612320565b6106b56000611711565b565b6006546001600160a01b031690565b606060018054610311906124c4565b6001600160a01b03821633141561072a5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016103fc565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6107a033836114b9565b6107bc5760405162461bcd60e51b81526004016103fc90612355565b6107c884848484611763565b50505050565b6060607f821161082d576040805160018082528183019092526000916020820181803683370190505090508260f81b8160008151811061081057610810612515565b60200101906001600160f81b031916908160001a90535092915050565b6107ff82116108a957604080516002808252818301909252600091602082018180368337019050509050600683901c60c01760f81b8160008151811061087557610875612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160018151811061081057610810612515565b61ffff821161095d57604080516003808252818301909252600091602082018180368337019050509050600c83901c60e01760f81b816000815181106108f1576108f1612515565b60200101906001600160f81b031916908160001a905350600683901c603f1660801760f81b8160018151811061092957610929612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160028151811061081057610810612515565b6210ffff8211610a4a57604080516004808252818301909252600091602082018180368337019050509050601283901c60f01760f81b816000815181106109a6576109a6612515565b60200101906001600160f81b031916908160001a905350600c83901c603f1660801760f81b816001815181106109de576109de612515565b60200101906001600160f81b031916908160001a905350600683901c603f1660801760f81b81600281518110610a1657610a16612515565b60200101906001600160f81b031916908160001a90535082603f1660801760f81b8160038151811061081057610810612515565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590818dbd9195c1bda5b9d607a1b60448201526064016103fc565b6060610a918261142e565b610af55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016103fc565b6000610b00836107ce565b905080603c841415610b305760405180604001604052806004815260200163266c743b60e01b8152509150610b82565b8360261415610b5e576040518060400160405280600581526020016426616d703b60d81b8152509150610b82565b8360221415610b8257506040805180820190915260028152612e1160f11b60208201525b600082604051602001610b9591906120ac565b60405160208183030381529060405290506000828373fab7e2fb81b083f49fd7089ef3db68e8bbad126363652c9b0a896040518263ffffffff1660e01b8152600401610be391815260200190565b60006040518083038186803b158015610bfb57600080fd5b505af4158015610c0f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c379190810190611e03565b610c4085611796565b604051602001610c539493929190611f32565b6040516020818303038152906040529050610c6d81611796565b604051602001610c7d9190612067565b604051602081830303815290604052945050505050919050565b6000806000849050808481518110610cb157610cb1612515565b0160200151600160ff1b16610d1257610ccb846001612428565b81511015610ceb5760405162461bcd60e51b81526004016103fc906122ef565b808481518110610cfd57610cfd612515565b016020015160f81c92506001915061111a9050565b808481518110610d2457610d24612515565b602091010151600760fd1b16600360fe1b1415610dff57610d46846002612428565b815110158015610d80575080610d5d856001612428565b81518110610d6d57610d6d612515565b602091010151600360fe1b16600160ff1b145b610d9c5760405162461bcd60e51b81526004016103fc906122ef565b80610da8856001612428565b81518110610db857610db8612515565b602001015160f81c60f81b603f60f81b1660f81c60ff166006828681518110610de357610de3612515565b60209101015160f81c601f16901b1792506002915061111a9050565b808481518110610e1157610e11612515565b602091010151600f60fc1b16600760fd1b1415610f4f57610e33846003612428565b815110158015610e6d575080610e4a856001612428565b81518110610e5a57610e5a612515565b602091010151600360fe1b16600160ff1b145b8015610ea3575080610e80856002612428565b81518110610e9057610e90612515565b602091010151600360fe1b16600160ff1b145b610ebf5760405162461bcd60e51b81526004016103fc906122ef565b80610ecb856002612428565b81518110610edb57610edb612515565b60209101015160f81c603f16600682610ef5876001612428565b81518110610f0557610f05612515565b602001015160f81c60f81b603f60f81b1660f81c60ff16901b600c838781518110610f3257610f32612515565b60209101015160f81c600f16901b171792506003915061111a9050565b808481518110610f6157610f61612515565b602091010151601f60fb1b16600f60fc1b141561110257610f83846004612428565b815110158015610fbd575080610f9a856001612428565b81518110610faa57610faa612515565b602091010151600360fe1b16600160ff1b145b8015610ff3575080610fd0856002612428565b81518110610fe057610fe0612515565b602091010151600360fe1b16600160ff1b145b8015611029575080611006856003612428565b8151811061101657611016612515565b602091010151600360fe1b16600160ff1b145b6110455760405162461bcd60e51b81526004016103fc906122ef565b80611051856003612428565b8151811061106157611061612515565b60209101015160f81c603f1660068261107b876002612428565b8151811061108b5761108b612515565b60209101015160f81c603f16901b600c836110a7886001612428565b815181106110b7576110b7612515565b602001015160f81c60f81b603f60f81b1660f81c60ff16901b60128488815181106110e4576110e4612515565b60209101015160f81c600716901b17171792506004915061111a9050565b60405162461bcd60e51b81526004016103fc906122ef565b9250929050565b60005b818110156107c85760008061117085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250610c97915050565b6040516332964d8560e11b815260048101839052919350915060009073fab7e2fb81b083f49fd7089ef3db68e8bbad12639063652c9b0a9060240160006040518083038186803b1580156111c357600080fd5b505af41580156111d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ff9190810190611e03565b511161121d5760405162461bcd60e51b81526004016103fc906123a6565b6112268261142e565b6112345761123486836118fd565b61123e8184612428565b92505050611124565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3361127e6106b7565b6001600160a01b0316146112a45760405162461bcd60e51b81526004016103fc90612320565b6001600160a01b0381166113095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103fc565b61131281611711565b50565b60005b818110156107c85760008061136485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250610c97915050565b6040516332964d8560e11b815260048101839052919350915060009073fab7e2fb81b083f49fd7089ef3db68e8bbad12639063652c9b0a9060240160006040518083038186803b1580156113b757600080fd5b505af41580156113cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113f39190810190611e03565b51116114115760405162461bcd60e51b81526004016103fc906123a6565b61141b86836118fd565b6114258184612428565b92505050611318565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114808261057e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114c48261142e565b6115255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016103fc565b60006115308361057e565b9050806001600160a01b0316846001600160a01b0316148061156b5750836001600160a01b031661156084610394565b6001600160a01b0316145b8061157b575061157b8185611247565b949350505050565b826001600160a01b03166115968261057e565b6001600160a01b0316146115fe5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016103fc565b6001600160a01b0382166116605760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016103fc565b61166b60008261144b565b6001600160a01b0383166000908152600360205260408120805460019290611694908490612481565b90915550506001600160a01b03821660009081526003602052604081208054600192906116c2908490612428565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061259883398151915291a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61176e848484611583565b61177a8484848461191b565b6107c85760405162461bcd60e51b81526004016103fc9061229d565b60608151600014156117b657505060408051602081019091526000815290565b600060405180606001604052806040815260200161255860409139905060006003845160026117e59190612428565b6117ef9190612440565b6117fa906004612462565b90506000611809826020612428565b6001600160401b038111156118205761182061252b565b6040519080825280601f01601f19166020018201604052801561184a576020820181803683370190505b509050818152600183018586518101602084015b818310156118b85760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161185e565b6003895106600181146118d257600281146118e3576118ef565b613d3d60f01b6001198301526118ef565b603d60f81b6000198301525b509398975050505050505050565b611917828260405180602001604052806000815250611a28565b5050565b60006001600160a01b0384163b15611a1d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061195f90339089908890889060040161224d565b602060405180830381600087803b15801561197957600080fd5b505af19250505080156119a9575060408051601f3d908101601f191682019092526119a691810190611de6565b60015b611a03573d8080156119d7576040519150601f19603f3d011682016040523d82523d6000602084013e6119dc565b606091505b5080516119fb5760405162461bcd60e51b81526004016103fc9061229d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061157b565b506001949350505050565b611a328383611a5b565b611a3f600084848461191b565b61052d5760405162461bcd60e51b81526004016103fc9061229d565b6001600160a01b038216611ab15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016103fc565b611aba8161142e565b15611b065760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016103fc565b6001600160a01b0382166000908152600360205260408120805460019290611b2f908490612428565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020612598833981519152908290a45050565b6000611b8e611b8984612401565b6123d1565b9050828152838383011115611ba257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611bd057600080fd5b919050565b600060208284031215611be757600080fd5b611bf082611bb9565b9392505050565b60008060408385031215611c0a57600080fd5b611c1383611bb9565b9150611c2160208401611bb9565b90509250929050565b600080600060608486031215611c3f57600080fd5b611c4884611bb9565b9250611c5660208501611bb9565b9150604084013590509250925092565b60008060008060808587031215611c7c57600080fd5b611c8585611bb9565b9350611c9360208601611bb9565b92506040850135915060608501356001600160401b03811115611cb557600080fd5b8501601f81018713611cc657600080fd5b611cd587823560208401611b7b565b91505092959194509250565b60008060408385031215611cf457600080fd5b611cfd83611bb9565b915060208301358015158114611d1257600080fd5b809150509250929050565b600080600060408486031215611d3257600080fd5b611d3b84611bb9565b925060208401356001600160401b0380821115611d5757600080fd5b818601915086601f830112611d6b57600080fd5b813581811115611d7a57600080fd5b876020828501011115611d8c57600080fd5b6020830194508093505050509250925092565b60008060408385031215611db257600080fd5b611dbb83611bb9565b946020939093013593505050565b600060208284031215611ddb57600080fd5b8135611bf081612541565b600060208284031215611df857600080fd5b8151611bf081612541565b600060208284031215611e1557600080fd5b81516001600160401b03811115611e2b57600080fd5b8201601f81018413611e3c57600080fd5b8051611e4a611b8982612401565b818152856020838501011115611e5f57600080fd5b611e70826020830160208601612498565b95945050505050565b60008060408385031215611e8c57600080fd5b82356001600160401b03811115611ea257600080fd5b8301601f81018513611eb357600080fd5b611ec285823560208401611b7b565b95602094909401359450505050565b600060208284031215611ee357600080fd5b5035919050565b60008151808452611f02816020860160208601612498565b601f01601f19169290920160200192915050565b60008151611f28818560208601612498565b9290920192915050565b683d913730b6b2911d1160b91b81528451600090611f57816009850160208a01612498565b7f222c226465736372697074696f6e223a2254686520756e69636f6465206368616009918401918201526603930b1ba32b9160cd1b60298201528551611fa4816030840160208a01612498565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224360309290910191820152773430b930b1ba32b9102a3cb8329116113b30b63ab2911d1160411b60508201528451612003816068840160208901612498565b7f227d5d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b606892909101918201526618985cd94d8d0b60ca1b608882015261205c61204e608f830186611f16565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161209f81601d850160208701612498565b91909101601d0192915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f64794d6964206d656574222076696577426f783d22302030203430302034303060408201527f223e3c7374796c653e2e6368207b20746578742d616e63686f723a206d69646460608201527f6c653b20646f6d696e616e742d626173656c696e653a206d6964646c653b206660808201527f696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b2060a08201527f666f6e742d73697a653a20393670783b207d3c2f7374796c653e3c726563742060c08201527f77696474683d223130302522206865696768743d2231303025222066696c6c3d60e08201527f22626c61636b22202f3e3c7465787420783d223230302220793d2232303022206101008201526a31b630b9b99e9131b4111f60a91b610120820152600061012b835161222c8183860160208801612498565b611e7082828601016c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061228090830184611eea565b9695505050505050565b602081526000611bf06020830184611eea565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526017908201527624b73b30b634b2103ab734b1b7b2329031b430b1ba32b960491b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526011908201527024b73b30b634b21031b430b930b1ba32b960791b604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156123f9576123f961252b565b604052919050565b60006001600160401b0382111561241a5761241a61252b565b50601f01601f191660200190565b6000821982111561243b5761243b6124ff565b500190565b60008261245d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561247c5761247c6124ff565b500290565b600082821015612493576124936124ff565b500390565b60005b838110156124b357818101518382015260200161249b565b838111156107c85750506000910152565b600181811c908216806124d857607f821691505b602082108114156124f957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461131257600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200d6259840429afb36af7ed32787350e48bbaede54da495838c9e5881ccc4b14b64736f6c63430008070033

Libraries Used


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.