Sepolia Testnet

Token

Emerald (EMRLD)
ERC-721

Overview

Max Total Supply

0 EMRLD

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
17 EMRLD
0x21efd066e581fa55ef105170cc04d74386a09190
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EmeraldNFT

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 10000 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.21;
import {Base64} from "solady/utils/Base64.sol";
import {ERC721} from "solady/tokens/ERC721.sol";

contract EmeraldNFT is ERC721 {
    uint256 public NEXT_TOKEN_ID = 0;
    string public IMAGE = "<svg width='555' height='526' viewBox='0 0 555 526' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M277.238 2.24067H366.291C370.428 2.24067 374.593 2.49922 378.73 2.24067C380.904 2.1603 383.065 2.6007 385.034 3.52517C387.003 4.44963 388.722 5.83136 390.048 7.55517C395.018 13.5591 399.701 19.8503 404.584 25.9404C409.468 32.0306 414.179 37.6611 418.948 43.5788C428.83 55.9889 438.607 68.3702 448.278 80.7228C455.23 89.3409 462.153 98.275 469.134 106.979C476.114 115.684 482.578 123.555 489.243 131.828C498.838 143.664 508.375 155.528 517.97 167.306C522.939 173.367 528.082 179.285 533.08 185.318C538.826 192.184 544.571 199.021 550.316 205.972C555.315 212.177 555.056 214.591 549.742 220.336C539.773 231.425 530.006 242.686 520.038 253.745C507.341 267.822 494.471 281.697 481.802 295.802C469.795 309.102 457.988 322.547 446.066 336.02C441.039 341.765 435.868 347.223 430.841 352.882C422.223 362.535 413.748 372.244 405.216 381.925C399.241 388.705 393.295 395.513 387.233 402.264C376.03 414.76 364.74 427.17 353.536 439.609C336.836 458.205 320.184 476.811 303.58 495.426C297.404 502.378 291.371 509.444 285.166 516.368C283.105 518.542 280.928 520.603 278.645 522.544C278.376 522.831 278.052 523.06 277.691 523.216C277.33 523.373 276.941 523.453 276.548 523.453C276.155 523.453 275.766 523.373 275.405 523.216C275.045 523.06 274.72 522.831 274.451 522.544C272.61 520.994 270.855 519.344 269.194 517.603C249.947 496.115 230.738 474.589 211.568 453.025C202.174 442.482 192.866 431.882 183.473 421.425C171.982 408.699 160.692 396.03 149.345 383.333C129.638 361.213 109.941 339.093 90.2536 316.974C76.321 301.231 62.7044 285.374 48.7431 269.545C33.8912 252.797 18.8957 236.366 4.04389 219.876C3.12463 218.842 2.32027 217.722 1.45846 216.659C0.674038 215.782 0.212353 214.663 0.149676 213.488C0.0869989 212.313 0.42708 211.151 1.11374 210.195C2.80863 207.639 4.79079 205.254 6.7155 202.87L31.5931 172.362C37.1661 165.467 42.7008 158.573 48.1973 151.678C53.1383 145.531 58.0219 139.355 62.9342 133.15C70.1734 124.014 77.2977 114.793 84.6518 105.687C89.2769 99.9412 94.1605 94.3969 98.7855 88.6515C105.651 80.0334 112.373 71.5589 119.21 63.0557C125.301 55.3856 131.506 47.8304 137.567 40.0741C144.548 31.2549 151.442 22.3496 158.394 13.5017C159.83 11.6631 161.267 9.91078 162.875 8.18716C164.397 6.34186 166.317 4.86597 168.492 3.87074C170.666 2.87551 173.038 2.3869 175.429 2.44176C199.56 2.44176 223.71 2.44176 247.879 2.44176H277.238V2.24067Z' fill='#034656'/><path d='M258.077 422.287L258.967 421.971C258.967 420.965 259.14 419.96 259.14 418.954C259.283 410.336 259.484 401.718 259.484 393.1C259.484 372.991 259.255 352.882 259.226 332.773C259.226 281.678 259.226 230.592 259.226 179.515C259.226 174.373 257.359 172.362 252.13 172.046C247.821 171.787 243.512 171.701 239.174 171.672L162.559 171.27C159.687 171.27 156.814 171.27 153.941 171.471C149.891 171.759 148.196 174.086 149.776 177.705C152.419 183.968 155.349 190.086 158.107 196.292C163.163 207.782 168.104 219.273 173.246 230.764C176.664 238.434 180.399 245.673 183.846 253.2C187.581 261.588 190.942 270.149 194.648 278.537C201.973 295.199 209.413 311.803 216.796 328.436C221.967 340.041 227.128 351.657 232.28 363.282C236.962 373.767 241.702 384.252 246.241 394.881C249.602 402.695 252.676 410.624 255.922 418.466C256.565 419.781 257.284 421.057 258.077 422.287Z' fill='#134858'/><path d='M294.1 418.552H294.962C295.327 417.941 295.653 417.308 295.939 416.656C297.49 413.008 298.812 409.331 300.593 405.74C305.39 395.312 310.389 384.942 314.956 374.456C321.161 360.581 327.108 346.591 333.226 332.687C341.845 313.153 350.463 293.676 359.081 274.17C370.361 248.871 381.584 223.553 392.749 198.216C396.024 190.824 399.327 183.46 402.66 176.125C403.636 173.971 402.66 173.08 400.677 172.793C400.16 172.793 399.643 172.649 399.126 172.62C389.014 172.62 379.017 172.276 368.762 172.276C345.914 172.276 323.067 172.276 300.219 172.276C295.134 172.276 293.497 174.086 293.526 178.969C293.526 193.993 293.784 208.989 293.842 224.013C294.033 272.696 294.206 321.378 294.359 370.061C294.359 384.741 294.043 399.42 293.899 414.071C293.87 415.478 294.043 417.001 294.1 418.552Z' fill='#134858'/><path d='M71.811 242.169L71.3801 243.116L212.803 405.051C211.934 401.584 210.761 398.2 209.298 394.939C202.835 380.23 196.429 365.493 189.764 350.843C179.106 327.373 168.276 303.989 157.504 280.576C152.275 269.258 146.903 258.026 141.733 246.679C141.149 245.15 140.086 243.852 138.704 242.977C137.322 242.102 135.693 241.697 134.062 241.824C114.758 241.824 95.4533 241.824 76.1488 241.824C74.6972 241.85 73.2486 241.965 71.811 242.169Z' fill='#134858'/><path d='M47.6516 208.73C49.2603 208.931 50.1509 209.132 51.0701 209.161C63.7675 209.334 76.4935 209.535 89.2196 209.592C100.71 209.592 112.201 209.592 123.692 209.334C125.358 209.334 127.053 209.334 125.961 206.748C121.423 196.55 116.941 186.323 112.345 176.154C111.767 174.692 110.761 173.438 109.459 172.557C108.158 171.675 106.62 171.207 105.048 171.213C96.2002 171.213 87.381 171.213 78.5619 171.213C77.4956 171.256 76.4785 171.673 75.6892 172.391C73.4237 174.628 71.3032 177.008 69.3405 179.515C64.026 186.467 58.8264 193.534 53.5981 200.572C51.7021 203.215 49.8349 205.743 47.6516 208.73Z' fill='#134858'/><path d='M501.538 207.007C500.763 204.877 499.802 202.82 498.665 200.859C492.776 193.074 486.6 185.49 480.739 177.648C479.674 176.036 478.208 174.729 476.486 173.853C474.764 172.977 472.845 172.562 470.915 172.649C463.934 172.649 456.896 172.965 449.915 172.649C447.677 172.393 445.418 172.901 443.504 174.09C441.591 175.279 440.135 177.079 439.373 179.199C439.085 179.802 438.741 180.405 438.453 181.037C435.581 188.047 432.421 195.085 429.462 202.123C427.077 207.868 427.48 208.271 433.771 208.299C454.971 208.299 476.172 208.472 497.372 208.5C498.829 208.218 500.234 207.714 501.538 207.007Z' fill='#134858'/><path d='M105.134 135.591C106.571 133.581 108.007 131.512 109.472 129.559C117.832 118.642 126.162 107.669 134.637 96.8387C143.111 86.0086 151.873 75.0923 160.491 64.291C167.098 56.0463 173.849 47.9741 180.37 39.7007C181.629 37.9804 183.297 36.6012 185.223 35.6883C187.149 34.7754 189.273 34.3574 191.401 34.4724C242.248 34.6447 293.066 34.616 343.913 34.7022C350.922 34.7022 357.932 34.9895 364.941 34.9895C366.423 35.0138 367.878 35.3852 369.19 36.0736C370.502 36.7621 371.634 37.7485 372.496 38.9538C378.5 46.4228 384.274 54.0642 390.135 61.6481C393.812 66.4455 397.431 71.3004 401.166 76.0116C406.164 82.389 411.278 88.6802 416.248 95.0863C420.327 100.343 424.291 105.687 428.342 110.972L442.935 129.817C443.568 130.635 444.108 131.522 444.544 132.46C445.779 135.132 445.319 135.879 442.332 135.85C434.202 135.85 426.101 135.591 417.971 135.591C408.032 135.591 398.092 135.764 388.153 135.821C364.079 135.965 340.006 136.137 315.962 136.195C307.344 136.195 298.725 135.792 290.107 135.85C270.717 135.85 251.326 136.367 231.935 136.453C208.121 136.453 184.306 136.453 160.491 136.453C145.007 136.453 129.495 136.74 114.011 136.827C111.138 136.827 108.266 136.539 105.565 136.396L105.134 135.591Z' fill='#5AB997'/><mask id='mask0_12_2' style='mask-type:luminance' maskUnits='userSpaceOnUse' x='105' y='34' width='341' height='103'><path d='M105.134 135.591C106.571 133.581 108.007 131.512 109.472 129.559C117.832 118.642 126.162 107.669 134.637 96.8387C143.111 86.0086 151.873 75.0923 160.491 64.291C167.098 56.0463 173.849 47.9741 180.37 39.7007C181.629 37.9804 183.297 36.6012 185.223 35.6883C187.149 34.7754 189.273 34.3574 191.401 34.4724C242.248 34.6447 293.066 34.616 343.913 34.7022C350.922 34.7022 357.932 34.9895 364.941 34.9895C366.423 35.0138 367.878 35.3852 369.19 36.0736C370.502 36.7621 371.634 37.7485 372.496 38.9538C378.5 46.4228 384.274 54.0642 390.135 61.6481C393.812 66.4455 397.431 71.3004 401.166 76.0116C406.164 82.389 411.278 88.6802 416.248 95.0863C420.327 100.343 424.291 105.687 428.342 110.972L442.935 129.817C443.568 130.635 444.108 131.522 444.544 132.46C445.779 135.132 445.319 135.879 442.332 135.85C434.202 135.85 426.101 135.591 417.971 135.591C408.032 135.591 398.092 135.764 388.153 135.821C364.079 135.965 340.006 136.137 315.962 136.195C307.344 136.195 298.725 135.792 290.107 135.85C270.717 135.85 251.326 136.367 231.935 136.453C208.121 136.453 184.306 136.453 160.491 136.453C145.007 136.453 129.495 136.74 114.011 136.827C111.138 136.827 108.266 136.539 105.565 136.396L105.134 135.591Z' fill='white'/></mask><g mask='url(#mask0_12_2)'><path d='M278.76 142.716L377.811 31.5135L464.078 140.963L278.76 142.716Z' fill='#5AB997'/><path d='M278.99 144.583L378.012 33.3807L464.308 142.831L278.99 144.583Z' fill='#00997F'/><path d='M153.336 48.7826L185.964 79.1662C188.194 81.2431 189.508 84.1209 189.616 87.1665C189.725 90.2121 188.619 93.1761 186.542 95.4063L138.187 147.334C136.11 149.564 133.232 150.878 130.187 150.986C127.141 151.095 124.177 149.989 121.947 147.912L97.77 125.399C95.5397 123.322 94.2258 120.444 94.1173 117.398C94.0088 114.353 95.1146 111.389 97.1915 109.158L153.378 48.8217L153.336 48.7826Z' fill='white'/><path d='M180.284 39.1836L199.33 63.3717C200.201 64.5099 201.316 65.4385 202.593 66.0893C203.87 66.74 205.277 67.0964 206.71 67.1322C208.143 67.168 209.565 66.8824 210.873 66.2963C212.181 65.7101 213.341 64.8384 214.268 63.7452L243.685 29.9335C250.033 22.6368 243.685 11.1461 234.521 12.9846L186.058 22.6081C184.35 23.0021 182.769 23.8227 181.464 24.9933C180.159 26.1639 179.172 27.6462 178.595 29.3018C178.019 30.9574 177.871 32.7322 178.166 34.4603C178.462 36.1885 179.19 37.8135 180.284 39.1836Z' fill='white'/></g><path d='M258.048 423.608C257.228 422.355 256.489 421.05 255.836 419.701C252.561 411.801 249.487 403.815 246.126 395.944C241.587 385.286 236.848 374.744 232.165 364.143C227.032 352.423 221.871 340.712 216.681 329.01C209.27 312.234 201.887 295.448 194.533 278.652C190.827 270.034 187.437 261.416 183.703 253.085C180.342 245.501 176.607 238.089 173.217 230.505C168.075 219.015 163.134 207.351 158.049 195.774C155.177 189.512 152.304 183.336 149.747 177.044C148.225 173.396 149.747 171.012 153.884 170.753C156.757 170.552 159.629 170.523 162.502 170.552C188.05 170.667 213.598 170.801 239.146 170.954C243.483 170.954 247.764 170.954 252.13 171.328C257.359 171.644 259.226 173.655 259.226 178.854C259.226 230.371 259.226 281.898 259.226 333.434C259.226 353.543 259.427 373.968 259.456 394.22C259.456 402.839 259.255 411.457 259.14 420.075C259.14 421.109 259.14 422.114 258.939 423.12L258.048 423.608Z' fill='#51B796'/><mask id='mask1_12_2' style='mask-type:luminance' maskUnits='userSpaceOnUse' x='149' y='170' width='111' height='254'><path d='M258.048 423.608C257.228 422.355 256.489 421.05 255.836 419.701C252.561 411.801 249.487 403.815 246.126 395.944C241.587 385.286 236.848 374.744 232.165 364.143C227.032 352.423 221.871 340.712 216.681 329.01C209.27 312.234 201.887 295.448 194.533 278.652C190.827 270.034 187.437 261.416 183.703 253.085C180.342 245.501 176.607 238.089 173.217 230.505C168.075 219.015 163.134 207.351 158.049 195.774C155.177 189.512 152.304 183.336 149.747 177.044C148.225 173.396 149.747 171.012 153.884 170.753C156.757 170.552 159.629 170.523 162.502 170.552C188.05 170.667 213.598 170.801 239.146 170.954C243.483 170.954 247.764 170.954 252.13 171.328C257.359 171.644 259.226 173.655 259.226 178.854C259.226 230.371 259.226 281.898 259.226 333.434C259.226 353.543 259.427 373.968 259.456 394.22C259.456 402.839 259.255 411.457 259.14 420.075C259.14 421.109 259.14 422.114 258.939 423.12L258.048 423.608Z' fill='white'/></mask><g mask='url(#mask1_12_2)'><path d='M268.275 170.696H147.736V207.868H268.275V170.696Z' fill='white'/></g><path d='M294.1 419.902C294.1 418.351 293.899 416.8 293.899 415.249C293.899 400.454 294.388 385.66 294.359 370.837C294.359 321.733 294.196 272.638 293.871 223.553C293.871 208.386 293.67 193.246 293.526 178.107C293.526 173.166 295.135 171.357 300.219 171.357C323.086 171.357 345.953 171.357 368.819 171.357C378.931 171.357 389.072 171.586 399.212 171.73C399.723 171.759 400.231 171.817 400.735 171.902C402.803 172.19 403.608 173.08 402.746 175.235C399.385 182.675 396.081 190.086 392.806 197.556C381.603 223.142 370.418 248.757 359.253 274.4C350.635 294.078 342.017 313.727 333.399 333.405C327.28 347.424 321.334 361.529 315.129 375.519C310.446 386.119 305.419 396.547 300.765 407.119C299.128 410.739 297.691 414.473 296.14 418.121C295.853 418.782 295.479 419.414 295.163 420.046L294.1 419.902Z' fill='#00987D'/><path d='M71.0642 241.307C72.4704 241.059 73.8901 240.896 75.3158 240.818C94.6203 240.818 113.954 240.818 133.258 240.818C134.895 240.68 136.532 241.082 137.918 241.965C139.304 242.847 140.361 244.16 140.928 245.702C146.128 257.193 151.471 268.454 156.699 279.887C167.501 303.501 178.331 327.085 188.988 350.757C195.653 365.522 202.059 380.374 208.523 395.226C209.987 398.529 211.169 401.95 212.056 405.453L70.6333 242.255L71.0642 241.307Z' fill='white'/><path d='M480.797 241.623C479.381 241.375 477.952 241.212 476.517 241.134C457.212 241.134 437.908 241.134 418.603 241.134C416.963 241.003 415.326 241.411 413.941 242.299C412.555 243.186 411.499 244.502 410.933 246.047C405.733 257.537 400.361 268.798 395.133 280.203C384.332 303.817 373.569 327.449 362.844 351.101C356.208 365.867 349.802 380.719 343.31 395.571C341.872 398.871 340.7 402.282 339.805 405.769L481.228 242.485L480.797 241.623Z' fill='#138171'/><path d='M47.5366 208.271C49.7199 205.398 51.5297 202.698 53.282 200.17C58.5103 193.074 63.7099 185.979 69.0531 178.94C71.0045 176.414 73.1154 174.015 75.3731 171.759C76.1661 171.042 77.1791 170.617 78.2458 170.552C87.065 170.552 95.8841 170.38 104.703 170.552C106.285 170.538 107.833 171.007 109.141 171.895C110.45 172.782 111.457 174.048 112.029 175.522C116.654 185.777 121.106 196.09 125.645 206.375C126.737 208.874 125.042 208.96 123.376 208.989C111.885 208.989 100.394 209.276 88.9035 209.247C76.1774 209.247 63.4801 208.989 50.754 208.816C50.0359 208.673 49.1453 208.472 47.5366 208.271Z' fill='white'/><path d='M501.653 206.547C500.299 207.201 498.857 207.655 497.373 207.897C476.172 207.897 454.943 207.754 433.742 207.696C427.451 207.696 427.02 207.208 429.433 201.462C432.306 194.367 435.408 187.3 438.425 180.204C438.712 179.572 439.057 178.969 439.344 178.366C440.092 176.232 441.542 174.416 443.458 173.215C445.374 172.015 447.641 171.501 449.887 171.759C456.868 172.19 463.906 171.96 470.915 171.759C472.85 171.678 474.774 172.101 476.496 172.987C478.218 173.874 479.681 175.193 480.74 176.815C486.485 184.715 492.776 192.356 498.665 200.198C499.852 202.219 500.853 204.344 501.653 206.547Z' fill='#029A7F'/></svg>";

    constructor() ERC721(){
        _mint(msg.sender, ++NEXT_TOKEN_ID);
    }

    function name() public view virtual override returns (string memory) {
        return "Emerald";
    }

    function symbol() public view virtual override returns (string memory) {
        return "EMRLD";
    }

    function tokenURI(uint256 id) public view virtual override returns (string memory) {
        return constructTokenURI();
    }

    function mint(address to) public {
        _mint(to, ++NEXT_TOKEN_ID);
    }

    function constructTokenURI() internal view virtual returns (string memory uri) {
    return
      string(
        abi.encodePacked(
          "data:application/json;base64,",
          Base64.encode(
            bytes(
              string.concat(
                '{"name":',
                '"',
                "Emerald",
                '",',
                '"description":',
                '"',
                "A beautiful emerald.",
                '",',
                '"image":',
                '"',
                encodeSvgToDataURI(),
                '"',
                "}"
              )
            ),
            false,
            false
          )
        )
      );
  }

  function encodeSvgToDataURI() internal view returns (string memory) {
    return string(abi.encodePacked("data:image/svg+xml;base64,", Base64.encode(bytes(IMAGE), false, false)));
  }

}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Library to encode strings in Base64.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Base64.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Base64.sol)
/// @author Modified from (https://github.com/Brechtpd/base64/blob/main/base64.sol) by Brecht Devos - <[email protected]>.
library Base64 {
    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// See: https://datatracker.ietf.org/doc/html/rfc4648
    /// @param fileSafe  Whether to replace '+' with '-' and '/' with '_'.
    /// @param noPadding Whether to strip away the padding.
    function encode(bytes memory data, bool fileSafe, bool noPadding)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                // Multiply by 4/3 rounded up.
                // The `shl(2, ...)` is equivalent to multiplying by 4.
                let encodedLength := shl(2, div(add(dataLength, 2), 3))

                // Set `result` to point to the start of the free memory.
                result := mload(0x40)

                // Store the table into the scratch space.
                // Offsetted by -1 byte so that the `mload` will load the character.
                // We will rewrite the free memory pointer at `0x40` later with
                // the allocated size.
                // The magic constant 0x0670 will turn "-_" into "+/".
                mstore(0x1f, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef")
                mstore(0x3f, xor("ghijklmnopqrstuvwxyz0123456789-_", mul(iszero(fileSafe), 0x0670)))

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, encodedLength)

                // Run over the input, 3 bytes at a time.
                for {} 1 {} {
                    data := add(data, 3) // Advance 3 bytes.
                    let input := mload(data)

                    // Write 4 bytes. Optimized for fewer stack operations.
                    mstore8(0, mload(and(shr(18, input), 0x3F)))
                    mstore8(1, mload(and(shr(12, input), 0x3F)))
                    mstore8(2, mload(and(shr(6, input), 0x3F)))
                    mstore8(3, mload(and(input, 0x3F)))
                    mstore(ptr, mload(0x00))

                    ptr := add(ptr, 4) // Advance 4 bytes.
                    if iszero(lt(ptr, end)) { break }
                }
                mstore(0x40, add(end, 0x20)) // Allocate the memory.
                // Equivalent to `o = [0, 2, 1][dataLength % 3]`.
                let o := div(2, mod(dataLength, 3))
                // Offset `ptr` and pad with '='. We can simply write over the end.
                mstore(sub(ptr, o), shl(240, 0x3d3d))
                // Set `o` to zero if there is padding.
                o := mul(iszero(iszero(noPadding)), o)
                mstore(sub(ptr, o), 0) // Zeroize the slot after the string.
                mstore(result, sub(encodedLength, o)) // Store the length.
            }
        }
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, false, false)`.
    function encode(bytes memory data) internal pure returns (string memory result) {
        result = encode(data, false, false);
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, fileSafe, false)`.
    function encode(bytes memory data, bool fileSafe)
        internal
        pure
        returns (string memory result)
    {
        result = encode(data, fileSafe, false);
    }

    /// @dev Decodes base64 encoded `data`.
    ///
    /// Supports:
    /// - RFC 4648 (both standard and file-safe mode).
    /// - RFC 3501 (63: ',').
    ///
    /// Does not support:
    /// - Line breaks.
    ///
    /// Note: For performance reasons,
    /// this function will NOT revert on invalid `data` inputs.
    /// Outputs for invalid inputs will simply be undefined behaviour.
    /// It is the user's responsibility to ensure that the `data`
    /// is a valid base64 encoded string.
    function decode(string memory data) internal pure returns (bytes memory result) {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                let decodedLength := mul(shr(2, dataLength), 3)

                for {} 1 {} {
                    // If padded.
                    if iszero(and(dataLength, 3)) {
                        let t := xor(mload(add(data, dataLength)), 0x3d3d)
                        // forgefmt: disable-next-item
                        decodedLength := sub(
                            decodedLength,
                            add(iszero(byte(30, t)), iszero(byte(31, t)))
                        )
                        break
                    }
                    // If non-padded.
                    decodedLength := add(decodedLength, sub(and(dataLength, 3), 1))
                    break
                }
                result := mload(0x40)

                // Write the length of the bytes.
                mstore(result, decodedLength)

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, decodedLength)

                // Load the table into the scratch space.
                // Constants are optimized for smaller bytecode with zero gas overhead.
                // `m` also doubles as the mask of the upper 6 bits.
                let m := 0xfc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc
                mstore(0x5b, m)
                mstore(0x3b, 0x04080c1014181c2024282c3034383c4044484c5054585c6064)
                mstore(0x1a, 0xf8fcf800fcd0d4d8dce0e4e8ecf0f4)

                for {} 1 {} {
                    // Read 4 bytes.
                    data := add(data, 4)
                    let input := mload(data)

                    // Write 3 bytes.
                    // forgefmt: disable-next-item
                    mstore(ptr, or(
                        and(m, mload(byte(28, input))),
                        shr(6, or(
                            and(m, mload(byte(29, input))),
                            shr(6, or(
                                and(m, mload(byte(30, input))),
                                shr(6, mload(byte(31, input)))
                            ))
                        ))
                    ))
                    ptr := add(ptr, 3)
                    if iszero(lt(ptr, end)) { break }
                }
                mstore(0x40, add(end, 0x20)) // Allocate the memory.
                mstore(end, 0) // Zeroize the slot after the bytes.
                mstore(0x60, 0) // Restore the zero slot.
            }
        }
    }
}

