ERC-721
Overview
Max Total Supply
4,444 DEADB
Holders
975
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
6 DEADBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DeadBears
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-28 */ // Sources flattened with hardhat v2.9.6 https://hardhat.org // File erc721a/contracts/[email protected] // SPDX-License-Identifier: MIT // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File erc721a/contracts/[email protected] // 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 (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // 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 @openzeppelin/contracts/utils/[email protected] // 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/[email protected] // 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 contracts/DeadBears.sol pragma solidity ^0.8.4; contract DeadBears is ERC721A, Ownable { uint256 public MAX_SUPPLY = 4444; uint256 public MAX_BUY_SUPPLY = 4000; uint256 public MAX_FREE_SUPPLY = 333; uint256 public PRICE = 0.03 ether; string public BASE_URI = ""; uint256 public freeClaimed = 0; uint256 public bought = 0; bytes32 public merkleRoot; mapping(address => bool) public hasClaimed; bool public open; uint256 public walletLimit; bool public disableOwnerMint; constructor() ERC721A("DeadBears", "DEADB") { open = false; walletLimit = 20; disableOwnerMint = false; } function ownerMint(uint256 num) public onlyOwner { require(!disableOwnerMint); _safeMint(msg.sender, num); } function mintWhitelist(bytes32[] calldata proof) external { require(open); require(freeClaimed < MAX_FREE_SUPPLY); if (hasClaimed[msg.sender]) revert(); // Verify merkle proof, or revert if not in tree bytes32 leaf = keccak256(abi.encodePacked(msg.sender, uint256(1))); bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf); if (!isValidLeaf) revert(); // Set address to claimed hasClaimed[msg.sender] = true; // Mint tokens to address _safeMint(msg.sender, 1); freeClaimed += 1; } function mint(uint256 quantity) external payable { require(open); require(bought < MAX_BUY_SUPPLY); if (quantity > walletLimit) { quantity = walletLimit; } if (quantity + _totalMinted() > MAX_SUPPLY) { quantity = MAX_SUPPLY - _totalMinted(); } require(msg.value >= quantity * PRICE, "Not enough ETH sent."); _safeMint(msg.sender, quantity); bought += 1; uint256 remaining = msg.value - (quantity * PRICE); if (remaining > 0) { (bool success, ) = msg.sender.call{value: remaining}(""); require(success); } } function _baseURI() internal view override returns (string memory) { return BASE_URI; } function setBaseUri(string calldata _baseUri) public onlyOwner { BASE_URI = _baseUri; } function setMerkleRoot(bytes32 root) public onlyOwner { merkleRoot = root; } function setWalletLimit(uint256 limit) public onlyOwner { walletLimit = limit; } function setOpen(bool o) public onlyOwner { open = o; } function permanentlyDisableOwnerMint() public onlyOwner { disableOwnerMint = true; } function withdraw() external onlyOwner { uint256 bal = address(this).balance; payable(address(0x84f6FfeF5d9e888049e46C7eDD618a817f6c2c06)).call{value: bal}(""); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUY_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableOwnerMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permanentlyDisableOwnerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"o","type":"bool"}],"name":"setOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261115c600955610fa0600a5561014d600b55666a94d74f430000600c5560405180602001604052806000815250600d9080519060200190620000489291906200024e565b506000600e556000600f553480156200006057600080fd5b506040518060400160405280600981526020017f44656164426561727300000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f44454144420000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e59291906200024e565b508060039080519060200190620000fe9291906200024e565b506200010f6200017b60201b60201c565b6000819055505050620001376200012b6200018060201b60201c565b6200018860201b60201c565b6000601260006101000a81548160ff02191690831515021790555060146013819055506000601460006101000a81548160ff02191690831515021790555062000363565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025c90620002fe565b90600052602060002090601f016020900481019282620002805760008555620002cc565b82601f106200029b57805160ff1916838001178555620002cc565b82800160010185558215620002cc579182015b82811115620002cb578251825591602001919060010190620002ae565b5b509050620002db9190620002df565b5090565b5b80821115620002fa576000816000905550600101620002e0565b5090565b600060028204905060018216806200031757607f821691505b602082108114156200032e576200032d62000334565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61341c80620003736000396000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063a22cb465116100ab578063f19e75d41161006f578063f19e75d4146107ea578063f1d5f51714610813578063f2fde38b1461083c578063f8873b3e14610865578063fcfff16f1461087c57610225565b8063a22cb465146106f3578063b88d4fde1461071c578063c87b56dd14610745578063dbddb26a14610782578063e985e9c5146107ad57610225565b80638d859f3e116100f25780638d859f3e1461062d5780638da5cb5b1461065857806395d89b4114610683578063a0712d68146106ae578063a0bcfc7f146106ca57610225565b8063715018a61461058557806373b2e80e1461059c5780637cb64759146105d957806385bb1bf41461060257610225565b806332cb6b0c116101b157806344d843811161017557806344d843811461048e5780635b688957146104b75780636352211e146104e25780636fdca5e01461051f57806370a082311461054857610225565b806332cb6b0c146103cd57806334976b9b146103f85780633c8463a1146104235780633ccfd60b1461044e57806342842e0e1461046557610225565b8063095ea7b3116101f8578063095ea7b3146102fa57806318160ddd146103235780631b47ec3a1461034e57806323b872dd146103795780632eb4a7ab146103a257610225565b806301ffc9a71461022a57806302ddb65b1461026757806306fdde0314610292578063081812fc146102bd575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612b0a565b6108a7565b60405161025e9190612e2f565b60405180910390f35b34801561027357600080fd5b5061027c610939565b6040516102899190612ee7565b60405180910390f35b34801561029e57600080fd5b506102a761093f565b6040516102b49190612e65565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df9190612ba1565b6109d1565b6040516102f19190612dc8565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190612a37565b610a4d565b005b34801561032f57600080fd5b50610338610bf4565b6040516103459190612ee7565b60405180910390f35b34801561035a57600080fd5b50610363610c0b565b6040516103709190612ee7565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190612931565b610c11565b005b3480156103ae57600080fd5b506103b7610c21565b6040516103c49190612e4a565b60405180910390f35b3480156103d957600080fd5b506103e2610c27565b6040516103ef9190612ee7565b60405180910390f35b34801561040457600080fd5b5061040d610c2d565b60405161041a9190612ee7565b60405180910390f35b34801561042f57600080fd5b50610438610c33565b6040516104459190612ee7565b60405180910390f35b34801561045a57600080fd5b50610463610c39565b005b34801561047157600080fd5b5061048c60048036038101906104879190612931565b610d3a565b005b34801561049a57600080fd5b506104b560048036038101906104b09190612a73565b610d5a565b005b3480156104c357600080fd5b506104cc610ee7565b6040516104d99190612e2f565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612ba1565b610efa565b6040516105169190612dc8565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190612ab8565b610f0c565b005b34801561055457600080fd5b5061056f600480360381019061056a91906128cc565b610fa5565b60405161057c9190612ee7565b60405180910390f35b34801561059157600080fd5b5061059a61105e565b005b3480156105a857600080fd5b506105c360048036038101906105be91906128cc565b6110e6565b6040516105d09190612e2f565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190612ae1565b611106565b005b34801561060e57600080fd5b5061061761118c565b6040516106249190612ee7565b60405180910390f35b34801561063957600080fd5b50610642611192565b60405161064f9190612ee7565b60405180910390f35b34801561066457600080fd5b5061066d611198565b60405161067a9190612dc8565b60405180910390f35b34801561068f57600080fd5b506106986111c2565b6040516106a59190612e65565b60405180910390f35b6106c860048036038101906106c39190612ba1565b611254565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190612b5c565b6113d7565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906129fb565b611469565b005b34801561072857600080fd5b50610743600480360381019061073e9190612980565b6115e1565b005b34801561075157600080fd5b5061076c60048036038101906107679190612ba1565b611654565b6040516107799190612e65565b60405180910390f35b34801561078e57600080fd5b506107976116f3565b6040516107a49190612e65565b60405180910390f35b3480156107b957600080fd5b506107d460048036038101906107cf91906128f5565b611781565b6040516107e19190612e2f565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190612ba1565b611815565b005b34801561081f57600080fd5b5061083a60048036038101906108359190612ba1565b6118b8565b005b34801561084857600080fd5b50610863600480360381019061085e91906128cc565b61193e565b005b34801561087157600080fd5b5061087a611a36565b005b34801561088857600080fd5b50610891611acf565b60405161089e9190612e2f565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109325750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b60606002805461094e9061314a565b80601f016020809104026020016040519081016040528092919081815260200182805461097a9061314a565b80156109c75780601f1061099c576101008083540402835291602001916109c7565b820191906000526020600020905b8154815290600101906020018083116109aa57829003601f168201915b5050505050905090565b60006109dc82611ae2565b610a12576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5882611b41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610adf611c0f565b73ffffffffffffffffffffffffffffffffffffffff1614610b4257610b0b81610b06611c0f565b611781565b610b41576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bfe611c17565b6001546000540303905090565b600e5481565b610c1c838383611c1c565b505050565b60105481565b60095481565b600f5481565b60135481565b610c41611fc6565b73ffffffffffffffffffffffffffffffffffffffff16610c5f611198565b73ffffffffffffffffffffffffffffffffffffffff1614610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90612ec7565b60405180910390fd5b60004790507384f6ffef5d9e888049e46c7edd618a817f6c2c0673ffffffffffffffffffffffffffffffffffffffff1681604051610cf290612db3565b60006040518083038185875af1925050503d8060008114610d2f576040519150601f19603f3d011682016040523d82523d6000602084013e610d34565b606091505b50505050565b610d55838383604051806020016040528060008152506115e1565b505050565b601260009054906101000a900460ff16610d7357600080fd5b600b54600e5410610d8357600080fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610dda57600080fd5b6000336001604051602001610df0929190612d63565b6040516020818303038152906040528051906020012090506000610e58848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105484611fce565b905080610e6457600080fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ec7336001611fe5565b6001600e6000828254610eda9190612fa6565b9250508190555050505050565b601460009054906101000a900460ff1681565b6000610f0582611b41565b9050919050565b610f14611fc6565b73ffffffffffffffffffffffffffffffffffffffff16610f32611198565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90612ec7565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561100d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611066611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611084611198565b73ffffffffffffffffffffffffffffffffffffffff16146110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190612ec7565b60405180910390fd5b6110e46000612003565b565b60116020528060005260406000206000915054906101000a900460ff1681565b61110e611fc6565b73ffffffffffffffffffffffffffffffffffffffff1661112c611198565b73ffffffffffffffffffffffffffffffffffffffff1614611182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117990612ec7565b60405180910390fd5b8060108190555050565b600a5481565b600c5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111d19061314a565b80601f01602080910402602001604051908101604052809291908181526020018280546111fd9061314a565b801561124a5780601f1061121f5761010080835404028352916020019161124a565b820191906000526020600020905b81548152906001019060200180831161122d57829003601f168201915b5050505050905090565b601260009054906101000a900460ff1661126d57600080fd5b600a54600f541061127d57600080fd5b60135481111561128d5760135490505b6009546112986120c9565b826112a39190612fa6565b11156112c1576112b16120c9565b6009546112be9190613056565b90505b600c54816112cf9190612ffc565b341015611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890612e87565b60405180910390fd5b61131b3382611fe5565b6001600f600082825461132e9190612fa6565b925050819055506000600c54826113459190612ffc565b346113509190613056565b905060008111156113d35760003373ffffffffffffffffffffffffffffffffffffffff168260405161138190612db3565b60006040518083038185875af1925050503d80600081146113be576040519150601f19603f3d011682016040523d82523d6000602084013e6113c3565b606091505b50509050806113d157600080fd5b505b5050565b6113df611fc6565b73ffffffffffffffffffffffffffffffffffffffff166113fd611198565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90612ec7565b60405180910390fd5b8181600d91906114649291906126af565b505050565b611471611c0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114e3611c0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611590611c0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115d59190612e2f565b60405180910390a35050565b6115ec848484611c1c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461164e57611617848484846120dc565b61164d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061165f82611ae2565b611695576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061169f61223c565b90506000815114156116c057604051806020016040528060008152506116eb565b806116ca846122ce565b6040516020016116db929190612d8f565b6040516020818303038152906040525b915050919050565b600d80546117009061314a565b80601f016020809104026020016040519081016040528092919081815260200182805461172c9061314a565b80156117795780601f1061174e57610100808354040283529160200191611779565b820191906000526020600020905b81548152906001019060200180831161175c57829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61181d611fc6565b73ffffffffffffffffffffffffffffffffffffffff1661183b611198565b73ffffffffffffffffffffffffffffffffffffffff1614611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890612ec7565b60405180910390fd5b601460009054906101000a900460ff16156118ab57600080fd5b6118b53382611fe5565b50565b6118c0611fc6565b73ffffffffffffffffffffffffffffffffffffffff166118de611198565b73ffffffffffffffffffffffffffffffffffffffff1614611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b90612ec7565b60405180910390fd5b8060138190555050565b611946611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611964611198565b73ffffffffffffffffffffffffffffffffffffffff16146119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190612ec7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190612ea7565b60405180910390fd5b611a3381612003565b50565b611a3e611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611a5c611198565b73ffffffffffffffffffffffffffffffffffffffff1614611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990612ec7565b60405180910390fd5b6001601460006101000a81548160ff021916908315150217905550565b601260009054906101000a900460ff1681565b600081611aed611c17565b11158015611afc575060005482105b8015611b3a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611b50611c17565b11611bd857600054811015611bd75760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611bd5575b6000811415611bcb576004600083600190039350838152602001908152602001600020549050611ba0565b8092505050611c0a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611c2782611b41565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c8e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611caf611c0f565b73ffffffffffffffffffffffffffffffffffffffff161480611cde5750611cdd85611cd8611c0f565b611781565b5b80611d235750611cec611c0f565b73ffffffffffffffffffffffffffffffffffffffff16611d0b846109d1565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d5c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dc3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dd08585856001612328565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611ecd8661232e565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611f57576000600184019050600060046000838152602001908152602001600020541415611f55576000548114611f54578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fbf8585856001612338565b5050505050565b600033905090565b600082611fdb858461233e565b1490509392505050565b611fff8282604051806020016040528060008152506123d9565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006120d3611c17565b60005403905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612102611c0f565b8786866040518563ffffffff1660e01b81526004016121249493929190612de3565b602060405180830381600087803b15801561213e57600080fd5b505af192505050801561216f57506040513d601f19601f8201168201806040525081019061216c9190612b33565b60015b6121e9573d806000811461219f576040519150601f19603f3d011682016040523d82523d6000602084013e6121a4565b606091505b506000815114156121e1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d805461224b9061314a565b80601f01602080910402602001604051908101604052809291908181526020018280546122779061314a565b80156122c45780601f10612299576101008083540402835291602001916122c4565b820191906000526020600020905b8154815290600101906020018083116122a757829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561231457600183039250600a81066030018353600a810490506122f4565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60008082905060005b84518110156123ce57600085828151811061238b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116123ad576123a6838261268e565b92506123ba565b6123b7818461268e565b92505b5080806123c6906131ad565b915050612347565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612446576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612481576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61248e6000858386612328565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16124f3600185146126a5565b901b60a042901b6125038661232e565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612607575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b760008784806001019550876120dc565b6125ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061254857826000541461260257600080fd5b612672565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612608575b8160008190555050506126886000858386612338565b50505050565b600082600052816020526040600020905092915050565b6000819050919050565b8280546126bb9061314a565b90600052602060002090601f0160209004810192826126dd5760008555612724565b82601f106126f657803560ff1916838001178555612724565b82800160010185558215612724579182015b82811115612723578235825591602001919060010190612708565b5b5090506127319190612735565b5090565b5b8082111561274e576000816000905550600101612736565b5090565b600061276561276084612f27565b612f02565b90508281526020810184848401111561277d57600080fd5b612788848285613108565b509392505050565b60008135905061279f81613373565b92915050565b60008083601f8401126127b757600080fd5b8235905067ffffffffffffffff8111156127d057600080fd5b6020830191508360208202830111156127e857600080fd5b9250929050565b6000813590506127fe8161338a565b92915050565b600081359050612813816133a1565b92915050565b600081359050612828816133b8565b92915050565b60008151905061283d816133b8565b92915050565b600082601f83011261285457600080fd5b8135612864848260208601612752565b91505092915050565b60008083601f84011261287f57600080fd5b8235905067ffffffffffffffff81111561289857600080fd5b6020830191508360018202830111156128b057600080fd5b9250929050565b6000813590506128c6816133cf565b92915050565b6000602082840312156128de57600080fd5b60006128ec84828501612790565b91505092915050565b6000806040838503121561290857600080fd5b600061291685828601612790565b925050602061292785828601612790565b9150509250929050565b60008060006060848603121561294657600080fd5b600061295486828701612790565b935050602061296586828701612790565b9250506040612976868287016128b7565b9150509250925092565b6000806000806080858703121561299657600080fd5b60006129a487828801612790565b94505060206129b587828801612790565b93505060406129c6878288016128b7565b925050606085013567ffffffffffffffff8111156129e357600080fd5b6129ef87828801612843565b91505092959194509250565b60008060408385031215612a0e57600080fd5b6000612a1c85828601612790565b9250506020612a2d858286016127ef565b9150509250929050565b60008060408385031215612a4a57600080fd5b6000612a5885828601612790565b9250506020612a69858286016128b7565b9150509250929050565b60008060208385031215612a8657600080fd5b600083013567ffffffffffffffff811115612aa057600080fd5b612aac858286016127a5565b92509250509250929050565b600060208284031215612aca57600080fd5b6000612ad8848285016127ef565b91505092915050565b600060208284031215612af357600080fd5b6000612b0184828501612804565b91505092915050565b600060208284031215612b1c57600080fd5b6000612b2a84828501612819565b91505092915050565b600060208284031215612b4557600080fd5b6000612b538482850161282e565b91505092915050565b60008060208385031215612b6f57600080fd5b600083013567ffffffffffffffff811115612b8957600080fd5b612b958582860161286d565b92509250509250929050565b600060208284031215612bb357600080fd5b6000612bc1848285016128b7565b91505092915050565b612bd38161308a565b82525050565b612bea612be58261308a565b6131f6565b82525050565b612bf98161309c565b82525050565b612c08816130a8565b82525050565b6000612c1982612f58565b612c238185612f6e565b9350612c33818560208601613117565b612c3c816132b1565b840191505092915050565b6000612c5282612f63565b612c5c8185612f8a565b9350612c6c818560208601613117565b612c75816132b1565b840191505092915050565b6000612c8b82612f63565b612c958185612f9b565b9350612ca5818560208601613117565b80840191505092915050565b6000612cbe601483612f8a565b9150612cc9826132cf565b602082019050919050565b6000612ce1602683612f8a565b9150612cec826132f8565b604082019050919050565b6000612d04602083612f8a565b9150612d0f82613347565b602082019050919050565b6000612d27600083612f7f565b9150612d3282613370565b600082019050919050565b612d46816130fe565b82525050565b612d5d612d58826130fe565b61321a565b82525050565b6000612d6f8285612bd9565b601482019150612d7f8284612d4c565b6020820191508190509392505050565b6000612d9b8285612c80565b9150612da78284612c80565b91508190509392505050565b6000612dbe82612d1a565b9150819050919050565b6000602082019050612ddd6000830184612bca565b92915050565b6000608082019050612df86000830187612bca565b612e056020830186612bca565b612e126040830185612d3d565b8181036060830152612e248184612c0e565b905095945050505050565b6000602082019050612e446000830184612bf0565b92915050565b6000602082019050612e5f6000830184612bff565b92915050565b60006020820190508181036000830152612e7f8184612c47565b905092915050565b60006020820190508181036000830152612ea081612cb1565b9050919050565b60006020820190508181036000830152612ec081612cd4565b9050919050565b60006020820190508181036000830152612ee081612cf7565b9050919050565b6000602082019050612efc6000830184612d3d565b92915050565b6000612f0c612f1d565b9050612f18828261317c565b919050565b6000604051905090565b600067ffffffffffffffff821115612f4257612f41613282565b5b612f4b826132b1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612fb1826130fe565b9150612fbc836130fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ff157612ff0613224565b5b828201905092915050565b6000613007826130fe565b9150613012836130fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561304b5761304a613224565b5b828202905092915050565b6000613061826130fe565b915061306c836130fe565b92508282101561307f5761307e613224565b5b828203905092915050565b6000613095826130de565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561313557808201518184015260208101905061311a565b83811115613144576000848401525b50505050565b6000600282049050600182168061316257607f821691505b6020821081141561317657613175613253565b5b50919050565b613185826132b1565b810181811067ffffffffffffffff821117156131a4576131a3613282565b5b80604052505050565b60006131b8826130fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131eb576131ea613224565b5b600182019050919050565b600061320182613208565b9050919050565b6000613213826132c2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f7420656e6f756768204554482073656e742e000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61337c8161308a565b811461338757600080fd5b50565b6133938161309c565b811461339e57600080fd5b50565b6133aa816130a8565b81146133b557600080fd5b50565b6133c1816130b2565b81146133cc57600080fd5b50565b6133d8816130fe565b81146133e357600080fd5b5056fea2646970667358221220551a6125546d7b37bc2d3bda0db42c38f852c7dbafabdbe0916df00f787de82164736f6c63430008040033
Deployed Bytecode
0x6080604052600436106102255760003560e01c8063715018a611610123578063a22cb465116100ab578063f19e75d41161006f578063f19e75d4146107ea578063f1d5f51714610813578063f2fde38b1461083c578063f8873b3e14610865578063fcfff16f1461087c57610225565b8063a22cb465146106f3578063b88d4fde1461071c578063c87b56dd14610745578063dbddb26a14610782578063e985e9c5146107ad57610225565b80638d859f3e116100f25780638d859f3e1461062d5780638da5cb5b1461065857806395d89b4114610683578063a0712d68146106ae578063a0bcfc7f146106ca57610225565b8063715018a61461058557806373b2e80e1461059c5780637cb64759146105d957806385bb1bf41461060257610225565b806332cb6b0c116101b157806344d843811161017557806344d843811461048e5780635b688957146104b75780636352211e146104e25780636fdca5e01461051f57806370a082311461054857610225565b806332cb6b0c146103cd57806334976b9b146103f85780633c8463a1146104235780633ccfd60b1461044e57806342842e0e1461046557610225565b8063095ea7b3116101f8578063095ea7b3146102fa57806318160ddd146103235780631b47ec3a1461034e57806323b872dd146103795780632eb4a7ab146103a257610225565b806301ffc9a71461022a57806302ddb65b1461026757806306fdde0314610292578063081812fc146102bd575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612b0a565b6108a7565b60405161025e9190612e2f565b60405180910390f35b34801561027357600080fd5b5061027c610939565b6040516102899190612ee7565b60405180910390f35b34801561029e57600080fd5b506102a761093f565b6040516102b49190612e65565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df9190612ba1565b6109d1565b6040516102f19190612dc8565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190612a37565b610a4d565b005b34801561032f57600080fd5b50610338610bf4565b6040516103459190612ee7565b60405180910390f35b34801561035a57600080fd5b50610363610c0b565b6040516103709190612ee7565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190612931565b610c11565b005b3480156103ae57600080fd5b506103b7610c21565b6040516103c49190612e4a565b60405180910390f35b3480156103d957600080fd5b506103e2610c27565b6040516103ef9190612ee7565b60405180910390f35b34801561040457600080fd5b5061040d610c2d565b60405161041a9190612ee7565b60405180910390f35b34801561042f57600080fd5b50610438610c33565b6040516104459190612ee7565b60405180910390f35b34801561045a57600080fd5b50610463610c39565b005b34801561047157600080fd5b5061048c60048036038101906104879190612931565b610d3a565b005b34801561049a57600080fd5b506104b560048036038101906104b09190612a73565b610d5a565b005b3480156104c357600080fd5b506104cc610ee7565b6040516104d99190612e2f565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612ba1565b610efa565b6040516105169190612dc8565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190612ab8565b610f0c565b005b34801561055457600080fd5b5061056f600480360381019061056a91906128cc565b610fa5565b60405161057c9190612ee7565b60405180910390f35b34801561059157600080fd5b5061059a61105e565b005b3480156105a857600080fd5b506105c360048036038101906105be91906128cc565b6110e6565b6040516105d09190612e2f565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190612ae1565b611106565b005b34801561060e57600080fd5b5061061761118c565b6040516106249190612ee7565b60405180910390f35b34801561063957600080fd5b50610642611192565b60405161064f9190612ee7565b60405180910390f35b34801561066457600080fd5b5061066d611198565b60405161067a9190612dc8565b60405180910390f35b34801561068f57600080fd5b506106986111c2565b6040516106a59190612e65565b60405180910390f35b6106c860048036038101906106c39190612ba1565b611254565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190612b5c565b6113d7565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906129fb565b611469565b005b34801561072857600080fd5b50610743600480360381019061073e9190612980565b6115e1565b005b34801561075157600080fd5b5061076c60048036038101906107679190612ba1565b611654565b6040516107799190612e65565b60405180910390f35b34801561078e57600080fd5b506107976116f3565b6040516107a49190612e65565b60405180910390f35b3480156107b957600080fd5b506107d460048036038101906107cf91906128f5565b611781565b6040516107e19190612e2f565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190612ba1565b611815565b005b34801561081f57600080fd5b5061083a60048036038101906108359190612ba1565b6118b8565b005b34801561084857600080fd5b50610863600480360381019061085e91906128cc565b61193e565b005b34801561087157600080fd5b5061087a611a36565b005b34801561088857600080fd5b50610891611acf565b60405161089e9190612e2f565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109325750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b60606002805461094e9061314a565b80601f016020809104026020016040519081016040528092919081815260200182805461097a9061314a565b80156109c75780601f1061099c576101008083540402835291602001916109c7565b820191906000526020600020905b8154815290600101906020018083116109aa57829003601f168201915b5050505050905090565b60006109dc82611ae2565b610a12576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5882611b41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610adf611c0f565b73ffffffffffffffffffffffffffffffffffffffff1614610b4257610b0b81610b06611c0f565b611781565b610b41576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bfe611c17565b6001546000540303905090565b600e5481565b610c1c838383611c1c565b505050565b60105481565b60095481565b600f5481565b60135481565b610c41611fc6565b73ffffffffffffffffffffffffffffffffffffffff16610c5f611198565b73ffffffffffffffffffffffffffffffffffffffff1614610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90612ec7565b60405180910390fd5b60004790507384f6ffef5d9e888049e46c7edd618a817f6c2c0673ffffffffffffffffffffffffffffffffffffffff1681604051610cf290612db3565b60006040518083038185875af1925050503d8060008114610d2f576040519150601f19603f3d011682016040523d82523d6000602084013e610d34565b606091505b50505050565b610d55838383604051806020016040528060008152506115e1565b505050565b601260009054906101000a900460ff16610d7357600080fd5b600b54600e5410610d8357600080fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610dda57600080fd5b6000336001604051602001610df0929190612d63565b6040516020818303038152906040528051906020012090506000610e58848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105484611fce565b905080610e6457600080fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ec7336001611fe5565b6001600e6000828254610eda9190612fa6565b9250508190555050505050565b601460009054906101000a900460ff1681565b6000610f0582611b41565b9050919050565b610f14611fc6565b73ffffffffffffffffffffffffffffffffffffffff16610f32611198565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90612ec7565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561100d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611066611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611084611198565b73ffffffffffffffffffffffffffffffffffffffff16146110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190612ec7565b60405180910390fd5b6110e46000612003565b565b60116020528060005260406000206000915054906101000a900460ff1681565b61110e611fc6565b73ffffffffffffffffffffffffffffffffffffffff1661112c611198565b73ffffffffffffffffffffffffffffffffffffffff1614611182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117990612ec7565b60405180910390fd5b8060108190555050565b600a5481565b600c5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111d19061314a565b80601f01602080910402602001604051908101604052809291908181526020018280546111fd9061314a565b801561124a5780601f1061121f5761010080835404028352916020019161124a565b820191906000526020600020905b81548152906001019060200180831161122d57829003601f168201915b5050505050905090565b601260009054906101000a900460ff1661126d57600080fd5b600a54600f541061127d57600080fd5b60135481111561128d5760135490505b6009546112986120c9565b826112a39190612fa6565b11156112c1576112b16120c9565b6009546112be9190613056565b90505b600c54816112cf9190612ffc565b341015611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890612e87565b60405180910390fd5b61131b3382611fe5565b6001600f600082825461132e9190612fa6565b925050819055506000600c54826113459190612ffc565b346113509190613056565b905060008111156113d35760003373ffffffffffffffffffffffffffffffffffffffff168260405161138190612db3565b60006040518083038185875af1925050503d80600081146113be576040519150601f19603f3d011682016040523d82523d6000602084013e6113c3565b606091505b50509050806113d157600080fd5b505b5050565b6113df611fc6565b73ffffffffffffffffffffffffffffffffffffffff166113fd611198565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90612ec7565b60405180910390fd5b8181600d91906114649291906126af565b505050565b611471611c0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114e3611c0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611590611c0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115d59190612e2f565b60405180910390a35050565b6115ec848484611c1c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461164e57611617848484846120dc565b61164d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061165f82611ae2565b611695576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061169f61223c565b90506000815114156116c057604051806020016040528060008152506116eb565b806116ca846122ce565b6040516020016116db929190612d8f565b6040516020818303038152906040525b915050919050565b600d80546117009061314a565b80601f016020809104026020016040519081016040528092919081815260200182805461172c9061314a565b80156117795780601f1061174e57610100808354040283529160200191611779565b820191906000526020600020905b81548152906001019060200180831161175c57829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61181d611fc6565b73ffffffffffffffffffffffffffffffffffffffff1661183b611198565b73ffffffffffffffffffffffffffffffffffffffff1614611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890612ec7565b60405180910390fd5b601460009054906101000a900460ff16156118ab57600080fd5b6118b53382611fe5565b50565b6118c0611fc6565b73ffffffffffffffffffffffffffffffffffffffff166118de611198565b73ffffffffffffffffffffffffffffffffffffffff1614611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b90612ec7565b60405180910390fd5b8060138190555050565b611946611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611964611198565b73ffffffffffffffffffffffffffffffffffffffff16146119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190612ec7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190612ea7565b60405180910390fd5b611a3381612003565b50565b611a3e611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611a5c611198565b73ffffffffffffffffffffffffffffffffffffffff1614611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990612ec7565b60405180910390fd5b6001601460006101000a81548160ff021916908315150217905550565b601260009054906101000a900460ff1681565b600081611aed611c17565b11158015611afc575060005482105b8015611b3a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611b50611c17565b11611bd857600054811015611bd75760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611bd5575b6000811415611bcb576004600083600190039350838152602001908152602001600020549050611ba0565b8092505050611c0a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611c2782611b41565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c8e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611caf611c0f565b73ffffffffffffffffffffffffffffffffffffffff161480611cde5750611cdd85611cd8611c0f565b611781565b5b80611d235750611cec611c0f565b73ffffffffffffffffffffffffffffffffffffffff16611d0b846109d1565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d5c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dc3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dd08585856001612328565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611ecd8661232e565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611f57576000600184019050600060046000838152602001908152602001600020541415611f55576000548114611f54578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fbf8585856001612338565b5050505050565b600033905090565b600082611fdb858461233e565b1490509392505050565b611fff8282604051806020016040528060008152506123d9565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006120d3611c17565b60005403905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612102611c0f565b8786866040518563ffffffff1660e01b81526004016121249493929190612de3565b602060405180830381600087803b15801561213e57600080fd5b505af192505050801561216f57506040513d601f19601f8201168201806040525081019061216c9190612b33565b60015b6121e9573d806000811461219f576040519150601f19603f3d011682016040523d82523d6000602084013e6121a4565b606091505b506000815114156121e1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d805461224b9061314a565b80601f01602080910402602001604051908101604052809291908181526020018280546122779061314a565b80156122c45780601f10612299576101008083540402835291602001916122c4565b820191906000526020600020905b8154815290600101906020018083116122a757829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561231457600183039250600a81066030018353600a810490506122f4565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60008082905060005b84518110156123ce57600085828151811061238b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116123ad576123a6838261268e565b92506123ba565b6123b7818461268e565b92505b5080806123c6906131ad565b915050612347565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612446576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612481576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61248e6000858386612328565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16124f3600185146126a5565b901b60a042901b6125038661232e565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612607575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b760008784806001019550876120dc565b6125ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061254857826000541461260257600080fd5b612672565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612608575b8160008190555050506126886000858386612338565b50505050565b600082600052816020526040600020905092915050565b6000819050919050565b8280546126bb9061314a565b90600052602060002090601f0160209004810192826126dd5760008555612724565b82601f106126f657803560ff1916838001178555612724565b82800160010185558215612724579182015b82811115612723578235825591602001919060010190612708565b5b5090506127319190612735565b5090565b5b8082111561274e576000816000905550600101612736565b5090565b600061276561276084612f27565b612f02565b90508281526020810184848401111561277d57600080fd5b612788848285613108565b509392505050565b60008135905061279f81613373565b92915050565b60008083601f8401126127b757600080fd5b8235905067ffffffffffffffff8111156127d057600080fd5b6020830191508360208202830111156127e857600080fd5b9250929050565b6000813590506127fe8161338a565b92915050565b600081359050612813816133a1565b92915050565b600081359050612828816133b8565b92915050565b60008151905061283d816133b8565b92915050565b600082601f83011261285457600080fd5b8135612864848260208601612752565b91505092915050565b60008083601f84011261287f57600080fd5b8235905067ffffffffffffffff81111561289857600080fd5b6020830191508360018202830111156128b057600080fd5b9250929050565b6000813590506128c6816133cf565b92915050565b6000602082840312156128de57600080fd5b60006128ec84828501612790565b91505092915050565b6000806040838503121561290857600080fd5b600061291685828601612790565b925050602061292785828601612790565b9150509250929050565b60008060006060848603121561294657600080fd5b600061295486828701612790565b935050602061296586828701612790565b9250506040612976868287016128b7565b9150509250925092565b6000806000806080858703121561299657600080fd5b60006129a487828801612790565b94505060206129b587828801612790565b93505060406129c6878288016128b7565b925050606085013567ffffffffffffffff8111156129e357600080fd5b6129ef87828801612843565b91505092959194509250565b60008060408385031215612a0e57600080fd5b6000612a1c85828601612790565b9250506020612a2d858286016127ef565b9150509250929050565b60008060408385031215612a4a57600080fd5b6000612a5885828601612790565b9250506020612a69858286016128b7565b9150509250929050565b60008060208385031215612a8657600080fd5b600083013567ffffffffffffffff811115612aa057600080fd5b612aac858286016127a5565b92509250509250929050565b600060208284031215612aca57600080fd5b6000612ad8848285016127ef565b91505092915050565b600060208284031215612af357600080fd5b6000612b0184828501612804565b91505092915050565b600060208284031215612b1c57600080fd5b6000612b2a84828501612819565b91505092915050565b600060208284031215612b4557600080fd5b6000612b538482850161282e565b91505092915050565b60008060208385031215612b6f57600080fd5b600083013567ffffffffffffffff811115612b8957600080fd5b612b958582860161286d565b92509250509250929050565b600060208284031215612bb357600080fd5b6000612bc1848285016128b7565b91505092915050565b612bd38161308a565b82525050565b612bea612be58261308a565b6131f6565b82525050565b612bf98161309c565b82525050565b612c08816130a8565b82525050565b6000612c1982612f58565b612c238185612f6e565b9350612c33818560208601613117565b612c3c816132b1565b840191505092915050565b6000612c5282612f63565b612c5c8185612f8a565b9350612c6c818560208601613117565b612c75816132b1565b840191505092915050565b6000612c8b82612f63565b612c958185612f9b565b9350612ca5818560208601613117565b80840191505092915050565b6000612cbe601483612f8a565b9150612cc9826132cf565b602082019050919050565b6000612ce1602683612f8a565b9150612cec826132f8565b604082019050919050565b6000612d04602083612f8a565b9150612d0f82613347565b602082019050919050565b6000612d27600083612f7f565b9150612d3282613370565b600082019050919050565b612d46816130fe565b82525050565b612d5d612d58826130fe565b61321a565b82525050565b6000612d6f8285612bd9565b601482019150612d7f8284612d4c565b6020820191508190509392505050565b6000612d9b8285612c80565b9150612da78284612c80565b91508190509392505050565b6000612dbe82612d1a565b9150819050919050565b6000602082019050612ddd6000830184612bca565b92915050565b6000608082019050612df86000830187612bca565b612e056020830186612bca565b612e126040830185612d3d565b8181036060830152612e248184612c0e565b905095945050505050565b6000602082019050612e446000830184612bf0565b92915050565b6000602082019050612e5f6000830184612bff565b92915050565b60006020820190508181036000830152612e7f8184612c47565b905092915050565b60006020820190508181036000830152612ea081612cb1565b9050919050565b60006020820190508181036000830152612ec081612cd4565b9050919050565b60006020820190508181036000830152612ee081612cf7565b9050919050565b6000602082019050612efc6000830184612d3d565b92915050565b6000612f0c612f1d565b9050612f18828261317c565b919050565b6000604051905090565b600067ffffffffffffffff821115612f4257612f41613282565b5b612f4b826132b1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612fb1826130fe565b9150612fbc836130fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ff157612ff0613224565b5b828201905092915050565b6000613007826130fe565b9150613012836130fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561304b5761304a613224565b5b828202905092915050565b6000613061826130fe565b915061306c836130fe565b92508282101561307f5761307e613224565b5b828203905092915050565b6000613095826130de565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561313557808201518184015260208101905061311a565b83811115613144576000848401525b50505050565b6000600282049050600182168061316257607f821691505b6020821081141561317657613175613253565b5b50919050565b613185826132b1565b810181811067ffffffffffffffff821117156131a4576131a3613282565b5b80604052505050565b60006131b8826130fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131eb576131ea613224565b5b600182019050919050565b600061320182613208565b9050919050565b6000613213826132c2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f7420656e6f756768204554482073656e742e000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61337c8161308a565b811461338757600080fd5b50565b6133938161309c565b811461339e57600080fd5b50565b6133aa816130a8565b81146133b557600080fd5b50565b6133c1816130b2565b81146133cc57600080fd5b50565b6133d8816130fe565b81146133e357600080fd5b5056fea2646970667358221220551a6125546d7b37bc2d3bda0db42c38f852c7dbafabdbe0916df00f787de82164736f6c63430008040033
Deployed Bytecode Sourcemap
44652:2877:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13180:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44780:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18193:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20261:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19721:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12234:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44899:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21147:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44970:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44698:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44936:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45076:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47341:185;;;;;;;;;;;;;:::i;:::-;;21388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45430:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45109:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17982:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47158:69;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13859:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43767:103;;;;;;;;;;;;;:::i;:::-;;45002:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46958:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44737:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44823:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43116:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18362:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46051:681;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46849:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20537:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21644:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18537:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44863:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20916:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45291:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47056:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44025:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47235:98;;;;;;;;;;;;;:::i;:::-;;45053:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13180:615;13265:4;13580:10;13565:25;;:11;:25;;;;:102;;;;13657:10;13642:25;;:11;:25;;;;13565:102;:179;;;;13734:10;13719:25;;:11;:25;;;;13565:179;13545:199;;13180:615;;;:::o;44780:36::-;;;;:::o;18193:100::-;18247:13;18280:5;18273:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18193:100;:::o;20261:204::-;20329:7;20354:16;20362:7;20354;:16::i;:::-;20349:64;;20379:34;;;;;;;;;;;;;;20349:64;20433:15;:24;20449:7;20433:24;;;;;;;;;;;;;;;;;;;;;20426:31;;20261:204;;;:::o;19721:474::-;19794:13;19826:27;19845:7;19826:18;:27::i;:::-;19794:61;;19876:5;19870:11;;:2;:11;;;19866:48;;;19890:24;;;;;;;;;;;;;;19866:48;19954:5;19931:28;;:19;:17;:19::i;:::-;:28;;;19927:175;;19979:44;19996:5;20003:19;:17;:19::i;:::-;19979:16;:44::i;:::-;19974:128;;20051:35;;;;;;;;;;;;;;19974:128;19927:175;20141:2;20114:15;:24;20130:7;20114:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20179:7;20175:2;20159:28;;20168:5;20159:28;;;;;;;;;;;;19721:474;;;:::o;12234:315::-;12287:7;12515:15;:13;:15::i;:::-;12500:12;;12484:13;;:28;:46;12477:53;;12234:315;:::o;44899:30::-;;;;:::o;21147:170::-;21281:28;21291:4;21297:2;21301:7;21281:9;:28::i;:::-;21147:170;;;:::o;44970:25::-;;;;:::o;44698:32::-;;;;:::o;44936:25::-;;;;:::o;45076:26::-;;;;:::o;47341:185::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47391:11:::1;47405:21;47391:35;;47453:42;47437:65;;47510:3;47437:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43407:1;47341:185::o:0;21388:::-;21526:39;21543:4;21549:2;21553:7;21526:39;;;;;;;;;;;;:16;:39::i;:::-;21388:185;;;:::o;45430:613::-;45507:4;;;;;;;;;;;45499:13;;;;;;45545:15;;45531:11;;:29;45523:38;;;;;;45578:10;:22;45589:10;45578:22;;;;;;;;;;;;;;;;;;;;;;;;;45574:36;;;45602:8;;;45574:36;45681:12;45723:10;45743:1;45706:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45696:51;;;;;;45681:66;;45758:16;45777:43;45796:5;;45777:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45803:10;;45815:4;45777:18;:43::i;:::-;45758:62;;45836:11;45831:26;;45849:8;;;45831:26;45930:4;45905:10;:22;45916:10;45905:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45982:24;45992:10;46004:1;45982:9;:24::i;:::-;46034:1;46019:11;;:16;;;;;;;:::i;:::-;;;;;;;;45430:613;;;;:::o;45109:28::-;;;;;;;;;;;;;:::o;17982:144::-;18046:7;18089:27;18108:7;18089:18;:27::i;:::-;18066:52;;17982:144;;;:::o;47158:69::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47218:1:::1;47211:4;;:8;;;;;;;;;;;;;;;;;;47158:69:::0;:::o;13859:224::-;13923:7;13964:1;13947:19;;:5;:19;;;13943:60;;;13975:28;;;;;;;;;;;;;;13943:60;9198:13;14021:18;:25;14040:5;14021:25;;;;;;;;;;;;;;;;:54;14014:61;;13859:224;;;:::o;43767:103::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43832:30:::1;43859:1;43832:18;:30::i;:::-;43767:103::o:0;45002:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;46958:90::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47036:4:::1;47023:10;:17;;;;46958:90:::0;:::o;44737:36::-;;;;:::o;44823:33::-;;;;:::o;43116:87::-;43162:7;43189:6;;;;;;;;;;;43182:13;;43116:87;:::o;18362:104::-;18418:13;18451:7;18444:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18362:104;:::o;46051:681::-;46119:4;;;;;;;;;;;46111:13;;;;;;46152:14;;46143:6;;:23;46135:32;;;;;;46195:11;;46184:8;:22;46180:77;;;46234:11;;46223:22;;46180:77;46301:10;;46284:14;:12;:14::i;:::-;46273:8;:25;;;;:::i;:::-;:38;46269:109;;;46352:14;:12;:14::i;:::-;46339:10;;:27;;;;:::i;:::-;46328:38;;46269:109;46422:5;;46411:8;:16;;;;:::i;:::-;46398:9;:29;;46390:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46465:31;46475:10;46487:8;46465:9;:31::i;:::-;46517:1;46507:6;;:11;;;;;;;:::i;:::-;;;;;;;;46531:17;46575:5;;46564:8;:16;;;;:::i;:::-;46551:9;:30;;;;:::i;:::-;46531:50;;46608:1;46596:9;:13;46592:133;;;46627:12;46645:10;:15;;46668:9;46645:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46626:56;;;46705:7;46697:16;;;;;;46592:133;;46051:681;;:::o;46849:101::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46934:8:::1;;46923;:19;;;;;;;:::i;:::-;;46849:101:::0;;:::o;20537:308::-;20648:19;:17;:19::i;:::-;20636:31;;:8;:31;;;20632:61;;;20676:17;;;;;;;;;;;;;;20632:61;20758:8;20706:18;:39;20725:19;:17;:19::i;:::-;20706:39;;;;;;;;;;;;;;;:49;20746:8;20706:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20818:8;20782:55;;20797:19;:17;:19::i;:::-;20782:55;;;20828:8;20782:55;;;;;;:::i;:::-;;;;;;;;20537:308;;:::o;21644:396::-;21811:28;21821:4;21827:2;21831:7;21811:9;:28::i;:::-;21872:1;21854:2;:14;;;:19;21850:183;;21893:56;21924:4;21930:2;21934:7;21943:5;21893:30;:56::i;:::-;21888:145;;21977:40;;;;;;;;;;;;;;21888:145;21850:183;21644:396;;;;:::o;18537:318::-;18610:13;18641:16;18649:7;18641;:16::i;:::-;18636:59;;18666:29;;;;;;;;;;;;;;18636:59;18708:21;18732:10;:8;:10::i;:::-;18708:34;;18785:1;18766:7;18760:21;:26;;:87;;;;;;;;;;;;;;;;;18813:7;18822:18;18832:7;18822:9;:18::i;:::-;18796:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18760:87;18753:94;;;18537:318;;;:::o;44863:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20916:164::-;21013:4;21037:18;:25;21056:5;21037:25;;;;;;;;;;;;;;;:35;21063:8;21037:35;;;;;;;;;;;;;;;;;;;;;;;;;21030:42;;20916:164;;;;:::o;45291:131::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45360:16:::1;;;;;;;;;;;45359:17;45351:26;;;::::0;::::1;;45388;45398:10;45410:3;45388:9;:26::i;:::-;45291:131:::0;:::o;47056:94::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47137:5:::1;47123:11;:19;;;;47056:94:::0;:::o;44025:201::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44134:1:::1;44114:22;;:8;:22;;;;44106:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44190:28;44209:8;44190:18;:28::i;:::-;44025:201:::0;:::o;47235:98::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47321:4:::1;47302:16;;:23;;;;;;;;;;;;;;;;;;47235:98::o:0;45053:16::-;;;;;;;;;;;;;:::o;22295:273::-;22352:4;22408:7;22389:15;:13;:15::i;:::-;:26;;:66;;;;;22442:13;;22432:7;:23;22389:66;:152;;;;;22540:1;9968:8;22493:17;:26;22511:7;22493:26;;;;;;;;;;;;:43;:48;22389:152;22369:172;;22295:273;;;:::o;15497:1129::-;15564:7;15584:12;15599:7;15584:22;;15667:4;15648:15;:13;:15::i;:::-;:23;15644:915;;15701:13;;15694:4;:20;15690:869;;;15739:14;15756:17;:23;15774:4;15756:23;;;;;;;;;;;;15739:40;;15872:1;9968:8;15845:6;:23;:28;15841:699;;;16364:113;16381:1;16371:6;:11;16364:113;;;16424:17;:25;16442:6;;;;;;;16424:25;;;;;;;;;;;;16415:34;;16364:113;;;16510:6;16503:13;;;;;;15841:699;15690:869;;15644:915;16587:31;;;;;;;;;;;;;;15497:1129;;;;:::o;36277:105::-;36337:7;36364:10;36357:17;;36277:105;:::o;11757:92::-;11813:7;11757:92;:::o;27534:2515::-;27649:27;27679;27698:7;27679:18;:27::i;:::-;27649:57;;27764:4;27723:45;;27739:19;27723:45;;;27719:86;;27777:28;;;;;;;;;;;;;;27719:86;27818:22;27867:4;27844:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27888:43;27905:4;27911:19;:17;:19::i;:::-;27888:16;:43::i;:::-;27844:87;:147;;;;27972:19;:17;:19::i;:::-;27948:43;;:20;27960:7;27948:11;:20::i;:::-;:43;;;27844:147;27818:174;;28010:17;28005:66;;28036:35;;;;;;;;;;;;;;28005:66;28100:1;28086:16;;:2;:16;;;28082:52;;;28111:23;;;;;;;;;;;;;;28082:52;28147:43;28169:4;28175:2;28179:7;28188:1;28147:21;:43::i;:::-;28263:15;:24;28279:7;28263:24;;;;;;;;;;;;28256:31;;;;;;;;;;;28655:18;:24;28674:4;28655:24;;;;;;;;;;;;;;;;28653:26;;;;;;;;;;;;28724:18;:22;28743:2;28724:22;;;;;;;;;;;;;;;;28722:24;;;;;;;;;;;10250:8;9852:3;29105:15;:41;;29063:21;29081:2;29063:17;:21::i;:::-;:84;:128;29017:17;:26;29035:7;29017:26;;;;;;;;;;;:174;;;;29361:1;10250:8;29311:19;:46;:51;29307:626;;;29383:19;29415:1;29405:7;:11;29383:33;;29572:1;29538:17;:30;29556:11;29538:30;;;;;;;;;;;;:35;29534:384;;;29676:13;;29661:11;:28;29657:242;;29856:19;29823:17;:30;29841:11;29823:30;;;;;;;;;;;:52;;;;29657:242;29534:384;29307:626;;29980:7;29976:2;29961:27;;29970:4;29961:27;;;;;;;;;;;;29999:42;30020:4;30026:2;30030:7;30039:1;29999:20;:42::i;:::-;27534:2515;;;;;:::o;41834:98::-;41887:7;41914:10;41907:17;;41834:98;:::o;39682:190::-;39807:4;39860;39831:25;39844:5;39851:4;39831:12;:25::i;:::-;:33;39824:40;;39682:190;;;;;:::o;22652:104::-;22721:27;22731:2;22735:8;22721:27;;;;;;;;;;;;:9;:27::i;:::-;22652:104;;:::o;44386:191::-;44460:16;44479:6;;;;;;;;;;;44460:25;;44505:8;44496:6;;:17;;;;;;;;;;;;;;;;;;44560:8;44529:40;;44550:8;44529:40;;;;;;;;;;;;44386:191;;:::o;12647:285::-;12694:7;12898:15;:13;:15::i;:::-;12882:13;;:31;12875:38;;12647:285;:::o;33746:716::-;33909:4;33955:2;33930:45;;;33976:19;:17;:19::i;:::-;33997:4;34003:7;34012:5;33930:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33926:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34230:1;34213:6;:13;:18;34209:235;;;34259:40;;;;;;;;;;;;;;34209:235;34402:6;34396:13;34387:6;34383:2;34379:15;34372:38;33926:529;34099:54;;;34089:64;;;:6;:64;;;;34082:71;;;33746:716;;;;;;:::o;46740:101::-;46792:13;46825:8;46818:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46740:101;:::o;36488:1959::-;36545:17;36966:3;36959:4;36953:11;36949:21;36942:28;;37057:3;37051:4;37044:17;37163:3;37620:5;37750:1;37745:3;37741:11;37734:18;;37887:2;37881:4;37877:13;37873:2;37869:22;37864:3;37856:36;37928:2;37922:4;37918:13;37910:21;;37511:682;37947:4;37511:682;;;38122:1;38117:3;38113:11;38106:18;;38173:2;38167:4;38163:13;38159:2;38155:22;38150:3;38142:36;38043:2;38037:4;38033:13;38025:21;;37511:682;;;37515:431;38244:3;38239;38235:13;38359:2;38354:3;38350:12;38343:19;;38422:6;38417:3;38410:19;36584:1856;;;;;:::o;35110:159::-;;;;;:::o;19282:148::-;19346:14;19407:5;19397:15;;19382:41;;;:::o;35928:158::-;;;;;:::o;40233:675::-;40316:7;40336:20;40359:4;40336:27;;40379:9;40374:497;40398:5;:12;40394:1;:16;40374:497;;;40432:20;40455:5;40461:1;40455:8;;;;;;;;;;;;;;;;;;;;;;40432:31;;40498:12;40482;:28;40478:382;;40625:42;40640:12;40654;40625:14;:42::i;:::-;40610:57;;40478:382;;;40802:42;40817:12;40831;40802:14;:42::i;:::-;40787:57;;40478:382;40374:497;40412:3;;;;;:::i;:::-;;;;40374:497;;;;40888:12;40881:19;;;40233:675;;;;:::o;23129:2236::-;23252:20;23275:13;;23252:36;;23317:1;23303:16;;:2;:16;;;23299:48;;;23328:19;;;;;;;;;;;;;;23299:48;23374:1;23362:8;:13;23358:44;;;23384:18;;;;;;;;;;;;;;23358:44;23415:61;23445:1;23449:2;23453:12;23467:8;23415:21;:61::i;:::-;24019:1;9335:2;23990:1;:25;;23989:31;23977:8;:44;23951:18;:22;23970:2;23951:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10115:3;24420:29;24447:1;24435:8;:13;24420:14;:29::i;:::-;:56;;9852:3;24357:15;:41;;24315:21;24333:2;24315:17;:21::i;:::-;:84;:162;24264:17;:31;24282:12;24264:31;;;;;;;;;;;:213;;;;24494:20;24517:12;24494:35;;24544:11;24573:8;24558:12;:23;24544:37;;24620:1;24602:2;:14;;;:19;24598:635;;24642:313;24698:12;24694:2;24673:38;;24690:1;24673:38;;;;;;;;;;;;24739:69;24778:1;24782:2;24786:14;;;;;;24802:5;24739:30;:69::i;:::-;24734:174;;24844:40;;;;;;;;;;;;;;24734:174;24950:3;24935:12;:18;24642:313;;25036:12;25019:13;;:29;25015:43;;25050:8;;;25015:43;24598:635;;;25099:119;25155:14;;;;;;25151:2;25130:40;;25147:1;25130:40;;;;;;;;;;;;25213:3;25198:12;:18;25099:119;;24598:635;25263:12;25247:13;:28;;;;23129:2236;;25297:60;25326:1;25330:2;25334:12;25348:8;25297:20;:60::i;:::-;23129:2236;;;;:::o;40916:224::-;40984:13;41047:1;41041:4;41034:15;41076:1;41070:4;41063:15;41117:4;41111;41101:21;41092:30;;41019:114;;;;:::o;19517:142::-;19575:14;19636:5;19626:15;;19611:41;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;518:367::-;591:8;601:6;651:3;644:4;636:6;632:17;628:27;618:2;;669:1;666;659:12;618:2;705:6;692:20;682:30;;735:18;727:6;724:30;721:2;;;767:1;764;757:12;721:2;804:4;796:6;792:17;780:29;;858:3;850:4;842:6;838:17;828:8;824:32;821:41;818:2;;;875:1;872;865:12;818:2;608:277;;;;;:::o;891:133::-;934:5;972:6;959:20;950:29;;988:30;1012:5;988:30;:::i;:::-;940:84;;;;:::o;1030:139::-;1076:5;1114:6;1101:20;1092:29;;1130:33;1157:5;1130:33;:::i;:::-;1082:87;;;;:::o;1175:137::-;1220:5;1258:6;1245:20;1236:29;;1274:32;1300:5;1274:32;:::i;:::-;1226:86;;;;:::o;1318:141::-;1374:5;1405:6;1399:13;1390:22;;1421:32;1447:5;1421:32;:::i;:::-;1380:79;;;;:::o;1478:271::-;1533:5;1582:3;1575:4;1567:6;1563:17;1559:27;1549:2;;1600:1;1597;1590:12;1549:2;1640:6;1627:20;1665:78;1739:3;1731:6;1724:4;1716:6;1712:17;1665:78;:::i;:::-;1656:87;;1539:210;;;;;:::o;1769:352::-;1827:8;1837:6;1887:3;1880:4;1872:6;1868:17;1864:27;1854:2;;1905:1;1902;1895:12;1854:2;1941:6;1928:20;1918:30;;1971:18;1963:6;1960:30;1957:2;;;2003:1;2000;1993:12;1957:2;2040:4;2032:6;2028:17;2016:29;;2094:3;2086:4;2078:6;2074:17;2064:8;2060:32;2057:41;2054:2;;;2111:1;2108;2101:12;2054:2;1844:277;;;;;:::o;2127:139::-;2173:5;2211:6;2198:20;2189:29;;2227:33;2254:5;2227:33;:::i;:::-;2179:87;;;;:::o;2272:262::-;2331:6;2380:2;2368:9;2359:7;2355:23;2351:32;2348:2;;;2396:1;2393;2386:12;2348:2;2439:1;2464:53;2509:7;2500:6;2489:9;2485:22;2464:53;:::i;:::-;2454:63;;2410:117;2338:196;;;;:::o;2540:407::-;2608:6;2616;2665:2;2653:9;2644:7;2640:23;2636:32;2633:2;;;2681:1;2678;2671:12;2633:2;2724:1;2749:53;2794:7;2785:6;2774:9;2770:22;2749:53;:::i;:::-;2739:63;;2695:117;2851:2;2877:53;2922:7;2913:6;2902:9;2898:22;2877:53;:::i;:::-;2867:63;;2822:118;2623:324;;;;;:::o;2953:552::-;3030:6;3038;3046;3095:2;3083:9;3074:7;3070:23;3066:32;3063:2;;;3111:1;3108;3101:12;3063:2;3154:1;3179:53;3224:7;3215:6;3204:9;3200:22;3179:53;:::i;:::-;3169:63;;3125:117;3281:2;3307:53;3352:7;3343:6;3332:9;3328:22;3307:53;:::i;:::-;3297:63;;3252:118;3409:2;3435:53;3480:7;3471:6;3460:9;3456:22;3435:53;:::i;:::-;3425:63;;3380:118;3053:452;;;;;:::o;3511:809::-;3606:6;3614;3622;3630;3679:3;3667:9;3658:7;3654:23;3650:33;3647:2;;;3696:1;3693;3686:12;3647:2;3739:1;3764:53;3809:7;3800:6;3789:9;3785:22;3764:53;:::i;:::-;3754:63;;3710:117;3866:2;3892:53;3937:7;3928:6;3917:9;3913:22;3892:53;:::i;:::-;3882:63;;3837:118;3994:2;4020:53;4065:7;4056:6;4045:9;4041:22;4020:53;:::i;:::-;4010:63;;3965:118;4150:2;4139:9;4135:18;4122:32;4181:18;4173:6;4170:30;4167:2;;;4213:1;4210;4203:12;4167:2;4241:62;4295:7;4286:6;4275:9;4271:22;4241:62;:::i;:::-;4231:72;;4093:220;3637:683;;;;;;;:::o;4326:401::-;4391:6;4399;4448:2;4436:9;4427:7;4423:23;4419:32;4416:2;;;4464:1;4461;4454:12;4416:2;4507:1;4532:53;4577:7;4568:6;4557:9;4553:22;4532:53;:::i;:::-;4522:63;;4478:117;4634:2;4660:50;4702:7;4693:6;4682:9;4678:22;4660:50;:::i;:::-;4650:60;;4605:115;4406:321;;;;;:::o;4733:407::-;4801:6;4809;4858:2;4846:9;4837:7;4833:23;4829:32;4826:2;;;4874:1;4871;4864:12;4826:2;4917:1;4942:53;4987:7;4978:6;4967:9;4963:22;4942:53;:::i;:::-;4932:63;;4888:117;5044:2;5070:53;5115:7;5106:6;5095:9;5091:22;5070:53;:::i;:::-;5060:63;;5015:118;4816:324;;;;;:::o;5146:425::-;5232:6;5240;5289:2;5277:9;5268:7;5264:23;5260:32;5257:2;;;5305:1;5302;5295:12;5257:2;5376:1;5365:9;5361:17;5348:31;5406:18;5398:6;5395:30;5392:2;;;5438:1;5435;5428:12;5392:2;5474:80;5546:7;5537:6;5526:9;5522:22;5474:80;:::i;:::-;5456:98;;;;5319:245;5247:324;;;;;:::o;5577:256::-;5633:6;5682:2;5670:9;5661:7;5657:23;5653:32;5650:2;;;5698:1;5695;5688:12;5650:2;5741:1;5766:50;5808:7;5799:6;5788:9;5784:22;5766:50;:::i;:::-;5756:60;;5712:114;5640:193;;;;:::o;5839:262::-;5898:6;5947:2;5935:9;5926:7;5922:23;5918:32;5915:2;;;5963:1;5960;5953:12;5915:2;6006:1;6031:53;6076:7;6067:6;6056:9;6052:22;6031:53;:::i;:::-;6021:63;;5977:117;5905:196;;;;:::o;6107:260::-;6165:6;6214:2;6202:9;6193:7;6189:23;6185:32;6182:2;;;6230:1;6227;6220:12;6182:2;6273:1;6298:52;6342:7;6333:6;6322:9;6318:22;6298:52;:::i;:::-;6288:62;;6244:116;6172:195;;;;:::o;6373:282::-;6442:6;6491:2;6479:9;6470:7;6466:23;6462:32;6459:2;;;6507:1;6504;6497:12;6459:2;6550:1;6575:63;6630:7;6621:6;6610:9;6606:22;6575:63;:::i;:::-;6565:73;;6521:127;6449:206;;;;:::o;6661:395::-;6732:6;6740;6789:2;6777:9;6768:7;6764:23;6760:32;6757:2;;;6805:1;6802;6795:12;6757:2;6876:1;6865:9;6861:17;6848:31;6906:18;6898:6;6895:30;6892:2;;;6938:1;6935;6928:12;6892:2;6974:65;7031:7;7022:6;7011:9;7007:22;6974:65;:::i;:::-;6956:83;;;;6819:230;6747:309;;;;;:::o;7062:262::-;7121:6;7170:2;7158:9;7149:7;7145:23;7141:32;7138:2;;;7186:1;7183;7176:12;7138:2;7229:1;7254:53;7299:7;7290:6;7279:9;7275:22;7254:53;:::i;:::-;7244:63;;7200:117;7128:196;;;;:::o;7330:118::-;7417:24;7435:5;7417:24;:::i;:::-;7412:3;7405:37;7395:53;;:::o;7454:157::-;7559:45;7579:24;7597:5;7579:24;:::i;:::-;7559:45;:::i;:::-;7554:3;7547:58;7537:74;;:::o;7617:109::-;7698:21;7713:5;7698:21;:::i;:::-;7693:3;7686:34;7676:50;;:::o;7732:118::-;7819:24;7837:5;7819:24;:::i;:::-;7814:3;7807:37;7797:53;;:::o;7856:360::-;7942:3;7970:38;8002:5;7970:38;:::i;:::-;8024:70;8087:6;8082:3;8024:70;:::i;:::-;8017:77;;8103:52;8148:6;8143:3;8136:4;8129:5;8125:16;8103:52;:::i;:::-;8180:29;8202:6;8180:29;:::i;:::-;8175:3;8171:39;8164:46;;7946:270;;;;;:::o;8222:364::-;8310:3;8338:39;8371:5;8338:39;:::i;:::-;8393:71;8457:6;8452:3;8393:71;:::i;:::-;8386:78;;8473:52;8518:6;8513:3;8506:4;8499:5;8495:16;8473:52;:::i;:::-;8550:29;8572:6;8550:29;:::i;:::-;8545:3;8541:39;8534:46;;8314:272;;;;;:::o;8592:377::-;8698:3;8726:39;8759:5;8726:39;:::i;:::-;8781:89;8863:6;8858:3;8781:89;:::i;:::-;8774:96;;8879:52;8924:6;8919:3;8912:4;8905:5;8901:16;8879:52;:::i;:::-;8956:6;8951:3;8947:16;8940:23;;8702:267;;;;;:::o;8975:366::-;9117:3;9138:67;9202:2;9197:3;9138:67;:::i;:::-;9131:74;;9214:93;9303:3;9214:93;:::i;:::-;9332:2;9327:3;9323:12;9316:19;;9121:220;;;:::o;9347:366::-;9489:3;9510:67;9574:2;9569:3;9510:67;:::i;:::-;9503:74;;9586:93;9675:3;9586:93;:::i;:::-;9704:2;9699:3;9695:12;9688:19;;9493:220;;;:::o;9719:366::-;9861:3;9882:67;9946:2;9941:3;9882:67;:::i;:::-;9875:74;;9958:93;10047:3;9958:93;:::i;:::-;10076:2;10071:3;10067:12;10060:19;;9865:220;;;:::o;10091:398::-;10250:3;10271:83;10352:1;10347:3;10271:83;:::i;:::-;10264:90;;10363:93;10452:3;10363:93;:::i;:::-;10481:1;10476:3;10472:11;10465:18;;10254:235;;;:::o;10495:118::-;10582:24;10600:5;10582:24;:::i;:::-;10577:3;10570:37;10560:53;;:::o;10619:157::-;10724:45;10744:24;10762:5;10744:24;:::i;:::-;10724:45;:::i;:::-;10719:3;10712:58;10702:74;;:::o;10782:397::-;10922:3;10937:75;11008:3;10999:6;10937:75;:::i;:::-;11037:2;11032:3;11028:12;11021:19;;11050:75;11121:3;11112:6;11050:75;:::i;:::-;11150:2;11145:3;11141:12;11134:19;;11170:3;11163:10;;10926:253;;;;;:::o;11185:435::-;11365:3;11387:95;11478:3;11469:6;11387:95;:::i;:::-;11380:102;;11499:95;11590:3;11581:6;11499:95;:::i;:::-;11492:102;;11611:3;11604:10;;11369:251;;;;;:::o;11626:379::-;11810:3;11832:147;11975:3;11832:147;:::i;:::-;11825:154;;11996:3;11989:10;;11814:191;;;:::o;12011:222::-;12104:4;12142:2;12131:9;12127:18;12119:26;;12155:71;12223:1;12212:9;12208:17;12199:6;12155:71;:::i;:::-;12109:124;;;;:::o;12239:640::-;12434:4;12472:3;12461:9;12457:19;12449:27;;12486:71;12554:1;12543:9;12539:17;12530:6;12486:71;:::i;:::-;12567:72;12635:2;12624:9;12620:18;12611:6;12567:72;:::i;:::-;12649;12717:2;12706:9;12702:18;12693:6;12649:72;:::i;:::-;12768:9;12762:4;12758:20;12753:2;12742:9;12738:18;12731:48;12796:76;12867:4;12858:6;12796:76;:::i;:::-;12788:84;;12439:440;;;;;;;:::o;12885:210::-;12972:4;13010:2;12999:9;12995:18;12987:26;;13023:65;13085:1;13074:9;13070:17;13061:6;13023:65;:::i;:::-;12977:118;;;;:::o;13101:222::-;13194:4;13232:2;13221:9;13217:18;13209:26;;13245:71;13313:1;13302:9;13298:17;13289:6;13245:71;:::i;:::-;13199:124;;;;:::o;13329:313::-;13442:4;13480:2;13469:9;13465:18;13457:26;;13529:9;13523:4;13519:20;13515:1;13504:9;13500:17;13493:47;13557:78;13630:4;13621:6;13557:78;:::i;:::-;13549:86;;13447:195;;;;:::o;13648:419::-;13814:4;13852:2;13841:9;13837:18;13829:26;;13901:9;13895:4;13891:20;13887:1;13876:9;13872:17;13865:47;13929:131;14055:4;13929:131;:::i;:::-;13921:139;;13819:248;;;:::o;14073:419::-;14239:4;14277:2;14266:9;14262:18;14254:26;;14326:9;14320:4;14316:20;14312:1;14301:9;14297:17;14290:47;14354:131;14480:4;14354:131;:::i;:::-;14346:139;;14244:248;;;:::o;14498:419::-;14664:4;14702:2;14691:9;14687:18;14679:26;;14751:9;14745:4;14741:20;14737:1;14726:9;14722:17;14715:47;14779:131;14905:4;14779:131;:::i;:::-;14771:139;;14669:248;;;:::o;14923:222::-;15016:4;15054:2;15043:9;15039:18;15031:26;;15067:71;15135:1;15124:9;15120:17;15111:6;15067:71;:::i;:::-;15021:124;;;;:::o;15151:129::-;15185:6;15212:20;;:::i;:::-;15202:30;;15241:33;15269:4;15261:6;15241:33;:::i;:::-;15192:88;;;:::o;15286:75::-;15319:6;15352:2;15346:9;15336:19;;15326:35;:::o;15367:307::-;15428:4;15518:18;15510:6;15507:30;15504:2;;;15540:18;;:::i;:::-;15504:2;15578:29;15600:6;15578:29;:::i;:::-;15570:37;;15662:4;15656;15652:15;15644:23;;15433:241;;;:::o;15680:98::-;15731:6;15765:5;15759:12;15749:22;;15738:40;;;:::o;15784:99::-;15836:6;15870:5;15864:12;15854:22;;15843:40;;;:::o;15889:168::-;15972:11;16006:6;16001:3;15994:19;16046:4;16041:3;16037:14;16022:29;;15984:73;;;;:::o;16063:147::-;16164:11;16201:3;16186:18;;16176:34;;;;:::o;16216:169::-;16300:11;16334:6;16329:3;16322:19;16374:4;16369:3;16365:14;16350:29;;16312:73;;;;:::o;16391:148::-;16493:11;16530:3;16515:18;;16505:34;;;;:::o;16545:305::-;16585:3;16604:20;16622:1;16604:20;:::i;:::-;16599:25;;16638:20;16656:1;16638:20;:::i;:::-;16633:25;;16792:1;16724:66;16720:74;16717:1;16714:81;16711:2;;;16798:18;;:::i;:::-;16711:2;16842:1;16839;16835:9;16828:16;;16589:261;;;;:::o;16856:348::-;16896:7;16919:20;16937:1;16919:20;:::i;:::-;16914:25;;16953:20;16971:1;16953:20;:::i;:::-;16948:25;;17141:1;17073:66;17069:74;17066:1;17063:81;17058:1;17051:9;17044:17;17040:105;17037:2;;;17148:18;;:::i;:::-;17037:2;17196:1;17193;17189:9;17178:20;;16904:300;;;;:::o;17210:191::-;17250:4;17270:20;17288:1;17270:20;:::i;:::-;17265:25;;17304:20;17322:1;17304:20;:::i;:::-;17299:25;;17343:1;17340;17337:8;17334:2;;;17348:18;;:::i;:::-;17334:2;17393:1;17390;17386:9;17378:17;;17255:146;;;;:::o;17407:96::-;17444:7;17473:24;17491:5;17473:24;:::i;:::-;17462:35;;17452:51;;;:::o;17509:90::-;17543:7;17586:5;17579:13;17572:21;17561:32;;17551:48;;;:::o;17605:77::-;17642:7;17671:5;17660:16;;17650:32;;;:::o;17688:149::-;17724:7;17764:66;17757:5;17753:78;17742:89;;17732:105;;;:::o;17843:126::-;17880:7;17920:42;17913:5;17909:54;17898:65;;17888:81;;;:::o;17975:77::-;18012:7;18041:5;18030:16;;18020:32;;;:::o;18058:154::-;18142:6;18137:3;18132;18119:30;18204:1;18195:6;18190:3;18186:16;18179:27;18109:103;;;:::o;18218:307::-;18286:1;18296:113;18310:6;18307:1;18304:13;18296:113;;;18395:1;18390:3;18386:11;18380:18;18376:1;18371:3;18367:11;18360:39;18332:2;18329:1;18325:10;18320:15;;18296:113;;;18427:6;18424:1;18421:13;18418:2;;;18507:1;18498:6;18493:3;18489:16;18482:27;18418:2;18267:258;;;;:::o;18531:320::-;18575:6;18612:1;18606:4;18602:12;18592:22;;18659:1;18653:4;18649:12;18680:18;18670:2;;18736:4;18728:6;18724:17;18714:27;;18670:2;18798;18790:6;18787:14;18767:18;18764:38;18761:2;;;18817:18;;:::i;:::-;18761:2;18582:269;;;;:::o;18857:281::-;18940:27;18962:4;18940:27;:::i;:::-;18932:6;18928:40;19070:6;19058:10;19055:22;19034:18;19022:10;19019:34;19016:62;19013:2;;;19081:18;;:::i;:::-;19013:2;19121:10;19117:2;19110:22;18900:238;;;:::o;19144:233::-;19183:3;19206:24;19224:5;19206:24;:::i;:::-;19197:33;;19252:66;19245:5;19242:77;19239:2;;;19322:18;;:::i;:::-;19239:2;19369:1;19362:5;19358:13;19351:20;;19187:190;;;:::o;19383:100::-;19422:7;19451:26;19471:5;19451:26;:::i;:::-;19440:37;;19430:53;;;:::o;19489:94::-;19528:7;19557:20;19571:5;19557:20;:::i;:::-;19546:31;;19536:47;;;:::o;19589:79::-;19628:7;19657:5;19646:16;;19636:32;;;:::o;19674:180::-;19722:77;19719:1;19712:88;19819:4;19816:1;19809:15;19843:4;19840:1;19833:15;19860:180;19908:77;19905:1;19898:88;20005:4;20002:1;19995:15;20029:4;20026:1;20019:15;20046:180;20094:77;20091:1;20084:88;20191:4;20188:1;20181:15;20215:4;20212:1;20205:15;20232:102;20273:6;20324:2;20320:7;20315:2;20308:5;20304:14;20300:28;20290:38;;20280:54;;;:::o;20340:94::-;20373:8;20421:5;20417:2;20413:14;20392:35;;20382:52;;;:::o;20440:170::-;20580:22;20576:1;20568:6;20564:14;20557:46;20546:64;:::o;20616:225::-;20756:34;20752:1;20744:6;20740:14;20733:58;20825:8;20820:2;20812:6;20808:15;20801:33;20722:119;:::o;20847:182::-;20987:34;20983:1;20975:6;20971:14;20964:58;20953:76;:::o;21035:114::-;21141:8;:::o;21155:122::-;21228:24;21246:5;21228:24;:::i;:::-;21221:5;21218:35;21208:2;;21267:1;21264;21257:12;21208:2;21198:79;:::o;21283:116::-;21353:21;21368:5;21353:21;:::i;:::-;21346:5;21343:32;21333:2;;21389:1;21386;21379:12;21333:2;21323:76;:::o;21405:122::-;21478:24;21496:5;21478:24;:::i;:::-;21471:5;21468:35;21458:2;;21517:1;21514;21507:12;21458:2;21448:79;:::o;21533:120::-;21605:23;21622:5;21605:23;:::i;:::-;21598:5;21595:34;21585:2;;21643:1;21640;21633:12;21585:2;21575:78;:::o;21659:122::-;21732:24;21750:5;21732:24;:::i;:::-;21725:5;21722:35;21712:2;;21771:1;21768;21761:12;21712:2;21702:79;:::o
Swarm Source
ipfs://551a6125546d7b37bc2d3bda0db42c38f852c7dbafabdbe0916df00f787de821
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.