ERC-721
Overview
Max Total Supply
10,000 CANG
Holders
2,408
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
15 CANGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Cangster
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // 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/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @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 ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } import "./DefaultOperatorFilterer.sol"; pragma solidity >=0.7.0 <0.9.0; contract Cangster is ERC721, Ownable, DefaultOperatorFilterer { using Strings for uint256; using Counters for Counters.Counter; using SafeMath for uint256; mapping (address => bool) public whitelistForCangster; mapping (address => uint256) public mintedForCangster; Counters.Counter private supply; string public uriPrefix = ""; string public uriSuffix = ".json"; uint256 public costForCangster = 0 ether; uint256 public maxSupply = 10000; uint256 public maxMintAmountPerTx = 3; uint256 public maxMintAmountForCangsterPerEach = 3; uint256 public mintCountForCangster = 0; uint256 public maxMintCountForCangster = 10000; bool public paused = true; bool public pausedForCangster = true; bool public pausedForCangsterPublicMinting = true; address public managerAccount; constructor() ERC721("Cangster", "CANG") { setUriPrefix("ipfs://QmXuKXfM61TvBLhhkRTZSVsTPwSSxZUSymNSsbGgexM7md/"); managerAccount = 0x33b524578dAcED147215e94A73479DeFB7d5834a; } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!"); require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!"); _; } function totalSupply() public view returns (uint256) { return supply.current(); } function mintForCangsterWL(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(!paused, "The contract is paused!"); require(!pausedForCangster, "Minting for Cangster is paused!"); require(msg.value >= costForCangster * _mintAmount, "Insufficient funds!"); require(whitelistForCangster[msg.sender], "This account does not exist in whitelist"); //_mintLoop(msg.sender, _mintAmount); for (uint256 i = 0; i < _mintAmount; i++) { require(mintCountForCangster < maxMintCountForCangster); require(mintedForCangster[msg.sender] < maxMintAmountForCangsterPerEach, "Already minted!"); supply.increment(); _safeMint(msg.sender, totalSupply()); mintCountForCangster.add(1); mintedForCangster[msg.sender] = mintedForCangster[msg.sender].add(1); } } function mintForCangster(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(!paused, "The contract is paused!"); require(!pausedForCangster, "Minting for Cangster is paused!"); require(!pausedForCangsterPublicMinting, "Minting for Cangster (Public Minitng) is paused!"); require(msg.value >= costForCangster * _mintAmount, "Insufficient funds!"); //_mintLoop(msg.sender, _mintAmount); for (uint256 i = 0; i < _mintAmount; i++) { require(mintCountForCangster < maxMintCountForCangster); require(mintedForCangster[msg.sender] < maxMintAmountForCangsterPerEach, "Already minted!"); supply.increment(); _safeMint(msg.sender, totalSupply()); mintCountForCangster.add(1); mintedForCangster[msg.sender] = mintedForCangster[msg.sender].add(1); } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setMaxMintAmountForCangsterPerEach(uint256 _maxMintAmountForCangsterPerEach) public onlyOwner { maxMintAmountForCangsterPerEach = _maxMintAmountForCangsterPerEach; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setPausedForCangster(bool _state) public onlyOwner { pausedForCangster = _state; } function setPausedForCangsterPublicMinting(bool _state) public onlyOwner { pausedForCangsterPublicMinting = _state; } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator { super.safeTransferFrom(from, to, tokenId, data); } function withdraw() public onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function burn(uint256 tokenIds) public onlyOwner { require(_isApprovedOrOwner(_msgSender(), tokenIds), "ERC721: caller is not token owner nor approved"); supply.decrement(); _burn(tokenIds); } function burnLoop(uint256[] calldata _tokenIds) public onlyOwner { for (uint256 i = 0; i < _tokenIds.length; i++) { require(_isApprovedOrOwner(_msgSender(), _tokenIds[i]), "ERC721: caller is not token owner nor approved"); supply.decrement(); _burn(_tokenIds[i]); } } function ownerMintLoop(address[] calldata _mintingMembers, uint256[] calldata _tokenIds) public { require(msg.sender == managerAccount, "Only manager can use Owner Minting"); require(_mintingMembers.length == _tokenIds.length, "Different length arrays (address, tokenid)"); for (uint256 i = 0; i < _mintingMembers.length; i++) { supply.increment(); _safeMint(_mintingMembers[i], _tokenIds[i]); } } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function setWhitelistForCangsterForLoop(address[] calldata _whitelistMembers) public { require(msg.sender == managerAccount, "Only manager can set whitelist"); for (uint256 i = 0; i < _whitelistMembers.length; i++) { whitelistForCangster[_whitelistMembers[i]] = true; } } function setWhitelistForCangster(address _whitelistMember, bool _enable) public { require(msg.sender == managerAccount, "Only manager can set whitelist"); whitelistForCangster[_whitelistMember] = _enable; } function getMintCountForCangster() public view returns (uint256) { return mintCountForCangster; } function getWhitelistedForCangster(address _checkAddress) public view returns (bool) { return whitelistForCangster[_checkAddress]; } function getMintedForCangster(address _checkAddress) public view returns (uint256) { return mintedForCangster[_checkAddress]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {EnumerableSet} from "./EnumerableSet.sol"; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = 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(operatorFilterRegistry).code.length > 0) { if (subscribe) { operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { operatorFilterRegistry.register(address(this)); } } } } modifier onlyAllowedOperator() virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIds","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"burnLoop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"costForCangster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCountForCangster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_checkAddress","type":"address"}],"name":"getMintedForCangster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_checkAddress","type":"address"}],"name":"getWhitelistedForCangster","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountForCangsterPerEach","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintCountForCangster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCountForCangster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForCangster","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForCangsterWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedForCangster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_mintingMembers","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"ownerMintLoop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedForCangster","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedForCangsterPublicMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountForCangsterPerEach","type":"uint256"}],"name":"setMaxMintAmountForCangsterPerEach","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPausedForCangster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPausedForCangsterPublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whitelistMember","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setWhitelistForCangster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelistMembers","type":"address[]"}],"name":"setWhitelistForCangsterForLoop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistForCangster","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600a90805190602001906200002b929190620005ef565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b908051906020019062000079929190620005ef565b506000600c55612710600d556003600e556003600f5560006010556127106011556001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff0219169083151502179055506001601260026101000a81548160ff021916908315150217905550348015620000f857600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600881526020017f43616e67737465720000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f43414e4700000000000000000000000000000000000000000000000000000000815250816000908051906020019062000194929190620005ef565b508060019080519060200190620001ad929190620005ef565b505050620001d0620001c46200044c60201b60201c565b6200045460201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003c55780156200028b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000251929190620006e4565b600060405180830381600087803b1580156200026c57600080fd5b505af115801562000281573d6000803e3d6000fd5b50505050620003c4565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000345576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200030b929190620006e4565b600060405180830381600087803b1580156200032657600080fd5b505af11580156200033b573d6000803e3d6000fd5b50505050620003c3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200038e919062000711565b600060405180830381600087803b158015620003a957600080fd5b505af1158015620003be573d6000803e3d6000fd5b505050505b5b5b5050620003f16040518060600160405280603681526020016200620b603691396200051a60201b60201c565b7333b524578daced147215e94a73479defb7d5834a601260036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000815565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200052a6200044c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000550620005c560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005a0906200078f565b60405180910390fd5b80600a9080519060200190620005c1929190620005ef565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620005fd90620007e0565b90600052602060002090601f0160209004810192826200062157600085556200066d565b82601f106200063c57805160ff19168380011785556200066d565b828001600101855582156200066d579182015b828111156200066c5782518255916020019190600101906200064f565b5b5090506200067c919062000680565b5090565b5b808211156200069b57600081600090555060010162000681565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006cc826200069f565b9050919050565b620006de81620006bf565b82525050565b6000604082019050620006fb6000830185620006d3565b6200070a6020830184620006d3565b9392505050565b6000602082019050620007286000830184620006d3565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007776020836200072e565b915062000784826200073f565b602082019050919050565b60006020820190508181036000830152620007aa8162000768565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007f957607f821691505b6020821081036200080f576200080e620007b1565b5b50919050565b6159e680620008256000396000f3fe6080604052600436106102c95760003560e01c80636873dbf911610175578063b071401b116100dc578063df3fdb9a11610095578063ef861d381161006f578063ef861d3814610ad6578063f2fde38b14610b13578063f66f6fa814610b3c578063fb9b0da414610b65576102c9565b8063df3fdb9a14610a45578063e45c90b514610a6e578063e985e9c514610a99576102c9565b8063b071401b14610932578063b78b80541461095b578063b88d4fde14610977578063c8534470146109a0578063c87b56dd146109dd578063d5abeb0114610a1a576102c9565b80638da5cb5b1161012e5780638da5cb5b1461083457806394354fd01461085f57806395d89b411461088a5780639bfb2d89146108b5578063a22cb465146108de578063b003955814610907576102c9565b80636873dbf91461072857806370a0823114610751578063715018a61461078e5780637a085896146107a55780637ec4a659146107ce5780638d707e5b146107f7576102c9565b80633a534d86116102345780634d925dce116101ed5780635c82b2a6116101c75780635c82b2a6146106585780635c975abb1461069557806362b99ad4146106c05780636352211e146106eb576102c9565b80634d925dce146105e85780635503a0e8146106115780635a3d82321461063c576102c9565b80633a534d86146104ee5780633b03ad60146105175780633ccfd60b1461054257806342842e0e1461055957806342966c6814610582578063438b6300146105ab576102c9565b806318160ddd1161028657806318160ddd146103ee57806318e697e1146104195780631c0ee0511461044457806323b872dd1461046f5780632be6bca8146104985780632c3e8b6d146104c3576102c9565b806301ffc9a7146102ce57806306fdde031461030b578063081812fc14610336578063095ea7b31461037357806316ba10e01461039c57806316c38b3c146103c5575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190613cbf565b610b90565b6040516103029190613d07565b60405180910390f35b34801561031757600080fd5b50610320610c72565b60405161032d9190613dbb565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190613e13565b610d04565b60405161036a9190613e81565b60405180910390f35b34801561037f57600080fd5b5061039a60048036038101906103959190613ec8565b610d89565b005b3480156103a857600080fd5b506103c360048036038101906103be919061403d565b610ea0565b005b3480156103d157600080fd5b506103ec60048036038101906103e791906140b2565b610f36565b005b3480156103fa57600080fd5b50610403610fcf565b60405161041091906140ee565b60405180910390f35b34801561042557600080fd5b5061042e610fe0565b60405161043b91906140ee565b60405180910390f35b34801561045057600080fd5b50610459610fe6565b60405161046691906140ee565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190614109565b610ff0565b005b3480156104a457600080fd5b506104ad6110fc565b6040516104ba9190613d07565b60405180910390f35b3480156104cf57600080fd5b506104d861110f565b6040516104e591906140ee565b60405180910390f35b3480156104fa57600080fd5b50610515600480360381019061051091906141bc565b611115565b005b34801561052357600080fd5b5061052c61124c565b60405161053991906140ee565b60405180910390f35b34801561054e57600080fd5b50610557611252565b005b34801561056557600080fd5b50610580600480360381019061057b9190614109565b61134e565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613e13565b61145a565b005b3480156105b757600080fd5b506105d260048036038101906105cd9190614209565b61153c565b6040516105df91906142f4565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190614316565b611646565b005b34801561061d57600080fd5b50610626611731565b6040516106339190613dbb565b60405180910390f35b61065660048036038101906106519190613e13565b6117bf565b005b34801561066457600080fd5b5061067f600480360381019061067a9190614209565b611b64565b60405161068c9190613d07565b60405180910390f35b3480156106a157600080fd5b506106aa611b84565b6040516106b79190613d07565b60405180910390f35b3480156106cc57600080fd5b506106d5611b97565b6040516106e29190613dbb565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d9190613e13565b611c25565b60405161071f9190613e81565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a91906143ac565b611cd6565b005b34801561075d57600080fd5b5061077860048036038101906107739190614209565b611e2a565b60405161078591906140ee565b60405180910390f35b34801561079a57600080fd5b506107a3611ee1565b005b3480156107b157600080fd5b506107cc60048036038101906107c79190613e13565b611f69565b005b3480156107da57600080fd5b506107f560048036038101906107f0919061403d565b611fef565b005b34801561080357600080fd5b5061081e60048036038101906108199190614209565b612085565b60405161082b91906140ee565b60405180910390f35b34801561084057600080fd5b5061084961209d565b6040516108569190613e81565b60405180910390f35b34801561086b57600080fd5b506108746120c7565b60405161088191906140ee565b60405180910390f35b34801561089657600080fd5b5061089f6120cd565b6040516108ac9190613dbb565b60405180910390f35b3480156108c157600080fd5b506108dc60048036038101906108d791906140b2565b61215f565b005b3480156108ea57600080fd5b5061090560048036038101906109009190614316565b6121f8565b005b34801561091357600080fd5b5061091c61220e565b6040516109299190613e81565b60405180910390f35b34801561093e57600080fd5b5061095960048036038101906109549190613e13565b612234565b005b61097560048036038101906109709190613e13565b6122ba565b005b34801561098357600080fd5b5061099e600480360381019061099991906144ce565b612623565b005b3480156109ac57600080fd5b506109c760048036038101906109c29190614209565b612731565b6040516109d491906140ee565b60405180910390f35b3480156109e957600080fd5b50610a0460048036038101906109ff9190613e13565b61277a565b604051610a119190613dbb565b60405180910390f35b348015610a2657600080fd5b50610a2f612824565b604051610a3c91906140ee565b60405180910390f35b348015610a5157600080fd5b50610a6c6004803603810190610a679190614551565b61282a565b005b348015610a7a57600080fd5b50610a8361295f565b604051610a9091906140ee565b60405180910390f35b348015610aa557600080fd5b50610ac06004803603810190610abb919061459e565b612965565b604051610acd9190613d07565b60405180910390f35b348015610ae257600080fd5b50610afd6004803603810190610af89190614209565b6129f9565b604051610b0a9190613d07565b60405180910390f35b348015610b1f57600080fd5b50610b3a6004803603810190610b359190614209565b612a4f565b005b348015610b4857600080fd5b50610b636004803603810190610b5e91906140b2565b612b46565b005b348015610b7157600080fd5b50610b7a612bdf565b604051610b879190613d07565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c6b5750610c6a82612bf2565b5b9050919050565b606060008054610c819061460d565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad9061460d565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b5050505050905090565b6000610d0f82612c5c565b610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d45906146b0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d9482611c25565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb90614742565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e23612cc8565b73ffffffffffffffffffffffffffffffffffffffff161480610e525750610e5181610e4c612cc8565b612965565b5b610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e88906147d4565b60405180910390fd5b610e9b8383612cd0565b505050565b610ea8612cc8565b73ffffffffffffffffffffffffffffffffffffffff16610ec661209d565b73ffffffffffffffffffffffffffffffffffffffff1614610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1390614840565b60405180910390fd5b80600b9080519060200190610f32929190613bb0565b5050565b610f3e612cc8565b73ffffffffffffffffffffffffffffffffffffffff16610f5c61209d565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990614840565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000610fdb6009612d89565b905090565b60115481565b6000601054905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110ec576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611067929190614860565b6020604051808303816000875af1158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa919061489e565b6110eb57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110e29190613e81565b60405180910390fd5b5b6110f7838383612d97565b505050565b601260029054906101000a900460ff1681565b600f5481565b61111d612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661113b61209d565b73ffffffffffffffffffffffffffffffffffffffff1614611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890614840565b60405180910390fd5b60005b82829050811015611247576111c96111aa612cc8565b8484848181106111bd576111bc6148cb565b5b90506020020135612df7565b611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff9061496c565b60405180910390fd5b6112126009612ed5565b611234838383818110611228576112276148cb565b5b90506020020135612f31565b808061123f906149bb565b915050611194565b505050565b60105481565b61125a612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661127861209d565b73ffffffffffffffffffffffffffffffffffffffff16146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590614840565b60405180910390fd5b60006112d861209d565b73ffffffffffffffffffffffffffffffffffffffff16476040516112fb90614a34565b60006040518083038185875af1925050503d8060008114611338576040519150601f19603f3d011682016040523d82523d6000602084013e61133d565b606091505b505090508061134b57600080fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561144a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016113c5929190614860565b6020604051808303816000875af11580156113e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611408919061489e565b61144957336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114409190613e81565b60405180910390fd5b5b611455838383613042565b505050565b611462612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661148061209d565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90614840565b60405180910390fd5b6114e76114e1612cc8565b82612df7565b611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d9061496c565b60405180910390fd5b6115306009612ed5565b61153981612f31565b50565b6060600061154983611e2a565b905060008167ffffffffffffffff81111561156757611566613f12565b5b6040519080825280602002602001820160405280156115955781602001602082028036833780820191505090505b50905060006001905060005b83811080156115b25750600d548211155b1561163a5760006115c283611c25565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611626578284838151811061160b5761160a6148cb565b5b6020026020010181815250508180611622906149bb565b9250505b8280611631906149bb565b935050506115a1565b82945050505050919050565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614a95565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600b805461173e9061460d565b80601f016020809104026020016040519081016040528092919081815260200182805461176a9061460d565b80156117b75780601f1061178c576101008083540402835291602001916117b7565b820191906000526020600020905b81548152906001019060200180831161179a57829003601f168201915b505050505081565b806000811180156117d25750600e548111155b611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614b01565b60405180910390fd5b600d548161181f6009612d89565b6118299190614b21565b111561186a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186190614bc3565b60405180910390fd5b601260009054906101000a900460ff16156118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b190614c2f565b60405180910390fd5b601260019054906101000a900460ff161561190a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190190614c9b565b60405180910390fd5b81600c546119189190614cbb565b34101561195a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195190614d61565b60405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dd90614df3565b60405180910390fd5b60005b82811015611b5f5760115460105410611a0157600080fd5b600f54600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7b90614e5f565b60405180910390fd5b611a8e6009613062565b611a9f33611a9a610fcf565b613078565b611ab5600160105461309690919063ffffffff16565b50611b096001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461309690919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611b57906149bb565b9150506119e9565b505050565b60076020528060005260406000206000915054906101000a900460ff1681565b601260009054906101000a900460ff1681565b600a8054611ba49061460d565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd09061460d565b8015611c1d5780601f10611bf257610100808354040283529160200191611c1d565b820191906000526020600020905b815481529060010190602001808311611c0057829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc490614ef1565b60405180910390fd5b80915050919050565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d90614f83565b60405180910390fd5b818190508484905014611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da590615015565b60405180910390fd5b60005b84849050811015611e2357611dc66009613062565b611e10858583818110611ddc57611ddb6148cb565b5b9050602002016020810190611df19190614209565b848484818110611e0457611e036148cb565b5b90506020020135613078565b8080611e1b906149bb565b915050611db1565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e91906150a7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ee9612cc8565b73ffffffffffffffffffffffffffffffffffffffff16611f0761209d565b73ffffffffffffffffffffffffffffffffffffffff1614611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5490614840565b60405180910390fd5b611f6760006130ac565b565b611f71612cc8565b73ffffffffffffffffffffffffffffffffffffffff16611f8f61209d565b73ffffffffffffffffffffffffffffffffffffffff1614611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90614840565b60405180910390fd5b80600f8190555050565b611ff7612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661201561209d565b73ffffffffffffffffffffffffffffffffffffffff161461206b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206290614840565b60405180910390fd5b80600a9080519060200190612081929190613bb0565b5050565b60086020528060005260406000206000915090505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546120dc9061460d565b80601f01602080910402602001604051908101604052809291908181526020018280546121089061460d565b80156121555780601f1061212a57610100808354040283529160200191612155565b820191906000526020600020905b81548152906001019060200180831161213857829003601f168201915b5050505050905090565b612167612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661218561209d565b73ffffffffffffffffffffffffffffffffffffffff16146121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290614840565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b61220a612203612cc8565b8383613172565b5050565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61223c612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661225a61209d565b73ffffffffffffffffffffffffffffffffffffffff16146122b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a790614840565b60405180910390fd5b80600e8190555050565b806000811180156122cd5750600e548111155b61230c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230390614b01565b60405180910390fd5b600d548161231a6009612d89565b6123249190614b21565b1115612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90614bc3565b60405180910390fd5b601260009054906101000a900460ff16156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90614c2f565b60405180910390fd5b601260019054906101000a900460ff1615612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc90614c9b565b60405180910390fd5b601260029054906101000a900460ff1615612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90615139565b60405180910390fd5b81600c546124639190614cbb565b3410156124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c90614d61565b60405180910390fd5b60005b8281101561261e57601154601054106124c057600080fd5b600f54600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253a90614e5f565b60405180910390fd5b61254d6009613062565b61255e33612559610fcf565b613078565b612574600160105461309690919063ffffffff16565b506125c86001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461309690919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080612616906149bb565b9150506124a8565b505050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561271f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161269a929190614860565b6020604051808303816000875af11580156126b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126dd919061489e565b61271e57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016127159190613e81565b60405180910390fd5b5b61272b848484846132de565b50505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606061278582612c5c565b6127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb906151cb565b60405180910390fd5b60006127ce613340565b905060008151116127ee576040518060200160405280600081525061281c565b806127f8846133d2565b600b60405160200161280c939291906152bb565b6040516020818303038152906040525b915050919050565b600d5481565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b190614a95565b60405180910390fd5b60005b8282905081101561295a576001600760008585858181106128e1576128e06148cb565b5b90506020020160208101906128f69190614209565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612952906149bb565b9150506128bd565b505050565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612a57612cc8565b73ffffffffffffffffffffffffffffffffffffffff16612a7561209d565b73ffffffffffffffffffffffffffffffffffffffff1614612acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac290614840565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b319061535e565b60405180910390fd5b612b43816130ac565b50565b612b4e612cc8565b73ffffffffffffffffffffffffffffffffffffffff16612b6c61209d565b73ffffffffffffffffffffffffffffffffffffffff1614612bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb990614840565b60405180910390fd5b80601260026101000a81548160ff02191690831515021790555050565b601260019054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d4383611c25565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b612da8612da2612cc8565b82612df7565b612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde906153f0565b60405180910390fd5b612df2838383613532565b505050565b6000612e0282612c5c565b612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890615482565b60405180910390fd5b6000612e4c83611c25565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ebb57508373ffffffffffffffffffffffffffffffffffffffff16612ea384610d04565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ecc5750612ecb8185612965565b5b91505092915050565b60008160000154905060008111612f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f18906154ee565b60405180910390fd5b6001810382600001819055505050565b6000612f3c82611c25565b9050612f4a8160008461378d565b612f55600083612cd0565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa5919061550e565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61305d83838360405180602001604052806000815250612623565b505050565b6001816000016000828254019250508190555050565b613092828260405180602001604052806000815250613792565b5050565b600081836130a49190614b21565b905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036131e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d79061558e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132d19190613d07565b60405180910390a3505050565b6132ef6132e9612cc8565b83612df7565b61332e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613325906153f0565b60405180910390fd5b61333a848484846137ed565b50505050565b6060600a805461334f9061460d565b80601f016020809104026020016040519081016040528092919081815260200182805461337b9061460d565b80156133c85780601f1061339d576101008083540402835291602001916133c8565b820191906000526020600020905b8154815290600101906020018083116133ab57829003601f168201915b5050505050905090565b606060008203613419576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061352d565b600082905060005b6000821461344b578080613434906149bb565b915050600a8261344491906155dd565b9150613421565b60008167ffffffffffffffff81111561346757613466613f12565b5b6040519080825280601f01601f1916602001820160405280156134995781602001600182028036833780820191505090505b5090505b60008514613526576001826134b2919061550e565b9150600a856134c1919061560e565b60306134cd9190614b21565b60f81b8183815181106134e3576134e26148cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561351f91906155dd565b945061349d565b8093505050505b919050565b8273ffffffffffffffffffffffffffffffffffffffff1661355282611c25565b73ffffffffffffffffffffffffffffffffffffffff16146135a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359f906156b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360e90615743565b60405180910390fd5b61362283838361378d565b61362d600082612cd0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461367d919061550e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136d49190614b21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b505050565b61379c8383613849565b6137a96000848484613a16565b6137e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137df906157d5565b60405180910390fd5b505050565b6137f8848484613532565b61380484848484613a16565b613843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383a906157d5565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036138b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138af90615841565b60405180910390fd5b6138c181612c5c565b15613901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f8906158ad565b60405180910390fd5b61390d6000838361378d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461395d9190614b21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613a378473ffffffffffffffffffffffffffffffffffffffff16613b9d565b15613b90578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a60612cc8565b8786866040518563ffffffff1660e01b8152600401613a829493929190615922565b6020604051808303816000875af1925050508015613abe57506040513d601f19601f82011682018060405250810190613abb9190615983565b60015b613b40573d8060008114613aee576040519150601f19603f3d011682016040523d82523d6000602084013e613af3565b606091505b506000815103613b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2f906157d5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b95565b600190505b949350505050565b600080823b905060008111915050919050565b828054613bbc9061460d565b90600052602060002090601f016020900481019282613bde5760008555613c25565b82601f10613bf757805160ff1916838001178555613c25565b82800160010185558215613c25579182015b82811115613c24578251825591602001919060010190613c09565b5b509050613c329190613c36565b5090565b5b80821115613c4f576000816000905550600101613c37565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c9c81613c67565b8114613ca757600080fd5b50565b600081359050613cb981613c93565b92915050565b600060208284031215613cd557613cd4613c5d565b5b6000613ce384828501613caa565b91505092915050565b60008115159050919050565b613d0181613cec565b82525050565b6000602082019050613d1c6000830184613cf8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d5c578082015181840152602081019050613d41565b83811115613d6b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d8d82613d22565b613d978185613d2d565b9350613da7818560208601613d3e565b613db081613d71565b840191505092915050565b60006020820190508181036000830152613dd58184613d82565b905092915050565b6000819050919050565b613df081613ddd565b8114613dfb57600080fd5b50565b600081359050613e0d81613de7565b92915050565b600060208284031215613e2957613e28613c5d565b5b6000613e3784828501613dfe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e6b82613e40565b9050919050565b613e7b81613e60565b82525050565b6000602082019050613e966000830184613e72565b92915050565b613ea581613e60565b8114613eb057600080fd5b50565b600081359050613ec281613e9c565b92915050565b60008060408385031215613edf57613ede613c5d565b5b6000613eed85828601613eb3565b9250506020613efe85828601613dfe565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f4a82613d71565b810181811067ffffffffffffffff82111715613f6957613f68613f12565b5b80604052505050565b6000613f7c613c53565b9050613f888282613f41565b919050565b600067ffffffffffffffff821115613fa857613fa7613f12565b5b613fb182613d71565b9050602081019050919050565b82818337600083830152505050565b6000613fe0613fdb84613f8d565b613f72565b905082815260208101848484011115613ffc57613ffb613f0d565b5b614007848285613fbe565b509392505050565b600082601f83011261402457614023613f08565b5b8135614034848260208601613fcd565b91505092915050565b60006020828403121561405357614052613c5d565b5b600082013567ffffffffffffffff81111561407157614070613c62565b5b61407d8482850161400f565b91505092915050565b61408f81613cec565b811461409a57600080fd5b50565b6000813590506140ac81614086565b92915050565b6000602082840312156140c8576140c7613c5d565b5b60006140d68482850161409d565b91505092915050565b6140e881613ddd565b82525050565b600060208201905061410360008301846140df565b92915050565b60008060006060848603121561412257614121613c5d565b5b600061413086828701613eb3565b935050602061414186828701613eb3565b925050604061415286828701613dfe565b9150509250925092565b600080fd5b600080fd5b60008083601f84011261417c5761417b613f08565b5b8235905067ffffffffffffffff8111156141995761419861415c565b5b6020830191508360208202830111156141b5576141b4614161565b5b9250929050565b600080602083850312156141d3576141d2613c5d565b5b600083013567ffffffffffffffff8111156141f1576141f0613c62565b5b6141fd85828601614166565b92509250509250929050565b60006020828403121561421f5761421e613c5d565b5b600061422d84828501613eb3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61426b81613ddd565b82525050565b600061427d8383614262565b60208301905092915050565b6000602082019050919050565b60006142a182614236565b6142ab8185614241565b93506142b683614252565b8060005b838110156142e75781516142ce8882614271565b97506142d983614289565b9250506001810190506142ba565b5085935050505092915050565b6000602082019050818103600083015261430e8184614296565b905092915050565b6000806040838503121561432d5761432c613c5d565b5b600061433b85828601613eb3565b925050602061434c8582860161409d565b9150509250929050565b60008083601f84011261436c5761436b613f08565b5b8235905067ffffffffffffffff8111156143895761438861415c565b5b6020830191508360208202830111156143a5576143a4614161565b5b9250929050565b600080600080604085870312156143c6576143c5613c5d565b5b600085013567ffffffffffffffff8111156143e4576143e3613c62565b5b6143f087828801614356565b9450945050602085013567ffffffffffffffff81111561441357614412613c62565b5b61441f87828801614166565b925092505092959194509250565b600067ffffffffffffffff82111561444857614447613f12565b5b61445182613d71565b9050602081019050919050565b600061447161446c8461442d565b613f72565b90508281526020810184848401111561448d5761448c613f0d565b5b614498848285613fbe565b509392505050565b600082601f8301126144b5576144b4613f08565b5b81356144c584826020860161445e565b91505092915050565b600080600080608085870312156144e8576144e7613c5d565b5b60006144f687828801613eb3565b945050602061450787828801613eb3565b935050604061451887828801613dfe565b925050606085013567ffffffffffffffff81111561453957614538613c62565b5b614545878288016144a0565b91505092959194509250565b6000806020838503121561456857614567613c5d565b5b600083013567ffffffffffffffff81111561458657614585613c62565b5b61459285828601614356565b92509250509250929050565b600080604083850312156145b5576145b4613c5d565b5b60006145c385828601613eb3565b92505060206145d485828601613eb3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061462557607f821691505b602082108103614638576146376145de565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061469a602c83613d2d565b91506146a58261463e565b604082019050919050565b600060208201905081810360008301526146c98161468d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061472c602183613d2d565b9150614737826146d0565b604082019050919050565b6000602082019050818103600083015261475b8161471f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006147be603883613d2d565b91506147c982614762565b604082019050919050565b600060208201905081810360008301526147ed816147b1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061482a602083613d2d565b9150614835826147f4565b602082019050919050565b600060208201905081810360008301526148598161481d565b9050919050565b60006040820190506148756000830185613e72565b6148826020830184613e72565b9392505050565b60008151905061489881614086565b92915050565b6000602082840312156148b4576148b3613c5d565b5b60006148c284828501614889565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614956602e83613d2d565b9150614961826148fa565b604082019050919050565b6000602082019050818103600083015261498581614949565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149c682613ddd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149f8576149f761498c565b5b600182019050919050565b600081905092915050565b50565b6000614a1e600083614a03565b9150614a2982614a0e565b600082019050919050565b6000614a3f82614a11565b9150819050919050565b7f4f6e6c79206d616e616765722063616e207365742077686974656c6973740000600082015250565b6000614a7f601e83613d2d565b9150614a8a82614a49565b602082019050919050565b60006020820190508181036000830152614aae81614a72565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614aeb601483613d2d565b9150614af682614ab5565b602082019050919050565b60006020820190508181036000830152614b1a81614ade565b9050919050565b6000614b2c82613ddd565b9150614b3783613ddd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b6c57614b6b61498c565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614bad601483613d2d565b9150614bb882614b77565b602082019050919050565b60006020820190508181036000830152614bdc81614ba0565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000614c19601783613d2d565b9150614c2482614be3565b602082019050919050565b60006020820190508181036000830152614c4881614c0c565b9050919050565b7f4d696e74696e6720666f722043616e6773746572206973207061757365642100600082015250565b6000614c85601f83613d2d565b9150614c9082614c4f565b602082019050919050565b60006020820190508181036000830152614cb481614c78565b9050919050565b6000614cc682613ddd565b9150614cd183613ddd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0a57614d0961498c565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614d4b601383613d2d565b9150614d5682614d15565b602082019050919050565b60006020820190508181036000830152614d7a81614d3e565b9050919050565b7f54686973206163636f756e7420646f6573206e6f7420657869737420696e207760008201527f686974656c697374000000000000000000000000000000000000000000000000602082015250565b6000614ddd602883613d2d565b9150614de882614d81565b604082019050919050565b60006020820190508181036000830152614e0c81614dd0565b9050919050565b7f416c7265616479206d696e746564210000000000000000000000000000000000600082015250565b6000614e49600f83613d2d565b9150614e5482614e13565b602082019050919050565b60006020820190508181036000830152614e7881614e3c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614edb602983613d2d565b9150614ee682614e7f565b604082019050919050565b60006020820190508181036000830152614f0a81614ece565b9050919050565b7f4f6e6c79206d616e616765722063616e20757365204f776e6572204d696e746960008201527f6e67000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f6d602283613d2d565b9150614f7882614f11565b604082019050919050565b60006020820190508181036000830152614f9c81614f60565b9050919050565b7f446966666572656e74206c656e6774682061727261797320286164647265737360008201527f2c20746f6b656e69642900000000000000000000000000000000000000000000602082015250565b6000614fff602a83613d2d565b915061500a82614fa3565b604082019050919050565b6000602082019050818103600083015261502e81614ff2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615091602a83613d2d565b915061509c82615035565b604082019050919050565b600060208201905081810360008301526150c081615084565b9050919050565b7f4d696e74696e6720666f722043616e677374657220285075626c6963204d696e60008201527f69746e6729206973207061757365642100000000000000000000000000000000602082015250565b6000615123603083613d2d565b915061512e826150c7565b604082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006151b5602f83613d2d565b91506151c082615159565b604082019050919050565b600060208201905081810360008301526151e4816151a8565b9050919050565b600081905092915050565b600061520182613d22565b61520b81856151eb565b935061521b818560208601613d3e565b80840191505092915050565b60008190508160005260206000209050919050565b600081546152498161460d565b61525381866151eb565b9450600182166000811461526e576001811461527f576152b2565b60ff198316865281860193506152b2565b61528885615227565b60005b838110156152aa5781548189015260018201915060208101905061528b565b838801955050505b50505092915050565b60006152c782866151f6565b91506152d382856151f6565b91506152df828461523c565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615348602683613d2d565b9150615353826152ec565b604082019050919050565b600060208201905081810360008301526153778161533b565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006153da603183613d2d565b91506153e58261537e565b604082019050919050565b60006020820190508181036000830152615409816153cd565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061546c602c83613d2d565b915061547782615410565b604082019050919050565b6000602082019050818103600083015261549b8161545f565b9050919050565b7f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000600082015250565b60006154d8601b83613d2d565b91506154e3826154a2565b602082019050919050565b60006020820190508181036000830152615507816154cb565b9050919050565b600061551982613ddd565b915061552483613ddd565b9250828210156155375761553661498c565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615578601983613d2d565b915061558382615542565b602082019050919050565b600060208201905081810360008301526155a78161556b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155e882613ddd565b91506155f383613ddd565b925082615603576156026155ae565b5b828204905092915050565b600061561982613ddd565b915061562483613ddd565b925082615634576156336155ae565b5b828206905092915050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061569b602983613d2d565b91506156a68261563f565b604082019050919050565b600060208201905081810360008301526156ca8161568e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061572d602483613d2d565b9150615738826156d1565b604082019050919050565b6000602082019050818103600083015261575c81615720565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157bf603283613d2d565b91506157ca82615763565b604082019050919050565b600060208201905081810360008301526157ee816157b2565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061582b602083613d2d565b9150615836826157f5565b602082019050919050565b6000602082019050818103600083015261585a8161581e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615897601c83613d2d565b91506158a282615861565b602082019050919050565b600060208201905081810360008301526158c68161588a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006158f4826158cd565b6158fe81856158d8565b935061590e818560208601613d3e565b61591781613d71565b840191505092915050565b60006080820190506159376000830187613e72565b6159446020830186613e72565b61595160408301856140df565b818103606083015261596381846158e9565b905095945050505050565b60008151905061597d81613c93565b92915050565b60006020828403121561599957615998613c5d565b5b60006159a78482850161596e565b9150509291505056fea2646970667358221220cd7c63f30a7e3dbe711477266084f003857e4c08a33d683281e85444d437dc8664736f6c634300080d0033697066733a2f2f516d58754b58664d36315476424c68686b52545a5356735450775353785a5553796d4e537362476765784d376d642f
Deployed Bytecode
0x6080604052600436106102c95760003560e01c80636873dbf911610175578063b071401b116100dc578063df3fdb9a11610095578063ef861d381161006f578063ef861d3814610ad6578063f2fde38b14610b13578063f66f6fa814610b3c578063fb9b0da414610b65576102c9565b8063df3fdb9a14610a45578063e45c90b514610a6e578063e985e9c514610a99576102c9565b8063b071401b14610932578063b78b80541461095b578063b88d4fde14610977578063c8534470146109a0578063c87b56dd146109dd578063d5abeb0114610a1a576102c9565b80638da5cb5b1161012e5780638da5cb5b1461083457806394354fd01461085f57806395d89b411461088a5780639bfb2d89146108b5578063a22cb465146108de578063b003955814610907576102c9565b80636873dbf91461072857806370a0823114610751578063715018a61461078e5780637a085896146107a55780637ec4a659146107ce5780638d707e5b146107f7576102c9565b80633a534d86116102345780634d925dce116101ed5780635c82b2a6116101c75780635c82b2a6146106585780635c975abb1461069557806362b99ad4146106c05780636352211e146106eb576102c9565b80634d925dce146105e85780635503a0e8146106115780635a3d82321461063c576102c9565b80633a534d86146104ee5780633b03ad60146105175780633ccfd60b1461054257806342842e0e1461055957806342966c6814610582578063438b6300146105ab576102c9565b806318160ddd1161028657806318160ddd146103ee57806318e697e1146104195780631c0ee0511461044457806323b872dd1461046f5780632be6bca8146104985780632c3e8b6d146104c3576102c9565b806301ffc9a7146102ce57806306fdde031461030b578063081812fc14610336578063095ea7b31461037357806316ba10e01461039c57806316c38b3c146103c5575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190613cbf565b610b90565b6040516103029190613d07565b60405180910390f35b34801561031757600080fd5b50610320610c72565b60405161032d9190613dbb565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190613e13565b610d04565b60405161036a9190613e81565b60405180910390f35b34801561037f57600080fd5b5061039a60048036038101906103959190613ec8565b610d89565b005b3480156103a857600080fd5b506103c360048036038101906103be919061403d565b610ea0565b005b3480156103d157600080fd5b506103ec60048036038101906103e791906140b2565b610f36565b005b3480156103fa57600080fd5b50610403610fcf565b60405161041091906140ee565b60405180910390f35b34801561042557600080fd5b5061042e610fe0565b60405161043b91906140ee565b60405180910390f35b34801561045057600080fd5b50610459610fe6565b60405161046691906140ee565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190614109565b610ff0565b005b3480156104a457600080fd5b506104ad6110fc565b6040516104ba9190613d07565b60405180910390f35b3480156104cf57600080fd5b506104d861110f565b6040516104e591906140ee565b60405180910390f35b3480156104fa57600080fd5b50610515600480360381019061051091906141bc565b611115565b005b34801561052357600080fd5b5061052c61124c565b60405161053991906140ee565b60405180910390f35b34801561054e57600080fd5b50610557611252565b005b34801561056557600080fd5b50610580600480360381019061057b9190614109565b61134e565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613e13565b61145a565b005b3480156105b757600080fd5b506105d260048036038101906105cd9190614209565b61153c565b6040516105df91906142f4565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190614316565b611646565b005b34801561061d57600080fd5b50610626611731565b6040516106339190613dbb565b60405180910390f35b61065660048036038101906106519190613e13565b6117bf565b005b34801561066457600080fd5b5061067f600480360381019061067a9190614209565b611b64565b60405161068c9190613d07565b60405180910390f35b3480156106a157600080fd5b506106aa611b84565b6040516106b79190613d07565b60405180910390f35b3480156106cc57600080fd5b506106d5611b97565b6040516106e29190613dbb565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d9190613e13565b611c25565b60405161071f9190613e81565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a91906143ac565b611cd6565b005b34801561075d57600080fd5b5061077860048036038101906107739190614209565b611e2a565b60405161078591906140ee565b60405180910390f35b34801561079a57600080fd5b506107a3611ee1565b005b3480156107b157600080fd5b506107cc60048036038101906107c79190613e13565b611f69565b005b3480156107da57600080fd5b506107f560048036038101906107f0919061403d565b611fef565b005b34801561080357600080fd5b5061081e60048036038101906108199190614209565b612085565b60405161082b91906140ee565b60405180910390f35b34801561084057600080fd5b5061084961209d565b6040516108569190613e81565b60405180910390f35b34801561086b57600080fd5b506108746120c7565b60405161088191906140ee565b60405180910390f35b34801561089657600080fd5b5061089f6120cd565b6040516108ac9190613dbb565b60405180910390f35b3480156108c157600080fd5b506108dc60048036038101906108d791906140b2565b61215f565b005b3480156108ea57600080fd5b5061090560048036038101906109009190614316565b6121f8565b005b34801561091357600080fd5b5061091c61220e565b6040516109299190613e81565b60405180910390f35b34801561093e57600080fd5b5061095960048036038101906109549190613e13565b612234565b005b61097560048036038101906109709190613e13565b6122ba565b005b34801561098357600080fd5b5061099e600480360381019061099991906144ce565b612623565b005b3480156109ac57600080fd5b506109c760048036038101906109c29190614209565b612731565b6040516109d491906140ee565b60405180910390f35b3480156109e957600080fd5b50610a0460048036038101906109ff9190613e13565b61277a565b604051610a119190613dbb565b60405180910390f35b348015610a2657600080fd5b50610a2f612824565b604051610a3c91906140ee565b60405180910390f35b348015610a5157600080fd5b50610a6c6004803603810190610a679190614551565b61282a565b005b348015610a7a57600080fd5b50610a8361295f565b604051610a9091906140ee565b60405180910390f35b348015610aa557600080fd5b50610ac06004803603810190610abb919061459e565b612965565b604051610acd9190613d07565b60405180910390f35b348015610ae257600080fd5b50610afd6004803603810190610af89190614209565b6129f9565b604051610b0a9190613d07565b60405180910390f35b348015610b1f57600080fd5b50610b3a6004803603810190610b359190614209565b612a4f565b005b348015610b4857600080fd5b50610b636004803603810190610b5e91906140b2565b612b46565b005b348015610b7157600080fd5b50610b7a612bdf565b604051610b879190613d07565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c6b5750610c6a82612bf2565b5b9050919050565b606060008054610c819061460d565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad9061460d565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b5050505050905090565b6000610d0f82612c5c565b610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d45906146b0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d9482611c25565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb90614742565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e23612cc8565b73ffffffffffffffffffffffffffffffffffffffff161480610e525750610e5181610e4c612cc8565b612965565b5b610e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e88906147d4565b60405180910390fd5b610e9b8383612cd0565b505050565b610ea8612cc8565b73ffffffffffffffffffffffffffffffffffffffff16610ec661209d565b73ffffffffffffffffffffffffffffffffffffffff1614610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1390614840565b60405180910390fd5b80600b9080519060200190610f32929190613bb0565b5050565b610f3e612cc8565b73ffffffffffffffffffffffffffffffffffffffff16610f5c61209d565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990614840565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000610fdb6009612d89565b905090565b60115481565b6000601054905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110ec576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611067929190614860565b6020604051808303816000875af1158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa919061489e565b6110eb57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110e29190613e81565b60405180910390fd5b5b6110f7838383612d97565b505050565b601260029054906101000a900460ff1681565b600f5481565b61111d612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661113b61209d565b73ffffffffffffffffffffffffffffffffffffffff1614611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890614840565b60405180910390fd5b60005b82829050811015611247576111c96111aa612cc8565b8484848181106111bd576111bc6148cb565b5b90506020020135612df7565b611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff9061496c565b60405180910390fd5b6112126009612ed5565b611234838383818110611228576112276148cb565b5b90506020020135612f31565b808061123f906149bb565b915050611194565b505050565b60105481565b61125a612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661127861209d565b73ffffffffffffffffffffffffffffffffffffffff16146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590614840565b60405180910390fd5b60006112d861209d565b73ffffffffffffffffffffffffffffffffffffffff16476040516112fb90614a34565b60006040518083038185875af1925050503d8060008114611338576040519150601f19603f3d011682016040523d82523d6000602084013e61133d565b606091505b505090508061134b57600080fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561144a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016113c5929190614860565b6020604051808303816000875af11580156113e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611408919061489e565b61144957336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114409190613e81565b60405180910390fd5b5b611455838383613042565b505050565b611462612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661148061209d565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90614840565b60405180910390fd5b6114e76114e1612cc8565b82612df7565b611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d9061496c565b60405180910390fd5b6115306009612ed5565b61153981612f31565b50565b6060600061154983611e2a565b905060008167ffffffffffffffff81111561156757611566613f12565b5b6040519080825280602002602001820160405280156115955781602001602082028036833780820191505090505b50905060006001905060005b83811080156115b25750600d548211155b1561163a5760006115c283611c25565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611626578284838151811061160b5761160a6148cb565b5b6020026020010181815250508180611622906149bb565b9250505b8280611631906149bb565b935050506115a1565b82945050505050919050565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614a95565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600b805461173e9061460d565b80601f016020809104026020016040519081016040528092919081815260200182805461176a9061460d565b80156117b75780601f1061178c576101008083540402835291602001916117b7565b820191906000526020600020905b81548152906001019060200180831161179a57829003601f168201915b505050505081565b806000811180156117d25750600e548111155b611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614b01565b60405180910390fd5b600d548161181f6009612d89565b6118299190614b21565b111561186a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186190614bc3565b60405180910390fd5b601260009054906101000a900460ff16156118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b190614c2f565b60405180910390fd5b601260019054906101000a900460ff161561190a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190190614c9b565b60405180910390fd5b81600c546119189190614cbb565b34101561195a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195190614d61565b60405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dd90614df3565b60405180910390fd5b60005b82811015611b5f5760115460105410611a0157600080fd5b600f54600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7b90614e5f565b60405180910390fd5b611a8e6009613062565b611a9f33611a9a610fcf565b613078565b611ab5600160105461309690919063ffffffff16565b50611b096001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461309690919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611b57906149bb565b9150506119e9565b505050565b60076020528060005260406000206000915054906101000a900460ff1681565b601260009054906101000a900460ff1681565b600a8054611ba49061460d565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd09061460d565b8015611c1d5780601f10611bf257610100808354040283529160200191611c1d565b820191906000526020600020905b815481529060010190602001808311611c0057829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc490614ef1565b60405180910390fd5b80915050919050565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d90614f83565b60405180910390fd5b818190508484905014611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da590615015565b60405180910390fd5b60005b84849050811015611e2357611dc66009613062565b611e10858583818110611ddc57611ddb6148cb565b5b9050602002016020810190611df19190614209565b848484818110611e0457611e036148cb565b5b90506020020135613078565b8080611e1b906149bb565b915050611db1565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e91906150a7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ee9612cc8565b73ffffffffffffffffffffffffffffffffffffffff16611f0761209d565b73ffffffffffffffffffffffffffffffffffffffff1614611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5490614840565b60405180910390fd5b611f6760006130ac565b565b611f71612cc8565b73ffffffffffffffffffffffffffffffffffffffff16611f8f61209d565b73ffffffffffffffffffffffffffffffffffffffff1614611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90614840565b60405180910390fd5b80600f8190555050565b611ff7612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661201561209d565b73ffffffffffffffffffffffffffffffffffffffff161461206b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206290614840565b60405180910390fd5b80600a9080519060200190612081929190613bb0565b5050565b60086020528060005260406000206000915090505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546120dc9061460d565b80601f01602080910402602001604051908101604052809291908181526020018280546121089061460d565b80156121555780601f1061212a57610100808354040283529160200191612155565b820191906000526020600020905b81548152906001019060200180831161213857829003601f168201915b5050505050905090565b612167612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661218561209d565b73ffffffffffffffffffffffffffffffffffffffff16146121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290614840565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b61220a612203612cc8565b8383613172565b5050565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61223c612cc8565b73ffffffffffffffffffffffffffffffffffffffff1661225a61209d565b73ffffffffffffffffffffffffffffffffffffffff16146122b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a790614840565b60405180910390fd5b80600e8190555050565b806000811180156122cd5750600e548111155b61230c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230390614b01565b60405180910390fd5b600d548161231a6009612d89565b6123249190614b21565b1115612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90614bc3565b60405180910390fd5b601260009054906101000a900460ff16156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90614c2f565b60405180910390fd5b601260019054906101000a900460ff1615612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc90614c9b565b60405180910390fd5b601260029054906101000a900460ff1615612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90615139565b60405180910390fd5b81600c546124639190614cbb565b3410156124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c90614d61565b60405180910390fd5b60005b8281101561261e57601154601054106124c057600080fd5b600f54600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253a90614e5f565b60405180910390fd5b61254d6009613062565b61255e33612559610fcf565b613078565b612574600160105461309690919063ffffffff16565b506125c86001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461309690919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080612616906149bb565b9150506124a8565b505050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561271f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161269a929190614860565b6020604051808303816000875af11580156126b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126dd919061489e565b61271e57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016127159190613e81565b60405180910390fd5b5b61272b848484846132de565b50505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606061278582612c5c565b6127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb906151cb565b60405180910390fd5b60006127ce613340565b905060008151116127ee576040518060200160405280600081525061281c565b806127f8846133d2565b600b60405160200161280c939291906152bb565b6040516020818303038152906040525b915050919050565b600d5481565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b190614a95565b60405180910390fd5b60005b8282905081101561295a576001600760008585858181106128e1576128e06148cb565b5b90506020020160208101906128f69190614209565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612952906149bb565b9150506128bd565b505050565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612a57612cc8565b73ffffffffffffffffffffffffffffffffffffffff16612a7561209d565b73ffffffffffffffffffffffffffffffffffffffff1614612acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac290614840565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b319061535e565b60405180910390fd5b612b43816130ac565b50565b612b4e612cc8565b73ffffffffffffffffffffffffffffffffffffffff16612b6c61209d565b73ffffffffffffffffffffffffffffffffffffffff1614612bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb990614840565b60405180910390fd5b80601260026101000a81548160ff02191690831515021790555050565b601260019054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d4383611c25565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b612da8612da2612cc8565b82612df7565b612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde906153f0565b60405180910390fd5b612df2838383613532565b505050565b6000612e0282612c5c565b612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890615482565b60405180910390fd5b6000612e4c83611c25565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ebb57508373ffffffffffffffffffffffffffffffffffffffff16612ea384610d04565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ecc5750612ecb8185612965565b5b91505092915050565b60008160000154905060008111612f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f18906154ee565b60405180910390fd5b6001810382600001819055505050565b6000612f3c82611c25565b9050612f4a8160008461378d565b612f55600083612cd0565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa5919061550e565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61305d83838360405180602001604052806000815250612623565b505050565b6001816000016000828254019250508190555050565b613092828260405180602001604052806000815250613792565b5050565b600081836130a49190614b21565b905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036131e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d79061558e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132d19190613d07565b60405180910390a3505050565b6132ef6132e9612cc8565b83612df7565b61332e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613325906153f0565b60405180910390fd5b61333a848484846137ed565b50505050565b6060600a805461334f9061460d565b80601f016020809104026020016040519081016040528092919081815260200182805461337b9061460d565b80156133c85780601f1061339d576101008083540402835291602001916133c8565b820191906000526020600020905b8154815290600101906020018083116133ab57829003601f168201915b5050505050905090565b606060008203613419576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061352d565b600082905060005b6000821461344b578080613434906149bb565b915050600a8261344491906155dd565b9150613421565b60008167ffffffffffffffff81111561346757613466613f12565b5b6040519080825280601f01601f1916602001820160405280156134995781602001600182028036833780820191505090505b5090505b60008514613526576001826134b2919061550e565b9150600a856134c1919061560e565b60306134cd9190614b21565b60f81b8183815181106134e3576134e26148cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561351f91906155dd565b945061349d565b8093505050505b919050565b8273ffffffffffffffffffffffffffffffffffffffff1661355282611c25565b73ffffffffffffffffffffffffffffffffffffffff16146135a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359f906156b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360e90615743565b60405180910390fd5b61362283838361378d565b61362d600082612cd0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461367d919061550e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136d49190614b21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b505050565b61379c8383613849565b6137a96000848484613a16565b6137e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137df906157d5565b60405180910390fd5b505050565b6137f8848484613532565b61380484848484613a16565b613843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383a906157d5565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036138b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138af90615841565b60405180910390fd5b6138c181612c5c565b15613901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f8906158ad565b60405180910390fd5b61390d6000838361378d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461395d9190614b21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613a378473ffffffffffffffffffffffffffffffffffffffff16613b9d565b15613b90578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a60612cc8565b8786866040518563ffffffff1660e01b8152600401613a829493929190615922565b6020604051808303816000875af1925050508015613abe57506040513d601f19601f82011682018060405250810190613abb9190615983565b60015b613b40573d8060008114613aee576040519150601f19603f3d011682016040523d82523d6000602084013e613af3565b606091505b506000815103613b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2f906157d5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b95565b600190505b949350505050565b600080823b905060008111915050919050565b828054613bbc9061460d565b90600052602060002090601f016020900481019282613bde5760008555613c25565b82601f10613bf757805160ff1916838001178555613c25565b82800160010185558215613c25579182015b82811115613c24578251825591602001919060010190613c09565b5b509050613c329190613c36565b5090565b5b80821115613c4f576000816000905550600101613c37565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c9c81613c67565b8114613ca757600080fd5b50565b600081359050613cb981613c93565b92915050565b600060208284031215613cd557613cd4613c5d565b5b6000613ce384828501613caa565b91505092915050565b60008115159050919050565b613d0181613cec565b82525050565b6000602082019050613d1c6000830184613cf8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d5c578082015181840152602081019050613d41565b83811115613d6b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d8d82613d22565b613d978185613d2d565b9350613da7818560208601613d3e565b613db081613d71565b840191505092915050565b60006020820190508181036000830152613dd58184613d82565b905092915050565b6000819050919050565b613df081613ddd565b8114613dfb57600080fd5b50565b600081359050613e0d81613de7565b92915050565b600060208284031215613e2957613e28613c5d565b5b6000613e3784828501613dfe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e6b82613e40565b9050919050565b613e7b81613e60565b82525050565b6000602082019050613e966000830184613e72565b92915050565b613ea581613e60565b8114613eb057600080fd5b50565b600081359050613ec281613e9c565b92915050565b60008060408385031215613edf57613ede613c5d565b5b6000613eed85828601613eb3565b9250506020613efe85828601613dfe565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f4a82613d71565b810181811067ffffffffffffffff82111715613f6957613f68613f12565b5b80604052505050565b6000613f7c613c53565b9050613f888282613f41565b919050565b600067ffffffffffffffff821115613fa857613fa7613f12565b5b613fb182613d71565b9050602081019050919050565b82818337600083830152505050565b6000613fe0613fdb84613f8d565b613f72565b905082815260208101848484011115613ffc57613ffb613f0d565b5b614007848285613fbe565b509392505050565b600082601f83011261402457614023613f08565b5b8135614034848260208601613fcd565b91505092915050565b60006020828403121561405357614052613c5d565b5b600082013567ffffffffffffffff81111561407157614070613c62565b5b61407d8482850161400f565b91505092915050565b61408f81613cec565b811461409a57600080fd5b50565b6000813590506140ac81614086565b92915050565b6000602082840312156140c8576140c7613c5d565b5b60006140d68482850161409d565b91505092915050565b6140e881613ddd565b82525050565b600060208201905061410360008301846140df565b92915050565b60008060006060848603121561412257614121613c5d565b5b600061413086828701613eb3565b935050602061414186828701613eb3565b925050604061415286828701613dfe565b9150509250925092565b600080fd5b600080fd5b60008083601f84011261417c5761417b613f08565b5b8235905067ffffffffffffffff8111156141995761419861415c565b5b6020830191508360208202830111156141b5576141b4614161565b5b9250929050565b600080602083850312156141d3576141d2613c5d565b5b600083013567ffffffffffffffff8111156141f1576141f0613c62565b5b6141fd85828601614166565b92509250509250929050565b60006020828403121561421f5761421e613c5d565b5b600061422d84828501613eb3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61426b81613ddd565b82525050565b600061427d8383614262565b60208301905092915050565b6000602082019050919050565b60006142a182614236565b6142ab8185614241565b93506142b683614252565b8060005b838110156142e75781516142ce8882614271565b97506142d983614289565b9250506001810190506142ba565b5085935050505092915050565b6000602082019050818103600083015261430e8184614296565b905092915050565b6000806040838503121561432d5761432c613c5d565b5b600061433b85828601613eb3565b925050602061434c8582860161409d565b9150509250929050565b60008083601f84011261436c5761436b613f08565b5b8235905067ffffffffffffffff8111156143895761438861415c565b5b6020830191508360208202830111156143a5576143a4614161565b5b9250929050565b600080600080604085870312156143c6576143c5613c5d565b5b600085013567ffffffffffffffff8111156143e4576143e3613c62565b5b6143f087828801614356565b9450945050602085013567ffffffffffffffff81111561441357614412613c62565b5b61441f87828801614166565b925092505092959194509250565b600067ffffffffffffffff82111561444857614447613f12565b5b61445182613d71565b9050602081019050919050565b600061447161446c8461442d565b613f72565b90508281526020810184848401111561448d5761448c613f0d565b5b614498848285613fbe565b509392505050565b600082601f8301126144b5576144b4613f08565b5b81356144c584826020860161445e565b91505092915050565b600080600080608085870312156144e8576144e7613c5d565b5b60006144f687828801613eb3565b945050602061450787828801613eb3565b935050604061451887828801613dfe565b925050606085013567ffffffffffffffff81111561453957614538613c62565b5b614545878288016144a0565b91505092959194509250565b6000806020838503121561456857614567613c5d565b5b600083013567ffffffffffffffff81111561458657614585613c62565b5b61459285828601614356565b92509250509250929050565b600080604083850312156145b5576145b4613c5d565b5b60006145c385828601613eb3565b92505060206145d485828601613eb3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061462557607f821691505b602082108103614638576146376145de565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061469a602c83613d2d565b91506146a58261463e565b604082019050919050565b600060208201905081810360008301526146c98161468d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061472c602183613d2d565b9150614737826146d0565b604082019050919050565b6000602082019050818103600083015261475b8161471f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006147be603883613d2d565b91506147c982614762565b604082019050919050565b600060208201905081810360008301526147ed816147b1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061482a602083613d2d565b9150614835826147f4565b602082019050919050565b600060208201905081810360008301526148598161481d565b9050919050565b60006040820190506148756000830185613e72565b6148826020830184613e72565b9392505050565b60008151905061489881614086565b92915050565b6000602082840312156148b4576148b3613c5d565b5b60006148c284828501614889565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614956602e83613d2d565b9150614961826148fa565b604082019050919050565b6000602082019050818103600083015261498581614949565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149c682613ddd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149f8576149f761498c565b5b600182019050919050565b600081905092915050565b50565b6000614a1e600083614a03565b9150614a2982614a0e565b600082019050919050565b6000614a3f82614a11565b9150819050919050565b7f4f6e6c79206d616e616765722063616e207365742077686974656c6973740000600082015250565b6000614a7f601e83613d2d565b9150614a8a82614a49565b602082019050919050565b60006020820190508181036000830152614aae81614a72565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614aeb601483613d2d565b9150614af682614ab5565b602082019050919050565b60006020820190508181036000830152614b1a81614ade565b9050919050565b6000614b2c82613ddd565b9150614b3783613ddd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b6c57614b6b61498c565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614bad601483613d2d565b9150614bb882614b77565b602082019050919050565b60006020820190508181036000830152614bdc81614ba0565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000614c19601783613d2d565b9150614c2482614be3565b602082019050919050565b60006020820190508181036000830152614c4881614c0c565b9050919050565b7f4d696e74696e6720666f722043616e6773746572206973207061757365642100600082015250565b6000614c85601f83613d2d565b9150614c9082614c4f565b602082019050919050565b60006020820190508181036000830152614cb481614c78565b9050919050565b6000614cc682613ddd565b9150614cd183613ddd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0a57614d0961498c565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614d4b601383613d2d565b9150614d5682614d15565b602082019050919050565b60006020820190508181036000830152614d7a81614d3e565b9050919050565b7f54686973206163636f756e7420646f6573206e6f7420657869737420696e207760008201527f686974656c697374000000000000000000000000000000000000000000000000602082015250565b6000614ddd602883613d2d565b9150614de882614d81565b604082019050919050565b60006020820190508181036000830152614e0c81614dd0565b9050919050565b7f416c7265616479206d696e746564210000000000000000000000000000000000600082015250565b6000614e49600f83613d2d565b9150614e5482614e13565b602082019050919050565b60006020820190508181036000830152614e7881614e3c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614edb602983613d2d565b9150614ee682614e7f565b604082019050919050565b60006020820190508181036000830152614f0a81614ece565b9050919050565b7f4f6e6c79206d616e616765722063616e20757365204f776e6572204d696e746960008201527f6e67000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f6d602283613d2d565b9150614f7882614f11565b604082019050919050565b60006020820190508181036000830152614f9c81614f60565b9050919050565b7f446966666572656e74206c656e6774682061727261797320286164647265737360008201527f2c20746f6b656e69642900000000000000000000000000000000000000000000602082015250565b6000614fff602a83613d2d565b915061500a82614fa3565b604082019050919050565b6000602082019050818103600083015261502e81614ff2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615091602a83613d2d565b915061509c82615035565b604082019050919050565b600060208201905081810360008301526150c081615084565b9050919050565b7f4d696e74696e6720666f722043616e677374657220285075626c6963204d696e60008201527f69746e6729206973207061757365642100000000000000000000000000000000602082015250565b6000615123603083613d2d565b915061512e826150c7565b604082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006151b5602f83613d2d565b91506151c082615159565b604082019050919050565b600060208201905081810360008301526151e4816151a8565b9050919050565b600081905092915050565b600061520182613d22565b61520b81856151eb565b935061521b818560208601613d3e565b80840191505092915050565b60008190508160005260206000209050919050565b600081546152498161460d565b61525381866151eb565b9450600182166000811461526e576001811461527f576152b2565b60ff198316865281860193506152b2565b61528885615227565b60005b838110156152aa5781548189015260018201915060208101905061528b565b838801955050505b50505092915050565b60006152c782866151f6565b91506152d382856151f6565b91506152df828461523c565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615348602683613d2d565b9150615353826152ec565b604082019050919050565b600060208201905081810360008301526153778161533b565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006153da603183613d2d565b91506153e58261537e565b604082019050919050565b60006020820190508181036000830152615409816153cd565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061546c602c83613d2d565b915061547782615410565b604082019050919050565b6000602082019050818103600083015261549b8161545f565b9050919050565b7f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000600082015250565b60006154d8601b83613d2d565b91506154e3826154a2565b602082019050919050565b60006020820190508181036000830152615507816154cb565b9050919050565b600061551982613ddd565b915061552483613ddd565b9250828210156155375761553661498c565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615578601983613d2d565b915061558382615542565b602082019050919050565b600060208201905081810360008301526155a78161556b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155e882613ddd565b91506155f383613ddd565b925082615603576156026155ae565b5b828204905092915050565b600061561982613ddd565b915061562483613ddd565b925082615634576156336155ae565b5b828206905092915050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061569b602983613d2d565b91506156a68261563f565b604082019050919050565b600060208201905081810360008301526156ca8161568e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061572d602483613d2d565b9150615738826156d1565b604082019050919050565b6000602082019050818103600083015261575c81615720565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157bf603283613d2d565b91506157ca82615763565b604082019050919050565b600060208201905081810360008301526157ee816157b2565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061582b602083613d2d565b9150615836826157f5565b602082019050919050565b6000602082019050818103600083015261585a8161581e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615897601c83613d2d565b91506158a282615861565b602082019050919050565b600060208201905081810360008301526158c68161588a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006158f4826158cd565b6158fe81856158d8565b935061590e818560208601613d3e565b61591781613d71565b840191505092915050565b60006080820190506159376000830187613e72565b6159446020830186613e72565b61595160408301856140df565b818103606083015261596381846158e9565b905095945050505050565b60008151905061597d81613c93565b92915050565b60006020828403121561599957615998613c5d565b5b60006159a78482850161596e565b9150509291505056fea2646970667358221220cd7c63f30a7e3dbe711477266084f003857e4c08a33d683281e85444d437dc8664736f6c634300080d0033
Deployed Bytecode Sourcemap
43435:7557:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24478:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25396:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26907:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26445:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47904:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48006:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44676:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44043:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50607:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48315:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44163:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43945:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49218:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44000:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48864:134;;;;;;;;;;;;;:::i;:::-;;48476:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49002:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46454:612;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50383:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43783:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44767:836;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43600:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44094:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43751:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25099:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49527:443;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24837:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6028:101;;;;;;;;;;;;;:::i;:::-;;47616:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47802:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43657:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5396:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43903:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25558:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48085:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27191:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44217:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47484:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45607:841;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48645:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50856:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47070:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43867:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50080:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43823:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27410:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50714:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6278:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48186:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44123:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24478:300;24580:4;24630:25;24615:40;;;:11;:40;;;;:104;;;;24686:33;24671:48;;;:11;:48;;;;24615:104;:156;;;;24735:36;24759:11;24735:23;:36::i;:::-;24615:156;24596:175;;24478:300;;;:::o;25396:98::-;25450:13;25482:5;25475:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25396:98;:::o;26907:217::-;26983:7;27010:16;27018:7;27010;:16::i;:::-;27002:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27093:15;:24;27109:7;27093:24;;;;;;;;;;;;;;;;;;;;;27086:31;;26907:217;;;:::o;26445:401::-;26525:13;26541:23;26556:7;26541:14;:23::i;:::-;26525:39;;26588:5;26582:11;;:2;:11;;;26574:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26679:5;26663:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26688:37;26705:5;26712:12;:10;:12::i;:::-;26688:16;:37::i;:::-;26663:62;26642:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;26818:21;26827:2;26831:7;26818:8;:21::i;:::-;26515:331;26445:401;;:::o;47904:98::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47987:10:::1;47975:9;:22;;;;;;;;;;;;:::i;:::-;;47904:98:::0;:::o;48006:75::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48070:6:::1;48061;;:15;;;;;;;;;;;;;;;;;;48006:75:::0;:::o;44676:87::-;44720:7;44742:16;:6;:14;:16::i;:::-;44735:23;;44676:87;:::o;44043:46::-;;;;:::o;50607:103::-;50663:7;50685:20;;50678:27;;50607:103;:::o;48315:155::-;1454:1:4;301:42;1408:43;;;:47;1404:221;;;301:42;1476:40;;;1525:4;1532:10;1476:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1471:144;;1589:10;1570:30;;;;;;;;;;;:::i;:::-;;;;;;;;1471:144;1404:221;48426:37:0::1;48445:4;48451:2;48455:7;48426:18;:37::i;:::-;48315:155:::0;;;:::o;44163:49::-;;;;;;;;;;;;;:::o;43945:50::-;;;;:::o;49218:305::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49296:9:::1;49291:228;49315:9;;:16;;49311:1;:20;49291:228;;;49356:46;49375:12;:10;:12::i;:::-;49389:9;;49399:1;49389:12;;;;;;;:::i;:::-;;;;;;;;49356:18;:46::i;:::-;49348:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;49463:18;:6;:16;:18::i;:::-;49491:19;49497:9;;49507:1;49497:12;;;;;;;:::i;:::-;;;;;;;;49491:5;:19::i;:::-;49333:3;;;;;:::i;:::-;;;;49291:228;;;;49218:305:::0;;:::o;44000:39::-;;;;:::o;48864:134::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48908:7:::1;48929;:5;:7::i;:::-;48921:21;;48950;48921:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48907:69;;;48990:2;48982:11;;;::::0;::::1;;48901:97;48864:134::o:0;48476:163::-;1454:1:4;301:42;1408:43;;;:47;1404:221;;;301:42;1476:40;;;1525:4;1532:10;1476:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1471:144;;1589:10;1570:30;;;;;;;;;;;:::i;:::-;;;;;;;;1471:144;1404:221;48591:41:0::1;48614:4;48620:2;48624:7;48591:22;:41::i;:::-;48476:163:::0;;;:::o;49002:212::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49067:42:::1;49086:12;:10;:12::i;:::-;49100:8;49067:18;:42::i;:::-;49059:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;49168:18;:6;:16;:18::i;:::-;49194:15;49200:8;49194:5;:15::i;:::-;49002:212:::0;:::o;46454:612::-;46526:16;46552:23;46578:17;46588:6;46578:9;:17::i;:::-;46552:43;;46601:30;46648:15;46634:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46601:63;;46670:22;46695:1;46670:26;;46702:23;46736:299;46761:15;46743;:33;:64;;;;;46798:9;;46780:14;:27;;46743:64;46736:299;;;46817:25;46845:23;46853:14;46845:7;:23::i;:::-;46817:51;;46902:6;46881:27;;:17;:27;;;46877:127;;46953:14;46920:13;46934:15;46920:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;46978:17;;;;;:::i;:::-;;;;46877:127;47012:16;;;;;:::i;:::-;;;;46809:226;46736:299;;;47048:13;47041:20;;;;;;46454:612;;;:::o;50383:220::-;50493:14;;;;;;;;;;;50479:28;;:10;:28;;;50471:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50591:7;50550:20;:38;50571:16;50550:38;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;50383:220;;:::o;43783:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44767:836::-;44845:11;44515:1;44501:11;:15;:52;;;;;44535:18;;44520:11;:33;;44501:52;44493:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;44626:9;;44611:11;44592:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;44584:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44873:6:::1;;;;;;;;;;;44872:7;44864:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;44922:17;;;;;;;;;;;44921:18;44913:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45020:11;45002:15;;:29;;;;:::i;:::-;44989:9;:42;;44981:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45069:20;:32;45090:10;45069:32;;;;;;;;;;;;;;;;;;;;;;;;;45061:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;45200:9;45195:404;45219:11;45215:1;:15;45195:404;;;45278:23;;45255:20;;:46;45247:55;;;::::0;::::1;;45352:31;;45320:17;:29;45338:10;45320:29;;;;;;;;;;;;;;;;:63;45312:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;45413:18;:6;:16;:18::i;:::-;45441:36;45451:10;45463:13;:11;:13::i;:::-;45441:9;:36::i;:::-;45487:27;45512:1;45487:20;;:24;;:27;;;;:::i;:::-;;45556:36;45590:1;45556:17;:29;45574:10;45556:29;;;;;;;;;;;;;;;;:33;;:36;;;;:::i;:::-;45524:17;:29;45542:10;45524:29;;;;;;;;;;;;;;;:68;;;;45232:3;;;;;:::i;:::-;;;;45195:404;;;;44767:836:::0;;:::o;43600:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;44094:25::-;;;;;;;;;;;;;:::o;43751:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25099:235::-;25171:7;25190:13;25206:7;:16;25214:7;25206:16;;;;;;;;;;;;;;;;;;;;;25190:32;;25257:1;25240:19;;:5;:19;;;25232:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25322:5;25315:12;;;25099:235;;;:::o;49527:443::-;49653:14;;;;;;;;;;;49639:28;;:10;:28;;;49631:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49748:9;;:16;;49722:15;;:22;;:42;49714:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;49824:9;49819:147;49843:15;;:22;;49839:1;:26;49819:147;;;49884:18;:6;:16;:18::i;:::-;49914:43;49924:15;;49940:1;49924:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;49944:9;;49954:1;49944:12;;;;;;;:::i;:::-;;;;;;;;49914:9;:43::i;:::-;49867:3;;;;;:::i;:::-;;;;49819:147;;;;49527:443;;;;:::o;24837:205::-;24909:7;24953:1;24936:19;;:5;:19;;;24928:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25019:9;:16;25029:5;25019:16;;;;;;;;;;;;;;;;25012:23;;24837:205;;;:::o;6028:101::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6092:30:::1;6119:1;6092:18;:30::i;:::-;6028:101::o:0;47616:180::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47759:32:::1;47725:31;:66;;;;47616:180:::0;:::o;47802:98::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47885:10:::1;47873:9;:22;;;;;;;;;;;;:::i;:::-;;47802:98:::0;:::o;43657:53::-;;;;;;;;;;;;;;;;;:::o;5396:85::-;5442:7;5468:6;;;;;;;;;;;5461:13;;5396:85;:::o;43903:37::-;;;;:::o;25558:102::-;25614:13;25646:7;25639:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25558:102;:::o;48085:97::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48171:6:::1;48151:17;;:26;;;;;;;;;;;;;;;;;;48085:97:::0;:::o;27191:153::-;27285:52;27304:12;:10;:12::i;:::-;27318:8;27328;27285:18;:52::i;:::-;27191:153;;:::o;44217:29::-;;;;;;;;;;;;;:::o;47484:128::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47588:19:::1;47567:18;:40;;;;47484:128:::0;:::o;45607:841::-;45683:11;44515:1;44501:11;:15;:52;;;;;44535:18;;44520:11;:33;;44501:52;44493:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;44626:9;;44611:11;44592:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;44584:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45711:6:::1;;;;;;;;;;;45710:7;45702:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;45760:17;;;;;;;;;;;45759:18;45751:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45828:30;;;;;;;;;;;45827:31;45819:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;45956:11;45938:15;;:29;;;;:::i;:::-;45925:9;:42;;45917:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46045:9;46040:404;46064:11;46060:1;:15;46040:404;;;46123:23;;46100:20;;:46;46092:55;;;::::0;::::1;;46197:31;;46165:17;:29;46183:10;46165:29;;;;;;;;;;;;;;;;:63;46157:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;46258:18;:6;:16;:18::i;:::-;46286:36;46296:10;46308:13;:11;:13::i;:::-;46286:9;:36::i;:::-;46332:27;46357:1;46332:20;;:24;;:27;;;;:::i;:::-;;46401:36;46435:1;46401:17;:29;46419:10;46401:29;;;;;;;;;;;;;;;;:33;;:36;;;;:::i;:::-;46369:17;:29;46387:10;46369:29;;;;;;;;;;;;;;;:68;;;;46077:3;;;;;:::i;:::-;;;;46040:404;;;;45607:841:::0;;:::o;48645:216::-;1454:1:4;301:42;1408:43;;;:47;1404:221;;;301:42;1476:40;;;1525:4;1532:10;1476:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1471:144;;1589:10;1570:30;;;;;;;;;;;:::i;:::-;;;;;;;;1471:144;1404:221;48807:47:0::1;48830:4;48836:2;48840:7;48849:4;48807:22;:47::i;:::-;48645:216:::0;;;;:::o;50856:133::-;50930:7;50952:17;:32;50970:13;50952:32;;;;;;;;;;;;;;;;50945:39;;50856:133;;;:::o;47070:410::-;47164:13;47202:17;47210:8;47202:7;:17::i;:::-;47187:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47293:28;47324:10;:8;:10::i;:::-;47293:41;;47378:1;47353:14;47347:28;:32;:128;;;;;;;;;;;;;;;;;47414:14;47430:19;:8;:17;:19::i;:::-;47451:9;47397:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47347:128;47340:135;;;47070:410;;;:::o;43867:32::-;;;;:::o;50080:299::-;50195:14;;;;;;;;;;;50181:28;;:10;:28;;;50173:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50257:9;50252:123;50276:17;;:24;;50272:1;:28;50252:123;;;50362:4;50317:20;:42;50338:17;;50356:1;50338:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50317:42;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;50302:3;;;;;:::i;:::-;;;;50252:123;;;;50080:299;;:::o;43823:40::-;;;;:::o;27410:162::-;27507:4;27530:18;:25;27549:5;27530:25;;;;;;;;;;;;;;;:35;27556:8;27530:35;;;;;;;;;;;;;;;;;;;;;;;;;27523:42;;27410:162;;;;:::o;50714:138::-;50793:4;50812:20;:35;50833:13;50812:35;;;;;;;;;;;;;;;;;;;;;;;;;50805:42;;50714:138;;;:::o;6278:198::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6386:1:::1;6366:22;;:8;:22;;::::0;6358:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6441:28;6460:8;6441:18;:28::i;:::-;6278:198:::0;:::o;48186:123::-;5619:12;:10;:12::i;:::-;5608:23;;:7;:5;:7::i;:::-;:23;;;5600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48298:6:::1;48265:30;;:39;;;;;;;;;;;;;;;;;;48186:123:::0;:::o;44123:36::-;;;;;;;;;;;;;:::o;17481:155::-;17566:4;17604:25;17589:40;;;:11;:40;;;;17582:47;;17481:155;;;:::o;30067:125::-;30132:4;30183:1;30155:30;;:7;:16;30163:7;30155:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30148:37;;30067:125;;;:::o;4164:96::-;4217:7;4243:10;4236:17;;4164:96;:::o;33918:171::-;34019:2;33992:15;:24;34008:7;33992:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34074:7;34070:2;34036:46;;34045:23;34060:7;34045:14;:23::i;:::-;34036:46;;;;;;;;;;;;33918:171;;:::o;879:112::-;944:7;970;:14;;;963:21;;879:112;;;:::o;27634:330::-;27823:41;27842:12;:10;:12::i;:::-;27856:7;27823:18;:41::i;:::-;27815:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27929:28;27939:4;27945:2;27949:7;27929:9;:28::i;:::-;27634:330;;;:::o;30350:344::-;30443:4;30467:16;30475:7;30467;:16::i;:::-;30459:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30542:13;30558:23;30573:7;30558:14;:23::i;:::-;30542:39;;30610:5;30599:16;;:7;:16;;;:51;;;;30643:7;30619:31;;:20;30631:7;30619:11;:20::i;:::-;:31;;;30599:51;:87;;;;30654:32;30671:5;30678:7;30654:16;:32::i;:::-;30599:87;30591:96;;;30350:344;;;;:::o;1126:229::-;1189:13;1205:7;:14;;;1189:30;;1245:1;1237:5;:9;1229:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1337:1;1329:5;:9;1312:7;:14;;:26;;;;1179:176;1126:229;:::o;32575:348::-;32634:13;32650:23;32665:7;32650:14;:23::i;:::-;32634:39;;32684:48;32705:5;32720:1;32724:7;32684:20;:48::i;:::-;32770:29;32787:1;32791:7;32770:8;:29::i;:::-;32830:1;32810:9;:16;32820:5;32810:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;32848:7;:16;32856:7;32848:16;;;;;;;;;;;;32841:23;;;;;;;;;;;32908:7;32904:1;32880:36;;32889:5;32880:36;;;;;;;;;;;;32624:299;32575:348;:::o;28030:179::-;28163:39;28180:4;28186:2;28190:7;28163:39;;;;;;;;;;;;:16;:39::i;:::-;28030:179;;;:::o;997:123::-;1102:1;1084:7;:14;;;:19;;;;;;;;;;;997:123;:::o;31024:108::-;31099:26;31109:2;31113:7;31099:26;;;;;;;;;;;;:9;:26::i;:::-;31024:108;;:::o;39331:96::-;39389:7;39419:1;39415;:5;;;;:::i;:::-;39408:12;;39331:96;;;;:::o;6630:187::-;6703:16;6722:6;;;;;;;;;;;6703:25;;6747:8;6738:6;;:17;;;;;;;;;;;;;;;;;;6801:8;6770:40;;6791:8;6770:40;;;;;;;;;;;;6693:124;6630:187;:::o;34224:307::-;34374:8;34365:17;;:5;:17;;;34357:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34460:8;34422:18;:25;34441:5;34422:25;;;;;;;;;;;;;;;:35;34448:8;34422:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34505:8;34483:41;;34498:5;34483:41;;;34515:8;34483:41;;;;;;:::i;:::-;;;;;;;;34224:307;;;:::o;28275:320::-;28444:41;28463:12;:10;:12::i;:::-;28477:7;28444:18;:41::i;:::-;28436:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28549:39;28563:4;28569:2;28573:7;28582:5;28549:13;:39::i;:::-;28275:320;;;;:::o;49974:102::-;50034:13;50062:9;50055:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49974:102;:::o;1798:703::-;1854:13;2080:1;2071:5;:10;2067:51;;2097:10;;;;;;;;;;;;;;;;;;;;;2067:51;2127:12;2142:5;2127:20;;2157:14;2181:75;2196:1;2188:4;:9;2181:75;;2213:8;;;;;:::i;:::-;;;;2243:2;2235:10;;;;;:::i;:::-;;;2181:75;;;2265:19;2297:6;2287:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2265:39;;2314:150;2330:1;2321:5;:10;2314:150;;2357:1;2347:11;;;;;:::i;:::-;;;2423:2;2415:5;:10;;;;:::i;:::-;2402:2;:24;;;;:::i;:::-;2389:39;;2372:6;2379;2372:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2451:2;2442:11;;;;;:::i;:::-;;;2314:150;;;2487:6;2473:21;;;;;1798:703;;;;:::o;33247:560::-;33401:4;33374:31;;:23;33389:7;33374:14;:23::i;:::-;:31;;;33366:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33483:1;33469:16;;:2;:16;;;33461:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33537:39;33558:4;33564:2;33568:7;33537:20;:39::i;:::-;33638:29;33655:1;33659:7;33638:8;:29::i;:::-;33697:1;33678:9;:15;33688:4;33678:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33725:1;33708:9;:13;33718:2;33708:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33755:2;33736:7;:16;33744:7;33736:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33792:7;33788:2;33773:27;;33782:4;33773:27;;;;;;;;;;;;33247:560;;;:::o;36418:122::-;;;;:::o;31353:311::-;31478:18;31484:2;31488:7;31478:5;:18::i;:::-;31527:54;31558:1;31562:2;31566:7;31575:5;31527:22;:54::i;:::-;31506:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;31353:311;;;:::o;29457:307::-;29608:28;29618:4;29624:2;29628:7;29608:9;:28::i;:::-;29654:48;29677:4;29683:2;29687:7;29696:5;29654:22;:48::i;:::-;29646:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29457:307;;;;:::o;31986:372::-;32079:1;32065:16;;:2;:16;;;32057:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32137:16;32145:7;32137;:16::i;:::-;32136:17;32128:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32197:45;32226:1;32230:2;32234:7;32197:20;:45::i;:::-;32270:1;32253:9;:13;32263:2;32253:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32300:2;32281:7;:16;32289:7;32281:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32343:7;32339:2;32318:33;;32335:1;32318:33;;;;;;;;;;;;31986:372;;:::o;35084:778::-;35234:4;35254:15;:2;:13;;;:15::i;:::-;35250:606;;;35305:2;35289:36;;;35326:12;:10;:12::i;:::-;35340:4;35346:7;35355:5;35289:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35285:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35545:1;35528:6;:13;:18;35524:266;;35570:60;;;;;;;;;;:::i;:::-;;;;;;;;35524:266;35742:6;35736:13;35727:6;35723:2;35719:15;35712:38;35285:519;35421:41;;;35411:51;;;:6;:51;;;;35404:58;;;;;35250:606;35841:4;35834:11;;35084:778;;;;;;;:::o;7613:377::-;7673:4;7876:12;7941:7;7929:20;7921:28;;7982:1;7975:4;:8;7968:15;;;7613:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:5:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:509::-;7113:6;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7316:1;7305:9;7301:17;7288:31;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7259:287;7044:509;;;;:::o;7559:116::-;7629:21;7644:5;7629:21;:::i;:::-;7622:5;7619:32;7609:60;;7665:1;7662;7655:12;7609:60;7559:116;:::o;7681:133::-;7724:5;7762:6;7749:20;7740:29;;7778:30;7802:5;7778:30;:::i;:::-;7681:133;;;;:::o;7820:323::-;7876:6;7925:2;7913:9;7904:7;7900:23;7896:32;7893:119;;;7931:79;;:::i;:::-;7893:119;8051:1;8076:50;8118:7;8109:6;8098:9;8094:22;8076:50;:::i;:::-;8066:60;;8022:114;7820:323;;;;:::o;8149:118::-;8236:24;8254:5;8236:24;:::i;:::-;8231:3;8224:37;8149:118;;:::o;8273:222::-;8366:4;8404:2;8393:9;8389:18;8381:26;;8417:71;8485:1;8474:9;8470:17;8461:6;8417:71;:::i;:::-;8273:222;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:117::-;9235:1;9232;9225:12;9249:117;9358:1;9355;9348:12;9389:568;9462:8;9472:6;9522:3;9515:4;9507:6;9503:17;9499:27;9489:122;;9530:79;;:::i;:::-;9489:122;9643:6;9630:20;9620:30;;9673:18;9665:6;9662:30;9659:117;;;9695:79;;:::i;:::-;9659:117;9809:4;9801:6;9797:17;9785:29;;9863:3;9855:4;9847:6;9843:17;9833:8;9829:32;9826:41;9823:128;;;9870:79;;:::i;:::-;9823:128;9389:568;;;;;:::o;9963:559::-;10049:6;10057;10106:2;10094:9;10085:7;10081:23;10077:32;10074:119;;;10112:79;;:::i;:::-;10074:119;10260:1;10249:9;10245:17;10232:31;10290:18;10282:6;10279:30;10276:117;;;10312:79;;:::i;:::-;10276:117;10425:80;10497:7;10488:6;10477:9;10473:22;10425:80;:::i;:::-;10407:98;;;;10203:312;9963:559;;;;;:::o;10528:329::-;10587:6;10636:2;10624:9;10615:7;10611:23;10607:32;10604:119;;;10642:79;;:::i;:::-;10604:119;10762:1;10787:53;10832:7;10823:6;10812:9;10808:22;10787:53;:::i;:::-;10777:63;;10733:117;10528:329;;;;:::o;10863:114::-;10930:6;10964:5;10958:12;10948:22;;10863:114;;;:::o;10983:184::-;11082:11;11116:6;11111:3;11104:19;11156:4;11151:3;11147:14;11132:29;;10983:184;;;;:::o;11173:132::-;11240:4;11263:3;11255:11;;11293:4;11288:3;11284:14;11276:22;;11173:132;;;:::o;11311:108::-;11388:24;11406:5;11388:24;:::i;:::-;11383:3;11376:37;11311:108;;:::o;11425:179::-;11494:10;11515:46;11557:3;11549:6;11515:46;:::i;:::-;11593:4;11588:3;11584:14;11570:28;;11425:179;;;;:::o;11610:113::-;11680:4;11712;11707:3;11703:14;11695:22;;11610:113;;;:::o;11759:732::-;11878:3;11907:54;11955:5;11907:54;:::i;:::-;11977:86;12056:6;12051:3;11977:86;:::i;:::-;11970:93;;12087:56;12137:5;12087:56;:::i;:::-;12166:7;12197:1;12182:284;12207:6;12204:1;12201:13;12182:284;;;12283:6;12277:13;12310:63;12369:3;12354:13;12310:63;:::i;:::-;12303:70;;12396:60;12449:6;12396:60;:::i;:::-;12386:70;;12242:224;12229:1;12226;12222:9;12217:14;;12182:284;;;12186:14;12482:3;12475:10;;11883:608;;;11759:732;;;;:::o;12497:373::-;12640:4;12678:2;12667:9;12663:18;12655:26;;12727:9;12721:4;12717:20;12713:1;12702:9;12698:17;12691:47;12755:108;12858:4;12849:6;12755:108;:::i;:::-;12747:116;;12497:373;;;;:::o;12876:468::-;12941:6;12949;12998:2;12986:9;12977:7;12973:23;12969:32;12966:119;;;13004:79;;:::i;:::-;12966:119;13124:1;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13095:117;13251:2;13277:50;13319:7;13310:6;13299:9;13295:22;13277:50;:::i;:::-;13267:60;;13222:115;12876:468;;;;;:::o;13367:568::-;13440:8;13450:6;13500:3;13493:4;13485:6;13481:17;13477:27;13467:122;;13508:79;;:::i;:::-;13467:122;13621:6;13608:20;13598:30;;13651:18;13643:6;13640:30;13637:117;;;13673:79;;:::i;:::-;13637:117;13787:4;13779:6;13775:17;13763:29;;13841:3;13833:4;13825:6;13821:17;13811:8;13807:32;13804:41;13801:128;;;13848:79;;:::i;:::-;13801:128;13367:568;;;;;:::o;13941:934::-;14063:6;14071;14079;14087;14136:2;14124:9;14115:7;14111:23;14107:32;14104:119;;;14142:79;;:::i;:::-;14104:119;14290:1;14279:9;14275:17;14262:31;14320:18;14312:6;14309:30;14306:117;;;14342:79;;:::i;:::-;14306:117;14455:80;14527:7;14518:6;14507:9;14503:22;14455:80;:::i;:::-;14437:98;;;;14233:312;14612:2;14601:9;14597:18;14584:32;14643:18;14635:6;14632:30;14629:117;;;14665:79;;:::i;:::-;14629:117;14778:80;14850:7;14841:6;14830:9;14826:22;14778:80;:::i;:::-;14760:98;;;;14555:313;13941:934;;;;;;;:::o;14881:307::-;14942:4;15032:18;15024:6;15021:30;15018:56;;;15054:18;;:::i;:::-;15018:56;15092:29;15114:6;15092:29;:::i;:::-;15084:37;;15176:4;15170;15166:15;15158:23;;14881:307;;;:::o;15194:410::-;15271:5;15296:65;15312:48;15353:6;15312:48;:::i;:::-;15296:65;:::i;:::-;15287:74;;15384:6;15377:5;15370:21;15422:4;15415:5;15411:16;15460:3;15451:6;15446:3;15442:16;15439:25;15436:112;;;15467:79;;:::i;:::-;15436:112;15557:41;15591:6;15586:3;15581;15557:41;:::i;:::-;15277:327;15194:410;;;;;:::o;15623:338::-;15678:5;15727:3;15720:4;15712:6;15708:17;15704:27;15694:122;;15735:79;;:::i;:::-;15694:122;15852:6;15839:20;15877:78;15951:3;15943:6;15936:4;15928:6;15924:17;15877:78;:::i;:::-;15868:87;;15684:277;15623:338;;;;:::o;15967:943::-;16062:6;16070;16078;16086;16135:3;16123:9;16114:7;16110:23;16106:33;16103:120;;;16142:79;;:::i;:::-;16103:120;16262:1;16287:53;16332:7;16323:6;16312:9;16308:22;16287:53;:::i;:::-;16277:63;;16233:117;16389:2;16415:53;16460:7;16451:6;16440:9;16436:22;16415:53;:::i;:::-;16405:63;;16360:118;16517:2;16543:53;16588:7;16579:6;16568:9;16564:22;16543:53;:::i;:::-;16533:63;;16488:118;16673:2;16662:9;16658:18;16645:32;16704:18;16696:6;16693:30;16690:117;;;16726:79;;:::i;:::-;16690:117;16831:62;16885:7;16876:6;16865:9;16861:22;16831:62;:::i;:::-;16821:72;;16616:287;15967:943;;;;;;;:::o;16916:559::-;17002:6;17010;17059:2;17047:9;17038:7;17034:23;17030:32;17027:119;;;17065:79;;:::i;:::-;17027:119;17213:1;17202:9;17198:17;17185:31;17243:18;17235:6;17232:30;17229:117;;;17265:79;;:::i;:::-;17229:117;17378:80;17450:7;17441:6;17430:9;17426:22;17378:80;:::i;:::-;17360:98;;;;17156:312;16916:559;;;;;:::o;17481:474::-;17549:6;17557;17606:2;17594:9;17585:7;17581:23;17577:32;17574:119;;;17612:79;;:::i;:::-;17574:119;17732:1;17757:53;17802:7;17793:6;17782:9;17778:22;17757:53;:::i;:::-;17747:63;;17703:117;17859:2;17885:53;17930:7;17921:6;17910:9;17906:22;17885:53;:::i;:::-;17875:63;;17830:118;17481:474;;;;;:::o;17961:180::-;18009:77;18006:1;17999:88;18106:4;18103:1;18096:15;18130:4;18127:1;18120:15;18147:320;18191:6;18228:1;18222:4;18218:12;18208:22;;18275:1;18269:4;18265:12;18296:18;18286:81;;18352:4;18344:6;18340:17;18330:27;;18286:81;18414:2;18406:6;18403:14;18383:18;18380:38;18377:84;;18433:18;;:::i;:::-;18377:84;18198:269;18147:320;;;:::o;18473:231::-;18613:34;18609:1;18601:6;18597:14;18590:58;18682:14;18677:2;18669:6;18665:15;18658:39;18473:231;:::o;18710:366::-;18852:3;18873:67;18937:2;18932:3;18873:67;:::i;:::-;18866:74;;18949:93;19038:3;18949:93;:::i;:::-;19067:2;19062:3;19058:12;19051:19;;18710:366;;;:::o;19082:419::-;19248:4;19286:2;19275:9;19271:18;19263:26;;19335:9;19329:4;19325:20;19321:1;19310:9;19306:17;19299:47;19363:131;19489:4;19363:131;:::i;:::-;19355:139;;19082:419;;;:::o;19507:220::-;19647:34;19643:1;19635:6;19631:14;19624:58;19716:3;19711:2;19703:6;19699:15;19692:28;19507:220;:::o;19733:366::-;19875:3;19896:67;19960:2;19955:3;19896:67;:::i;:::-;19889:74;;19972:93;20061:3;19972:93;:::i;:::-;20090:2;20085:3;20081:12;20074:19;;19733:366;;;:::o;20105:419::-;20271:4;20309:2;20298:9;20294:18;20286:26;;20358:9;20352:4;20348:20;20344:1;20333:9;20329:17;20322:47;20386:131;20512:4;20386:131;:::i;:::-;20378:139;;20105:419;;;:::o;20530:243::-;20670:34;20666:1;20658:6;20654:14;20647:58;20739:26;20734:2;20726:6;20722:15;20715:51;20530:243;:::o;20779:366::-;20921:3;20942:67;21006:2;21001:3;20942:67;:::i;:::-;20935:74;;21018:93;21107:3;21018:93;:::i;:::-;21136:2;21131:3;21127:12;21120:19;;20779:366;;;:::o;21151:419::-;21317:4;21355:2;21344:9;21340:18;21332:26;;21404:9;21398:4;21394:20;21390:1;21379:9;21375:17;21368:47;21432:131;21558:4;21432:131;:::i;:::-;21424:139;;21151:419;;;:::o;21576:182::-;21716:34;21712:1;21704:6;21700:14;21693:58;21576:182;:::o;21764:366::-;21906:3;21927:67;21991:2;21986:3;21927:67;:::i;:::-;21920:74;;22003:93;22092:3;22003:93;:::i;:::-;22121:2;22116:3;22112:12;22105:19;;21764:366;;;:::o;22136:419::-;22302:4;22340:2;22329:9;22325:18;22317:26;;22389:9;22383:4;22379:20;22375:1;22364:9;22360:17;22353:47;22417:131;22543:4;22417:131;:::i;:::-;22409:139;;22136:419;;;:::o;22561:332::-;22682:4;22720:2;22709:9;22705:18;22697:26;;22733:71;22801:1;22790:9;22786:17;22777:6;22733:71;:::i;:::-;22814:72;22882:2;22871:9;22867:18;22858:6;22814:72;:::i;:::-;22561:332;;;;;:::o;22899:137::-;22953:5;22984:6;22978:13;22969:22;;23000:30;23024:5;23000:30;:::i;:::-;22899:137;;;;:::o;23042:345::-;23109:6;23158:2;23146:9;23137:7;23133:23;23129:32;23126:119;;;23164:79;;:::i;:::-;23126:119;23284:1;23309:61;23362:7;23353:6;23342:9;23338:22;23309:61;:::i;:::-;23299:71;;23255:125;23042:345;;;;:::o;23393:180::-;23441:77;23438:1;23431:88;23538:4;23535:1;23528:15;23562:4;23559:1;23552:15;23579:233;23719:34;23715:1;23707:6;23703:14;23696:58;23788:16;23783:2;23775:6;23771:15;23764:41;23579:233;:::o;23818:366::-;23960:3;23981:67;24045:2;24040:3;23981:67;:::i;:::-;23974:74;;24057:93;24146:3;24057:93;:::i;:::-;24175:2;24170:3;24166:12;24159:19;;23818:366;;;:::o;24190:419::-;24356:4;24394:2;24383:9;24379:18;24371:26;;24443:9;24437:4;24433:20;24429:1;24418:9;24414:17;24407:47;24471:131;24597:4;24471:131;:::i;:::-;24463:139;;24190:419;;;:::o;24615:180::-;24663:77;24660:1;24653:88;24760:4;24757:1;24750:15;24784:4;24781:1;24774:15;24801:233;24840:3;24863:24;24881:5;24863:24;:::i;:::-;24854:33;;24909:66;24902:5;24899:77;24896:103;;24979:18;;:::i;:::-;24896:103;25026:1;25019:5;25015:13;25008:20;;24801:233;;;:::o;25040:147::-;25141:11;25178:3;25163:18;;25040:147;;;;:::o;25193:114::-;;:::o;25313:398::-;25472:3;25493:83;25574:1;25569:3;25493:83;:::i;:::-;25486:90;;25585:93;25674:3;25585:93;:::i;:::-;25703:1;25698:3;25694:11;25687:18;;25313:398;;;:::o;25717:379::-;25901:3;25923:147;26066:3;25923:147;:::i;:::-;25916:154;;26087:3;26080:10;;25717:379;;;:::o;26102:180::-;26242:32;26238:1;26230:6;26226:14;26219:56;26102:180;:::o;26288:366::-;26430:3;26451:67;26515:2;26510:3;26451:67;:::i;:::-;26444:74;;26527:93;26616:3;26527:93;:::i;:::-;26645:2;26640:3;26636:12;26629:19;;26288:366;;;:::o;26660:419::-;26826:4;26864:2;26853:9;26849:18;26841:26;;26913:9;26907:4;26903:20;26899:1;26888:9;26884:17;26877:47;26941:131;27067:4;26941:131;:::i;:::-;26933:139;;26660:419;;;:::o;27085:170::-;27225:22;27221:1;27213:6;27209:14;27202:46;27085:170;:::o;27261:366::-;27403:3;27424:67;27488:2;27483:3;27424:67;:::i;:::-;27417:74;;27500:93;27589:3;27500:93;:::i;:::-;27618:2;27613:3;27609:12;27602:19;;27261:366;;;:::o;27633:419::-;27799:4;27837:2;27826:9;27822:18;27814:26;;27886:9;27880:4;27876:20;27872:1;27861:9;27857:17;27850:47;27914:131;28040:4;27914:131;:::i;:::-;27906:139;;27633:419;;;:::o;28058:305::-;28098:3;28117:20;28135:1;28117:20;:::i;:::-;28112:25;;28151:20;28169:1;28151:20;:::i;:::-;28146:25;;28305:1;28237:66;28233:74;28230:1;28227:81;28224:107;;;28311:18;;:::i;:::-;28224:107;28355:1;28352;28348:9;28341:16;;28058:305;;;;:::o;28369:170::-;28509:22;28505:1;28497:6;28493:14;28486:46;28369:170;:::o;28545:366::-;28687:3;28708:67;28772:2;28767:3;28708:67;:::i;:::-;28701:74;;28784:93;28873:3;28784:93;:::i;:::-;28902:2;28897:3;28893:12;28886:19;;28545:366;;;:::o;28917:419::-;29083:4;29121:2;29110:9;29106:18;29098:26;;29170:9;29164:4;29160:20;29156:1;29145:9;29141:17;29134:47;29198:131;29324:4;29198:131;:::i;:::-;29190:139;;28917:419;;;:::o;29342:173::-;29482:25;29478:1;29470:6;29466:14;29459:49;29342:173;:::o;29521:366::-;29663:3;29684:67;29748:2;29743:3;29684:67;:::i;:::-;29677:74;;29760:93;29849:3;29760:93;:::i;:::-;29878:2;29873:3;29869:12;29862:19;;29521:366;;;:::o;29893:419::-;30059:4;30097:2;30086:9;30082:18;30074:26;;30146:9;30140:4;30136:20;30132:1;30121:9;30117:17;30110:47;30174:131;30300:4;30174:131;:::i;:::-;30166:139;;29893:419;;;:::o;30318:181::-;30458:33;30454:1;30446:6;30442:14;30435:57;30318:181;:::o;30505:366::-;30647:3;30668:67;30732:2;30727:3;30668:67;:::i;:::-;30661:74;;30744:93;30833:3;30744:93;:::i;:::-;30862:2;30857:3;30853:12;30846:19;;30505:366;;;:::o;30877:419::-;31043:4;31081:2;31070:9;31066:18;31058:26;;31130:9;31124:4;31120:20;31116:1;31105:9;31101:17;31094:47;31158:131;31284:4;31158:131;:::i;:::-;31150:139;;30877:419;;;:::o;31302:348::-;31342:7;31365:20;31383:1;31365:20;:::i;:::-;31360:25;;31399:20;31417:1;31399:20;:::i;:::-;31394:25;;31587:1;31519:66;31515:74;31512:1;31509:81;31504:1;31497:9;31490:17;31486:105;31483:131;;;31594:18;;:::i;:::-;31483:131;31642:1;31639;31635:9;31624:20;;31302:348;;;;:::o;31656:169::-;31796:21;31792:1;31784:6;31780:14;31773:45;31656:169;:::o;31831:366::-;31973:3;31994:67;32058:2;32053:3;31994:67;:::i;:::-;31987:74;;32070:93;32159:3;32070:93;:::i;:::-;32188:2;32183:3;32179:12;32172:19;;31831:366;;;:::o;32203:419::-;32369:4;32407:2;32396:9;32392:18;32384:26;;32456:9;32450:4;32446:20;32442:1;32431:9;32427:17;32420:47;32484:131;32610:4;32484:131;:::i;:::-;32476:139;;32203:419;;;:::o;32628:227::-;32768:34;32764:1;32756:6;32752:14;32745:58;32837:10;32832:2;32824:6;32820:15;32813:35;32628:227;:::o;32861:366::-;33003:3;33024:67;33088:2;33083:3;33024:67;:::i;:::-;33017:74;;33100:93;33189:3;33100:93;:::i;:::-;33218:2;33213:3;33209:12;33202:19;;32861:366;;;:::o;33233:419::-;33399:4;33437:2;33426:9;33422:18;33414:26;;33486:9;33480:4;33476:20;33472:1;33461:9;33457:17;33450:47;33514:131;33640:4;33514:131;:::i;:::-;33506:139;;33233:419;;;:::o;33658:165::-;33798:17;33794:1;33786:6;33782:14;33775:41;33658:165;:::o;33829:366::-;33971:3;33992:67;34056:2;34051:3;33992:67;:::i;:::-;33985:74;;34068:93;34157:3;34068:93;:::i;:::-;34186:2;34181:3;34177:12;34170:19;;33829:366;;;:::o;34201:419::-;34367:4;34405:2;34394:9;34390:18;34382:26;;34454:9;34448:4;34444:20;34440:1;34429:9;34425:17;34418:47;34482:131;34608:4;34482:131;:::i;:::-;34474:139;;34201:419;;;:::o;34626:228::-;34766:34;34762:1;34754:6;34750:14;34743:58;34835:11;34830:2;34822:6;34818:15;34811:36;34626:228;:::o;34860:366::-;35002:3;35023:67;35087:2;35082:3;35023:67;:::i;:::-;35016:74;;35099:93;35188:3;35099:93;:::i;:::-;35217:2;35212:3;35208:12;35201:19;;34860:366;;;:::o;35232:419::-;35398:4;35436:2;35425:9;35421:18;35413:26;;35485:9;35479:4;35475:20;35471:1;35460:9;35456:17;35449:47;35513:131;35639:4;35513:131;:::i;:::-;35505:139;;35232:419;;;:::o;35657:221::-;35797:34;35793:1;35785:6;35781:14;35774:58;35866:4;35861:2;35853:6;35849:15;35842:29;35657:221;:::o;35884:366::-;36026:3;36047:67;36111:2;36106:3;36047:67;:::i;:::-;36040:74;;36123:93;36212:3;36123:93;:::i;:::-;36241:2;36236:3;36232:12;36225:19;;35884:366;;;:::o;36256:419::-;36422:4;36460:2;36449:9;36445:18;36437:26;;36509:9;36503:4;36499:20;36495:1;36484:9;36480:17;36473:47;36537:131;36663:4;36537:131;:::i;:::-;36529:139;;36256:419;;;:::o;36681:229::-;36821:34;36817:1;36809:6;36805:14;36798:58;36890:12;36885:2;36877:6;36873:15;36866:37;36681:229;:::o;36916:366::-;37058:3;37079:67;37143:2;37138:3;37079:67;:::i;:::-;37072:74;;37155:93;37244:3;37155:93;:::i;:::-;37273:2;37268:3;37264:12;37257:19;;36916:366;;;:::o;37288:419::-;37454:4;37492:2;37481:9;37477:18;37469:26;;37541:9;37535:4;37531:20;37527:1;37516:9;37512:17;37505:47;37569:131;37695:4;37569:131;:::i;:::-;37561:139;;37288:419;;;:::o;37713:229::-;37853:34;37849:1;37841:6;37837:14;37830:58;37922:12;37917:2;37909:6;37905:15;37898:37;37713:229;:::o;37948:366::-;38090:3;38111:67;38175:2;38170:3;38111:67;:::i;:::-;38104:74;;38187:93;38276:3;38187:93;:::i;:::-;38305:2;38300:3;38296:12;38289:19;;37948:366;;;:::o;38320:419::-;38486:4;38524:2;38513:9;38509:18;38501:26;;38573:9;38567:4;38563:20;38559:1;38548:9;38544:17;38537:47;38601:131;38727:4;38601:131;:::i;:::-;38593:139;;38320:419;;;:::o;38745:235::-;38885:34;38881:1;38873:6;38869:14;38862:58;38954:18;38949:2;38941:6;38937:15;38930:43;38745:235;:::o;38986:366::-;39128:3;39149:67;39213:2;39208:3;39149:67;:::i;:::-;39142:74;;39225:93;39314:3;39225:93;:::i;:::-;39343:2;39338:3;39334:12;39327:19;;38986:366;;;:::o;39358:419::-;39524:4;39562:2;39551:9;39547:18;39539:26;;39611:9;39605:4;39601:20;39597:1;39586:9;39582:17;39575:47;39639:131;39765:4;39639:131;:::i;:::-;39631:139;;39358:419;;;:::o;39783:234::-;39923:34;39919:1;39911:6;39907:14;39900:58;39992:17;39987:2;39979:6;39975:15;39968:42;39783:234;:::o;40023:366::-;40165:3;40186:67;40250:2;40245:3;40186:67;:::i;:::-;40179:74;;40262:93;40351:3;40262:93;:::i;:::-;40380:2;40375:3;40371:12;40364:19;;40023:366;;;:::o;40395:419::-;40561:4;40599:2;40588:9;40584:18;40576:26;;40648:9;40642:4;40638:20;40634:1;40623:9;40619:17;40612:47;40676:131;40802:4;40676:131;:::i;:::-;40668:139;;40395:419;;;:::o;40820:148::-;40922:11;40959:3;40944:18;;40820:148;;;;:::o;40974:377::-;41080:3;41108:39;41141:5;41108:39;:::i;:::-;41163:89;41245:6;41240:3;41163:89;:::i;:::-;41156:96;;41261:52;41306:6;41301:3;41294:4;41287:5;41283:16;41261:52;:::i;:::-;41338:6;41333:3;41329:16;41322:23;;41084:267;40974:377;;;;:::o;41357:141::-;41406:4;41429:3;41421:11;;41452:3;41449:1;41442:14;41486:4;41483:1;41473:18;41465:26;;41357:141;;;:::o;41528:845::-;41631:3;41668:5;41662:12;41697:36;41723:9;41697:36;:::i;:::-;41749:89;41831:6;41826:3;41749:89;:::i;:::-;41742:96;;41869:1;41858:9;41854:17;41885:1;41880:137;;;;42031:1;42026:341;;;;41847:520;;41880:137;41964:4;41960:9;41949;41945:25;41940:3;41933:38;42000:6;41995:3;41991:16;41984:23;;41880:137;;42026:341;42093:38;42125:5;42093:38;:::i;:::-;42153:1;42167:154;42181:6;42178:1;42175:13;42167:154;;;42255:7;42249:14;42245:1;42240:3;42236:11;42229:35;42305:1;42296:7;42292:15;42281:26;;42203:4;42200:1;42196:12;42191:17;;42167:154;;;42350:6;42345:3;42341:16;42334:23;;42033:334;;41847:520;;41635:738;;41528:845;;;;:::o;42379:589::-;42604:3;42626:95;42717:3;42708:6;42626:95;:::i;:::-;42619:102;;42738:95;42829:3;42820:6;42738:95;:::i;:::-;42731:102;;42850:92;42938:3;42929:6;42850:92;:::i;:::-;42843:99;;42959:3;42952:10;;42379:589;;;;;;:::o;42974:225::-;43114:34;43110:1;43102:6;43098:14;43091:58;43183:8;43178:2;43170:6;43166:15;43159:33;42974:225;:::o;43205:366::-;43347:3;43368:67;43432:2;43427:3;43368:67;:::i;:::-;43361:74;;43444:93;43533:3;43444:93;:::i;:::-;43562:2;43557:3;43553:12;43546:19;;43205:366;;;:::o;43577:419::-;43743:4;43781:2;43770:9;43766:18;43758:26;;43830:9;43824:4;43820:20;43816:1;43805:9;43801:17;43794:47;43858:131;43984:4;43858:131;:::i;:::-;43850:139;;43577:419;;;:::o;44002:236::-;44142:34;44138:1;44130:6;44126:14;44119:58;44211:19;44206:2;44198:6;44194:15;44187:44;44002:236;:::o;44244:366::-;44386:3;44407:67;44471:2;44466:3;44407:67;:::i;:::-;44400:74;;44483:93;44572:3;44483:93;:::i;:::-;44601:2;44596:3;44592:12;44585:19;;44244:366;;;:::o;44616:419::-;44782:4;44820:2;44809:9;44805:18;44797:26;;44869:9;44863:4;44859:20;44855:1;44844:9;44840:17;44833:47;44897:131;45023:4;44897:131;:::i;:::-;44889:139;;44616:419;;;:::o;45041:231::-;45181:34;45177:1;45169:6;45165:14;45158:58;45250:14;45245:2;45237:6;45233:15;45226:39;45041:231;:::o;45278:366::-;45420:3;45441:67;45505:2;45500:3;45441:67;:::i;:::-;45434:74;;45517:93;45606:3;45517:93;:::i;:::-;45635:2;45630:3;45626:12;45619:19;;45278:366;;;:::o;45650:419::-;45816:4;45854:2;45843:9;45839:18;45831:26;;45903:9;45897:4;45893:20;45889:1;45878:9;45874:17;45867:47;45931:131;46057:4;45931:131;:::i;:::-;45923:139;;45650:419;;;:::o;46075:177::-;46215:29;46211:1;46203:6;46199:14;46192:53;46075:177;:::o;46258:366::-;46400:3;46421:67;46485:2;46480:3;46421:67;:::i;:::-;46414:74;;46497:93;46586:3;46497:93;:::i;:::-;46615:2;46610:3;46606:12;46599:19;;46258:366;;;:::o;46630:419::-;46796:4;46834:2;46823:9;46819:18;46811:26;;46883:9;46877:4;46873:20;46869:1;46858:9;46854:17;46847:47;46911:131;47037:4;46911:131;:::i;:::-;46903:139;;46630:419;;;:::o;47055:191::-;47095:4;47115:20;47133:1;47115:20;:::i;:::-;47110:25;;47149:20;47167:1;47149:20;:::i;:::-;47144:25;;47188:1;47185;47182:8;47179:34;;;47193:18;;:::i;:::-;47179:34;47238:1;47235;47231:9;47223:17;;47055:191;;;;:::o;47252:175::-;47392:27;47388:1;47380:6;47376:14;47369:51;47252:175;:::o;47433:366::-;47575:3;47596:67;47660:2;47655:3;47596:67;:::i;:::-;47589:74;;47672:93;47761:3;47672:93;:::i;:::-;47790:2;47785:3;47781:12;47774:19;;47433:366;;;:::o;47805:419::-;47971:4;48009:2;47998:9;47994:18;47986:26;;48058:9;48052:4;48048:20;48044:1;48033:9;48029:17;48022:47;48086:131;48212:4;48086:131;:::i;:::-;48078:139;;47805:419;;;:::o;48230:180::-;48278:77;48275:1;48268:88;48375:4;48372:1;48365:15;48399:4;48396:1;48389:15;48416:185;48456:1;48473:20;48491:1;48473:20;:::i;:::-;48468:25;;48507:20;48525:1;48507:20;:::i;:::-;48502:25;;48546:1;48536:35;;48551:18;;:::i;:::-;48536:35;48593:1;48590;48586:9;48581:14;;48416:185;;;;:::o;48607:176::-;48639:1;48656:20;48674:1;48656:20;:::i;:::-;48651:25;;48690:20;48708:1;48690:20;:::i;:::-;48685:25;;48729:1;48719:35;;48734:18;;:::i;:::-;48719:35;48775:1;48772;48768:9;48763:14;;48607:176;;;;:::o;48789:228::-;48929:34;48925:1;48917:6;48913:14;48906:58;48998:11;48993:2;48985:6;48981:15;48974:36;48789:228;:::o;49023:366::-;49165:3;49186:67;49250:2;49245:3;49186:67;:::i;:::-;49179:74;;49262:93;49351:3;49262:93;:::i;:::-;49380:2;49375:3;49371:12;49364:19;;49023:366;;;:::o;49395:419::-;49561:4;49599:2;49588:9;49584:18;49576:26;;49648:9;49642:4;49638:20;49634:1;49623:9;49619:17;49612:47;49676:131;49802:4;49676:131;:::i;:::-;49668:139;;49395:419;;;:::o;49820:223::-;49960:34;49956:1;49948:6;49944:14;49937:58;50029:6;50024:2;50016:6;50012:15;50005:31;49820:223;:::o;50049:366::-;50191:3;50212:67;50276:2;50271:3;50212:67;:::i;:::-;50205:74;;50288:93;50377:3;50288:93;:::i;:::-;50406:2;50401:3;50397:12;50390:19;;50049:366;;;:::o;50421:419::-;50587:4;50625:2;50614:9;50610:18;50602:26;;50674:9;50668:4;50664:20;50660:1;50649:9;50645:17;50638:47;50702:131;50828:4;50702:131;:::i;:::-;50694:139;;50421:419;;;:::o;50846:237::-;50986:34;50982:1;50974:6;50970:14;50963:58;51055:20;51050:2;51042:6;51038:15;51031:45;50846:237;:::o;51089:366::-;51231:3;51252:67;51316:2;51311:3;51252:67;:::i;:::-;51245:74;;51328:93;51417:3;51328:93;:::i;:::-;51446:2;51441:3;51437:12;51430:19;;51089:366;;;:::o;51461:419::-;51627:4;51665:2;51654:9;51650:18;51642:26;;51714:9;51708:4;51704:20;51700:1;51689:9;51685:17;51678:47;51742:131;51868:4;51742:131;:::i;:::-;51734:139;;51461:419;;;:::o;51886:182::-;52026:34;52022:1;52014:6;52010:14;52003:58;51886:182;:::o;52074:366::-;52216:3;52237:67;52301:2;52296:3;52237:67;:::i;:::-;52230:74;;52313:93;52402:3;52313:93;:::i;:::-;52431:2;52426:3;52422:12;52415:19;;52074:366;;;:::o;52446:419::-;52612:4;52650:2;52639:9;52635:18;52627:26;;52699:9;52693:4;52689:20;52685:1;52674:9;52670:17;52663:47;52727:131;52853:4;52727:131;:::i;:::-;52719:139;;52446:419;;;:::o;52871:178::-;53011:30;53007:1;52999:6;52995:14;52988:54;52871:178;:::o;53055:366::-;53197:3;53218:67;53282:2;53277:3;53218:67;:::i;:::-;53211:74;;53294:93;53383:3;53294:93;:::i;:::-;53412:2;53407:3;53403:12;53396:19;;53055:366;;;:::o;53427:419::-;53593:4;53631:2;53620:9;53616:18;53608:26;;53680:9;53674:4;53670:20;53666:1;53655:9;53651:17;53644:47;53708:131;53834:4;53708:131;:::i;:::-;53700:139;;53427:419;;;:::o;53852:98::-;53903:6;53937:5;53931:12;53921:22;;53852:98;;;:::o;53956:168::-;54039:11;54073:6;54068:3;54061:19;54113:4;54108:3;54104:14;54089:29;;53956:168;;;;:::o;54130:360::-;54216:3;54244:38;54276:5;54244:38;:::i;:::-;54298:70;54361:6;54356:3;54298:70;:::i;:::-;54291:77;;54377:52;54422:6;54417:3;54410:4;54403:5;54399:16;54377:52;:::i;:::-;54454:29;54476:6;54454:29;:::i;:::-;54449:3;54445:39;54438:46;;54220:270;54130:360;;;;:::o;54496:640::-;54691:4;54729:3;54718:9;54714:19;54706:27;;54743:71;54811:1;54800:9;54796:17;54787:6;54743:71;:::i;:::-;54824:72;54892:2;54881:9;54877:18;54868:6;54824:72;:::i;:::-;54906;54974:2;54963:9;54959:18;54950:6;54906:72;:::i;:::-;55025:9;55019:4;55015:20;55010:2;54999:9;54995:18;54988:48;55053:76;55124:4;55115:6;55053:76;:::i;:::-;55045:84;;54496:640;;;;;;;:::o;55142:141::-;55198:5;55229:6;55223:13;55214:22;;55245:32;55271:5;55245:32;:::i;:::-;55142:141;;;;:::o;55289:349::-;55358:6;55407:2;55395:9;55386:7;55382:23;55378:32;55375:119;;;55413:79;;:::i;:::-;55375:119;55533:1;55558:63;55613:7;55604:6;55593:9;55589:22;55558:63;:::i;:::-;55548:73;;55504:127;55289:349;;;;:::o
Swarm Source
ipfs://cd7c63f30a7e3dbe711477266084f003857e4c08a33d683281e85444d437dc86
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.