File 3 of 3 : ERC721.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Simple ERC721 implementation with storage hitchhiking.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC721.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol)
///
/// @dev Note:
/// - The ERC721 standard allows for self-approvals.
///   For performance, this implementation WILL NOT revert for such actions.
///   Please add any checks with overrides if desired.
/// - For performance, methods are made payable where permitted by the ERC721 standard.
/// - The `safeTransfer` functions use the identity precompile (0x4)
///   to copy memory internally.
///
/// If you are overriding:
/// - NEVER violate the ERC721 invariant:
///   the balance of an owner MUST always be equal to their number of ownership slots.
///   The transfer functions do not have an underflow guard for user token balances.
/// - Make sure all variables written to storage are properly cleaned
//    (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).
/// - Check that the overridden function is actually used in the function you want to
///   change the behavior of. Much of the code has been manually inlined for performance.
abstract contract ERC721 {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev An account can hold up to 4294967295 tokens.
    uint256 internal constant _MAX_ACCOUNT_BALANCE = 0xffffffff;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Only the token owner or an approved account can manage the token.
    error NotOwnerNorApproved();

    /// @dev The token does not exist.
    error TokenDoesNotExist();

    /// @dev The token already exists.
    error TokenAlreadyExists();

    /// @dev Cannot query the balance for the zero address.
    error BalanceQueryForZeroAddress();

    /// @dev Cannot mint or transfer to the zero address.
    error TransferToZeroAddress();

    /// @dev The token must be owned by `from`.
    error TransferFromIncorrectOwner();

    /// @dev The recipient's balance has overflowed.
    error AccountBalanceOverflow();

    /// @dev Cannot safely transfer to a contract that does not implement
    /// the ERC721Receiver interface.
    error TransferToNonERC721ReceiverImplementer();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Emitted when token `id` is transferred from `from` to `to`.
    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    /// @dev Emitted when `owner` enables `account` to manage the `id` token.
    event Approval(address indexed owner, address indexed account, uint256 indexed id);

    /// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.
    event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);

    /// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`.
    uint256 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    /// @dev `keccak256(bytes("Approval(address,address,uint256)"))`.
    uint256 private constant _APPROVAL_EVENT_SIGNATURE =
        0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;

    /// @dev `keccak256(bytes("ApprovalForAll(address,address,bool)"))`.
    uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =
        0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ownership data slot of `id` is given by:
    /// ```
    ///     mstore(0x00, id)
    ///     mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
    ///     let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
    /// ```
    /// Bits Layout:
    /// - [0..159]   `addr`
    /// - [160..255] `extraData`
    ///
    /// The approved address slot is given by: `add(1, ownershipSlot)`.
    ///
    /// See: https://notes.ethereum.org/%40vbuterin/verkle_tree_eip
    ///
    /// The balance slot of `owner` is given by:
    /// ```
    ///     mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let balanceSlot := keccak256(0x0c, 0x1c)
    /// ```
    /// Bits Layout:
    /// - [0..31]   `balance`
    /// - [32..255] `aux`
    ///
    /// The `operator` approval slot of `owner` is given by:
    /// ```
    ///     mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, operator))
    ///     mstore(0x00, owner)
    ///     let operatorApprovalSlot := keccak256(0x0c, 0x30)
    /// ```
    uint256 private constant _ERC721_MASTER_SLOT_SEED = 0x7d8825530a5a2e7a << 192;

    /// @dev Pre-shifted and pre-masked constant.
    uint256 private constant _ERC721_MASTER_SLOT_SEED_MASKED = 0x0a5a2e7a00000000;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      ERC721 METADATA                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the token collection name.
    function name() public view virtual returns (string memory);

    /// @dev Returns the token collection symbol.
    function symbol() public view virtual returns (string memory);

    /// @dev Returns the Uniform Resource Identifier (URI) for token `id`.
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           ERC721                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the owner of token `id`.
    ///
    /// Requirements:
    /// - Token `id` must exist.
    function ownerOf(uint256 id) public view virtual returns (address result) {
        result = _ownerOf(id);
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(result) {
                mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Returns the number of tokens owned by `owner`.
    ///
    /// Requirements:
    /// - `owner` must not be the zero address.
    function balanceOf(address owner) public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            // Revert if the `owner` is the zero address.
            if iszero(owner) {
                mstore(0x00, 0x8f4eb604) // `BalanceQueryForZeroAddress()`.
                revert(0x1c, 0x04)
            }
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            mstore(0x00, owner)
            result := and(sload(keccak256(0x0c, 0x1c)), _MAX_ACCOUNT_BALANCE)
        }
    }

    /// @dev Returns the account approved to manage token `id`.
    ///
    /// Requirements:
    /// - Token `id` must exist.
    function getApproved(uint256 id) public view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, id)
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
            if iszero(shl(96, sload(ownershipSlot))) {
                mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
                revert(0x1c, 0x04)
            }
            result := sload(add(1, ownershipSlot))
        }
    }

    /// @dev Sets `account` as the approved account to manage token `id`.
    ///
    /// Requirements:
    /// - Token `id` must exist.
    /// - The caller must be the owner of the token,
    ///   or an approved operator for the token owner.
    ///
    /// Emits an {Approval} event.
    function approve(address account, uint256 id) public payable virtual {
        _approve(msg.sender, account, id);
    }

    /// @dev Returns whether `operator` is approved to manage the tokens of `owner`.
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        returns (bool result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x1c, operator)
            mstore(0x08, _ERC721_MASTER_SLOT_SEED_MASKED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x30))
        }
    }

    /// @dev Sets whether `operator` is approved to manage the tokens of the caller.
    ///
    /// Emits an {ApprovalForAll} event.
    function setApprovalForAll(address operator, bool isApproved) public virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Convert to 0 or 1.
            isApproved := iszero(iszero(isApproved))
            // Update the `isApproved` for (`msg.sender`, `operator`).
            mstore(0x1c, operator)
            mstore(0x08, _ERC721_MASTER_SLOT_SEED_MASKED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x30), isApproved)
            // Emit the {ApprovalForAll} event.
            mstore(0x00, isApproved)
            // forgefmt: disable-next-item
            log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))
        }
    }

    /// @dev Transfers token `id` from `from` to `to`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must exist.
    /// - `from` must be the owner of the token.
    /// - `to` cannot be the zero address.
    /// - The caller must be the owner of the token, or be approved to manage the token.
    ///
    /// Emits a {Transfer} event.
    function transferFrom(address from, address to, uint256 id) public payable virtual {
        _beforeTokenTransfer(from, to, id);
        /// @solidity memory-safe-assembly
        assembly {
            // Clear the upper 96 bits.
            let bitmaskAddress := shr(96, not(0))
            from := and(bitmaskAddress, from)
            to := and(bitmaskAddress, to)
            // Load the ownership data.
            mstore(0x00, id)
            mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, caller()))
            let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
            let ownershipPacked := sload(ownershipSlot)
            let owner := and(bitmaskAddress, ownershipPacked)
            // Revert if the token does not exist, or if `from` is not the owner.
            if iszero(mul(owner, eq(owner, from))) {
                // `TokenDoesNotExist()`, `TransferFromIncorrectOwner()`.
                mstore(shl(2, iszero(owner)), 0xceea21b6a1148100)
                revert(0x1c, 0x04)
            }
            // Load, check, and update the token approval.
            {
                mstore(0x00, from)
                let approvedAddress := sload(add(1, ownershipSlot))
                // Revert if the caller is not the owner, nor approved.
                if iszero(or(eq(caller(), from), eq(caller(), approvedAddress))) {
                    if iszero(sload(keccak256(0x0c, 0x30))) {
                        mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
                        revert(0x1c, 0x04)
                    }
                }
                // Delete the approved address if any.
                if approvedAddress { sstore(add(1, ownershipSlot), 0) }
            }
            // Update with the new owner.
            sstore(ownershipSlot, xor(ownershipPacked, xor(from, to)))
            // Decrement the balance of `from`.
            {
                let fromBalanceSlot := keccak256(0x0c, 0x1c)
                sstore(fromBalanceSlot, sub(sload(fromBalanceSlot), 1))
            }
            // Increment the balance of `to`.
            {
                mstore(0x00, to)
                let toBalanceSlot := keccak256(0x0c, 0x1c)
                let toBalanceSlotPacked := add(sload(toBalanceSlot), 1)
                // Revert if `to` is the zero address, or if the account balance overflows.
                if iszero(mul(to, and(toBalanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
                    // `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
                    mstore(shl(2, iszero(to)), 0xea553b3401336cea)
                    revert(0x1c, 0x04)
                }
                sstore(toBalanceSlot, toBalanceSlotPacked)
            }
            // Emit the {Transfer} event.
            log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, from, to, id)
        }
        _afterTokenTransfer(from, to, id);
    }

    /// @dev Equivalent to `safeTransferFrom(from, to, id, "")`.
    function safeTransferFrom(address from, address to, uint256 id) public payable virtual {
        transferFrom(from, to, id);
        if (_hasCode(to)) _checkOnERC721Received(from, to, id, "");
    }

    /// @dev Transfers token `id` from `from` to `to`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must exist.
    /// - `from` must be the owner of the token.
    /// - `to` cannot be the zero address.
    /// - The caller must be the owner of the token, or be approved to manage the token.
    /// - 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 id, bytes calldata data)
        public
        payable
        virtual
    {
        transferFrom(from, to, id);
        if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
    }

    /// @dev Returns true if this contract implements the interface defined by `interfaceId`.
    /// See: https://eips.ethereum.org/EIPS/eip-165
    /// This function call must use less than 30000 gas.
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {
        /// @solidity memory-safe-assembly
        assembly {
            let s := shr(224, interfaceId)
            // ERC165: 0x01ffc9a7, ERC721: 0x80ac58cd, ERC721Metadata: 0x5b5e139f.
            result := or(or(eq(s, 0x01ffc9a7), eq(s, 0x80ac58cd)), eq(s, 0x5b5e139f))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL QUERY FUNCTIONS                  */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns if token `id` exists.
    function _exists(uint256 id) internal view virtual returns (bool result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, id)
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            result := iszero(iszero(shl(96, sload(add(id, add(id, keccak256(0x00, 0x20)))))))
        }
    }

    /// @dev Returns the owner of token `id`.
    /// Returns the zero address instead of reverting if the token does not exist.
    function _ownerOf(uint256 id) internal view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, id)
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            result := shr(96, shl(96, sload(add(id, add(id, keccak256(0x00, 0x20))))))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*            INTERNAL DATA HITCHHIKING FUNCTIONS             */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // For performance, no events are emitted for the hitchhiking setters.
    // Please emit your own events if required.

    /// @dev Returns the auxiliary data for `owner`.
    /// Minting, transferring, burning the tokens of `owner` will not change the auxiliary data.
    /// Auxiliary data can be set for any address, even if it does not have any tokens.
    function _getAux(address owner) internal view virtual returns (uint224 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            mstore(0x00, owner)
            result := shr(32, sload(keccak256(0x0c, 0x1c)))
        }
    }

    /// @dev Set the auxiliary data for `owner` to `value`.
    /// Minting, transferring, burning the tokens of `owner` will not change the auxiliary data.
    /// Auxiliary data can be set for any address, even if it does not have any tokens.
    function _setAux(address owner, uint224 value) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            mstore(0x00, owner)
            let balanceSlot := keccak256(0x0c, 0x1c)
            let packed := sload(balanceSlot)
            sstore(balanceSlot, xor(packed, shl(32, xor(value, shr(32, packed)))))
        }
    }

    /// @dev Returns the extra data for token `id`.
    /// Minting, transferring, burning a token will not change the extra data.
    /// The extra data can be set on a non-existent token.
    function _getExtraData(uint256 id) internal view virtual returns (uint96 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, id)
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            result := shr(160, sload(add(id, add(id, keccak256(0x00, 0x20)))))
        }
    }

    /// @dev Sets the extra data for token `id` to `value`.
    /// Minting, transferring, burning a token will not change the extra data.
    /// The extra data can be set on a non-existent token.
    function _setExtraData(uint256 id, uint96 value) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, id)
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
            let packed := sload(ownershipSlot)
            sstore(ownershipSlot, xor(packed, shl(160, xor(value, shr(160, packed)))))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL MINT FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Mints token `id` to `to`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must not exist.
    /// - `to` cannot be the zero address.
    ///
    /// Emits a {Transfer} event.
    function _mint(address to, uint256 id) internal virtual {
        _beforeTokenTransfer(address(0), to, id);
        /// @solidity memory-safe-assembly
        assembly {
            // Clear the upper 96 bits.
            to := shr(96, shl(96, to))
            // Load the ownership data.
            mstore(0x00, id)
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
            let ownershipPacked := sload(ownershipSlot)
            // Revert if the token already exists.
            if shl(96, ownershipPacked) {
                mstore(0x00, 0xc991cbb1) // `TokenAlreadyExists()`.
                revert(0x1c, 0x04)
            }
            // Update with the owner.
            sstore(ownershipSlot, or(ownershipPacked, to))
            // Increment the balance of the owner.
            {
                mstore(0x00, to)
                let balanceSlot := keccak256(0x0c, 0x1c)
                let balanceSlotPacked := add(sload(balanceSlot), 1)
                // Revert if `to` is the zero address, or if the account balance overflows.
                if iszero(mul(to, and(balanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
                    // `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
                    mstore(shl(2, iszero(to)), 0xea553b3401336cea)
                    revert(0x1c, 0x04)
                }
                sstore(balanceSlot, balanceSlotPacked)
            }
            // Emit the {Transfer} event.
            log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, 0, to, id)
        }
        _afterTokenTransfer(address(0), to, id);
    }

    /// @dev Mints token `id` to `to`, and updates the extra data for token `id` to `value`.
    /// Does NOT check if token `id` already exists (assumes `id` is auto-incrementing).
    ///
    /// Requirements:
    ///
    /// - `to` cannot be the zero address.
    ///
    /// Emits a {Transfer} event.
    function _mintAndSetExtraDataUnchecked(address to, uint256 id, uint96 value) internal virtual {
        _beforeTokenTransfer(address(0), to, id);
        /// @solidity memory-safe-assembly
        assembly {
            // Clear the upper 96 bits.
            to := shr(96, shl(96, to))
            // Update with the owner and extra data.
            mstore(0x00, id)
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            sstore(add(id, add(id, keccak256(0x00, 0x20))), or(shl(160, value), to))
            // Increment the balance of the owner.
            {
                mstore(0x00, to)
                let balanceSlot := keccak256(0x0c, 0x1c)
                let balanceSlotPacked := add(sload(balanceSlot), 1)
                // Revert if `to` is the zero address, or if the account balance overflows.
                if iszero(mul(to, and(balanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
                    // `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
                    mstore(shl(2, iszero(to)), 0xea553b3401336cea)
                    revert(0x1c, 0x04)
                }
                sstore(balanceSlot, balanceSlotPacked)
            }
            // Emit the {Transfer} event.
            log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, 0, to, id)
        }
        _afterTokenTransfer(address(0), to, id);
    }

    /// @dev Equivalent to `_safeMint(to, id, "")`.
    function _safeMint(address to, uint256 id) internal virtual {
        _safeMint(to, id, "");
    }

    /// @dev Mints token `id` to `to`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must not exist.
    /// - `to` cannot be the zero address.
    /// - 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 id, bytes memory data) internal virtual {
        _mint(to, id);
        if (_hasCode(to)) _checkOnERC721Received(address(0), to, id, data);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL BURN FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Equivalent to `_burn(address(0), id)`.
    function _burn(uint256 id) internal virtual {
        _burn(address(0), id);
    }

    /// @dev Destroys token `id`, using `by`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must exist.
    /// - If `by` is not the zero address,
    ///   it must be the owner of the token, or be approved to manage the token.
    ///
    /// Emits a {Transfer} event.
    function _burn(address by, uint256 id) internal virtual {
        address owner = ownerOf(id);
        _beforeTokenTransfer(owner, address(0), id);
        /// @solidity memory-safe-assembly
        assembly {
            // Clear the upper 96 bits.
            by := shr(96, shl(96, by))
            // Load the ownership data.
            mstore(0x00, id)
            mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, by))
            let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
            let ownershipPacked := sload(ownershipSlot)
            // Reload the owner in case it is changed in `_beforeTokenTransfer`.
            owner := shr(96, shl(96, ownershipPacked))
            // Revert if the token does not exist.
            if iszero(owner) {
                mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
                revert(0x1c, 0x04)
            }
            // Load and check the token approval.
            {
                mstore(0x00, owner)
                let approvedAddress := sload(add(1, ownershipSlot))
                // If `by` is not the zero address, do the authorization check.
                // Revert if the `by` is not the owner, nor approved.
                if iszero(or(iszero(by), or(eq(by, owner), eq(by, approvedAddress)))) {
                    if iszero(sload(keccak256(0x0c, 0x30))) {
                        mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
                        revert(0x1c, 0x04)
                    }
                }
                // Delete the approved address if any.
                if approvedAddress { sstore(add(1, ownershipSlot), 0) }
            }
            // Clear the owner.
            sstore(ownershipSlot, xor(ownershipPacked, owner))
            // Decrement the balance of `owner`.
            {
                let balanceSlot := keccak256(0x0c, 0x1c)
                sstore(balanceSlot, sub(sload(balanceSlot), 1))
            }
            // Emit the {Transfer} event.
            log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, owner, 0, id)
        }
        _afterTokenTransfer(owner, address(0), id);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL APPROVAL FUNCTIONS                 */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns whether `account` is the owner of token `id`, or is approved to manage it.
    ///
    /// Requirements:
    /// - Token `id` must exist.
    function _isApprovedOrOwner(address account, uint256 id)
        internal
        view
        virtual
        returns (bool result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            result := 1
            // Clear the upper 96 bits.
            account := shr(96, shl(96, account))
            // Load the ownership data.
            mstore(0x00, id)
            mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, account))
            let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
            let owner := shr(96, shl(96, sload(ownershipSlot)))
            // Revert if the token does not exist.
            if iszero(owner) {
                mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
                revert(0x1c, 0x04)
            }
            // Check if `account` is the `owner`.
            if iszero(eq(account, owner)) {
                mstore(0x00, owner)
                // Check if `account` is approved to manage the token.
                if iszero(sload(keccak256(0x0c, 0x30))) {
                    result := eq(account, sload(add(1, ownershipSlot)))
                }
            }
        }
    }

    /// @dev Returns the account approved to manage token `id`.
    /// Returns the zero address instead of reverting if the token does not exist.
    function _getApproved(uint256 id) internal view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, id)
            mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
            result := sload(add(1, add(id, add(id, keccak256(0x00, 0x20)))))
        }
    }

    /// @dev Equivalent to `_approve(address(0), account, id)`.
    function _approve(address account, uint256 id) internal virtual {
        _approve(address(0), account, id);
    }

    /// @dev Sets `account` as the approved account to manage token `id`, using `by`.
    ///
    /// Requirements:
    /// - Token `id` must exist.
    /// - If `by` is not the zero address, `by` must be the owner
    ///   or an approved operator for the token owner.
    ///
    /// Emits a {Transfer} event.
    function _approve(address by, address account, uint256 id) internal virtual {
        assembly {
            // Clear the upper 96 bits.
            let bitmaskAddress := shr(96, not(0))
            account := and(bitmaskAddress, account)
            by := and(bitmaskAddress, by)
            // Load the owner of the token.
            mstore(0x00, id)
            mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, by))
            let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
            let owner := and(bitmaskAddress, sload(ownershipSlot))
            // Revert if the token does not exist.
            if iszero(owner) {
                mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
                revert(0x1c, 0x04)
            }
            // If `by` is not the zero address, do the authorization check.
            // Revert if `by` is not the owner, nor approved.
            if iszero(or(iszero(by), eq(by, owner))) {
                mstore(0x00, owner)
                if iszero(sload(keccak256(0x0c, 0x30))) {
                    mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
                    revert(0x1c, 0x04)
                }
            }
            // Sets `account` as the approved account to manage `id`.
            sstore(add(1, ownershipSlot), account)
            // Emit the {Approval} event.
            log4(codesize(), 0x00, _APPROVAL_EVENT_SIGNATURE, owner, account, id)
        }
    }

    /// @dev Approve or remove the `operator` as an operator for `by`,
    /// without authorization checks.
    ///
    /// Emits an {ApprovalForAll} event.
    function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Clear the upper 96 bits.
            by := shr(96, shl(96, by))
            operator := shr(96, shl(96, operator))
            // Convert to 0 or 1.
            isApproved := iszero(iszero(isApproved))
            // Update the `isApproved` for (`by`, `operator`).
            mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, operator))
            mstore(0x00, by)
            sstore(keccak256(0x0c, 0x30), isApproved)
            // Emit the {ApprovalForAll} event.
            mstore(0x00, isApproved)
            log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, by, operator)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL TRANSFER FUNCTIONS                 */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Equivalent to `_transfer(address(0), from, to, id)`.
    function _transfer(address from, address to, uint256 id) internal virtual {
        _transfer(address(0), from, to, id);
    }

    /// @dev Transfers token `id` from `from` to `to`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must exist.
    /// - `from` must be the owner of the token.
    /// - `to` cannot be the zero address.
    /// - If `by` is not the zero address,
    ///   it must be the owner of the token, or be approved to manage the token.
    ///
    /// Emits a {Transfer} event.
    function _transfer(address by, address from, address to, uint256 id) internal virtual {
        _beforeTokenTransfer(from, to, id);
        /// @solidity memory-safe-assembly
        assembly {
            // Clear the upper 96 bits.
            let bitmaskAddress := shr(96, not(0))
            from := and(bitmaskAddress, from)
            to := and(bitmaskAddress, to)
            by := and(bitmaskAddress, by)
            // Load the ownership data.
            mstore(0x00, id)
            mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, by))
            let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
            let ownershipPacked := sload(ownershipSlot)
            let owner := and(bitmaskAddress, ownershipPacked)
            // Revert if the token does not exist, or if `from` is not the owner.
            if iszero(mul(owner, eq(owner, from))) {
                // `TokenDoesNotExist()`, `TransferFromIncorrectOwner()`.
                mstore(shl(2, iszero(owner)), 0xceea21b6a1148100)
                revert(0x1c, 0x04)
            }
            // Load, check, and update the token approval.
            {
                mstore(0x00, from)
                let approvedAddress := sload(add(1, ownershipSlot))
                // If `by` is not the zero address, do the authorization check.
                // Revert if the `by` is not the owner, nor approved.
                if iszero(or(iszero(by), or(eq(by, from), eq(by, approvedAddress)))) {
                    if iszero(sload(keccak256(0x0c, 0x30))) {
                        mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
                        revert(0x1c, 0x04)
                    }
                }
                // Delete the approved address if any.
                if approvedAddress { sstore(add(1, ownershipSlot), 0) }
            }
            // Update with the new owner.
            sstore(ownershipSlot, xor(ownershipPacked, xor(from, to)))
            // Decrement the balance of `from`.
            {
                let fromBalanceSlot := keccak256(0x0c, 0x1c)
                sstore(fromBalanceSlot, sub(sload(fromBalanceSlot), 1))
            }
            // Increment the balance of `to`.
            {
                mstore(0x00, to)
                let toBalanceSlot := keccak256(0x0c, 0x1c)
                let toBalanceSlotPacked := add(sload(toBalanceSlot), 1)
                // Revert if `to` is the zero address, or if the account balance overflows.
                if iszero(mul(to, and(toBalanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
                    // `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
                    mstore(shl(2, iszero(to)), 0xea553b3401336cea)
                    revert(0x1c, 0x04)
                }
                sstore(toBalanceSlot, toBalanceSlotPacked)
            }
            // Emit the {Transfer} event.
            log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, from, to, id)
        }
        _afterTokenTransfer(from, to, id);
    }

    /// @dev Equivalent to `_safeTransfer(from, to, id, "")`.
    function _safeTransfer(address from, address to, uint256 id) internal virtual {
        _safeTransfer(from, to, id, "");
    }

    /// @dev Transfers token `id` from `from` to `to`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must exist.
    /// - `from` must be the owner of the token.
    /// - `to` cannot be the zero address.
    /// - The caller must be the owner of the token, or be approved to manage the token.
    /// - 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 id, bytes memory data)
        internal
        virtual
    {
        _transfer(address(0), from, to, id);
        if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
    }

    /// @dev Equivalent to `_safeTransfer(by, from, to, id, "")`.
    function _safeTransfer(address by, address from, address to, uint256 id) internal virtual {
        _safeTransfer(by, from, to, id, "");
    }

    /// @dev Transfers token `id` from `from` to `to`.
    ///
    /// Requirements:
    ///
    /// - Token `id` must exist.
    /// - `from` must be the owner of the token.
    /// - `to` cannot be the zero address.
    /// - If `by` is not the zero address,
    ///   it must be the owner of the token, or be approved to manage the token.
    /// - 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 by, address from, address to, uint256 id, bytes memory data)
        internal
        virtual
    {
        _transfer(by, from, to, id);
        if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                    HOOKS FOR OVERRIDING                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Hook that is called before any token transfers, including minting and burning.
    function _beforeTokenTransfer(address from, address to, uint256 id) internal virtual {}

    /// @dev Hook that is called after any token transfers, including minting and burning.
    function _afterTokenTransfer(address from, address to, uint256 id) internal virtual {}

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      PRIVATE HELPERS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns if `a` has bytecode of non-zero length.
    function _hasCode(address a) private view returns (bool result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := extcodesize(a) // Can handle dirty upper bits.
        }
    }

    /// @dev Perform a call to invoke {IERC721Receiver-onERC721Received} on `to`.
    /// Reverts if the target does not support the function correctly.
    function _checkOnERC721Received(address from, address to, uint256 id, bytes memory data)
        private
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the calldata.
            let m := mload(0x40)
            let onERC721ReceivedSelector := 0x150b7a02
            mstore(m, onERC721ReceivedSelector)
            mstore(add(m, 0x20), caller()) // The `operator`, which is always `msg.sender`.
            mstore(add(m, 0x40), shr(96, shl(96, from)))
            mstore(add(m, 0x60), id)
            mstore(add(m, 0x80), 0x80)
            let n := mload(data)
            mstore(add(m, 0xa0), n)
            if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xc0), n)) }
            // Revert if the call reverts.
            if iszero(call(gas(), to, 0, add(m, 0x1c), add(n, 0xa4), m, 0x20)) {
                if returndatasize() {
                    // Bubble up the revert if the call reverts.
                    returndatacopy(m, 0x00, returndatasize())
                    revert(m, returndatasize())
                }
            }
            // Load the returndata and compare it.
            if iszero(eq(mload(m), shl(224, onERC721ReceivedSelector))) {
                mstore(0x00, 0xd1a57ed6) // `TransferToNonERC721ReceiverImplementer()`.
                revert(0x1c, 0x04)
            }
        }
    }
}

