ETH Price: $2,487.84 (+3.26%)
 

Overview

Max Total Supply

1,111 2bitGOB

Holders

415

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 2bitGOB
0x21dbc7bbf74a20361145851b0abbcf9aa6ed10c6
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:
TWObitGOBLINS

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 7 of 7: TwoBitGoblins.sol
// SPDX-License-Identifier: None

pragma solidity ^0.8.4;

import "./base64.sol";
import "./ERC721A.sol";
import "./Strings.sol";
import "./Ownable.sol";

contract TWObitGOBLINS is ERC721A, Ownable {
  using Strings for uint256;

  uint256 public constant MAX_PER_TX = 5;
  uint256 public MAX_SUPPLY = 1111;
  uint256 public MINT_PRICE = 0.0069 ether;
  uint256 public MAX_FREE_SUPPLY = 2;
  struct Color {
    uint8 red;
    uint8 green;
    uint8 blue;
  }

  struct Detail {
    uint256 timestamp;
    uint8 speciesIndex;
    Color topColor;
    Color bottomColor;
  }

  mapping(address => uint256) private _freeMintedCount;
  mapping(uint256 => Detail) private _tokenIdToGoblinDetails;

  bool private _reveal = false;
  uint256 private _seed;

  string[3] private _species = ["Koalinth", "Nilbog", "Hobgoblin"];

  constructor() ERC721A("2Bit Goblins", "2bitGOB") {
    _seed = uint256(
      keccak256(
        abi.encodePacked(
          msg.sender,
          blockhash(block.number - 1),
          block.timestamp
        )
      )
    );
  }

  function createGoblin(uint256 quantity) public payable {
    uint256 _totalSupply = totalSupply();

    require(quantity > 0, "Invalid quantity");
    require(quantity <= MAX_PER_TX, "Exceeds max per tx");
    require(_totalSupply + quantity <= MAX_SUPPLY, "Exceeds max supply");

    uint256 payForCount = quantity;
    uint256 freeMintCount = _freeMintedCount[msg.sender];

    if (freeMintCount < MAX_FREE_SUPPLY) {
      if (quantity > MAX_FREE_SUPPLY) {
        payForCount = quantity - 1;
      } else {
        payForCount = 0;
      }

      _freeMintedCount[msg.sender] = 1;
    }

    require(msg.value >= payForCount * MINT_PRICE, "Ether sent is not correct");

    _mint(msg.sender, quantity);

    for (uint256 i = _totalSupply; i < _totalSupply + quantity; i++) {
      _seed = uint256(
        keccak256(
          abi.encodePacked(
            _seed >> 1,
            msg.sender,
            blockhash(block.number - 1),
            block.timestamp
          )
        )
      );

      _tokenIdToGoblinDetails[i] = _createDetailFromRandom(_seed, i);
    }
  }

  function freeMintedCount(address owner) external view returns (uint256) {
    return _freeMintedCount[owner];
  }

  function details(uint256 tokenId)
    external
    view
    returns (Detail memory detail)
  {
    require(_exists(tokenId), "Nonexistent token");
    detail = _tokenIdToGoblinDetails[tokenId];
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override(ERC721A)
    returns (string memory)
  {
    require(_exists(tokenId), "Nonexistent token");

    if (_reveal == false) {
      return
        string(
          abi.encodePacked(
            _baseURI(),
            Base64.encode(
              abi.encodePacked(
                '{"name":"Rendering Goblin #',
                (tokenId).toString(),
                '...","description":"Unrevealed","image":"ipfs://QmZX2wpWbSnKECxqLBaQvZhTeM39WFHPPyu1BQJVAdSGLs"}'
              )
            )
          )
        );
    }

    return _tokenUriForDetail(_tokenIdToGoblinDetails[tokenId], tokenId);
  }

  function _baseURI() internal pure override returns (string memory) {
    return "data:application/json;base64,";
  }

  function _tokenUriForDetail(Detail memory detail, uint256 tokenId)
    private
    view
    returns (string memory)
  {
    return
      string(
        abi.encodePacked(
          _baseURI(),
          Base64.encode(
            abi.encodePacked(
              '{"name":"',
              _species[detail.speciesIndex],
              " ",
              "Two Bit Goblin #",
              (tokenId).toString(),
              '","description":"',
              //
              '","attributes":[{"',
              _attributesFromDetail(detail),
              '"}],"image":"',
              "data:image/svg+xml;base64,",
              Base64.encode(_createSvg(detail)),
              '"}'
            )
          )
        )
      );
  }

  function _attributesFromDetail(Detail memory detail)
    private
    view
    returns (string memory)
  {
    return
      string(
        abi.encodePacked(
          'trait_type":"Species","value":"',
          _species[detail.speciesIndex],
          '"},{"trait_type":"Head Color","value":"',
          _svgColor(detail.topColor),
          '"},{"trait_type":"Body Color","value":"',
          _svgColor(detail.bottomColor)
        )
      );
  }

  function _createSvg(Detail memory detail)
    private
    pure
    returns (bytes memory)
  {
    return
      abi.encodePacked(
        _svgOpen(1080, 1080),
        "<path id='Head' d='M405 540 L675 540 675 270 405 270 Z' fill='",
        _svgColor(detail.topColor),
        "'/><path id='Torso' d='M405 810 L675 810 675 540 405 540 Z' fill='",
        _svgColor(detail.bottomColor),
        "'/></svg>"
      );
  }

  function _svgColor(Color memory color) private pure returns (string memory) {
    return
      string(
        abi.encodePacked(
          "rgb(",
          uint256(color.red).toString(),
          ",",
          uint256(color.green).toString(),
          ",",
          uint256(color.blue).toString(),
          ")"
        )
      );
  }

  function _svgOpen(uint256 width, uint256 height)
    private
    pure
    returns (string memory)
  {
    return
      string(
        abi.encodePacked(
          "<svg viewBox='0 0 ",
          width.toString(),
          " ",
          height.toString(),
          "' xmlns='http://www.w3.org/2000/svg' version='1.1'>"
        )
      );
  }

  function _indexesFromRandom(uint8 random) private pure returns (uint8) {
    uint8 spread = random % 100;

    if (spread >= 46) {
      return 0; // Brownish
    } else if (spread >= 16) {
      return 1; // Greyish
    }

    return 2; // Yellowish
  }

  function _createDetailFromRandom(uint256 random, uint256 tokenId)
    private
    view
    returns (Detail memory)
  {
    bytes memory randomPieces = abi.encodePacked(random);
    uint256 increment = (tokenId % 20) + 1;
    uint8 speciesIndex = _indexesFromRandom(uint8(randomPieces[9 + increment]));

    return
      Detail(
        block.timestamp,
        speciesIndex,
        _colorTopFromRandom(
          randomPieces,
          6 + increment,
          3 + increment,
          4 + increment,
          speciesIndex
        ),
        _colorBottomFromRandom(
          randomPieces,
          5 + increment,
          7 + increment,
          1 + increment
        )
      );
  }

  function _colorTopFromRandom(
    bytes memory source,
    uint256 indexRed,
    uint256 indexGreen,
    uint256 indexBlue,
    uint256 speciesIndex
  ) private pure returns (Color memory) {
    return
      _randomizeColors(
        _colorTopFloorForSpecies(speciesIndex),
        _colorTopCeilingForSpecies(speciesIndex),
        Color(
          uint8(source[indexRed]),
          uint8(source[indexGreen]),
          uint8(source[indexBlue])
        )
      );
  }

  function _colorTopFloorForSpecies(uint256 index)
    private
    pure
    returns (Color memory)
  {
    if (index == 0) {
      // Brownish
      return Color(25, 82, 39);
    } else if (index == 1) {
      // Greyish
      return Color(1, 61, 57);
    } else {
      // Yellowish
      return Color(53, 61, 1);
    }
  }

  function _colorTopCeilingForSpecies(uint256 index)
    private
    pure
    returns (Color memory)
  {
    if (index == 0) {
      // Brownish
      return Color(124, 164, 125);
    } else if (index == 1) {
      // Greyish
      return Color(63, 88, 86);
    } else {
      // Yellowish
      return Color(85, 88, 63);
    }
  }

  function _colorBottomFromRandom(
    bytes memory source,
    uint256 indexRed,
    uint256 indexGreen,
    uint256 indexBlue
  ) private pure returns (Color memory) {
    return
      _randomizeColors(
        Color(81, 45, 14),
        Color(168, 141, 118),
        Color(
          uint8(source[indexRed]),
          uint8(source[indexGreen]),
          uint8(source[indexBlue])
        )
      );
  }

  function _randomizeColors(
    Color memory floor,
    Color memory ceiling,
    Color memory random
  ) private pure returns (Color memory color) {
    uint256 percent = (uint256(random.red) +
      uint256(random.green) +
      uint256(random.blue)) % 100;

    color.red =
      floor.red +
      uint8(
        (uint256(ceiling.red + (random.red % 2) - floor.red) * percent) / 100
      );
    color.green =
      floor.green +
      uint8(
        (uint256(ceiling.green + (random.green % 2) - floor.green) * percent) /
          100
      );
    color.blue =
      floor.blue +
      uint8(
        (uint256(ceiling.blue + (random.blue % 2) - floor.blue) * percent) / 100
      );
  }

  function reveal() external onlyOwner {
    _reveal = true;
  }

   function configMaxSupply(uint256 newsupply) public onlyOwner {
        MAX_SUPPLY = newsupply;
    }

 function configActualPrice(uint256 newnewPrice) public onlyOwner {
        MINT_PRICE = newnewPrice;
    }



  function collectReserves(uint256 quantity) external onlyOwner {
    uint256 _totalSupply = totalSupply();

    require(_totalSupply + quantity <= MAX_SUPPLY, "Exceeds max supply");

    _mint(msg.sender, quantity);

    for (uint256 i = _totalSupply; i < _totalSupply + quantity; i++) {
      _seed = uint256(
        keccak256(
          abi.encodePacked(
            _seed >> 1,
            msg.sender,
            blockhash(block.number - 1),
            block.timestamp
          )
        )
      );

      _tokenIdToGoblinDetails[i] = _createDetailFromRandom(_seed, i);
    }
  }

  function withdraw() public onlyOwner {
    require(
      payable(owner()).send(address(this).balance),
      "Withdraw unsuccessful"
    );
  }
}

File 1 of 7: base64.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

File 2 of 7: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 7: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 4 of 7: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

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

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

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // ==============================
    //            IERC721
    // ==============================

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

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

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // ==============================
    //        IERC721Metadata
    // ==============================

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 5 of 7: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 6 of 7: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"collectReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newnewPrice","type":"uint256"}],"name":"configActualPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newsupply","type":"uint256"}],"name":"configMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"createGoblin","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"details","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint8","name":"speciesIndex","type":"uint8"},{"components":[{"internalType":"uint8","name":"red","type":"uint8"},{"internalType":"uint8","name":"green","type":"uint8"},{"internalType":"uint8","name":"blue","type":"uint8"}],"internalType":"struct TWObitGOBLINS.Color","name":"topColor","type":"tuple"},{"components":[{"internalType":"uint8","name":"red","type":"uint8"},{"internalType":"uint8","name":"green","type":"uint8"},{"internalType":"uint8","name":"blue","type":"uint8"}],"internalType":"struct TWObitGOBLINS.Color","name":"bottomColor","type":"tuple"}],"internalType":"struct TWObitGOBLINS.Detail","name":"detail","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"freeMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526104576009556618838370f34000600a556002600b556000600e60006101000a81548160ff02191690831515021790555060405180606001604052806040518060400160405280600881526020017f4b6f616c696e746800000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4e696c626f67000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f486f62676f626c696e0000000000000000000000000000000000000000000000815250815250601090600362000101929190620002f6565b503480156200010f57600080fd5b506040518060400160405280600c81526020017f3242697420476f626c696e7300000000000000000000000000000000000000008152506040518060400160405280600781526020017f32626974474f420000000000000000000000000000000000000000000000000081525081600290816200018d919062000650565b5080600390816200019f919062000650565b50620001b06200022360201b60201c565b6000819055505050620001d8620001cc6200022860201b60201c565b6200023060201b60201c565b33600143620001e8919062000766565b4042604051602001620001fe9392919062000879565b6040516020818303038152906040528051906020012060001c600f81905550620008bc565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b826003810192821562000336579160200282015b828111156200033557825182908162000324919062000650565b50916020019190600101906200030a565b5b50905062000345919062000349565b5090565b5b808211156200036d576000818162000363919062000371565b506001016200034a565b5090565b5080546200037f906200043f565b6000825580601f10620003935750620003b4565b601f016020900490600052602060002090810190620003b39190620003b7565b5b50565b5b80821115620003d2576000816000905550600101620003b8565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200045857607f821691505b6020821081036200046e576200046d62000410565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000499565b620004e4868362000499565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005316200052b6200052584620004fc565b62000506565b620004fc565b9050919050565b6000819050919050565b6200054d8362000510565b620005656200055c8262000538565b848454620004a6565b825550505050565b600090565b6200057c6200056d565b6200058981848462000542565b505050565b5b81811015620005b157620005a560008262000572565b6001810190506200058f565b5050565b601f8211156200060057620005ca8162000474565b620005d58462000489565b81016020851015620005e5578190505b620005fd620005f48562000489565b8301826200058e565b50505b505050565b600082821c905092915050565b6000620006256000198460080262000605565b1980831691505092915050565b600062000640838362000612565b9150826002028217905092915050565b6200065b82620003d6565b67ffffffffffffffff811115620006775762000676620003e1565b5b6200068382546200043f565b62000690828285620005b5565b600060209050601f831160018114620006c85760008415620006b3578287015190505b620006bf858262000632565b8655506200072f565b601f198416620006d88662000474565b60005b828110156200070257848901518255600182019150602085019450602081019050620006db565b868310156200072257848901516200071e601f89168262000612565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200077382620004fc565b91506200078083620004fc565b92508282101562000796576200079562000737565b5b828203905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007ce82620007a1565b9050919050565b60008160601b9050919050565b6000620007ef82620007d5565b9050919050565b60006200080382620007e2565b9050919050565b6200081f6200081982620007c1565b620007f6565b82525050565b6000819050919050565b6000819050919050565b6200084e620008488262000825565b6200082f565b82525050565b6000819050919050565b620008736200086d82620004fc565b62000854565b82525050565b60006200088782866200080a565b60148201915062000899828562000839565b602082019150620008ab82846200085e565b602082019150819050949350505050565b614a7880620008cc6000396000f3fe6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461061f578063f2b781321461065c578063f2fde38b14610685578063f43a22dc146106ae576101c2565b8063b88d4fde14610565578063c002d23d1461058e578063c87b56dd146105b9578063e5d089ff146105f6576101c2565b8063a005ec7a116100d1578063a005ec7a146104cc578063a22cb46514610509578063a475b5dd14610532578063b5291a7814610549576101c2565b80638da5cb5b1461043957806395d89b4114610464578063981332351461048f576101c2565b806332cb6b0c116101645780635ec65fa91161013e5780635ec65fa91461037f5780636352211e146103a857806370a08231146103e5578063715018a614610422576101c2565b806332cb6b0c146103145780633ccfd60b1461033f57806342842e0e14610356576101c2565b8063081812fc116101a0578063081812fc1461025a578063095ea7b31461029757806318160ddd146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806302ddb65b1461020457806306fdde031461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906130e2565b6106d9565b6040516101fb919061312a565b60405180910390f35b34801561021057600080fd5b5061021961076b565b604051610226919061315e565b60405180910390f35b34801561023b57600080fd5b50610244610771565b6040516102519190613212565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c9190613260565b610803565b60405161028e91906132ce565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b99190613315565b61087f565b005b3480156102cc57600080fd5b506102d5610a25565b6040516102e2919061315e565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190613355565b610a3c565b005b34801561032057600080fd5b50610329610a4c565b604051610336919061315e565b60405180910390f35b34801561034b57600080fd5b50610354610a52565b005b34801561036257600080fd5b5061037d60048036038101906103789190613355565b610b4b565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613260565b610b6b565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190613260565b610bf1565b6040516103dc91906132ce565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906133a8565b610c03565b604051610419919061315e565b60405180910390f35b34801561042e57600080fd5b50610437610cbb565b005b34801561044557600080fd5b5061044e610d43565b60405161045b91906132ce565b60405180910390f35b34801561047057600080fd5b50610479610d6d565b6040516104869190613212565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b191906133a8565b610dff565b6040516104c3919061315e565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613260565b610e48565b6040516105009190613498565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b91906134e0565b610fba565b005b34801561053e57600080fd5b50610547611131565b005b610563600480360381019061055e9190613260565b6111ca565b005b34801561057157600080fd5b5061058c60048036038101906105879190613655565b611568565b005b34801561059a57600080fd5b506105a36115db565b6040516105b0919061315e565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190613260565b6115e1565b6040516105ed9190613212565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613260565b6117d1565b005b34801561062b57600080fd5b50610646600480360381019061064191906136d8565b611a56565b604051610653919061312a565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190613260565b611aea565b005b34801561069157600080fd5b506106ac60048036038101906106a791906133a8565b611b70565b005b3480156106ba57600080fd5b506106c3611c67565b6040516106d0919061315e565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107645750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b60606002805461078090613747565b80601f01602080910402602001604051908101604052809291908181526020018280546107ac90613747565b80156107f95780601f106107ce576101008083540402835291602001916107f9565b820191906000526020600020905b8154815290600101906020018083116107dc57829003601f168201915b5050505050905090565b600061080e82611c6c565b610844576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088a82611ccb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108f1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610910611d97565b73ffffffffffffffffffffffffffffffffffffffff16146109735761093c81610937611d97565b611a56565b610972576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a2f611d9f565b6001546000540303905090565b610a47838383611da4565b505050565b60095481565b610a5a61214b565b73ffffffffffffffffffffffffffffffffffffffff16610a78610d43565b73ffffffffffffffffffffffffffffffffffffffff1614610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac5906137c4565b60405180910390fd5b610ad6610d43565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090613830565b60405180910390fd5b565b610b6683838360405180602001604052806000815250611568565b505050565b610b7361214b565b73ffffffffffffffffffffffffffffffffffffffff16610b91610d43565b73ffffffffffffffffffffffffffffffffffffffff1614610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde906137c4565b60405180910390fd5b8060098190555050565b6000610bfc82611ccb565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c6a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610cc361214b565b73ffffffffffffffffffffffffffffffffffffffff16610ce1610d43565b73ffffffffffffffffffffffffffffffffffffffff1614610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e906137c4565b60405180910390fd5b610d416000612153565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d7c90613747565b80601f0160208091040260200160405190810160405280929190818152602001828054610da890613747565b8015610df55780601f10610dca57610100808354040283529160200191610df5565b820191906000526020600020905b815481529060010190602001808311610dd857829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e50613015565b610e5982611c6c565b610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f9061389c565b60405180910390fd5b600d6000838152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff168152602001600282016040518060600160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff16815250508152602001600382016040518060600160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681525050815250509050919050565b610fc2611d97565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611026576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611033611d97565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110e0611d97565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611125919061312a565b60405180910390a35050565b61113961214b565b73ffffffffffffffffffffffffffffffffffffffff16611157610d43565b73ffffffffffffffffffffffffffffffffffffffff16146111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a4906137c4565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b60006111d4610a25565b905060008211611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090613908565b60405180910390fd5b600582111561125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613974565b60405180910390fd5b600954828261126c91906139c3565b11156112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490613a65565b60405180910390fd5b60008290506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b5481101561136957600b5484111561131e576001846113179190613a85565b9150611323565b600091505b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600a54826113779190613ab9565b3410156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090613b5f565b60405180910390fd5b6113c33385612219565b60008390505b84846113d591906139c3565b811015611561576001600f54901c336001436113f19190613a85565b40426040516020016114069493929190613c13565b6040516020818303038152906040528051906020012060001c600f81905550611431600f54826123eb565b600d60008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160020160008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff160217905550505060608201518160030160008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff1602179055505050905050808061155990613c61565b9150506113c9565b5050505050565b611573848484611da4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115d55761159e848484846124fe565b6115d4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a5481565b60606115ec82611c6c565b61162b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116229061389c565b60405180910390fd5b60001515600e60009054906101000a900460ff161515036116a55761164e61264e565b61167e61165a8461268b565b60405160200161166a9190613dc9565b6040516020818303038152906040526127eb565b60405160200161168f929190613df6565b60405160208183030381529060405290506117cc565b6117c9600d6000848152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff168152602001600282016040518060600160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff16815250508152602001600382016040518060600160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff16815250508152505083612963565b90505b919050565b6117d961214b565b73ffffffffffffffffffffffffffffffffffffffff166117f7610d43565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611844906137c4565b60405180910390fd5b6000611857610a25565b9050600954828261186891906139c3565b11156118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a090613a65565b60405180910390fd5b6118b33383612219565b60008190505b82826118c591906139c3565b811015611a51576001600f54901c336001436118e19190613a85565b40426040516020016118f69493929190613c13565b6040516020818303038152906040528051906020012060001c600f81905550611921600f54826123eb565b600d60008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160020160008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff160217905550505060608201518160030160008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555050509050508080611a4990613c61565b9150506118b9565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611af261214b565b73ffffffffffffffffffffffffffffffffffffffff16611b10610d43565b73ffffffffffffffffffffffffffffffffffffffff1614611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d906137c4565b60405180910390fd5b80600a8190555050565b611b7861214b565b73ffffffffffffffffffffffffffffffffffffffff16611b96610d43565b73ffffffffffffffffffffffffffffffffffffffff1614611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906137c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290613e8c565b60405180910390fd5b611c6481612153565b50565b600581565b600081611c77611d9f565b11158015611c86575060005482105b8015611cc4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611cda611d9f565b11611d6057600054811015611d5f5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611d5d575b60008103611d53576004600083600190039350838152602001908152602001600020549050611d29565b8092505050611d92565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611daf82611ccb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e16576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e37611d97565b73ffffffffffffffffffffffffffffffffffffffff161480611e665750611e6585611e60611d97565b611a56565b5b80611eab5750611e74611d97565b73ffffffffffffffffffffffffffffffffffffffff16611e9384610803565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ee4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f4a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f5785858560016129fe565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61205486612a04565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036120dc57600060018401905060006004600083815260200190815260200160002054036120da5760005481146120d9578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121448585856001612a0e565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612285576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036122bf576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122cc60008483856129fe565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161233160018414612a14565b901b60a042901b61234185612a04565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612367578160008190555050506123e66000848385612a0e565b505050565b6123f3613015565b6000836040516020016124069190613eac565b6040516020818303038152906040529050600060016014856124289190613ef6565b61243291906139c3565b9050600061246b8383600961244791906139c3565b8151811061245857612457613f27565b5b602001015160f81c60f81b60f81c612a1e565b905060405180608001604052804281526020018260ff1681526020016124bb8585600661249891906139c3565b8660036124a591906139c3565b8760046124b291906139c3565b8760ff16612a65565b81526020016124f0858560056124d191906139c3565b8660076124de91906139c3565b8760016124eb91906139c3565b612b16565b815250935050505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612524611d97565b8786866040518563ffffffff1660e01b81526004016125469493929190613fab565b6020604051808303816000875af192505050801561258257506040513d601f19601f8201168201806040525081019061257f919061400c565b60015b6125fb573d80600081146125b2576040519150601f19603f3d011682016040523d82523d6000602084013e6125b7565b606091505b5060008151036125f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250905090565b6060600082036126d2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e6565b600082905060005b600082146127045780806126ed90613c61565b915050600a826126fd9190614039565b91506126da565b60008167ffffffffffffffff8111156127205761271f61352a565b5b6040519080825280601f01601f1916602001820160405280156127525781602001600182028036833780820191505090505b5090505b600085146127df5760018261276b9190613a85565b9150600a8561277a9190613ef6565b603061278691906139c3565b60f81b81838151811061279c5761279b613f27565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d89190614039565b9450612756565b8093505050505b919050565b6060600082510361280d5760405180602001604052806000815250905061295e565b6000604051806060016040528060408152602001614a03604091399050600060036002855161283c91906139c3565b6128469190614039565b60046128529190613ab9565b9050600060208261286391906139c3565b67ffffffffffffffff81111561287c5761287b61352a565b5b6040519080825280601f01601f1916602001820160405280156128ae5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b8183101561291d576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506128c2565b600389510660018114612937576002811461294757612952565b613d3d60f01b6002830352612952565b603d60f81b60018303525b50505050508093505050505b919050565b606061296d61264e565b6129d66010856020015160ff166003811061298b5761298a613f27565b5b016129958561268b565b61299e87612c02565b6129af6129aa89612c62565b6127eb565b6040516020016129c29493929190614362565b6040516020818303038152906040526127eb565b6040516020016129e7929190613df6565b604051602081830303815290604052905092915050565b50505050565b6000819050919050565b50505050565b6000819050919050565b600080606483612a2e91906143f8565b9050602e8160ff1610612a45576000915050612a60565b60108160ff1610612a5a576001915050612a60565b60029150505b919050565b612a6d61304c565b612b0b612a7983612cb2565b612a8284612d55565b60405180606001604052808a8a81518110612aa057612a9f613f27565b5b602001015160f81c60f81b60f81c60ff1681526020018a8981518110612ac957612ac8613f27565b5b602001015160f81c60f81b60f81c60ff1681526020018a8881518110612af257612af1613f27565b5b602001015160f81c60f81b60f81c60ff16815250612df8565b905095945050505050565b612b1e61304c565b612bf86040518060600160405280605160ff168152602001602d60ff168152602001600e60ff16815250604051806060016040528060a860ff168152602001608d60ff168152602001607660ff168152506040518060600160405280898981518110612b8d57612b8c613f27565b5b602001015160f81c60f81b60f81c60ff168152602001898881518110612bb657612bb5613f27565b5b602001015160f81c60f81b60f81c60ff168152602001898781518110612bdf57612bde613f27565b5b602001015160f81c60f81b60f81c60ff16815250612df8565b9050949350505050565b60606010826020015160ff1660038110612c1f57612c1e613f27565b5b01612c2d8360400151612f7f565b612c3a8460600151612f7f565b604051602001612c4c93929190614559565b6040516020818303038152906040529050919050565b6060612c7061043880612fd9565b612c7d8360400151612f7f565b612c8a8460600151612f7f565b604051602001612c9c93929190614701565b6040516020818303038152906040529050919050565b612cba61304c565b60008203612cf0576040518060600160405280601960ff168152602001605260ff168152602001602760ff168152509050612d50565b60018203612d26576040518060600160405280600160ff168152602001603d60ff168152602001603960ff168152509050612d50565b6040518060600160405280603560ff168152602001603d60ff168152602001600160ff1681525090505b919050565b612d5d61304c565b60008203612d93576040518060600160405280607c60ff16815260200160a460ff168152602001607d60ff168152509050612df3565b60018203612dc9576040518060600160405280603f60ff168152602001605860ff168152602001605660ff168152509050612df3565b6040518060600160405280605560ff168152602001605860ff168152602001603f60ff1681525090505b919050565b612e0061304c565b60006064836040015160ff16846020015160ff16856000015160ff16612e2691906139c3565b612e3091906139c3565b612e3a9190613ef6565b9050606481866000015160028660000151612e5591906143f8565b8760000151612e649190614753565b612e6e919061478a565b60ff16612e7b9190613ab9565b612e859190614039565b8560000151612e949190614753565b826000019060ff16908160ff1681525050606481866020015160028660200151612ebe91906143f8565b8760200151612ecd9190614753565b612ed7919061478a565b60ff16612ee49190613ab9565b612eee9190614039565b8560200151612efd9190614753565b826020019060ff16908160ff1681525050606481866040015160028660400151612f2791906143f8565b8760400151612f369190614753565b612f40919061478a565b60ff16612f4d9190613ab9565b612f579190614039565b8560400151612f669190614753565b826040019060ff16908160ff1681525050509392505050565b6060612f91826000015160ff1661268b565b612fa1836020015160ff1661268b565b612fb1846040015160ff1661268b565b604051602001612fc3939291906148a2565b6040516020818303038152906040529050919050565b6060612fe48361268b565b612fed8361268b565b604051602001612ffe9291906149bd565b604051602081830303815290604052905092915050565b604051806080016040528060008152602001600060ff16815260200161303961304c565b815260200161304661304c565b81525090565b6040518060600160405280600060ff168152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130bf8161308a565b81146130ca57600080fd5b50565b6000813590506130dc816130b6565b92915050565b6000602082840312156130f8576130f7613080565b5b6000613106848285016130cd565b91505092915050565b60008115159050919050565b6131248161310f565b82525050565b600060208201905061313f600083018461311b565b92915050565b6000819050919050565b61315881613145565b82525050565b6000602082019050613173600083018461314f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131b3578082015181840152602081019050613198565b838111156131c2576000848401525b50505050565b6000601f19601f8301169050919050565b60006131e482613179565b6131ee8185613184565b93506131fe818560208601613195565b613207816131c8565b840191505092915050565b6000602082019050818103600083015261322c81846131d9565b905092915050565b61323d81613145565b811461324857600080fd5b50565b60008135905061325a81613234565b92915050565b60006020828403121561327657613275613080565b5b60006132848482850161324b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132b88261328d565b9050919050565b6132c8816132ad565b82525050565b60006020820190506132e360008301846132bf565b92915050565b6132f2816132ad565b81146132fd57600080fd5b50565b60008135905061330f816132e9565b92915050565b6000806040838503121561332c5761332b613080565b5b600061333a85828601613300565b925050602061334b8582860161324b565b9150509250929050565b60008060006060848603121561336e5761336d613080565b5b600061337c86828701613300565b935050602061338d86828701613300565b925050604061339e8682870161324b565b9150509250925092565b6000602082840312156133be576133bd613080565b5b60006133cc84828501613300565b91505092915050565b6133de81613145565b82525050565b600060ff82169050919050565b6133fa816133e4565b82525050565b60608201600082015161341660008501826133f1565b50602082015161342960208501826133f1565b50604082015161343c60408501826133f1565b50505050565b6101008201600082015161345960008501826133d5565b50602082015161346c60208501826133f1565b50604082015161347f6040850182613400565b50606082015161349260a0850182613400565b50505050565b6000610100820190506134ae6000830184613442565b92915050565b6134bd8161310f565b81146134c857600080fd5b50565b6000813590506134da816134b4565b92915050565b600080604083850312156134f7576134f6613080565b5b600061350585828601613300565b9250506020613516858286016134cb565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613562826131c8565b810181811067ffffffffffffffff821117156135815761358061352a565b5b80604052505050565b6000613594613076565b90506135a08282613559565b919050565b600067ffffffffffffffff8211156135c0576135bf61352a565b5b6135c9826131c8565b9050602081019050919050565b82818337600083830152505050565b60006135f86135f3846135a5565b61358a565b90508281526020810184848401111561361457613613613525565b5b61361f8482856135d6565b509392505050565b600082601f83011261363c5761363b613520565b5b813561364c8482602086016135e5565b91505092915050565b6000806000806080858703121561366f5761366e613080565b5b600061367d87828801613300565b945050602061368e87828801613300565b935050604061369f8782880161324b565b925050606085013567ffffffffffffffff8111156136c0576136bf613085565b5b6136cc87828801613627565b91505092959194509250565b600080604083850312156136ef576136ee613080565b5b60006136fd85828601613300565b925050602061370e85828601613300565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061375f57607f821691505b60208210810361377257613771613718565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137ae602083613184565b91506137b982613778565b602082019050919050565b600060208201905081810360008301526137dd816137a1565b9050919050565b7f576974686472617720756e7375636365737366756c0000000000000000000000600082015250565b600061381a601583613184565b9150613825826137e4565b602082019050919050565b600060208201905081810360008301526138498161380d565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000613886601183613184565b915061389182613850565b602082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b60006138f2601083613184565b91506138fd826138bc565b602082019050919050565b60006020820190508181036000830152613921816138e5565b9050919050565b7f45786365656473206d6178207065722074780000000000000000000000000000600082015250565b600061395e601283613184565b915061396982613928565b602082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139ce82613145565b91506139d983613145565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a0e57613a0d613994565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000613a4f601283613184565b9150613a5a82613a19565b602082019050919050565b60006020820190508181036000830152613a7e81613a42565b9050919050565b6000613a9082613145565b9150613a9b83613145565b925082821015613aae57613aad613994565b5b828203905092915050565b6000613ac482613145565b9150613acf83613145565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b0857613b07613994565b5b828202905092915050565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b6000613b49601983613184565b9150613b5482613b13565b602082019050919050565b60006020820190508181036000830152613b7881613b3c565b9050919050565b6000819050919050565b613b9a613b9582613145565b613b7f565b82525050565b60008160601b9050919050565b6000613bb882613ba0565b9050919050565b6000613bca82613bad565b9050919050565b613be2613bdd826132ad565b613bbf565b82525050565b6000819050919050565b6000819050919050565b613c0d613c0882613be8565b613bf2565b82525050565b6000613c1f8287613b89565b602082019150613c2f8286613bd1565b601482019150613c3f8285613bfc565b602082019150613c4f8284613b89565b60208201915081905095945050505050565b6000613c6c82613145565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c9e57613c9d613994565b5b600182019050919050565b600081905092915050565b7f7b226e616d65223a2252656e646572696e6720476f626c696e20230000000000600082015250565b6000613cea601b83613ca9565b9150613cf582613cb4565b601b82019050919050565b6000613d0b82613179565b613d158185613ca9565b9350613d25818560208601613195565b80840191505092915050565b7f2e2e2e222c226465736372697074696f6e223a22556e72657665616c6564222c60008201527f22696d616765223a22697066733a2f2f516d5a583277705762536e4b4543787160208201527f4c426151765a6854654d3339574648505079753142514a56416453474c73227d604082015250565b6000613db3606083613ca9565b9150613dbe82613d31565b606082019050919050565b6000613dd482613cdd565b9150613de08284613d00565b9150613deb82613da6565b915081905092915050565b6000613e028285613d00565b9150613e0e8284613d00565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e76602683613184565b9150613e8182613e1a565b604082019050919050565b60006020820190508181036000830152613ea581613e69565b9050919050565b6000613eb88284613b89565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f0182613145565b9150613f0c83613145565b925082613f1c57613f1b613ec7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f7d82613f56565b613f878185613f61565b9350613f97818560208601613195565b613fa0816131c8565b840191505092915050565b6000608082019050613fc060008301876132bf565b613fcd60208301866132bf565b613fda604083018561314f565b8181036060830152613fec8184613f72565b905095945050505050565b600081519050614006816130b6565b92915050565b60006020828403121561402257614021613080565b5b600061403084828501613ff7565b91505092915050565b600061404482613145565b915061404f83613145565b92508261405f5761405e613ec7565b5b828204905092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b60006140a0600983613ca9565b91506140ab8261406a565b600982019050919050565b60008190508160005260206000209050919050565b600081546140d881613747565b6140e28186613ca9565b945060018216600081146140fd576001811461411257614145565b60ff1983168652811515820286019350614145565b61411b856140b6565b60005b8381101561413d5781548189015260018201915060208101905061411e565b838801955050505b50505092915050565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b6000614184600183613ca9565b915061418f8261414e565b600182019050919050565b7f54776f2042697420476f626c696e202300000000000000000000000000000000600082015250565b60006141d0601083613ca9565b91506141db8261419a565b601082019050919050565b7f222c226465736372697074696f6e223a22000000000000000000000000000000600082015250565b600061421c601183613ca9565b9150614227826141e6565b601182019050919050565b7f222c2261747472696275746573223a5b7b220000000000000000000000000000600082015250565b6000614268601283613ca9565b915061427382614232565b601282019050919050565b7f227d5d2c22696d616765223a2200000000000000000000000000000000000000600082015250565b60006142b4600d83613ca9565b91506142bf8261427e565b600d82019050919050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6000614300601a83613ca9565b915061430b826142ca565b601a82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061434c600283613ca9565b915061435782614316565b600282019050919050565b600061436d82614093565b915061437982876140cb565b915061438482614177565b915061438f826141c3565b915061439b8286613d00565b91506143a68261420f565b91506143b18261425b565b91506143bd8285613d00565b91506143c8826142a7565b91506143d3826142f3565b91506143df8284613d00565b91506143ea8261433f565b915081905095945050505050565b6000614403826133e4565b915061440e836133e4565b92508261441e5761441d613ec7565b5b828206905092915050565b7f74726169745f74797065223a2253706563696573222c2276616c7565223a2200600082015250565b600061445f601f83613ca9565b915061446a82614429565b601f82019050919050565b7f227d2c7b2274726169745f74797065223a224865616420436f6c6f72222c227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b60006144d1602783613ca9565b91506144dc82614475565b602782019050919050565b7f227d2c7b2274726169745f74797065223a22426f647920436f6c6f72222c227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b6000614543602783613ca9565b915061454e826144e7565b602782019050919050565b600061456482614452565b915061457082866140cb565b915061457b826144c4565b91506145878285613d00565b915061459282614536565b915061459e8284613d00565b9150819050949350505050565b7f3c706174682069643d27486561642720643d274d34303520353430204c36373560008201527f2035343020363735203237302034303520323730205a272066696c6c3d270000602082015250565b6000614607603e83613ca9565b9150614612826145ab565b603e82019050919050565b7f272f3e3c706174682069643d27546f72736f2720643d274d343035203831302060008201527f4c3637352038313020363735203534302034303520353430205a272066696c6c60208201527f3d27000000000000000000000000000000000000000000000000000000000000604082015250565b600061469f604283613ca9565b91506146aa8261461d565b604282019050919050565b7f272f3e3c2f7376673e0000000000000000000000000000000000000000000000600082015250565b60006146eb600983613ca9565b91506146f6826146b5565b600982019050919050565b600061470d8286613d00565b9150614718826145fa565b91506147248285613d00565b915061472f82614692565b915061473b8284613d00565b9150614746826146de565b9150819050949350505050565b600061475e826133e4565b9150614769836133e4565b92508260ff0382111561477f5761477e613994565b5b828201905092915050565b6000614795826133e4565b91506147a0836133e4565b9250828210156147b3576147b2613994565b5b828203905092915050565b7f7267622800000000000000000000000000000000000000000000000000000000600082015250565b60006147f4600483613ca9565b91506147ff826147be565b600482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614840600183613ca9565b915061484b8261480a565b600182019050919050565b7f2900000000000000000000000000000000000000000000000000000000000000600082015250565b600061488c600183613ca9565b915061489782614856565b600182019050919050565b60006148ad826147e7565b91506148b98286613d00565b91506148c482614833565b91506148d08285613d00565b91506148db82614833565b91506148e78284613d00565b91506148f28261487f565b9150819050949350505050565b7f3c7376672076696577426f783d27302030200000000000000000000000000000600082015250565b6000614935601283613ca9565b9150614940826148ff565b601282019050919050565b7f2720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f60008201527f737667272076657273696f6e3d27312e31273e00000000000000000000000000602082015250565b60006149a7603383613ca9565b91506149b28261494b565b603382019050919050565b60006149c882614928565b91506149d48285613d00565b91506149df82614177565b91506149eb8284613d00565b91506149f68261499a565b9150819050939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220cec81de791c304b21aea4e5482f16d965eb4366dc0586a29b246084ed87614b164736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461061f578063f2b781321461065c578063f2fde38b14610685578063f43a22dc146106ae576101c2565b8063b88d4fde14610565578063c002d23d1461058e578063c87b56dd146105b9578063e5d089ff146105f6576101c2565b8063a005ec7a116100d1578063a005ec7a146104cc578063a22cb46514610509578063a475b5dd14610532578063b5291a7814610549576101c2565b80638da5cb5b1461043957806395d89b4114610464578063981332351461048f576101c2565b806332cb6b0c116101645780635ec65fa91161013e5780635ec65fa91461037f5780636352211e146103a857806370a08231146103e5578063715018a614610422576101c2565b806332cb6b0c146103145780633ccfd60b1461033f57806342842e0e14610356576101c2565b8063081812fc116101a0578063081812fc1461025a578063095ea7b31461029757806318160ddd146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806302ddb65b1461020457806306fdde031461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906130e2565b6106d9565b6040516101fb919061312a565b60405180910390f35b34801561021057600080fd5b5061021961076b565b604051610226919061315e565b60405180910390f35b34801561023b57600080fd5b50610244610771565b6040516102519190613212565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c9190613260565b610803565b60405161028e91906132ce565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b99190613315565b61087f565b005b3480156102cc57600080fd5b506102d5610a25565b6040516102e2919061315e565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190613355565b610a3c565b005b34801561032057600080fd5b50610329610a4c565b604051610336919061315e565b60405180910390f35b34801561034b57600080fd5b50610354610a52565b005b34801561036257600080fd5b5061037d60048036038101906103789190613355565b610b4b565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613260565b610b6b565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190613260565b610bf1565b6040516103dc91906132ce565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906133a8565b610c03565b604051610419919061315e565b60405180910390f35b34801561042e57600080fd5b50610437610cbb565b005b34801561044557600080fd5b5061044e610d43565b60405161045b91906132ce565b60405180910390f35b34801561047057600080fd5b50610479610d6d565b6040516104869190613212565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b191906133a8565b610dff565b6040516104c3919061315e565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613260565b610e48565b6040516105009190613498565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b91906134e0565b610fba565b005b34801561053e57600080fd5b50610547611131565b005b610563600480360381019061055e9190613260565b6111ca565b005b34801561057157600080fd5b5061058c60048036038101906105879190613655565b611568565b005b34801561059a57600080fd5b506105a36115db565b6040516105b0919061315e565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190613260565b6115e1565b6040516105ed9190613212565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613260565b6117d1565b005b34801561062b57600080fd5b50610646600480360381019061064191906136d8565b611a56565b604051610653919061312a565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190613260565b611aea565b005b34801561069157600080fd5b506106ac60048036038101906106a791906133a8565b611b70565b005b3480156106ba57600080fd5b506106c3611c67565b6040516106d0919061315e565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107645750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b60606002805461078090613747565b80601f01602080910402602001604051908101604052809291908181526020018280546107ac90613747565b80156107f95780601f106107ce576101008083540402835291602001916107f9565b820191906000526020600020905b8154815290600101906020018083116107dc57829003601f168201915b5050505050905090565b600061080e82611c6c565b610844576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088a82611ccb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108f1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610910611d97565b73ffffffffffffffffffffffffffffffffffffffff16146109735761093c81610937611d97565b611a56565b610972576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a2f611d9f565b6001546000540303905090565b610a47838383611da4565b505050565b60095481565b610a5a61214b565b73ffffffffffffffffffffffffffffffffffffffff16610a78610d43565b73ffffffffffffffffffffffffffffffffffffffff1614610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac5906137c4565b60405180910390fd5b610ad6610d43565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090613830565b60405180910390fd5b565b610b6683838360405180602001604052806000815250611568565b505050565b610b7361214b565b73ffffffffffffffffffffffffffffffffffffffff16610b91610d43565b73ffffffffffffffffffffffffffffffffffffffff1614610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde906137c4565b60405180910390fd5b8060098190555050565b6000610bfc82611ccb565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c6a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610cc361214b565b73ffffffffffffffffffffffffffffffffffffffff16610ce1610d43565b73ffffffffffffffffffffffffffffffffffffffff1614610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e906137c4565b60405180910390fd5b610d416000612153565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d7c90613747565b80601f0160208091040260200160405190810160405280929190818152602001828054610da890613747565b8015610df55780601f10610dca57610100808354040283529160200191610df5565b820191906000526020600020905b815481529060010190602001808311610dd857829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e50613015565b610e5982611c6c565b610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f9061389c565b60405180910390fd5b600d6000838152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff168152602001600282016040518060600160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff16815250508152602001600382016040518060600160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681525050815250509050919050565b610fc2611d97565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611026576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611033611d97565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110e0611d97565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611125919061312a565b60405180910390a35050565b61113961214b565b73ffffffffffffffffffffffffffffffffffffffff16611157610d43565b73ffffffffffffffffffffffffffffffffffffffff16146111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a4906137c4565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b60006111d4610a25565b905060008211611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090613908565b60405180910390fd5b600582111561125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613974565b60405180910390fd5b600954828261126c91906139c3565b11156112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490613a65565b60405180910390fd5b60008290506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b5481101561136957600b5484111561131e576001846113179190613a85565b9150611323565b600091505b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600a54826113779190613ab9565b3410156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090613b5f565b60405180910390fd5b6113c33385612219565b60008390505b84846113d591906139c3565b811015611561576001600f54901c336001436113f19190613a85565b40426040516020016114069493929190613c13565b6040516020818303038152906040528051906020012060001c600f81905550611431600f54826123eb565b600d60008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160020160008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff160217905550505060608201518160030160008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff1602179055505050905050808061155990613c61565b9150506113c9565b5050505050565b611573848484611da4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115d55761159e848484846124fe565b6115d4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a5481565b60606115ec82611c6c565b61162b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116229061389c565b60405180910390fd5b60001515600e60009054906101000a900460ff161515036116a55761164e61264e565b61167e61165a8461268b565b60405160200161166a9190613dc9565b6040516020818303038152906040526127eb565b60405160200161168f929190613df6565b60405160208183030381529060405290506117cc565b6117c9600d6000848152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff168152602001600282016040518060600160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff16815250508152602001600382016040518060600160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff16815250508152505083612963565b90505b919050565b6117d961214b565b73ffffffffffffffffffffffffffffffffffffffff166117f7610d43565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611844906137c4565b60405180910390fd5b6000611857610a25565b9050600954828261186891906139c3565b11156118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a090613a65565b60405180910390fd5b6118b33383612219565b60008190505b82826118c591906139c3565b811015611a51576001600f54901c336001436118e19190613a85565b40426040516020016118f69493929190613c13565b6040516020818303038152906040528051906020012060001c600f81905550611921600f54826123eb565b600d60008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160020160008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff160217905550505060608201518160030160008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555050509050508080611a4990613c61565b9150506118b9565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611af261214b565b73ffffffffffffffffffffffffffffffffffffffff16611b10610d43565b73ffffffffffffffffffffffffffffffffffffffff1614611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d906137c4565b60405180910390fd5b80600a8190555050565b611b7861214b565b73ffffffffffffffffffffffffffffffffffffffff16611b96610d43565b73ffffffffffffffffffffffffffffffffffffffff1614611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906137c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290613e8c565b60405180910390fd5b611c6481612153565b50565b600581565b600081611c77611d9f565b11158015611c86575060005482105b8015611cc4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611cda611d9f565b11611d6057600054811015611d5f5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611d5d575b60008103611d53576004600083600190039350838152602001908152602001600020549050611d29565b8092505050611d92565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611daf82611ccb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e16576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e37611d97565b73ffffffffffffffffffffffffffffffffffffffff161480611e665750611e6585611e60611d97565b611a56565b5b80611eab5750611e74611d97565b73ffffffffffffffffffffffffffffffffffffffff16611e9384610803565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ee4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f4a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f5785858560016129fe565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61205486612a04565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036120dc57600060018401905060006004600083815260200190815260200160002054036120da5760005481146120d9578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121448585856001612a0e565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612285576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036122bf576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122cc60008483856129fe565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161233160018414612a14565b901b60a042901b61234185612a04565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612367578160008190555050506123e66000848385612a0e565b505050565b6123f3613015565b6000836040516020016124069190613eac565b6040516020818303038152906040529050600060016014856124289190613ef6565b61243291906139c3565b9050600061246b8383600961244791906139c3565b8151811061245857612457613f27565b5b602001015160f81c60f81b60f81c612a1e565b905060405180608001604052804281526020018260ff1681526020016124bb8585600661249891906139c3565b8660036124a591906139c3565b8760046124b291906139c3565b8760ff16612a65565b81526020016124f0858560056124d191906139c3565b8660076124de91906139c3565b8760016124eb91906139c3565b612b16565b815250935050505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612524611d97565b8786866040518563ffffffff1660e01b81526004016125469493929190613fab565b6020604051808303816000875af192505050801561258257506040513d601f19601f8201168201806040525081019061257f919061400c565b60015b6125fb573d80600081146125b2576040519150601f19603f3d011682016040523d82523d6000602084013e6125b7565b606091505b5060008151036125f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250905090565b6060600082036126d2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e6565b600082905060005b600082146127045780806126ed90613c61565b915050600a826126fd9190614039565b91506126da565b60008167ffffffffffffffff8111156127205761271f61352a565b5b6040519080825280601f01601f1916602001820160405280156127525781602001600182028036833780820191505090505b5090505b600085146127df5760018261276b9190613a85565b9150600a8561277a9190613ef6565b603061278691906139c3565b60f81b81838151811061279c5761279b613f27565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d89190614039565b9450612756565b8093505050505b919050565b6060600082510361280d5760405180602001604052806000815250905061295e565b6000604051806060016040528060408152602001614a03604091399050600060036002855161283c91906139c3565b6128469190614039565b60046128529190613ab9565b9050600060208261286391906139c3565b67ffffffffffffffff81111561287c5761287b61352a565b5b6040519080825280601f01601f1916602001820160405280156128ae5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b8183101561291d576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506128c2565b600389510660018114612937576002811461294757612952565b613d3d60f01b6002830352612952565b603d60f81b60018303525b50505050508093505050505b919050565b606061296d61264e565b6129d66010856020015160ff166003811061298b5761298a613f27565b5b016129958561268b565b61299e87612c02565b6129af6129aa89612c62565b6127eb565b6040516020016129c29493929190614362565b6040516020818303038152906040526127eb565b6040516020016129e7929190613df6565b604051602081830303815290604052905092915050565b50505050565b6000819050919050565b50505050565b6000819050919050565b600080606483612a2e91906143f8565b9050602e8160ff1610612a45576000915050612a60565b60108160ff1610612a5a576001915050612a60565b60029150505b919050565b612a6d61304c565b612b0b612a7983612cb2565b612a8284612d55565b60405180606001604052808a8a81518110612aa057612a9f613f27565b5b602001015160f81c60f81b60f81c60ff1681526020018a8981518110612ac957612ac8613f27565b5b602001015160f81c60f81b60f81c60ff1681526020018a8881518110612af257612af1613f27565b5b602001015160f81c60f81b60f81c60ff16815250612df8565b905095945050505050565b612b1e61304c565b612bf86040518060600160405280605160ff168152602001602d60ff168152602001600e60ff16815250604051806060016040528060a860ff168152602001608d60ff168152602001607660ff168152506040518060600160405280898981518110612b8d57612b8c613f27565b5b602001015160f81c60f81b60f81c60ff168152602001898881518110612bb657612bb5613f27565b5b602001015160f81c60f81b60f81c60ff168152602001898781518110612bdf57612bde613f27565b5b602001015160f81c60f81b60f81c60ff16815250612df8565b9050949350505050565b60606010826020015160ff1660038110612c1f57612c1e613f27565b5b01612c2d8360400151612f7f565b612c3a8460600151612f7f565b604051602001612c4c93929190614559565b6040516020818303038152906040529050919050565b6060612c7061043880612fd9565b612c7d8360400151612f7f565b612c8a8460600151612f7f565b604051602001612c9c93929190614701565b6040516020818303038152906040529050919050565b612cba61304c565b60008203612cf0576040518060600160405280601960ff168152602001605260ff168152602001602760ff168152509050612d50565b60018203612d26576040518060600160405280600160ff168152602001603d60ff168152602001603960ff168152509050612d50565b6040518060600160405280603560ff168152602001603d60ff168152602001600160ff1681525090505b919050565b612d5d61304c565b60008203612d93576040518060600160405280607c60ff16815260200160a460ff168152602001607d60ff168152509050612df3565b60018203612dc9576040518060600160405280603f60ff168152602001605860ff168152602001605660ff168152509050612df3565b6040518060600160405280605560ff168152602001605860ff168152602001603f60ff1681525090505b919050565b612e0061304c565b60006064836040015160ff16846020015160ff16856000015160ff16612e2691906139c3565b612e3091906139c3565b612e3a9190613ef6565b9050606481866000015160028660000151612e5591906143f8565b8760000151612e649190614753565b612e6e919061478a565b60ff16612e7b9190613ab9565b612e859190614039565b8560000151612e949190614753565b826000019060ff16908160ff1681525050606481866020015160028660200151612ebe91906143f8565b8760200151612ecd9190614753565b612ed7919061478a565b60ff16612ee49190613ab9565b612eee9190614039565b8560200151612efd9190614753565b826020019060ff16908160ff1681525050606481866040015160028660400151612f2791906143f8565b8760400151612f369190614753565b612f40919061478a565b60ff16612f4d9190613ab9565b612f579190614039565b8560400151612f669190614753565b826040019060ff16908160ff1681525050509392505050565b6060612f91826000015160ff1661268b565b612fa1836020015160ff1661268b565b612fb1846040015160ff1661268b565b604051602001612fc3939291906148a2565b6040516020818303038152906040529050919050565b6060612fe48361268b565b612fed8361268b565b604051602001612ffe9291906149bd565b604051602081830303815290604052905092915050565b604051806080016040528060008152602001600060ff16815260200161303961304c565b815260200161304661304c565b81525090565b6040518060600160405280600060ff168152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130bf8161308a565b81146130ca57600080fd5b50565b6000813590506130dc816130b6565b92915050565b6000602082840312156130f8576130f7613080565b5b6000613106848285016130cd565b91505092915050565b60008115159050919050565b6131248161310f565b82525050565b600060208201905061313f600083018461311b565b92915050565b6000819050919050565b61315881613145565b82525050565b6000602082019050613173600083018461314f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131b3578082015181840152602081019050613198565b838111156131c2576000848401525b50505050565b6000601f19601f8301169050919050565b60006131e482613179565b6131ee8185613184565b93506131fe818560208601613195565b613207816131c8565b840191505092915050565b6000602082019050818103600083015261322c81846131d9565b905092915050565b61323d81613145565b811461324857600080fd5b50565b60008135905061325a81613234565b92915050565b60006020828403121561327657613275613080565b5b60006132848482850161324b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132b88261328d565b9050919050565b6132c8816132ad565b82525050565b60006020820190506132e360008301846132bf565b92915050565b6132f2816132ad565b81146132fd57600080fd5b50565b60008135905061330f816132e9565b92915050565b6000806040838503121561332c5761332b613080565b5b600061333a85828601613300565b925050602061334b8582860161324b565b9150509250929050565b60008060006060848603121561336e5761336d613080565b5b600061337c86828701613300565b935050602061338d86828701613300565b925050604061339e8682870161324b565b9150509250925092565b6000602082840312156133be576133bd613080565b5b60006133cc84828501613300565b91505092915050565b6133de81613145565b82525050565b600060ff82169050919050565b6133fa816133e4565b82525050565b60608201600082015161341660008501826133f1565b50602082015161342960208501826133f1565b50604082015161343c60408501826133f1565b50505050565b6101008201600082015161345960008501826133d5565b50602082015161346c60208501826133f1565b50604082015161347f6040850182613400565b50606082015161349260a0850182613400565b50505050565b6000610100820190506134ae6000830184613442565b92915050565b6134bd8161310f565b81146134c857600080fd5b50565b6000813590506134da816134b4565b92915050565b600080604083850312156134f7576134f6613080565b5b600061350585828601613300565b9250506020613516858286016134cb565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613562826131c8565b810181811067ffffffffffffffff821117156135815761358061352a565b5b80604052505050565b6000613594613076565b90506135a08282613559565b919050565b600067ffffffffffffffff8211156135c0576135bf61352a565b5b6135c9826131c8565b9050602081019050919050565b82818337600083830152505050565b60006135f86135f3846135a5565b61358a565b90508281526020810184848401111561361457613613613525565b5b61361f8482856135d6565b509392505050565b600082601f83011261363c5761363b613520565b5b813561364c8482602086016135e5565b91505092915050565b6000806000806080858703121561366f5761366e613080565b5b600061367d87828801613300565b945050602061368e87828801613300565b935050604061369f8782880161324b565b925050606085013567ffffffffffffffff8111156136c0576136bf613085565b5b6136cc87828801613627565b91505092959194509250565b600080604083850312156136ef576136ee613080565b5b60006136fd85828601613300565b925050602061370e85828601613300565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061375f57607f821691505b60208210810361377257613771613718565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137ae602083613184565b91506137b982613778565b602082019050919050565b600060208201905081810360008301526137dd816137a1565b9050919050565b7f576974686472617720756e7375636365737366756c0000000000000000000000600082015250565b600061381a601583613184565b9150613825826137e4565b602082019050919050565b600060208201905081810360008301526138498161380d565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000613886601183613184565b915061389182613850565b602082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b60006138f2601083613184565b91506138fd826138bc565b602082019050919050565b60006020820190508181036000830152613921816138e5565b9050919050565b7f45786365656473206d6178207065722074780000000000000000000000000000600082015250565b600061395e601283613184565b915061396982613928565b602082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139ce82613145565b91506139d983613145565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a0e57613a0d613994565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000613a4f601283613184565b9150613a5a82613a19565b602082019050919050565b60006020820190508181036000830152613a7e81613a42565b9050919050565b6000613a9082613145565b9150613a9b83613145565b925082821015613aae57613aad613994565b5b828203905092915050565b6000613ac482613145565b9150613acf83613145565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b0857613b07613994565b5b828202905092915050565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b6000613b49601983613184565b9150613b5482613b13565b602082019050919050565b60006020820190508181036000830152613b7881613b3c565b9050919050565b6000819050919050565b613b9a613b9582613145565b613b7f565b82525050565b60008160601b9050919050565b6000613bb882613ba0565b9050919050565b6000613bca82613bad565b9050919050565b613be2613bdd826132ad565b613bbf565b82525050565b6000819050919050565b6000819050919050565b613c0d613c0882613be8565b613bf2565b82525050565b6000613c1f8287613b89565b602082019150613c2f8286613bd1565b601482019150613c3f8285613bfc565b602082019150613c4f8284613b89565b60208201915081905095945050505050565b6000613c6c82613145565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c9e57613c9d613994565b5b600182019050919050565b600081905092915050565b7f7b226e616d65223a2252656e646572696e6720476f626c696e20230000000000600082015250565b6000613cea601b83613ca9565b9150613cf582613cb4565b601b82019050919050565b6000613d0b82613179565b613d158185613ca9565b9350613d25818560208601613195565b80840191505092915050565b7f2e2e2e222c226465736372697074696f6e223a22556e72657665616c6564222c60008201527f22696d616765223a22697066733a2f2f516d5a583277705762536e4b4543787160208201527f4c426151765a6854654d3339574648505079753142514a56416453474c73227d604082015250565b6000613db3606083613ca9565b9150613dbe82613d31565b606082019050919050565b6000613dd482613cdd565b9150613de08284613d00565b9150613deb82613da6565b915081905092915050565b6000613e028285613d00565b9150613e0e8284613d00565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e76602683613184565b9150613e8182613e1a565b604082019050919050565b60006020820190508181036000830152613ea581613e69565b9050919050565b6000613eb88284613b89565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f0182613145565b9150613f0c83613145565b925082613f1c57613f1b613ec7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f7d82613f56565b613f878185613f61565b9350613f97818560208601613195565b613fa0816131c8565b840191505092915050565b6000608082019050613fc060008301876132bf565b613fcd60208301866132bf565b613fda604083018561314f565b8181036060830152613fec8184613f72565b905095945050505050565b600081519050614006816130b6565b92915050565b60006020828403121561402257614021613080565b5b600061403084828501613ff7565b91505092915050565b600061404482613145565b915061404f83613145565b92508261405f5761405e613ec7565b5b828204905092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b60006140a0600983613ca9565b91506140ab8261406a565b600982019050919050565b60008190508160005260206000209050919050565b600081546140d881613747565b6140e28186613ca9565b945060018216600081146140fd576001811461411257614145565b60ff1983168652811515820286019350614145565b61411b856140b6565b60005b8381101561413d5781548189015260018201915060208101905061411e565b838801955050505b50505092915050565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b6000614184600183613ca9565b915061418f8261414e565b600182019050919050565b7f54776f2042697420476f626c696e202300000000000000000000000000000000600082015250565b60006141d0601083613ca9565b91506141db8261419a565b601082019050919050565b7f222c226465736372697074696f6e223a22000000000000000000000000000000600082015250565b600061421c601183613ca9565b9150614227826141e6565b601182019050919050565b7f222c2261747472696275746573223a5b7b220000000000000000000000000000600082015250565b6000614268601283613ca9565b915061427382614232565b601282019050919050565b7f227d5d2c22696d616765223a2200000000000000000000000000000000000000600082015250565b60006142b4600d83613ca9565b91506142bf8261427e565b600d82019050919050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6000614300601a83613ca9565b915061430b826142ca565b601a82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061434c600283613ca9565b915061435782614316565b600282019050919050565b600061436d82614093565b915061437982876140cb565b915061438482614177565b915061438f826141c3565b915061439b8286613d00565b91506143a68261420f565b91506143b18261425b565b91506143bd8285613d00565b91506143c8826142a7565b91506143d3826142f3565b91506143df8284613d00565b91506143ea8261433f565b915081905095945050505050565b6000614403826133e4565b915061440e836133e4565b92508261441e5761441d613ec7565b5b828206905092915050565b7f74726169745f74797065223a2253706563696573222c2276616c7565223a2200600082015250565b600061445f601f83613ca9565b915061446a82614429565b601f82019050919050565b7f227d2c7b2274726169745f74797065223a224865616420436f6c6f72222c227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b60006144d1602783613ca9565b91506144dc82614475565b602782019050919050565b7f227d2c7b2274726169745f74797065223a22426f647920436f6c6f72222c227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b6000614543602783613ca9565b915061454e826144e7565b602782019050919050565b600061456482614452565b915061457082866140cb565b915061457b826144c4565b91506145878285613d00565b915061459282614536565b915061459e8284613d00565b9150819050949350505050565b7f3c706174682069643d27486561642720643d274d34303520353430204c36373560008201527f2035343020363735203237302034303520323730205a272066696c6c3d270000602082015250565b6000614607603e83613ca9565b9150614612826145ab565b603e82019050919050565b7f272f3e3c706174682069643d27546f72736f2720643d274d343035203831302060008201527f4c3637352038313020363735203534302034303520353430205a272066696c6c60208201527f3d27000000000000000000000000000000000000000000000000000000000000604082015250565b600061469f604283613ca9565b91506146aa8261461d565b604282019050919050565b7f272f3e3c2f7376673e0000000000000000000000000000000000000000000000600082015250565b60006146eb600983613ca9565b91506146f6826146b5565b600982019050919050565b600061470d8286613d00565b9150614718826145fa565b91506147248285613d00565b915061472f82614692565b915061473b8284613d00565b9150614746826146de565b9150819050949350505050565b600061475e826133e4565b9150614769836133e4565b92508260ff0382111561477f5761477e613994565b5b828201905092915050565b6000614795826133e4565b91506147a0836133e4565b9250828210156147b3576147b2613994565b5b828203905092915050565b7f7267622800000000000000000000000000000000000000000000000000000000600082015250565b60006147f4600483613ca9565b91506147ff826147be565b600482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614840600183613ca9565b915061484b8261480a565b600182019050919050565b7f2900000000000000000000000000000000000000000000000000000000000000600082015250565b600061488c600183613ca9565b915061489782614856565b600182019050919050565b60006148ad826147e7565b91506148b98286613d00565b91506148c482614833565b91506148d08285613d00565b91506148db82614833565b91506148e78284613d00565b91506148f28261487f565b9150819050949350505050565b7f3c7376672076696577426f783d27302030200000000000000000000000000000600082015250565b6000614935601283613ca9565b9150614940826148ff565b601282019050919050565b7f2720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f60008201527f737667272076657273696f6e3d27312e31273e00000000000000000000000000602082015250565b60006149a7603383613ca9565b91506149b28261494b565b603382019050919050565b60006149c882614928565b91506149d48285613d00565b91506149df82614177565b91506149eb8284613d00565b91506149f68261499a565b9150819050939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220cec81de791c304b21aea4e5482f16d965eb4366dc0586a29b246084ed87614b164736f6c634300080f0033

