ERC-721
NFT
Overview
Max Total Supply
7,777 Enfants Terribles
Holders
2,410
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 Enfants TerriblesLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EnfantsTerribles
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-14 */ // File: contracts/IERC721A.sol // 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: contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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 (_addressToUint256(owner) == 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 (_addressToUint256(to) == 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 (_addressToUint256(to) == 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(); address approvedAddress = _tokenApprovals[tokenId]; bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (_addressToUint256(to) == 0) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { 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)); address approvedAddress = _tokenApprovals[tokenId]; if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { 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: @openzeppelin/contracts/utils/Strings.sol // 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); } } // File: @openzeppelin/contracts/utils/Context.sol // 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: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: contracts/Enfants.sol pragma solidity ^0.8.13; contract EnfantsTerribles is ERC721A, Ownable { using Strings for uint; enum Step { StandBy, WhitelistSale, PublicSale, SoldOut, Reveal } string public baseURI; string public notRevealedURI; Step public sellingStep; uint private constant MAX_SUPPLY = 7777; uint private constant MAX_TEAM = 777; uint private constant MAX_TX = 3; bool private isRevealed = false; uint public price = 0.0084 ether; bytes32 public merkleRoot; mapping(address => uint) public FreeMintCount; constructor(string memory _baseURI, bytes32 _merkleRoot) ERC721A("Enfants", "Enfants Terribles") { baseURI = _baseURI; merkleRoot = _merkleRoot; } modifier isNotContract() { require(tx.origin == msg.sender, "Reentrancy Guard is watching"); _; } function teamMint(address _to, uint _quantity) external payable onlyOwner { require(totalSupply() + _quantity <= MAX_TEAM, "NFT can't be minted anymore"); _safeMint(_to, _quantity); } function whitelistMint(address _account, uint _quantity, bytes32[] calldata _proof) external payable isNotContract { uint payCount = _quantity; require(sellingStep == Step.WhitelistSale, "Whitelist Mint is not activated"); require(isWhiteListed(msg.sender, _proof), "Not whitelisted"); require(totalSupply() + _quantity <= MAX_SUPPLY, "NFT can't be minted anymore"); require(_quantity <= MAX_TX, "Exceeded Max per TX"); if(FreeMintCount[msg.sender] < 1){ if (_quantity >1) { payCount = _quantity - 1; } else{ payCount = 0; } FreeMintCount[msg.sender] = 1; } require(msg.value >= payCount * price, "Incorrect amount of ETH"); _safeMint(_account, _quantity); } function publicMint(address _account, uint _quantity) external payable isNotContract { uint payCount = _quantity; require(sellingStep == Step.PublicSale, "Only those Whitelisted can mint now"); require(totalSupply() + _quantity <= MAX_SUPPLY, "NFT can't be minted anymore"); require(_quantity <= MAX_TX, "Exceeded Max per TX"); if(FreeMintCount[msg.sender] < 1){ if (_quantity >1) { payCount = _quantity - 1; } else{ payCount = 0; } FreeMintCount[msg.sender] = 1; } require(msg.value >= payCount * price, "Incorrect amount of ETH"); _safeMint(_account, _quantity); } function setBaseUri(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } function setStep(uint _step) external onlyOwner { sellingStep = Step(_step); sellingStep == Step.Reveal; } function revealCollection() external onlyOwner { isRevealed = true; } function tokenURI(uint _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "URI query for nonexistent token"); if(isRevealed == true) { return string(abi.encodePacked(baseURI, _tokenId.toString(), ".json")); } else { return string(abi.encodePacked(baseURI, notRevealedURI)); } } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function isWhiteListed(address _account, bytes32[] calldata _proof) internal view returns(bool) { return _verify(leaf(_account), _proof); } function leaf(address _account) internal pure returns(bytes32) { return keccak256(abi.encodePacked(_account)); } function _verify(bytes32 _leaf, bytes32[] memory _proof) internal view returns(bool) { return MerkleProof.verify(_proof, merkleRoot, _leaf); } function withdraw(uint amount) public onlyOwner { payable(msg.sender).transfer(amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"FreeMintCount","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealCollection","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":[],"name":"sellingStep","outputs":[{"internalType":"enum EnfantsTerribles.Step","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_step","type":"uint256"}],"name":"setStep","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":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","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":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600b60016101000a81548160ff021916908315150217905550661dd7c1681d0000600c553480156200003757600080fd5b50604051620045023803806200450283398181016040528101906200005d9190620003f1565b6040518060400160405280600781526020017f456e66616e7473000000000000000000000000000000000000000000000000008152506040518060400160405280601181526020017f456e66616e7473205465727269626c65730000000000000000000000000000008152508160029081620000da9190620006a2565b508060039081620000ec9190620006a2565b50620000fd6200014660201b60201c565b600081905550505062000125620001196200014b60201b60201c565b6200015360201b60201c565b8160099081620001369190620006a2565b5080600d81905550505062000789565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002828262000237565b810181811067ffffffffffffffff82111715620002a457620002a362000248565b5b80604052505050565b6000620002b962000219565b9050620002c7828262000277565b919050565b600067ffffffffffffffff821115620002ea57620002e962000248565b5b620002f58262000237565b9050602081019050919050565b60005b838110156200032257808201518184015260208101905062000305565b8381111562000332576000848401525b50505050565b60006200034f6200034984620002cc565b620002ad565b9050828152602081018484840111156200036e576200036d62000232565b5b6200037b84828562000302565b509392505050565b600082601f8301126200039b576200039a6200022d565b5b8151620003ad84826020860162000338565b91505092915050565b6000819050919050565b620003cb81620003b6565b8114620003d757600080fd5b50565b600081519050620003eb81620003c0565b92915050565b600080604083850312156200040b576200040a62000223565b5b600083015167ffffffffffffffff8111156200042c576200042b62000228565b5b6200043a8582860162000383565b92505060206200044d85828601620003da565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004aa57607f821691505b602082108103620004c057620004bf62000462565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200052a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004eb565b620005368683620004eb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005836200057d62000577846200054e565b62000558565b6200054e565b9050919050565b6000819050919050565b6200059f8362000562565b620005b7620005ae826200058a565b848454620004f8565b825550505050565b600090565b620005ce620005bf565b620005db81848462000594565b505050565b5b818110156200060357620005f7600082620005c4565b600181019050620005e1565b5050565b601f82111562000652576200061c81620004c6565b6200062784620004db565b8101602085101562000637578190505b6200064f6200064685620004db565b830182620005e0565b50505b505050565b600082821c905092915050565b6000620006776000198460080262000657565b1980831691505092915050565b600062000692838362000664565b9150826002028217905092915050565b620006ad8262000457565b67ffffffffffffffff811115620006c957620006c862000248565b5b620006d5825462000491565b620006e282828562000607565b600060209050601f8311600181146200071a576000841562000705578287015190505b62000711858262000684565b86555062000781565b601f1984166200072a86620004c6565b60005b8281101562000754578489015182556001820191506020850194506020810190506200072d565b8683101562000774578489015162000770601f89168262000664565b8355505b6001600288020188555050505b505050505050565b613d6980620007996000396000f3fe6080604052600436106101d85760003560e01c8063715018a611610102578063add5a4fa11610095578063ce6df2b911610064578063ce6df2b91461067c578063e985e9c514610698578063f2fde38b146106d5578063f8dcbddb146106fe576101d8565b8063add5a4fa146105cf578063b88d4fde146105eb578063c87b56dd14610614578063cbccefb214610651576101d8565b806395d89b41116100d157806395d89b4114610527578063a035b1fe14610552578063a0bcfc7f1461057d578063a22cb465146105a6576101d8565b8063715018a61461049157806372250380146104a85780637cb64759146104d35780638da5cb5b146104fc576101d8565b80632e1a7d4d1161017a5780634b11faaf116101495780634b11faaf146103d05780636352211e146103ec5780636c0360eb1461042957806370a0823114610454576101d8565b80632e1a7d4d1461033c5780632eb4a7ab1461036557806340d0b4a91461039057806342842e0e146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d65780632df2d9e8146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff91906128de565b610727565b6040516102119190612926565b60405180910390f35b34801561022657600080fd5b5061022f6107b9565b60405161023c91906129da565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612a32565b61084b565b6040516102799190612aa0565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612ae7565b6108c7565b005b3480156102b757600080fd5b506102c0610a6d565b6040516102cd9190612b36565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612b51565b610a84565b005b34801561030b57600080fd5b5061032660048036038101906103219190612ba4565b610a94565b6040516103339190612b36565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e9190612a32565b610aac565b005b34801561037157600080fd5b5061037a610b72565b6040516103879190612bea565b60405180910390f35b34801561039c57600080fd5b506103a5610b78565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190612b51565b610c11565b005b6103ea60048036038101906103e59190612c6a565b610c31565b005b3480156103f857600080fd5b50610413600480360381019061040e9190612a32565b610f10565b6040516104209190612aa0565b60405180910390f35b34801561043557600080fd5b5061043e610f22565b60405161044b91906129da565b60405180910390f35b34801561046057600080fd5b5061047b60048036038101906104769190612ba4565b610fb0565b6040516104889190612b36565b60405180910390f35b34801561049d57600080fd5b506104a6611044565b005b3480156104b457600080fd5b506104bd6110cc565b6040516104ca91906129da565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190612d0a565b61115a565b005b34801561050857600080fd5b506105116111e0565b60405161051e9190612aa0565b60405180910390f35b34801561053357600080fd5b5061053c61120a565b60405161054991906129da565b60405180910390f35b34801561055e57600080fd5b5061056761129c565b6040516105749190612b36565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190612e67565b6112a2565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190612edc565b611331565b005b6105e960048036038101906105e49190612ae7565b6114a8565b005b3480156105f757600080fd5b50610612600480360381019061060d9190612fbd565b611589565b005b34801561062057600080fd5b5061063b60048036038101906106369190612a32565b6115fc565b60405161064891906129da565b60405180910390f35b34801561065d57600080fd5b506106666116bf565b60405161067391906130b7565b60405180910390f35b61069660048036038101906106919190612ae7565b6116d2565b005b3480156106a457600080fd5b506106bf60048036038101906106ba91906130d2565b611965565b6040516106cc9190612926565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f79190612ba4565b6119f9565b005b34801561070a57600080fd5b5061072560048036038101906107209190612a32565b611af0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107c890613141565b80601f01602080910402602001604051908101604052809291908181526020018280546107f490613141565b80156108415780601f1061081657610100808354040283529160200191610841565b820191906000526020600020905b81548152906001019060200180831161082457829003601f168201915b5050505050905090565b600061085682611be2565b61088c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d282611c41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610939576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610958611d0d565b73ffffffffffffffffffffffffffffffffffffffff16146109bb576109848161097f611d0d565b611965565b6109ba576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a77611d15565b6001546000540303905090565b610a8f838383611d1a565b505050565b600e6020528060005260406000206000915090505481565b610ab46120df565b73ffffffffffffffffffffffffffffffffffffffff16610ad26111e0565b73ffffffffffffffffffffffffffffffffffffffff1614610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f906131be565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b6e573d6000803e3d6000fd5b5050565b600d5481565b610b806120df565b73ffffffffffffffffffffffffffffffffffffffff16610b9e6111e0565b73ffffffffffffffffffffffffffffffffffffffff1614610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb906131be565b60405180910390fd5b6001600b60016101000a81548160ff021916908315150217905550565b610c2c83838360405180602001604052806000815250611589565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c969061322a565b60405180910390fd5b600083905060016004811115610cb857610cb7613040565b5b600b60009054906101000a900460ff166004811115610cda57610cd9613040565b5b14610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613296565b60405180910390fd5b610d253384846120e7565b610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90613302565b60405180910390fd5b611e6184610d70610a6d565b610d7a9190613351565b1115610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db2906133f3565b60405180910390fd5b6003841115610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df69061345f565b60405180910390fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610eaf576001841115610e6457600184610e5d919061347f565b9050610e69565b600090505b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c5481610ebd91906134b3565b341015610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690613559565b60405180910390fd5b610f098585612145565b5050505050565b6000610f1b82611c41565b9050919050565b60098054610f2f90613141565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5b90613141565b8015610fa85780601f10610f7d57610100808354040283529160200191610fa8565b820191906000526020600020905b815481529060010190602001808311610f8b57829003601f168201915b505050505081565b600080610fbc83612163565b03610ff3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61104c6120df565b73ffffffffffffffffffffffffffffffffffffffff1661106a6111e0565b73ffffffffffffffffffffffffffffffffffffffff16146110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b7906131be565b60405180910390fd5b6110ca600061216d565b565b600a80546110d990613141565b80601f016020809104026020016040519081016040528092919081815260200182805461110590613141565b80156111525780601f1061112757610100808354040283529160200191611152565b820191906000526020600020905b81548152906001019060200180831161113557829003601f168201915b505050505081565b6111626120df565b73ffffffffffffffffffffffffffffffffffffffff166111806111e0565b73ffffffffffffffffffffffffffffffffffffffff16146111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd906131be565b60405180910390fd5b80600d8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461121990613141565b80601f016020809104026020016040519081016040528092919081815260200182805461124590613141565b80156112925780601f1061126757610100808354040283529160200191611292565b820191906000526020600020905b81548152906001019060200180831161127557829003601f168201915b5050505050905090565b600c5481565b6112aa6120df565b73ffffffffffffffffffffffffffffffffffffffff166112c86111e0565b73ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611315906131be565b60405180910390fd5b806009908161132d9190613725565b5050565b611339611d0d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361139d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113aa611d0d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611457611d0d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161149c9190612926565b60405180910390a35050565b6114b06120df565b73ffffffffffffffffffffffffffffffffffffffff166114ce6111e0565b73ffffffffffffffffffffffffffffffffffffffff1614611524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151b906131be565b60405180910390fd5b61030981611530610a6d565b61153a9190613351565b111561157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611572906133f3565b60405180910390fd5b6115858282612145565b5050565b611594848484611d1a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115f6576115bf84848484612233565b6115f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061160782611be2565b611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90613843565b60405180910390fd5b60011515600b60019054906101000a900460ff1615150361169357600961166c83612383565b60405160200161167d92919061396e565b60405160208183030381529060405290506116ba565b6009600a6040516020016116a892919061399d565b60405160208183030381529060405290505b919050565b600b60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611740576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117379061322a565b60405180910390fd5b60008190506002600481111561175957611758613040565b5b600b60009054906101000a900460ff16600481111561177b5761177a613040565b5b146117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290613a33565b60405180910390fd5b611e61826117c7610a6d565b6117d19190613351565b1115611812576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611809906133f3565b60405180910390fd5b6003821115611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d9061345f565b60405180910390fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156119065760018211156118bb576001826118b4919061347f565b90506118c0565b600090505b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c548161191491906134b3565b341015611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90613559565b60405180910390fd5b6119608383612145565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a016120df565b73ffffffffffffffffffffffffffffffffffffffff16611a1f6111e0565b73ffffffffffffffffffffffffffffffffffffffff1614611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c906131be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90613ac5565b60405180910390fd5b611aed8161216d565b50565b611af86120df565b73ffffffffffffffffffffffffffffffffffffffff16611b166111e0565b73ffffffffffffffffffffffffffffffffffffffff1614611b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b63906131be565b60405180910390fd5b806004811115611b7f57611b7e613040565b5b600b60006101000a81548160ff02191690836004811115611ba357611ba2613040565b5b0217905550600480811115611bbb57611bba613040565b5b600b60009054906101000a900460ff166004811115611bdd57611bdc613040565b5b505050565b600081611bed611d15565b11158015611bfc575060005482105b8015611c3a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611c50611d15565b11611cd657600054811015611cd55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611cd3575b60008103611cc9576004600083600190039350838152602001908152602001600020549050611c9f565b8092505050611d08565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611d2582611c41565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d8c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611de5611d0d565b73ffffffffffffffffffffffffffffffffffffffff161480611e145750611e1386611e0e611d0d565b611965565b5b80611e515750611e22611d0d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611e8a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e9586612163565b03611ecc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ed986868660016124e3565b6000611ee483612163565b14611f20576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611fe787612163565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361206f576000600185019050600060046000838152602001908152602001600020540361206d57600054811461206c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120d786868660016124e9565b505050505050565b600033905090565b600061213c6120f5856124ef565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061251f565b90509392505050565b61215f828260405180602001604052806000815250612536565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612259611d0d565b8786866040518563ffffffff1660e01b815260040161227b9493929190613b3a565b6020604051808303816000875af19250505080156122b757506040513d601f19601f820116820180604052508101906122b49190613b9b565b60015b612330573d80600081146122e7576040519150601f19603f3d011682016040523d82523d6000602084013e6122ec565b606091505b506000815103612328576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082036123ca576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124de565b600082905060005b600082146123fc5780806123e590613bc8565b915050600a826123f59190613c3f565b91506123d2565b60008167ffffffffffffffff81111561241857612417612d3c565b5b6040519080825280601f01601f19166020018201604052801561244a5781602001600182028036833780820191505090505b5090505b600085146124d757600182612463919061347f565b9150600a856124729190613c70565b603061247e9190613351565b60f81b81838151811061249457612493613ca1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124d09190613c3f565b945061244e565b8093505050505b919050565b50505050565b50505050565b6000816040516020016125029190613d18565b604051602081830303815290604052805190602001209050919050565b600061252e82600d54856127c5565b905092915050565b600080549050600061254785612163565b0361257e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036125b8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125c560008583866124e3565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161262a600185146127dc565b901b60a042901b61263a86612163565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461273e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ee6000878480600101955087612233565b612724576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061267f57826000541461273957600080fd5b6127a9565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061273f575b8160008190555050506127bf60008583866124e9565b50505050565b6000826127d285846127e6565b1490509392505050565b6000819050919050565b60008082905060005b845181101561285057600085828151811061280d5761280c613ca1565b5b6020026020010151905080831161282f57612828838261285b565b925061283c565b612839818461285b565b92505b50808061284890613bc8565b9150506127ef565b508091505092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128bb81612886565b81146128c657600080fd5b50565b6000813590506128d8816128b2565b92915050565b6000602082840312156128f4576128f361287c565b5b6000612902848285016128c9565b91505092915050565b60008115159050919050565b6129208161290b565b82525050565b600060208201905061293b6000830184612917565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561297b578082015181840152602081019050612960565b8381111561298a576000848401525b50505050565b6000601f19601f8301169050919050565b60006129ac82612941565b6129b6818561294c565b93506129c681856020860161295d565b6129cf81612990565b840191505092915050565b600060208201905081810360008301526129f481846129a1565b905092915050565b6000819050919050565b612a0f816129fc565b8114612a1a57600080fd5b50565b600081359050612a2c81612a06565b92915050565b600060208284031215612a4857612a4761287c565b5b6000612a5684828501612a1d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a8a82612a5f565b9050919050565b612a9a81612a7f565b82525050565b6000602082019050612ab56000830184612a91565b92915050565b612ac481612a7f565b8114612acf57600080fd5b50565b600081359050612ae181612abb565b92915050565b60008060408385031215612afe57612afd61287c565b5b6000612b0c85828601612ad2565b9250506020612b1d85828601612a1d565b9150509250929050565b612b30816129fc565b82525050565b6000602082019050612b4b6000830184612b27565b92915050565b600080600060608486031215612b6a57612b6961287c565b5b6000612b7886828701612ad2565b9350506020612b8986828701612ad2565b9250506040612b9a86828701612a1d565b9150509250925092565b600060208284031215612bba57612bb961287c565b5b6000612bc884828501612ad2565b91505092915050565b6000819050919050565b612be481612bd1565b82525050565b6000602082019050612bff6000830184612bdb565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612c2a57612c29612c05565b5b8235905067ffffffffffffffff811115612c4757612c46612c0a565b5b602083019150836020820283011115612c6357612c62612c0f565b5b9250929050565b60008060008060608587031215612c8457612c8361287c565b5b6000612c9287828801612ad2565b9450506020612ca387828801612a1d565b935050604085013567ffffffffffffffff811115612cc457612cc3612881565b5b612cd087828801612c14565b925092505092959194509250565b612ce781612bd1565b8114612cf257600080fd5b50565b600081359050612d0481612cde565b92915050565b600060208284031215612d2057612d1f61287c565b5b6000612d2e84828501612cf5565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d7482612990565b810181811067ffffffffffffffff82111715612d9357612d92612d3c565b5b80604052505050565b6000612da6612872565b9050612db28282612d6b565b919050565b600067ffffffffffffffff821115612dd257612dd1612d3c565b5b612ddb82612990565b9050602081019050919050565b82818337600083830152505050565b6000612e0a612e0584612db7565b612d9c565b905082815260208101848484011115612e2657612e25612d37565b5b612e31848285612de8565b509392505050565b600082601f830112612e4e57612e4d612c05565b5b8135612e5e848260208601612df7565b91505092915050565b600060208284031215612e7d57612e7c61287c565b5b600082013567ffffffffffffffff811115612e9b57612e9a612881565b5b612ea784828501612e39565b91505092915050565b612eb98161290b565b8114612ec457600080fd5b50565b600081359050612ed681612eb0565b92915050565b60008060408385031215612ef357612ef261287c565b5b6000612f0185828601612ad2565b9250506020612f1285828601612ec7565b9150509250929050565b600067ffffffffffffffff821115612f3757612f36612d3c565b5b612f4082612990565b9050602081019050919050565b6000612f60612f5b84612f1c565b612d9c565b905082815260208101848484011115612f7c57612f7b612d37565b5b612f87848285612de8565b509392505050565b600082601f830112612fa457612fa3612c05565b5b8135612fb4848260208601612f4d565b91505092915050565b60008060008060808587031215612fd757612fd661287c565b5b6000612fe587828801612ad2565b9450506020612ff687828801612ad2565b935050604061300787828801612a1d565b925050606085013567ffffffffffffffff81111561302857613027612881565b5b61303487828801612f8f565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106130805761307f613040565b5b50565b60008190506130918261306f565b919050565b60006130a182613083565b9050919050565b6130b181613096565b82525050565b60006020820190506130cc60008301846130a8565b92915050565b600080604083850312156130e9576130e861287c565b5b60006130f785828601612ad2565b925050602061310885828601612ad2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061315957607f821691505b60208210810361316c5761316b613112565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006131a860208361294c565b91506131b382613172565b602082019050919050565b600060208201905081810360008301526131d78161319b565b9050919050565b7f5265656e7472616e6379204775617264206973207761746368696e6700000000600082015250565b6000613214601c8361294c565b915061321f826131de565b602082019050919050565b6000602082019050818103600083015261324381613207565b9050919050565b7f57686974656c697374204d696e74206973206e6f742061637469766174656400600082015250565b6000613280601f8361294c565b915061328b8261324a565b602082019050919050565b600060208201905081810360008301526132af81613273565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b60006132ec600f8361294c565b91506132f7826132b6565b602082019050919050565b6000602082019050818103600083015261331b816132df565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061335c826129fc565b9150613367836129fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561339c5761339b613322565b5b828201905092915050565b7f4e46542063616e2774206265206d696e74656420616e796d6f72650000000000600082015250565b60006133dd601b8361294c565b91506133e8826133a7565b602082019050919050565b6000602082019050818103600083015261340c816133d0565b9050919050565b7f4578636565646564204d61782070657220545800000000000000000000000000600082015250565b600061344960138361294c565b915061345482613413565b602082019050919050565b600060208201905081810360008301526134788161343c565b9050919050565b600061348a826129fc565b9150613495836129fc565b9250828210156134a8576134a7613322565b5b828203905092915050565b60006134be826129fc565b91506134c9836129fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561350257613501613322565b5b828202905092915050565b7f496e636f727265637420616d6f756e74206f6620455448000000000000000000600082015250565b600061354360178361294c565b915061354e8261350d565b602082019050919050565b6000602082019050818103600083015261357281613536565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135db7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261359e565b6135e5868361359e565b95508019841693508086168417925050509392505050565b6000819050919050565b600061362261361d613618846129fc565b6135fd565b6129fc565b9050919050565b6000819050919050565b61363c83613607565b61365061364882613629565b8484546135ab565b825550505050565b600090565b613665613658565b613670818484613633565b505050565b5b818110156136945761368960008261365d565b600181019050613676565b5050565b601f8211156136d9576136aa81613579565b6136b38461358e565b810160208510156136c2578190505b6136d66136ce8561358e565b830182613675565b50505b505050565b600082821c905092915050565b60006136fc600019846008026136de565b1980831691505092915050565b600061371583836136eb565b9150826002028217905092915050565b61372e82612941565b67ffffffffffffffff81111561374757613746612d3c565b5b6137518254613141565b61375c828285613698565b600060209050601f83116001811461378f576000841561377d578287015190505b6137878582613709565b8655506137ef565b601f19841661379d86613579565b60005b828110156137c5578489015182556001820191506020850194506020810190506137a0565b868310156137e257848901516137de601f8916826136eb565b8355505b6001600288020188555050505b505050505050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061382d601f8361294c565b9150613838826137f7565b602082019050919050565b6000602082019050818103600083015261385c81613820565b9050919050565b600081905092915050565b6000815461387b81613141565b6138858186613863565b945060018216600081146138a057600181146138b5576138e8565b60ff19831686528115158202860193506138e8565b6138be85613579565b60005b838110156138e0578154818901526001820191506020810190506138c1565b838801955050505b50505092915050565b60006138fc82612941565b6139068185613863565b935061391681856020860161295d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613958600583613863565b915061396382613922565b600582019050919050565b600061397a828561386e565b915061398682846138f1565b91506139918261394b565b91508190509392505050565b60006139a9828561386e565b91506139b5828461386e565b91508190509392505050565b7f4f6e6c792074686f73652057686974656c69737465642063616e206d696e742060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b6000613a1d60238361294c565b9150613a28826139c1565b604082019050919050565b60006020820190508181036000830152613a4c81613a10565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613aaf60268361294c565b9150613aba82613a53565b604082019050919050565b60006020820190508181036000830152613ade81613aa2565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613b0c82613ae5565b613b168185613af0565b9350613b2681856020860161295d565b613b2f81612990565b840191505092915050565b6000608082019050613b4f6000830187612a91565b613b5c6020830186612a91565b613b696040830185612b27565b8181036060830152613b7b8184613b01565b905095945050505050565b600081519050613b95816128b2565b92915050565b600060208284031215613bb157613bb061287c565b5b6000613bbf84828501613b86565b91505092915050565b6000613bd3826129fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c0557613c04613322565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c4a826129fc565b9150613c55836129fc565b925082613c6557613c64613c10565b5b828204905092915050565b6000613c7b826129fc565b9150613c86836129fc565b925082613c9657613c95613c10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160601b9050919050565b6000613ce882613cd0565b9050919050565b6000613cfa82613cdd565b9050919050565b613d12613d0d82612a7f565b613cef565b82525050565b6000613d248284613d01565b6014820191508190509291505056fea26469706673582212204a60c8f4632d73d81274afdd7c4a21dafcf2f4b1d8ad660e4d71860105ed667864736f6c634300080f00330000000000000000000000000000000000000000000000000000000000000040ab43abee274b11c3cd5b8f4d14fc37ce66d33b587d8de58aafffc157b84054ce0000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5a56577945364357416d4245695462664b336378376a536f7569464e564b643763376168564b6731466b54390000000000000000000000
Deployed Bytecode
0x6080604052600436106101d85760003560e01c8063715018a611610102578063add5a4fa11610095578063ce6df2b911610064578063ce6df2b91461067c578063e985e9c514610698578063f2fde38b146106d5578063f8dcbddb146106fe576101d8565b8063add5a4fa146105cf578063b88d4fde146105eb578063c87b56dd14610614578063cbccefb214610651576101d8565b806395d89b41116100d157806395d89b4114610527578063a035b1fe14610552578063a0bcfc7f1461057d578063a22cb465146105a6576101d8565b8063715018a61461049157806372250380146104a85780637cb64759146104d35780638da5cb5b146104fc576101d8565b80632e1a7d4d1161017a5780634b11faaf116101495780634b11faaf146103d05780636352211e146103ec5780636c0360eb1461042957806370a0823114610454576101d8565b80632e1a7d4d1461033c5780632eb4a7ab1461036557806340d0b4a91461039057806342842e0e146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d65780632df2d9e8146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff91906128de565b610727565b6040516102119190612926565b60405180910390f35b34801561022657600080fd5b5061022f6107b9565b60405161023c91906129da565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612a32565b61084b565b6040516102799190612aa0565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612ae7565b6108c7565b005b3480156102b757600080fd5b506102c0610a6d565b6040516102cd9190612b36565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612b51565b610a84565b005b34801561030b57600080fd5b5061032660048036038101906103219190612ba4565b610a94565b6040516103339190612b36565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e9190612a32565b610aac565b005b34801561037157600080fd5b5061037a610b72565b6040516103879190612bea565b60405180910390f35b34801561039c57600080fd5b506103a5610b78565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190612b51565b610c11565b005b6103ea60048036038101906103e59190612c6a565b610c31565b005b3480156103f857600080fd5b50610413600480360381019061040e9190612a32565b610f10565b6040516104209190612aa0565b60405180910390f35b34801561043557600080fd5b5061043e610f22565b60405161044b91906129da565b60405180910390f35b34801561046057600080fd5b5061047b60048036038101906104769190612ba4565b610fb0565b6040516104889190612b36565b60405180910390f35b34801561049d57600080fd5b506104a6611044565b005b3480156104b457600080fd5b506104bd6110cc565b6040516104ca91906129da565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190612d0a565b61115a565b005b34801561050857600080fd5b506105116111e0565b60405161051e9190612aa0565b60405180910390f35b34801561053357600080fd5b5061053c61120a565b60405161054991906129da565b60405180910390f35b34801561055e57600080fd5b5061056761129c565b6040516105749190612b36565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190612e67565b6112a2565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190612edc565b611331565b005b6105e960048036038101906105e49190612ae7565b6114a8565b005b3480156105f757600080fd5b50610612600480360381019061060d9190612fbd565b611589565b005b34801561062057600080fd5b5061063b60048036038101906106369190612a32565b6115fc565b60405161064891906129da565b60405180910390f35b34801561065d57600080fd5b506106666116bf565b60405161067391906130b7565b60405180910390f35b61069660048036038101906106919190612ae7565b6116d2565b005b3480156106a457600080fd5b506106bf60048036038101906106ba91906130d2565b611965565b6040516106cc9190612926565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f79190612ba4565b6119f9565b005b34801561070a57600080fd5b5061072560048036038101906107209190612a32565b611af0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107c890613141565b80601f01602080910402602001604051908101604052809291908181526020018280546107f490613141565b80156108415780601f1061081657610100808354040283529160200191610841565b820191906000526020600020905b81548152906001019060200180831161082457829003601f168201915b5050505050905090565b600061085682611be2565b61088c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d282611c41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610939576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610958611d0d565b73ffffffffffffffffffffffffffffffffffffffff16146109bb576109848161097f611d0d565b611965565b6109ba576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a77611d15565b6001546000540303905090565b610a8f838383611d1a565b505050565b600e6020528060005260406000206000915090505481565b610ab46120df565b73ffffffffffffffffffffffffffffffffffffffff16610ad26111e0565b73ffffffffffffffffffffffffffffffffffffffff1614610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f906131be565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b6e573d6000803e3d6000fd5b5050565b600d5481565b610b806120df565b73ffffffffffffffffffffffffffffffffffffffff16610b9e6111e0565b73ffffffffffffffffffffffffffffffffffffffff1614610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb906131be565b60405180910390fd5b6001600b60016101000a81548160ff021916908315150217905550565b610c2c83838360405180602001604052806000815250611589565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c969061322a565b60405180910390fd5b600083905060016004811115610cb857610cb7613040565b5b600b60009054906101000a900460ff166004811115610cda57610cd9613040565b5b14610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613296565b60405180910390fd5b610d253384846120e7565b610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90613302565b60405180910390fd5b611e6184610d70610a6d565b610d7a9190613351565b1115610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db2906133f3565b60405180910390fd5b6003841115610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df69061345f565b60405180910390fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610eaf576001841115610e6457600184610e5d919061347f565b9050610e69565b600090505b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c5481610ebd91906134b3565b341015610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690613559565b60405180910390fd5b610f098585612145565b5050505050565b6000610f1b82611c41565b9050919050565b60098054610f2f90613141565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5b90613141565b8015610fa85780601f10610f7d57610100808354040283529160200191610fa8565b820191906000526020600020905b815481529060010190602001808311610f8b57829003601f168201915b505050505081565b600080610fbc83612163565b03610ff3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61104c6120df565b73ffffffffffffffffffffffffffffffffffffffff1661106a6111e0565b73ffffffffffffffffffffffffffffffffffffffff16146110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b7906131be565b60405180910390fd5b6110ca600061216d565b565b600a80546110d990613141565b80601f016020809104026020016040519081016040528092919081815260200182805461110590613141565b80156111525780601f1061112757610100808354040283529160200191611152565b820191906000526020600020905b81548152906001019060200180831161113557829003601f168201915b505050505081565b6111626120df565b73ffffffffffffffffffffffffffffffffffffffff166111806111e0565b73ffffffffffffffffffffffffffffffffffffffff16146111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd906131be565b60405180910390fd5b80600d8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461121990613141565b80601f016020809104026020016040519081016040528092919081815260200182805461124590613141565b80156112925780601f1061126757610100808354040283529160200191611292565b820191906000526020600020905b81548152906001019060200180831161127557829003601f168201915b5050505050905090565b600c5481565b6112aa6120df565b73ffffffffffffffffffffffffffffffffffffffff166112c86111e0565b73ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611315906131be565b60405180910390fd5b806009908161132d9190613725565b5050565b611339611d0d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361139d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113aa611d0d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611457611d0d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161149c9190612926565b60405180910390a35050565b6114b06120df565b73ffffffffffffffffffffffffffffffffffffffff166114ce6111e0565b73ffffffffffffffffffffffffffffffffffffffff1614611524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151b906131be565b60405180910390fd5b61030981611530610a6d565b61153a9190613351565b111561157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611572906133f3565b60405180910390fd5b6115858282612145565b5050565b611594848484611d1a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115f6576115bf84848484612233565b6115f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061160782611be2565b611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90613843565b60405180910390fd5b60011515600b60019054906101000a900460ff1615150361169357600961166c83612383565b60405160200161167d92919061396e565b60405160208183030381529060405290506116ba565b6009600a6040516020016116a892919061399d565b60405160208183030381529060405290505b919050565b600b60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611740576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117379061322a565b60405180910390fd5b60008190506002600481111561175957611758613040565b5b600b60009054906101000a900460ff16600481111561177b5761177a613040565b5b146117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290613a33565b60405180910390fd5b611e61826117c7610a6d565b6117d19190613351565b1115611812576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611809906133f3565b60405180910390fd5b6003821115611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d9061345f565b60405180910390fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156119065760018211156118bb576001826118b4919061347f565b90506118c0565b600090505b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c548161191491906134b3565b341015611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90613559565b60405180910390fd5b6119608383612145565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a016120df565b73ffffffffffffffffffffffffffffffffffffffff16611a1f6111e0565b73ffffffffffffffffffffffffffffffffffffffff1614611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c906131be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90613ac5565b60405180910390fd5b611aed8161216d565b50565b611af86120df565b73ffffffffffffffffffffffffffffffffffffffff16611b166111e0565b73ffffffffffffffffffffffffffffffffffffffff1614611b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b63906131be565b60405180910390fd5b806004811115611b7f57611b7e613040565b5b600b60006101000a81548160ff02191690836004811115611ba357611ba2613040565b5b0217905550600480811115611bbb57611bba613040565b5b600b60009054906101000a900460ff166004811115611bdd57611bdc613040565b5b505050565b600081611bed611d15565b11158015611bfc575060005482105b8015611c3a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611c50611d15565b11611cd657600054811015611cd55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611cd3575b60008103611cc9576004600083600190039350838152602001908152602001600020549050611c9f565b8092505050611d08565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611d2582611c41565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d8c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611de5611d0d565b73ffffffffffffffffffffffffffffffffffffffff161480611e145750611e1386611e0e611d0d565b611965565b5b80611e515750611e22611d0d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611e8a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e9586612163565b03611ecc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ed986868660016124e3565b6000611ee483612163565b14611f20576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611fe787612163565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361206f576000600185019050600060046000838152602001908152602001600020540361206d57600054811461206c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120d786868660016124e9565b505050505050565b600033905090565b600061213c6120f5856124ef565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061251f565b90509392505050565b61215f828260405180602001604052806000815250612536565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612259611d0d565b8786866040518563ffffffff1660e01b815260040161227b9493929190613b3a565b6020604051808303816000875af19250505080156122b757506040513d601f19601f820116820180604052508101906122b49190613b9b565b60015b612330573d80600081146122e7576040519150601f19603f3d011682016040523d82523d6000602084013e6122ec565b606091505b506000815103612328576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082036123ca576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124de565b600082905060005b600082146123fc5780806123e590613bc8565b915050600a826123f59190613c3f565b91506123d2565b60008167ffffffffffffffff81111561241857612417612d3c565b5b6040519080825280601f01601f19166020018201604052801561244a5781602001600182028036833780820191505090505b5090505b600085146124d757600182612463919061347f565b9150600a856124729190613c70565b603061247e9190613351565b60f81b81838151811061249457612493613ca1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124d09190613c3f565b945061244e565b8093505050505b919050565b50505050565b50505050565b6000816040516020016125029190613d18565b604051602081830303815290604052805190602001209050919050565b600061252e82600d54856127c5565b905092915050565b600080549050600061254785612163565b0361257e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036125b8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125c560008583866124e3565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161262a600185146127dc565b901b60a042901b61263a86612163565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461273e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ee6000878480600101955087612233565b612724576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061267f57826000541461273957600080fd5b6127a9565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061273f575b8160008190555050506127bf60008583866124e9565b50505050565b6000826127d285846127e6565b1490509392505050565b6000819050919050565b60008082905060005b845181101561285057600085828151811061280d5761280c613ca1565b5b6020026020010151905080831161282f57612828838261285b565b925061283c565b612839818461285b565b92505b50808061284890613bc8565b9150506127ef565b508091505092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128bb81612886565b81146128c657600080fd5b50565b6000813590506128d8816128b2565b92915050565b6000602082840312156128f4576128f361287c565b5b6000612902848285016128c9565b91505092915050565b60008115159050919050565b6129208161290b565b82525050565b600060208201905061293b6000830184612917565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561297b578082015181840152602081019050612960565b8381111561298a576000848401525b50505050565b6000601f19601f8301169050919050565b60006129ac82612941565b6129b6818561294c565b93506129c681856020860161295d565b6129cf81612990565b840191505092915050565b600060208201905081810360008301526129f481846129a1565b905092915050565b6000819050919050565b612a0f816129fc565b8114612a1a57600080fd5b50565b600081359050612a2c81612a06565b92915050565b600060208284031215612a4857612a4761287c565b5b6000612a5684828501612a1d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a8a82612a5f565b9050919050565b612a9a81612a7f565b82525050565b6000602082019050612ab56000830184612a91565b92915050565b612ac481612a7f565b8114612acf57600080fd5b50565b600081359050612ae181612abb565b92915050565b60008060408385031215612afe57612afd61287c565b5b6000612b0c85828601612ad2565b9250506020612b1d85828601612a1d565b9150509250929050565b612b30816129fc565b82525050565b6000602082019050612b4b6000830184612b27565b92915050565b600080600060608486031215612b6a57612b6961287c565b5b6000612b7886828701612ad2565b9350506020612b8986828701612ad2565b9250506040612b9a86828701612a1d565b9150509250925092565b600060208284031215612bba57612bb961287c565b5b6000612bc884828501612ad2565b91505092915050565b6000819050919050565b612be481612bd1565b82525050565b6000602082019050612bff6000830184612bdb565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612c2a57612c29612c05565b5b8235905067ffffffffffffffff811115612c4757612c46612c0a565b5b602083019150836020820283011115612c6357612c62612c0f565b5b9250929050565b60008060008060608587031215612c8457612c8361287c565b5b6000612c9287828801612ad2565b9450506020612ca387828801612a1d565b935050604085013567ffffffffffffffff811115612cc457612cc3612881565b5b612cd087828801612c14565b925092505092959194509250565b612ce781612bd1565b8114612cf257600080fd5b50565b600081359050612d0481612cde565b92915050565b600060208284031215612d2057612d1f61287c565b5b6000612d2e84828501612cf5565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d7482612990565b810181811067ffffffffffffffff82111715612d9357612d92612d3c565b5b80604052505050565b6000612da6612872565b9050612db28282612d6b565b919050565b600067ffffffffffffffff821115612dd257612dd1612d3c565b5b612ddb82612990565b9050602081019050919050565b82818337600083830152505050565b6000612e0a612e0584612db7565b612d9c565b905082815260208101848484011115612e2657612e25612d37565b5b612e31848285612de8565b509392505050565b600082601f830112612e4e57612e4d612c05565b5b8135612e5e848260208601612df7565b91505092915050565b600060208284031215612e7d57612e7c61287c565b5b600082013567ffffffffffffffff811115612e9b57612e9a612881565b5b612ea784828501612e39565b91505092915050565b612eb98161290b565b8114612ec457600080fd5b50565b600081359050612ed681612eb0565b92915050565b60008060408385031215612ef357612ef261287c565b5b6000612f0185828601612ad2565b9250506020612f1285828601612ec7565b9150509250929050565b600067ffffffffffffffff821115612f3757612f36612d3c565b5b612f4082612990565b9050602081019050919050565b6000612f60612f5b84612f1c565b612d9c565b905082815260208101848484011115612f7c57612f7b612d37565b5b612f87848285612de8565b509392505050565b600082601f830112612fa457612fa3612c05565b5b8135612fb4848260208601612f4d565b91505092915050565b60008060008060808587031215612fd757612fd661287c565b5b6000612fe587828801612ad2565b9450506020612ff687828801612ad2565b935050604061300787828801612a1d565b925050606085013567ffffffffffffffff81111561302857613027612881565b5b61303487828801612f8f565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106130805761307f613040565b5b50565b60008190506130918261306f565b919050565b60006130a182613083565b9050919050565b6130b181613096565b82525050565b60006020820190506130cc60008301846130a8565b92915050565b600080604083850312156130e9576130e861287c565b5b60006130f785828601612ad2565b925050602061310885828601612ad2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061315957607f821691505b60208210810361316c5761316b613112565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006131a860208361294c565b91506131b382613172565b602082019050919050565b600060208201905081810360008301526131d78161319b565b9050919050565b7f5265656e7472616e6379204775617264206973207761746368696e6700000000600082015250565b6000613214601c8361294c565b915061321f826131de565b602082019050919050565b6000602082019050818103600083015261324381613207565b9050919050565b7f57686974656c697374204d696e74206973206e6f742061637469766174656400600082015250565b6000613280601f8361294c565b915061328b8261324a565b602082019050919050565b600060208201905081810360008301526132af81613273565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b60006132ec600f8361294c565b91506132f7826132b6565b602082019050919050565b6000602082019050818103600083015261331b816132df565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061335c826129fc565b9150613367836129fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561339c5761339b613322565b5b828201905092915050565b7f4e46542063616e2774206265206d696e74656420616e796d6f72650000000000600082015250565b60006133dd601b8361294c565b91506133e8826133a7565b602082019050919050565b6000602082019050818103600083015261340c816133d0565b9050919050565b7f4578636565646564204d61782070657220545800000000000000000000000000600082015250565b600061344960138361294c565b915061345482613413565b602082019050919050565b600060208201905081810360008301526134788161343c565b9050919050565b600061348a826129fc565b9150613495836129fc565b9250828210156134a8576134a7613322565b5b828203905092915050565b60006134be826129fc565b91506134c9836129fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561350257613501613322565b5b828202905092915050565b7f496e636f727265637420616d6f756e74206f6620455448000000000000000000600082015250565b600061354360178361294c565b915061354e8261350d565b602082019050919050565b6000602082019050818103600083015261357281613536565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135db7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261359e565b6135e5868361359e565b95508019841693508086168417925050509392505050565b6000819050919050565b600061362261361d613618846129fc565b6135fd565b6129fc565b9050919050565b6000819050919050565b61363c83613607565b61365061364882613629565b8484546135ab565b825550505050565b600090565b613665613658565b613670818484613633565b505050565b5b818110156136945761368960008261365d565b600181019050613676565b5050565b601f8211156136d9576136aa81613579565b6136b38461358e565b810160208510156136c2578190505b6136d66136ce8561358e565b830182613675565b50505b505050565b600082821c905092915050565b60006136fc600019846008026136de565b1980831691505092915050565b600061371583836136eb565b9150826002028217905092915050565b61372e82612941565b67ffffffffffffffff81111561374757613746612d3c565b5b6137518254613141565b61375c828285613698565b600060209050601f83116001811461378f576000841561377d578287015190505b6137878582613709565b8655506137ef565b601f19841661379d86613579565b60005b828110156137c5578489015182556001820191506020850194506020810190506137a0565b868310156137e257848901516137de601f8916826136eb565b8355505b6001600288020188555050505b505050505050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061382d601f8361294c565b9150613838826137f7565b602082019050919050565b6000602082019050818103600083015261385c81613820565b9050919050565b600081905092915050565b6000815461387b81613141565b6138858186613863565b945060018216600081146138a057600181146138b5576138e8565b60ff19831686528115158202860193506138e8565b6138be85613579565b60005b838110156138e0578154818901526001820191506020810190506138c1565b838801955050505b50505092915050565b60006138fc82612941565b6139068185613863565b935061391681856020860161295d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613958600583613863565b915061396382613922565b600582019050919050565b600061397a828561386e565b915061398682846138f1565b91506139918261394b565b91508190509392505050565b60006139a9828561386e565b91506139b5828461386e565b91508190509392505050565b7f4f6e6c792074686f73652057686974656c69737465642063616e206d696e742060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b6000613a1d60238361294c565b9150613a28826139c1565b604082019050919050565b60006020820190508181036000830152613a4c81613a10565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613aaf60268361294c565b9150613aba82613a53565b604082019050919050565b60006020820190508181036000830152613ade81613aa2565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613b0c82613ae5565b613b168185613af0565b9350613b2681856020860161295d565b613b2f81612990565b840191505092915050565b6000608082019050613b4f6000830187612a91565b613b5c6020830186612a91565b613b696040830185612b27565b8181036060830152613b7b8184613b01565b905095945050505050565b600081519050613b95816128b2565b92915050565b600060208284031215613bb157613bb061287c565b5b6000613bbf84828501613b86565b91505092915050565b6000613bd3826129fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c0557613c04613322565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c4a826129fc565b9150613c55836129fc565b925082613c6557613c64613c10565b5b828204905092915050565b6000613c7b826129fc565b9150613c86836129fc565b925082613c9657613c95613c10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160601b9050919050565b6000613ce882613cd0565b9050919050565b6000613cfa82613cdd565b9050919050565b613d12613d0d82612a7f565b613cef565b82525050565b6000613d248284613d01565b6014820191508190509291505056fea26469706673582212204a60c8f4632d73d81274afdd7c4a21dafcf2f4b1d8ad660e4d71860105ed667864736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040ab43abee274b11c3cd5b8f4d14fc37ce66d33b587d8de58aafffc157b84054ce0000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5a56577945364357416d4245695462664b336378376a536f7569464e564b643763376168564b6731466b54390000000000000000000000
-----Decoded View---------------
Arg [0] : _baseURI (string): ipfs://QmZVWyE6CWAmBEiTbfK3cx7jSouiFNVKd7c7ahVKg1FkT9
Arg [1] : _merkleRoot (bytes32): 0xab43abee274b11c3cd5b8f4d14fc37ce66d33b587d8de58aafffc157b84054ce
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : ab43abee274b11c3cd5b8f4d14fc37ce66d33b587d8de58aafffc157b84054ce
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 697066733a2f2f516d5a56577945364357416d4245695462664b336378376a53
Arg [4] : 6f7569464e564b643763376168564b6731466b54390000000000000000000000
Deployed Bytecode Sourcemap
46904:3981:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13049:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18072:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20140:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19600:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12103:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21026:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47455:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50779:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47421:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49710:83;;;;;;;;;;;;;:::i;:::-;;21267:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48034:755;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17861:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47113:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13728:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43330:103;;;;;;;;;;;;;:::i;:::-;;47141:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50202:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42679:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18241:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47380:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49459:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20416:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47819:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21523:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49801:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47178:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48797:654;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20795:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43588:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49573:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13049:615;13134:4;13449:10;13434:25;;:11;:25;;;;:102;;;;13526:10;13511:25;;:11;:25;;;;13434:102;:179;;;;13603:10;13588:25;;:11;:25;;;;13434:179;13414:199;;13049:615;;;:::o;18072:100::-;18126:13;18159:5;18152:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18072:100;:::o;20140:204::-;20208:7;20233:16;20241:7;20233;:16::i;:::-;20228:64;;20258:34;;;;;;;;;;;;;;20228:64;20312:15;:24;20328:7;20312:24;;;;;;;;;;;;;;;;;;;;;20305:31;;20140:204;;;:::o;19600:474::-;19673:13;19705:27;19724:7;19705:18;:27::i;:::-;19673:61;;19755:5;19749:11;;:2;:11;;;19745:48;;19769:24;;;;;;;;;;;;;;19745:48;19833:5;19810:28;;:19;:17;:19::i;:::-;:28;;;19806:175;;19858:44;19875:5;19882:19;:17;:19::i;:::-;19858:16;:44::i;:::-;19853:128;;19930:35;;;;;;;;;;;;;;19853:128;19806:175;20020:2;19993:15;:24;20009:7;19993:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20058:7;20054:2;20038:28;;20047:5;20038:28;;;;;;;;;;;;19662:412;19600:474;;:::o;12103:315::-;12156:7;12384:15;:13;:15::i;:::-;12369:12;;12353:13;;:28;:46;12346:53;;12103:315;:::o;21026:170::-;21160:28;21170:4;21176:2;21180:7;21160:9;:28::i;:::-;21026:170;;;:::o;47455:45::-;;;;;;;;;;;;;;;;;:::o;50779:103::-;42910:12;:10;:12::i;:::-;42899:23;;:7;:5;:7::i;:::-;:23;;;42891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50846:10:::1;50838:28;;:36;50867:6;50838:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50779:103:::0;:::o;47421:25::-;;;;:::o;49710:83::-;42910:12;:10;:12::i;:::-;42899:23;;:7;:5;:7::i;:::-;:23;;;42891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49781:4:::1;49768:10;;:17;;;;;;;;;;;;;;;;;;49710:83::o:0;21267:185::-;21405:39;21422:4;21428:2;21432:7;21405:39;;;;;;;;;;;;:16;:39::i;:::-;21267:185;;;:::o;48034:755::-;47748:10;47735:23;;:9;:23;;;47727:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48160:13:::1;48176:9;48160:25;;48219:18;48204:33;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;48196:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;48292:33;48306:10;48318:6;;48292:13;:33::i;:::-;48284:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47245:4;48380:9;48364:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;48356:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;47330:1;48454:9;:19;;48446:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;48539:1;48511:13;:25;48525:10;48511:25;;;;;;;;;;;;;;;;:29;48508:163;;;48565:1;48554:9;:12;48550:82;;;48593:1;48581:9;:13;;;;:::i;:::-;48570:24;;48550:82;;;48628:1;48617:12;;48550:82;48664:1;48636:13;:25;48650:10;48636:25;;;;;;;;;;;;;;;:29;;;;48508:163;48707:5;;48696:8;:16;;;;:::i;:::-;48683:9;:29;;48675:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48751:30;48761:8;48771:9;48751;:30::i;:::-;48149:640;48034:755:::0;;;;:::o;17861:144::-;17925:7;17968:27;17987:7;17968:18;:27::i;:::-;17945:52;;17861:144;;;:::o;47113:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13728:234::-;13792:7;13844:1;13816:24;13834:5;13816:17;:24::i;:::-;:29;13812:70;;13854:28;;;;;;;;;;;;;;13812:70;9073:13;13900:18;:25;13919:5;13900:25;;;;;;;;;;;;;;;;:54;13893:61;;13728:234;;;:::o;43330:103::-;42910:12;:10;:12::i;:::-;42899:23;;:7;:5;:7::i;:::-;:23;;;42891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43395:30:::1;43422:1;43395:18;:30::i;:::-;43330:103::o:0;47141:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50202:106::-;42910:12;:10;:12::i;:::-;42899:23;;:7;:5;:7::i;:::-;:23;;;42891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50289:11:::1;50276:10;:24;;;;50202:106:::0;:::o;42679:87::-;42725:7;42752:6;;;;;;;;;;;42745:13;;42679:87;:::o;18241:104::-;18297:13;18330:7;18323:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18241:104;:::o;47380:32::-;;;;:::o;49459:106::-;42910:12;:10;:12::i;:::-;42899:23;;:7;:5;:7::i;:::-;:23;;;42891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49546:11:::1;49536:7;:21;;;;;;:::i;:::-;;49459:106:::0;:::o;20416:308::-;20527:19;:17;:19::i;:::-;20515:31;;:8;:31;;;20511:61;;20555:17;;;;;;;;;;;;;;20511:61;20637:8;20585:18;:39;20604:19;:17;:19::i;:::-;20585:39;;;;;;;;;;;;;;;:49;20625:8;20585:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20697:8;20661:55;;20676:19;:17;:19::i;:::-;20661:55;;;20707:8;20661:55;;;;;;:::i;:::-;;;;;;;;20416:308;;:::o;47819:207::-;42910:12;:10;:12::i;:::-;42899:23;;:7;:5;:7::i;:::-;:23;;;42891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47289:3:::1;47928:9;47912:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:37;;47904:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;47992:26;48002:3;48008:9;47992;:26::i;:::-;47819:207:::0;;:::o;21523:396::-;21690:28;21700:4;21706:2;21710:7;21690:9;:28::i;:::-;21751:1;21733:2;:14;;;:19;21729:183;;21772:56;21803:4;21809:2;21813:7;21822:5;21772:30;:56::i;:::-;21767:145;;21856:40;;;;;;;;;;;;;;21767:145;21729:183;21523:396;;;;:::o;49801:394::-;49872:13;49906:17;49914:8;49906:7;:17::i;:::-;49898:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49987:4;49973:18;;:10;;;;;;;;;;;:18;;;49970:218;;50039:7;50048:19;:8;:17;:19::i;:::-;50022:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50008:70;;;;49970:218;50151:7;50160:14;50134:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50120:56;;49801:394;;;;:::o;47178:23::-;;;;;;;;;;;;;:::o;48797:654::-;47748:10;47735:23;;:9;:23;;;47727:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48893:13:::1;48909:9;48893:25;;48952:15;48937:30;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;48929:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;47245:4;49042:9;49026:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;49018:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;47330:1;49116:9;:19;;49108:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;49201:1;49173:13;:25;49187:10;49173:25;;;;;;;;;;;;;;;;:29;49170:163;;;49227:1;49216:9;:12;49212:82;;;49255:1;49243:9;:13;;;;:::i;:::-;49232:24;;49212:82;;;49290:1;49279:12;;49212:82;49326:1;49298:13;:25;49312:10;49298:25;;;;;;;;;;;;;;;:29;;;;49170:163;49369:5;;49358:8;:16;;;;:::i;:::-;49345:9;:29;;49337:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49413:30;49423:8;49433:9;49413;:30::i;:::-;48882:569;48797:654:::0;;:::o;20795:164::-;20892:4;20916:18;:25;20935:5;20916:25;;;;;;;;;;;;;;;:35;20942:8;20916:35;;;;;;;;;;;;;;;;;;;;;;;;;20909:42;;20795:164;;;;:::o;43588:201::-;42910:12;:10;:12::i;:::-;42899:23;;:7;:5;:7::i;:::-;:23;;;42891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43697:1:::1;43677:22;;:8;:22;;::::0;43669:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43753:28;43772:8;43753:18;:28::i;:::-;43588:201:::0;:::o;49573:129::-;42910:12;:10;:12::i;:::-;42899:23;;:7;:5;:7::i;:::-;:23;;;42891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49651:5:::1;49646:11;;;;;;;;:::i;:::-;;49632;;:25;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;49683:11;49668:26:::0;::::1;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;::::0;;49573:129;:::o;22174:273::-;22231:4;22287:7;22268:15;:13;:15::i;:::-;:26;;:66;;;;;22321:13;;22311:7;:23;22268:66;:152;;;;;22419:1;9843:8;22372:17;:26;22390:7;22372:26;;;;;;;;;;;;:43;:48;22268:152;22248:172;;22174:273;;;:::o;15376:1129::-;15443:7;15463:12;15478:7;15463:22;;15546:4;15527:15;:13;:15::i;:::-;:23;15523:915;;15580:13;;15573:4;:20;15569:869;;;15618:14;15635:17;:23;15653:4;15635:23;;;;;;;;;;;;15618:40;;15751:1;9843:8;15724:6;:23;:28;15720:699;;16243:113;16260:1;16250:6;:11;16243:113;;16303:17;:25;16321:6;;;;;;;16303:25;;;;;;;;;;;;16294:34;;16243:113;;;16389:6;16382:13;;;;;;15720:699;15595:843;15569:869;15523:915;16466:31;;;;;;;;;;;;;;15376:1129;;;;:::o;36441:105::-;36501:7;36528:10;36521:17;;36441:105;:::o;11627:92::-;11683:7;11627:92;:::o;27433:2654::-;27548:27;27578;27597:7;27578:18;:27::i;:::-;27548:57;;27663:4;27622:45;;27638:19;27622:45;;;27618:86;;27676:28;;;;;;;;;;;;;;27618:86;27717:23;27743:15;:24;27759:7;27743:24;;;;;;;;;;;;;;;;;;;;;27717:50;;27780:22;27829:4;27806:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27850:43;27867:4;27873:19;:17;:19::i;:::-;27850:16;:43::i;:::-;27806:87;:142;;;;27929:19;:17;:19::i;:::-;27910:38;;:15;:38;;;27806:142;27780:169;;27967:17;27962:66;;27993:35;;;;;;;;;;;;;;27962:66;28068:1;28043:21;28061:2;28043:17;:21::i;:::-;:26;28039:62;;28078:23;;;;;;;;;;;;;;28039:62;28114:43;28136:4;28142:2;28146:7;28155:1;28114:21;:43::i;:::-;28265:1;28227:34;28245:15;28227:17;:34::i;:::-;:39;28223:103;;28290:15;:24;28306:7;28290:24;;;;;;;;;;;;28283:31;;;;;;;;;;;28223:103;28693:18;:24;28712:4;28693:24;;;;;;;;;;;;;;;;28691:26;;;;;;;;;;;;28762:18;:22;28781:2;28762:22;;;;;;;;;;;;;;;;28760:24;;;;;;;;;;;10121:8;9727:3;29143:15;:41;;29101:21;29119:2;29101:17;:21::i;:::-;:84;:128;29055:17;:26;29073:7;29055:26;;;;;;;;;;;:174;;;;29399:1;10121:8;29349:19;:46;:51;29345:626;;29421:19;29453:1;29443:7;:11;29421:33;;29610:1;29576:17;:30;29594:11;29576:30;;;;;;;;;;;;:35;29572:384;;29714:13;;29699:11;:28;29695:242;;29894:19;29861:17;:30;29879:11;29861:30;;;;;;;;;;;:52;;;;29695:242;29572:384;29402:569;29345:626;30018:7;30014:2;29999:27;;30008:4;29999:27;;;;;;;;;;;;30037:42;30058:4;30064:2;30068:7;30077:1;30037:20;:42::i;:::-;27537:2550;;;27433:2654;;;:::o;41403:98::-;41456:7;41483:10;41476:17;;41403:98;:::o;50316:153::-;50406:4;50430:31;50438:14;50443:8;50438:4;:14::i;:::-;50454:6;;50430:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:31::i;:::-;50423:38;;50316:153;;;;;:::o;22531:104::-;22600:27;22610:2;22614:8;22600:27;;;;;;;;;;;;:9;:27::i;:::-;22531:104;;:::o;19161:148::-;19225:14;19286:5;19276:15;;19161:148;;;:::o;43949:191::-;44023:16;44042:6;;;;;;;;;;;44023:25;;44068:8;44059:6;;:17;;;;;;;;;;;;;;;;;;44123:8;44092:40;;44113:8;44092:40;;;;;;;;;;;;44012:128;43949:191;:::o;33910:716::-;34073:4;34119:2;34094:45;;;34140:19;:17;:19::i;:::-;34161:4;34167:7;34176:5;34094:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34090:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34394:1;34377:6;:13;:18;34373:235;;34423:40;;;;;;;;;;;;;;34373:235;34566:6;34560:13;34551:6;34547:2;34543:15;34536:38;34090:529;34263:54;;;34253:64;;;:6;:64;;;;34246:71;;;33910:716;;;;;;:::o;38965:723::-;39021:13;39251:1;39242:5;:10;39238:53;;39269:10;;;;;;;;;;;;;;;;;;;;;39238:53;39301:12;39316:5;39301:20;;39332:14;39357:78;39372:1;39364:4;:9;39357:78;;39390:8;;;;;:::i;:::-;;;;39421:2;39413:10;;;;;:::i;:::-;;;39357:78;;;39445:19;39477:6;39467:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39445:39;;39495:154;39511:1;39502:5;:10;39495:154;;39539:1;39529:11;;;;;:::i;:::-;;;39606:2;39598:5;:10;;;;:::i;:::-;39585:2;:24;;;;:::i;:::-;39572:39;;39555:6;39562;39555:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39635:2;39626:11;;;;;:::i;:::-;;;39495:154;;;39673:6;39659:21;;;;;38965:723;;;;:::o;35274:159::-;;;;;:::o;36092:158::-;;;;;:::o;50477:126::-;50531:7;50585:8;50568:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;50558:37;;;;;;50551:44;;50477:126;;;:::o;50611:156::-;50690:4;50714:45;50733:6;50741:10;;50753:5;50714:18;:45::i;:::-;50707:52;;50611:156;;;;:::o;23008:2246::-;23131:20;23154:13;;23131:36;;23207:1;23182:21;23200:2;23182:17;:21::i;:::-;:26;23178:58;;23217:19;;;;;;;;;;;;;;23178:58;23263:1;23251:8;:13;23247:44;;23273:18;;;;;;;;;;;;;;23247:44;23304:61;23334:1;23338:2;23342:12;23356:8;23304:21;:61::i;:::-;23908:1;9210:2;23879:1;:25;;23878:31;23866:8;:44;23840:18;:22;23859:2;23840:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;9986:3;24309:29;24336:1;24324:8;:13;24309:14;:29::i;:::-;:56;;9727:3;24246:15;:41;;24204:21;24222:2;24204:17;:21::i;:::-;:84;:162;24153:17;:31;24171:12;24153:31;;;;;;;;;;;:213;;;;24383:20;24406:12;24383:35;;24433:11;24462:8;24447:12;:23;24433:37;;24509:1;24491:2;:14;;;:19;24487:635;;24531:313;24587:12;24583:2;24562:38;;24579:1;24562:38;;;;;;;;;;;;24628:69;24667:1;24671:2;24675:14;;;;;;24691:5;24628:30;:69::i;:::-;24623:174;;24733:40;;;;;;;;;;;;;;24623:174;24839:3;24824:12;:18;24531:313;;24925:12;24908:13;;:29;24904:43;;24939:8;;;24904:43;24487:635;;;24988:119;25044:14;;;;;;25040:2;25019:40;;25036:1;25019:40;;;;;;;;;;;;25102:3;25087:12;:18;24988:119;;24487:635;25152:12;25136:13;:28;;;;23617:1559;;25186:60;25215:1;25219:2;25223:12;25237:8;25186:20;:60::i;:::-;23120:2134;23008:2246;;;:::o;45367:190::-;45492:4;45545;45516:25;45529:5;45536:4;45516:12;:25::i;:::-;:33;45509:40;;45367:190;;;;;:::o;19396:142::-;19454:14;19515:5;19505:15;;19396:142;;;:::o;45918:675::-;46001:7;46021:20;46044:4;46021:27;;46064:9;46059:497;46083:5;:12;46079:1;:16;46059:497;;;46117:20;46140:5;46146:1;46140:8;;;;;;;;:::i;:::-;;;;;;;;46117:31;;46183:12;46167;:28;46163:382;;46310:42;46325:12;46339;46310:14;:42::i;:::-;46295:57;;46163:382;;;46487:42;46502:12;46516;46487:14;:42::i;:::-;46472:57;;46163:382;46102:454;46097:3;;;;;:::i;:::-;;;;46059:497;;;;46573:12;46566:19;;;45918:675;;;;:::o;46601:224::-;46669:13;46732:1;46726:4;46719:15;46761:1;46755:4;46748:15;46802:4;46796;46786:21;46777:30;;46601:224;;;;:::o;7:75:1:-;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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::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:77::-;6287:7;6316:5;6305:16;;6250:77;;;:::o;6333:118::-;6420:24;6438:5;6420:24;:::i;:::-;6415:3;6408:37;6333:118;;:::o;6457:222::-;6550:4;6588:2;6577:9;6573:18;6565:26;;6601:71;6669:1;6658:9;6654:17;6645:6;6601:71;:::i;:::-;6457:222;;;;:::o;6685:117::-;6794:1;6791;6784:12;6808:117;6917:1;6914;6907:12;6931:117;7040:1;7037;7030:12;7071:568;7144:8;7154:6;7204:3;7197:4;7189:6;7185:17;7181:27;7171:122;;7212:79;;:::i;:::-;7171:122;7325:6;7312:20;7302:30;;7355:18;7347:6;7344:30;7341:117;;;7377:79;;:::i;:::-;7341:117;7491:4;7483:6;7479:17;7467:29;;7545:3;7537:4;7529:6;7525:17;7515:8;7511:32;7508:41;7505:128;;;7552:79;;:::i;:::-;7505:128;7071:568;;;;;:::o;7645:849::-;7749:6;7757;7765;7773;7822:2;7810:9;7801:7;7797:23;7793:32;7790:119;;;7828:79;;:::i;:::-;7790:119;7948:1;7973:53;8018:7;8009:6;7998:9;7994:22;7973:53;:::i;:::-;7963:63;;7919:117;8075:2;8101:53;8146:7;8137:6;8126:9;8122:22;8101:53;:::i;:::-;8091:63;;8046:118;8231:2;8220:9;8216:18;8203:32;8262:18;8254:6;8251:30;8248:117;;;8284:79;;:::i;:::-;8248:117;8397:80;8469:7;8460:6;8449:9;8445:22;8397:80;:::i;:::-;8379:98;;;;8174:313;7645:849;;;;;;;:::o;8500:122::-;8573:24;8591:5;8573:24;:::i;:::-;8566:5;8563:35;8553:63;;8612:1;8609;8602:12;8553:63;8500:122;:::o;8628:139::-;8674:5;8712:6;8699:20;8690:29;;8728:33;8755:5;8728:33;:::i;:::-;8628:139;;;;:::o;8773:329::-;8832:6;8881:2;8869:9;8860:7;8856:23;8852:32;8849:119;;;8887:79;;:::i;:::-;8849:119;9007:1;9032:53;9077:7;9068:6;9057:9;9053:22;9032:53;:::i;:::-;9022:63;;8978:117;8773:329;;;;:::o;9108:117::-;9217:1;9214;9207:12;9231:180;9279:77;9276:1;9269:88;9376:4;9373:1;9366:15;9400:4;9397:1;9390:15;9417:281;9500:27;9522:4;9500:27;:::i;:::-;9492:6;9488:40;9630:6;9618:10;9615:22;9594:18;9582:10;9579:34;9576:62;9573:88;;;9641:18;;:::i;:::-;9573:88;9681:10;9677:2;9670:22;9460:238;9417:281;;:::o;9704:129::-;9738:6;9765:20;;:::i;:::-;9755:30;;9794:33;9822:4;9814:6;9794:33;:::i;:::-;9704:129;;;:::o;9839:308::-;9901:4;9991:18;9983:6;9980:30;9977:56;;;10013:18;;:::i;:::-;9977:56;10051:29;10073:6;10051:29;:::i;:::-;10043:37;;10135:4;10129;10125:15;10117:23;;9839:308;;;:::o;10153:154::-;10237:6;10232:3;10227;10214:30;10299:1;10290:6;10285:3;10281:16;10274:27;10153:154;;;:::o;10313:412::-;10391:5;10416:66;10432:49;10474:6;10432:49;:::i;:::-;10416:66;:::i;:::-;10407:75;;10505:6;10498:5;10491:21;10543:4;10536:5;10532:16;10581:3;10572:6;10567:3;10563:16;10560:25;10557:112;;;10588:79;;:::i;:::-;10557:112;10678:41;10712:6;10707:3;10702;10678:41;:::i;:::-;10397:328;10313:412;;;;;:::o;10745:340::-;10801:5;10850:3;10843:4;10835:6;10831:17;10827:27;10817:122;;10858:79;;:::i;:::-;10817:122;10975:6;10962:20;11000:79;11075:3;11067:6;11060:4;11052:6;11048:17;11000:79;:::i;:::-;10991:88;;10807:278;10745:340;;;;:::o;11091:509::-;11160:6;11209:2;11197:9;11188:7;11184:23;11180:32;11177:119;;;11215:79;;:::i;:::-;11177:119;11363:1;11352:9;11348:17;11335:31;11393:18;11385:6;11382:30;11379:117;;;11415:79;;:::i;:::-;11379:117;11520:63;11575:7;11566:6;11555:9;11551:22;11520:63;:::i;:::-;11510:73;;11306:287;11091:509;;;;:::o;11606:116::-;11676:21;11691:5;11676:21;:::i;:::-;11669:5;11666:32;11656:60;;11712:1;11709;11702:12;11656:60;11606:116;:::o;11728:133::-;11771:5;11809:6;11796:20;11787:29;;11825:30;11849:5;11825:30;:::i;:::-;11728:133;;;;:::o;11867:468::-;11932:6;11940;11989:2;11977:9;11968:7;11964:23;11960:32;11957:119;;;11995:79;;:::i;:::-;11957:119;12115:1;12140:53;12185:7;12176:6;12165:9;12161:22;12140:53;:::i;:::-;12130:63;;12086:117;12242:2;12268:50;12310:7;12301:6;12290:9;12286:22;12268:50;:::i;:::-;12258:60;;12213:115;11867:468;;;;;:::o;12341:307::-;12402:4;12492:18;12484:6;12481:30;12478:56;;;12514:18;;:::i;:::-;12478:56;12552:29;12574:6;12552:29;:::i;:::-;12544:37;;12636:4;12630;12626:15;12618:23;;12341:307;;;:::o;12654:410::-;12731:5;12756:65;12772:48;12813:6;12772:48;:::i;:::-;12756:65;:::i;:::-;12747:74;;12844:6;12837:5;12830:21;12882:4;12875:5;12871:16;12920:3;12911:6;12906:3;12902:16;12899:25;12896:112;;;12927:79;;:::i;:::-;12896:112;13017:41;13051:6;13046:3;13041;13017:41;:::i;:::-;12737:327;12654:410;;;;;:::o;13083:338::-;13138:5;13187:3;13180:4;13172:6;13168:17;13164:27;13154:122;;13195:79;;:::i;:::-;13154:122;13312:6;13299:20;13337:78;13411:3;13403:6;13396:4;13388:6;13384:17;13337:78;:::i;:::-;13328:87;;13144:277;13083:338;;;;:::o;13427:943::-;13522:6;13530;13538;13546;13595:3;13583:9;13574:7;13570:23;13566:33;13563:120;;;13602:79;;:::i;:::-;13563:120;13722:1;13747:53;13792:7;13783:6;13772:9;13768:22;13747:53;:::i;:::-;13737:63;;13693:117;13849:2;13875:53;13920:7;13911:6;13900:9;13896:22;13875:53;:::i;:::-;13865:63;;13820:118;13977:2;14003:53;14048:7;14039:6;14028:9;14024:22;14003:53;:::i;:::-;13993:63;;13948:118;14133:2;14122:9;14118:18;14105:32;14164:18;14156:6;14153:30;14150:117;;;14186:79;;:::i;:::-;14150:117;14291:62;14345:7;14336:6;14325:9;14321:22;14291:62;:::i;:::-;14281:72;;14076:287;13427:943;;;;;;;:::o;14376:180::-;14424:77;14421:1;14414:88;14521:4;14518:1;14511:15;14545:4;14542:1;14535:15;14562:114;14644:1;14637:5;14634:12;14624:46;;14650:18;;:::i;:::-;14624:46;14562:114;:::o;14682:129::-;14728:7;14757:5;14746:16;;14763:42;14799:5;14763:42;:::i;:::-;14682:129;;;:::o;14817:::-;14874:9;14907:33;14934:5;14907:33;:::i;:::-;14894:46;;14817:129;;;:::o;14952:145::-;15046:44;15084:5;15046:44;:::i;:::-;15041:3;15034:57;14952:145;;:::o;15103:236::-;15203:4;15241:2;15230:9;15226:18;15218:26;;15254:78;15329:1;15318:9;15314:17;15305:6;15254:78;:::i;:::-;15103:236;;;;:::o;15345:474::-;15413:6;15421;15470:2;15458:9;15449:7;15445:23;15441:32;15438:119;;;15476:79;;:::i;:::-;15438:119;15596:1;15621:53;15666:7;15657:6;15646:9;15642:22;15621:53;:::i;:::-;15611:63;;15567:117;15723:2;15749:53;15794:7;15785:6;15774:9;15770:22;15749:53;:::i;:::-;15739:63;;15694:118;15345:474;;;;;:::o;15825:180::-;15873:77;15870:1;15863:88;15970:4;15967:1;15960:15;15994:4;15991:1;15984:15;16011:320;16055:6;16092:1;16086:4;16082:12;16072:22;;16139:1;16133:4;16129:12;16160:18;16150:81;;16216:4;16208:6;16204:17;16194:27;;16150:81;16278:2;16270:6;16267:14;16247:18;16244:38;16241:84;;16297:18;;:::i;:::-;16241:84;16062:269;16011:320;;;:::o;16337:182::-;16477:34;16473:1;16465:6;16461:14;16454:58;16337:182;:::o;16525:366::-;16667:3;16688:67;16752:2;16747:3;16688:67;:::i;:::-;16681:74;;16764:93;16853:3;16764:93;:::i;:::-;16882:2;16877:3;16873:12;16866:19;;16525:366;;;:::o;16897:419::-;17063:4;17101:2;17090:9;17086:18;17078:26;;17150:9;17144:4;17140:20;17136:1;17125:9;17121:17;17114:47;17178:131;17304:4;17178:131;:::i;:::-;17170:139;;16897:419;;;:::o;17322:178::-;17462:30;17458:1;17450:6;17446:14;17439:54;17322:178;:::o;17506:366::-;17648:3;17669:67;17733:2;17728:3;17669:67;:::i;:::-;17662:74;;17745:93;17834:3;17745:93;:::i;:::-;17863:2;17858:3;17854:12;17847:19;;17506:366;;;:::o;17878:419::-;18044:4;18082:2;18071:9;18067:18;18059:26;;18131:9;18125:4;18121:20;18117:1;18106:9;18102:17;18095:47;18159:131;18285:4;18159:131;:::i;:::-;18151:139;;17878:419;;;:::o;18303:181::-;18443:33;18439:1;18431:6;18427:14;18420:57;18303:181;:::o;18490:366::-;18632:3;18653:67;18717:2;18712:3;18653:67;:::i;:::-;18646:74;;18729:93;18818:3;18729:93;:::i;:::-;18847:2;18842:3;18838:12;18831:19;;18490:366;;;:::o;18862:419::-;19028:4;19066:2;19055:9;19051:18;19043:26;;19115:9;19109:4;19105:20;19101:1;19090:9;19086:17;19079:47;19143:131;19269:4;19143:131;:::i;:::-;19135:139;;18862:419;;;:::o;19287:165::-;19427:17;19423:1;19415:6;19411:14;19404:41;19287:165;:::o;19458:366::-;19600:3;19621:67;19685:2;19680:3;19621:67;:::i;:::-;19614:74;;19697:93;19786:3;19697:93;:::i;:::-;19815:2;19810:3;19806:12;19799:19;;19458:366;;;:::o;19830:419::-;19996:4;20034:2;20023:9;20019:18;20011:26;;20083:9;20077:4;20073:20;20069:1;20058:9;20054:17;20047:47;20111:131;20237:4;20111:131;:::i;:::-;20103:139;;19830:419;;;:::o;20255:180::-;20303:77;20300:1;20293:88;20400:4;20397:1;20390:15;20424:4;20421:1;20414:15;20441:305;20481:3;20500:20;20518:1;20500:20;:::i;:::-;20495:25;;20534:20;20552:1;20534:20;:::i;:::-;20529:25;;20688:1;20620:66;20616:74;20613:1;20610:81;20607:107;;;20694:18;;:::i;:::-;20607:107;20738:1;20735;20731:9;20724:16;;20441:305;;;;:::o;20752:177::-;20892:29;20888:1;20880:6;20876:14;20869:53;20752:177;:::o;20935:366::-;21077:3;21098:67;21162:2;21157:3;21098:67;:::i;:::-;21091:74;;21174:93;21263:3;21174:93;:::i;:::-;21292:2;21287:3;21283:12;21276:19;;20935:366;;;:::o;21307:419::-;21473:4;21511:2;21500:9;21496:18;21488:26;;21560:9;21554:4;21550:20;21546:1;21535:9;21531:17;21524:47;21588:131;21714:4;21588:131;:::i;:::-;21580:139;;21307:419;;;:::o;21732:169::-;21872:21;21868:1;21860:6;21856:14;21849:45;21732:169;:::o;21907:366::-;22049:3;22070:67;22134:2;22129:3;22070:67;:::i;:::-;22063:74;;22146:93;22235:3;22146:93;:::i;:::-;22264:2;22259:3;22255:12;22248:19;;21907:366;;;:::o;22279:419::-;22445:4;22483:2;22472:9;22468:18;22460:26;;22532:9;22526:4;22522:20;22518:1;22507:9;22503:17;22496:47;22560:131;22686:4;22560:131;:::i;:::-;22552:139;;22279:419;;;:::o;22704:191::-;22744:4;22764:20;22782:1;22764:20;:::i;:::-;22759:25;;22798:20;22816:1;22798:20;:::i;:::-;22793:25;;22837:1;22834;22831:8;22828:34;;;22842:18;;:::i;:::-;22828:34;22887:1;22884;22880:9;22872:17;;22704:191;;;;:::o;22901:348::-;22941:7;22964:20;22982:1;22964:20;:::i;:::-;22959:25;;22998:20;23016:1;22998:20;:::i;:::-;22993:25;;23186:1;23118:66;23114:74;23111:1;23108:81;23103:1;23096:9;23089:17;23085:105;23082:131;;;23193:18;;:::i;:::-;23082:131;23241:1;23238;23234:9;23223:20;;22901:348;;;;:::o;23255:173::-;23395:25;23391:1;23383:6;23379:14;23372:49;23255:173;:::o;23434:366::-;23576:3;23597:67;23661:2;23656:3;23597:67;:::i;:::-;23590:74;;23673:93;23762:3;23673:93;:::i;:::-;23791:2;23786:3;23782:12;23775:19;;23434:366;;;:::o;23806:419::-;23972:4;24010:2;23999:9;23995:18;23987:26;;24059:9;24053:4;24049:20;24045:1;24034:9;24030:17;24023:47;24087:131;24213:4;24087:131;:::i;:::-;24079:139;;23806:419;;;:::o;24231:141::-;24280:4;24303:3;24295:11;;24326:3;24323:1;24316:14;24360:4;24357:1;24347:18;24339:26;;24231:141;;;:::o;24378:93::-;24415:6;24462:2;24457;24450:5;24446:14;24442:23;24432:33;;24378:93;;;:::o;24477:107::-;24521:8;24571:5;24565:4;24561:16;24540:37;;24477:107;;;;:::o;24590:393::-;24659:6;24709:1;24697:10;24693:18;24732:97;24762:66;24751:9;24732:97;:::i;:::-;24850:39;24880:8;24869:9;24850:39;:::i;:::-;24838:51;;24922:4;24918:9;24911:5;24907:21;24898:30;;24971:4;24961:8;24957:19;24950:5;24947:30;24937:40;;24666:317;;24590:393;;;;;:::o;24989:60::-;25017:3;25038:5;25031:12;;24989:60;;;:::o;25055:142::-;25105:9;25138:53;25156:34;25165:24;25183:5;25165:24;:::i;:::-;25156:34;:::i;:::-;25138:53;:::i;:::-;25125:66;;25055:142;;;:::o;25203:75::-;25246:3;25267:5;25260:12;;25203:75;;;:::o;25284:269::-;25394:39;25425:7;25394:39;:::i;:::-;25455:91;25504:41;25528:16;25504:41;:::i;:::-;25496:6;25489:4;25483:11;25455:91;:::i;:::-;25449:4;25442:105;25360:193;25284:269;;;:::o;25559:73::-;25604:3;25559:73;:::o;25638:189::-;25715:32;;:::i;:::-;25756:65;25814:6;25806;25800:4;25756:65;:::i;:::-;25691:136;25638:189;;:::o;25833:186::-;25893:120;25910:3;25903:5;25900:14;25893:120;;;25964:39;26001:1;25994:5;25964:39;:::i;:::-;25937:1;25930:5;25926:13;25917:22;;25893:120;;;25833:186;;:::o;26025:543::-;26126:2;26121:3;26118:11;26115:446;;;26160:38;26192:5;26160:38;:::i;:::-;26244:29;26262:10;26244:29;:::i;:::-;26234:8;26230:44;26427:2;26415:10;26412:18;26409:49;;;26448:8;26433:23;;26409:49;26471:80;26527:22;26545:3;26527:22;:::i;:::-;26517:8;26513:37;26500:11;26471:80;:::i;:::-;26130:431;;26115:446;26025:543;;;:::o;26574:117::-;26628:8;26678:5;26672:4;26668:16;26647:37;;26574:117;;;;:::o;26697:169::-;26741:6;26774:51;26822:1;26818:6;26810:5;26807:1;26803:13;26774:51;:::i;:::-;26770:56;26855:4;26849;26845:15;26835:25;;26748:118;26697:169;;;;:::o;26871:295::-;26947:4;27093:29;27118:3;27112:4;27093:29;:::i;:::-;27085:37;;27155:3;27152:1;27148:11;27142:4;27139:21;27131:29;;26871:295;;;;:::o;27171:1395::-;27288:37;27321:3;27288:37;:::i;:::-;27390:18;27382:6;27379:30;27376:56;;;27412:18;;:::i;:::-;27376:56;27456:38;27488:4;27482:11;27456:38;:::i;:::-;27541:67;27601:6;27593;27587:4;27541:67;:::i;:::-;27635:1;27659:4;27646:17;;27691:2;27683:6;27680:14;27708:1;27703:618;;;;28365:1;28382:6;28379:77;;;28431:9;28426:3;28422:19;28416:26;28407:35;;28379:77;28482:67;28542:6;28535:5;28482:67;:::i;:::-;28476:4;28469:81;28338:222;27673:887;;27703:618;27755:4;27751:9;27743:6;27739:22;27789:37;27821:4;27789:37;:::i;:::-;27848:1;27862:208;27876:7;27873:1;27870:14;27862:208;;;27955:9;27950:3;27946:19;27940:26;27932:6;27925:42;28006:1;27998:6;27994:14;27984:24;;28053:2;28042:9;28038:18;28025:31;;27899:4;27896:1;27892:12;27887:17;;27862:208;;;28098:6;28089:7;28086:19;28083:179;;;28156:9;28151:3;28147:19;28141:26;28199:48;28241:4;28233:6;28229:17;28218:9;28199:48;:::i;:::-;28191:6;28184:64;28106:156;28083:179;28308:1;28304;28296:6;28292:14;28288:22;28282:4;28275:36;27710:611;;;27673:887;;27263:1303;;;27171:1395;;:::o;28572:181::-;28712:33;28708:1;28700:6;28696:14;28689:57;28572:181;:::o;28759:366::-;28901:3;28922:67;28986:2;28981:3;28922:67;:::i;:::-;28915:74;;28998:93;29087:3;28998:93;:::i;:::-;29116:2;29111:3;29107:12;29100:19;;28759:366;;;:::o;29131:419::-;29297:4;29335:2;29324:9;29320:18;29312:26;;29384:9;29378:4;29374:20;29370:1;29359:9;29355:17;29348:47;29412:131;29538:4;29412:131;:::i;:::-;29404:139;;29131:419;;;:::o;29556:148::-;29658:11;29695:3;29680:18;;29556:148;;;;:::o;29734:874::-;29837:3;29874:5;29868:12;29903:36;29929:9;29903:36;:::i;:::-;29955:89;30037:6;30032:3;29955:89;:::i;:::-;29948:96;;30075:1;30064:9;30060:17;30091:1;30086:166;;;;30266:1;30261:341;;;;30053:549;;30086:166;30170:4;30166:9;30155;30151:25;30146:3;30139:38;30232:6;30225:14;30218:22;30210:6;30206:35;30201:3;30197:45;30190:52;;30086:166;;30261:341;30328:38;30360:5;30328:38;:::i;:::-;30388:1;30402:154;30416:6;30413:1;30410:13;30402:154;;;30490:7;30484:14;30480:1;30475:3;30471:11;30464:35;30540:1;30531:7;30527:15;30516:26;;30438:4;30435:1;30431:12;30426:17;;30402:154;;;30585:6;30580:3;30576:16;30569:23;;30268:334;;30053:549;;29841:767;;29734:874;;;;:::o;30614:377::-;30720:3;30748:39;30781:5;30748:39;:::i;:::-;30803:89;30885:6;30880:3;30803:89;:::i;:::-;30796:96;;30901:52;30946:6;30941:3;30934:4;30927:5;30923:16;30901:52;:::i;:::-;30978:6;30973:3;30969:16;30962:23;;30724:267;30614:377;;;;:::o;30997:155::-;31137:7;31133:1;31125:6;31121:14;31114:31;30997:155;:::o;31158:400::-;31318:3;31339:84;31421:1;31416:3;31339:84;:::i;:::-;31332:91;;31432:93;31521:3;31432:93;:::i;:::-;31550:1;31545:3;31541:11;31534:18;;31158:400;;;:::o;31564:695::-;31842:3;31864:92;31952:3;31943:6;31864:92;:::i;:::-;31857:99;;31973:95;32064:3;32055:6;31973:95;:::i;:::-;31966:102;;32085:148;32229:3;32085:148;:::i;:::-;32078:155;;32250:3;32243:10;;31564:695;;;;;:::o;32265:423::-;32439:3;32461:92;32549:3;32540:6;32461:92;:::i;:::-;32454:99;;32570:92;32658:3;32649:6;32570:92;:::i;:::-;32563:99;;32679:3;32672:10;;32265:423;;;;;:::o;32694:222::-;32834:34;32830:1;32822:6;32818:14;32811:58;32903:5;32898:2;32890:6;32886:15;32879:30;32694:222;:::o;32922:366::-;33064:3;33085:67;33149:2;33144:3;33085:67;:::i;:::-;33078:74;;33161:93;33250:3;33161:93;:::i;:::-;33279:2;33274:3;33270:12;33263:19;;32922:366;;;:::o;33294:419::-;33460:4;33498:2;33487:9;33483:18;33475:26;;33547:9;33541:4;33537:20;33533:1;33522:9;33518:17;33511:47;33575:131;33701:4;33575:131;:::i;:::-;33567:139;;33294:419;;;:::o;33719:225::-;33859:34;33855:1;33847:6;33843:14;33836:58;33928:8;33923:2;33915:6;33911:15;33904:33;33719:225;:::o;33950:366::-;34092:3;34113:67;34177:2;34172:3;34113:67;:::i;:::-;34106:74;;34189:93;34278:3;34189:93;:::i;:::-;34307:2;34302:3;34298:12;34291:19;;33950:366;;;:::o;34322:419::-;34488:4;34526:2;34515:9;34511:18;34503:26;;34575:9;34569:4;34565:20;34561:1;34550:9;34546:17;34539:47;34603:131;34729:4;34603:131;:::i;:::-;34595:139;;34322:419;;;:::o;34747:98::-;34798:6;34832:5;34826:12;34816:22;;34747:98;;;:::o;34851:168::-;34934:11;34968:6;34963:3;34956:19;35008:4;35003:3;34999:14;34984:29;;34851:168;;;;:::o;35025:360::-;35111:3;35139:38;35171:5;35139:38;:::i;:::-;35193:70;35256:6;35251:3;35193:70;:::i;:::-;35186:77;;35272:52;35317:6;35312:3;35305:4;35298:5;35294:16;35272:52;:::i;:::-;35349:29;35371:6;35349:29;:::i;:::-;35344:3;35340:39;35333:46;;35115:270;35025:360;;;;:::o;35391:640::-;35586:4;35624:3;35613:9;35609:19;35601:27;;35638:71;35706:1;35695:9;35691:17;35682:6;35638:71;:::i;:::-;35719:72;35787:2;35776:9;35772:18;35763:6;35719:72;:::i;:::-;35801;35869:2;35858:9;35854:18;35845:6;35801:72;:::i;:::-;35920:9;35914:4;35910:20;35905:2;35894:9;35890:18;35883:48;35948:76;36019:4;36010:6;35948:76;:::i;:::-;35940:84;;35391:640;;;;;;;:::o;36037:141::-;36093:5;36124:6;36118:13;36109:22;;36140:32;36166:5;36140:32;:::i;:::-;36037:141;;;;:::o;36184:349::-;36253:6;36302:2;36290:9;36281:7;36277:23;36273:32;36270:119;;;36308:79;;:::i;:::-;36270:119;36428:1;36453:63;36508:7;36499:6;36488:9;36484:22;36453:63;:::i;:::-;36443:73;;36399:127;36184:349;;;;:::o;36539:233::-;36578:3;36601:24;36619:5;36601:24;:::i;:::-;36592:33;;36647:66;36640:5;36637:77;36634:103;;36717:18;;:::i;:::-;36634:103;36764:1;36757:5;36753:13;36746:20;;36539:233;;;:::o;36778:180::-;36826:77;36823:1;36816:88;36923:4;36920:1;36913:15;36947:4;36944:1;36937:15;36964:185;37004:1;37021:20;37039:1;37021:20;:::i;:::-;37016:25;;37055:20;37073:1;37055:20;:::i;:::-;37050:25;;37094:1;37084:35;;37099:18;;:::i;:::-;37084:35;37141:1;37138;37134:9;37129:14;;36964:185;;;;:::o;37155:176::-;37187:1;37204:20;37222:1;37204:20;:::i;:::-;37199:25;;37238:20;37256:1;37238:20;:::i;:::-;37233:25;;37277:1;37267:35;;37282:18;;:::i;:::-;37267:35;37323:1;37320;37316:9;37311:14;;37155:176;;;;:::o;37337:180::-;37385:77;37382:1;37375:88;37482:4;37479:1;37472:15;37506:4;37503:1;37496:15;37523:94;37556:8;37604:5;37600:2;37596:14;37575:35;;37523:94;;;:::o;37623:::-;37662:7;37691:20;37705:5;37691:20;:::i;:::-;37680:31;;37623:94;;;:::o;37723:100::-;37762:7;37791:26;37811:5;37791:26;:::i;:::-;37780:37;;37723:100;;;:::o;37829:157::-;37934:45;37954:24;37972:5;37954:24;:::i;:::-;37934:45;:::i;:::-;37929:3;37922:58;37829:157;;:::o;37992:256::-;38104:3;38119:75;38190:3;38181:6;38119:75;:::i;:::-;38219:2;38214:3;38210:12;38203:19;;38239:3;38232:10;;37992:256;;;;:::o
Swarm Source
ipfs://4a60c8f4632d73d81274afdd7c4a21dafcf2f4b1d8ad660e4d71860105ed6678
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.