Settings
{
  "remappings": [
    "@prb/test/=lib/prb-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solady/=lib/solady/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "prb-test/=lib/prb-test/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccountBalanceOverflow","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"NotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TokenAlreadyExists","type":"error"},{"inputs":[],"name":"TokenDoesNotExist","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"isApproved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"IMAGE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NEXT_TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"result","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":"result","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"isApproved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"}]

600080556139606040526138b36080818152906200138560a039600190620000289082620001a9565b503480156200003657600080fd5b50620000573360008081546200004c9062000275565b91829055506200005d565b6200029d565b8160601b60601c915080600052673ec412a9852d173d60c11b601c5260206000208101810180548060601b156200009c5763c991cbb16000526004601cfd5b831790556000829052601c600c20805460010163ffffffff81168402620000d25767ea553b3401336cea841560021b526004601cfd5b9055808260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8138a45050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200013057607f821691505b6020821081036200015157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200010057600081815260208120601f850160051c81016020861015620001805750805b601f850160051c820191505b81811015620001a1578281556001016200018c565b505050505050565b81516001600160401b03811115620001c557620001c562000105565b620001dd81620001d684546200011b565b8462000157565b602080601f831160018114620002155760008415620001fc5750858301515b600019600386901b1c1916600185901b178555620001a1565b600085815260208120601f198616915b82811015620002465788860151825594840194600190910190840162000225565b5085821015620002655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000600182016200029657634e487b7160e01b600052601160045260246000fd5b5060010190565b6110d880620002ad6000396000f3fe6080604052600436106100f35760003560e01c80636352211e1161008a578063a22cb46511610059578063a22cb465146102fc578063b88d4fde1461031c578063c87b56dd1461032f578063e985e9c51461034f57600080fd5b80636352211e146102565780636a6278421461027657806370a082311461029657806395d89b41146102b657600080fd5b8063081812fc116100c6578063081812fc146101d6578063095ea7b31461021b57806323b872dd1461023057806342842e0e1461024357600080fd5b806301ffc9a7146100f85780630506eb401461014a5780630692a99d1461016c57806306fdde0314610190575b600080fd5b34801561010457600080fd5b50610135610113366004610b6f565b6301ffc9a760e09190911c9081146380ac58cd821417635b5e139f9091141790565b60405190151581526020015b60405180910390f35b34801561015657600080fd5b5061015f610385565b6040516101419190610bdc565b34801561017857600080fd5b5061018260005481565b604051908152602001610141565b34801561019c57600080fd5b5060408051808201909152600781527f456d6572616c6400000000000000000000000000000000000000000000000000602082015261015f565b3480156101e257600080fd5b506101f66101f1366004610c2d565b610413565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610141565b61022e610229366004610c6a565b610467565b005b61022e61023e366004610c94565b610476565b61022e610251366004610c94565b6105b7565b34801561026257600080fd5b506101f6610271366004610c2d565b6105e4565b34801561028257600080fd5b5061022e610291366004610cd0565b610644565b3480156102a257600080fd5b506101826102b1366004610cd0565b610663565b3480156102c257600080fd5b5060408051808201909152600581527f454d524c44000000000000000000000000000000000000000000000000000000602082015261015f565b34801561030857600080fd5b5061022e610317366004610ceb565b6106b3565b61022e61032a366004610d27565b610709565b34801561033b57600080fd5b5061015f61034a366004610c2d565b610764565b34801561035b57600080fd5b5061013561036a366004610dc2565b601c52670a5a2e7a000000006008526000526030600c205490565b6001805461039290610df5565b80601f01602080910402602001604051908101604052809291908181526020018280546103be90610df5565b801561040b5780601f106103e05761010080835404028352916020019161040b565b820191906000526020600020905b8154815290600101906020018083116103ee57829003601f168201915b505050505081565b6000816000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c52602060002082018201805460601b61045d5763ceea21b66000526004601cfd5b6001015492915050565b610472338383610774565b5050565b60008181527f7d8825530a5a2e7a0000000000000000000000000000000000000000000000003317601c526020902081018101805473ffffffffffffffffffffffffffffffffffffffff94851694938416938116919082861483026104ea5767ceea21b6a1148100831560021b526004601cfd5b856000528160010154925082331486331417610518576030600c205461051857634b6e7f186000526004601cfd5b821561052657600082600101555b85851818905550601c600c81812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055600084905220805460010163ffffffff811684026105875767ea553b3401336cea841560021b526004601cfd5b90558082847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a45b505050565b6105c2838383610476565b813b156105b2576105b28383836040518060200160405280600081525061082a565b60008181527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260209020810181015473ffffffffffffffffffffffffffffffffffffffff168061063f5763ceea21b66000526004601cfd5b919050565b61066081600080815461065690610e48565b91829055506108b6565b50565b60008161067857638f4eb6046000526004601cfd5b7f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c528160005263ffffffff601c600c2054169050919050565b801515905081601c52670a5a2e7a0000000060085233600052806030600c2055806000528160601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a35050565b610714858585610476565b833b1561075d5761075d85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061082a92505050565b5050505050565b606061076e61096c565b92915050565b60001960601c8281169250838116935081600052837f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c52602060002082018201805482169150816107d05763ceea21b66000526004601cfd5b8185148515176107f657816000526030600c20546107f657634b6e7f186000526004601cfd5b6001018390558183827f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600038a450505050565b60405163150b7a028082523360208301528560601b60601c604083015283606083015260808083015282518060a08401528015610871578060c08401826020870160045afa505b60208360a48301601c860160008a5af1610894573d15610894573d6000843e3d83fd5b508060e01b8251146108ae5763d1a57ed66000526004601cfd5b505050505050565b8160601b60601c9150806000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260206000208101810180548060601b156109095763c991cbb16000526004601cfd5b831790556000829052601c600c20805460010163ffffffff8116840261093e5767ea553b3401336cea841560021b526004601cfd5b9055808260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8138a45050565b60606109a06109796109c4565b6040516020016109899190610ec3565b604051602081830303815290604052600080610a6c565b6040516020016109b09190611041565b604051602081830303815290604052905090565b6060610a5c600180546109d690610df5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0290610df5565b8015610a4f5780601f10610a2457610100808354040283529160200191610a4f565b820191906000526020600020905b815481529060010190602001808311610a3257829003601f168201915b5050505050600080610a6c565b6040516020016109b09190611086565b606083518015610b67576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106708515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f52602083018181015b6003880197508751603f8160121c1651600053603f81600c1c1651600153603f8160061c1651600253603f811651600353506000518252600482019150808210610adc576020016040527f3d3d000000000000000000000000000000000000000000000000000000000000600384066002048083039190915260008615159091029182900352900382525b509392505050565b600060208284031215610b8157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bb157600080fd5b9392505050565b60005b83811015610bd3578181015183820152602001610bbb565b50506000910152565b6020815260008251806020840152610bfb816040850160208701610bb8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600060208284031215610c3f57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063f57600080fd5b60008060408385031215610c7d57600080fd5b610c8683610c46565b946020939093013593505050565b600080600060608486031215610ca957600080fd5b610cb284610c46565b9250610cc060208501610c46565b9150604084013590509250925092565b600060208284031215610ce257600080fd5b610bb182610c46565b60008060408385031215610cfe57600080fd5b610d0783610c46565b915060208301358015158114610d1c57600080fd5b809150509250929050565b600080600080600060808688031215610d3f57600080fd5b610d4886610c46565b9450610d5660208701610c46565b935060408601359250606086013567ffffffffffffffff80821115610d7a57600080fd5b818801915088601f830112610d8e57600080fd5b813581811115610d9d57600080fd5b896020828501011115610daf57600080fd5b9699959850939650602001949392505050565b60008060408385031215610dd557600080fd5b610dde83610c46565b9150610dec60208401610c46565b90509250929050565b600181811c90821680610e0957607f821691505b602082108103610e42577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ea0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60008151610eb9818560208601610bb8565b9290920192915050565b7f7b226e616d65223a00000000000000000000000000000000000000000000000081527f2200000000000000000000000000000000000000000000000000000000000000600882018190527f456d6572616c640000000000000000000000000000000000000000000000000060098301527f222c000000000000000000000000000000000000000000000000000000000000601083018190527f226465736372697074696f6e223a0000000000000000000000000000000000006012840152602083018290527f412062656175746966756c20656d6572616c642e000000000000000000000000602184015260358301527f22696d616765223a0000000000000000000000000000000000000000000000006037830152603f8201526000610fee6040830184610ea7565b7f220000000000000000000000000000000000000000000000000000000000000081527f7d0000000000000000000000000000000000000000000000000000000000000060018201526002019392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161107981601d850160208701610bb8565b91909101601d0192915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152600082516110be81601a850160208701610bb8565b91909101601a019291505056fea164736f6c6343000815000a3c7376672077696474683d2735353527206865696768743d27353236272076696577426f783d273020302035353520353236272066696c6c3d276e6f6e652720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e3c7061746820643d274d3237372e32333820322e3234303637483336362e323931433337302e34323820322e3234303637203337342e35393320322e3439393232203337382e373320322e3234303637433338302e39303420322e31363033203338332e30363520322e36303037203338352e30333420332e3532353137433338372e30303320342e3434393633203338382e37323220352e3833313336203339302e30343820372e3535353137433339352e3031382031332e35353931203339392e3730312031392e38353033203430342e3538342032352e39343034433430392e3436382033322e30333036203431342e3137392033372e36363131203431382e3934382034332e35373838433432382e38332035352e39383839203433382e3630372036382e33373032203434382e3237382038302e37323238433435352e32332038392e33343039203436322e3135332039382e323735203436392e313334203130362e393739433437362e313134203131352e363834203438322e353738203132332e353535203438392e323433203133312e383238433439382e383338203134332e363634203530382e333735203135352e353238203531372e3937203136372e333036433532322e393339203137332e333637203532382e303832203137392e323835203533332e3038203138352e333138433533382e383236203139322e313834203534342e353731203139392e303231203535302e333136203230352e393732433535352e333135203231322e313737203535352e303536203231342e353931203534392e373432203232302e333336433533392e373733203233312e343235203533302e303036203234322e363836203532302e303338203235332e373435433530372e333431203236372e383232203439342e343731203238312e363937203438312e383032203239352e383032433436392e373935203330392e313032203435372e393838203332322e353437203434362e303636203333362e3032433434312e303339203334312e373635203433352e383638203334372e323233203433302e383431203335322e383832433432322e323233203336322e353335203431332e373438203337322e323434203430352e323136203338312e393235433339392e323431203338382e373035203339332e323935203339352e353133203338372e323333203430322e323634433337362e3033203431342e3736203336342e3734203432372e3137203335332e353336203433392e363039433333362e383336203435382e323035203332302e313834203437362e383131203330332e3538203439352e343236433239372e343034203530322e333738203239312e333731203530392e343434203238352e313636203531362e333638433238332e313035203531382e353432203238302e393238203532302e363033203237382e363435203532322e353434433237382e333736203532322e383331203237382e303532203532332e3036203237372e363931203532332e323136433237372e3333203532332e333733203237362e393431203532332e343533203237362e353438203532332e343533433237362e313535203532332e343533203237352e373636203532332e333733203237352e343035203532332e323136433237352e303435203532332e3036203237342e3732203532322e383331203237342e343531203532322e353434433237322e3631203532302e393934203237302e383535203531392e333434203236392e313934203531372e363033433234392e393437203439362e313135203233302e373338203437342e353839203231312e353638203435332e303235433230322e313734203434322e343832203139322e383636203433312e383832203138332e343733203432312e343235433137312e393832203430382e363939203136302e363932203339362e3033203134392e333435203338332e333333433132392e363338203336312e323133203130392e393431203333392e3039332039302e32353336203331362e3937344337362e333231203330312e3233312036322e37303434203238352e3337342034382e37343331203236392e3534354333332e38393132203235322e3739372031382e38393537203233362e33363620342e3034333839203231392e38373643332e3132343633203231382e38343220322e3332303237203231372e37323220312e3435383436203231362e36353943302e363734303338203231352e37383220302e323132333533203231342e36363320302e313439363736203231332e34383843302e30383639393839203231322e33313320302e3432373038203231312e31353120312e3131333734203231302e31393543322e3830383633203230372e36333920342e3739303739203230352e32353420362e37313535203230322e38374c33312e35393331203137322e3336324333372e31363631203136352e3436372034322e37303038203135382e3537332034382e31393733203135312e3637384335332e31333833203134352e3533312035382e30323139203133392e3335352036322e39333432203133332e31354337302e31373334203132342e3031342037372e32393737203131342e3739332038342e36353138203130352e3638374338392e323736392039392e393431322039342e313630352039342e333936392039382e373835352038382e36353135433130352e3635312038302e30333334203131322e3337332037312e35353839203131392e32312036332e30353537433132352e3330312035352e33383536203133312e3530362034372e38333034203133372e3536372034302e30373431433134342e3534382033312e32353439203135312e3434322032322e33343936203135382e3339342031332e35303137433135392e38332031312e36363331203136312e32363720392e3931303738203136322e38373520382e3138373136433136342e33393720362e3334313836203136362e33313720342e3836353937203136382e34393220332e3837303734433137302e36363620322e3837353531203137332e30333820322e33383639203137352e34323920322e3434313736433139392e353620322e3434313736203232332e373120322e3434313736203234372e38373920322e3434313736483237372e32333856322e32343036375a272066696c6c3d2723303334363536272f3e3c7061746820643d274d3235382e303737203432322e3238374c3235382e393637203432312e393731433235382e393637203432302e393635203235392e3134203431392e3936203235392e3134203431382e393534433235392e323833203431302e333336203235392e343834203430312e373138203235392e343834203339332e31433235392e343834203337322e393931203235392e323535203335322e383832203235392e323236203333322e373733433235392e323236203238312e363738203235392e323236203233302e353932203235392e323236203137392e353135433235392e323236203137342e333733203235372e333539203137322e333632203235322e3133203137322e303436433234372e383231203137312e373837203234332e353132203137312e373031203233392e313734203137312e3637324c3136322e353539203137312e3237433135392e363837203137312e3237203135362e383134203137312e3237203135332e393431203137312e343731433134392e383931203137312e373539203134382e313936203137342e303836203134392e373736203137372e373035433135322e343139203138332e393638203135352e333439203139302e303836203135382e313037203139362e323932433136332e313633203230372e373832203136382e313034203231392e323733203137332e323436203233302e373634433137362e363634203233382e343334203138302e333939203234352e363733203138332e383436203235332e32433138372e353831203236312e353838203139302e393432203237302e313439203139342e363438203237382e353337433230312e393733203239352e313939203230392e343133203331312e383033203231362e373936203332382e343336433232312e393637203334302e303431203232372e313238203335312e363537203233322e3238203336332e323832433233362e393632203337332e373637203234312e373032203338342e323532203234362e323431203339342e383831433234392e363032203430322e363935203235322e363736203431302e363234203235352e393232203431382e343636433235362e353635203431392e373831203235372e323834203432312e303537203235382e303737203432322e3238375a272066696c6c3d2723313334383538272f3e3c7061746820643d274d3239342e31203431382e353532483239342e393632433239352e333237203431372e393431203239352e363533203431372e333038203239352e393339203431362e363536433239372e3439203431332e303038203239382e383132203430392e333331203330302e353933203430352e3734433330352e3339203339352e333132203331302e333839203338342e393432203331342e393536203337342e343536433332312e313631203336302e353831203332372e313038203334362e353931203333332e323236203333322e363837433334312e383435203331332e313533203335302e343633203239332e363736203335392e303831203237342e3137433337302e333631203234382e383731203338312e353834203232332e353533203339322e373439203139382e323136433339362e303234203139302e383234203339392e333237203138332e3436203430322e3636203137362e313235433430332e363336203137332e393731203430322e3636203137332e3038203430302e363737203137322e373933433430302e3136203137322e373933203339392e363433203137322e363439203339392e313236203137322e3632433338392e303134203137322e3632203337392e303137203137322e323736203336382e373632203137322e323736433334352e393134203137322e323736203332332e303637203137322e323736203330302e323139203137322e323736433239352e313334203137322e323736203239332e343937203137342e303836203239332e353236203137382e393639433239332e353236203139332e393933203239332e373834203230382e393839203239332e383432203232342e303133433239342e303333203237322e363936203239342e323036203332312e333738203239342e333539203337302e303631433239342e333539203338342e373431203239342e303433203339392e3432203239332e383939203431342e303731433239332e3837203431352e343738203239342e303433203431372e303031203239342e31203431382e3535325a272066696c6c3d2723313334383538272f3e3c7061746820643d274d37312e383131203234322e3136394c37312e33383031203234332e3131364c3231322e383033203430352e303531433231312e393334203430312e353834203231302e373631203339382e32203230392e323938203339342e393339433230322e383335203338302e3233203139362e343239203336352e343933203138392e373634203335302e383433433137392e313036203332372e333733203136382e323736203330332e393839203135372e353034203238302e353736433135322e323735203236392e323538203134362e393033203235382e303236203134312e373333203234362e363739433134312e313439203234352e3135203134302e303836203234332e383532203133382e373034203234322e393737433133372e333232203234322e313032203133352e363933203234312e363937203133342e303632203234312e383234433131342e373538203234312e3832342039352e34353333203234312e3832342037362e31343838203234312e3832344337342e36393732203234312e38352037332e32343836203234312e3936352037312e383131203234322e3136395a272066696c6c3d2723313334383538272f3e3c7061746820643d274d34372e36353136203230382e37334334392e32363033203230382e3933312035302e31353039203230392e3133322035312e30373031203230392e3136314336332e37363735203230392e3333342037362e34393335203230392e3533352038392e32313936203230392e353932433130302e3731203230392e353932203131322e323031203230392e353932203132332e363932203230392e333334433132352e333538203230392e333334203132372e303533203230392e333334203132352e393631203230362e373438433132312e343233203139362e3535203131362e393431203138362e333233203131322e333435203137362e313534433131312e373637203137342e363932203131302e373631203137332e343338203130392e343539203137322e353537433130382e313538203137312e363735203130362e3632203137312e323037203130352e303438203137312e3231334339362e32303032203137312e3231332038372e333831203137312e3231332037382e35363139203137312e3231334337372e34393536203137312e3235362037362e34373835203137312e3637332037352e36383932203137322e3339314337332e34323337203137342e3632382037312e33303332203137372e3030382036392e33343035203137392e3531354336342e303236203138362e3436372035382e38323634203139332e3533342035332e35393831203230302e3537324335312e37303231203230332e3231352034392e38333439203230352e3734332034372e36353136203230382e37335a272066696c6c3d2723313334383538272f3e3c7061746820643d274d3530312e353338203230372e303037433530302e373633203230342e383737203439392e383032203230322e3832203439382e363635203230302e383539433439322e373736203139332e303734203438362e36203138352e3439203438302e373339203137372e363438433437392e363734203137362e303336203437382e323038203137342e373239203437362e343836203137332e383533433437342e373634203137322e393737203437322e383435203137322e353632203437302e393135203137322e363439433436332e393334203137322e363439203435362e383936203137322e393635203434392e393135203137322e363439433434372e363737203137322e333933203434352e343138203137322e393031203434332e353034203137342e3039433434312e353931203137352e323739203434302e313335203137372e303739203433392e333733203137392e313939433433392e303835203137392e383032203433382e373431203138302e343035203433382e343533203138312e303337433433352e353831203138382e303437203433322e343231203139352e303835203432392e343632203230322e313233433432372e303737203230372e383638203432372e3438203230382e323731203433332e373731203230382e323939433435342e393731203230382e323939203437362e313732203230382e343732203439372e333732203230382e35433439382e383239203230382e323138203530302e323334203230372e373134203530312e353338203230372e3030375a272066696c6c3d2723313334383538272f3e3c7061746820643d274d3130352e313334203133352e353931433130362e353731203133332e353831203130382e303037203133312e353132203130392e343732203132392e353539433131372e383332203131382e363432203132362e313632203130372e363639203133342e3633372039362e38333837433134332e3131312038362e30303836203135312e3837332037352e30393233203136302e3439312036342e323931433136372e3039382035362e30343633203137332e3834392034372e39373431203138302e33372033392e37303037433138312e3632392033372e39383034203138332e3239372033362e36303132203138352e3232332033352e36383833433138372e3134392033342e37373534203138392e3237332033342e33353734203139312e3430312033342e34373234433234322e3234382033342e36343437203239332e3036362033342e363136203334332e3931332033342e37303232433335302e3932322033342e37303232203335372e3933322033342e39383935203336342e3934312033342e39383935433336362e3432332033352e30313338203336372e3837382033352e33383532203336392e31392033362e30373336433337302e3530322033362e37363231203337312e3633342033372e37343835203337322e3439362033382e39353338433337382e352034362e34323238203338342e3237342035342e30363432203339302e3133352036312e36343831433339332e3831322036362e34343535203339372e3433312037312e33303034203430312e3136362037362e30313136433430362e3136342038322e333839203431312e3237382038382e36383032203431362e3234382039352e30383633433432302e333237203130302e333433203432342e323931203130352e363837203432382e333432203131302e3937324c3434322e393335203132392e383137433434332e353638203133302e363335203434342e313038203133312e353232203434342e353434203133322e3436433434352e373739203133352e313332203434352e333139203133352e383739203434322e333332203133352e3835433433342e323032203133352e3835203432362e313031203133352e353931203431372e393731203133352e353931433430382e303332203133352e353931203339382e303932203133352e373634203338382e313533203133352e383231433336342e303739203133352e393635203334302e303036203133362e313337203331352e393632203133362e313935433330372e333434203133362e313935203239382e373235203133352e373932203239302e313037203133352e3835433237302e373137203133352e3835203235312e333236203133362e333637203233312e393335203133362e343533433230382e313231203133362e343533203138342e333036203133362e343533203136302e343931203133362e343533433134352e303037203133362e343533203132392e343935203133362e3734203131342e303131203133362e383237433131312e313338203133362e383237203130382e323636203133362e353339203130352e353635203133362e3339364c3130352e313334203133352e3539315a272066696c6c3d2723354142393937272f3e3c6d61736b2069643d276d61736b305f31325f3227207374796c653d276d61736b2d747970653a6c756d696e616e636527206d61736b556e6974733d277573657253706163654f6e5573652720783d273130352720793d273334272077696474683d2733343127206865696768743d27313033273e3c7061746820643d274d3130352e313334203133352e353931433130362e353731203133332e353831203130382e303037203133312e353132203130392e343732203132392e353539433131372e383332203131382e363432203132362e313632203130372e363639203133342e3633372039362e38333837433134332e3131312038362e30303836203135312e3837332037352e30393233203136302e3439312036342e323931433136372e3039382035362e30343633203137332e3834392034372e39373431203138302e33372033392e37303037433138312e3632392033372e39383034203138332e3239372033362e36303132203138352e3232332033352e36383833433138372e3134392033342e37373534203138392e3237332033342e33353734203139312e3430312033342e34373234433234322e3234382033342e36343437203239332e3036362033342e363136203334332e3931332033342e37303232433335302e3932322033342e37303232203335372e3933322033342e39383935203336342e3934312033342e39383935433336362e3432332033352e30313338203336372e3837382033352e33383532203336392e31392033362e30373336433337302e3530322033362e37363231203337312e3633342033372e37343835203337322e3439362033382e39353338433337382e352034362e34323238203338342e3237342035342e30363432203339302e3133352036312e36343831433339332e3831322036362e34343535203339372e3433312037312e33303034203430312e3136362037362e30313136433430362e3136342038322e333839203431312e3237382038382e36383032203431362e3234382039352e30383633433432302e333237203130302e333433203432342e323931203130352e363837203432382e333432203131302e3937324c3434322e393335203132392e383137433434332e353638203133302e363335203434342e313038203133312e353232203434342e353434203133322e3436433434352e373739203133352e313332203434352e333139203133352e383739203434322e333332203133352e3835433433342e323032203133352e3835203432362e313031203133352e353931203431372e393731203133352e353931433430382e303332203133352e353931203339382e303932203133352e373634203338382e313533203133352e383231433336342e303739203133352e393635203334302e303036203133362e313337203331352e393632203133362e313935433330372e333434203133362e313935203239382e373235203133352e373932203239302e313037203133352e3835433237302e373137203133352e3835203235312e333236203133362e333637203233312e393335203133362e343533433230382e313231203133362e343533203138342e333036203133362e343533203136302e343931203133362e343533433134352e303037203133362e343533203132392e343935203133362e3734203131342e303131203133362e383237433131312e313338203133362e383237203130382e323636203133362e353339203130352e353635203133362e3339364c3130352e313334203133352e3539315a272066696c6c3d277768697465272f3e3c2f6d61736b3e3c67206d61736b3d2775726c28236d61736b305f31325f3229273e3c7061746820643d274d3237382e3736203134322e3731364c3337372e3831312033312e353133354c3436342e303738203134302e3936334c3237382e3736203134322e3731365a272066696c6c3d2723354142393937272f3e3c7061746820643d274d3237382e3939203134342e3538334c3337382e3031322033332e333830374c3436342e333038203134322e3833314c3237382e3939203134342e3538335a272066696c6c3d2723303039393746272f3e3c7061746820643d274d3135332e3333362034382e373832364c3138352e3936342037392e31363632433138382e3139342038312e32343331203138392e3530382038342e31323039203138392e3631362038372e31363635433138392e3732352039302e32313231203138382e3631392039332e31373631203138362e3534322039352e343036334c3133382e313837203134372e333334433133362e3131203134392e353634203133332e323332203135302e383738203133302e313837203135302e393836433132372e313431203135312e303935203132342e313737203134392e393839203132312e393437203134372e3931324c39372e3737203132352e3339394339352e35333937203132332e3332322039342e32323538203132302e3434342039342e31313733203131372e3339384339342e30303838203131342e3335332039352e31313436203131312e3338392039372e31393135203130392e3135384c3135332e3337382034382e383231374c3135332e3333362034382e373832365a272066696c6c3d277768697465272f3e3c7061746820643d274d3138302e3238342033392e313833364c3139392e33332036332e33373137433230302e3230312036342e35303939203230312e3331362036352e34333835203230322e3539332036362e30383933433230332e38372036362e3734203230352e3237372036372e30393634203230362e37312036372e31333232433230382e3134332036372e313638203230392e3536352036362e38383234203231302e3837332036362e32393633433231322e3138312036352e37313031203231332e3334312036342e38333834203231342e3236382036332e373435324c3234332e3638352032392e39333335433235302e3033332032322e36333638203234332e3638352031312e31343631203233342e3532312031322e393834364c3138362e3035382032322e36303831433138342e33352032332e30303231203138322e3736392032332e38323237203138312e3436342032342e39393333433138302e3135392032362e31363339203137392e3137322032372e36343632203137382e3539352032392e33303138433137382e3031392033302e39353734203137372e3837312033322e37333232203137382e3136362033342e34363033433137382e3436322033362e31383835203137392e31392033372e38313335203138302e3238342033392e313833365a272066696c6c3d277768697465272f3e3c2f673e3c7061746820643d274d3235382e303438203432332e363038433235372e323238203432322e333535203235362e343839203432312e3035203235352e383336203431392e373031433235322e353631203431312e383031203234392e343837203430332e383135203234362e313236203339352e393434433234312e353837203338352e323836203233362e383438203337342e373434203233322e313635203336342e313433433232372e303332203335322e343233203232312e383731203334302e373132203231362e363831203332392e3031433230392e3237203331322e323334203230312e383837203239352e343438203139342e353333203237382e363532433139302e383237203237302e303334203138372e343337203236312e343136203138332e373033203235332e303835433138302e333432203234352e353031203137362e363037203233382e303839203137332e323137203233302e353035433136382e303735203231392e303135203136332e313334203230372e333531203135382e303439203139352e373734433135352e313737203138392e353132203135322e333034203138332e333336203134392e373437203137372e303434433134382e323235203137332e333936203134392e373437203137312e303132203135332e383834203137302e373533433135362e373537203137302e353532203135392e363239203137302e353233203136322e353032203137302e353532433138382e3035203137302e363637203231332e353938203137302e383031203233392e313436203137302e393534433234332e343833203137302e393534203234372e373634203137302e393534203235322e3133203137312e333238433235372e333539203137312e363434203235392e323236203137332e363535203235392e323236203137382e383534433235392e323236203233302e333731203235392e323236203238312e383938203235392e323236203333332e343334433235392e323236203335332e353433203235392e343237203337332e393638203235392e343536203339342e3232433235392e343536203430322e383339203235392e323535203431312e343537203235392e3134203432302e303735433235392e3134203432312e313039203235392e3134203432322e313134203235382e393339203432332e31324c3235382e303438203432332e3630385a272066696c6c3d2723353142373936272f3e3c6d61736b2069643d276d61736b315f31325f3227207374796c653d276d61736b2d747970653a6c756d696e616e636527206d61736b556e6974733d277573657253706163654f6e5573652720783d273134392720793d27313730272077696474683d2731313127206865696768743d27323534273e3c7061746820643d274d3235382e303438203432332e363038433235372e323238203432322e333535203235362e343839203432312e3035203235352e383336203431392e373031433235322e353631203431312e383031203234392e343837203430332e383135203234362e313236203339352e393434433234312e353837203338352e323836203233362e383438203337342e373434203233322e313635203336342e313433433232372e303332203335322e343233203232312e383731203334302e373132203231362e363831203332392e3031433230392e3237203331322e323334203230312e383837203239352e343438203139342e353333203237382e363532433139302e383237203237302e303334203138372e343337203236312e343136203138332e373033203235332e303835433138302e333432203234352e353031203137362e363037203233382e303839203137332e323137203233302e353035433136382e303735203231392e303135203136332e313334203230372e333531203135382e303439203139352e373734433135352e313737203138392e353132203135322e333034203138332e333336203134392e373437203137372e303434433134382e323235203137332e333936203134392e373437203137312e303132203135332e383834203137302e373533433135362e373537203137302e353532203135392e363239203137302e353233203136322e353032203137302e353532433138382e3035203137302e363637203231332e353938203137302e383031203233392e313436203137302e393534433234332e343833203137302e393534203234372e373634203137302e393534203235322e3133203137312e333238433235372e333539203137312e363434203235392e323236203137332e363535203235392e323236203137382e383534433235392e323236203233302e333731203235392e323236203238312e383938203235392e323236203333332e343334433235392e323236203335332e353433203235392e343237203337332e393638203235392e343536203339342e3232433235392e343536203430322e383339203235392e323535203431312e343537203235392e3134203432302e303735433235392e3134203432312e313039203235392e3134203432322e313134203235382e393339203432332e31324c3235382e303438203432332e3630385a272066696c6c3d277768697465272f3e3c2f6d61736b3e3c67206d61736b3d2775726c28236d61736b315f31325f3229273e3c7061746820643d274d3236382e323735203137302e363936483134372e373336563230372e383638483236382e323735563137302e3639365a272066696c6c3d277768697465272f3e3c2f673e3c7061746820643d274d3239342e31203431392e393032433239342e31203431382e333531203239332e383939203431362e38203239332e383939203431352e323439433239332e383939203430302e343534203239342e333838203338352e3636203239342e333539203337302e383337433239342e333539203332312e373333203239342e313936203237322e363338203239332e383731203232332e353533433239332e383731203230382e333836203239332e3637203139332e323436203239332e353236203137382e313037433239332e353236203137332e313636203239352e313335203137312e333537203330302e323139203137312e333537433332332e303836203137312e333537203334352e393533203137312e333537203336382e383139203137312e333537433337382e393331203137312e333537203338392e303732203137312e353836203339392e323132203137312e3733433339392e373233203137312e373539203430302e323331203137312e383137203430302e373335203137312e393032433430322e383033203137322e3139203430332e363038203137332e3038203430322e373436203137352e323335433339392e333835203138322e363735203339362e303831203139302e303836203339322e383036203139372e353536433338312e363033203232332e313432203337302e343138203234382e373537203335392e323533203237342e34433335302e363335203239342e303738203334322e303137203331332e373237203333332e333939203333332e343035433332372e3238203334372e343234203332312e333334203336312e353239203331352e313239203337352e353139433331302e343436203338362e313139203330352e343139203339362e353437203330302e373635203430372e313139433239392e313238203431302e373339203239372e363931203431342e343733203239362e3134203431382e313231433239352e383533203431382e373832203239352e343739203431392e343134203239352e313633203432302e3034364c3239342e31203431392e3930325a272066696c6c3d2723303039383744272f3e3c7061746820643d274d37312e30363432203234312e3330374337322e34373034203234312e3035392037332e38393031203234302e3839362037352e33313538203234302e3831384339342e36323033203234302e383138203131332e393534203234302e383138203133332e323538203234302e383138433133342e383935203234302e3638203133362e353332203234312e303832203133372e393138203234312e393635433133392e333034203234322e383437203134302e333631203234342e3136203134302e393238203234352e373032433134362e313238203235372e313933203135312e343731203236382e343534203135362e363939203237392e383837433136372e353031203330332e353031203137382e333331203332372e303835203138382e393838203335302e373537433139352e363533203336352e353232203230322e303539203338302e333734203230382e353233203339352e323236433230392e393837203339382e353239203231312e313639203430312e3935203231322e303536203430352e3435334c37302e36333333203234322e3235354c37312e30363432203234312e3330375a272066696c6c3d277768697465272f3e3c7061746820643d274d3438302e373937203234312e363233433437392e333831203234312e333735203437372e393532203234312e323132203437362e353137203234312e313334433435372e323132203234312e313334203433372e393038203234312e313334203431382e363033203234312e313334433431362e393633203234312e303033203431352e333236203234312e343131203431332e393431203234322e323939433431322e353535203234332e313836203431312e343939203234342e353032203431302e393333203234362e303437433430352e373333203235372e353337203430302e333631203236382e373938203339352e313333203238302e323033433338342e333332203330332e383137203337332e353639203332372e343439203336322e383434203335312e313031433335362e323038203336352e383637203334392e383032203338302e373139203334332e3331203339352e353731433334312e383732203339382e383731203334302e37203430322e323832203333392e383035203430352e3736394c3438312e323238203234322e3438354c3438302e373937203234312e3632335a272066696c6c3d2723313338313731272f3e3c7061746820643d274d34372e35333636203230382e3237314334392e37313939203230352e3339382035312e35323937203230322e3639382035332e323832203230302e31374335382e35313033203139332e3037342036332e37303939203138352e3937392036392e30353331203137382e39344337312e30303435203137362e3431342037332e31313534203137342e3031352037352e33373331203137312e3735394337362e31363631203137312e3034322037372e31373931203137302e3631372037382e32343538203137302e3535324338372e303635203137302e3535322039352e38383431203137302e3338203130342e373033203137302e353532433130362e323835203137302e353338203130372e383333203137312e303037203130392e313431203137312e383935433131302e3435203137322e373832203131312e343537203137342e303438203131322e303239203137352e353232433131362e363534203138352e373737203132312e313036203139362e3039203132352e363435203230362e333735433132362e373337203230382e383734203132352e303432203230382e3936203132332e333736203230382e393839433131312e383835203230382e393839203130302e333934203230392e3237362038382e39303335203230392e3234374337362e31373734203230392e3234372036332e34383031203230382e3938392035302e373534203230382e3831364335302e30333539203230382e3637332034392e31343533203230382e3437322034372e35333636203230382e3237315a272066696c6c3d277768697465272f3e3c7061746820643d274d3530312e363533203230362e353437433530302e323939203230372e323031203439382e383537203230372e363535203439372e333733203230372e383937433437362e313732203230372e383937203435342e393433203230372e373534203433332e373432203230372e363936433432372e343531203230372e363936203432372e3032203230372e323038203432392e343333203230312e343632433433322e333036203139342e333637203433352e343038203138372e33203433382e343235203138302e323034433433382e373132203137392e353732203433392e303537203137382e393639203433392e333434203137382e333636433434302e303932203137362e323332203434312e353432203137342e343136203434332e343538203137332e323135433434352e333734203137322e303135203434372e363431203137312e353031203434392e383837203137312e373539433435362e383638203137322e3139203436332e393036203137312e3936203437302e393135203137312e373539433437322e3835203137312e363738203437342e373734203137322e313031203437362e343936203137322e393837433437382e323138203137332e383734203437392e363831203137352e313933203438302e3734203137362e383135433438362e343835203138342e373135203439322e373736203139322e333536203439382e363635203230302e313938433439392e383532203230322e323139203530302e383533203230342e333434203530312e363533203230362e3534375a272066696c6c3d2723303239413746272f3e3c2f7376673e