Deployed Bytecode Sourcemap

164:10007:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5031:615:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;369:34:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10044:100:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12112:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11572:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4085:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12998:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;287:32:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10019:149;;;;;;;;;;;;;:::i;:::-;;13239:185:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9182:102:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9833:144:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5710:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1714:103:3;;;;;;;;;;;;;:::i;:::-;;1063:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10213:104:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2224:115:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2345:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12388:308:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9111:64:5;;;;;;;;;;;;;:::i;:::-;;1104:1114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13495:396:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;324:40:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2555:705;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9407:606;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12767:164:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9289:108:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1972:201:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;244:38:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5031:615:1;5116:4;5431:10;5416:25;;:11;:25;;;;:102;;;;5508:10;5493:25;;:11;:25;;;;5416:102;:179;;;;5585:10;5570:25;;:11;:25;;;;5416:179;5396:199;;5031:615;;;:::o;369:34:5:-;;;;:::o;10044:100:1:-;10098:13;10131:5;10124:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10044:100;:::o;12112:204::-;12180:7;12205:16;12213:7;12205;:16::i;:::-;12200:64;;12230:34;;;;;;;;;;;;;;12200:64;12284:15;:24;12300:7;12284:24;;;;;;;;;;;;;;;;;;;;;12277:31;;12112:204;;;:::o;11572:474::-;11645:13;11677:27;11696:7;11677:18;:27::i;:::-;11645:61;;11727:5;11721:11;;:2;:11;;;11717:48;;11741:24;;;;;;;;;;;;;;11717:48;11805:5;11782:28;;:19;:17;:19::i;:::-;:28;;;11778:175;;11830:44;11847:5;11854:19;:17;:19::i;:::-;11830:16;:44::i;:::-;11825:128;;11902:35;;;;;;;;;;;;;;11825:128;11778:175;11992:2;11965:15;:24;11981:7;11965:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12030:7;12026:2;12010:28;;12019:5;12010:28;;;;;;;;;;;;11634:412;11572:474;;:::o;4085:315::-;4138:7;4366:15;:13;:15::i;:::-;4351:12;;4335:13;;:28;:46;4328:53;;4085:315;:::o;12998:170::-;13132:28;13142:4;13148:2;13152:7;13132:9;:28::i;:::-;12998:170;;;:::o;287:32:5:-;;;;:::o;10019:149::-;1294:12:3;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10087:7:5::1;:5;:7::i;:::-;10079:21;;:44;10101:21;10079:44;;;;;;;;;;;;;;;;;;;;;;;10063:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;10019:149::o:0;13239:185:1:-;13377:39;13394:4;13400:2;13404:7;13377:39;;;;;;;;;;;;:16;:39::i;:::-;13239:185;;;:::o;9182:102:5:-;1294:12:3;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9267:9:5::1;9254:10;:22;;;;9182:102:::0;:::o;9833:144:1:-;9897:7;9940:27;9959:7;9940:18;:27::i;:::-;9917:52;;9833:144;;;:::o;5710:224::-;5774:7;5815:1;5798:19;;:5;:19;;;5794:60;;5826:28;;;;;;;;;;;;;;5794:60;1049:13;5872:18;:25;5891:5;5872:25;;;;;;;;;;;;;;;;:54;5865:61;;5710:224;;;:::o;1714:103:3:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;1063:87::-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;10213:104:1:-;10269:13;10302:7;10295:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10213:104;:::o;2224:115:5:-;2287:7;2310:16;:23;2327:5;2310:23;;;;;;;;;;;;;;;;2303:30;;2224:115;;;:::o;2345:204::-;2417:20;;:::i;:::-;2457:16;2465:7;2457;:16::i;:::-;2449:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2511:23;:32;2535:7;2511:32;;;;;;;;;;;2502:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2345:204;;;:::o;12388:308:1:-;12499:19;:17;:19::i;:::-;12487:31;;:8;:31;;;12483:61;;12527:17;;;;;;;;;;;;;;12483:61;12609:8;12557:18;:39;12576:19;:17;:19::i;:::-;12557:39;;;;;;;;;;;;;;;:49;12597:8;12557:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12669:8;12633:55;;12648:19;:17;:19::i;:::-;12633:55;;;12679:8;12633:55;;;;;;:::i;:::-;;;;;;;;12388:308;;:::o;9111:64:5:-;1294:12:3;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9165:4:5::1;9155:7;;:14;;;;;;;;;;;;;;;;;;9111:64::o:0;1104:1114::-;1166:20;1189:13;:11;:13::i;:::-;1166:36;;1230:1;1219:8;:12;1211:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;281:1;1267:8;:22;;1259:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;1354:10;;1342:8;1327:12;:23;;;;:::i;:::-;:37;;1319:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1396:19;1418:8;1396:30;;1433:21;1457:16;:28;1474:10;1457:28;;;;;;;;;;;;;;;;1433:52;;1514:15;;1498:13;:31;1494:217;;;1555:15;;1544:8;:26;1540:121;;;1608:1;1597:8;:12;;;;:::i;:::-;1583:26;;1540:121;;;1650:1;1636:15;;1540:121;1702:1;1671:16;:28;1688:10;1671:28;;;;;;;;;;;;;;;:32;;;;1494:217;1754:10;;1740:11;:24;;;;:::i;:::-;1727:9;:37;;1719:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1803:27;1809:10;1821:8;1803:5;:27::i;:::-;1844:9;1856:12;1844:24;;1839:374;1889:8;1874:12;:23;;;;:::i;:::-;1870:1;:27;1839:374;;;2001:1;1992:5;;:10;;2017;2067:1;2052:12;:16;;;;:::i;:::-;2042:27;2084:15;1961:151;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1939:184;;;;;;1921:211;;1913:5;:219;;;;2172:33;2196:5;;2203:1;2172:23;:33::i;:::-;2143:23;:26;2167:1;2143:26;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1899:3;;;;;:::i;:::-;;;;1839:374;;;;1159:1059;;;1104:1114;:::o;13495:396:1:-;13662:28;13672:4;13678:2;13682:7;13662:9;:28::i;:::-;13723:1;13705:2;:14;;;:19;13701:183;;13744:56;13775:4;13781:2;13785:7;13794:5;13744:30;:56::i;:::-;13739:145;;13828:40;;;;;;;;;;;;;;13739:145;13701:183;13495:396;;;;:::o;324:40:5:-;;;;:::o;2555:705::-;2662:13;2695:16;2703:7;2695;:16::i;:::-;2687:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2757:5;2746:16;;:7;;;;;;;;;;;:16;;;2742:436;;2839:10;:8;:10::i;:::-;2864:282;2977:20;2978:7;2977:18;:20::i;:::-;2894:237;;;;;;;;:::i;:::-;;;;;;;;;;;;;2864:13;:282::i;:::-;2808:351;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2773:397;;;;2742:436;3193:61;3212:23;:32;3236:7;3212:32;;;;;;;;;;;3193:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3246:7;3193:18;:61::i;:::-;3186:68;;2555:705;;;;:::o;9407:606::-;1294:12:3;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9476:20:5::1;9499:13;:11;:13::i;:::-;9476:36;;9556:10;;9544:8;9529:12;:23;;;;:::i;:::-;:37;;9521:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9598:27;9604:10;9616:8;9598:5;:27::i;:::-;9639:9;9651:12;9639:24;;9634:374;9684:8;9669:12;:23;;;;:::i;:::-;9665:1;:27;9634:374;;;9796:1;9787:5;;:10;;9812;9862:1;9847:12;:16;;;;:::i;:::-;9837:27;9879:15;9756:151;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9734:184;;;;;;9716:211;;9708:5;:219;;;;9967:33;9991:5;;9998:1;9967:23;:33::i;:::-;9938:23;:26;9962:1;9938:26;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9694:3;;;;;:::i;:::-;;;;9634:374;;;;9469:544;9407:606:::0;:::o;12767:164:1:-;12864:4;12888:18;:25;12907:5;12888:25;;;;;;;;;;;;;;;:35;12914:8;12888:35;;;;;;;;;;;;;;;;;;;;;;;;;12881:42;;12767:164;;;;:::o;9289:108:5:-;1294:12:3;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9378:11:5::1;9365:10;:24;;;;9289:108:::0;:::o;1972:201:3:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;::::0;2053:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;244:38:5:-;281:1;244:38;:::o;14146:273:1:-;14203:4;14259:7;14240:15;:13;:15::i;:::-;:26;;:66;;;;;14293:13;;14283:7;:23;14240:66;:152;;;;;14391:1;1819:8;14344:17;:26;14362:7;14344:26;;;;;;;;;;;;:43;:48;14240:152;14220:172;;14146:273;;;:::o;7348:1129::-;7415:7;7435:12;7450:7;7435:22;;7518:4;7499:15;:13;:15::i;:::-;:23;7495:915;;7552:13;;7545:4;:20;7541:869;;;7590:14;7607:17;:23;7625:4;7607:23;;;;;;;;;;;;7590:40;;7723:1;1819:8;7696:6;:23;:28;7692:699;;8215:113;8232:1;8222:6;:11;8215:113;;8275:17;:25;8293:6;;;;;;;8275:25;;;;;;;;;;;;8266:34;;8215:113;;;8361:6;8354:13;;;;;;7692:699;7567:843;7541:869;7495:915;8438:31;;;;;;;;;;;;;;7348:1129;;;;:::o;28128:105::-;28188:7;28215:10;28208:17;;28128:105;:::o;3608:92::-;3664:7;3608:92;:::o;19385:2515::-;19500:27;19530;19549:7;19530:18;:27::i;:::-;19500:57;;19615:4;19574:45;;19590:19;19574:45;;;19570:86;;19628:28;;;;;;;;;;;;;;19570:86;19669:22;19718:4;19695:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;19739:43;19756:4;19762:19;:17;:19::i;:::-;19739:16;:43::i;:::-;19695:87;:147;;;;19823:19;:17;:19::i;:::-;19799:43;;:20;19811:7;19799:11;:20::i;:::-;:43;;;19695:147;19669:174;;19861:17;19856:66;;19887:35;;;;;;;;;;;;;;19856:66;19951:1;19937:16;;:2;:16;;;19933:52;;19962:23;;;;;;;;;;;;;;19933:52;19998:43;20020:4;20026:2;20030:7;20039:1;19998:21;:43::i;:::-;20114:15;:24;20130:7;20114:24;;;;;;;;;;;;20107:31;;;;;;;;;;;20506:18;:24;20525:4;20506:24;;;;;;;;;;;;;;;;20504:26;;;;;;;;;;;;20575:18;:22;20594:2;20575:22;;;;;;;;;;;;;;;;20573:24;;;;;;;;;;;2101:8;1703:3;20956:15;:41;;20914:21;20932:2;20914:17;:21::i;:::-;:84;:128;20868:17;:26;20886:7;20868:26;;;;;;;;;;;:174;;;;21212:1;2101:8;21162:19;:46;:51;21158:626;;21234:19;21266:1;21256:7;:11;21234:33;;21423:1;21389:17;:30;21407:11;21389:30;;;;;;;;;;;;:35;21385:384;;21527:13;;21512:11;:28;21508:242;;21707:19;21674:17;:30;21692:11;21674:30;;;;;;;;;;;:52;;;;21508:242;21385:384;21215:569;21158:626;21831:7;21827:2;21812:27;;21821:4;21812:27;;;;;;;;;;;;21850:42;21871:4;21877:2;21881:7;21890:1;21850:20;:42::i;:::-;19489:2411;;19385:2515;;;:::o;656:98:0:-;709:7;736:10;729:17;;656:98;:::o;2333:191:3:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;17475:1656:1:-;17540:20;17563:13;;17540:36;;17605:1;17591:16;;:2;:16;;;17587:48;;17616:19;;;;;;;;;;;;;;17587:48;17662:1;17650:8;:13;17646:44;;17672:18;;;;;;;;;;;;;;17646:44;17703:61;17733:1;17737:2;17741:12;17755:8;17703:21;:61::i;:::-;18307:1;1186:2;18278:1;:25;;18277:31;18265:8;:44;18239:18;:22;18258:2;18239:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1966:3;18708:29;18735:1;18723:8;:13;18708:14;:29::i;:::-;:56;;1703:3;18645:15;:41;;18603:21;18621:2;18603:17;:21::i;:::-;:84;:162;18552:17;:31;18570:12;18552:31;;;;;;;;;;;:213;;;;18782:20;18805:12;18782:35;;18832:11;18861:8;18846:12;:23;18832:37;;18886:111;18938:14;;;;;;18934:2;18913:40;;18930:1;18913:40;;;;;;;;;;;;18992:3;18977:12;:18;18886:111;;19029:12;19013:13;:28;;;;18016:1037;;19063:60;19092:1;19096:2;19100:12;19114:8;19063:20;:60::i;:::-;17529:1602;17475:1656;;:::o;6058:716:5:-;6161:13;;:::i;:::-;6186:25;6231:6;6214:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;6186:52;;6245:17;6282:1;6276:2;6266:7;:12;;;;:::i;:::-;6265:18;;;;:::i;:::-;6245:38;;6290:18;6311:54;6336:12;6353:9;6349:1;:13;;;;:::i;:::-;6336:27;;;;;;;;:::i;:::-;;;;;;;;;;6330:34;;6311:18;:54::i;:::-;6290:75;;6388:380;;;;;;;;6405:15;6388:380;;;;6431:12;6388:380;;;;;;6454:158;6486:12;6515:9;6511:1;:13;;;;:::i;:::-;6541:9;6537:1;:13;;;;:::i;:::-;6567:9;6563:1;:13;;;;:::i;:::-;6589:12;6454:158;;:19;:158::i;:::-;6388:380;;;;6623:136;6658:12;6687:9;6683:1;:13;;;;:::i;:::-;6713:9;6709:1;:13;;;;:::i;:::-;6739:9;6735:1;:13;;;;:::i;:::-;6623:22;:136::i;:::-;6388:380;;;6374:394;;;;;6058:716;;;;:::o;25597::1:-;25760:4;25806:2;25781:45;;;25827:19;:17;:19::i;:::-;25848:4;25854:7;25863:5;25781:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25777:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26081:1;26064:6;:13;:18;26060:235;;26110:40;;;;;;;;;;;;;;26060:235;26253:6;26247:13;26238:6;26234:2;26230:15;26223:38;25777:529;25950:54;;;25940:64;;;:6;:64;;;;25933:71;;;25597:716;;;;;;:::o;3266:118:5:-;3318:13;3340:38;;;;;;;;;;;;;;;;;;;3266:118;:::o;342:723:4:-;398:13;628:1;619:5;:10;615:53;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;791:1912:6:-;849:13;894:1;879:4;:11;:16;875:31;;897:9;;;;;;;;;;;;;;;;875:31;958:19;980:12;;;;;;;;;;;;;;;;;958:34;;1044:18;1090:1;1085;1071:4;:11;:15;;;;:::i;:::-;1070:21;;;;:::i;:::-;1065:1;:27;;;;:::i;:::-;1044:48;;1175:20;1222:2;1209:10;:15;;;;:::i;:::-;1198:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1175:50;;1322:10;1314:6;1307:26;1417:1;1410:5;1406:13;1476:4;1527;1521:11;1512:7;1508:25;1623:2;1615:6;1611:15;1696:754;1715:6;1706:7;1703:19;1696:754;;;1815:1;1806:7;1802:15;1791:26;;1854:7;1848:14;1980:4;1972:5;1968:2;1964:14;1960:25;1950:8;1946:40;1940:47;1929:9;1921:67;2034:1;2023:9;2019:17;2006:30;;2113:4;2105:5;2101:2;2097:14;2093:25;2083:8;2079:40;2073:47;2062:9;2054:67;2167:1;2156:9;2152:17;2139:30;;2246:4;2238:5;2235:1;2230:14;2226:25;2216:8;2212:40;2206:47;2195:9;2187:67;2300:1;2289:9;2285:17;2272:30;;2379:4;2371:5;2359:25;2349:8;2345:40;2339:47;2328:9;2320:67;2433:1;2422:9;2418:17;2405:30;;1739:711;1696:754;;;2523:1;2516:4;2510:11;2506:19;2544:1;2539:54;;;;2612:1;2607:52;;;;2499:160;;2539:54;2583:6;2578:3;2574:16;2570:1;2559:9;2555:17;2548:43;2539:54;;2607:52;2651:4;2646:3;2642:14;2638:1;2627:9;2623:17;2616:41;2499:160;;1247:1423;;;;2689:6;2682:13;;;;;791:1912;;;;:::o;3390:761:5:-;3494:13;3579:10;:8;:10::i;:::-;3602:523;3691:8;3700:6;:19;;;3691:29;;;;;;;;;:::i;:::-;;;3792:20;3793:7;3792:18;:20::i;:::-;3920:29;3942:6;3920:21;:29::i;:::-;4043:33;4057:18;4068:6;4057:10;:18::i;:::-;4043:13;:33::i;:::-;3630:482;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3602:13;:523::i;:::-;3550:586;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3519:626;;3390:761;;;;:::o;26961:159:1:-;;;;;:::o;11133:148::-;11197:14;11258:5;11248:15;;11133:148;;;:::o;27779:158::-;;;;;:::o;11368:142::-;11426:14;11487:5;11477:15;;11368:142;;;:::o;5788:264:5:-;5852:5;5866:12;5890:3;5881:6;:12;;;;:::i;:::-;5866:27;;5916:2;5906:6;:12;;;5902:115;;5936:1;5929:8;;;;;5902:115;5977:2;5967:6;:12;;;5963:54;;5997:1;5990:8;;;;;5963:54;6032:1;6025:8;;;5788:264;;;;:::o;6780:485::-;6961:12;;:::i;:::-;6996:263;7023:38;7048:12;7023:24;:38::i;:::-;7072:40;7099:12;7072:26;:40::i;:::-;7123:127;;;;;;;;7147:6;7154:8;7147:16;;;;;;;;:::i;:::-;;;;;;;;;;7141:23;;7123:127;;;;;;7183:6;7190:10;7183:18;;;;;;;;:::i;:::-;;;;;;;;;;7177:25;;7123:127;;;;;;7221:6;7228:9;7221:17;;;;;;;;:::i;:::-;;;;;;;;;;7215:24;;7123:127;;;;;6996:16;:263::i;:::-;6982:277;;6780:485;;;;;;;:::o;7964:420::-;8121:12;;:::i;:::-;8156:222;8183:17;;;;;;;;8189:2;8183:17;;;;;;8193:2;8183:17;;;;;;8197:2;8183:17;;;;;8211:20;;;;;;;;8217:3;8211:20;;;;;;8222:3;8211:20;;;;;;8227:3;8211:20;;;;;8242:127;;;;;;;;8266:6;8273:8;8266:16;;;;;;;;:::i;:::-;;;;;;;;;;8260:23;;8242:127;;;;;;8302:6;8309:10;8302:18;;;;;;;;:::i;:::-;;;;;;;;;;8296:25;;8242:127;;;;;;8340:6;8347:9;8340:17;;;;;;;;:::i;:::-;;;;;;;;;;8334:24;;8242:127;;;;;8156:16;:222::i;:::-;8142:236;;7964:420;;;;;;:::o;4157:465::-;4247:13;4378:8;4387:6;:19;;;4378:29;;;;;;;;;:::i;:::-;;;4474:26;4484:6;:15;;;4474:9;:26::i;:::-;4567:29;4577:6;:18;;;4567:9;:29::i;:::-;4303:304;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4272:344;;4157:465;;;:::o;4628:432::-;4707:12;4772:20;4781:4;4787;4772:8;:20::i;:::-;4878:26;4888:6;:15;;;4878:9;:26::i;:::-;4994:29;5004:6;:18;;;4994:9;:29::i;:::-;4745:309;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4731:323;;4628:432;;;:::o;7271:337::-;7357:12;;:::i;:::-;7394:1;7385:5;:10;7381:222;;7432:17;;;;;;;;7438:2;7432:17;;;;;;7442:2;7432:17;;;;;;7446:2;7432:17;;;;;7425:24;;;;7381:222;7476:1;7467:5;:10;7463:140;;7513:16;;;;;;;;7519:1;7513:16;;;;;;7522:2;7513:16;;;;;;7526:2;7513:16;;;;;7506:23;;;;7463:140;7579:16;;;;;;;;7585:2;7579:16;;;;;;7589:2;7579:16;;;;;;7593:1;7579:16;;;;;7572:23;;7271:337;;;;:::o;7614:344::-;7702:12;;:::i;:::-;7739:1;7730:5;:10;7726:227;;7777:20;;;;;;;;7783:3;7777:20;;;;;;7788:3;7777:20;;;;;;7793:3;7777:20;;;;;7770:27;;;;7726:227;7824:1;7815:5;:10;7811:142;;7861:17;;;;;;;;7867:2;7861:17;;;;;;7871:2;7861:17;;;;;;7875:2;7861:17;;;;;7854:24;;;;7811:142;7928:17;;;;;;;;7934:2;7928:17;;;;;;7938:2;7928:17;;;;;;7942:2;7928:17;;;;;7921:24;;7614:344;;;;:::o;8390:715::-;8521:18;;:::i;:::-;8548:15;8651:3;8635:6;:11;;;8627:20;;8604:6;:12;;;8596:21;;8575:6;:10;;;8567:19;;:50;;;;:::i;:::-;:80;;;;:::i;:::-;8566:88;;;;:::i;:::-;8548:106;;8783:3;8772:7;8759:5;:9;;;8754:1;8741:6;:10;;;:14;;;;:::i;:::-;8726:7;:11;;;:30;;;;:::i;:::-;:42;;;;:::i;:::-;8718:51;;:61;;;;:::i;:::-;8717:69;;;;:::i;:::-;8682:5;:9;;;:113;;;;:::i;:::-;8663:5;:9;;:132;;;;;;;;;;;8943:3;8921:7;8906:5;:11;;;8901:1;8886:6;:12;;;:16;;;;:::i;:::-;8869:7;:13;;;:34;;;;:::i;:::-;:48;;;;:::i;:::-;8861:57;;:67;;;;:::i;:::-;8860:86;;;;:::i;:::-;8823:5;:11;;;:132;;;;:::i;:::-;8802:5;:11;;:153;;;;;;;;;;;9087:3;9076:7;9062:5;:10;;;9057:1;9043:6;:11;;;:15;;;;:::i;:::-;9027:7;:12;;;:32;;;;:::i;:::-;:45;;;;:::i;:::-;9019:54;;:64;;;;:::i;:::-;9018:72;;;;:::i;:::-;8982:5;:10;;;:117;;;;:::i;:::-;8962:5;:10;;:137;;;;;;;;;;;8541:564;8390:715;;;;;:::o;5066:352::-;5127:13;5228:29;5236:5;:9;;;5228:18;;:27;:29::i;:::-;5286:31;5294:5;:11;;;5286:20;;:29;:31::i;:::-;5346:30;5354:5;:10;;;5346:19;;:28;:30::i;:::-;5180:223;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5149:263;;5066:352;;;:::o;5424:358::-;5510:13;5628:16;:5;:14;:16::i;:::-;5673:17;:6;:15;:17::i;:::-;5566:201;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5535:241;;5424:358;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:7:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:108::-;6327:24;6345:5;6327:24;:::i;:::-;6322:3;6315:37;6250:108;;:::o;6364:86::-;6399:7;6439:4;6432:5;6428:16;6417:27;;6364:86;;;:::o;6456:102::-;6529:22;6545:5;6529:22;:::i;:::-;6524:3;6517:35;6456:102;;:::o;6628:655::-;6761:4;6756:3;6752:14;6847:4;6840:5;6836:16;6830:23;6866:59;6919:4;6914:3;6910:14;6896:12;6866:59;:::i;:::-;6776:159;7018:4;7011:5;7007:16;7001:23;7037:59;7090:4;7085:3;7081:14;7067:12;7037:59;:::i;:::-;6945:161;7188:4;7181:5;7177:16;7171:23;7207:59;7260:4;7255:3;7251:14;7237:12;7207:59;:::i;:::-;7116:160;6730:553;6628:655;;:::o;7355:967::-;7500:6;7495:3;7491:16;7594:4;7587:5;7583:16;7577:23;7613:63;7670:4;7665:3;7661:14;7647:12;7613:63;:::i;:::-;7517:169;7776:4;7769:5;7765:16;7759:23;7795:59;7848:4;7843:3;7839:14;7825:12;7795:59;:::i;:::-;7696:168;7950:4;7943:5;7939:16;7933:23;7969:109;8072:4;8067:3;8063:14;8049:12;7969:109;:::i;:::-;7874:214;8177:4;8170:5;8166:16;8160:23;8196:109;8299:4;8294:3;8290:14;8276:12;8196:109;:::i;:::-;8098:217;7469:853;7355:967;;:::o;8328:319::-;8469:4;8507:3;8496:9;8492:19;8484:27;;8521:119;8637:1;8626:9;8622:17;8613:6;8521:119;:::i;:::-;8328:319;;;;:::o;8653:116::-;8723:21;8738:5;8723:21;:::i;:::-;8716:5;8713:32;8703:60;;8759:1;8756;8749:12;8703:60;8653:116;:::o;8775:133::-;8818:5;8856:6;8843:20;8834:29;;8872:30;8896:5;8872:30;:::i;:::-;8775:133;;;;:::o;8914:468::-;8979:6;8987;9036:2;9024:9;9015:7;9011:23;9007:32;9004:119;;;9042:79;;:::i;:::-;9004:119;9162:1;9187:53;9232:7;9223:6;9212:9;9208:22;9187:53;:::i;:::-;9177:63;;9133:117;9289:2;9315:50;9357:7;9348:6;9337:9;9333:22;9315:50;:::i;:::-;9305:60;;9260:115;8914:468;;;;;:::o;9388:117::-;9497:1;9494;9487:12;9511:117;9620:1;9617;9610:12;9634:180;9682:77;9679:1;9672:88;9779:4;9776:1;9769:15;9803:4;9800:1;9793:15;9820:281;9903:27;9925:4;9903:27;:::i;:::-;9895:6;9891:40;10033:6;10021:10;10018:22;9997:18;9985:10;9982:34;9979:62;9976:88;;;10044:18;;:::i;:::-;9976:88;10084:10;10080:2;10073:22;9863:238;9820:281;;:::o;10107:129::-;10141:6;10168:20;;:::i;:::-;10158:30;;10197:33;10225:4;10217:6;10197:33;:::i;:::-;10107:129;;;:::o;10242:307::-;10303:4;10393:18;10385:6;10382:30;10379:56;;;10415:18;;:::i;:::-;10379:56;10453:29;10475:6;10453:29;:::i;:::-;10445:37;;10537:4;10531;10527:15;10519:23;;10242:307;;;:::o;10555:154::-;10639:6;10634:3;10629;10616:30;10701:1;10692:6;10687:3;10683:16;10676:27;10555:154;;;:::o;10715:410::-;10792:5;10817:65;10833:48;10874:6;10833:48;:::i;:::-;10817:65;:::i;:::-;10808:74;;10905:6;10898:5;10891:21;10943:4;10936:5;10932:16;10981:3;10972:6;10967:3;10963:16;10960:25;10957:112;;;10988:79;;:::i;:::-;10957:112;11078:41;11112:6;11107:3;11102;11078:41;:::i;:::-;10798:327;10715:410;;;;;:::o;11144:338::-;11199:5;11248:3;11241:4;11233:6;11229:17;11225:27;11215:122;;11256:79;;:::i;:::-;11215:122;11373:6;11360:20;11398:78;11472:3;11464:6;11457:4;11449:6;11445:17;11398:78;:::i;:::-;11389:87;;11205:277;11144:338;;;;:::o;11488:943::-;11583:6;11591;11599;11607;11656:3;11644:9;11635:7;11631:23;11627:33;11624:120;;;11663:79;;:::i;:::-;11624:120;11783:1;11808:53;11853:7;11844:6;11833:9;11829:22;11808:53;:::i;:::-;11798:63;;11754:117;11910:2;11936:53;11981:7;11972:6;11961:9;11957:22;11936:53;:::i;:::-;11926:63;;11881:118;12038:2;12064:53;12109:7;12100:6;12089:9;12085:22;12064:53;:::i;:::-;12054:63;;12009:118;12194:2;12183:9;12179:18;12166:32;12225:18;12217:6;12214:30;12211:117;;;12247:79;;:::i;:::-;12211:117;12352:62;12406:7;12397:6;12386:9;12382:22;12352:62;:::i;:::-;12342:72;;12137:287;11488:943;;;;;;;:::o;12437:474::-;12505:6;12513;12562:2;12550:9;12541:7;12537:23;12533:32;12530:119;;;12568:79;;:::i;:::-;12530:119;12688:1;12713:53;12758:7;12749:6;12738:9;12734:22;12713:53;:::i;:::-;12703:63;;12659:117;12815:2;12841:53;12886:7;12877:6;12866:9;12862:22;12841:53;:::i;:::-;12831:63;;12786:118;12437:474;;;;;:::o;12917:180::-;12965:77;12962:1;12955:88;13062:4;13059:1;13052:15;13086:4;13083:1;13076:15;13103:320;13147:6;13184:1;13178:4;13174:12;13164:22;;13231:1;13225:4;13221:12;13252:18;13242:81;;13308:4;13300:6;13296:17;13286:27;;13242:81;13370:2;13362:6;13359:14;13339:18;13336:38;13333:84;;13389:18;;:::i;:::-;13333:84;13154:269;13103:320;;;:::o;13429:182::-;13569:34;13565:1;13557:6;13553:14;13546:58;13429:182;:::o;13617:366::-;13759:3;13780:67;13844:2;13839:3;13780:67;:::i;:::-;13773:74;;13856:93;13945:3;13856:93;:::i;:::-;13974:2;13969:3;13965:12;13958:19;;13617:366;;;:::o;13989:419::-;14155:4;14193:2;14182:9;14178:18;14170:26;;14242:9;14236:4;14232:20;14228:1;14217:9;14213:17;14206:47;14270:131;14396:4;14270:131;:::i;:::-;14262:139;;13989:419;;;:::o;14414:171::-;14554:23;14550:1;14542:6;14538:14;14531:47;14414:171;:::o;14591:366::-;14733:3;14754:67;14818:2;14813:3;14754:67;:::i;:::-;14747:74;;14830:93;14919:3;14830:93;:::i;:::-;14948:2;14943:3;14939:12;14932:19;;14591:366;;;:::o;14963:419::-;15129:4;15167:2;15156:9;15152:18;15144:26;;15216:9;15210:4;15206:20;15202:1;15191:9;15187:17;15180:47;15244:131;15370:4;15244:131;:::i;:::-;15236:139;;14963:419;;;:::o;15388:167::-;15528:19;15524:1;15516:6;15512:14;15505:43;15388:167;:::o;15561:366::-;15703:3;15724:67;15788:2;15783:3;15724:67;:::i;:::-;15717:74;;15800:93;15889:3;15800:93;:::i;:::-;15918:2;15913:3;15909:12;15902:19;;15561:366;;;:::o;15933:419::-;16099:4;16137:2;16126:9;16122:18;16114:26;;16186:9;16180:4;16176:20;16172:1;16161:9;16157:17;16150:47;16214:131;16340:4;16214:131;:::i;:::-;16206:139;;15933:419;;;:::o;16358:166::-;16498:18;16494:1;16486:6;16482:14;16475:42;16358:166;:::o;16530:366::-;16672:3;16693:67;16757:2;16752:3;16693:67;:::i;:::-;16686:74;;16769:93;16858:3;16769:93;:::i;:::-;16887:2;16882:3;16878:12;16871:19;;16530:366;;;:::o;16902:419::-;17068:4;17106:2;17095:9;17091:18;17083:26;;17155:9;17149:4;17145:20;17141:1;17130:9;17126:17;17119:47;17183:131;17309:4;17183:131;:::i;:::-;17175:139;;16902:419;;;:::o;17327:168::-;17467:20;17463:1;17455:6;17451:14;17444:44;17327:168;:::o;17501:366::-;17643:3;17664:67;17728:2;17723:3;17664:67;:::i;:::-;17657:74;;17740:93;17829:3;17740:93;:::i;:::-;17858:2;17853:3;17849:12;17842:19;;17501:366;;;:::o;17873:419::-;18039:4;18077:2;18066:9;18062:18;18054:26;;18126:9;18120:4;18116:20;18112:1;18101:9;18097:17;18090:47;18154:131;18280:4;18154:131;:::i;:::-;18146:139;;17873:419;;;:::o;18298:180::-;18346:77;18343:1;18336:88;18443:4;18440:1;18433:15;18467:4;18464:1;18457:15;18484:305;18524:3;18543:20;18561:1;18543:20;:::i;:::-;18538:25;;18577:20;18595:1;18577:20;:::i;:::-;18572:25;;18731:1;18663:66;18659:74;18656:1;18653:81;18650:107;;;18737:18;;:::i;:::-;18650:107;18781:1;18778;18774:9;18767:16;;18484:305;;;;:::o;18795:168::-;18935:20;18931:1;18923:6;18919:14;18912:44;18795:168;:::o;18969:366::-;19111:3;19132:67;19196:2;19191:3;19132:67;:::i;:::-;19125:74;;19208:93;19297:3;19208:93;:::i;:::-;19326:2;19321:3;19317:12;19310:19;;18969:366;;;:::o;19341:419::-;19507:4;19545:2;19534:9;19530:18;19522:26;;19594:9;19588:4;19584:20;19580:1;19569:9;19565:17;19558:47;19622:131;19748:4;19622:131;:::i;:::-;19614:139;;19341:419;;;:::o;19766:191::-;19806:4;19826:20;19844:1;19826:20;:::i;:::-;19821:25;;19860:20;19878:1;19860:20;:::i;:::-;19855:25;;19899:1;19896;19893:8;19890:34;;;19904:18;;:::i;:::-;19890:34;19949:1;19946;19942:9;19934:17;;19766:191;;;;:::o;19963:348::-;20003:7;20026:20;20044:1;20026:20;:::i;:::-;20021:25;;20060:20;20078:1;20060:20;:::i;:::-;20055:25;;20248:1;20180:66;20176:74;20173:1;20170:81;20165:1;20158:9;20151:17;20147:105;20144:131;;;20255:18;;:::i;:::-;20144:131;20303:1;20300;20296:9;20285:20;;19963:348;;;;:::o;20317:175::-;20457:27;20453:1;20445:6;20441:14;20434:51;20317:175;:::o;20498:366::-;20640:3;20661:67;20725:2;20720:3;20661:67;:::i;:::-;20654:74;;20737:93;20826:3;20737:93;:::i;:::-;20855:2;20850:3;20846:12;20839:19;;20498:366;;;:::o;20870:419::-;21036:4;21074:2;21063:9;21059:18;21051:26;;21123:9;21117:4;21113:20;21109:1;21098:9;21094:17;21087:47;21151:131;21277:4;21151:131;:::i;:::-;21143:139;;20870:419;;;:::o;21295:79::-;21334:7;21363:5;21352:16;;21295:79;;;:::o;21380:157::-;21485:45;21505:24;21523:5;21505:24;:::i;:::-;21485:45;:::i;:::-;21480:3;21473:58;21380:157;;:::o;21543:94::-;21576:8;21624:5;21620:2;21616:14;21595:35;;21543:94;;;:::o;21643:::-;21682:7;21711:20;21725:5;21711:20;:::i;:::-;21700:31;;21643:94;;;:::o;21743:100::-;21782:7;21811:26;21831:5;21811:26;:::i;:::-;21800:37;;21743:100;;;:::o;21849:157::-;21954:45;21974:24;21992:5;21974:24;:::i;:::-;21954:45;:::i;:::-;21949:3;21942:58;21849:157;;:::o;22012:77::-;22049:7;22078:5;22067:16;;22012:77;;;:::o;22095:79::-;22134:7;22163:5;22152:16;;22095:79;;;:::o;22180:157::-;22285:45;22305:24;22323:5;22305:24;:::i;:::-;22285:45;:::i;:::-;22280:3;22273:58;22180:157;;:::o;22343:679::-;22539:3;22554:75;22625:3;22616:6;22554:75;:::i;:::-;22654:2;22649:3;22645:12;22638:19;;22667:75;22738:3;22729:6;22667:75;:::i;:::-;22767:2;22762:3;22758:12;22751:19;;22780:75;22851:3;22842:6;22780:75;:::i;:::-;22880:2;22875:3;22871:12;22864:19;;22893:75;22964:3;22955:6;22893:75;:::i;:::-;22993:2;22988:3;22984:12;22977:19;;23013:3;23006:10;;22343:679;;;;;;;:::o;23028:233::-;23067:3;23090:24;23108:5;23090:24;:::i;:::-;23081:33;;23136:66;23129:5;23126:77;23123:103;;23206:18;;:::i;:::-;23123:103;23253:1;23246:5;23242:13;23235:20;;23028:233;;;:::o;23267:148::-;23369:11;23406:3;23391:18;;23267:148;;;;:::o;23421:214::-;23561:66;23557:1;23549:6;23545:14;23538:90;23421:214;:::o;23641:402::-;23801:3;23822:85;23904:2;23899:3;23822:85;:::i;:::-;23815:92;;23916:93;24005:3;23916:93;:::i;:::-;24034:2;24029:3;24025:12;24018:19;;23641:402;;;:::o;24049:377::-;24155:3;24183:39;24216:5;24183:39;:::i;:::-;24238:89;24320:6;24315:3;24238:89;:::i;:::-;24231:96;;24336:52;24381:6;24376:3;24369:4;24362:5;24358:16;24336:52;:::i;:::-;24413:6;24408:3;24404:16;24397:23;;24159:267;24049:377;;;;:::o;24432:416::-;24572:66;24568:1;24560:6;24556:14;24549:90;24673:66;24668:2;24660:6;24656:15;24649:91;24774:66;24769:2;24761:6;24757:15;24750:91;24432:416;:::o;24854:402::-;25014:3;25035:85;25117:2;25112:3;25035:85;:::i;:::-;25028:92;;25129:93;25218:3;25129:93;:::i;:::-;25247:2;25242:3;25238:12;25231:19;;24854:402;;;:::o;25262:807::-;25596:3;25618:148;25762:3;25618:148;:::i;:::-;25611:155;;25783:95;25874:3;25865:6;25783:95;:::i;:::-;25776:102;;25895:148;26039:3;25895:148;:::i;:::-;25888:155;;26060:3;26053:10;;25262:807;;;;:::o;26075:435::-;26255:3;26277:95;26368:3;26359:6;26277:95;:::i;:::-;26270:102;;26389:95;26480:3;26471:6;26389:95;:::i;:::-;26382:102;;26501:3;26494:10;;26075:435;;;;;:::o;26516:225::-;26656:34;26652:1;26644:6;26640:14;26633:58;26725:8;26720:2;26712:6;26708:15;26701:33;26516:225;:::o;26747:366::-;26889:3;26910:67;26974:2;26969:3;26910:67;:::i;:::-;26903:74;;26986:93;27075:3;26986:93;:::i;:::-;27104:2;27099:3;27095:12;27088:19;;26747:366;;;:::o;27119:419::-;27285:4;27323:2;27312:9;27308:18;27300:26;;27372:9;27366:4;27362:20;27358:1;27347:9;27343:17;27336:47;27400:131;27526:4;27400:131;:::i;:::-;27392:139;;27119:419;;;:::o;27544:256::-;27656:3;27671:75;27742:3;27733:6;27671:75;:::i;:::-;27771:2;27766:3;27762:12;27755:19;;27791:3;27784:10;;27544:256;;;;:::o;27806:180::-;27854:77;27851:1;27844:88;27951:4;27948:1;27941:15;27975:4;27972:1;27965:15;27992:176;28024:1;28041:20;28059:1;28041:20;:::i;:::-;28036:25;;28075:20;28093:1;28075:20;:::i;:::-;28070:25;;28114:1;28104:35;;28119:18;;:::i;:::-;28104:35;28160:1;28157;28153:9;28148:14;;27992:176;;;;:::o;28174:180::-;28222:77;28219:1;28212:88;28319:4;28316:1;28309:15;28343:4;28340:1;28333:15;28360:98;28411:6;28445:5;28439:12;28429:22;;28360:98;;;:::o;28464:168::-;28547:11;28581:6;28576:3;28569:19;28621:4;28616:3;28612:14;28597:29;;28464:168;;;;:::o;28638:360::-;28724:3;28752:38;28784:5;28752:38;:::i;:::-;28806:70;28869:6;28864:3;28806:70;:::i;:::-;28799:77;;28885:52;28930:6;28925:3;28918:4;28911:5;28907:16;28885:52;:::i;:::-;28962:29;28984:6;28962:29;:::i;:::-;28957:3;28953:39;28946:46;;28728:270;28638:360;;;;:::o;29004:640::-;29199:4;29237:3;29226:9;29222:19;29214:27;;29251:71;29319:1;29308:9;29304:17;29295:6;29251:71;:::i;:::-;29332:72;29400:2;29389:9;29385:18;29376:6;29332:72;:::i;:::-;29414;29482:2;29471:9;29467:18;29458:6;29414:72;:::i;:::-;29533:9;29527:4;29523:20;29518:2;29507:9;29503:18;29496:48;29561:76;29632:4;29623:6;29561:76;:::i;:::-;29553:84;;29004:640;;;;;;;:::o;29650:141::-;29706:5;29737:6;29731:13;29722:22;;29753:32;29779:5;29753:32;:::i;:::-;29650:141;;;;:::o;29797:349::-;29866:6;29915:2;29903:9;29894:7;29890:23;29886:32;29883:119;;;29921:79;;:::i;:::-;29883:119;30041:1;30066:63;30121:7;30112:6;30101:9;30097:22;30066:63;:::i;:::-;30056:73;;30012:127;29797:349;;;;:::o;30152:185::-;30192:1;30209:20;30227:1;30209:20;:::i;:::-;30204:25;;30243:20;30261:1;30243:20;:::i;:::-;30238:25;;30282:1;30272:35;;30287:18;;:::i;:::-;30272:35;30329:1;30326;30322:9;30317:14;;30152:185;;;;:::o;30343:214::-;30483:66;30479:1;30471:6;30467:14;30460:90;30343:214;:::o;30563:400::-;30723:3;30744:84;30826:1;30821:3;30744:84;:::i;:::-;30737:91;;30837:93;30926:3;30837:93;:::i;:::-;30955:1;30950:3;30946:11;30939:18;;30563:400;;;:::o;30969:141::-;31018:4;31041:3;31033:11;;31064:3;31061:1;31054:14;31098:4;31095:1;31085:18;31077:26;;30969:141;;;:::o;31140:874::-;31243:3;31280:5;31274:12;31309:36;31335:9;31309:36;:::i;:::-;31361:89;31443:6;31438:3;31361:89;:::i;:::-;31354:96;;31481:1;31470:9;31466:17;31497:1;31492:166;;;;31672:1;31667:341;;;;31459:549;;31492:166;31576:4;31572:9;31561;31557:25;31552:3;31545:38;31638:6;31631:14;31624:22;31616:6;31612:35;31607:3;31603:45;31596:52;;31492:166;;31667:341;31734:38;31766:5;31734:38;:::i;:::-;31794:1;31808:154;31822:6;31819:1;31816:13;31808:154;;;31896:7;31890:14;31886:1;31881:3;31877:11;31870:35;31946:1;31937:7;31933:15;31922:26;;31844:4;31841:1;31837:12;31832:17;;31808:154;;;31991:6;31986:3;31982:16;31975:23;;31674:334;;31459:549;;31247:767;;31140:874;;;;:::o;32020:151::-;32160:3;32156:1;32148:6;32144:14;32137:27;32020:151;:::o;32177:400::-;32337:3;32358:84;32440:1;32435:3;32358:84;:::i;:::-;32351:91;;32451:93;32540:3;32451:93;:::i;:::-;32569:1;32564:3;32560:11;32553:18;;32177:400;;;:::o;32583:166::-;32723:18;32719:1;32711:6;32707:14;32700:42;32583:166;:::o;32755:402::-;32915:3;32936:85;33018:2;33013:3;32936:85;:::i;:::-;32929:92;;33030:93;33119:3;33030:93;:::i;:::-;33148:2;33143:3;33139:12;33132:19;;32755:402;;;:::o;33163:214::-;33303:66;33299:1;33291:6;33287:14;33280:90;33163:214;:::o;33383:402::-;33543:3;33564:85;33646:2;33641:3;33564:85;:::i;:::-;33557:92;;33658:93;33747:3;33658:93;:::i;:::-;33776:2;33771:3;33767:12;33760:19;;33383:402;;;:::o;33791:214::-;33931:66;33927:1;33919:6;33915:14;33908:90;33791:214;:::o;34011:402::-;34171:3;34192:85;34274:2;34269:3;34192:85;:::i;:::-;34185:92;;34286:93;34375:3;34286:93;:::i;:::-;34404:2;34399:3;34395:12;34388:19;;34011:402;;;:::o;34419:214::-;34559:66;34555:1;34547:6;34543:14;34536:90;34419:214;:::o;34639:402::-;34799:3;34820:85;34902:2;34897:3;34820:85;:::i;:::-;34813:92;;34914:93;35003:3;34914:93;:::i;:::-;35032:2;35027:3;35023:12;35016:19;;34639:402;;;:::o;35047:176::-;35187:28;35183:1;35175:6;35171:14;35164:52;35047:176;:::o;35229:402::-;35389:3;35410:85;35492:2;35487:3;35410:85;:::i;:::-;35403:92;;35504:93;35593:3;35504:93;:::i;:::-;35622:2;35617:3;35613:12;35606:19;;35229:402;;;:::o;35637:214::-;35777:66;35773:1;35765:6;35761:14;35754:90;35637:214;:::o;35857:400::-;36017:3;36038:84;36120:1;36115:3;36038:84;:::i;:::-;36031:91;;36131:93;36220:3;36131:93;:::i;:::-;36249:1;36244:3;36240:11;36233:18;;35857:400;;;:::o;36263:2877::-;37344:3;37366:148;37510:3;37366:148;:::i;:::-;37359:155;;37531:92;37619:3;37610:6;37531:92;:::i;:::-;37524:99;;37640:148;37784:3;37640:148;:::i;:::-;37633:155;;37805:148;37949:3;37805:148;:::i;:::-;37798:155;;37970:95;38061:3;38052:6;37970:95;:::i;:::-;37963:102;;38082:148;38226:3;38082:148;:::i;:::-;38075:155;;38247:148;38391:3;38247:148;:::i;:::-;38240:155;;38412:95;38503:3;38494:6;38412:95;:::i;:::-;38405:102;;38524:148;38668:3;38524:148;:::i;:::-;38517:155;;38689:148;38833:3;38689:148;:::i;:::-;38682:155;;38854:95;38945:3;38936:6;38854:95;:::i;:::-;38847:102;;38966:148;39110:3;38966:148;:::i;:::-;38959:155;;39131:3;39124:10;;36263:2877;;;;;;;:::o;39146:170::-;39176:1;39193:18;39209:1;39193:18;:::i;:::-;39188:23;;39225:18;39241:1;39225:18;:::i;:::-;39220:23;;39262:1;39252:35;;39267:18;;:::i;:::-;39252:35;39308:1;39305;39301:9;39296:14;;39146:170;;;;:::o;39322:214::-;39462:66;39458:1;39450:6;39446:14;39439:90;39322:214;:::o;39542:402::-;39702:3;39723:85;39805:2;39800:3;39723:85;:::i;:::-;39716:92;;39817:93;39906:3;39817:93;:::i;:::-;39935:2;39930:3;39926:12;39919:19;;39542:402;;;:::o;39950:315::-;40090:66;40086:1;40078:6;40074:14;40067:90;40191:66;40186:2;40178:6;40174:15;40167:91;39950:315;:::o;40271:402::-;40431:3;40452:85;40534:2;40529:3;40452:85;:::i;:::-;40445:92;;40546:93;40635:3;40546:93;:::i;:::-;40664:2;40659:3;40655:12;40648:19;;40271:402;;;:::o;40679:315::-;40819:66;40815:1;40807:6;40803:14;40796:90;40920:66;40915:2;40907:6;40903:15;40896:91;40679:315;:::o;41000:402::-;41160:3;41181:85;41263:2;41258:3;41181:85;:::i;:::-;41174:92;;41275:93;41364:3;41275:93;:::i;:::-;41393:2;41388:3;41384:12;41377:19;;41000:402;;;:::o;41408:1387::-;41936:3;41958:148;42102:3;41958:148;:::i;:::-;41951:155;;42123:92;42211:3;42202:6;42123:92;:::i;:::-;42116:99;;42232:148;42376:3;42232:148;:::i;:::-;42225:155;;42397:95;42488:3;42479:6;42397:95;:::i;:::-;42390:102;;42509:148;42653:3;42509:148;:::i;:::-;42502:155;;42674:95;42765:3;42756:6;42674:95;:::i;:::-;42667:102;;42786:3;42779:10;;41408:1387;;;;;;:::o;42801:249::-;42941:34;42937:1;42929:6;42925:14;42918:58;43010:32;43005:2;42997:6;42993:15;42986:57;42801:249;:::o;43056:402::-;43216:3;43237:85;43319:2;43314:3;43237:85;:::i;:::-;43230:92;;43331:93;43420:3;43331:93;:::i;:::-;43449:2;43444:3;43440:12;43433:19;;43056:402;;;:::o;43464:290::-;43604:34;43600:1;43592:6;43588:14;43581:58;43673:34;43668:2;43660:6;43656:15;43649:59;43742:4;43737:2;43729:6;43725:15;43718:29;43464:290;:::o;43760:402::-;43920:3;43941:85;44023:2;44018:3;43941:85;:::i;:::-;43934:92;;44035:93;44124:3;44035:93;:::i;:::-;44153:2;44148:3;44144:12;44137:19;;43760:402;;;:::o;44168:159::-;44308:11;44304:1;44296:6;44292:14;44285:35;44168:159;:::o;44333:400::-;44493:3;44514:84;44596:1;44591:3;44514:84;:::i;:::-;44507:91;;44607:93;44696:3;44607:93;:::i;:::-;44725:1;44720:3;44716:11;44709:18;;44333:400;;;:::o;44739:1393::-;45270:3;45292:95;45383:3;45374:6;45292:95;:::i;:::-;45285:102;;45404:148;45548:3;45404:148;:::i;:::-;45397:155;;45569:95;45660:3;45651:6;45569:95;:::i;:::-;45562:102;;45681:148;45825:3;45681:148;:::i;:::-;45674:155;;45846:95;45937:3;45928:6;45846:95;:::i;:::-;45839:102;;45958:148;46102:3;45958:148;:::i;:::-;45951:155;;46123:3;46116:10;;44739:1393;;;;;;:::o;46138:237::-;46176:3;46195:18;46211:1;46195:18;:::i;:::-;46190:23;;46227:18;46243:1;46227:18;:::i;:::-;46222:23;;46317:1;46311:4;46307:12;46304:1;46301:19;46298:45;;;46323:18;;:::i;:::-;46298:45;46367:1;46364;46360:9;46353:16;;46138:237;;;;:::o;46381:185::-;46419:4;46439:18;46455:1;46439:18;:::i;:::-;46434:23;;46471:18;46487:1;46471:18;:::i;:::-;46466:23;;46508:1;46505;46502:8;46499:34;;;46513:18;;:::i;:::-;46499:34;46558:1;46555;46551:9;46543:17;;46381:185;;;;:::o;46572:158::-;46712:6;46708:1;46700:6;46696:14;46689:30;46572:158;:::o;46740:416::-;46900:3;46925:84;47007:1;47002:3;46925:84;:::i;:::-;46918:91;;47022:93;47111:3;47022:93;:::i;:::-;47144:1;47139:3;47135:11;47128:18;;46740:416;;;:::o;47166:159::-;47310:3;47306:1;47298:6;47294:14;47287:27;47166:159;:::o;47335:416::-;47495:3;47520:84;47602:1;47597:3;47520:84;:::i;:::-;47513:91;;47617:93;47706:3;47617:93;:::i;:::-;47739:1;47734:3;47730:11;47723:18;;47335:416;;;:::o;47761:151::-;47901:3;47897:1;47889:6;47885:14;47878:27;47761:151;:::o;47918:400::-;48078:3;48099:84;48181:1;48176:3;48099:84;:::i;:::-;48092:91;;48192:93;48281:3;48192:93;:::i;:::-;48310:1;48305:3;48301:11;48294:18;;47918:400;;;:::o;48324:1659::-;48956:3;48978:148;49122:3;48978:148;:::i;:::-;48971:155;;49143:95;49234:3;49225:6;49143:95;:::i;:::-;49136:102;;49255:148;49399:3;49255:148;:::i;:::-;49248:155;;49420:95;49511:3;49502:6;49420:95;:::i;:::-;49413:102;;49532:148;49676:3;49532:148;:::i;:::-;49525:155;;49697:95;49788:3;49779:6;49697:95;:::i;:::-;49690:102;;49809:148;49953:3;49809:148;:::i;:::-;49802:155;;49974:3;49967:10;;48324:1659;;;;;;:::o;49989:168::-;50129:20;50125:1;50117:6;50113:14;50106:44;49989:168;:::o;50163:402::-;50323:3;50344:85;50426:2;50421:3;50344:85;:::i;:::-;50337:92;;50438:93;50527:3;50438:93;:::i;:::-;50556:2;50551:3;50547:12;50540:19;;50163:402;;;:::o;50571:246::-;50711:34;50707:1;50699:6;50695:14;50688:58;50784:21;50779:2;50771:6;50767:15;50760:46;50571:246;:::o;50827:418::-;50987:3;51012:85;51094:2;51089:3;51012:85;:::i;:::-;51005:92;;51110:93;51199:3;51110:93;:::i;:::-;51232:2;51227:3;51223:12;51216:19;;50827:418;;;:::o;51255:1261::-;51738:3;51764:148;51908:3;51764:148;:::i;:::-;51757:155;;51933:95;52024:3;52015:6;51933:95;:::i;:::-;51926:102;;52049:148;52193:3;52049:148;:::i;:::-;52042:155;;52218:95;52309:3;52300:6;52218:95;:::i;:::-;52211:102;;52334:148;52478:3;52334:148;:::i;:::-;52327:155;;52503:3;52496:10;;51255:1261;;;;;:::o

Swarm Source

ipfs://cec81de791c304b21aea4e5482f16d965eb4366dc0586a29b246084ed87614b1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.