Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 116 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16720181 | 592 days ago | IN | 0 ETH | 0.00135571 | ||||
Round5pick | 16707372 | 593 days ago | IN | 0 ETH | 0.00129811 | ||||
Round4pick | 16702082 | 594 days ago | IN | 0 ETH | 0.00357675 | ||||
Set Approval For... | 16694047 | 595 days ago | IN | 0 ETH | 0.00401876 | ||||
Round3pick | 16693943 | 595 days ago | IN | 0 ETH | 0.08078011 | ||||
Set R2tokens | 16688131 | 596 days ago | IN | 0 ETH | 0.11551513 | ||||
Withdraw | 16686025 | 596 days ago | IN | 0 ETH | 0.00103397 | ||||
Set State | 16685990 | 596 days ago | IN | 0 ETH | 0.00124769 | ||||
Mint | 16685889 | 596 days ago | IN | 0.03 ETH | 0.00314809 | ||||
Mint | 16685789 | 597 days ago | IN | 0.09 ETH | 0.00368474 | ||||
Mint | 16685695 | 597 days ago | IN | 0.03 ETH | 0.00431291 | ||||
Mint | 16684163 | 597 days ago | IN | 0.03 ETH | 0.00259725 | ||||
Mint | 16683965 | 597 days ago | IN | 0.06 ETH | 0.00230232 | ||||
Set Approval For... | 16683739 | 597 days ago | IN | 0 ETH | 0.00140668 | ||||
Mint | 16680417 | 597 days ago | IN | 0.09 ETH | 0.00241486 | ||||
Mint | 16679173 | 597 days ago | IN | 0.06 ETH | 0.00220247 | ||||
Set State | 16678852 | 597 days ago | IN | 0 ETH | 0.0009717 | ||||
AL Mint | 16678730 | 597 days ago | IN | 0.03 ETH | 0.00335697 | ||||
AL Mint | 16678728 | 597 days ago | IN | 0.06 ETH | 0.00428913 | ||||
AL Mint | 16675579 | 598 days ago | IN | 0.06 ETH | 0.00233106 | ||||
AL Mint | 16675219 | 598 days ago | IN | 0 ETH | 0.00315639 | ||||
AL Mint | 16675175 | 598 days ago | IN | 0.06 ETH | 0.00358927 | ||||
AL Mint | 16675048 | 598 days ago | IN | 0 ETH | 0.00248665 | ||||
AL Mint | 16674866 | 598 days ago | IN | 0.06 ETH | 0.00257127 | ||||
AL Mint | 16673247 | 598 days ago | IN | 0 ETH | 0.00303437 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16686025 | 596 days ago | 3.6 ETH |
Loading...
Loading
Contract Name:
FUDiblesS3
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-19 */ // File: filterer/IOperatorFilterRegistry.sol pragma solidity ^0.8.17; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: filterer/OperatorFilterer.sol pragma solidity ^0.8.17; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: filterer/DefaultOperatorFilterer.sol pragma solidity ^0.8.17; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * 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(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @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() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 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`, * 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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // 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 bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID 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` // - [232..255] `extraData` 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 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual 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 auxiliary 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 auxiliary 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 virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ 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: [ERC165](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. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ 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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * 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 initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev 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; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // 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 `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns 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)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @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 for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _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] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _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] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, 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. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @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)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // 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++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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 _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @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 virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * 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. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ 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 Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(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++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: FUDibles-S3.sol pragma solidity 0.8.17; /// @author Viv_0002 contract FUDiblesS3 is ERC721A, ERC2981, Ownable, DefaultOperatorFilterer{ enum MintState { PAUSED, DRAW, ALLOWLIST, PUBLIC, ENDED } MintState public state = MintState.PAUSED; uint256 mintcost = 0.03 ether; uint256 public maxSupply = 651; bytes32 public whitelistMerkleRoot; string public tokenUriBase = "http://metadata.mintfud.com:3333/season3/"; mapping(address => bool) public freeminted; uint256[] public round1tokens = new uint256[](300); uint256[] public round2tokens = new uint256[](150); uint256[] public round3tokens = new uint256[](50); uint256[] public round4tokens = new uint256[](2); uint256 public winner; address public lotteryPicker = 0x7DE56813aF4D33555B44dd6C5A542cedb59B761E; uint256[] ids = new uint256[](150); uint256[] ids2 = new uint256[](50); uint256 public round = 0; constructor() ERC721A("FUDibles Season 3", "FUDibles-S3") { _setDefaultRoyalty(owner(), 690); } // OVERRIDES function _startTokenId() internal view virtual override returns (uint256) { return 0; } // MODIFIERS modifier mintCompliance(uint256 _mintAmount) { require( _mintAmount > 0,"Invalid mint amount"); require( totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded" ); _; } modifier authz(){ require(msg.sender == owner() || msg.sender == lotteryPicker, "Not authorized"); _; } // MERKLE TREE function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) { return MerkleProof.verify(proof, whitelistMerkleRoot, leaf); } function _leaf(address account, uint256 freemints, uint256 maxMint, uint256 level) internal pure returns (bytes32) { return keccak256(bytes.concat(keccak256(abi.encode(account, freemints, maxMint, level)))); } // MINTING FUNCTIONS function mint(uint256 amount) public payable mintCompliance(amount) { require(state == MintState.PUBLIC, "Public mint is not available yet"); require (amount <= 5, "Too many mints per transaction requested"); require(msg.value >= mintcost * amount, "Insufficient funds"); _safeMint(msg.sender, amount); } function ALMint( uint256 amount, uint256 freemints, uint256 maxMint, uint256 level, bytes32[] calldata proof ) public payable mintCompliance(amount) { if (level==1){ require(state == MintState.DRAW || state == MintState.ALLOWLIST , "Draw Winners mint is not available right now"); } else{ require(state == MintState.ALLOWLIST , "AllowList mint is not available right now"); require(freemints == 0, "AllowList cannot have freemints"); } require( numberMinted(msg.sender) + amount <= (maxMint + freemints), "Exceeds allowed number of mints" ); require(_verify(_leaf(msg.sender, freemints, maxMint, level), proof), "Invalid proof"); if (freemints > 0){ if (freeminted[msg.sender]!=true){ require(msg.value >= mintcost * (amount - freemints), "Insufficient funds"); } else { require(msg.value >= mintcost * amount, "Insufficient funds"); } } else { require(msg.value >= mintcost * amount, "Insufficient funds"); } if (freemints > 0 && msg.value < (amount * mintcost)) { require (freeminted[msg.sender]!=true, "Free mint already claimed"); freeminted[msg.sender] = true; } _safeMint(msg.sender, amount); } function mintForAddress(uint256 amount, address _receiver) public onlyOwner { require(totalSupply() + amount <= maxSupply, "Max supply exceeded"); _safeMint(_receiver, amount); } // GETTERS function numberMinted(address _minter) public view returns (uint256) { return _numberMinted(_minter); } function getcost() public view returns (uint256){ return mintcost; } function tokenURI( uint256 tokenId ) public view override returns (string memory) { return string(abi.encodePacked(tokenUriBase, _toString(tokenId), ".json")); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownerTokens = new uint256[](ownerTokenCount); uint256 ownerTokenIdx = 0; for ( uint256 tokenIdx = _startTokenId(); tokenIdx < totalSupply(); tokenIdx++ ) { if (ownerOf(tokenIdx) == _owner) { ownerTokens[ownerTokenIdx] = tokenIdx; ownerTokenIdx++; } } return ownerTokens; } // SETTERS function setState(MintState _state) public onlyOwner { state = _state; } function changeCost(uint256 _newcost) public onlyOwner { mintcost = _newcost; } function setMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot) external onlyOwner { whitelistMerkleRoot = _whitelistMerkleRoot; } function setTokenURI(string memory newUriBase) external onlyOwner { tokenUriBase = newUriBase; } function changeLotteryAddr(address _newLotAdd) external onlyOwner { lotteryPicker = _newLotAdd; } // RAFFLE function setR1tokens(uint256[] calldata _tokens) public authz { require(_tokens.length == round1tokens.length, "Bad Data"); round1tokens = _tokens; round = 1; } function setR2tokens(uint256[] calldata _tokens) public authz { require(_tokens.length == round2tokens.length, "Bad Data"); round2tokens = _tokens; round = 2; } function round3pick(string calldata _random) public authz{ uint256 randomhash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _random))); uint256 id; for (uint i = 0; i < 50; i++){ uint256 randomIndex = randomhash % ids.length; if (ids[randomIndex] != 0) { id = ids[randomIndex]; } else { id = randomIndex; } if (ids[ids.length - 1] == 0) { ids[randomIndex] = ids.length - 1; } else { ids[randomIndex] = ids[ids.length - 1]; } ids.pop(); round3tokens[i] = round2tokens[id]; round = 3; } } function round4pick(string calldata _random) public authz{ uint256 randomhash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _random))); uint256 id; for (uint i = 0; i < 2; i++){ uint256 randomIndex = randomhash % ids2.length; if (ids2[randomIndex] != 0) { id = ids2[randomIndex]; } else { id = randomIndex; } if (ids2[ids2.length - 1] == 0) { ids2[randomIndex] = ids2.length - 1; } else { ids2[randomIndex] = ids2[ids2.length - 1]; } ids2.pop(); round4tokens[i] = round3tokens[id]; round = 4; } } function round5pick(string calldata _random) public authz{ uint256 maxStatValue = 2; uint256 randomHash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _random))); uint256 _pick = randomHash % maxStatValue; winner = round4tokens[_pick]; round = 5; } function getR1tokens() public view returns(uint256[] memory){ return round1tokens; } function getR2tokens() public view returns(uint256[] memory){ return round2tokens; } function getR3tokens() public view returns(uint256[] memory){ return round3tokens; } function getR4tokens() public view returns(uint256[] memory){ return round4tokens; } // 2981 function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } // OS function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } // WITHDRAW function withdraw() public onlyOwner { uint256 contractBalance = address(this).balance; bool success = true; (success, ) = payable(owner()).call{ value: contractBalance}(""); require(success, "Transfer failed"); } }
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":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"freemints","type":"uint256"},{"internalType":"uint256","name":"maxMint","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"ALMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newcost","type":"uint256"}],"name":"changeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newLotAdd","type":"address"}],"name":"changeLotteryAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeminted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR1tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR2tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR3tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR4tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getcost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"lotteryPicker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"round","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round1tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round2tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_random","type":"string"}],"name":"round3pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round3tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_random","type":"string"}],"name":"round4pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round4tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_random","type":"string"}],"name":"round5pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokens","type":"uint256[]"}],"name":"setR1tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokens","type":"uint256[]"}],"name":"setR2tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FUDiblesS3.MintState","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUriBase","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum FUDiblesS3.MintState","name":"","type":"uint8"}],"stateMutability":"view","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":"tokenUriBase","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"winner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a60146101000a81548160ff021916908360048111156200002d576200002c62000955565b5b0217905550666a94d74f430000600b5561028b600c5560405180606001604052806029815260200162006a8360299139600e90816200006d919062000bfe565b5061012c67ffffffffffffffff8111156200008d576200008c6200098f565b5b604051908082528060200260200182016040528015620000bc5781602001602082028036833780820191505090505b5060109080519060200190620000d4929190620008e4565b50609667ffffffffffffffff811115620000f357620000f26200098f565b5b604051908082528060200260200182016040528015620001225781602001602082028036833780820191505090505b50601190805190602001906200013a929190620008e4565b50603267ffffffffffffffff8111156200015957620001586200098f565b5b604051908082528060200260200182016040528015620001885781602001602082028036833780820191505090505b5060129080519060200190620001a0929190620008e4565b50600267ffffffffffffffff811115620001bf57620001be6200098f565b5b604051908082528060200260200182016040528015620001ee5781602001602082028036833780820191505090505b506013908051906020019062000206929190620008e4565b50737de56813af4d33555b44dd6c5a542cedb59b761e601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550609667ffffffffffffffff8111156200027a57620002796200098f565b5b604051908082528060200260200182016040528015620002a95781602001602082028036833780820191505090505b5060169080519060200190620002c1929190620008e4565b50603267ffffffffffffffff811115620002e057620002df6200098f565b5b6040519080825280602002602001820160405280156200030f5781602001602082028036833780820191505090505b506017908051906020019062000327929190620008e4565b5060006018553480156200033a57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601181526020017f46554469626c657320536561736f6e20330000000000000000000000000000008152506040518060400160405280600b81526020017f46554469626c65732d53330000000000000000000000000000000000000000008152508160029081620003cf919062000bfe565b508060039081620003e1919062000bfe565b50620003f26200063a60201b60201c565b60008190555050506200041a6200040e6200063f60201b60201c565b6200064760201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200060f578015620004d5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200049b92919062000d2a565b600060405180830381600087803b158015620004b657600080fd5b505af1158015620004cb573d6000803e3d6000fd5b505050506200060e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200058f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200055592919062000d2a565b600060405180830381600087803b1580156200057057600080fd5b505af115801562000585573d6000803e3d6000fd5b505050506200060d565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620005d8919062000d57565b600060405180830381600087803b158015620005f357600080fd5b505af115801562000608573d6000803e3d6000fd5b505050505b5b5b505062000634620006256200070d60201b60201c565b6102b26200073760201b60201c565b62000e8f565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000747620008da60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620007a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200079f9062000dfb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200081a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008119062000e6d565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b82805482825590600052602060002090810192821562000923579160200282015b828111156200092257825182559160200191906001019062000905565b5b50905062000932919062000936565b5090565b5b808211156200095157600081600090555060010162000937565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a0657607f821691505b60208210810362000a1c5762000a1b620009be565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a47565b62000a92868362000a47565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000adf62000ad962000ad38462000aaa565b62000ab4565b62000aaa565b9050919050565b6000819050919050565b62000afb8362000abe565b62000b1362000b0a8262000ae6565b84845462000a54565b825550505050565b600090565b62000b2a62000b1b565b62000b3781848462000af0565b505050565b5b8181101562000b5f5762000b5360008262000b20565b60018101905062000b3d565b5050565b601f82111562000bae5762000b788162000a22565b62000b838462000a37565b8101602085101562000b93578190505b62000bab62000ba28562000a37565b83018262000b3c565b50505b505050565b600082821c905092915050565b600062000bd36000198460080262000bb3565b1980831691505092915050565b600062000bee838362000bc0565b9150826002028217905092915050565b62000c098262000984565b67ffffffffffffffff81111562000c255762000c246200098f565b5b62000c318254620009ed565b62000c3e82828562000b63565b600060209050601f83116001811462000c76576000841562000c61578287015190505b62000c6d858262000be0565b86555062000cdd565b601f19841662000c868662000a22565b60005b8281101562000cb05784890151825560018201915060208501945060208101905062000c89565b8683101562000cd0578489015162000ccc601f89168262000bc0565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000d128262000ce5565b9050919050565b62000d248162000d05565b82525050565b600060408201905062000d41600083018562000d19565b62000d50602083018462000d19565b9392505050565b600060208201905062000d6e600083018462000d19565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000de3602a8362000d74565b915062000df08262000d85565b604082019050919050565b6000602082019050818103600083015262000e168162000dd4565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000e5560198362000d74565b915062000e628262000e1d565b602082019050919050565b6000602082019050818103600083015262000e888162000e46565b9050919050565b615be48062000e9f6000396000f3fe6080604052600436106103355760003560e01c806385ef3e1c116101ab578063d5abeb01116100f7578063ef56267e11610095578063f2fde38b1161006f578063f2fde38b14610bed578063fc7e264a14610c16578063fd90002514610c53578063fe4ac90614610c7e57610335565b8063ef56267e14610b5c578063efbd73f414610b99578063f1a2096d14610bc257610335565b8063dfbf53ae116100d1578063dfbf53ae14610a8e578063e074753d14610ab9578063e0df5b6f14610af6578063e985e9c514610b1f57610335565b8063d5abeb01146109fd578063d6cbd04f14610a28578063dc33e68114610a5157610335565b8063a3723f4e11610164578063b88d4fde1161013e578063b88d4fde14610950578063bd32fb661461096c578063c19d93fb14610995578063c87b56dd146109c057610335565b8063a3723f4e146108e0578063a7f62d86146108fc578063aa98e0c61461092557610335565b806385ef3e1c146107dd5780638da5cb5b14610808578063930405871461083357806395d89b4114610870578063a0712d681461089b578063a22cb465146108b757610335565b806342842e0e116102855780636352211e116102235780636f8b44b0116101fd5780636f8b44b01461073557806370a082311461075e578063715018a61461079b5780638583ff24146107b257610335565b80636352211e146106a65780636af843b1146106e35780636dfd90ea1461070c57610335565b8063500a2d161161025f578063500a2d16146105ec578063540c2a971461062957806356de96db146106545780635cb85cd21461067d57610335565b806342842e0e1461056a578063438b6300146105865780634bbd7e3c146105c357610335565b8063146ca531116102f257806323b872dd116102cc57806323b872dd146104ce5780632a55205a146104ea5780633ccfd60b1461052857806341f434341461053f57610335565b8063146ca5311461044f57806318160ddd1461047a5780631b7b6aed146104a557610335565b806301ffc9a71461033a57806304634d8d1461037757806304bccf7a146103a057806306fdde03146103cb578063081812fc146103f6578063095ea7b314610433575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613dec565b610ca9565b60405161036e9190613e34565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613ef1565b610cbb565b005b3480156103ac57600080fd5b506103b5610cd1565b6040516103c29190613f40565b60405180910390f35b3480156103d757600080fd5b506103e0610cf7565b6040516103ed9190613feb565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190614043565b610d89565b60405161042a9190613f40565b60405180910390f35b61044d60048036038101906104489190614070565b610e08565b005b34801561045b57600080fd5b50610464610e21565b60405161047191906140bf565b60405180910390f35b34801561048657600080fd5b5061048f610e27565b60405161049c91906140bf565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c7919061413f565b610e3e565b005b6104e860048036038101906104e3919061418c565b611104565b005b3480156104f657600080fd5b50610511600480360381019061050c91906141df565b611153565b60405161051f92919061421f565b60405180910390f35b34801561053457600080fd5b5061053d61133d565b005b34801561054b57600080fd5b50610554611407565b60405161056191906142a7565b60405180910390f35b610584600480360381019061057f919061418c565b611419565b005b34801561059257600080fd5b506105ad60048036038101906105a891906142c2565b611468565b6040516105ba91906143ad565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e5919061413f565b61156a565b005b3480156105f857600080fd5b50610613600480360381019061060e9190614043565b6116b5565b60405161062091906140bf565b60405180910390f35b34801561063557600080fd5b5061063e6116d9565b60405161064b9190613feb565b60405180910390f35b34801561066057600080fd5b5061067b600480360381019061067691906143f4565b611767565b005b34801561068957600080fd5b506106a4600480360381019061069f9190614043565b61179c565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190614043565b6117ae565b6040516106da9190613f40565b60405180910390f35b3480156106ef57600080fd5b5061070a6004803603810190610705919061413f565b6117c0565b005b34801561071857600080fd5b50610733600480360381019061072e9190614477565b611a86565b005b34801561074157600080fd5b5061075c60048036038101906107579190614043565b611bbb565b005b34801561076a57600080fd5b50610785600480360381019061078091906142c2565b611bcd565b60405161079291906140bf565b60405180910390f35b3480156107a757600080fd5b506107b0611c85565b005b3480156107be57600080fd5b506107c7611c99565b6040516107d491906140bf565b60405180910390f35b3480156107e957600080fd5b506107f2611ca3565b6040516107ff91906143ad565b60405180910390f35b34801561081457600080fd5b5061081d611cfb565b60405161082a9190613f40565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190614043565b611d25565b60405161086791906140bf565b60405180910390f35b34801561087c57600080fd5b50610885611d49565b6040516108929190613feb565b60405180910390f35b6108b560048036038101906108b09190614043565b611ddb565b005b3480156108c357600080fd5b506108de60048036038101906108d991906144f0565b611f8e565b005b6108fa60048036038101906108f59190614586565b611fa7565b005b34801561090857600080fd5b50610923600480360381019061091e9190614477565b61253b565b005b34801561093157600080fd5b5061093a612670565b6040516109479190614639565b60405180910390f35b61096a60048036038101906109659190614784565b612676565b005b34801561097857600080fd5b50610993600480360381019061098e9190614833565b6126c7565b005b3480156109a157600080fd5b506109aa6126d9565b6040516109b791906148d7565b60405180910390f35b3480156109cc57600080fd5b506109e760048036038101906109e29190614043565b6126ec565b6040516109f49190613feb565b60405180910390f35b348015610a0957600080fd5b50610a12612720565b604051610a1f91906140bf565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a91906142c2565b612726565b005b348015610a5d57600080fd5b50610a786004803603810190610a7391906142c2565b612772565b604051610a8591906140bf565b60405180910390f35b348015610a9a57600080fd5b50610aa3612784565b604051610ab091906140bf565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614043565b61278a565b604051610aed91906140bf565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190614993565b6127ae565b005b348015610b2b57600080fd5b50610b466004803603810190610b4191906149dc565b6127c9565b604051610b539190613e34565b60405180910390f35b348015610b6857600080fd5b50610b836004803603810190610b7e91906142c2565b61285d565b604051610b909190613e34565b60405180910390f35b348015610ba557600080fd5b50610bc06004803603810190610bbb9190614a1c565b61287d565b005b348015610bce57600080fd5b50610bd76128ea565b604051610be491906143ad565b60405180910390f35b348015610bf957600080fd5b50610c146004803603810190610c0f91906142c2565b612942565b005b348015610c2257600080fd5b50610c3d6004803603810190610c389190614043565b6129c5565b604051610c4a91906140bf565b60405180910390f35b348015610c5f57600080fd5b50610c686129e9565b604051610c7591906143ad565b60405180910390f35b348015610c8a57600080fd5b50610c93612a41565b604051610ca091906143ad565b60405180910390f35b6000610cb482612a99565b9050919050565b610cc3612b13565b610ccd8282612b91565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610d0690614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3290614a8b565b8015610d7f5780601f10610d5457610100808354040283529160200191610d7f565b820191906000526020600020905b815481529060010190602001808311610d6257829003601f168201915b5050505050905090565b6000610d9482612d26565b610dca576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610e1281612d85565b610e1c8383612e82565b505050565b60185481565b6000610e31612fc6565b6001546000540303905090565b610e46611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ecc5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290614b08565b60405180910390fd5b600042338484604051602001610f249493929190614bc1565b6040516020818303038152906040528051906020012060001c9050600080600090505b60328110156110fd57600060168054905084610f639190614c2b565b9050600060168281548110610f7b57610f7a614c5c565b5b906000526020600020015414610fb15760168181548110610f9f57610f9e614c5c565b5b90600052602060002001549250610fb5565b8092505b600060166001601680549050610fcb9190614cba565b81548110610fdc57610fdb614c5c565b5b906000526020600020015403611025576001601680549050610ffe9190614cba565b6016828154811061101257611011614c5c565b5b9060005260206000200181905550611078565b601660016016805490506110399190614cba565b8154811061104a57611049614c5c565b5b90600052602060002001546016828154811061106957611068614c5c565b5b90600052602060002001819055505b601680548061108a57611089614cee565b5b60019003818190600052602060002001600090559055601183815481106110b4576110b3614c5c565b5b9060005260206000200154601283815481106110d3576110d2614c5c565b5b906000526020600020018190555060036018819055505080806110f590614d1d565b915050610f47565b5050505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111425761114133612d85565b5b61114d848484612fcb565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112e85760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112f26132ed565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661131e9190614d65565b6113289190614da7565b90508160000151819350935050509250929050565b611345612b13565b6000479050600060019050611358611cfb565b73ffffffffffffffffffffffffffffffffffffffff168260405161137b90614e09565b60006040518083038185875af1925050503d80600081146113b8576040519150601f19603f3d011682016040523d82523d6000602084013e6113bd565b606091505b50508091505080611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa90614e6a565b60405180910390fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114575761145633612d85565b5b6114628484846132f7565b50505050565b6060600061147583611bcd565b905060008167ffffffffffffffff81111561149357611492614659565b5b6040519080825280602002602001820160405280156114c15781602001602082028036833780820191505090505b5090506000806114cf612fc6565b90505b6114da610e27565b81101561155e578573ffffffffffffffffffffffffffffffffffffffff16611501826117ae565b73ffffffffffffffffffffffffffffffffffffffff160361154b57808383815181106115305761152f614c5c565b5b602002602001018181525050818061154790614d1d565b9250505b808061155690614d1d565b9150506114d2565b50819350505050919050565b611572611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115f85750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90614b08565b60405180910390fd5b6000600290506000423385856040516020016116569493929190614bc1565b6040516020818303038152906040528051906020012060001c90506000828261167f9190614c2b565b90506013818154811061169557611694614c5c565b5b906000526020600020015460148190555060056018819055505050505050565b601181815481106116c557600080fd5b906000526020600020016000915090505481565b600e80546116e690614a8b565b80601f016020809104026020016040519081016040528092919081815260200182805461171290614a8b565b801561175f5780601f106117345761010080835404028352916020019161175f565b820191906000526020600020905b81548152906001019060200180831161174257829003601f168201915b505050505081565b61176f612b13565b80600a60146101000a81548160ff0219169083600481111561179457611793614860565b5b021790555050565b6117a4612b13565b80600b8190555050565b60006117b982613317565b9050919050565b6117c8611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061184e5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490614b08565b60405180910390fd5b6000423384846040516020016118a69493929190614bc1565b6040516020818303038152906040528051906020012060001c9050600080600090505b6002811015611a7f576000601780549050846118e59190614c2b565b90506000601782815481106118fd576118fc614c5c565b5b906000526020600020015414611933576017818154811061192157611920614c5c565b5b90600052602060002001549250611937565b8092505b60006017600160178054905061194d9190614cba565b8154811061195e5761195d614c5c565b5b9060005260206000200154036119a75760016017805490506119809190614cba565b6017828154811061199457611993614c5c565b5b90600052602060002001819055506119fa565b601760016017805490506119bb9190614cba565b815481106119cc576119cb614c5c565b5b9060005260206000200154601782815481106119eb576119ea614c5c565b5b90600052602060002001819055505b6017805480611a0c57611a0b614cee565b5b6001900381819060005260206000200160009055905560128381548110611a3657611a35614c5c565b5b906000526020600020015460138381548110611a5557611a54614c5c565b5b90600052602060002001819055506004601881905550508080611a7790614d1d565b9150506118c9565b5050505050565b611a8e611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b145750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90614b08565b60405180910390fd5b6010805490508282905014611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9490614ed6565b60405180910390fd5b818160109190611bae929190613d16565b5060016018819055505050565b611bc3612b13565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c34576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611c8d612b13565b611c9760006133e3565b565b6000600b54905090565b60606010805480602002602001604051908101604052809291908181526020018280548015611cf157602002820191906000526020600020905b815481526020019060010190808311611cdd575b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60128181548110611d3557600080fd5b906000526020600020016000915090505481565b606060038054611d5890614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8490614a8b565b8015611dd15780601f10611da657610100808354040283529160200191611dd1565b820191906000526020600020905b815481529060010190602001808311611db457829003601f168201915b5050505050905090565b8060008111611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614f42565b60405180910390fd5b600c5481611e2b610e27565b611e359190614f62565b1115611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d90614fe2565b60405180910390fd5b60036004811115611e8a57611e89614860565b5b600a60149054906101000a900460ff166004811115611eac57611eab614860565b5b14611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee39061504e565b60405180910390fd5b6005821115611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f27906150e0565b60405180910390fd5b81600b54611f3e9190614d65565b341015611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f779061514c565b60405180910390fd5b611f8a33836134a9565b5050565b81611f9881612d85565b611fa283836134c7565b505050565b8560008111611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614f42565b60405180910390fd5b600c5481611ff7610e27565b6120019190614f62565b1115612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203990614fe2565b60405180910390fd5b60018403612103576001600481111561205e5761205d614860565b5b600a60149054906101000a900460ff1660048111156120805761207f614860565b5b14806120bf57506002600481111561209b5761209a614860565b5b600a60149054906101000a900460ff1660048111156120bd576120bc614860565b5b145b6120fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f5906151de565b60405180910390fd5b6121bd565b6002600481111561211757612116614860565b5b600a60149054906101000a900460ff16600481111561213957612138614860565b5b14612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217090615270565b60405180910390fd5b600086146121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b3906152dc565b60405180910390fd5b5b85856121c99190614f62565b876121d333612772565b6121dd9190614f62565b111561221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590615348565b60405180910390fd5b61227461222d338888886135d2565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050613631565b6122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122aa906153b4565b60405180910390fd5b60008611156123ca5760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146123745785876123209190614cba565b600b5461232d9190614d65565b34101561236f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123669061514c565b60405180910390fd5b6123c5565b86600b546123829190614d65565b3410156123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb9061514c565b60405180910390fd5b5b61241b565b86600b546123d89190614d65565b34101561241a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124119061514c565b60405180910390fd5b5b6000861180156124375750600b54876124349190614d65565b34105b156125285760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036124cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c690615420565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61253233886134a9565b50505050505050565b612543611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125c95750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff90614b08565b60405180910390fd5b6011805490508282905014612652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264990614ed6565b60405180910390fd5b818160119190612663929190613d16565b5060026018819055505050565b600d5481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126b4576126b333612d85565b5b6126c085858585613648565b5050505050565b6126cf612b13565b80600d8190555050565b600a60149054906101000a900460ff1681565b6060600e6126f9836136bb565b60405160200161270a929190615555565b6040516020818303038152906040529050919050565b600c5481565b61272e612b13565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061277d8261370b565b9050919050565b60145481565b6013818154811061279a57600080fd5b906000526020600020016000915090505481565b6127b6612b13565b80600e90816127c59190615711565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b612885612b13565b600c5482612891610e27565b61289b9190614f62565b11156128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d390614fe2565b60405180910390fd5b6128e681836134a9565b5050565b6060601380548060200260200160405190810160405280929190818152602001828054801561293857602002820191906000526020600020905b815481526020019060010190808311612924575b5050505050905090565b61294a612b13565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b090615855565b60405180910390fd5b6129c2816133e3565b50565b601081815481106129d557600080fd5b906000526020600020016000915090505481565b60606012805480602002602001604051908101604052809291908181526020018280548015612a3757602002820191906000526020600020905b815481526020019060010190808311612a23575b5050505050905090565b60606011805480602002602001604051908101604052809291908181526020018280548015612a8f57602002820191906000526020600020905b815481526020019060010190808311612a7b575b5050505050905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b0c5750612b0b82613762565b5b9050919050565b612b1b6137cc565b73ffffffffffffffffffffffffffffffffffffffff16612b39611cfb565b73ffffffffffffffffffffffffffffffffffffffff1614612b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b86906158c1565b60405180910390fd5b565b612b996132ed565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bee90615953565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5d906159bf565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081612d31612fc6565b11158015612d40575060005482105b8015612d7e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612e7f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612dfc9291906159df565b602060405180830381865afa158015612e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3d9190615a1d565b612e7e57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612e759190613f40565b60405180910390fd5b5b50565b6000612e8d826117ae565b90508073ffffffffffffffffffffffffffffffffffffffff16612eae6137d4565b73ffffffffffffffffffffffffffffffffffffffff1614612f1157612eda81612ed56137d4565b6127c9565b612f10576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000612fd682613317565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461303d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080613049846137dc565b9150915061305f818761305a6137d4565b613803565b6130ab576130748661306f6137d4565b6127c9565b6130aa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613111576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61311e8686866001613847565b801561312957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506131f7856131d388888761384d565b7c020000000000000000000000000000000000000000000000000000000017613875565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361327d576000600185019050600060046000838152602001908152602001600020540361327b57600054811461327a578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132e586868660016138a0565b505050505050565b6000612710905090565b61331283838360405180602001604052806000815250612676565b505050565b60008082905080613326612fc6565b116133ac576000548110156133ab5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036133a9575b6000810361339f576004600083600190039350838152602001908152602001600020549050613375565b80925050506133de565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6134c38282604051806020016040528060008152506138a6565b5050565b80600760006134d46137d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166135816137d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135c69190613e34565b60405180910390a35050565b6000848484846040516020016135eb9493929190615a4a565b604051602081830303815290604052805190602001206040516020016136119190615ab0565b604051602081830303815290604052805190602001209050949350505050565b600061364082600d5485613943565b905092915050565b613653848484611104565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136b55761367e8484848461395a565b6136b4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b6001156136f657600184039350600a81066030018453600a81049050806136d4575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613864868684613aaa565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6138b08383613ab3565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461393e57600080549050600083820390505b6138f0600086838060010194508661395a565b613926576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138dd57816000541461393b57600080fd5b50505b505050565b6000826139508584613c6e565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139806137d4565b8786866040518563ffffffff1660e01b81526004016139a29493929190615b20565b6020604051808303816000875af19250505080156139de57506040513d601f19601f820116820180604052508101906139db9190615b81565b60015b613a57573d8060008114613a0e576040519150601f19603f3d011682016040523d82523d6000602084013e613a13565b606091505b506000815103613a4f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203613af3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b006000848385613847565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613b7783613b68600086600061384d565b613b7185613cc4565b17613875565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613c1857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613bdd565b5060008203613c53576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613c6960008483856138a0565b505050565b60008082905060005b8451811015613cb957613ca482868381518110613c9757613c96614c5c565b5b6020026020010151613cd4565b91508080613cb190614d1d565b915050613c77565b508091505092915050565b60006001821460e11b9050919050565b6000818310613cec57613ce78284613cff565b613cf7565b613cf68383613cff565b5b905092915050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215613d52579160200282015b82811115613d51578235825591602001919060010190613d36565b5b509050613d5f9190613d63565b5090565b5b80821115613d7c576000816000905550600101613d64565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dc981613d94565b8114613dd457600080fd5b50565b600081359050613de681613dc0565b92915050565b600060208284031215613e0257613e01613d8a565b5b6000613e1084828501613dd7565b91505092915050565b60008115159050919050565b613e2e81613e19565b82525050565b6000602082019050613e496000830184613e25565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e7a82613e4f565b9050919050565b613e8a81613e6f565b8114613e9557600080fd5b50565b600081359050613ea781613e81565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613ece81613ead565b8114613ed957600080fd5b50565b600081359050613eeb81613ec5565b92915050565b60008060408385031215613f0857613f07613d8a565b5b6000613f1685828601613e98565b9250506020613f2785828601613edc565b9150509250929050565b613f3a81613e6f565b82525050565b6000602082019050613f556000830184613f31565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f95578082015181840152602081019050613f7a565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fbd82613f5b565b613fc78185613f66565b9350613fd7818560208601613f77565b613fe081613fa1565b840191505092915050565b600060208201905081810360008301526140058184613fb2565b905092915050565b6000819050919050565b6140208161400d565b811461402b57600080fd5b50565b60008135905061403d81614017565b92915050565b60006020828403121561405957614058613d8a565b5b60006140678482850161402e565b91505092915050565b6000806040838503121561408757614086613d8a565b5b600061409585828601613e98565b92505060206140a68582860161402e565b9150509250929050565b6140b98161400d565b82525050565b60006020820190506140d460008301846140b0565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126140ff576140fe6140da565b5b8235905067ffffffffffffffff81111561411c5761411b6140df565b5b602083019150836001820283011115614138576141376140e4565b5b9250929050565b6000806020838503121561415657614155613d8a565b5b600083013567ffffffffffffffff81111561417457614173613d8f565b5b614180858286016140e9565b92509250509250929050565b6000806000606084860312156141a5576141a4613d8a565b5b60006141b386828701613e98565b93505060206141c486828701613e98565b92505060406141d58682870161402e565b9150509250925092565b600080604083850312156141f6576141f5613d8a565b5b60006142048582860161402e565b92505060206142158582860161402e565b9150509250929050565b60006040820190506142346000830185613f31565b61424160208301846140b0565b9392505050565b6000819050919050565b600061426d61426861426384613e4f565b614248565b613e4f565b9050919050565b600061427f82614252565b9050919050565b600061429182614274565b9050919050565b6142a181614286565b82525050565b60006020820190506142bc6000830184614298565b92915050565b6000602082840312156142d8576142d7613d8a565b5b60006142e684828501613e98565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6143248161400d565b82525050565b6000614336838361431b565b60208301905092915050565b6000602082019050919050565b600061435a826142ef565b61436481856142fa565b935061436f8361430b565b8060005b838110156143a0578151614387888261432a565b975061439283614342565b925050600181019050614373565b5085935050505092915050565b600060208201905081810360008301526143c7818461434f565b905092915050565b600581106143dc57600080fd5b50565b6000813590506143ee816143cf565b92915050565b60006020828403121561440a57614409613d8a565b5b6000614418848285016143df565b91505092915050565b60008083601f840112614437576144366140da565b5b8235905067ffffffffffffffff811115614454576144536140df565b5b6020830191508360208202830111156144705761446f6140e4565b5b9250929050565b6000806020838503121561448e5761448d613d8a565b5b600083013567ffffffffffffffff8111156144ac576144ab613d8f565b5b6144b885828601614421565b92509250509250929050565b6144cd81613e19565b81146144d857600080fd5b50565b6000813590506144ea816144c4565b92915050565b6000806040838503121561450757614506613d8a565b5b600061451585828601613e98565b9250506020614526858286016144db565b9150509250929050565b60008083601f840112614546576145456140da565b5b8235905067ffffffffffffffff811115614563576145626140df565b5b60208301915083602082028301111561457f5761457e6140e4565b5b9250929050565b60008060008060008060a087890312156145a3576145a2613d8a565b5b60006145b189828a0161402e565b96505060206145c289828a0161402e565b95505060406145d389828a0161402e565b94505060606145e489828a0161402e565b935050608087013567ffffffffffffffff81111561460557614604613d8f565b5b61461189828a01614530565b92509250509295509295509295565b6000819050919050565b61463381614620565b82525050565b600060208201905061464e600083018461462a565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61469182613fa1565b810181811067ffffffffffffffff821117156146b0576146af614659565b5b80604052505050565b60006146c3613d80565b90506146cf8282614688565b919050565b600067ffffffffffffffff8211156146ef576146ee614659565b5b6146f882613fa1565b9050602081019050919050565b82818337600083830152505050565b6000614727614722846146d4565b6146b9565b90508281526020810184848401111561474357614742614654565b5b61474e848285614705565b509392505050565b600082601f83011261476b5761476a6140da565b5b813561477b848260208601614714565b91505092915050565b6000806000806080858703121561479e5761479d613d8a565b5b60006147ac87828801613e98565b94505060206147bd87828801613e98565b93505060406147ce8782880161402e565b925050606085013567ffffffffffffffff8111156147ef576147ee613d8f565b5b6147fb87828801614756565b91505092959194509250565b61481081614620565b811461481b57600080fd5b50565b60008135905061482d81614807565b92915050565b60006020828403121561484957614848613d8a565b5b60006148578482850161481e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106148a05761489f614860565b5b50565b60008190506148b18261488f565b919050565b60006148c1826148a3565b9050919050565b6148d1816148b6565b82525050565b60006020820190506148ec60008301846148c8565b92915050565b600067ffffffffffffffff82111561490d5761490c614659565b5b61491682613fa1565b9050602081019050919050565b6000614936614931846148f2565b6146b9565b90508281526020810184848401111561495257614951614654565b5b61495d848285614705565b509392505050565b600082601f83011261497a576149796140da565b5b813561498a848260208601614923565b91505092915050565b6000602082840312156149a9576149a8613d8a565b5b600082013567ffffffffffffffff8111156149c7576149c6613d8f565b5b6149d384828501614965565b91505092915050565b600080604083850312156149f3576149f2613d8a565b5b6000614a0185828601613e98565b9250506020614a1285828601613e98565b9150509250929050565b60008060408385031215614a3357614a32613d8a565b5b6000614a418582860161402e565b9250506020614a5285828601613e98565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614aa357607f821691505b602082108103614ab657614ab5614a5c565b5b50919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614af2600e83613f66565b9150614afd82614abc565b602082019050919050565b60006020820190508181036000830152614b2181614ae5565b9050919050565b6000819050919050565b614b43614b3e8261400d565b614b28565b82525050565b60008160601b9050919050565b6000614b6182614b49565b9050919050565b6000614b7382614b56565b9050919050565b614b8b614b8682613e6f565b614b68565b82525050565b600081905092915050565b6000614ba88385614b91565b9350614bb5838584614705565b82840190509392505050565b6000614bcd8287614b32565b602082019150614bdd8286614b7a565b601482019150614bee828486614b9c565b915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c368261400d565b9150614c418361400d565b925082614c5157614c50614bfc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cc58261400d565b9150614cd08361400d565b9250828203905081811115614ce857614ce7614c8b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614d288261400d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d5a57614d59614c8b565b5b600182019050919050565b6000614d708261400d565b9150614d7b8361400d565b9250828202614d898161400d565b91508282048414831517614da057614d9f614c8b565b5b5092915050565b6000614db28261400d565b9150614dbd8361400d565b925082614dcd57614dcc614bfc565b5b828204905092915050565b600081905092915050565b50565b6000614df3600083614dd8565b9150614dfe82614de3565b600082019050919050565b6000614e1482614de6565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614e54600f83613f66565b9150614e5f82614e1e565b602082019050919050565b60006020820190508181036000830152614e8381614e47565b9050919050565b7f4261642044617461000000000000000000000000000000000000000000000000600082015250565b6000614ec0600883613f66565b9150614ecb82614e8a565b602082019050919050565b60006020820190508181036000830152614eef81614eb3565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b6000614f2c601383613f66565b9150614f3782614ef6565b602082019050919050565b60006020820190508181036000830152614f5b81614f1f565b9050919050565b6000614f6d8261400d565b9150614f788361400d565b9250828201905080821115614f9057614f8f614c8b565b5b92915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614fcc601383613f66565b9150614fd782614f96565b602082019050919050565b60006020820190508181036000830152614ffb81614fbf565b9050919050565b7f5075626c6963206d696e74206973206e6f7420617661696c61626c6520796574600082015250565b6000615038602083613f66565b915061504382615002565b602082019050919050565b600060208201905081810360008301526150678161502b565b9050919050565b7f546f6f206d616e79206d696e747320706572207472616e73616374696f6e207260008201527f6571756573746564000000000000000000000000000000000000000000000000602082015250565b60006150ca602883613f66565b91506150d58261506e565b604082019050919050565b600060208201905081810360008301526150f9816150bd565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000615136601283613f66565b915061514182615100565b602082019050919050565b6000602082019050818103600083015261516581615129565b9050919050565b7f447261772057696e6e657273206d696e74206973206e6f7420617661696c616260008201527f6c65207269676874206e6f770000000000000000000000000000000000000000602082015250565b60006151c8602c83613f66565b91506151d38261516c565b604082019050919050565b600060208201905081810360008301526151f7816151bb565b9050919050565b7f416c6c6f774c697374206d696e74206973206e6f7420617661696c61626c652060008201527f7269676874206e6f770000000000000000000000000000000000000000000000602082015250565b600061525a602983613f66565b9150615265826151fe565b604082019050919050565b600060208201905081810360008301526152898161524d565b9050919050565b7f416c6c6f774c6973742063616e6e6f74206861766520667265656d696e747300600082015250565b60006152c6601f83613f66565b91506152d182615290565b602082019050919050565b600060208201905081810360008301526152f5816152b9565b9050919050565b7f4578636565647320616c6c6f776564206e756d626572206f66206d696e747300600082015250565b6000615332601f83613f66565b915061533d826152fc565b602082019050919050565b6000602082019050818103600083015261536181615325565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b600061539e600d83613f66565b91506153a982615368565b602082019050919050565b600060208201905081810360008301526153cd81615391565b9050919050565b7f46726565206d696e7420616c726561647920636c61696d656400000000000000600082015250565b600061540a601983613f66565b9150615415826153d4565b602082019050919050565b60006020820190508181036000830152615439816153fd565b9050919050565b60008190508160005260206000209050919050565b6000815461546281614a8b565b61546c8186614b91565b94506001821660008114615487576001811461549c576154cf565b60ff19831686528115158202860193506154cf565b6154a585615440565b60005b838110156154c7578154818901526001820191506020810190506154a8565b838801955050505b50505092915050565b60006154e382613f5b565b6154ed8185614b91565b93506154fd818560208601613f77565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061553f600583614b91565b915061554a82615509565b600582019050919050565b60006155618285615455565b915061556d82846154d8565b915061557882615532565b91508190509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026155d17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615594565b6155db8683615594565b95508019841693508086168417925050509392505050565b600061560e6156096156048461400d565b614248565b61400d565b9050919050565b6000819050919050565b615628836155f3565b61563c61563482615615565b8484546155a1565b825550505050565b600090565b615651615644565b61565c81848461561f565b505050565b5b8181101561568057615675600082615649565b600181019050615662565b5050565b601f8211156156c55761569681615440565b61569f84615584565b810160208510156156ae578190505b6156c26156ba85615584565b830182615661565b50505b505050565b600082821c905092915050565b60006156e8600019846008026156ca565b1980831691505092915050565b600061570183836156d7565b9150826002028217905092915050565b61571a82613f5b565b67ffffffffffffffff81111561573357615732614659565b5b61573d8254614a8b565b615748828285615684565b600060209050601f83116001811461577b5760008415615769578287015190505b61577385826156f5565b8655506157db565b601f19841661578986615440565b60005b828110156157b15784890151825560018201915060208501945060208101905061578c565b868310156157ce57848901516157ca601f8916826156d7565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061583f602683613f66565b915061584a826157e3565b604082019050919050565b6000602082019050818103600083015261586e81615832565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006158ab602083613f66565b91506158b682615875565b602082019050919050565b600060208201905081810360008301526158da8161589e565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061593d602a83613f66565b9150615948826158e1565b604082019050919050565b6000602082019050818103600083015261596c81615930565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006159a9601983613f66565b91506159b482615973565b602082019050919050565b600060208201905081810360008301526159d88161599c565b9050919050565b60006040820190506159f46000830185613f31565b615a016020830184613f31565b9392505050565b600081519050615a17816144c4565b92915050565b600060208284031215615a3357615a32613d8a565b5b6000615a4184828501615a08565b91505092915050565b6000608082019050615a5f6000830187613f31565b615a6c60208301866140b0565b615a7960408301856140b0565b615a8660608301846140b0565b95945050505050565b6000819050919050565b615aaa615aa582614620565b615a8f565b82525050565b6000615abc8284615a99565b60208201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000615af282615acb565b615afc8185615ad6565b9350615b0c818560208601613f77565b615b1581613fa1565b840191505092915050565b6000608082019050615b356000830187613f31565b615b426020830186613f31565b615b4f60408301856140b0565b8181036060830152615b618184615ae7565b905095945050505050565b600081519050615b7b81613dc0565b92915050565b600060208284031215615b9757615b96613d8a565b5b6000615ba584828501615b6c565b9150509291505056fea2646970667358221220d9008552855d2100e03026fa672258e188f36f21ff8b2fcbab1c8c45686f076f64736f6c63430008110033687474703a2f2f6d657461646174612e6d696e746675642e636f6d3a333333332f736561736f6e332f
Deployed Bytecode
0x6080604052600436106103355760003560e01c806385ef3e1c116101ab578063d5abeb01116100f7578063ef56267e11610095578063f2fde38b1161006f578063f2fde38b14610bed578063fc7e264a14610c16578063fd90002514610c53578063fe4ac90614610c7e57610335565b8063ef56267e14610b5c578063efbd73f414610b99578063f1a2096d14610bc257610335565b8063dfbf53ae116100d1578063dfbf53ae14610a8e578063e074753d14610ab9578063e0df5b6f14610af6578063e985e9c514610b1f57610335565b8063d5abeb01146109fd578063d6cbd04f14610a28578063dc33e68114610a5157610335565b8063a3723f4e11610164578063b88d4fde1161013e578063b88d4fde14610950578063bd32fb661461096c578063c19d93fb14610995578063c87b56dd146109c057610335565b8063a3723f4e146108e0578063a7f62d86146108fc578063aa98e0c61461092557610335565b806385ef3e1c146107dd5780638da5cb5b14610808578063930405871461083357806395d89b4114610870578063a0712d681461089b578063a22cb465146108b757610335565b806342842e0e116102855780636352211e116102235780636f8b44b0116101fd5780636f8b44b01461073557806370a082311461075e578063715018a61461079b5780638583ff24146107b257610335565b80636352211e146106a65780636af843b1146106e35780636dfd90ea1461070c57610335565b8063500a2d161161025f578063500a2d16146105ec578063540c2a971461062957806356de96db146106545780635cb85cd21461067d57610335565b806342842e0e1461056a578063438b6300146105865780634bbd7e3c146105c357610335565b8063146ca531116102f257806323b872dd116102cc57806323b872dd146104ce5780632a55205a146104ea5780633ccfd60b1461052857806341f434341461053f57610335565b8063146ca5311461044f57806318160ddd1461047a5780631b7b6aed146104a557610335565b806301ffc9a71461033a57806304634d8d1461037757806304bccf7a146103a057806306fdde03146103cb578063081812fc146103f6578063095ea7b314610433575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613dec565b610ca9565b60405161036e9190613e34565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613ef1565b610cbb565b005b3480156103ac57600080fd5b506103b5610cd1565b6040516103c29190613f40565b60405180910390f35b3480156103d757600080fd5b506103e0610cf7565b6040516103ed9190613feb565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190614043565b610d89565b60405161042a9190613f40565b60405180910390f35b61044d60048036038101906104489190614070565b610e08565b005b34801561045b57600080fd5b50610464610e21565b60405161047191906140bf565b60405180910390f35b34801561048657600080fd5b5061048f610e27565b60405161049c91906140bf565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c7919061413f565b610e3e565b005b6104e860048036038101906104e3919061418c565b611104565b005b3480156104f657600080fd5b50610511600480360381019061050c91906141df565b611153565b60405161051f92919061421f565b60405180910390f35b34801561053457600080fd5b5061053d61133d565b005b34801561054b57600080fd5b50610554611407565b60405161056191906142a7565b60405180910390f35b610584600480360381019061057f919061418c565b611419565b005b34801561059257600080fd5b506105ad60048036038101906105a891906142c2565b611468565b6040516105ba91906143ad565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e5919061413f565b61156a565b005b3480156105f857600080fd5b50610613600480360381019061060e9190614043565b6116b5565b60405161062091906140bf565b60405180910390f35b34801561063557600080fd5b5061063e6116d9565b60405161064b9190613feb565b60405180910390f35b34801561066057600080fd5b5061067b600480360381019061067691906143f4565b611767565b005b34801561068957600080fd5b506106a4600480360381019061069f9190614043565b61179c565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190614043565b6117ae565b6040516106da9190613f40565b60405180910390f35b3480156106ef57600080fd5b5061070a6004803603810190610705919061413f565b6117c0565b005b34801561071857600080fd5b50610733600480360381019061072e9190614477565b611a86565b005b34801561074157600080fd5b5061075c60048036038101906107579190614043565b611bbb565b005b34801561076a57600080fd5b50610785600480360381019061078091906142c2565b611bcd565b60405161079291906140bf565b60405180910390f35b3480156107a757600080fd5b506107b0611c85565b005b3480156107be57600080fd5b506107c7611c99565b6040516107d491906140bf565b60405180910390f35b3480156107e957600080fd5b506107f2611ca3565b6040516107ff91906143ad565b60405180910390f35b34801561081457600080fd5b5061081d611cfb565b60405161082a9190613f40565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190614043565b611d25565b60405161086791906140bf565b60405180910390f35b34801561087c57600080fd5b50610885611d49565b6040516108929190613feb565b60405180910390f35b6108b560048036038101906108b09190614043565b611ddb565b005b3480156108c357600080fd5b506108de60048036038101906108d991906144f0565b611f8e565b005b6108fa60048036038101906108f59190614586565b611fa7565b005b34801561090857600080fd5b50610923600480360381019061091e9190614477565b61253b565b005b34801561093157600080fd5b5061093a612670565b6040516109479190614639565b60405180910390f35b61096a60048036038101906109659190614784565b612676565b005b34801561097857600080fd5b50610993600480360381019061098e9190614833565b6126c7565b005b3480156109a157600080fd5b506109aa6126d9565b6040516109b791906148d7565b60405180910390f35b3480156109cc57600080fd5b506109e760048036038101906109e29190614043565b6126ec565b6040516109f49190613feb565b60405180910390f35b348015610a0957600080fd5b50610a12612720565b604051610a1f91906140bf565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a91906142c2565b612726565b005b348015610a5d57600080fd5b50610a786004803603810190610a7391906142c2565b612772565b604051610a8591906140bf565b60405180910390f35b348015610a9a57600080fd5b50610aa3612784565b604051610ab091906140bf565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614043565b61278a565b604051610aed91906140bf565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190614993565b6127ae565b005b348015610b2b57600080fd5b50610b466004803603810190610b4191906149dc565b6127c9565b604051610b539190613e34565b60405180910390f35b348015610b6857600080fd5b50610b836004803603810190610b7e91906142c2565b61285d565b604051610b909190613e34565b60405180910390f35b348015610ba557600080fd5b50610bc06004803603810190610bbb9190614a1c565b61287d565b005b348015610bce57600080fd5b50610bd76128ea565b604051610be491906143ad565b60405180910390f35b348015610bf957600080fd5b50610c146004803603810190610c0f91906142c2565b612942565b005b348015610c2257600080fd5b50610c3d6004803603810190610c389190614043565b6129c5565b604051610c4a91906140bf565b60405180910390f35b348015610c5f57600080fd5b50610c686129e9565b604051610c7591906143ad565b60405180910390f35b348015610c8a57600080fd5b50610c93612a41565b604051610ca091906143ad565b60405180910390f35b6000610cb482612a99565b9050919050565b610cc3612b13565b610ccd8282612b91565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610d0690614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3290614a8b565b8015610d7f5780601f10610d5457610100808354040283529160200191610d7f565b820191906000526020600020905b815481529060010190602001808311610d6257829003601f168201915b5050505050905090565b6000610d9482612d26565b610dca576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610e1281612d85565b610e1c8383612e82565b505050565b60185481565b6000610e31612fc6565b6001546000540303905090565b610e46611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ecc5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290614b08565b60405180910390fd5b600042338484604051602001610f249493929190614bc1565b6040516020818303038152906040528051906020012060001c9050600080600090505b60328110156110fd57600060168054905084610f639190614c2b565b9050600060168281548110610f7b57610f7a614c5c565b5b906000526020600020015414610fb15760168181548110610f9f57610f9e614c5c565b5b90600052602060002001549250610fb5565b8092505b600060166001601680549050610fcb9190614cba565b81548110610fdc57610fdb614c5c565b5b906000526020600020015403611025576001601680549050610ffe9190614cba565b6016828154811061101257611011614c5c565b5b9060005260206000200181905550611078565b601660016016805490506110399190614cba565b8154811061104a57611049614c5c565b5b90600052602060002001546016828154811061106957611068614c5c565b5b90600052602060002001819055505b601680548061108a57611089614cee565b5b60019003818190600052602060002001600090559055601183815481106110b4576110b3614c5c565b5b9060005260206000200154601283815481106110d3576110d2614c5c565b5b906000526020600020018190555060036018819055505080806110f590614d1d565b915050610f47565b5050505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111425761114133612d85565b5b61114d848484612fcb565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112e85760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112f26132ed565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661131e9190614d65565b6113289190614da7565b90508160000151819350935050509250929050565b611345612b13565b6000479050600060019050611358611cfb565b73ffffffffffffffffffffffffffffffffffffffff168260405161137b90614e09565b60006040518083038185875af1925050503d80600081146113b8576040519150601f19603f3d011682016040523d82523d6000602084013e6113bd565b606091505b50508091505080611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa90614e6a565b60405180910390fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114575761145633612d85565b5b6114628484846132f7565b50505050565b6060600061147583611bcd565b905060008167ffffffffffffffff81111561149357611492614659565b5b6040519080825280602002602001820160405280156114c15781602001602082028036833780820191505090505b5090506000806114cf612fc6565b90505b6114da610e27565b81101561155e578573ffffffffffffffffffffffffffffffffffffffff16611501826117ae565b73ffffffffffffffffffffffffffffffffffffffff160361154b57808383815181106115305761152f614c5c565b5b602002602001018181525050818061154790614d1d565b9250505b808061155690614d1d565b9150506114d2565b50819350505050919050565b611572611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115f85750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90614b08565b60405180910390fd5b6000600290506000423385856040516020016116569493929190614bc1565b6040516020818303038152906040528051906020012060001c90506000828261167f9190614c2b565b90506013818154811061169557611694614c5c565b5b906000526020600020015460148190555060056018819055505050505050565b601181815481106116c557600080fd5b906000526020600020016000915090505481565b600e80546116e690614a8b565b80601f016020809104026020016040519081016040528092919081815260200182805461171290614a8b565b801561175f5780601f106117345761010080835404028352916020019161175f565b820191906000526020600020905b81548152906001019060200180831161174257829003601f168201915b505050505081565b61176f612b13565b80600a60146101000a81548160ff0219169083600481111561179457611793614860565b5b021790555050565b6117a4612b13565b80600b8190555050565b60006117b982613317565b9050919050565b6117c8611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061184e5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490614b08565b60405180910390fd5b6000423384846040516020016118a69493929190614bc1565b6040516020818303038152906040528051906020012060001c9050600080600090505b6002811015611a7f576000601780549050846118e59190614c2b565b90506000601782815481106118fd576118fc614c5c565b5b906000526020600020015414611933576017818154811061192157611920614c5c565b5b90600052602060002001549250611937565b8092505b60006017600160178054905061194d9190614cba565b8154811061195e5761195d614c5c565b5b9060005260206000200154036119a75760016017805490506119809190614cba565b6017828154811061199457611993614c5c565b5b90600052602060002001819055506119fa565b601760016017805490506119bb9190614cba565b815481106119cc576119cb614c5c565b5b9060005260206000200154601782815481106119eb576119ea614c5c565b5b90600052602060002001819055505b6017805480611a0c57611a0b614cee565b5b6001900381819060005260206000200160009055905560128381548110611a3657611a35614c5c565b5b906000526020600020015460138381548110611a5557611a54614c5c565b5b90600052602060002001819055506004601881905550508080611a7790614d1d565b9150506118c9565b5050505050565b611a8e611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b145750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90614b08565b60405180910390fd5b6010805490508282905014611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9490614ed6565b60405180910390fd5b818160109190611bae929190613d16565b5060016018819055505050565b611bc3612b13565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c34576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611c8d612b13565b611c9760006133e3565b565b6000600b54905090565b60606010805480602002602001604051908101604052809291908181526020018280548015611cf157602002820191906000526020600020905b815481526020019060010190808311611cdd575b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60128181548110611d3557600080fd5b906000526020600020016000915090505481565b606060038054611d5890614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8490614a8b565b8015611dd15780601f10611da657610100808354040283529160200191611dd1565b820191906000526020600020905b815481529060010190602001808311611db457829003601f168201915b5050505050905090565b8060008111611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614f42565b60405180910390fd5b600c5481611e2b610e27565b611e359190614f62565b1115611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d90614fe2565b60405180910390fd5b60036004811115611e8a57611e89614860565b5b600a60149054906101000a900460ff166004811115611eac57611eab614860565b5b14611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee39061504e565b60405180910390fd5b6005821115611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f27906150e0565b60405180910390fd5b81600b54611f3e9190614d65565b341015611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f779061514c565b60405180910390fd5b611f8a33836134a9565b5050565b81611f9881612d85565b611fa283836134c7565b505050565b8560008111611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614f42565b60405180910390fd5b600c5481611ff7610e27565b6120019190614f62565b1115612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203990614fe2565b60405180910390fd5b60018403612103576001600481111561205e5761205d614860565b5b600a60149054906101000a900460ff1660048111156120805761207f614860565b5b14806120bf57506002600481111561209b5761209a614860565b5b600a60149054906101000a900460ff1660048111156120bd576120bc614860565b5b145b6120fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f5906151de565b60405180910390fd5b6121bd565b6002600481111561211757612116614860565b5b600a60149054906101000a900460ff16600481111561213957612138614860565b5b14612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217090615270565b60405180910390fd5b600086146121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b3906152dc565b60405180910390fd5b5b85856121c99190614f62565b876121d333612772565b6121dd9190614f62565b111561221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590615348565b60405180910390fd5b61227461222d338888886135d2565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050613631565b6122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122aa906153b4565b60405180910390fd5b60008611156123ca5760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146123745785876123209190614cba565b600b5461232d9190614d65565b34101561236f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123669061514c565b60405180910390fd5b6123c5565b86600b546123829190614d65565b3410156123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb9061514c565b60405180910390fd5b5b61241b565b86600b546123d89190614d65565b34101561241a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124119061514c565b60405180910390fd5b5b6000861180156124375750600b54876124349190614d65565b34105b156125285760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036124cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c690615420565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61253233886134a9565b50505050505050565b612543611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125c95750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff90614b08565b60405180910390fd5b6011805490508282905014612652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264990614ed6565b60405180910390fd5b818160119190612663929190613d16565b5060026018819055505050565b600d5481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126b4576126b333612d85565b5b6126c085858585613648565b5050505050565b6126cf612b13565b80600d8190555050565b600a60149054906101000a900460ff1681565b6060600e6126f9836136bb565b60405160200161270a929190615555565b6040516020818303038152906040529050919050565b600c5481565b61272e612b13565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061277d8261370b565b9050919050565b60145481565b6013818154811061279a57600080fd5b906000526020600020016000915090505481565b6127b6612b13565b80600e90816127c59190615711565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b612885612b13565b600c5482612891610e27565b61289b9190614f62565b11156128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d390614fe2565b60405180910390fd5b6128e681836134a9565b5050565b6060601380548060200260200160405190810160405280929190818152602001828054801561293857602002820191906000526020600020905b815481526020019060010190808311612924575b5050505050905090565b61294a612b13565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b090615855565b60405180910390fd5b6129c2816133e3565b50565b601081815481106129d557600080fd5b906000526020600020016000915090505481565b60606012805480602002602001604051908101604052809291908181526020018280548015612a3757602002820191906000526020600020905b815481526020019060010190808311612a23575b5050505050905090565b60606011805480602002602001604051908101604052809291908181526020018280548015612a8f57602002820191906000526020600020905b815481526020019060010190808311612a7b575b5050505050905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b0c5750612b0b82613762565b5b9050919050565b612b1b6137cc565b73ffffffffffffffffffffffffffffffffffffffff16612b39611cfb565b73ffffffffffffffffffffffffffffffffffffffff1614612b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b86906158c1565b60405180910390fd5b565b612b996132ed565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bee90615953565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5d906159bf565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081612d31612fc6565b11158015612d40575060005482105b8015612d7e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612e7f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612dfc9291906159df565b602060405180830381865afa158015612e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3d9190615a1d565b612e7e57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612e759190613f40565b60405180910390fd5b5b50565b6000612e8d826117ae565b90508073ffffffffffffffffffffffffffffffffffffffff16612eae6137d4565b73ffffffffffffffffffffffffffffffffffffffff1614612f1157612eda81612ed56137d4565b6127c9565b612f10576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000612fd682613317565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461303d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080613049846137dc565b9150915061305f818761305a6137d4565b613803565b6130ab576130748661306f6137d4565b6127c9565b6130aa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613111576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61311e8686866001613847565b801561312957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506131f7856131d388888761384d565b7c020000000000000000000000000000000000000000000000000000000017613875565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361327d576000600185019050600060046000838152602001908152602001600020540361327b57600054811461327a578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132e586868660016138a0565b505050505050565b6000612710905090565b61331283838360405180602001604052806000815250612676565b505050565b60008082905080613326612fc6565b116133ac576000548110156133ab5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036133a9575b6000810361339f576004600083600190039350838152602001908152602001600020549050613375565b80925050506133de565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6134c38282604051806020016040528060008152506138a6565b5050565b80600760006134d46137d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166135816137d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135c69190613e34565b60405180910390a35050565b6000848484846040516020016135eb9493929190615a4a565b604051602081830303815290604052805190602001206040516020016136119190615ab0565b604051602081830303815290604052805190602001209050949350505050565b600061364082600d5485613943565b905092915050565b613653848484611104565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136b55761367e8484848461395a565b6136b4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b6001156136f657600184039350600a81066030018453600a81049050806136d4575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613864868684613aaa565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6138b08383613ab3565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461393e57600080549050600083820390505b6138f0600086838060010194508661395a565b613926576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138dd57816000541461393b57600080fd5b50505b505050565b6000826139508584613c6e565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139806137d4565b8786866040518563ffffffff1660e01b81526004016139a29493929190615b20565b6020604051808303816000875af19250505080156139de57506040513d601f19601f820116820180604052508101906139db9190615b81565b60015b613a57573d8060008114613a0e576040519150601f19603f3d011682016040523d82523d6000602084013e613a13565b606091505b506000815103613a4f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203613af3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b006000848385613847565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613b7783613b68600086600061384d565b613b7185613cc4565b17613875565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613c1857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613bdd565b5060008203613c53576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613c6960008483856138a0565b505050565b60008082905060005b8451811015613cb957613ca482868381518110613c9757613c96614c5c565b5b6020026020010151613cd4565b91508080613cb190614d1d565b915050613c77565b508091505092915050565b60006001821460e11b9050919050565b6000818310613cec57613ce78284613cff565b613cf7565b613cf68383613cff565b5b905092915050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215613d52579160200282015b82811115613d51578235825591602001919060010190613d36565b5b509050613d5f9190613d63565b5090565b5b80821115613d7c576000816000905550600101613d64565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dc981613d94565b8114613dd457600080fd5b50565b600081359050613de681613dc0565b92915050565b600060208284031215613e0257613e01613d8a565b5b6000613e1084828501613dd7565b91505092915050565b60008115159050919050565b613e2e81613e19565b82525050565b6000602082019050613e496000830184613e25565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e7a82613e4f565b9050919050565b613e8a81613e6f565b8114613e9557600080fd5b50565b600081359050613ea781613e81565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613ece81613ead565b8114613ed957600080fd5b50565b600081359050613eeb81613ec5565b92915050565b60008060408385031215613f0857613f07613d8a565b5b6000613f1685828601613e98565b9250506020613f2785828601613edc565b9150509250929050565b613f3a81613e6f565b82525050565b6000602082019050613f556000830184613f31565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f95578082015181840152602081019050613f7a565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fbd82613f5b565b613fc78185613f66565b9350613fd7818560208601613f77565b613fe081613fa1565b840191505092915050565b600060208201905081810360008301526140058184613fb2565b905092915050565b6000819050919050565b6140208161400d565b811461402b57600080fd5b50565b60008135905061403d81614017565b92915050565b60006020828403121561405957614058613d8a565b5b60006140678482850161402e565b91505092915050565b6000806040838503121561408757614086613d8a565b5b600061409585828601613e98565b92505060206140a68582860161402e565b9150509250929050565b6140b98161400d565b82525050565b60006020820190506140d460008301846140b0565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126140ff576140fe6140da565b5b8235905067ffffffffffffffff81111561411c5761411b6140df565b5b602083019150836001820283011115614138576141376140e4565b5b9250929050565b6000806020838503121561415657614155613d8a565b5b600083013567ffffffffffffffff81111561417457614173613d8f565b5b614180858286016140e9565b92509250509250929050565b6000806000606084860312156141a5576141a4613d8a565b5b60006141b386828701613e98565b93505060206141c486828701613e98565b92505060406141d58682870161402e565b9150509250925092565b600080604083850312156141f6576141f5613d8a565b5b60006142048582860161402e565b92505060206142158582860161402e565b9150509250929050565b60006040820190506142346000830185613f31565b61424160208301846140b0565b9392505050565b6000819050919050565b600061426d61426861426384613e4f565b614248565b613e4f565b9050919050565b600061427f82614252565b9050919050565b600061429182614274565b9050919050565b6142a181614286565b82525050565b60006020820190506142bc6000830184614298565b92915050565b6000602082840312156142d8576142d7613d8a565b5b60006142e684828501613e98565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6143248161400d565b82525050565b6000614336838361431b565b60208301905092915050565b6000602082019050919050565b600061435a826142ef565b61436481856142fa565b935061436f8361430b565b8060005b838110156143a0578151614387888261432a565b975061439283614342565b925050600181019050614373565b5085935050505092915050565b600060208201905081810360008301526143c7818461434f565b905092915050565b600581106143dc57600080fd5b50565b6000813590506143ee816143cf565b92915050565b60006020828403121561440a57614409613d8a565b5b6000614418848285016143df565b91505092915050565b60008083601f840112614437576144366140da565b5b8235905067ffffffffffffffff811115614454576144536140df565b5b6020830191508360208202830111156144705761446f6140e4565b5b9250929050565b6000806020838503121561448e5761448d613d8a565b5b600083013567ffffffffffffffff8111156144ac576144ab613d8f565b5b6144b885828601614421565b92509250509250929050565b6144cd81613e19565b81146144d857600080fd5b50565b6000813590506144ea816144c4565b92915050565b6000806040838503121561450757614506613d8a565b5b600061451585828601613e98565b9250506020614526858286016144db565b9150509250929050565b60008083601f840112614546576145456140da565b5b8235905067ffffffffffffffff811115614563576145626140df565b5b60208301915083602082028301111561457f5761457e6140e4565b5b9250929050565b60008060008060008060a087890312156145a3576145a2613d8a565b5b60006145b189828a0161402e565b96505060206145c289828a0161402e565b95505060406145d389828a0161402e565b94505060606145e489828a0161402e565b935050608087013567ffffffffffffffff81111561460557614604613d8f565b5b61461189828a01614530565b92509250509295509295509295565b6000819050919050565b61463381614620565b82525050565b600060208201905061464e600083018461462a565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61469182613fa1565b810181811067ffffffffffffffff821117156146b0576146af614659565b5b80604052505050565b60006146c3613d80565b90506146cf8282614688565b919050565b600067ffffffffffffffff8211156146ef576146ee614659565b5b6146f882613fa1565b9050602081019050919050565b82818337600083830152505050565b6000614727614722846146d4565b6146b9565b90508281526020810184848401111561474357614742614654565b5b61474e848285614705565b509392505050565b600082601f83011261476b5761476a6140da565b5b813561477b848260208601614714565b91505092915050565b6000806000806080858703121561479e5761479d613d8a565b5b60006147ac87828801613e98565b94505060206147bd87828801613e98565b93505060406147ce8782880161402e565b925050606085013567ffffffffffffffff8111156147ef576147ee613d8f565b5b6147fb87828801614756565b91505092959194509250565b61481081614620565b811461481b57600080fd5b50565b60008135905061482d81614807565b92915050565b60006020828403121561484957614848613d8a565b5b60006148578482850161481e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106148a05761489f614860565b5b50565b60008190506148b18261488f565b919050565b60006148c1826148a3565b9050919050565b6148d1816148b6565b82525050565b60006020820190506148ec60008301846148c8565b92915050565b600067ffffffffffffffff82111561490d5761490c614659565b5b61491682613fa1565b9050602081019050919050565b6000614936614931846148f2565b6146b9565b90508281526020810184848401111561495257614951614654565b5b61495d848285614705565b509392505050565b600082601f83011261497a576149796140da565b5b813561498a848260208601614923565b91505092915050565b6000602082840312156149a9576149a8613d8a565b5b600082013567ffffffffffffffff8111156149c7576149c6613d8f565b5b6149d384828501614965565b91505092915050565b600080604083850312156149f3576149f2613d8a565b5b6000614a0185828601613e98565b9250506020614a1285828601613e98565b9150509250929050565b60008060408385031215614a3357614a32613d8a565b5b6000614a418582860161402e565b9250506020614a5285828601613e98565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614aa357607f821691505b602082108103614ab657614ab5614a5c565b5b50919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614af2600e83613f66565b9150614afd82614abc565b602082019050919050565b60006020820190508181036000830152614b2181614ae5565b9050919050565b6000819050919050565b614b43614b3e8261400d565b614b28565b82525050565b60008160601b9050919050565b6000614b6182614b49565b9050919050565b6000614b7382614b56565b9050919050565b614b8b614b8682613e6f565b614b68565b82525050565b600081905092915050565b6000614ba88385614b91565b9350614bb5838584614705565b82840190509392505050565b6000614bcd8287614b32565b602082019150614bdd8286614b7a565b601482019150614bee828486614b9c565b915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c368261400d565b9150614c418361400d565b925082614c5157614c50614bfc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cc58261400d565b9150614cd08361400d565b9250828203905081811115614ce857614ce7614c8b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614d288261400d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d5a57614d59614c8b565b5b600182019050919050565b6000614d708261400d565b9150614d7b8361400d565b9250828202614d898161400d565b91508282048414831517614da057614d9f614c8b565b5b5092915050565b6000614db28261400d565b9150614dbd8361400d565b925082614dcd57614dcc614bfc565b5b828204905092915050565b600081905092915050565b50565b6000614df3600083614dd8565b9150614dfe82614de3565b600082019050919050565b6000614e1482614de6565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614e54600f83613f66565b9150614e5f82614e1e565b602082019050919050565b60006020820190508181036000830152614e8381614e47565b9050919050565b7f4261642044617461000000000000000000000000000000000000000000000000600082015250565b6000614ec0600883613f66565b9150614ecb82614e8a565b602082019050919050565b60006020820190508181036000830152614eef81614eb3565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b6000614f2c601383613f66565b9150614f3782614ef6565b602082019050919050565b60006020820190508181036000830152614f5b81614f1f565b9050919050565b6000614f6d8261400d565b9150614f788361400d565b9250828201905080821115614f9057614f8f614c8b565b5b92915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614fcc601383613f66565b9150614fd782614f96565b602082019050919050565b60006020820190508181036000830152614ffb81614fbf565b9050919050565b7f5075626c6963206d696e74206973206e6f7420617661696c61626c6520796574600082015250565b6000615038602083613f66565b915061504382615002565b602082019050919050565b600060208201905081810360008301526150678161502b565b9050919050565b7f546f6f206d616e79206d696e747320706572207472616e73616374696f6e207260008201527f6571756573746564000000000000000000000000000000000000000000000000602082015250565b60006150ca602883613f66565b91506150d58261506e565b604082019050919050565b600060208201905081810360008301526150f9816150bd565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000615136601283613f66565b915061514182615100565b602082019050919050565b6000602082019050818103600083015261516581615129565b9050919050565b7f447261772057696e6e657273206d696e74206973206e6f7420617661696c616260008201527f6c65207269676874206e6f770000000000000000000000000000000000000000602082015250565b60006151c8602c83613f66565b91506151d38261516c565b604082019050919050565b600060208201905081810360008301526151f7816151bb565b9050919050565b7f416c6c6f774c697374206d696e74206973206e6f7420617661696c61626c652060008201527f7269676874206e6f770000000000000000000000000000000000000000000000602082015250565b600061525a602983613f66565b9150615265826151fe565b604082019050919050565b600060208201905081810360008301526152898161524d565b9050919050565b7f416c6c6f774c6973742063616e6e6f74206861766520667265656d696e747300600082015250565b60006152c6601f83613f66565b91506152d182615290565b602082019050919050565b600060208201905081810360008301526152f5816152b9565b9050919050565b7f4578636565647320616c6c6f776564206e756d626572206f66206d696e747300600082015250565b6000615332601f83613f66565b915061533d826152fc565b602082019050919050565b6000602082019050818103600083015261536181615325565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b600061539e600d83613f66565b91506153a982615368565b602082019050919050565b600060208201905081810360008301526153cd81615391565b9050919050565b7f46726565206d696e7420616c726561647920636c61696d656400000000000000600082015250565b600061540a601983613f66565b9150615415826153d4565b602082019050919050565b60006020820190508181036000830152615439816153fd565b9050919050565b60008190508160005260206000209050919050565b6000815461546281614a8b565b61546c8186614b91565b94506001821660008114615487576001811461549c576154cf565b60ff19831686528115158202860193506154cf565b6154a585615440565b60005b838110156154c7578154818901526001820191506020810190506154a8565b838801955050505b50505092915050565b60006154e382613f5b565b6154ed8185614b91565b93506154fd818560208601613f77565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061553f600583614b91565b915061554a82615509565b600582019050919050565b60006155618285615455565b915061556d82846154d8565b915061557882615532565b91508190509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026155d17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615594565b6155db8683615594565b95508019841693508086168417925050509392505050565b600061560e6156096156048461400d565b614248565b61400d565b9050919050565b6000819050919050565b615628836155f3565b61563c61563482615615565b8484546155a1565b825550505050565b600090565b615651615644565b61565c81848461561f565b505050565b5b8181101561568057615675600082615649565b600181019050615662565b5050565b601f8211156156c55761569681615440565b61569f84615584565b810160208510156156ae578190505b6156c26156ba85615584565b830182615661565b50505b505050565b600082821c905092915050565b60006156e8600019846008026156ca565b1980831691505092915050565b600061570183836156d7565b9150826002028217905092915050565b61571a82613f5b565b67ffffffffffffffff81111561573357615732614659565b5b61573d8254614a8b565b615748828285615684565b600060209050601f83116001811461577b5760008415615769578287015190505b61577385826156f5565b8655506157db565b601f19841661578986615440565b60005b828110156157b15784890151825560018201915060208501945060208101905061578c565b868310156157ce57848901516157ca601f8916826156d7565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061583f602683613f66565b915061584a826157e3565b604082019050919050565b6000602082019050818103600083015261586e81615832565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006158ab602083613f66565b91506158b682615875565b602082019050919050565b600060208201905081810360008301526158da8161589e565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061593d602a83613f66565b9150615948826158e1565b604082019050919050565b6000602082019050818103600083015261596c81615930565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006159a9601983613f66565b91506159b482615973565b602082019050919050565b600060208201905081810360008301526159d88161599c565b9050919050565b60006040820190506159f46000830185613f31565b615a016020830184613f31565b9392505050565b600081519050615a17816144c4565b92915050565b600060208284031215615a3357615a32613d8a565b5b6000615a4184828501615a08565b91505092915050565b6000608082019050615a5f6000830187613f31565b615a6c60208301866140b0565b615a7960408301856140b0565b615a8660608301846140b0565b95945050505050565b6000819050919050565b615aaa615aa582614620565b615a8f565b82525050565b6000615abc8284615a99565b60208201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000615af282615acb565b615afc8185615ad6565b9350615b0c818560208601613f77565b615b1581613fa1565b840191505092915050565b6000608082019050615b356000830187613f31565b615b426020830186613f31565b615b4f60408301856140b0565b8181036060830152615b618184615ae7565b905095945050505050565b600081519050615b7b81613dc0565b92915050565b600060208284031215615b9757615b96613d8a565b5b6000615ba584828501615b6c565b9150509291505056fea2646970667358221220d9008552855d2100e03026fa672258e188f36f21ff8b2fcbab1c8c45686f076f64736f6c63430008110033
Deployed Bytecode Sourcemap
77030:10184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85734:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85566:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77776:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35259:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41750:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86131:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77938:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31010:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83330:723;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86304:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13456:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;86942:269;;;;;;;;;;;;;:::i;:::-;;2887:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86483:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81563:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84802:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77580:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77395:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82200:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82294:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36652:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84061:733;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82930:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82395:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32194:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8139:103;;;;;;;;;;;;;:::i;:::-;;81276:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85127:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7491:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77637:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35435:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79159:347;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85947:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79514:1381;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83130:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77354:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86670:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82503:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77231:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81366:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77317:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82794:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81151:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77748:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77693:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82676:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42699:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77474:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80903:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85445:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8397:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77523:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85339:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85233;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85734:189;85849:4;85879:36;85903:11;85879:23;:36::i;:::-;85872:43;;85734:189;;;:::o;85566:161::-;7377:13;:11;:13::i;:::-;85677:42:::1;85696:8;85706:12;85677:18;:42::i;:::-;85566:161:::0;;:::o;77776:73::-;;;;;;;;;;;;;:::o;35259:100::-;35313:13;35346:5;35339:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35259:100;:::o;41750:218::-;41826:7;41851:16;41859:7;41851;:16::i;:::-;41846:64;;41876:34;;;;;;;;;;;;;;41846:64;41930:15;:24;41946:7;41930:24;;;;;;;;;;;:30;;;;;;;;;;;;41923:37;;41750:218;;;:::o;86131:165::-;86235:8;4408:30;4429:8;4408:20;:30::i;:::-;86256:32:::1;86270:8;86280:7;86256:13;:32::i;:::-;86131:165:::0;;;:::o;77938:24::-;;;;:::o;31010:323::-;31071:7;31299:15;:13;:15::i;:::-;31284:12;;31268:13;;:28;:46;31261:53;;31010:323;:::o;83330:723::-;78561:7;:5;:7::i;:::-;78547:21;;:10;:21;;;:52;;;;78586:13;;;;;;;;;;;78572:27;;:10;:27;;;78547:52;78539:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;83398:18:::1;83454:15;83471:10;83483:7;;83437:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83427:65;;;;;;83419:74;;83398:95;;83504:10;83530:6:::0;83539:1:::1;83530:10;;83525:521;83546:2;83542:1;:6;83525:521;;;83569:19;83604:3;:10;;;;83591;:23;;;;:::i;:::-;83569:45;;83653:1;83633:3;83637:11;83633:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;83629:132;;83676:3;83680:11;83676:16;;;;;;;;:::i;:::-;;;;;;;;;;83671:21;;83629:132;;;83734:11;83729:16;;83629:132;83804:1;83781:3;83798:1;83785:3;:10;;;;:14;;;;:::i;:::-;83781:19;;;;;;;;:::i;:::-;;;;;;;;;;:24:::0;83777:169:::1;;83854:1;83841:3;:10;;;;:14;;;;:::i;:::-;83822:3;83826:11;83822:16;;;;;;;;:::i;:::-;;;;;;;;;:33;;;;83777:169;;;83911:3;83928:1;83915:3;:10;;;;:14;;;;:::i;:::-;83911:19;;;;;;;;:::i;:::-;;;;;;;;;;83892:3;83896:11;83892:16;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;83777:169;83960:3;:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;84002:12;84015:2;84002:16;;;;;;;;:::i;:::-;;;;;;;;;;83984:12;83997:1;83984:15;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;84037:1;84029:5;:9;;;;83554:492;83550:3;;;;;:::i;:::-;;;;83525:521;;;;83387:666;;83330:723:::0;;:::o;86304:171::-;86413:4;4236:10;4228:18;;:4;:18;;;4224:83;;4263:32;4284:10;4263:20;:32::i;:::-;4224:83;86430:37:::1;86449:4;86455:2;86459:7;86430:18;:37::i;:::-;86304:171:::0;;;;:::o;13456:442::-;13553:7;13562;13582:26;13611:17;:27;13629:8;13611:27;;;;;;;;;;;13582:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13683:1;13655:30;;:7;:16;;;:30;;;13651:92;;13712:19;13702:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13651:92;13755:21;13820:17;:15;:17::i;:::-;13779:58;;13793:7;:23;;;13780:36;;:10;:36;;;;:::i;:::-;13779:58;;;;:::i;:::-;13755:82;;13858:7;:16;;;13876:13;13850:40;;;;;;13456:442;;;;;:::o;86942:269::-;7377:13;:11;:13::i;:::-;86990:23:::1;87016:21;86990:47;;87048:12;87063:4;87048:19;;87102:7;:5;:7::i;:::-;87094:21;;87137:15;87094:63;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87080:77;;;;;87176:7;87168:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;86979:232;;86942:269::o:0;2887:143::-;2987:42;2887:143;:::o;86483:179::-;86596:4;4236:10;4228:18;;:4;:18;;;4224:83;;4263:32;4284:10;4263:20;:32::i;:::-;4224:83;86613:41:::1;86636:4;86642:2;86646:7;86613:22;:41::i;:::-;86483:179:::0;;;;:::o;81563:613::-;81650:16;81684:23;81710:17;81720:6;81710:9;:17::i;:::-;81684:43;;81738:28;81783:15;81769:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81738:61;;81810:21;81865:16;81884:15;:13;:15::i;:::-;81865:34;;81846:294;81925:13;:11;:13::i;:::-;81914:8;:24;81846:294;;;82015:6;81994:27;;:17;82002:8;81994:7;:17::i;:::-;:27;;;81990:139;;82071:8;82042:11;82054:13;82042:26;;;;;;;;:::i;:::-;;;;;;;:37;;;;;82098:15;;;;;:::i;:::-;;;;81990:139;81953:10;;;;;:::i;:::-;;;;81846:294;;;;82157:11;82150:18;;;;;81563:613;;;:::o;84802:317::-;78561:7;:5;:7::i;:::-;78547:21;;:10;:21;;;:52;;;;78586:13;;;;;;;;;;;78572:27;;:10;:27;;;78547:52;78539:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;84870:20:::1;84893:1;84870:24;;84905:18;84961:15;84978:10;84990:7;;84944:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84934:65;;;;;;84926:74;;84905:95;;85011:13;85040:12;85027:10;:25;;;;:::i;:::-;85011:41;;85072:12;85085:5;85072:19;;;;;;;;:::i;:::-;;;;;;;;;;85063:6;:28;;;;85110:1;85102:5;:9;;;;84859:260;;;84802:317:::0;;:::o;77580:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77395:72::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82200:86::-;7377:13;:11;:13::i;:::-;82272:6:::1;82264:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;82200:86:::0;:::o;82294:93::-;7377:13;:11;:13::i;:::-;82371:8:::1;82360;:19;;;;82294:93:::0;:::o;36652:152::-;36724:7;36767:27;36786:7;36767:18;:27::i;:::-;36744:52;;36652:152;;;:::o;84061:733::-;78561:7;:5;:7::i;:::-;78547:21;;:10;:21;;;:52;;;;78586:13;;;;;;;;;;;78572:27;;:10;:27;;;78547:52;78539:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;84129:18:::1;84185:15;84202:10;84214:7;;84168:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84158:65;;;;;;84150:74;;84129:95;;84235:10;84261:6:::0;84270:1:::1;84261:10;;84256:531;84277:1;84273;:5;84256:531;;;84299:19;84334:4;:11;;;;84321:10;:24;;;;:::i;:::-;84299:46;;84385:1;84364:4;84369:11;84364:17;;;;;;;;:::i;:::-;;;;;;;;;;:22;84360:134;;84408:4;84413:11;84408:17;;;;;;;;:::i;:::-;;;;;;;;;;84403:22;;84360:134;;;84467:11;84462:16;;84360:134;84539:1;84514:4;84533:1;84519:4;:11;;;;:15;;;;:::i;:::-;84514:21;;;;;;;;:::i;:::-;;;;;;;;;;:26:::0;84510:176:::1;;84591:1;84577:4;:11;;;;:15;;;;:::i;:::-;84557:4;84562:11;84557:17;;;;;;;;:::i;:::-;;;;;;;;;:35;;;;84510:176;;;84649:4;84668:1;84654:4;:11;;;;:15;;;;:::i;:::-;84649:21;;;;;;;;:::i;:::-;;;;;;;;;;84629:4;84634:11;84629:17;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;84510:176;84700:4;:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;84743:12;84756:2;84743:16;;;;;;;;:::i;:::-;;;;;;;;;;84725:12;84738:1;84725:15;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;84778:1;84770:5;:9;;;;84284:503;84280:3;;;;;:::i;:::-;;;;84256:531;;;;84118:676;;84061:733:::0;;:::o;82930:192::-;78561:7;:5;:7::i;:::-;78547:21;;:10;:21;;;:52;;;;78586:13;;;;;;;;;;;78572:27;;:10;:27;;;78547:52;78539:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;83029:12:::1;:19;;;;83011:7;;:14;;:37;83003:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;83087:7;;83072:12;:22;;;;;;;:::i;:::-;;83113:1;83105:5;:9;;;;82930:192:::0;;:::o;82395:100::-;7377:13;:11;:13::i;:::-;82477:10:::1;82465:9;:22;;;;82395:100:::0;:::o;32194:233::-;32266:7;32307:1;32290:19;;:5;:19;;;32286:60;;32318:28;;;;;;;;;;;;;;32286:60;26353:13;32364:18;:25;32383:5;32364:25;;;;;;;;;;;;;;;;:55;32357:62;;32194:233;;;:::o;8139:103::-;7377:13;:11;:13::i;:::-;8204:30:::1;8231:1;8204:18;:30::i;:::-;8139:103::o:0;81276:82::-;81316:7;81342:8;;81335:15;;81276:82;:::o;85127:98::-;85170:16;85205:12;85198:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85127:98;:::o;7491:87::-;7537:7;7564:6;;;;;;;;;;;7557:13;;7491:87;:::o;77637:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35435:104::-;35491:13;35524:7;35517:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35435:104;:::o;79159:347::-;79219:6;78330:1;78316:11;:15;78294:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;78428:9;;78413:11;78397:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;78375:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;79255:16:::1;79246:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;79238:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;79338:1;79328:6;:11;;79319:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;79427:6;79416:8;;:17;;;;:::i;:::-;79403:9;:30;;79395:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;79469:29;79479:10;79491:6;79469:9;:29::i;:::-;79159:347:::0;;:::o;85947:176::-;86051:8;4408:30;4429:8;4408:20;:30::i;:::-;86072:43:::1;86096:8;86106;86072:23;:43::i;:::-;85947:176:::0;;;:::o;79514:1381::-;79709:6;78330:1;78316:11;:15;78294:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;78428:9;;78413:11;78397:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;78375:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;79735:1:::1;79728:5;:8:::0;79724:314:::1;;79761:14;79752:23;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;:55;;;;79788:19;79779:28;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;79752:55;79744:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;79724:314;;;79899:19;79890:28;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;79882:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;79993:1;79980:9;:14;79972:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;79724:314;80116:9;80106:7;:19;;;;:::i;:::-;80095:6;80068:24;80081:10;80068:12;:24::i;:::-;:33;;;;:::i;:::-;:58;;80046:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;80206:60;80214:44;80220:10;80232:9;80243:7;80252:5;80214;:44::i;:::-;80260:5;;80206:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:60::i;:::-;80198:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;80309:1;80297:9;:13;80293:369;;;80350:4;80326:28;;:10;:22;80337:10;80326:22;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;80322:238;;80412:9;80403:6;:18;;;;:::i;:::-;80391:8;;:31;;;;:::i;:::-;80378:9;:44;;80370:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;80322:238;;;80519:6;80508:8;;:17;;;;:::i;:::-;80495:9;:30;;80487:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;80322:238;80293:369;;;80625:6;80614:8;;:17;;;;:::i;:::-;80601:9;:30;;80593:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;80293:369;80686:1;80674:9;:13;:48;;;;;80713:8;;80704:6;:17;;;;:::i;:::-;80691:9;:31;80674:48;80670:180;;;80768:4;80744:28;;:10;:22;80755:10;80744:22;;;;;;;;;;;;;;;;;;;;;;;;;:28;;::::0;80735:67:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;80838:4;80813:10;:22;80824:10;80813:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;80670:180;80858:29;80868:10;80880:6;80858:9;:29::i;:::-;79514:1381:::0;;;;;;;:::o;83130:192::-;78561:7;:5;:7::i;:::-;78547:21;;:10;:21;;;:52;;;;78586:13;;;;;;;;;;;78572:27;;:10;:27;;;78547:52;78539:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;83229:12:::1;:19;;;;83211:7;;:14;;:37;83203:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;83287:7;;83272:12;:22;;;;;;;:::i;:::-;;83313:1;83305:5;:9;;;;83130:192:::0;;:::o;77354:34::-;;;;:::o;86670:245::-;86838:4;4236:10;4228:18;;:4;:18;;;4224:83;;4263:32;4284:10;4263:20;:32::i;:::-;4224:83;86860:47:::1;86883:4;86889:2;86893:7;86902:4;86860:22;:47::i;:::-;86670:245:::0;;;;;:::o;82503:165::-;7377:13;:11;:13::i;:::-;82640:20:::1;82618:19;:42;;;;82503:165:::0;:::o;77231:41::-;;;;;;;;;;;;;:::o;81366:189::-;81447:13;81504:12;81518:18;81528:7;81518:9;:18::i;:::-;81487:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81473:74;;81366:189;;;:::o;77317:30::-;;;;:::o;82794:111::-;7377:13;:11;:13::i;:::-;82887:10:::1;82871:13;;:26;;;;;;;;;;;;;;;;;;82794:111:::0;:::o;81151:117::-;81211:7;81238:22;81252:7;81238:13;:22::i;:::-;81231:29;;81151:117;;;:::o;77748:21::-;;;;:::o;77693:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82676:110::-;7377:13;:11;:13::i;:::-;82768:10:::1;82753:12;:25;;;;;;:::i;:::-;;82676:110:::0;:::o;42699:164::-;42796:4;42820:18;:25;42839:5;42820:25;;;;;;;;;;;;;;;:35;42846:8;42820:35;;;;;;;;;;;;;;;;;;;;;;;;;42813:42;;42699:164;;;;:::o;77474:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;80903:224::-;7377:13;:11;:13::i;:::-;81047:9:::1;;81037:6;81021:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;81013:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;81091:28;81101:9;81112:6;81091:9;:28::i;:::-;80903:224:::0;;:::o;85445:98::-;85488:16;85523:12;85516:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85445:98;:::o;8397:201::-;7377:13;:11;:13::i;:::-;8506:1:::1;8486:22;;:8;:22;;::::0;8478:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8562:28;8581:8;8562:18;:28::i;:::-;8397:201:::0;:::o;77523:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;85339:98::-;85382:16;85417:12;85410:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85339:98;:::o;85233:::-;85276:16;85311:12;85304:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85233:98;:::o;13186:215::-;13288:4;13327:26;13312:41;;;:11;:41;;;;:81;;;;13357:36;13381:11;13357:23;:36::i;:::-;13312:81;13305:88;;13186:215;;;:::o;7656:132::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7656:132::o;14548:332::-;14667:17;:15;:17::i;:::-;14651:33;;:12;:33;;;;14643:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;14770:1;14750:22;;:8;:22;;;14742:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14837:35;;;;;;;;14849:8;14837:35;;;;;;14859:12;14837:35;;;;;14815:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14548:332;;:::o;43121:282::-;43186:4;43242:7;43223:15;:13;:15::i;:::-;:26;;:66;;;;;43276:13;;43266:7;:23;43223:66;:153;;;;;43375:1;27129:8;43327:17;:26;43345:7;43327:26;;;;;;;;;;;;:44;:49;43223:153;43203:173;;43121:282;;;:::o;4466:419::-;4705:1;2987:42;4657:45;;;:49;4653:225;;;2987:42;4728;;;4779:4;4786:8;4728:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4723:144;;4842:8;4823:28;;;;;;;;;;;:::i;:::-;;;;;;;;4723:144;4653:225;4466:419;:::o;41183:408::-;41272:13;41288:16;41296:7;41288;:16::i;:::-;41272:32;;41344:5;41321:28;;:19;:17;:19::i;:::-;:28;;;41317:175;;41369:44;41386:5;41393:19;:17;:19::i;:::-;41369:16;:44::i;:::-;41364:128;;41441:35;;;;;;;;;;;;;;41364:128;41317:175;41537:2;41504:15;:24;41520:7;41504:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41575:7;41571:2;41555:28;;41564:5;41555:28;;;;;;;;;;;;41261:330;41183:408;;:::o;78111:101::-;78176:7;78111:101;:::o;45389:2825::-;45531:27;45561;45580:7;45561:18;:27::i;:::-;45531:57;;45646:4;45605:45;;45621:19;45605:45;;;45601:86;;45659:28;;;;;;;;;;;;;;45601:86;45701:27;45730:23;45757:35;45784:7;45757:26;:35::i;:::-;45700:92;;;;45892:68;45917:15;45934:4;45940:19;:17;:19::i;:::-;45892:24;:68::i;:::-;45887:180;;45980:43;45997:4;46003:19;:17;:19::i;:::-;45980:16;:43::i;:::-;45975:92;;46032:35;;;;;;;;;;;;;;45975:92;45887:180;46098:1;46084:16;;:2;:16;;;46080:52;;46109:23;;;;;;;;;;;;;;46080:52;46145:43;46167:4;46173:2;46177:7;46186:1;46145:21;:43::i;:::-;46281:15;46278:160;;;46421:1;46400:19;46393:30;46278:160;46818:18;:24;46837:4;46818:24;;;;;;;;;;;;;;;;46816:26;;;;;;;;;;;;46887:18;:22;46906:2;46887:22;;;;;;;;;;;;;;;;46885:24;;;;;;;;;;;47209:146;47246:2;47295:45;47310:4;47316:2;47320:19;47295:14;:45::i;:::-;27409:8;47267:73;47209:18;:146::i;:::-;47180:17;:26;47198:7;47180:26;;;;;;;;;;;:175;;;;47526:1;27409:8;47475:19;:47;:52;47471:627;;47548:19;47580:1;47570:7;:11;47548:33;;47737:1;47703:17;:30;47721:11;47703:30;;;;;;;;;;;;:35;47699:384;;47841:13;;47826:11;:28;47822:242;;48021:19;47988:17;:30;48006:11;47988:30;;;;;;;;;;;:52;;;;47822:242;47699:384;47529:569;47471:627;48145:7;48141:2;48126:27;;48135:4;48126:27;;;;;;;;;;;;48164:42;48185:4;48191:2;48195:7;48204:1;48164:20;:42::i;:::-;45520:2694;;;45389:2825;;;:::o;14180:97::-;14238:6;14264:5;14257:12;;14180:97;:::o;48310:193::-;48456:39;48473:4;48479:2;48483:7;48456:39;;;;;;;;;;;;:16;:39::i;:::-;48310:193;;;:::o;37807:1275::-;37874:7;37894:12;37909:7;37894:22;;37977:4;37958:15;:13;:15::i;:::-;:23;37954:1061;;38011:13;;38004:4;:20;38000:1015;;;38049:14;38066:17;:23;38084:4;38066:23;;;;;;;;;;;;38049:40;;38183:1;27129:8;38155:6;:24;:29;38151:845;;38820:113;38837:1;38827:6;:11;38820:113;;38880:17;:25;38898:6;;;;;;;38880:25;;;;;;;;;;;;38871:34;;38820:113;;;38966:6;38959:13;;;;;;38151:845;38026:989;38000:1015;37954:1061;39043:31;;;;;;;;;;;;;;37807:1275;;;;:::o;8758:191::-;8832:16;8851:6;;;;;;;;;;;8832:25;;8877:8;8868:6;;:17;;;;;;;;;;;;;;;;;;8932:8;8901:40;;8922:8;8901:40;;;;;;;;;;;;8821:128;8758:191;:::o;59261:112::-;59338:27;59348:2;59352:8;59338:27;;;;;;;;;;;;:9;:27::i;:::-;59261:112;;:::o;42308:234::-;42455:8;42403:18;:39;42422:19;:17;:19::i;:::-;42403:39;;;;;;;;;;;;;;;:49;42443:8;42403:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;42515:8;42479:55;;42494:19;:17;:19::i;:::-;42479:55;;;42525:8;42479:55;;;;;;:::i;:::-;;;;;;;;42308:234;;:::o;78868:255::-;79001:7;79077;79086:9;79097:7;79106:5;79066:46;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79056:57;;;;;;79043:71;;;;;;;;:::i;:::-;;;;;;;;;;;;;79033:82;;;;;;79026:89;;78868:255;;;;;;:::o;78666:194::-;78771:4;78800:52;78819:5;78826:19;;78847:4;78800:18;:52::i;:::-;78793:59;;78666:194;;;;:::o;49101:407::-;49276:31;49289:4;49295:2;49299:7;49276:12;:31::i;:::-;49340:1;49322:2;:14;;;:19;49318:183;;49361:56;49392:4;49398:2;49402:7;49411:5;49361:30;:56::i;:::-;49356:145;;49445:40;;;;;;;;;;;;;;49356:145;49318:183;49101:407;;;;:::o;65636:1745::-;65701:17;66135:4;66128;66122:11;66118:22;66227:1;66221:4;66214:15;66302:4;66299:1;66295:12;66288:19;;66384:1;66379:3;66372:14;66488:3;66727:5;66709:428;66735:1;66709:428;;;66775:1;66770:3;66766:11;66759:18;;66946:2;66940:4;66936:13;66932:2;66928:22;66923:3;66915:36;67040:2;67034:4;67030:13;67022:21;;67107:4;66709:428;67097:25;66709:428;66713:21;67176:3;67171;67167:13;67291:4;67286:3;67282:14;67275:21;;67356:6;67351:3;67344:19;65740:1634;;;65636:1745;;;:::o;32509:178::-;32570:7;26353:13;26491:2;32598:18;:25;32617:5;32598:25;;;;;;;;;;;;;;;;:50;;32597:82;32590:89;;32509:178;;;:::o;10738:157::-;10823:4;10862:25;10847:40;;;:11;:40;;;;10840:47;;10738:157;;;:::o;6042:98::-;6095:7;6122:10;6115:17;;6042:98;:::o;65429:105::-;65489:7;65516:10;65509:17;;65429:105;:::o;44284:485::-;44386:27;44415:23;44456:38;44497:15;:24;44513:7;44497:24;;;;;;;;;;;44456:65;;44674:18;44651:41;;44731:19;44725:26;44706:45;;44636:126;44284:485;;;:::o;43512:659::-;43661:11;43826:16;43819:5;43815:28;43806:37;;43986:16;43975:9;43971:32;43958:45;;44136:15;44125:9;44122:30;44114:5;44103:9;44100:20;44097:56;44087:66;;43512:659;;;;;:::o;50170:159::-;;;;;:::o;64738:311::-;64873:7;64893:16;27533:3;64919:19;:41;;64893:68;;27533:3;64987:31;64998:4;65004:2;65008:9;64987:10;:31::i;:::-;64979:40;;:62;;64972:69;;;64738:311;;;;;:::o;39630:450::-;39710:14;39878:16;39871:5;39867:28;39858:37;;40055:5;40041:11;40016:23;40012:41;40009:52;40002:5;39999:63;39989:73;;39630:450;;;;:::o;50994:158::-;;;;;:::o;58488:689::-;58619:19;58625:2;58629:8;58619:5;:19::i;:::-;58698:1;58680:2;:14;;;:19;58676:483;;58720:11;58734:13;;58720:27;;58766:13;58788:8;58782:3;:14;58766:30;;58815:233;58846:62;58885:1;58889:2;58893:7;;;;;;58902:5;58846:30;:62::i;:::-;58841:167;;58944:40;;;;;;;;;;;;;;58841:167;59043:3;59035:5;:11;58815:233;;59130:3;59113:13;;:20;59109:34;;59135:8;;;59109:34;58701:458;;58676:483;58488:689;;;:::o;68610:190::-;68735:4;68788;68759:25;68772:5;68779:4;68759:12;:25::i;:::-;:33;68752:40;;68610:190;;;;;:::o;51592:716::-;51755:4;51801:2;51776:45;;;51822:19;:17;:19::i;:::-;51843:4;51849:7;51858:5;51776:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51772:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52076:1;52059:6;:13;:18;52055:235;;52105:40;;;;;;;;;;;;;;52055:235;52248:6;52242:13;52233:6;52229:2;52225:15;52218:38;51772:529;51945:54;;;51935:64;;;:6;:64;;;;51928:71;;;51592:716;;;;;;:::o;64439:147::-;64576:6;64439:147;;;;;:::o;52770:2966::-;52843:20;52866:13;;52843:36;;52906:1;52894:8;:13;52890:44;;52916:18;;;;;;;;;;;;;;52890:44;52947:61;52977:1;52981:2;52985:12;52999:8;52947:21;:61::i;:::-;53491:1;26491:2;53461:1;:26;;53460:32;53448:8;:45;53422:18;:22;53441:2;53422:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;53770:139;53807:2;53861:33;53884:1;53888:2;53892:1;53861:14;:33::i;:::-;53828:30;53849:8;53828:20;:30::i;:::-;:66;53770:18;:139::i;:::-;53736:17;:31;53754:12;53736:31;;;;;;;;;;;:173;;;;53926:16;53957:11;53986:8;53971:12;:23;53957:37;;54507:16;54503:2;54499:25;54487:37;;54879:12;54839:8;54798:1;54736:25;54677:1;54616;54589:335;55250:1;55236:12;55232:20;55190:346;55291:3;55282:7;55279:16;55190:346;;55509:7;55499:8;55496:1;55469:25;55466:1;55463;55458:59;55344:1;55335:7;55331:15;55320:26;;55190:346;;;55194:77;55581:1;55569:8;:13;55565:45;;55591:19;;;;;;;;;;;;;;55565:45;55643:3;55627:13;:19;;;;53196:2462;;55668:60;55697:1;55701:2;55705:12;55719:8;55668:20;:60::i;:::-;52832:2904;52770:2966;;:::o;69477:296::-;69560:7;69580:20;69603:4;69580:27;;69623:9;69618:118;69642:5;:12;69638:1;:16;69618:118;;;69691:33;69701:12;69715:5;69721:1;69715:8;;;;;;;;:::i;:::-;;;;;;;;69691:9;:33::i;:::-;69676:48;;69656:3;;;;;:::i;:::-;;;;69618:118;;;;69753:12;69746:19;;;69477:296;;;;:::o;40182:324::-;40252:14;40485:1;40475:8;40472:15;40446:24;40442:46;40432:56;;40182:324;;;:::o;76517:149::-;76580:7;76611:1;76607;:5;:51;;76638:20;76653:1;76656;76638:14;:20::i;:::-;76607:51;;;76615:20;76630:1;76633;76615:14;:20::i;:::-;76607:51;76600:58;;76517:149;;;;:::o;76674:268::-;76742:13;76849:1;76843:4;76836:15;76878:1;76872:4;76865:15;76919:4;76913;76903:21;76894:30;;76674:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:118::-;2974:24;2992:5;2974:24;:::i;:::-;2969:3;2962:37;2887:118;;:::o;3011:222::-;3104:4;3142:2;3131:9;3127:18;3119:26;;3155:71;3223:1;3212:9;3208:17;3199:6;3155:71;:::i;:::-;3011:222;;;;:::o;3239:99::-;3291:6;3325:5;3319:12;3309:22;;3239:99;;;:::o;3344:169::-;3428:11;3462:6;3457:3;3450:19;3502:4;3497:3;3493:14;3478:29;;3344:169;;;;:::o;3519:246::-;3600:1;3610:113;3624:6;3621:1;3618:13;3610:113;;;3709:1;3704:3;3700:11;3694:18;3690:1;3685:3;3681:11;3674:39;3646:2;3643:1;3639:10;3634:15;;3610:113;;;3757:1;3748:6;3743:3;3739:16;3732:27;3581:184;3519:246;;;:::o;3771:102::-;3812:6;3863:2;3859:7;3854:2;3847:5;3843:14;3839:28;3829:38;;3771:102;;;:::o;3879:377::-;3967:3;3995:39;4028:5;3995:39;:::i;:::-;4050:71;4114:6;4109:3;4050:71;:::i;:::-;4043:78;;4130:65;4188:6;4183:3;4176:4;4169:5;4165:16;4130:65;:::i;:::-;4220:29;4242:6;4220:29;:::i;:::-;4215:3;4211:39;4204:46;;3971:285;3879:377;;;;:::o;4262:313::-;4375:4;4413:2;4402:9;4398:18;4390:26;;4462:9;4456:4;4452:20;4448:1;4437:9;4433:17;4426:47;4490:78;4563:4;4554:6;4490:78;:::i;:::-;4482:86;;4262:313;;;;:::o;4581:77::-;4618:7;4647:5;4636:16;;4581:77;;;:::o;4664:122::-;4737:24;4755:5;4737:24;:::i;:::-;4730:5;4727:35;4717:63;;4776:1;4773;4766:12;4717:63;4664:122;:::o;4792:139::-;4838:5;4876:6;4863:20;4854:29;;4892:33;4919:5;4892:33;:::i;:::-;4792:139;;;;:::o;4937:329::-;4996:6;5045:2;5033:9;5024:7;5020:23;5016:32;5013:119;;;5051:79;;:::i;:::-;5013:119;5171:1;5196:53;5241:7;5232:6;5221:9;5217:22;5196:53;:::i;:::-;5186:63;;5142:117;4937:329;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:118::-;5839:24;5857:5;5839:24;:::i;:::-;5834:3;5827:37;5752:118;;:::o;5876:222::-;5969:4;6007:2;5996:9;5992:18;5984:26;;6020:71;6088:1;6077:9;6073:17;6064:6;6020:71;:::i;:::-;5876:222;;;;:::o;6104:117::-;6213:1;6210;6203:12;6227:117;6336:1;6333;6326:12;6350:117;6459:1;6456;6449:12;6487:553;6545:8;6555:6;6605:3;6598:4;6590:6;6586:17;6582:27;6572:122;;6613:79;;:::i;:::-;6572:122;6726:6;6713:20;6703:30;;6756:18;6748:6;6745:30;6742:117;;;6778:79;;:::i;:::-;6742:117;6892:4;6884:6;6880:17;6868:29;;6946:3;6938:4;6930:6;6926:17;6916:8;6912:32;6909:41;6906:128;;;6953:79;;:::i;:::-;6906:128;6487:553;;;;;:::o;7046:529::-;7117:6;7125;7174:2;7162:9;7153:7;7149:23;7145:32;7142:119;;;7180:79;;:::i;:::-;7142:119;7328:1;7317:9;7313:17;7300:31;7358:18;7350:6;7347:30;7344:117;;;7380:79;;:::i;:::-;7344:117;7493:65;7550:7;7541:6;7530:9;7526:22;7493:65;:::i;:::-;7475:83;;;;7271:297;7046:529;;;;;:::o;7581:619::-;7658:6;7666;7674;7723:2;7711:9;7702:7;7698:23;7694:32;7691:119;;;7729:79;;:::i;:::-;7691:119;7849:1;7874:53;7919:7;7910:6;7899:9;7895:22;7874:53;:::i;:::-;7864:63;;7820:117;7976:2;8002:53;8047:7;8038:6;8027:9;8023:22;8002:53;:::i;:::-;7992:63;;7947:118;8104:2;8130:53;8175:7;8166:6;8155:9;8151:22;8130:53;:::i;:::-;8120:63;;8075:118;7581:619;;;;;:::o;8206:474::-;8274:6;8282;8331:2;8319:9;8310:7;8306:23;8302:32;8299:119;;;8337:79;;:::i;:::-;8299:119;8457:1;8482:53;8527:7;8518:6;8507:9;8503:22;8482:53;:::i;:::-;8472:63;;8428:117;8584:2;8610:53;8655:7;8646:6;8635:9;8631:22;8610:53;:::i;:::-;8600:63;;8555:118;8206:474;;;;;:::o;8686:332::-;8807:4;8845:2;8834:9;8830:18;8822:26;;8858:71;8926:1;8915:9;8911:17;8902:6;8858:71;:::i;:::-;8939:72;9007:2;8996:9;8992:18;8983:6;8939:72;:::i;:::-;8686:332;;;;;:::o;9024:60::-;9052:3;9073:5;9066:12;;9024:60;;;:::o;9090:142::-;9140:9;9173:53;9191:34;9200:24;9218:5;9200:24;:::i;:::-;9191:34;:::i;:::-;9173:53;:::i;:::-;9160:66;;9090:142;;;:::o;9238:126::-;9288:9;9321:37;9352:5;9321:37;:::i;:::-;9308:50;;9238:126;;;:::o;9370:157::-;9451:9;9484:37;9515:5;9484:37;:::i;:::-;9471:50;;9370:157;;;:::o;9533:193::-;9651:68;9713:5;9651:68;:::i;:::-;9646:3;9639:81;9533:193;;:::o;9732:284::-;9856:4;9894:2;9883:9;9879:18;9871:26;;9907:102;10006:1;9995:9;9991:17;9982:6;9907:102;:::i;:::-;9732:284;;;;:::o;10022:329::-;10081:6;10130:2;10118:9;10109:7;10105:23;10101:32;10098:119;;;10136:79;;:::i;:::-;10098:119;10256:1;10281:53;10326:7;10317:6;10306:9;10302:22;10281:53;:::i;:::-;10271:63;;10227:117;10022:329;;;;:::o;10357:114::-;10424:6;10458:5;10452:12;10442:22;;10357:114;;;:::o;10477:184::-;10576:11;10610:6;10605:3;10598:19;10650:4;10645:3;10641:14;10626:29;;10477:184;;;;:::o;10667:132::-;10734:4;10757:3;10749:11;;10787:4;10782:3;10778:14;10770:22;;10667:132;;;:::o;10805:108::-;10882:24;10900:5;10882:24;:::i;:::-;10877:3;10870:37;10805:108;;:::o;10919:179::-;10988:10;11009:46;11051:3;11043:6;11009:46;:::i;:::-;11087:4;11082:3;11078:14;11064:28;;10919:179;;;;:::o;11104:113::-;11174:4;11206;11201:3;11197:14;11189:22;;11104:113;;;:::o;11253:732::-;11372:3;11401:54;11449:5;11401:54;:::i;:::-;11471:86;11550:6;11545:3;11471:86;:::i;:::-;11464:93;;11581:56;11631:5;11581:56;:::i;:::-;11660:7;11691:1;11676:284;11701:6;11698:1;11695:13;11676:284;;;11777:6;11771:13;11804:63;11863:3;11848:13;11804:63;:::i;:::-;11797:70;;11890:60;11943:6;11890:60;:::i;:::-;11880:70;;11736:224;11723:1;11720;11716:9;11711:14;;11676:284;;;11680:14;11976:3;11969:10;;11377:608;;;11253:732;;;;:::o;11991:373::-;12134:4;12172:2;12161:9;12157:18;12149:26;;12221:9;12215:4;12211:20;12207:1;12196:9;12192:17;12185:47;12249:108;12352:4;12343:6;12249:108;:::i;:::-;12241:116;;11991:373;;;;:::o;12370:113::-;12457:1;12450:5;12447:12;12437:40;;12473:1;12470;12463:12;12437:40;12370:113;:::o;12489:167::-;12549:5;12587:6;12574:20;12565:29;;12603:47;12644:5;12603:47;:::i;:::-;12489:167;;;;:::o;12662:357::-;12735:6;12784:2;12772:9;12763:7;12759:23;12755:32;12752:119;;;12790:79;;:::i;:::-;12752:119;12910:1;12935:67;12994:7;12985:6;12974:9;12970:22;12935:67;:::i;:::-;12925:77;;12881:131;12662:357;;;;:::o;13042:568::-;13115:8;13125:6;13175:3;13168:4;13160:6;13156:17;13152:27;13142:122;;13183:79;;:::i;:::-;13142:122;13296:6;13283:20;13273:30;;13326:18;13318:6;13315:30;13312:117;;;13348:79;;:::i;:::-;13312:117;13462:4;13454:6;13450:17;13438:29;;13516:3;13508:4;13500:6;13496:17;13486:8;13482:32;13479:41;13476:128;;;13523:79;;:::i;:::-;13476:128;13042:568;;;;;:::o;13616:559::-;13702:6;13710;13759:2;13747:9;13738:7;13734:23;13730:32;13727:119;;;13765:79;;:::i;:::-;13727:119;13913:1;13902:9;13898:17;13885:31;13943:18;13935:6;13932:30;13929:117;;;13965:79;;:::i;:::-;13929:117;14078:80;14150:7;14141:6;14130:9;14126:22;14078:80;:::i;:::-;14060:98;;;;13856:312;13616:559;;;;;:::o;14181:116::-;14251:21;14266:5;14251:21;:::i;:::-;14244:5;14241:32;14231:60;;14287:1;14284;14277:12;14231:60;14181:116;:::o;14303:133::-;14346:5;14384:6;14371:20;14362:29;;14400:30;14424:5;14400:30;:::i;:::-;14303:133;;;;:::o;14442:468::-;14507:6;14515;14564:2;14552:9;14543:7;14539:23;14535:32;14532:119;;;14570:79;;:::i;:::-;14532:119;14690:1;14715:53;14760:7;14751:6;14740:9;14736:22;14715:53;:::i;:::-;14705:63;;14661:117;14817:2;14843:50;14885:7;14876:6;14865:9;14861:22;14843:50;:::i;:::-;14833:60;;14788:115;14442:468;;;;;:::o;14933:568::-;15006:8;15016:6;15066:3;15059:4;15051:6;15047:17;15043:27;15033:122;;15074:79;;:::i;:::-;15033:122;15187:6;15174:20;15164:30;;15217:18;15209:6;15206:30;15203:117;;;15239:79;;:::i;:::-;15203:117;15353:4;15345:6;15341:17;15329:29;;15407:3;15399:4;15391:6;15387:17;15377:8;15373:32;15370:41;15367:128;;;15414:79;;:::i;:::-;15367:128;14933:568;;;;;:::o;15507:1141::-;15629:6;15637;15645;15653;15661;15669;15718:3;15706:9;15697:7;15693:23;15689:33;15686:120;;;15725:79;;:::i;:::-;15686:120;15845:1;15870:53;15915:7;15906:6;15895:9;15891:22;15870:53;:::i;:::-;15860:63;;15816:117;15972:2;15998:53;16043:7;16034:6;16023:9;16019:22;15998:53;:::i;:::-;15988:63;;15943:118;16100:2;16126:53;16171:7;16162:6;16151:9;16147:22;16126:53;:::i;:::-;16116:63;;16071:118;16228:2;16254:53;16299:7;16290:6;16279:9;16275:22;16254:53;:::i;:::-;16244:63;;16199:118;16384:3;16373:9;16369:19;16356:33;16416:18;16408:6;16405:30;16402:117;;;16438:79;;:::i;:::-;16402:117;16551:80;16623:7;16614:6;16603:9;16599:22;16551:80;:::i;:::-;16533:98;;;;16327:314;15507:1141;;;;;;;;:::o;16654:77::-;16691:7;16720:5;16709:16;;16654:77;;;:::o;16737:118::-;16824:24;16842:5;16824:24;:::i;:::-;16819:3;16812:37;16737:118;;:::o;16861:222::-;16954:4;16992:2;16981:9;16977:18;16969:26;;17005:71;17073:1;17062:9;17058:17;17049:6;17005:71;:::i;:::-;16861:222;;;;:::o;17089:117::-;17198:1;17195;17188:12;17212:180;17260:77;17257:1;17250:88;17357:4;17354:1;17347:15;17381:4;17378:1;17371:15;17398:281;17481:27;17503:4;17481:27;:::i;:::-;17473:6;17469:40;17611:6;17599:10;17596:22;17575:18;17563:10;17560:34;17557:62;17554:88;;;17622:18;;:::i;:::-;17554:88;17662:10;17658:2;17651:22;17441:238;17398:281;;:::o;17685:129::-;17719:6;17746:20;;:::i;:::-;17736:30;;17775:33;17803:4;17795:6;17775:33;:::i;:::-;17685:129;;;:::o;17820:307::-;17881:4;17971:18;17963:6;17960:30;17957:56;;;17993:18;;:::i;:::-;17957:56;18031:29;18053:6;18031:29;:::i;:::-;18023:37;;18115:4;18109;18105:15;18097:23;;17820:307;;;:::o;18133:146::-;18230:6;18225:3;18220;18207:30;18271:1;18262:6;18257:3;18253:16;18246:27;18133:146;;;:::o;18285:423::-;18362:5;18387:65;18403:48;18444:6;18403:48;:::i;:::-;18387:65;:::i;:::-;18378:74;;18475:6;18468:5;18461:21;18513:4;18506:5;18502:16;18551:3;18542:6;18537:3;18533:16;18530:25;18527:112;;;18558:79;;:::i;:::-;18527:112;18648:54;18695:6;18690:3;18685;18648:54;:::i;:::-;18368:340;18285:423;;;;;:::o;18727:338::-;18782:5;18831:3;18824:4;18816:6;18812:17;18808:27;18798:122;;18839:79;;:::i;:::-;18798:122;18956:6;18943:20;18981:78;19055:3;19047:6;19040:4;19032:6;19028:17;18981:78;:::i;:::-;18972:87;;18788:277;18727:338;;;;:::o;19071:943::-;19166:6;19174;19182;19190;19239:3;19227:9;19218:7;19214:23;19210:33;19207:120;;;19246:79;;:::i;:::-;19207:120;19366:1;19391:53;19436:7;19427:6;19416:9;19412:22;19391:53;:::i;:::-;19381:63;;19337:117;19493:2;19519:53;19564:7;19555:6;19544:9;19540:22;19519:53;:::i;:::-;19509:63;;19464:118;19621:2;19647:53;19692:7;19683:6;19672:9;19668:22;19647:53;:::i;:::-;19637:63;;19592:118;19777:2;19766:9;19762:18;19749:32;19808:18;19800:6;19797:30;19794:117;;;19830:79;;:::i;:::-;19794:117;19935:62;19989:7;19980:6;19969:9;19965:22;19935:62;:::i;:::-;19925:72;;19720:287;19071:943;;;;;;;:::o;20020:122::-;20093:24;20111:5;20093:24;:::i;:::-;20086:5;20083:35;20073:63;;20132:1;20129;20122:12;20073:63;20020:122;:::o;20148:139::-;20194:5;20232:6;20219:20;20210:29;;20248:33;20275:5;20248:33;:::i;:::-;20148:139;;;;:::o;20293:329::-;20352:6;20401:2;20389:9;20380:7;20376:23;20372:32;20369:119;;;20407:79;;:::i;:::-;20369:119;20527:1;20552:53;20597:7;20588:6;20577:9;20573:22;20552:53;:::i;:::-;20542:63;;20498:117;20293:329;;;;:::o;20628:180::-;20676:77;20673:1;20666:88;20773:4;20770:1;20763:15;20797:4;20794:1;20787:15;20814:119;20901:1;20894:5;20891:12;20881:46;;20907:18;;:::i;:::-;20881:46;20814:119;:::o;20939:139::-;20990:7;21019:5;21008:16;;21025:47;21066:5;21025:47;:::i;:::-;20939:139;;;:::o;21084:::-;21146:9;21179:38;21211:5;21179:38;:::i;:::-;21166:51;;21084:139;;;:::o;21229:155::-;21328:49;21371:5;21328:49;:::i;:::-;21323:3;21316:62;21229:155;;:::o;21390:246::-;21495:4;21533:2;21522:9;21518:18;21510:26;;21546:83;21626:1;21615:9;21611:17;21602:6;21546:83;:::i;:::-;21390:246;;;;:::o;21642:308::-;21704:4;21794:18;21786:6;21783:30;21780:56;;;21816:18;;:::i;:::-;21780:56;21854:29;21876:6;21854:29;:::i;:::-;21846:37;;21938:4;21932;21928:15;21920:23;;21642:308;;;:::o;21956:425::-;22034:5;22059:66;22075:49;22117:6;22075:49;:::i;:::-;22059:66;:::i;:::-;22050:75;;22148:6;22141:5;22134:21;22186:4;22179:5;22175:16;22224:3;22215:6;22210:3;22206:16;22203:25;22200:112;;;22231:79;;:::i;:::-;22200:112;22321:54;22368:6;22363:3;22358;22321:54;:::i;:::-;22040:341;21956:425;;;;;:::o;22401:340::-;22457:5;22506:3;22499:4;22491:6;22487:17;22483:27;22473:122;;22514:79;;:::i;:::-;22473:122;22631:6;22618:20;22656:79;22731:3;22723:6;22716:4;22708:6;22704:17;22656:79;:::i;:::-;22647:88;;22463:278;22401:340;;;;:::o;22747:509::-;22816:6;22865:2;22853:9;22844:7;22840:23;22836:32;22833:119;;;22871:79;;:::i;:::-;22833:119;23019:1;23008:9;23004:17;22991:31;23049:18;23041:6;23038:30;23035:117;;;23071:79;;:::i;:::-;23035:117;23176:63;23231:7;23222:6;23211:9;23207:22;23176:63;:::i;:::-;23166:73;;22962:287;22747:509;;;;:::o;23262:474::-;23330:6;23338;23387:2;23375:9;23366:7;23362:23;23358:32;23355:119;;;23393:79;;:::i;:::-;23355:119;23513:1;23538:53;23583:7;23574:6;23563:9;23559:22;23538:53;:::i;:::-;23528:63;;23484:117;23640:2;23666:53;23711:7;23702:6;23691:9;23687:22;23666:53;:::i;:::-;23656:63;;23611:118;23262:474;;;;;:::o;23742:::-;23810:6;23818;23867:2;23855:9;23846:7;23842:23;23838:32;23835:119;;;23873:79;;:::i;:::-;23835:119;23993:1;24018:53;24063:7;24054:6;24043:9;24039:22;24018:53;:::i;:::-;24008:63;;23964:117;24120:2;24146:53;24191:7;24182:6;24171:9;24167:22;24146:53;:::i;:::-;24136:63;;24091:118;23742:474;;;;;:::o;24222:180::-;24270:77;24267:1;24260:88;24367:4;24364:1;24357:15;24391:4;24388:1;24381:15;24408:320;24452:6;24489:1;24483:4;24479:12;24469:22;;24536:1;24530:4;24526:12;24557:18;24547:81;;24613:4;24605:6;24601:17;24591:27;;24547:81;24675:2;24667:6;24664:14;24644:18;24641:38;24638:84;;24694:18;;:::i;:::-;24638:84;24459:269;24408:320;;;:::o;24734:164::-;24874:16;24870:1;24862:6;24858:14;24851:40;24734:164;:::o;24904:366::-;25046:3;25067:67;25131:2;25126:3;25067:67;:::i;:::-;25060:74;;25143:93;25232:3;25143:93;:::i;:::-;25261:2;25256:3;25252:12;25245:19;;24904:366;;;:::o;25276:419::-;25442:4;25480:2;25469:9;25465:18;25457:26;;25529:9;25523:4;25519:20;25515:1;25504:9;25500:17;25493:47;25557:131;25683:4;25557:131;:::i;:::-;25549:139;;25276:419;;;:::o;25701:79::-;25740:7;25769:5;25758:16;;25701:79;;;:::o;25786:157::-;25891:45;25911:24;25929:5;25911:24;:::i;:::-;25891:45;:::i;:::-;25886:3;25879:58;25786:157;;:::o;25949:94::-;25982:8;26030:5;26026:2;26022:14;26001:35;;25949:94;;;:::o;26049:::-;26088:7;26117:20;26131:5;26117:20;:::i;:::-;26106:31;;26049:94;;;:::o;26149:100::-;26188:7;26217:26;26237:5;26217:26;:::i;:::-;26206:37;;26149:100;;;:::o;26255:157::-;26360:45;26380:24;26398:5;26380:24;:::i;:::-;26360:45;:::i;:::-;26355:3;26348:58;26255:157;;:::o;26418:148::-;26520:11;26557:3;26542:18;;26418:148;;;;:::o;26596:330::-;26712:3;26733:89;26815:6;26810:3;26733:89;:::i;:::-;26726:96;;26832:56;26881:6;26876:3;26869:5;26832:56;:::i;:::-;26913:6;26908:3;26904:16;26897:23;;26596:330;;;;;:::o;26932:577::-;27130:3;27145:75;27216:3;27207:6;27145:75;:::i;:::-;27245:2;27240:3;27236:12;27229:19;;27258:75;27329:3;27320:6;27258:75;:::i;:::-;27358:2;27353:3;27349:12;27342:19;;27378:105;27479:3;27470:6;27462;27378:105;:::i;:::-;27371:112;;27500:3;27493:10;;26932:577;;;;;;;:::o;27515:180::-;27563:77;27560:1;27553:88;27660:4;27657:1;27650:15;27684:4;27681:1;27674:15;27701:176;27733:1;27750:20;27768:1;27750:20;:::i;:::-;27745:25;;27784:20;27802:1;27784:20;:::i;:::-;27779:25;;27823:1;27813:35;;27828:18;;:::i;:::-;27813:35;27869:1;27866;27862:9;27857:14;;27701:176;;;;:::o;27883:180::-;27931:77;27928:1;27921:88;28028:4;28025:1;28018:15;28052:4;28049:1;28042:15;28069:180;28117:77;28114:1;28107:88;28214:4;28211:1;28204:15;28238:4;28235:1;28228:15;28255:194;28295:4;28315:20;28333:1;28315:20;:::i;:::-;28310:25;;28349:20;28367:1;28349:20;:::i;:::-;28344:25;;28393:1;28390;28386:9;28378:17;;28417:1;28411:4;28408:11;28405:37;;;28422:18;;:::i;:::-;28405:37;28255:194;;;;:::o;28455:180::-;28503:77;28500:1;28493:88;28600:4;28597:1;28590:15;28624:4;28621:1;28614:15;28641:233;28680:3;28703:24;28721:5;28703:24;:::i;:::-;28694:33;;28749:66;28742:5;28739:77;28736:103;;28819:18;;:::i;:::-;28736:103;28866:1;28859:5;28855:13;28848:20;;28641:233;;;:::o;28880:410::-;28920:7;28943:20;28961:1;28943:20;:::i;:::-;28938:25;;28977:20;28995:1;28977:20;:::i;:::-;28972:25;;29032:1;29029;29025:9;29054:30;29072:11;29054:30;:::i;:::-;29043:41;;29233:1;29224:7;29220:15;29217:1;29214:22;29194:1;29187:9;29167:83;29144:139;;29263:18;;:::i;:::-;29144:139;28928:362;28880:410;;;;:::o;29296:185::-;29336:1;29353:20;29371:1;29353:20;:::i;:::-;29348:25;;29387:20;29405:1;29387:20;:::i;:::-;29382:25;;29426:1;29416:35;;29431:18;;:::i;:::-;29416:35;29473:1;29470;29466:9;29461:14;;29296:185;;;;:::o;29487:147::-;29588:11;29625:3;29610:18;;29487:147;;;;:::o;29640:114::-;;:::o;29760:398::-;29919:3;29940:83;30021:1;30016:3;29940:83;:::i;:::-;29933:90;;30032:93;30121:3;30032:93;:::i;:::-;30150:1;30145:3;30141:11;30134:18;;29760:398;;;:::o;30164:379::-;30348:3;30370:147;30513:3;30370:147;:::i;:::-;30363:154;;30534:3;30527:10;;30164:379;;;:::o;30549:165::-;30689:17;30685:1;30677:6;30673:14;30666:41;30549:165;:::o;30720:366::-;30862:3;30883:67;30947:2;30942:3;30883:67;:::i;:::-;30876:74;;30959:93;31048:3;30959:93;:::i;:::-;31077:2;31072:3;31068:12;31061:19;;30720:366;;;:::o;31092:419::-;31258:4;31296:2;31285:9;31281:18;31273:26;;31345:9;31339:4;31335:20;31331:1;31320:9;31316:17;31309:47;31373:131;31499:4;31373:131;:::i;:::-;31365:139;;31092:419;;;:::o;31517:158::-;31657:10;31653:1;31645:6;31641:14;31634:34;31517:158;:::o;31681:365::-;31823:3;31844:66;31908:1;31903:3;31844:66;:::i;:::-;31837:73;;31919:93;32008:3;31919:93;:::i;:::-;32037:2;32032:3;32028:12;32021:19;;31681:365;;;:::o;32052:419::-;32218:4;32256:2;32245:9;32241:18;32233:26;;32305:9;32299:4;32295:20;32291:1;32280:9;32276:17;32269:47;32333:131;32459:4;32333:131;:::i;:::-;32325:139;;32052:419;;;:::o;32477:169::-;32617:21;32613:1;32605:6;32601:14;32594:45;32477:169;:::o;32652:366::-;32794:3;32815:67;32879:2;32874:3;32815:67;:::i;:::-;32808:74;;32891:93;32980:3;32891:93;:::i;:::-;33009:2;33004:3;33000:12;32993:19;;32652:366;;;:::o;33024:419::-;33190:4;33228:2;33217:9;33213:18;33205:26;;33277:9;33271:4;33267:20;33263:1;33252:9;33248:17;33241:47;33305:131;33431:4;33305:131;:::i;:::-;33297:139;;33024:419;;;:::o;33449:191::-;33489:3;33508:20;33526:1;33508:20;:::i;:::-;33503:25;;33542:20;33560:1;33542:20;:::i;:::-;33537:25;;33585:1;33582;33578:9;33571:16;;33606:3;33603:1;33600:10;33597:36;;;33613:18;;:::i;:::-;33597:36;33449:191;;;;:::o;33646:169::-;33786:21;33782:1;33774:6;33770:14;33763:45;33646:169;:::o;33821:366::-;33963:3;33984:67;34048:2;34043:3;33984:67;:::i;:::-;33977:74;;34060:93;34149:3;34060:93;:::i;:::-;34178:2;34173:3;34169:12;34162:19;;33821:366;;;:::o;34193:419::-;34359:4;34397:2;34386:9;34382:18;34374:26;;34446:9;34440:4;34436:20;34432:1;34421:9;34417:17;34410:47;34474:131;34600:4;34474:131;:::i;:::-;34466:139;;34193:419;;;:::o;34618:182::-;34758:34;34754:1;34746:6;34742:14;34735:58;34618:182;:::o;34806:366::-;34948:3;34969:67;35033:2;35028:3;34969:67;:::i;:::-;34962:74;;35045:93;35134:3;35045:93;:::i;:::-;35163:2;35158:3;35154:12;35147:19;;34806:366;;;:::o;35178:419::-;35344:4;35382:2;35371:9;35367:18;35359:26;;35431:9;35425:4;35421:20;35417:1;35406:9;35402:17;35395:47;35459:131;35585:4;35459:131;:::i;:::-;35451:139;;35178:419;;;:::o;35603:227::-;35743:34;35739:1;35731:6;35727:14;35720:58;35812:10;35807:2;35799:6;35795:15;35788:35;35603:227;:::o;35836:366::-;35978:3;35999:67;36063:2;36058:3;35999:67;:::i;:::-;35992:74;;36075:93;36164:3;36075:93;:::i;:::-;36193:2;36188:3;36184:12;36177:19;;35836:366;;;:::o;36208:419::-;36374:4;36412:2;36401:9;36397:18;36389:26;;36461:9;36455:4;36451:20;36447:1;36436:9;36432:17;36425:47;36489:131;36615:4;36489:131;:::i;:::-;36481:139;;36208:419;;;:::o;36633:168::-;36773:20;36769:1;36761:6;36757:14;36750:44;36633:168;:::o;36807:366::-;36949:3;36970:67;37034:2;37029:3;36970:67;:::i;:::-;36963:74;;37046:93;37135:3;37046:93;:::i;:::-;37164:2;37159:3;37155:12;37148:19;;36807:366;;;:::o;37179:419::-;37345:4;37383:2;37372:9;37368:18;37360:26;;37432:9;37426:4;37422:20;37418:1;37407:9;37403:17;37396:47;37460:131;37586:4;37460:131;:::i;:::-;37452:139;;37179:419;;;:::o;37604:231::-;37744:34;37740:1;37732:6;37728:14;37721:58;37813:14;37808:2;37800:6;37796:15;37789:39;37604:231;:::o;37841:366::-;37983:3;38004:67;38068:2;38063:3;38004:67;:::i;:::-;37997:74;;38080:93;38169:3;38080:93;:::i;:::-;38198:2;38193:3;38189:12;38182:19;;37841:366;;;:::o;38213:419::-;38379:4;38417:2;38406:9;38402:18;38394:26;;38466:9;38460:4;38456:20;38452:1;38441:9;38437:17;38430:47;38494:131;38620:4;38494:131;:::i;:::-;38486:139;;38213:419;;;:::o;38638:228::-;38778:34;38774:1;38766:6;38762:14;38755:58;38847:11;38842:2;38834:6;38830:15;38823:36;38638:228;:::o;38872:366::-;39014:3;39035:67;39099:2;39094:3;39035:67;:::i;:::-;39028:74;;39111:93;39200:3;39111:93;:::i;:::-;39229:2;39224:3;39220:12;39213:19;;38872:366;;;:::o;39244:419::-;39410:4;39448:2;39437:9;39433:18;39425:26;;39497:9;39491:4;39487:20;39483:1;39472:9;39468:17;39461:47;39525:131;39651:4;39525:131;:::i;:::-;39517:139;;39244:419;;;:::o;39669:181::-;39809:33;39805:1;39797:6;39793:14;39786:57;39669:181;:::o;39856:366::-;39998:3;40019:67;40083:2;40078:3;40019:67;:::i;:::-;40012:74;;40095:93;40184:3;40095:93;:::i;:::-;40213:2;40208:3;40204:12;40197:19;;39856:366;;;:::o;40228:419::-;40394:4;40432:2;40421:9;40417:18;40409:26;;40481:9;40475:4;40471:20;40467:1;40456:9;40452:17;40445:47;40509:131;40635:4;40509:131;:::i;:::-;40501:139;;40228:419;;;:::o;40653:181::-;40793:33;40789:1;40781:6;40777:14;40770:57;40653:181;:::o;40840:366::-;40982:3;41003:67;41067:2;41062:3;41003:67;:::i;:::-;40996:74;;41079:93;41168:3;41079:93;:::i;:::-;41197:2;41192:3;41188:12;41181:19;;40840:366;;;:::o;41212:419::-;41378:4;41416:2;41405:9;41401:18;41393:26;;41465:9;41459:4;41455:20;41451:1;41440:9;41436:17;41429:47;41493:131;41619:4;41493:131;:::i;:::-;41485:139;;41212:419;;;:::o;41637:163::-;41777:15;41773:1;41765:6;41761:14;41754:39;41637:163;:::o;41806:366::-;41948:3;41969:67;42033:2;42028:3;41969:67;:::i;:::-;41962:74;;42045:93;42134:3;42045:93;:::i;:::-;42163:2;42158:3;42154:12;42147:19;;41806:366;;;:::o;42178:419::-;42344:4;42382:2;42371:9;42367:18;42359:26;;42431:9;42425:4;42421:20;42417:1;42406:9;42402:17;42395:47;42459:131;42585:4;42459:131;:::i;:::-;42451:139;;42178:419;;;:::o;42603:175::-;42743:27;42739:1;42731:6;42727:14;42720:51;42603:175;:::o;42784:366::-;42926:3;42947:67;43011:2;43006:3;42947:67;:::i;:::-;42940:74;;43023:93;43112:3;43023:93;:::i;:::-;43141:2;43136:3;43132:12;43125:19;;42784:366;;;:::o;43156:419::-;43322:4;43360:2;43349:9;43345:18;43337:26;;43409:9;43403:4;43399:20;43395:1;43384:9;43380:17;43373:47;43437:131;43563:4;43437:131;:::i;:::-;43429:139;;43156:419;;;:::o;43581:141::-;43630:4;43653:3;43645:11;;43676:3;43673:1;43666:14;43710:4;43707:1;43697:18;43689:26;;43581:141;;;:::o;43752:874::-;43855:3;43892:5;43886:12;43921:36;43947:9;43921:36;:::i;:::-;43973:89;44055:6;44050:3;43973:89;:::i;:::-;43966:96;;44093:1;44082:9;44078:17;44109:1;44104:166;;;;44284:1;44279:341;;;;44071:549;;44104:166;44188:4;44184:9;44173;44169:25;44164:3;44157:38;44250:6;44243:14;44236:22;44228:6;44224:35;44219:3;44215:45;44208:52;;44104:166;;44279:341;44346:38;44378:5;44346:38;:::i;:::-;44406:1;44420:154;44434:6;44431:1;44428:13;44420:154;;;44508:7;44502:14;44498:1;44493:3;44489:11;44482:35;44558:1;44549:7;44545:15;44534:26;;44456:4;44453:1;44449:12;44444:17;;44420:154;;;44603:6;44598:3;44594:16;44587:23;;44286:334;;44071:549;;43859:767;;43752:874;;;;:::o;44632:390::-;44738:3;44766:39;44799:5;44766:39;:::i;:::-;44821:89;44903:6;44898:3;44821:89;:::i;:::-;44814:96;;44919:65;44977:6;44972:3;44965:4;44958:5;44954:16;44919:65;:::i;:::-;45009:6;45004:3;45000:16;44993:23;;44742:280;44632:390;;;;:::o;45028:155::-;45168:7;45164:1;45156:6;45152:14;45145:31;45028:155;:::o;45189:400::-;45349:3;45370:84;45452:1;45447:3;45370:84;:::i;:::-;45363:91;;45463:93;45552:3;45463:93;:::i;:::-;45581:1;45576:3;45572:11;45565:18;;45189:400;;;:::o;45595:695::-;45873:3;45895:92;45983:3;45974:6;45895:92;:::i;:::-;45888:99;;46004:95;46095:3;46086:6;46004:95;:::i;:::-;45997:102;;46116:148;46260:3;46116:148;:::i;:::-;46109:155;;46281:3;46274:10;;45595:695;;;;;:::o;46296:93::-;46333:6;46380:2;46375;46368:5;46364:14;46360:23;46350:33;;46296:93;;;:::o;46395:107::-;46439:8;46489:5;46483:4;46479:16;46458:37;;46395:107;;;;:::o;46508:393::-;46577:6;46627:1;46615:10;46611:18;46650:97;46680:66;46669:9;46650:97;:::i;:::-;46768:39;46798:8;46787:9;46768:39;:::i;:::-;46756:51;;46840:4;46836:9;46829:5;46825:21;46816:30;;46889:4;46879:8;46875:19;46868:5;46865:30;46855:40;;46584:317;;46508:393;;;;;:::o;46907:142::-;46957:9;46990:53;47008:34;47017:24;47035:5;47017:24;:::i;:::-;47008:34;:::i;:::-;46990:53;:::i;:::-;46977:66;;46907:142;;;:::o;47055:75::-;47098:3;47119:5;47112:12;;47055:75;;;:::o;47136:269::-;47246:39;47277:7;47246:39;:::i;:::-;47307:91;47356:41;47380:16;47356:41;:::i;:::-;47348:6;47341:4;47335:11;47307:91;:::i;:::-;47301:4;47294:105;47212:193;47136:269;;;:::o;47411:73::-;47456:3;47411:73;:::o;47490:189::-;47567:32;;:::i;:::-;47608:65;47666:6;47658;47652:4;47608:65;:::i;:::-;47543:136;47490:189;;:::o;47685:186::-;47745:120;47762:3;47755:5;47752:14;47745:120;;;47816:39;47853:1;47846:5;47816:39;:::i;:::-;47789:1;47782:5;47778:13;47769:22;;47745:120;;;47685:186;;:::o;47877:543::-;47978:2;47973:3;47970:11;47967:446;;;48012:38;48044:5;48012:38;:::i;:::-;48096:29;48114:10;48096:29;:::i;:::-;48086:8;48082:44;48279:2;48267:10;48264:18;48261:49;;;48300:8;48285:23;;48261:49;48323:80;48379:22;48397:3;48379:22;:::i;:::-;48369:8;48365:37;48352:11;48323:80;:::i;:::-;47982:431;;47967:446;47877:543;;;:::o;48426:117::-;48480:8;48530:5;48524:4;48520:16;48499:37;;48426:117;;;;:::o;48549:169::-;48593:6;48626:51;48674:1;48670:6;48662:5;48659:1;48655:13;48626:51;:::i;:::-;48622:56;48707:4;48701;48697:15;48687:25;;48600:118;48549:169;;;;:::o;48723:295::-;48799:4;48945:29;48970:3;48964:4;48945:29;:::i;:::-;48937:37;;49007:3;49004:1;49000:11;48994:4;48991:21;48983:29;;48723:295;;;;:::o;49023:1395::-;49140:37;49173:3;49140:37;:::i;:::-;49242:18;49234:6;49231:30;49228:56;;;49264:18;;:::i;:::-;49228:56;49308:38;49340:4;49334:11;49308:38;:::i;:::-;49393:67;49453:6;49445;49439:4;49393:67;:::i;:::-;49487:1;49511:4;49498:17;;49543:2;49535:6;49532:14;49560:1;49555:618;;;;50217:1;50234:6;50231:77;;;50283:9;50278:3;50274:19;50268:26;50259:35;;50231:77;50334:67;50394:6;50387:5;50334:67;:::i;:::-;50328:4;50321:81;50190:222;49525:887;;49555:618;49607:4;49603:9;49595:6;49591:22;49641:37;49673:4;49641:37;:::i;:::-;49700:1;49714:208;49728:7;49725:1;49722:14;49714:208;;;49807:9;49802:3;49798:19;49792:26;49784:6;49777:42;49858:1;49850:6;49846:14;49836:24;;49905:2;49894:9;49890:18;49877:31;;49751:4;49748:1;49744:12;49739:17;;49714:208;;;49950:6;49941:7;49938:19;49935:179;;;50008:9;50003:3;49999:19;49993:26;50051:48;50093:4;50085:6;50081:17;50070:9;50051:48;:::i;:::-;50043:6;50036:64;49958:156;49935:179;50160:1;50156;50148:6;50144:14;50140:22;50134:4;50127:36;49562:611;;;49525:887;;49115:1303;;;49023:1395;;:::o;50424:225::-;50564:34;50560:1;50552:6;50548:14;50541:58;50633:8;50628:2;50620:6;50616:15;50609:33;50424:225;:::o;50655:366::-;50797:3;50818:67;50882:2;50877:3;50818:67;:::i;:::-;50811:74;;50894:93;50983:3;50894:93;:::i;:::-;51012:2;51007:3;51003:12;50996:19;;50655:366;;;:::o;51027:419::-;51193:4;51231:2;51220:9;51216:18;51208:26;;51280:9;51274:4;51270:20;51266:1;51255:9;51251:17;51244:47;51308:131;51434:4;51308:131;:::i;:::-;51300:139;;51027:419;;;:::o;51452:182::-;51592:34;51588:1;51580:6;51576:14;51569:58;51452:182;:::o;51640:366::-;51782:3;51803:67;51867:2;51862:3;51803:67;:::i;:::-;51796:74;;51879:93;51968:3;51879:93;:::i;:::-;51997:2;51992:3;51988:12;51981:19;;51640:366;;;:::o;52012:419::-;52178:4;52216:2;52205:9;52201:18;52193:26;;52265:9;52259:4;52255:20;52251:1;52240:9;52236:17;52229:47;52293:131;52419:4;52293:131;:::i;:::-;52285:139;;52012:419;;;:::o;52437:229::-;52577:34;52573:1;52565:6;52561:14;52554:58;52646:12;52641:2;52633:6;52629:15;52622:37;52437:229;:::o;52672:366::-;52814:3;52835:67;52899:2;52894:3;52835:67;:::i;:::-;52828:74;;52911:93;53000:3;52911:93;:::i;:::-;53029:2;53024:3;53020:12;53013:19;;52672:366;;;:::o;53044:419::-;53210:4;53248:2;53237:9;53233:18;53225:26;;53297:9;53291:4;53287:20;53283:1;53272:9;53268:17;53261:47;53325:131;53451:4;53325:131;:::i;:::-;53317:139;;53044:419;;;:::o;53469:175::-;53609:27;53605:1;53597:6;53593:14;53586:51;53469:175;:::o;53650:366::-;53792:3;53813:67;53877:2;53872:3;53813:67;:::i;:::-;53806:74;;53889:93;53978:3;53889:93;:::i;:::-;54007:2;54002:3;53998:12;53991:19;;53650:366;;;:::o;54022:419::-;54188:4;54226:2;54215:9;54211:18;54203:26;;54275:9;54269:4;54265:20;54261:1;54250:9;54246:17;54239:47;54303:131;54429:4;54303:131;:::i;:::-;54295:139;;54022:419;;;:::o;54447:332::-;54568:4;54606:2;54595:9;54591:18;54583:26;;54619:71;54687:1;54676:9;54672:17;54663:6;54619:71;:::i;:::-;54700:72;54768:2;54757:9;54753:18;54744:6;54700:72;:::i;:::-;54447:332;;;;;:::o;54785:137::-;54839:5;54870:6;54864:13;54855:22;;54886:30;54910:5;54886:30;:::i;:::-;54785:137;;;;:::o;54928:345::-;54995:6;55044:2;55032:9;55023:7;55019:23;55015:32;55012:119;;;55050:79;;:::i;:::-;55012:119;55170:1;55195:61;55248:7;55239:6;55228:9;55224:22;55195:61;:::i;:::-;55185:71;;55141:125;54928:345;;;;:::o;55279:553::-;55456:4;55494:3;55483:9;55479:19;55471:27;;55508:71;55576:1;55565:9;55561:17;55552:6;55508:71;:::i;:::-;55589:72;55657:2;55646:9;55642:18;55633:6;55589:72;:::i;:::-;55671;55739:2;55728:9;55724:18;55715:6;55671:72;:::i;:::-;55753;55821:2;55810:9;55806:18;55797:6;55753:72;:::i;:::-;55279:553;;;;;;;:::o;55838:79::-;55877:7;55906:5;55895:16;;55838:79;;;:::o;55923:157::-;56028:45;56048:24;56066:5;56048:24;:::i;:::-;56028:45;:::i;:::-;56023:3;56016:58;55923:157;;:::o;56086:256::-;56198:3;56213:75;56284:3;56275:6;56213:75;:::i;:::-;56313:2;56308:3;56304:12;56297:19;;56333:3;56326:10;;56086:256;;;;:::o;56348:98::-;56399:6;56433:5;56427:12;56417:22;;56348:98;;;:::o;56452:168::-;56535:11;56569:6;56564:3;56557:19;56609:4;56604:3;56600:14;56585:29;;56452:168;;;;:::o;56626:373::-;56712:3;56740:38;56772:5;56740:38;:::i;:::-;56794:70;56857:6;56852:3;56794:70;:::i;:::-;56787:77;;56873:65;56931:6;56926:3;56919:4;56912:5;56908:16;56873:65;:::i;:::-;56963:29;56985:6;56963:29;:::i;:::-;56958:3;56954:39;56947:46;;56716:283;56626:373;;;;:::o;57005:640::-;57200:4;57238:3;57227:9;57223:19;57215:27;;57252:71;57320:1;57309:9;57305:17;57296:6;57252:71;:::i;:::-;57333:72;57401:2;57390:9;57386:18;57377:6;57333:72;:::i;:::-;57415;57483:2;57472:9;57468:18;57459:6;57415:72;:::i;:::-;57534:9;57528:4;57524:20;57519:2;57508:9;57504:18;57497:48;57562:76;57633:4;57624:6;57562:76;:::i;:::-;57554:84;;57005:640;;;;;;;:::o;57651:141::-;57707:5;57738:6;57732:13;57723:22;;57754:32;57780:5;57754:32;:::i;:::-;57651:141;;;;:::o;57798:349::-;57867:6;57916:2;57904:9;57895:7;57891:23;57887:32;57884:119;;;57922:79;;:::i;:::-;57884:119;58042:1;58067:63;58122:7;58113:6;58102:9;58098:22;58067:63;:::i;:::-;58057:73;;58013:127;57798:349;;;;:::o
Swarm Source
ipfs://d9008552855d2100e03026fa672258e188f36f21ff8b2fcbab1c8c45686f076f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | 100.00% | $0.372493 | 0.03 | $0.011175 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.