Deployed Bytecode

0x6080604052600436106100f35760003560e01c80636352211e1161008a578063a22cb46511610059578063a22cb465146102fc578063b88d4fde1461031c578063c87b56dd1461032f578063e985e9c51461034f57600080fd5b80636352211e146102565780636a6278421461027657806370a082311461029657806395d89b41146102b657600080fd5b8063081812fc116100c6578063081812fc146101d6578063095ea7b31461021b57806323b872dd1461023057806342842e0e1461024357600080fd5b806301ffc9a7146100f85780630506eb401461014a5780630692a99d1461016c57806306fdde0314610190575b600080fd5b34801561010457600080fd5b50610135610113366004610b6f565b6301ffc9a760e09190911c9081146380ac58cd821417635b5e139f9091141790565b60405190151581526020015b60405180910390f35b34801561015657600080fd5b5061015f610385565b6040516101419190610bdc565b34801561017857600080fd5b5061018260005481565b604051908152602001610141565b34801561019c57600080fd5b5060408051808201909152600781527f456d6572616c6400000000000000000000000000000000000000000000000000602082015261015f565b3480156101e257600080fd5b506101f66101f1366004610c2d565b610413565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610141565b61022e610229366004610c6a565b610467565b005b61022e61023e366004610c94565b610476565b61022e610251366004610c94565b6105b7565b34801561026257600080fd5b506101f6610271366004610c2d565b6105e4565b34801561028257600080fd5b5061022e610291366004610cd0565b610644565b3480156102a257600080fd5b506101826102b1366004610cd0565b610663565b3480156102c257600080fd5b5060408051808201909152600581527f454d524c44000000000000000000000000000000000000000000000000000000602082015261015f565b34801561030857600080fd5b5061022e610317366004610ceb565b6106b3565b61022e61032a366004610d27565b610709565b34801561033b57600080fd5b5061015f61034a366004610c2d565b610764565b34801561035b57600080fd5b5061013561036a366004610dc2565b601c52670a5a2e7a000000006008526000526030600c205490565b6001805461039290610df5565b80601f01602080910402602001604051908101604052809291908181526020018280546103be90610df5565b801561040b5780601f106103e05761010080835404028352916020019161040b565b820191906000526020600020905b8154815290600101906020018083116103ee57829003601f168201915b505050505081565b6000816000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c52602060002082018201805460601b61045d5763ceea21b66000526004601cfd5b6001015492915050565b610472338383610774565b5050565b60008181527f7d8825530a5a2e7a0000000000000000000000000000000000000000000000003317601c526020902081018101805473ffffffffffffffffffffffffffffffffffffffff94851694938416938116919082861483026104ea5767ceea21b6a1148100831560021b526004601cfd5b856000528160010154925082331486331417610518576030600c205461051857634b6e7f186000526004601cfd5b821561052657600082600101555b85851818905550601c600c81812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055600084905220805460010163ffffffff811684026105875767ea553b3401336cea841560021b526004601cfd5b90558082847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a45b505050565b6105c2838383610476565b813b156105b2576105b28383836040518060200160405280600081525061082a565b60008181527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260209020810181015473ffffffffffffffffffffffffffffffffffffffff168061063f5763ceea21b66000526004601cfd5b919050565b61066081600080815461065690610e48565b91829055506108b6565b50565b60008161067857638f4eb6046000526004601cfd5b7f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c528160005263ffffffff601c600c2054169050919050565b801515905081601c52670a5a2e7a0000000060085233600052806030600c2055806000528160601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a35050565b610714858585610476565b833b1561075d5761075d85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061082a92505050565b5050505050565b606061076e61096c565b92915050565b60001960601c8281169250838116935081600052837f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c52602060002082018201805482169150816107d05763ceea21b66000526004601cfd5b8185148515176107f657816000526030600c20546107f657634b6e7f186000526004601cfd5b6001018390558183827f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600038a450505050565b60405163150b7a028082523360208301528560601b60601c604083015283606083015260808083015282518060a08401528015610871578060c08401826020870160045afa505b60208360a48301601c860160008a5af1610894573d15610894573d6000843e3d83fd5b508060e01b8251146108ae5763d1a57ed66000526004601cfd5b505050505050565b8160601b60601c9150806000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260206000208101810180548060601b156109095763c991cbb16000526004601cfd5b831790556000829052601c600c20805460010163ffffffff8116840261093e5767ea553b3401336cea841560021b526004601cfd5b9055808260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8138a45050565b60606109a06109796109c4565b6040516020016109899190610ec3565b604051602081830303815290604052600080610a6c565b6040516020016109b09190611041565b604051602081830303815290604052905090565b6060610a5c600180546109d690610df5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0290610df5565b8015610a4f5780601f10610a2457610100808354040283529160200191610a4f565b820191906000526020600020905b815481529060010190602001808311610a3257829003601f168201915b5050505050600080610a6c565b6040516020016109b09190611086565b606083518015610b67576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106708515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f52602083018181015b6003880197508751603f8160121c1651600053603f81600c1c1651600153603f8160061c1651600253603f811651600353506000518252600482019150808210610adc576020016040527f3d3d000000000000000000000000000000000000000000000000000000000000600384066002048083039190915260008615159091029182900352900382525b509392505050565b600060208284031215610b8157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bb157600080fd5b9392505050565b60005b83811015610bd3578181015183820152602001610bbb565b50506000910152565b6020815260008251806020840152610bfb816040850160208701610bb8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600060208284031215610c3f57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063f57600080fd5b60008060408385031215610c7d57600080fd5b610c8683610c46565b946020939093013593505050565b600080600060608486031215610ca957600080fd5b610cb284610c46565b9250610cc060208501610c46565b9150604084013590509250925092565b600060208284031215610ce257600080fd5b610bb182610c46565b60008060408385031215610cfe57600080fd5b610d0783610c46565b915060208301358015158114610d1c57600080fd5b809150509250929050565b600080600080600060808688031215610d3f57600080fd5b610d4886610c46565b9450610d5660208701610c46565b935060408601359250606086013567ffffffffffffffff80821115610d7a57600080fd5b818801915088601f830112610d8e57600080fd5b813581811115610d9d57600080fd5b896020828501011115610daf57600080fd5b9699959850939650602001949392505050565b60008060408385031215610dd557600080fd5b610dde83610c46565b9150610dec60208401610c46565b90509250929050565b600181811c90821680610e0957607f821691505b602082108103610e42577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ea0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60008151610eb9818560208601610bb8565b9290920192915050565b7f7b226e616d65223a00000000000000000000000000000000000000000000000081527f2200000000000000000000000000000000000000000000000000000000000000600882018190527f456d6572616c640000000000000000000000000000000000000000000000000060098301527f222c000000000000000000000000000000000000000000000000000000000000601083018190527f226465736372697074696f6e223a0000000000000000000000000000000000006012840152602083018290527f412062656175746966756c20656d6572616c642e000000000000000000000000602184015260358301527f22696d616765223a0000000000000000000000000000000000000000000000006037830152603f8201526000610fee6040830184610ea7565b7f220000000000000000000000000000000000000000000000000000000000000081527f7d0000000000000000000000000000000000000000000000000000000000000060018201526002019392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161107981601d850160208701610bb8565b91909101601d0192915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152600082516110be81601a850160208701610bb8565b91909101601a019291505056fea164736f6c6343000815000a

[ 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.