More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 878,119 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 18111199 | 11 hrs ago | IN | 0 ETH | 0.00000183 | ||||
Set Approval For... | 18109512 | 13 hrs ago | IN | 0 ETH | 0.00000358 | ||||
Set Approval For... | 18085178 | 31 hrs ago | IN | 0 ETH | 0.00000312 | ||||
Set Approval For... | 18078630 | 36 hrs ago | IN | 0 ETH | 0.00000241 | ||||
Set Approval For... | 18073269 | 40 hrs ago | IN | 0 ETH | 0.00000175 | ||||
Set Approval For... | 18055145 | 2 days ago | IN | 0 ETH | 0.00000342 | ||||
Set Approval For... | 18053821 | 2 days ago | IN | 0 ETH | 0.00000186 | ||||
Set Approval For... | 18049792 | 2 days ago | IN | 0 ETH | 0.00000217 | ||||
Set Approval For... | 18046597 | 2 days ago | IN | 0 ETH | 0.00000756 | ||||
Set Approval For... | 18036629 | 2 days ago | IN | 0 ETH | 0.00000656 | ||||
Set Approval For... | 18030974 | 3 days ago | IN | 0 ETH | 0.00000266 | ||||
Set Approval For... | 18029119 | 3 days ago | IN | 0 ETH | 0.00000169 | ||||
Set Approval For... | 18028239 | 3 days ago | IN | 0 ETH | 0.00000251 | ||||
Set Approval For... | 18024388 | 3 days ago | IN | 0 ETH | 0.00000225 | ||||
Set Approval For... | 18023226 | 3 days ago | IN | 0 ETH | 0.0000032 | ||||
Set Approval For... | 18008724 | 3 days ago | IN | 0 ETH | 0.00000318 | ||||
Set Approval For... | 17998164 | 4 days ago | IN | 0 ETH | 0.00000169 | ||||
Set Approval For... | 17996610 | 4 days ago | IN | 0 ETH | 0.00000629 | ||||
Set Approval For... | 17969537 | 5 days ago | IN | 0 ETH | 0.00000245 | ||||
Set Approval For... | 17969013 | 5 days ago | IN | 0 ETH | 0.00000344 | ||||
Set Approval For... | 17968590 | 5 days ago | IN | 0 ETH | 0.00000164 | ||||
Set Approval For... | 17959212 | 5 days ago | IN | 0 ETH | 0.00000177 | ||||
Set Approval For... | 17950887 | 5 days ago | IN | 0 ETH | 0.00000316 | ||||
Set Approval For... | 17907136 | 6 days ago | IN | 0 ETH | 0.00000157 | ||||
Set Approval For... | 17905465 | 7 days ago | IN | 0 ETH | 0.00000251 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13983833 | 107 days ago | 0 ETH | ||||
10218749 | 197 days ago | 0 ETH | ||||
8903892 | 227 days ago | 0 ETH | ||||
5865388 | 298 days ago | 0 ETH | ||||
5785337 | 300 days ago | 0 ETH | ||||
4697319 | 332 days ago | 0 ETH | ||||
4666305 | 333 days ago | 0 ETH | ||||
4646025 | 334 days ago | 0 ETH | ||||
4384817 | 343 days ago | 0 ETH | ||||
4374586 | 344 days ago | 0 ETH | ||||
4374447 | 344 days ago | 0 ETH | ||||
4175150 | 351 days ago | 0 ETH | ||||
3945822 | 359 days ago | 0 ETH | ||||
3942352 | 359 days ago | 0 ETH | ||||
3796305 | 364 days ago | 0 ETH | ||||
3788906 | 364 days ago | 0 ETH | ||||
3781935 | 364 days ago | 0 ETH | ||||
3772519 | 365 days ago | 0 ETH | ||||
3768628 | 365 days ago | 0 ETH | ||||
3763047 | 365 days ago | 0 ETH | ||||
3754161 | 365 days ago | 0 ETH | ||||
3752205 | 365 days ago | 0 ETH | ||||
3745659 | 365 days ago | 0 ETH | ||||
3744093 | 366 days ago | 0 ETH | ||||
3742725 | 366 days ago | 0 ETH |
Loading...
Loading
Contract Name:
SocialScanBadge
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at lineascan.build/ on 2024-02-09 */ pragma solidity ^0.8.7; pragma experimental ABIEncoderV2; // SPDX-License-Identifier: MIT /** * @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); } /** * @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 payable; /** * @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 payable; } /** * @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); } /** * @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); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /* * @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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @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; } } /** * @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 Ownable, 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}. 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 || ERC721.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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 payable override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual payable 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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `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 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 {} } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } function tokensOfOwner(address owner) public view returns (uint256[] memory) { uint256[] memory memoryArray = new uint256[](ERC721.balanceOf(owner)); for (uint i = 0; i < ERC721.balanceOf(owner); i++) { memoryArray[i] = _ownedTokens[owner][i]; } return memoryArray; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** * @dev ERC721 token with storage based token uri management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } contract SocialScanBadge is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, AccessControl, ERC721Burnable { bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bool _publicMint; constructor(string memory name_, string memory symbol_, bool publicMint) ERC721(name_, symbol_) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); _publicMint = publicMint; } function pause() public { require( hasRole(PAUSER_ROLE, _msgSender()), "SocialScanBadge: must have pauser role to pause" ); _pause(); } function unpause() public { require( hasRole(PAUSER_ROLE, _msgSender()), "SocialScanBadge: must have pauser role to pause" ); _unpause(); } /** * @dev Function to mint tokens. * @param to The address that will receive the minted tokens. * @param tokenId The token id to mint. * @param uri The token URI of the minted token. * @return A boolean that indicates if the operation was successful. */ function mintWithTokenURI( address to, uint256 tokenId, string memory uri ) public returns (bool) { if (!_publicMint) { require( hasRole(MINTER_ROLE, _msgSender()), "SocialScanBadge: must have minter role to mint" ); } _safeMint(to, tokenId); _setTokenURI(tokenId, uri); return true; } function getInfoHash( address _to, uint256 _tokenId ) public pure returns (bytes32) { return keccak256( abi.encode(_to, _tokenId) ); } /* Mint if have been pre-approved using signature of the owner */ function mintWithSignature(address signer, address to, uint256 tokenID, string memory uri, bytes calldata signature) payable public { require(hasRole(MINTER_ROLE, signer), "The signer does not have the required role"); bytes32 infoHash = getInfoHash(to, tokenID); require(recoverSigner(infoHash, signature) == signer, "The signature provided does not match"); _safeMint(to, tokenID); _setTokenURI(tokenID, uri); } function recoverSigner( bytes32 _ethSignedMessageHash, bytes memory _signature ) internal pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } function splitSignature( bytes memory sig ) internal pure returns (bytes32 r, bytes32 s, uint8 v) { require(sig.length == 65, "invalid signature length"); assembly { /* First 32 bytes stores the length of the signature add(sig, 32) = pointer of sig + 32 effectively, skips first 32 bytes of signature mload(p) loads next 32 bytes starting at the memory address p into memory */ // first 32 bytes, after the length prefix r := mload(add(sig, 32)) // second 32 bytes s := mload(add(sig, 64)) // final byte (first byte of the next 32 bytes) v := byte(0, mload(add(sig, 96))) } // implicitly return (r, s, v) } function safeTransfer(address to, uint256 tokenId, bytes calldata data) public virtual { super._safeTransfer(_msgSender(), to, tokenId, data); } function safeTransfer(address to, uint256 tokenId) public virtual { super._safeTransfer(_msgSender(), to, tokenId, ""); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721, ERC721Enumerable) { require(from == address(0), "Err: token transfer is BLOCKED"); super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"bool","name":"publicMint","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getInfoHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","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":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWithSignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"mintWithTokenURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005f2238038062005f22833981810160405281019062000037919062000572565b8282620000596200004d6200016360201b60201c565b6200016b60201b60201c565b81600190816200006a919062000857565b5080600290816200007c919062000857565b5050506000600c60006101000a81548160ff021916908315150217905550620000be6000801b620000b26200016360201b60201c565b6200022f60201b60201c565b620000ff7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000f36200016360201b60201c565b6200022f60201b60201c565b620001407f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001346200016360201b60201c565b6200022f60201b60201c565b80600e60006101000a81548160ff0219169083151502179055505050506200093e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200024182826200024560201b60201c565b5050565b6200025782826200033760201b60201c565b62000333576001600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002d86200016360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200040b82620003c0565b810181811067ffffffffffffffff821117156200042d576200042c620003d1565b5b80604052505050565b600062000442620003a2565b905062000450828262000400565b919050565b600067ffffffffffffffff821115620004735762000472620003d1565b5b6200047e82620003c0565b9050602081019050919050565b60005b83811015620004ab5780820151818401526020810190506200048e565b60008484015250505050565b6000620004ce620004c88462000455565b62000436565b905082815260208101848484011115620004ed57620004ec620003bb565b5b620004fa8482856200048b565b509392505050565b600082601f8301126200051a5762000519620003b6565b5b81516200052c848260208601620004b7565b91505092915050565b60008115159050919050565b6200054c8162000535565b81146200055857600080fd5b50565b6000815190506200056c8162000541565b92915050565b6000806000606084860312156200058e576200058d620003ac565b5b600084015167ffffffffffffffff811115620005af57620005ae620003b1565b5b620005bd8682870162000502565b935050602084015167ffffffffffffffff811115620005e157620005e0620003b1565b5b620005ef8682870162000502565b925050604062000602868287016200055b565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065f57607f821691505b60208210810362000675576200067462000617565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620006a0565b620006eb8683620006a0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000738620007326200072c8462000703565b6200070d565b62000703565b9050919050565b6000819050919050565b620007548362000717565b6200076c62000763826200073f565b848454620006ad565b825550505050565b600090565b6200078362000774565b6200079081848462000749565b505050565b5b81811015620007b857620007ac60008262000779565b60018101905062000796565b5050565b601f8211156200080757620007d1816200067b565b620007dc8462000690565b81016020851015620007ec578190505b62000804620007fb8562000690565b83018262000795565b50505b505050565b600082821c905092915050565b60006200082c600019846008026200080c565b1980831691505092915050565b600062000847838362000819565b9150826002028217905092915050565b62000862826200060c565b67ffffffffffffffff8111156200087e576200087d620003d1565b5b6200088a825462000646565b62000897828285620007bc565b600060209050601f831160018114620008cf5760008415620008ba578287015190505b620008c6858262000839565b86555062000936565b601f198416620008df866200067b565b60005b828110156200090957848901518255600182019150602085019450602081019050620008e2565b8683101562000929578489015162000925601f89168262000819565b8355505b6001600288020188555050505b505050505050565b6155d4806200094e6000396000f3fe60806040526004361061021a5760003560e01c80635c975abb11610123578063a217fddf116100ab578063d547741f1161006f578063d547741f146107e0578063e63ab1e914610809578063e985e9c514610834578063eb79554914610871578063f2fde38b1461089a5761021a565b8063a217fddf14610708578063a22cb46514610733578063b88d4fde1461075c578063c87b56dd14610778578063d5391393146107b55761021a565b80638456cb59116100f25780638456cb59146106215780638462151c146106385780638da5cb5b1461067557806391d14854146106a057806395d89b41146106dd5761021a565b80635c975abb146105655780636352211e1461059057806370a08231146105cd578063715018a61461060a5761021a565b80632f2ff15d116101a6578063423f6cef11610175578063423f6cef1461047d57806342842e0e146104a657806342966c68146104c25780634f6ccce7146104eb57806350bb4e7f146105285761021a565b80632f2ff15d146103d75780632f745c591461040057806336568abe1461043d5780633f4ba83a146104665761021a565b8063095ea7b3116101ed578063095ea7b31461030157806318160ddd1461032a5780631a3e7c8b1461035557806323b872dd14610371578063248a9ca31461039a5761021a565b806301ffc9a71461021f57806303f167391461025c57806306fdde0314610299578063081812fc146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613480565b6108c3565b60405161025391906134c8565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e9190613577565b6108d5565b60405161029091906135d0565b60405180910390f35b3480156102a557600080fd5b506102ae610908565b6040516102bb919061367b565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e6919061369d565b61099a565b6040516102f891906136d9565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190613577565b610a1f565b005b34801561033657600080fd5b5061033f610b36565b60405161034c9190613703565b60405180910390f35b61036f600480360381019061036a91906138b3565b610b43565b005b34801561037d57600080fd5b5061039860048036038101906103939190613969565b610c92565b005b3480156103a657600080fd5b506103c160048036038101906103bc91906139e8565b610cf2565b6040516103ce91906135d0565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613a15565b610d12565b005b34801561040c57600080fd5b5061042760048036038101906104229190613577565b610d78565b6040516104349190613703565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613a15565b610e1d565b005b34801561047257600080fd5b5061047b610ea0565b005b34801561048957600080fd5b506104a4600480360381019061049f9190613577565b610f1a565b005b6104c060048036038101906104bb9190613969565b610f40565b005b3480156104ce57600080fd5b506104e960048036038101906104e4919061369d565b610f60565b005b3480156104f757600080fd5b50610512600480360381019061050d919061369d565b610fbc565b60405161051f9190613703565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190613a55565b61102d565b60405161055c91906134c8565b60405180910390f35b34801561057157600080fd5b5061057a6110d3565b60405161058791906134c8565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b2919061369d565b6110ea565b6040516105c491906136d9565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef9190613ac4565b61119b565b6040516106019190613703565b60405180910390f35b34801561061657600080fd5b5061061f611252565b005b34801561062d57600080fd5b506106366112da565b005b34801561064457600080fd5b5061065f600480360381019061065a9190613ac4565b611354565b60405161066c9190613baf565b60405180910390f35b34801561068157600080fd5b5061068a61144b565b60405161069791906136d9565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190613a15565b611474565b6040516106d491906134c8565b60405180910390f35b3480156106e957600080fd5b506106f26114df565b6040516106ff919061367b565b60405180910390f35b34801561071457600080fd5b5061071d611571565b60405161072a91906135d0565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190613bfd565b611578565b005b61077660048036038101906107719190613cde565b6116f8565b005b34801561078457600080fd5b5061079f600480360381019061079a919061369d565b61175a565b6040516107ac919061367b565b60405180910390f35b3480156107c157600080fd5b506107ca61176c565b6040516107d791906135d0565b60405180910390f35b3480156107ec57600080fd5b5061080760048036038101906108029190613a15565b611790565b005b34801561081557600080fd5b5061081e6117f6565b60405161082b91906135d0565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613d61565b61181a565b60405161086891906134c8565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613da1565b6118ae565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613ac4565b61190b565b005b60006108ce82611a02565b9050919050565b600082826040516020016108ea929190613e15565b60405160208183030381529060405280519060200120905092915050565b60606001805461091790613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461094390613e6d565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050905090565b60006109a582611a7c565b6109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db90613f10565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2a826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190613fa2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab9611ae8565b73ffffffffffffffffffffffffffffffffffffffff161480610ae85750610ae781610ae2611ae8565b61181a565b5b610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90614034565b60405180910390fd5b610b318383611af0565b505050565b6000600980549050905090565b610b6d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a687611474565b610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba3906140c6565b60405180910390fd5b6000610bb886866108d5565b90508673ffffffffffffffffffffffffffffffffffffffff16610c1f8285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ba9565b73ffffffffffffffffffffffffffffffffffffffff1614610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90614158565b60405180910390fd5b610c7f8686611c18565b610c898585611c36565b50505050505050565b610ca3610c9d611ae8565b82611ca3565b610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd9906141ea565b60405180910390fd5b610ced838383611d81565b505050565b6000600d6000838152602001908152602001600020600101549050919050565b610d2b610d1e83610cf2565b610d26611ae8565b611474565b610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d619061427c565b60405180910390fd5b610d748282611fdc565b5050565b6000610d838361119b565b8210610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9061430e565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e25611ae8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e89906143a0565b60405180910390fd5b610e9c82826120bd565b5050565b610ed17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ecc611ae8565b611474565b610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790614432565b60405180910390fd5b610f1861219f565b565b610f3c610f25611ae8565b838360405180602001604052806000815250612241565b5050565b610f5b838383604051806020016040528060008152506116f8565b505050565b610f71610f6b611ae8565b82611ca3565b610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa7906144c4565b60405180910390fd5b610fb98161229d565b50565b6000610fc6610b36565b8210611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe90614556565b60405180910390fd5b6009828154811061101b5761101a614576565b5b90600052602060002001549050919050565b6000600e60009054906101000a900460ff166110b4576110747f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661106f611ae8565b611474565b6110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90614617565b60405180910390fd5b5b6110be8484611c18565b6110c88383611c36565b600190509392505050565b6000600c60009054906101000a900460ff16905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611189906146a9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361120b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112029061473b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61125a611ae8565b73ffffffffffffffffffffffffffffffffffffffff1661127861144b565b73ffffffffffffffffffffffffffffffffffffffff16146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c5906147a7565b60405180910390fd5b6112d860006122a9565b565b61130b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611306611ae8565b611474565b61134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190614432565b60405180910390fd5b61135261236d565b565b606060006113618361119b565b67ffffffffffffffff81111561137a57611379613728565b5b6040519080825280602002602001820160405280156113a85781602001602082028036833780820191505090505b50905060005b6113b78461119b565b81101561144157600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008281526020019081526020016000205482828151811061142257611421614576565b5b6020026020010181815250508080611439906147f6565b9150506113ae565b5080915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600280546114ee90613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461151a90613e6d565b80156115675780601f1061153c57610100808354040283529160200191611567565b820191906000526020600020905b81548152906001019060200180831161154a57829003601f168201915b5050505050905090565b6000801b81565b611580611ae8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e49061488a565b60405180910390fd5b80600660006115fa611ae8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116a7611ae8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ec91906134c8565b60405180910390a35050565b611709611703611ae8565b83611ca3565b611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f906141ea565b60405180910390fd5b61175484848484612241565b50505050565b606061176582612410565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6117a961179c83610cf2565b6117a4611ae8565b611474565b6117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df9061491c565b60405180910390fd5b6117f282826120bd565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119056118b9611ae8565b858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612241565b50505050565b611913611ae8565b73ffffffffffffffffffffffffffffffffffffffff1661193161144b565b73ffffffffffffffffffffffffffffffffffffffff1614611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e906147a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed906149ae565b60405180910390fd5b6119ff816122a9565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a755750611a7482612561565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b63836110ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600080611bb8856125db565b92509250925060018682858560405160008152602001604052604051611be194939291906149ea565b6020604051602081039080840390855afa158015611c03573d6000803e3d6000fd5b50505060206040510351935050505092915050565b611c32828260405180602001604052806000815250612643565b5050565b611c3f82611a7c565b611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7590614aa1565b60405180910390fd5b80600b60008481526020019081526020016000209081611c9e9190614c6d565b505050565b6000611cae82611a7c565b611ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce490614db1565b60405180910390fd5b6000611cf8836110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d6757508373ffffffffffffffffffffffffffffffffffffffff16611d4f8461099a565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d785750611d77818561181a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611da1826110ea565b73ffffffffffffffffffffffffffffffffffffffff1614611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee90614e43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5d90614ed5565b60405180910390fd5b611e7183838361269e565b611e7c600082611af0565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ecc9190614ef5565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f239190614f29565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fe68282611474565b6120b9576001600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061205e611ae8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6120c78282611474565b1561219b576000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612140611ae8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6121a76110d3565b6121e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dd90614fa9565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61222a611ae8565b60405161223791906136d9565b60405180910390a1565b61224c848484611d81565b61225884848484612765565b612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228e9061503b565b60405180910390fd5b50505050565b6122a6816128ec565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123756110d3565b156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac906150a7565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123f9611ae8565b60405161240691906136d9565b60405180910390a1565b606061241b82611a7c565b61245a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245190615139565b60405180910390fd5b6000600b6000848152602001908152602001600020805461247a90613e6d565b80601f01602080910402602001604051908101604052809291908181526020018280546124a690613e6d565b80156124f35780601f106124c8576101008083540402835291602001916124f3565b820191906000526020600020905b8154815290600101906020018083116124d657829003601f168201915b50505050509050600061250461293f565b9050600081510361251957819250505061255c565b60008251111561254e578082604051602001612536929190615195565b6040516020818303038152906040529250505061255c565b61255784612956565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125d457506125d3826129fd565b5b9050919050565b60008060006041845114612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261b90615205565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b61264d8383612adf565b61265a6000848484612765565b612699576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126909061503b565b60405180910390fd5b505050565b6126a66110d3565b156126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd906150a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274c90615271565b60405180910390fd5b612760838383612cac565b505050565b60006127868473ffffffffffffffffffffffffffffffffffffffff16612dbe565b156128df578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127af611ae8565b8786866040518563ffffffff1660e01b81526004016127d194939291906152e6565b6020604051808303816000875af192505050801561280d57506040513d601f19601f8201168201806040525081019061280a9190615347565b60015b61288f573d806000811461283d576040519150601f19603f3d011682016040523d82523d6000602084013e612842565b606091505b506000815103612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e9061503b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128e4565b600190505b949350505050565b6128f581612dd1565b6000600b6000838152602001908152602001600020805461291590613e6d565b90501461293c57600b6000828152602001908152602001600020600061293b91906133b7565b5b50565b606060405180602001604052806000815250905090565b606061296182611a7c565b6129a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612997906153e6565b60405180910390fd5b60006129aa61293f565b905060008151116129ca57604051806020016040528060008152506129f5565b806129d484612ee2565b6040516020016129e5929190615195565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ac857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ad85750612ad782613042565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4590615452565b60405180910390fd5b612b5781611a7c565b15612b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8e906154be565b60405180910390fd5b612ba36000838361269e565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf39190614f29565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612cb78383836130ac565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cf957612cf4816130b1565b612d38565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d3757612d3683826130fa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d7a57612d7581613267565b612db9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612db857612db78282613338565b5b5b505050565b600080823b905060008111915050919050565b6000612ddc826110ea565b9050612dea8160008461269e565b612df5600083611af0565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e459190614ef5565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606060008203612f29576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061303d565b600082905060005b60008214612f5b578080612f44906147f6565b915050600a82612f54919061550d565b9150612f31565b60008167ffffffffffffffff811115612f7757612f76613728565b5b6040519080825280601f01601f191660200182016040528015612fa95781602001600182028036833780820191505090505b5090505b6000851461303657600182612fc29190614ef5565b9150600a85612fd1919061553e565b6030612fdd9190614f29565b60f81b818381518110612ff357612ff2614576565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561302f919061550d565b9450612fad565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131078461119b565b6131119190614ef5565b90506000600860008481526020019081526020016000205490508181146131f6576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061327b9190614ef5565b90506000600a60008481526020019081526020016000205490506000600983815481106132ab576132aa614576565b5b9060005260206000200154905080600983815481106132cd576132cc614576565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061331c5761331b61556f565b5b6001900381819060005260206000200160009055905550505050565b60006133438361119b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b5080546133c390613e6d565b6000825580601f106133d557506133f4565b601f0160209004906000526020600020908101906133f391906133f7565b5b50565b5b808211156134105760008160009055506001016133f8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61345d81613428565b811461346857600080fd5b50565b60008135905061347a81613454565b92915050565b6000602082840312156134965761349561341e565b5b60006134a48482850161346b565b91505092915050565b60008115159050919050565b6134c2816134ad565b82525050565b60006020820190506134dd60008301846134b9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061350e826134e3565b9050919050565b61351e81613503565b811461352957600080fd5b50565b60008135905061353b81613515565b92915050565b6000819050919050565b61355481613541565b811461355f57600080fd5b50565b6000813590506135718161354b565b92915050565b6000806040838503121561358e5761358d61341e565b5b600061359c8582860161352c565b92505060206135ad85828601613562565b9150509250929050565b6000819050919050565b6135ca816135b7565b82525050565b60006020820190506135e560008301846135c1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561362557808201518184015260208101905061360a565b60008484015250505050565b6000601f19601f8301169050919050565b600061364d826135eb565b61365781856135f6565b9350613667818560208601613607565b61367081613631565b840191505092915050565b600060208201905081810360008301526136958184613642565b905092915050565b6000602082840312156136b3576136b261341e565b5b60006136c184828501613562565b91505092915050565b6136d381613503565b82525050565b60006020820190506136ee60008301846136ca565b92915050565b6136fd81613541565b82525050565b600060208201905061371860008301846136f4565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61376082613631565b810181811067ffffffffffffffff8211171561377f5761377e613728565b5b80604052505050565b6000613792613414565b905061379e8282613757565b919050565b600067ffffffffffffffff8211156137be576137bd613728565b5b6137c782613631565b9050602081019050919050565b82818337600083830152505050565b60006137f66137f1846137a3565b613788565b90508281526020810184848401111561381257613811613723565b5b61381d8482856137d4565b509392505050565b600082601f83011261383a5761383961371e565b5b813561384a8482602086016137e3565b91505092915050565b600080fd5b600080fd5b60008083601f8401126138735761387261371e565b5b8235905067ffffffffffffffff8111156138905761388f613853565b5b6020830191508360018202830111156138ac576138ab613858565b5b9250929050565b60008060008060008060a087890312156138d0576138cf61341e565b5b60006138de89828a0161352c565b96505060206138ef89828a0161352c565b955050604061390089828a01613562565b945050606087013567ffffffffffffffff81111561392157613920613423565b5b61392d89828a01613825565b935050608087013567ffffffffffffffff81111561394e5761394d613423565b5b61395a89828a0161385d565b92509250509295509295509295565b6000806000606084860312156139825761398161341e565b5b60006139908682870161352c565b93505060206139a18682870161352c565b92505060406139b286828701613562565b9150509250925092565b6139c5816135b7565b81146139d057600080fd5b50565b6000813590506139e2816139bc565b92915050565b6000602082840312156139fe576139fd61341e565b5b6000613a0c848285016139d3565b91505092915050565b60008060408385031215613a2c57613a2b61341e565b5b6000613a3a858286016139d3565b9250506020613a4b8582860161352c565b9150509250929050565b600080600060608486031215613a6e57613a6d61341e565b5b6000613a7c8682870161352c565b9350506020613a8d86828701613562565b925050604084013567ffffffffffffffff811115613aae57613aad613423565b5b613aba86828701613825565b9150509250925092565b600060208284031215613ada57613ad961341e565b5b6000613ae88482850161352c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b2681613541565b82525050565b6000613b388383613b1d565b60208301905092915050565b6000602082019050919050565b6000613b5c82613af1565b613b668185613afc565b9350613b7183613b0d565b8060005b83811015613ba2578151613b898882613b2c565b9750613b9483613b44565b925050600181019050613b75565b5085935050505092915050565b60006020820190508181036000830152613bc98184613b51565b905092915050565b613bda816134ad565b8114613be557600080fd5b50565b600081359050613bf781613bd1565b92915050565b60008060408385031215613c1457613c1361341e565b5b6000613c228582860161352c565b9250506020613c3385828601613be8565b9150509250929050565b600067ffffffffffffffff821115613c5857613c57613728565b5b613c6182613631565b9050602081019050919050565b6000613c81613c7c84613c3d565b613788565b905082815260208101848484011115613c9d57613c9c613723565b5b613ca88482856137d4565b509392505050565b600082601f830112613cc557613cc461371e565b5b8135613cd5848260208601613c6e565b91505092915050565b60008060008060808587031215613cf857613cf761341e565b5b6000613d068782880161352c565b9450506020613d178782880161352c565b9350506040613d2887828801613562565b925050606085013567ffffffffffffffff811115613d4957613d48613423565b5b613d5587828801613cb0565b91505092959194509250565b60008060408385031215613d7857613d7761341e565b5b6000613d868582860161352c565b9250506020613d978582860161352c565b9150509250929050565b60008060008060608587031215613dbb57613dba61341e565b5b6000613dc98782880161352c565b9450506020613dda87828801613562565b935050604085013567ffffffffffffffff811115613dfb57613dfa613423565b5b613e078782880161385d565b925092505092959194509250565b6000604082019050613e2a60008301856136ca565b613e3760208301846136f4565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e8557607f821691505b602082108103613e9857613e97613e3e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613efa602c836135f6565b9150613f0582613e9e565b604082019050919050565b60006020820190508181036000830152613f2981613eed565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f8c6021836135f6565b9150613f9782613f30565b604082019050919050565b60006020820190508181036000830152613fbb81613f7f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061401e6038836135f6565b915061402982613fc2565b604082019050919050565b6000602082019050818103600083015261404d81614011565b9050919050565b7f546865207369676e657220646f6573206e6f742068617665207468652072657160008201527f756972656420726f6c6500000000000000000000000000000000000000000000602082015250565b60006140b0602a836135f6565b91506140bb82614054565b604082019050919050565b600060208201905081810360008301526140df816140a3565b9050919050565b7f546865207369676e61747572652070726f766964656420646f6573206e6f742060008201527f6d61746368000000000000000000000000000000000000000000000000000000602082015250565b60006141426025836135f6565b915061414d826140e6565b604082019050919050565b6000602082019050818103600083015261417181614135565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006141d46031836135f6565b91506141df82614178565b604082019050919050565b60006020820190508181036000830152614203816141c7565b9050919050565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f206772616e740000000000000000000000000000000000602082015250565b6000614266602f836135f6565b91506142718261420a565b604082019050919050565b6000602082019050818103600083015261429581614259565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006142f8602b836135f6565b91506143038261429c565b604082019050919050565b60006020820190508181036000830152614327816142eb565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061438a602f836135f6565b91506143958261432e565b604082019050919050565b600060208201905081810360008301526143b98161437d565b9050919050565b7f536f6369616c5363616e42616467653a206d757374206861766520706175736560008201527f7220726f6c6520746f2070617573650000000000000000000000000000000000602082015250565b600061441c602f836135f6565b9150614427826143c0565b604082019050919050565b6000602082019050818103600083015261444b8161440f565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b60006144ae6030836135f6565b91506144b982614452565b604082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614540602c836135f6565b915061454b826144e4565b604082019050919050565b6000602082019050818103600083015261456f81614533565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f536f6369616c5363616e42616467653a206d7573742068617665206d696e746560008201527f7220726f6c6520746f206d696e74000000000000000000000000000000000000602082015250565b6000614601602e836135f6565b915061460c826145a5565b604082019050919050565b60006020820190508181036000830152614630816145f4565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006146936029836135f6565b915061469e82614637565b604082019050919050565b600060208201905081810360008301526146c281614686565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614725602a836135f6565b9150614730826146c9565b604082019050919050565b6000602082019050818103600083015261475481614718565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147916020836135f6565b915061479c8261475b565b602082019050919050565b600060208201905081810360008301526147c081614784565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061480182613541565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614833576148326147c7565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006148746019836135f6565b915061487f8261483e565b602082019050919050565b600060208201905081810360008301526148a381614867565b9050919050565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000602082015250565b60006149066030836135f6565b9150614911826148aa565b604082019050919050565b60006020820190508181036000830152614935816148f9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149986026836135f6565b91506149a38261493c565b604082019050919050565b600060208201905081810360008301526149c78161498b565b9050919050565b600060ff82169050919050565b6149e4816149ce565b82525050565b60006080820190506149ff60008301876135c1565b614a0c60208301866149db565b614a1960408301856135c1565b614a2660608301846135c1565b95945050505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000614a8b602e836135f6565b9150614a9682614a2f565b604082019050919050565b60006020820190508181036000830152614aba81614a7e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ae6565b614b2d8683614ae6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614b6a614b65614b6084613541565b614b45565b613541565b9050919050565b6000819050919050565b614b8483614b4f565b614b98614b9082614b71565b848454614af3565b825550505050565b600090565b614bad614ba0565b614bb8818484614b7b565b505050565b5b81811015614bdc57614bd1600082614ba5565b600181019050614bbe565b5050565b601f821115614c2157614bf281614ac1565b614bfb84614ad6565b81016020851015614c0a578190505b614c1e614c1685614ad6565b830182614bbd565b50505b505050565b600082821c905092915050565b6000614c4460001984600802614c26565b1980831691505092915050565b6000614c5d8383614c33565b9150826002028217905092915050565b614c76826135eb565b67ffffffffffffffff811115614c8f57614c8e613728565b5b614c998254613e6d565b614ca4828285614be0565b600060209050601f831160018114614cd75760008415614cc5578287015190505b614ccf8582614c51565b865550614d37565b601f198416614ce586614ac1565b60005b82811015614d0d57848901518255600182019150602085019450602081019050614ce8565b86831015614d2a5784890151614d26601f891682614c33565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d9b602c836135f6565b9150614da682614d3f565b604082019050919050565b60006020820190508181036000830152614dca81614d8e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614e2d6029836135f6565b9150614e3882614dd1565b604082019050919050565b60006020820190508181036000830152614e5c81614e20565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ebf6024836135f6565b9150614eca82614e63565b604082019050919050565b60006020820190508181036000830152614eee81614eb2565b9050919050565b6000614f0082613541565b9150614f0b83613541565b9250828203905081811115614f2357614f226147c7565b5b92915050565b6000614f3482613541565b9150614f3f83613541565b9250828201905080821115614f5757614f566147c7565b5b92915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614f936014836135f6565b9150614f9e82614f5d565b602082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006150256032836135f6565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006150916010836135f6565b915061509c8261505b565b602082019050919050565b600060208201905081810360008301526150c081615084565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006151236031836135f6565b915061512e826150c7565b604082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b600081905092915050565b600061516f826135eb565b6151798185615159565b9350615189818560208601613607565b80840191505092915050565b60006151a18285615164565b91506151ad8284615164565b91508190509392505050565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b60006151ef6018836135f6565b91506151fa826151b9565b602082019050919050565b6000602082019050818103600083015261521e816151e2565b9050919050565b7f4572723a20746f6b656e207472616e7366657220697320424c4f434b45440000600082015250565b600061525b601e836135f6565b915061526682615225565b602082019050919050565b6000602082019050818103600083015261528a8161524e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152b882615291565b6152c2818561529c565b93506152d2818560208601613607565b6152db81613631565b840191505092915050565b60006080820190506152fb60008301876136ca565b61530860208301866136ca565b61531560408301856136f4565b818103606083015261532781846152ad565b905095945050505050565b60008151905061534181613454565b92915050565b60006020828403121561535d5761535c61341e565b5b600061536b84828501615332565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006153d0602f836135f6565b91506153db82615374565b604082019050919050565b600060208201905081810360008301526153ff816153c3565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061543c6020836135f6565b915061544782615406565b602082019050919050565b6000602082019050818103600083015261546b8161542f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006154a8601c836135f6565b91506154b382615472565b602082019050919050565b600060208201905081810360008301526154d78161549b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061551882613541565b915061552383613541565b925082615533576155326154de565b5b828204905092915050565b600061554982613541565b915061555483613541565b925082615564576155636154de565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212209c0800dc566614d73c717eaa941a6c108a764d55d86f61c7835410035482175964736f6c63430008140033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104c696e6561446174615363616e6e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034c44530000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061021a5760003560e01c80635c975abb11610123578063a217fddf116100ab578063d547741f1161006f578063d547741f146107e0578063e63ab1e914610809578063e985e9c514610834578063eb79554914610871578063f2fde38b1461089a5761021a565b8063a217fddf14610708578063a22cb46514610733578063b88d4fde1461075c578063c87b56dd14610778578063d5391393146107b55761021a565b80638456cb59116100f25780638456cb59146106215780638462151c146106385780638da5cb5b1461067557806391d14854146106a057806395d89b41146106dd5761021a565b80635c975abb146105655780636352211e1461059057806370a08231146105cd578063715018a61461060a5761021a565b80632f2ff15d116101a6578063423f6cef11610175578063423f6cef1461047d57806342842e0e146104a657806342966c68146104c25780634f6ccce7146104eb57806350bb4e7f146105285761021a565b80632f2ff15d146103d75780632f745c591461040057806336568abe1461043d5780633f4ba83a146104665761021a565b8063095ea7b3116101ed578063095ea7b31461030157806318160ddd1461032a5780631a3e7c8b1461035557806323b872dd14610371578063248a9ca31461039a5761021a565b806301ffc9a71461021f57806303f167391461025c57806306fdde0314610299578063081812fc146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613480565b6108c3565b60405161025391906134c8565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e9190613577565b6108d5565b60405161029091906135d0565b60405180910390f35b3480156102a557600080fd5b506102ae610908565b6040516102bb919061367b565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e6919061369d565b61099a565b6040516102f891906136d9565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190613577565b610a1f565b005b34801561033657600080fd5b5061033f610b36565b60405161034c9190613703565b60405180910390f35b61036f600480360381019061036a91906138b3565b610b43565b005b34801561037d57600080fd5b5061039860048036038101906103939190613969565b610c92565b005b3480156103a657600080fd5b506103c160048036038101906103bc91906139e8565b610cf2565b6040516103ce91906135d0565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613a15565b610d12565b005b34801561040c57600080fd5b5061042760048036038101906104229190613577565b610d78565b6040516104349190613703565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613a15565b610e1d565b005b34801561047257600080fd5b5061047b610ea0565b005b34801561048957600080fd5b506104a4600480360381019061049f9190613577565b610f1a565b005b6104c060048036038101906104bb9190613969565b610f40565b005b3480156104ce57600080fd5b506104e960048036038101906104e4919061369d565b610f60565b005b3480156104f757600080fd5b50610512600480360381019061050d919061369d565b610fbc565b60405161051f9190613703565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190613a55565b61102d565b60405161055c91906134c8565b60405180910390f35b34801561057157600080fd5b5061057a6110d3565b60405161058791906134c8565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b2919061369d565b6110ea565b6040516105c491906136d9565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef9190613ac4565b61119b565b6040516106019190613703565b60405180910390f35b34801561061657600080fd5b5061061f611252565b005b34801561062d57600080fd5b506106366112da565b005b34801561064457600080fd5b5061065f600480360381019061065a9190613ac4565b611354565b60405161066c9190613baf565b60405180910390f35b34801561068157600080fd5b5061068a61144b565b60405161069791906136d9565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190613a15565b611474565b6040516106d491906134c8565b60405180910390f35b3480156106e957600080fd5b506106f26114df565b6040516106ff919061367b565b60405180910390f35b34801561071457600080fd5b5061071d611571565b60405161072a91906135d0565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190613bfd565b611578565b005b61077660048036038101906107719190613cde565b6116f8565b005b34801561078457600080fd5b5061079f600480360381019061079a919061369d565b61175a565b6040516107ac919061367b565b60405180910390f35b3480156107c157600080fd5b506107ca61176c565b6040516107d791906135d0565b60405180910390f35b3480156107ec57600080fd5b5061080760048036038101906108029190613a15565b611790565b005b34801561081557600080fd5b5061081e6117f6565b60405161082b91906135d0565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613d61565b61181a565b60405161086891906134c8565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613da1565b6118ae565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613ac4565b61190b565b005b60006108ce82611a02565b9050919050565b600082826040516020016108ea929190613e15565b60405160208183030381529060405280519060200120905092915050565b60606001805461091790613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461094390613e6d565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050905090565b60006109a582611a7c565b6109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db90613f10565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2a826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190613fa2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab9611ae8565b73ffffffffffffffffffffffffffffffffffffffff161480610ae85750610ae781610ae2611ae8565b61181a565b5b610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90614034565b60405180910390fd5b610b318383611af0565b505050565b6000600980549050905090565b610b6d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a687611474565b610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba3906140c6565b60405180910390fd5b6000610bb886866108d5565b90508673ffffffffffffffffffffffffffffffffffffffff16610c1f8285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ba9565b73ffffffffffffffffffffffffffffffffffffffff1614610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90614158565b60405180910390fd5b610c7f8686611c18565b610c898585611c36565b50505050505050565b610ca3610c9d611ae8565b82611ca3565b610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd9906141ea565b60405180910390fd5b610ced838383611d81565b505050565b6000600d6000838152602001908152602001600020600101549050919050565b610d2b610d1e83610cf2565b610d26611ae8565b611474565b610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d619061427c565b60405180910390fd5b610d748282611fdc565b5050565b6000610d838361119b565b8210610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9061430e565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e25611ae8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e89906143a0565b60405180910390fd5b610e9c82826120bd565b5050565b610ed17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ecc611ae8565b611474565b610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790614432565b60405180910390fd5b610f1861219f565b565b610f3c610f25611ae8565b838360405180602001604052806000815250612241565b5050565b610f5b838383604051806020016040528060008152506116f8565b505050565b610f71610f6b611ae8565b82611ca3565b610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa7906144c4565b60405180910390fd5b610fb98161229d565b50565b6000610fc6610b36565b8210611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe90614556565b60405180910390fd5b6009828154811061101b5761101a614576565b5b90600052602060002001549050919050565b6000600e60009054906101000a900460ff166110b4576110747f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661106f611ae8565b611474565b6110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90614617565b60405180910390fd5b5b6110be8484611c18565b6110c88383611c36565b600190509392505050565b6000600c60009054906101000a900460ff16905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611189906146a9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361120b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112029061473b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61125a611ae8565b73ffffffffffffffffffffffffffffffffffffffff1661127861144b565b73ffffffffffffffffffffffffffffffffffffffff16146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c5906147a7565b60405180910390fd5b6112d860006122a9565b565b61130b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611306611ae8565b611474565b61134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190614432565b60405180910390fd5b61135261236d565b565b606060006113618361119b565b67ffffffffffffffff81111561137a57611379613728565b5b6040519080825280602002602001820160405280156113a85781602001602082028036833780820191505090505b50905060005b6113b78461119b565b81101561144157600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008281526020019081526020016000205482828151811061142257611421614576565b5b6020026020010181815250508080611439906147f6565b9150506113ae565b5080915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600280546114ee90613e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461151a90613e6d565b80156115675780601f1061153c57610100808354040283529160200191611567565b820191906000526020600020905b81548152906001019060200180831161154a57829003601f168201915b5050505050905090565b6000801b81565b611580611ae8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e49061488a565b60405180910390fd5b80600660006115fa611ae8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116a7611ae8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ec91906134c8565b60405180910390a35050565b611709611703611ae8565b83611ca3565b611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f906141ea565b60405180910390fd5b61175484848484612241565b50505050565b606061176582612410565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6117a961179c83610cf2565b6117a4611ae8565b611474565b6117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df9061491c565b60405180910390fd5b6117f282826120bd565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119056118b9611ae8565b858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612241565b50505050565b611913611ae8565b73ffffffffffffffffffffffffffffffffffffffff1661193161144b565b73ffffffffffffffffffffffffffffffffffffffff1614611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e906147a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed906149ae565b60405180910390fd5b6119ff816122a9565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a755750611a7482612561565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b63836110ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600080611bb8856125db565b92509250925060018682858560405160008152602001604052604051611be194939291906149ea565b6020604051602081039080840390855afa158015611c03573d6000803e3d6000fd5b50505060206040510351935050505092915050565b611c32828260405180602001604052806000815250612643565b5050565b611c3f82611a7c565b611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7590614aa1565b60405180910390fd5b80600b60008481526020019081526020016000209081611c9e9190614c6d565b505050565b6000611cae82611a7c565b611ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce490614db1565b60405180910390fd5b6000611cf8836110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d6757508373ffffffffffffffffffffffffffffffffffffffff16611d4f8461099a565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d785750611d77818561181a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611da1826110ea565b73ffffffffffffffffffffffffffffffffffffffff1614611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee90614e43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5d90614ed5565b60405180910390fd5b611e7183838361269e565b611e7c600082611af0565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ecc9190614ef5565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f239190614f29565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fe68282611474565b6120b9576001600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061205e611ae8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6120c78282611474565b1561219b576000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612140611ae8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6121a76110d3565b6121e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dd90614fa9565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61222a611ae8565b60405161223791906136d9565b60405180910390a1565b61224c848484611d81565b61225884848484612765565b612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228e9061503b565b60405180910390fd5b50505050565b6122a6816128ec565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123756110d3565b156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac906150a7565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123f9611ae8565b60405161240691906136d9565b60405180910390a1565b606061241b82611a7c565b61245a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245190615139565b60405180910390fd5b6000600b6000848152602001908152602001600020805461247a90613e6d565b80601f01602080910402602001604051908101604052809291908181526020018280546124a690613e6d565b80156124f35780601f106124c8576101008083540402835291602001916124f3565b820191906000526020600020905b8154815290600101906020018083116124d657829003601f168201915b50505050509050600061250461293f565b9050600081510361251957819250505061255c565b60008251111561254e578082604051602001612536929190615195565b6040516020818303038152906040529250505061255c565b61255784612956565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125d457506125d3826129fd565b5b9050919050565b60008060006041845114612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261b90615205565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b61264d8383612adf565b61265a6000848484612765565b612699576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126909061503b565b60405180910390fd5b505050565b6126a66110d3565b156126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd906150a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274c90615271565b60405180910390fd5b612760838383612cac565b505050565b60006127868473ffffffffffffffffffffffffffffffffffffffff16612dbe565b156128df578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127af611ae8565b8786866040518563ffffffff1660e01b81526004016127d194939291906152e6565b6020604051808303816000875af192505050801561280d57506040513d601f19601f8201168201806040525081019061280a9190615347565b60015b61288f573d806000811461283d576040519150601f19603f3d011682016040523d82523d6000602084013e612842565b606091505b506000815103612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e9061503b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128e4565b600190505b949350505050565b6128f581612dd1565b6000600b6000838152602001908152602001600020805461291590613e6d565b90501461293c57600b6000828152602001908152602001600020600061293b91906133b7565b5b50565b606060405180602001604052806000815250905090565b606061296182611a7c565b6129a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612997906153e6565b60405180910390fd5b60006129aa61293f565b905060008151116129ca57604051806020016040528060008152506129f5565b806129d484612ee2565b6040516020016129e5929190615195565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ac857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ad85750612ad782613042565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4590615452565b60405180910390fd5b612b5781611a7c565b15612b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8e906154be565b60405180910390fd5b612ba36000838361269e565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf39190614f29565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612cb78383836130ac565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cf957612cf4816130b1565b612d38565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d3757612d3683826130fa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d7a57612d7581613267565b612db9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612db857612db78282613338565b5b5b505050565b600080823b905060008111915050919050565b6000612ddc826110ea565b9050612dea8160008461269e565b612df5600083611af0565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e459190614ef5565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606060008203612f29576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061303d565b600082905060005b60008214612f5b578080612f44906147f6565b915050600a82612f54919061550d565b9150612f31565b60008167ffffffffffffffff811115612f7757612f76613728565b5b6040519080825280601f01601f191660200182016040528015612fa95781602001600182028036833780820191505090505b5090505b6000851461303657600182612fc29190614ef5565b9150600a85612fd1919061553e565b6030612fdd9190614f29565b60f81b818381518110612ff357612ff2614576565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561302f919061550d565b9450612fad565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131078461119b565b6131119190614ef5565b90506000600860008481526020019081526020016000205490508181146131f6576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061327b9190614ef5565b90506000600a60008481526020019081526020016000205490506000600983815481106132ab576132aa614576565b5b9060005260206000200154905080600983815481106132cd576132cc614576565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061331c5761331b61556f565b5b6001900381819060005260206000200160009055905550505050565b60006133438361119b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b5080546133c390613e6d565b6000825580601f106133d557506133f4565b601f0160209004906000526020600020908101906133f391906133f7565b5b50565b5b808211156134105760008160009055506001016133f8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61345d81613428565b811461346857600080fd5b50565b60008135905061347a81613454565b92915050565b6000602082840312156134965761349561341e565b5b60006134a48482850161346b565b91505092915050565b60008115159050919050565b6134c2816134ad565b82525050565b60006020820190506134dd60008301846134b9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061350e826134e3565b9050919050565b61351e81613503565b811461352957600080fd5b50565b60008135905061353b81613515565b92915050565b6000819050919050565b61355481613541565b811461355f57600080fd5b50565b6000813590506135718161354b565b92915050565b6000806040838503121561358e5761358d61341e565b5b600061359c8582860161352c565b92505060206135ad85828601613562565b9150509250929050565b6000819050919050565b6135ca816135b7565b82525050565b60006020820190506135e560008301846135c1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561362557808201518184015260208101905061360a565b60008484015250505050565b6000601f19601f8301169050919050565b600061364d826135eb565b61365781856135f6565b9350613667818560208601613607565b61367081613631565b840191505092915050565b600060208201905081810360008301526136958184613642565b905092915050565b6000602082840312156136b3576136b261341e565b5b60006136c184828501613562565b91505092915050565b6136d381613503565b82525050565b60006020820190506136ee60008301846136ca565b92915050565b6136fd81613541565b82525050565b600060208201905061371860008301846136f4565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61376082613631565b810181811067ffffffffffffffff8211171561377f5761377e613728565b5b80604052505050565b6000613792613414565b905061379e8282613757565b919050565b600067ffffffffffffffff8211156137be576137bd613728565b5b6137c782613631565b9050602081019050919050565b82818337600083830152505050565b60006137f66137f1846137a3565b613788565b90508281526020810184848401111561381257613811613723565b5b61381d8482856137d4565b509392505050565b600082601f83011261383a5761383961371e565b5b813561384a8482602086016137e3565b91505092915050565b600080fd5b600080fd5b60008083601f8401126138735761387261371e565b5b8235905067ffffffffffffffff8111156138905761388f613853565b5b6020830191508360018202830111156138ac576138ab613858565b5b9250929050565b60008060008060008060a087890312156138d0576138cf61341e565b5b60006138de89828a0161352c565b96505060206138ef89828a0161352c565b955050604061390089828a01613562565b945050606087013567ffffffffffffffff81111561392157613920613423565b5b61392d89828a01613825565b935050608087013567ffffffffffffffff81111561394e5761394d613423565b5b61395a89828a0161385d565b92509250509295509295509295565b6000806000606084860312156139825761398161341e565b5b60006139908682870161352c565b93505060206139a18682870161352c565b92505060406139b286828701613562565b9150509250925092565b6139c5816135b7565b81146139d057600080fd5b50565b6000813590506139e2816139bc565b92915050565b6000602082840312156139fe576139fd61341e565b5b6000613a0c848285016139d3565b91505092915050565b60008060408385031215613a2c57613a2b61341e565b5b6000613a3a858286016139d3565b9250506020613a4b8582860161352c565b9150509250929050565b600080600060608486031215613a6e57613a6d61341e565b5b6000613a7c8682870161352c565b9350506020613a8d86828701613562565b925050604084013567ffffffffffffffff811115613aae57613aad613423565b5b613aba86828701613825565b9150509250925092565b600060208284031215613ada57613ad961341e565b5b6000613ae88482850161352c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b2681613541565b82525050565b6000613b388383613b1d565b60208301905092915050565b6000602082019050919050565b6000613b5c82613af1565b613b668185613afc565b9350613b7183613b0d565b8060005b83811015613ba2578151613b898882613b2c565b9750613b9483613b44565b925050600181019050613b75565b5085935050505092915050565b60006020820190508181036000830152613bc98184613b51565b905092915050565b613bda816134ad565b8114613be557600080fd5b50565b600081359050613bf781613bd1565b92915050565b60008060408385031215613c1457613c1361341e565b5b6000613c228582860161352c565b9250506020613c3385828601613be8565b9150509250929050565b600067ffffffffffffffff821115613c5857613c57613728565b5b613c6182613631565b9050602081019050919050565b6000613c81613c7c84613c3d565b613788565b905082815260208101848484011115613c9d57613c9c613723565b5b613ca88482856137d4565b509392505050565b600082601f830112613cc557613cc461371e565b5b8135613cd5848260208601613c6e565b91505092915050565b60008060008060808587031215613cf857613cf761341e565b5b6000613d068782880161352c565b9450506020613d178782880161352c565b9350506040613d2887828801613562565b925050606085013567ffffffffffffffff811115613d4957613d48613423565b5b613d5587828801613cb0565b91505092959194509250565b60008060408385031215613d7857613d7761341e565b5b6000613d868582860161352c565b9250506020613d978582860161352c565b9150509250929050565b60008060008060608587031215613dbb57613dba61341e565b5b6000613dc98782880161352c565b9450506020613dda87828801613562565b935050604085013567ffffffffffffffff811115613dfb57613dfa613423565b5b613e078782880161385d565b925092505092959194509250565b6000604082019050613e2a60008301856136ca565b613e3760208301846136f4565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e8557607f821691505b602082108103613e9857613e97613e3e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613efa602c836135f6565b9150613f0582613e9e565b604082019050919050565b60006020820190508181036000830152613f2981613eed565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f8c6021836135f6565b9150613f9782613f30565b604082019050919050565b60006020820190508181036000830152613fbb81613f7f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061401e6038836135f6565b915061402982613fc2565b604082019050919050565b6000602082019050818103600083015261404d81614011565b9050919050565b7f546865207369676e657220646f6573206e6f742068617665207468652072657160008201527f756972656420726f6c6500000000000000000000000000000000000000000000602082015250565b60006140b0602a836135f6565b91506140bb82614054565b604082019050919050565b600060208201905081810360008301526140df816140a3565b9050919050565b7f546865207369676e61747572652070726f766964656420646f6573206e6f742060008201527f6d61746368000000000000000000000000000000000000000000000000000000602082015250565b60006141426025836135f6565b915061414d826140e6565b604082019050919050565b6000602082019050818103600083015261417181614135565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006141d46031836135f6565b91506141df82614178565b604082019050919050565b60006020820190508181036000830152614203816141c7565b9050919050565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f206772616e740000000000000000000000000000000000602082015250565b6000614266602f836135f6565b91506142718261420a565b604082019050919050565b6000602082019050818103600083015261429581614259565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006142f8602b836135f6565b91506143038261429c565b604082019050919050565b60006020820190508181036000830152614327816142eb565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061438a602f836135f6565b91506143958261432e565b604082019050919050565b600060208201905081810360008301526143b98161437d565b9050919050565b7f536f6369616c5363616e42616467653a206d757374206861766520706175736560008201527f7220726f6c6520746f2070617573650000000000000000000000000000000000602082015250565b600061441c602f836135f6565b9150614427826143c0565b604082019050919050565b6000602082019050818103600083015261444b8161440f565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b60006144ae6030836135f6565b91506144b982614452565b604082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614540602c836135f6565b915061454b826144e4565b604082019050919050565b6000602082019050818103600083015261456f81614533565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f536f6369616c5363616e42616467653a206d7573742068617665206d696e746560008201527f7220726f6c6520746f206d696e74000000000000000000000000000000000000602082015250565b6000614601602e836135f6565b915061460c826145a5565b604082019050919050565b60006020820190508181036000830152614630816145f4565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006146936029836135f6565b915061469e82614637565b604082019050919050565b600060208201905081810360008301526146c281614686565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614725602a836135f6565b9150614730826146c9565b604082019050919050565b6000602082019050818103600083015261475481614718565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147916020836135f6565b915061479c8261475b565b602082019050919050565b600060208201905081810360008301526147c081614784565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061480182613541565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614833576148326147c7565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006148746019836135f6565b915061487f8261483e565b602082019050919050565b600060208201905081810360008301526148a381614867565b9050919050565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000602082015250565b60006149066030836135f6565b9150614911826148aa565b604082019050919050565b60006020820190508181036000830152614935816148f9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149986026836135f6565b91506149a38261493c565b604082019050919050565b600060208201905081810360008301526149c78161498b565b9050919050565b600060ff82169050919050565b6149e4816149ce565b82525050565b60006080820190506149ff60008301876135c1565b614a0c60208301866149db565b614a1960408301856135c1565b614a2660608301846135c1565b95945050505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000614a8b602e836135f6565b9150614a9682614a2f565b604082019050919050565b60006020820190508181036000830152614aba81614a7e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ae6565b614b2d8683614ae6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614b6a614b65614b6084613541565b614b45565b613541565b9050919050565b6000819050919050565b614b8483614b4f565b614b98614b9082614b71565b848454614af3565b825550505050565b600090565b614bad614ba0565b614bb8818484614b7b565b505050565b5b81811015614bdc57614bd1600082614ba5565b600181019050614bbe565b5050565b601f821115614c2157614bf281614ac1565b614bfb84614ad6565b81016020851015614c0a578190505b614c1e614c1685614ad6565b830182614bbd565b50505b505050565b600082821c905092915050565b6000614c4460001984600802614c26565b1980831691505092915050565b6000614c5d8383614c33565b9150826002028217905092915050565b614c76826135eb565b67ffffffffffffffff811115614c8f57614c8e613728565b5b614c998254613e6d565b614ca4828285614be0565b600060209050601f831160018114614cd75760008415614cc5578287015190505b614ccf8582614c51565b865550614d37565b601f198416614ce586614ac1565b60005b82811015614d0d57848901518255600182019150602085019450602081019050614ce8565b86831015614d2a5784890151614d26601f891682614c33565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d9b602c836135f6565b9150614da682614d3f565b604082019050919050565b60006020820190508181036000830152614dca81614d8e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614e2d6029836135f6565b9150614e3882614dd1565b604082019050919050565b60006020820190508181036000830152614e5c81614e20565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ebf6024836135f6565b9150614eca82614e63565b604082019050919050565b60006020820190508181036000830152614eee81614eb2565b9050919050565b6000614f0082613541565b9150614f0b83613541565b9250828203905081811115614f2357614f226147c7565b5b92915050565b6000614f3482613541565b9150614f3f83613541565b9250828201905080821115614f5757614f566147c7565b5b92915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614f936014836135f6565b9150614f9e82614f5d565b602082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006150256032836135f6565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006150916010836135f6565b915061509c8261505b565b602082019050919050565b600060208201905081810360008301526150c081615084565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006151236031836135f6565b915061512e826150c7565b604082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b600081905092915050565b600061516f826135eb565b6151798185615159565b9350615189818560208601613607565b80840191505092915050565b60006151a18285615164565b91506151ad8284615164565b91508190509392505050565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b60006151ef6018836135f6565b91506151fa826151b9565b602082019050919050565b6000602082019050818103600083015261521e816151e2565b9050919050565b7f4572723a20746f6b656e207472616e7366657220697320424c4f434b45440000600082015250565b600061525b601e836135f6565b915061526682615225565b602082019050919050565b6000602082019050818103600083015261528a8161524e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152b882615291565b6152c2818561529c565b93506152d2818560208601613607565b6152db81613631565b840191505092915050565b60006080820190506152fb60008301876136ca565b61530860208301866136ca565b61531560408301856136f4565b818103606083015261532781846152ad565b905095945050505050565b60008151905061534181613454565b92915050565b60006020828403121561535d5761535c61341e565b5b600061536b84828501615332565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006153d0602f836135f6565b91506153db82615374565b604082019050919050565b600060208201905081810360008301526153ff816153c3565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061543c6020836135f6565b915061544782615406565b602082019050919050565b6000602082019050818103600083015261546b8161542f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006154a8601c836135f6565b91506154b382615472565b602082019050919050565b600060208201905081810360008301526154d78161549b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061551882613541565b915061552383613541565b925082615533576155326154de565b5b828204905092915050565b600061554982613541565b915061555483613541565b925082615564576155636154de565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212209c0800dc566614d73c717eaa941a6c108a764d55d86f61c7835410035482175964736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104c696e6561446174615363616e6e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034c44530000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): LineaDataScanner
Arg [1] : symbol_ (string): LDS
Arg [2] : publicMint (bool): False
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [4] : 4c696e6561446174615363616e6e657200000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4c44530000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
54340:4777:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58903:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56068:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24061:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25528:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25058:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36755:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56353:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26418:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50417:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50802:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36094:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52021:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55131:197;;;;;;;;;;;;;:::i;:::-;;58084:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26794:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54086:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36945:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55633:427;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45067:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23755:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23485:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18247:103;;;;;;;;;;;;;:::i;:::-;;54930:193;;;;;;;;;;;;;:::i;:::-;;36358:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17596:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50089:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24230:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48545:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25821:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27024:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58715:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54528:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51279:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54459:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26187:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57918:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18505:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58903:211;59041:4;59070:36;59094:11;59070:23;:36::i;:::-;59063:43;;58903:211;;;:::o;56068:206::-;56166:7;56241:3;56246:8;56230:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56206:60;;;;;;56186:80;;56068:206;;;;:::o;24061:100::-;24115:13;24148:5;24141:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24061:100;:::o;25528:221::-;25604:7;25632:16;25640:7;25632;:16::i;:::-;25624:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25717:15;:24;25733:7;25717:24;;;;;;;;;;;;;;;;;;;;;25710:31;;25528:221;;;:::o;25058:404::-;25139:13;25155:23;25170:7;25155:14;:23::i;:::-;25139:39;;25203:5;25197:11;;:2;:11;;;25189:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25283:5;25267:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;25292:44;25316:5;25323:12;:10;:12::i;:::-;25292:23;:44::i;:::-;25267:69;25259:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;25433:21;25442:2;25446:7;25433:8;:21::i;:::-;25128:334;25058:404;;:::o;36755:113::-;36816:7;36843:10;:17;;;;36836:24;;36755:113;:::o;56353:474::-;56509:28;54566:24;56530:6;56509:7;:28::i;:::-;56501:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;56597:16;56616:24;56628:2;56632:7;56616:11;:24::i;:::-;56597:43;;56699:6;56661:44;;:34;56675:8;56685:9;;56661:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:34::i;:::-;:44;;;56653:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;56760:22;56770:2;56774:7;56760:9;:22::i;:::-;56793:26;56806:7;56815:3;56793:12;:26::i;:::-;56490:337;56353:474;;;;;;:::o;26418:305::-;26579:41;26598:12;:10;:12::i;:::-;26612:7;26579:18;:41::i;:::-;26571:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26687:28;26697:4;26703:2;26707:7;26687:9;:28::i;:::-;26418:305;;;:::o;50417:123::-;50483:7;50510:6;:12;50517:4;50510:12;;;;;;;;;;;:22;;;50503:29;;50417:123;;;:::o;50802:232::-;50895:41;50903:18;50916:4;50903:12;:18::i;:::-;50923:12;:10;:12::i;:::-;50895:7;:41::i;:::-;50887:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;51001:25;51012:4;51018:7;51001:10;:25::i;:::-;50802:232;;:::o;36094:256::-;36191:7;36227:23;36244:5;36227:16;:23::i;:::-;36219:5;:31;36211:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36316:12;:19;36329:5;36316:19;;;;;;;;;;;;;;;:26;36336:5;36316:26;;;;;;;;;;;;36309:33;;36094:256;;;;:::o;52021:218::-;52128:12;:10;:12::i;:::-;52117:23;;:7;:23;;;52109:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52205:26;52217:4;52223:7;52205:11;:26::i;:::-;52021:218;;:::o;55131:197::-;55190:34;54497:24;55211:12;:10;:12::i;:::-;55190:7;:34::i;:::-;55168:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;55310:10;:8;:10::i;:::-;55131:197::o;58084:135::-;58161:50;58181:12;:10;:12::i;:::-;58195:2;58199:7;58161:50;;;;;;;;;;;;:19;:50::i;:::-;58084:135;;:::o;26794:159::-;26906:39;26923:4;26929:2;26933:7;26906:39;;;;;;;;;;;;:16;:39::i;:::-;26794:159;;;:::o;54086:245::-;54204:41;54223:12;:10;:12::i;:::-;54237:7;54204:18;:41::i;:::-;54196:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;54309:14;54315:7;54309:5;:14::i;:::-;54086:245;:::o;36945:233::-;37020:7;37056:30;:28;:30::i;:::-;37048:5;:38;37040:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37153:10;37164:5;37153:17;;;;;;;;:::i;:::-;;;;;;;;;;37146:24;;36945:233;;;:::o;55633:427::-;55757:4;55779:11;;;;;;;;;;;55774:187;;55833:34;54566:24;55854:12;:10;:12::i;:::-;55833:7;:34::i;:::-;55807:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;55774:187;55971:22;55981:2;55985:7;55971:9;:22::i;:::-;56004:26;56017:7;56026:3;56004:12;:26::i;:::-;56048:4;56041:11;;55633:427;;;;;:::o;45067:86::-;45114:4;45138:7;;;;;;;;;;;45131:14;;45067:86;:::o;23755:239::-;23827:7;23847:13;23863:7;:16;23871:7;23863:16;;;;;;;;;;;;;;;;;;;;;23847:32;;23915:1;23898:19;;:5;:19;;;23890:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23981:5;23974:12;;;23755:239;;;:::o;23485:208::-;23557:7;23602:1;23585:19;;:5;:19;;;23577:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23669:9;:16;23679:5;23669:16;;;;;;;;;;;;;;;;23662:23;;23485:208;;;:::o;18247:103::-;17827:12;:10;:12::i;:::-;17816:23;;:7;:5;:7::i;:::-;:23;;;17808:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18312:30:::1;18339:1;18312:18;:30::i;:::-;18247:103::o:0;54930:193::-;54987:34;54497:24;55008:12;:10;:12::i;:::-;54987:7;:34::i;:::-;54965:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;55107:8;:6;:8::i;:::-;54930:193::o;36358:321::-;36417:16;36446:28;36491:23;36508:5;36491:16;:23::i;:::-;36477:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36446:69;;36531:6;36526:117;36547:23;36564:5;36547:16;:23::i;:::-;36543:1;:27;36526:117;;;36609:12;:19;36622:5;36609:19;;;;;;;;;;;;;;;:22;36629:1;36609:22;;;;;;;;;;;;36592:11;36604:1;36592:14;;;;;;;;:::i;:::-;;;;;;;:39;;;;;36572:3;;;;;:::i;:::-;;;;36526:117;;;;36660:11;36653:18;;;36358:321;;;:::o;17596:87::-;17642:7;17669:6;;;;;;;;;;;17662:13;;17596:87;:::o;50089:139::-;50167:4;50191:6;:12;50198:4;50191:12;;;;;;;;;;;:20;;:29;50212:7;50191:29;;;;;;;;;;;;;;;;;;;;;;;;;50184:36;;50089:139;;;;:::o;24230:104::-;24286:13;24319:7;24312:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24230:104;:::o;48545:49::-;48590:4;48545:49;;;:::o;25821:295::-;25936:12;:10;:12::i;:::-;25924:24;;:8;:24;;;25916:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26036:8;25991:18;:32;26010:12;:10;:12::i;:::-;25991:32;;;;;;;;;;;;;;;:42;26024:8;25991:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26089:8;26060:48;;26075:12;:10;:12::i;:::-;26060:48;;;26099:8;26060:48;;;;;;:::i;:::-;;;;;;;;25821:295;;:::o;27024:293::-;27164:41;27183:12;:10;:12::i;:::-;27197:7;27164:18;:41::i;:::-;27156:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27270:39;27284:4;27290:2;27294:7;27303:5;27270:13;:39::i;:::-;27024:293;;;;:::o;58715:180::-;58826:13;58864:23;58879:7;58864:14;:23::i;:::-;58857:30;;58715:180;;;:::o;54528:62::-;54566:24;54528:62;:::o;51279:235::-;51373:41;51381:18;51394:4;51381:12;:18::i;:::-;51401:12;:10;:12::i;:::-;51373:7;:41::i;:::-;51365:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;51480:26;51492:4;51498:7;51480:11;:26::i;:::-;51279:235;;:::o;54459:62::-;54497:24;54459:62;:::o;26187:164::-;26284:4;26308:18;:25;26327:5;26308:25;;;;;;;;;;;;;;;:35;26334:8;26308:35;;;;;;;;;;;;;;;;;;;;;;;;;26301:42;;26187:164;;;;:::o;57918:158::-;58016:52;58036:12;:10;:12::i;:::-;58050:2;58054:7;58063:4;;58016:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:52::i;:::-;57918:158;;;;:::o;18505:201::-;17827:12;:10;:12::i;:::-;17816:23;;:7;:5;:7::i;:::-;:23;;;17808:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18614:1:::1;18594:22;;:8;:22;;::::0;18586:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18670:28;18689:8;18670:18;:28::i;:::-;18505:201:::0;:::o;49780:217::-;49865:4;49904:32;49889:47;;;:11;:47;;;;:100;;;;49953:36;49977:11;49953:23;:36::i;:::-;49889:100;49882:107;;49780:217;;;:::o;28784:127::-;28849:4;28901:1;28873:30;;:7;:16;28881:7;28873:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28866:37;;28784:127;;;:::o;16265:98::-;16318:7;16345:10;16338:17;;16265:98;:::o;32669:174::-;32771:2;32744:15;:24;32760:7;32744:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32827:7;32823:2;32789:46;;32798:23;32813:7;32798:14;:23::i;:::-;32789:46;;;;;;;;;;;;32669:174;;:::o;56835:276::-;56962:7;56983:9;56994;57005:7;57016:26;57031:10;57016:14;:26::i;:::-;56982:60;;;;;;57062:41;57072:21;57095:1;57098;57101;57062:41;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57055:48;;;;;56835:276;;;;:::o;29776:110::-;29852:26;29862:2;29866:7;29852:26;;;;;;;;;;;;:9;:26::i;:::-;29776:110;;:::o;43424:217::-;43524:16;43532:7;43524;:16::i;:::-;43516:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;43624:9;43602:10;:19;43613:7;43602:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;43424:217;;:::o;29078:355::-;29171:4;29196:16;29204:7;29196;:16::i;:::-;29188:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29272:13;29288:23;29303:7;29288:14;:23::i;:::-;29272:39;;29341:5;29330:16;;:7;:16;;;:51;;;;29374:7;29350:31;;:20;29362:7;29350:11;:20::i;:::-;:31;;;29330:51;:94;;;;29385:39;29409:5;29416:7;29385:23;:39::i;:::-;29330:94;29322:103;;;29078:355;;;;:::o;32007:544::-;32132:4;32105:31;;:23;32120:7;32105:14;:23::i;:::-;:31;;;32097:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32215:1;32201:16;;:2;:16;;;32193:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32271:39;32292:4;32298:2;32302:7;32271:20;:39::i;:::-;32375:29;32392:1;32396:7;32375:8;:29::i;:::-;32436:1;32417:9;:15;32427:4;32417:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32465:1;32448:9;:13;32458:2;32448:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32496:2;32477:7;:16;32485:7;32477:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32535:7;32531:2;32516:27;;32525:4;32516:27;;;;;;;;;;;;32007:544;;;:::o;53269:229::-;53344:22;53352:4;53358:7;53344;:22::i;:::-;53339:152;;53415:4;53383:6;:12;53390:4;53383:12;;;;;;;;;;;:20;;:29;53404:7;53383:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;53466:12;:10;:12::i;:::-;53439:40;;53457:7;53439:40;;53451:4;53439:40;;;;;;;;;;53339:152;53269:229;;:::o;53506:230::-;53581:22;53589:4;53595:7;53581;:22::i;:::-;53577:152;;;53652:5;53620:6;:12;53627:4;53620:12;;;;;;;;;;;:20;;:29;53641:7;53620:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;53704:12;:10;:12::i;:::-;53677:40;;53695:7;53677:40;;53689:4;53677:40;;;;;;;;;;53577:152;53506:230;;:::o;46126:120::-;45670:8;:6;:8::i;:::-;45662:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;46195:5:::1;46185:7;;:15;;;;;;;;;;;;;;;;;;46216:22;46225:12;:10;:12::i;:::-;46216:22;;;;;;:::i;:::-;;;;;;;;46126:120::o:0;28199:272::-;28313:28;28323:4;28329:2;28333:7;28313:9;:28::i;:::-;28360:48;28383:4;28389:2;28393:7;28402:5;28360:22;:48::i;:::-;28352:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28199:272;;;;:::o;58592:115::-;58679:20;58691:7;58679:11;:20::i;:::-;58592:115;:::o;18866:191::-;18940:16;18959:6;;;;;;;;;;;18940:25;;18985:8;18976:6;;:17;;;;;;;;;;;;;;;;;;19040:8;19009:40;;19030:8;19009:40;;;;;;;;;;;;18929:128;18866:191;:::o;45867:118::-;45393:8;:6;:8::i;:::-;45392:9;45384:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45937:4:::1;45927:7;;:14;;;;;;;;;;;;;;;;;;45957:20;45964:12;:10;:12::i;:::-;45957:20;;;;;;:::i;:::-;;;;;;;;45867:118::o:0;42589:679::-;42662:13;42696:16;42704:7;42696;:16::i;:::-;42688:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;42779:23;42805:10;:19;42816:7;42805:19;;;;;;;;;;;42779:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42835:18;42856:10;:8;:10::i;:::-;42835:31;;42964:1;42948:4;42942:18;:23;42938:72;;42989:9;42982:16;;;;;;42938:72;43140:1;43120:9;43114:23;:27;43110:108;;;43189:4;43195:9;43172:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43158:48;;;;;;43110:108;43237:23;43252:7;43237:14;:23::i;:::-;43230:30;;;;42589:679;;;;:::o;35773:237::-;35875:4;35914:35;35899:50;;;:11;:50;;;;:103;;;;35966:36;35990:11;35966:23;:36::i;:::-;35899:103;35892:110;;35773:237;;;:::o;57119:791::-;57200:9;57211;57222:7;57264:2;57250:3;:10;:16;57242:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57676:2;57671:3;57667:12;57661:19;57656:24;;57742:2;57737:3;57733:12;57727:19;57722:24;;57845:2;57840:3;57836:12;57830:19;57827:1;57822:28;57817:33;;57119:791;;;;;:::o;30113:250::-;30209:18;30215:2;30219:7;30209:5;:18::i;:::-;30246:54;30277:1;30281:2;30285:7;30294:5;30246:22;:54::i;:::-;30238:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;30113:250;;;:::o;58227:287::-;45393:8;:6;:8::i;:::-;45392:9;45384:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;58413:1:::1;58397:18;;:4;:18;;;58389:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58461:45;58488:4;58494:2;58498:7;58461:26;:45::i;:::-;58227:287:::0;;;:::o;33408:839::-;33525:4;33551:15;:2;:13;;;:15::i;:::-;33547:693;;;33603:2;33587:36;;;33624:12;:10;:12::i;:::-;33638:4;33644:7;33653:5;33587:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33583:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33850:1;33833:6;:13;:18;33829:341;;33876:60;;;;;;;;;;:::i;:::-;;;;;;;;33829:341;34120:6;34114:13;34105:6;34101:2;34097:15;34090:38;33583:602;33720:45;;;33710:55;;;:6;:55;;;;33703:62;;;;;33547:693;34224:4;34217:11;;33408:839;;;;;;;:::o;43870:206::-;43939:20;43951:7;43939:11;:20::i;:::-;44013:1;43982:10;:19;43993:7;43982:19;;;;;;;;;;;43976:33;;;;;:::i;:::-;;;:38;43972:97;;44038:10;:19;44049:7;44038:19;;;;;;;;;;;;44031:26;;;;:::i;:::-;43972:97;43870:206;:::o;24902:94::-;24953:13;24979:9;;;;;;;;;;;;;;24902:94;:::o;24405:360::-;24478:13;24512:16;24520:7;24512;:16::i;:::-;24504:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24593:21;24617:10;:8;:10::i;:::-;24593:34;;24669:1;24651:7;24645:21;:25;:112;;;;;;;;;;;;;;;;;24710:7;24719:18;:7;:16;:18::i;:::-;24693:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24645:112;24638:119;;;24405:360;;;:::o;23133:288::-;23235:4;23274:25;23259:40;;;:11;:40;;;;:101;;;;23327:33;23312:48;;;:11;:48;;;;23259:101;:154;;;;23377:36;23401:11;23377:23;:36::i;:::-;23259:154;23252:161;;23133:288;;;:::o;30699:382::-;30793:1;30779:16;;:2;:16;;;30771:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30852:16;30860:7;30852;:16::i;:::-;30851:17;30843:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30914:45;30943:1;30947:2;30951:7;30914:20;:45::i;:::-;30989:1;30972:9;:13;30982:2;30972:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31020:2;31001:7;:16;31009:7;31001:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31065:7;31061:2;31040:33;;31057:1;31040:33;;;;;;;;;;;;30699:382;;:::o;37791:555::-;37901:45;37928:4;37934:2;37938:7;37901:26;:45::i;:::-;37979:1;37963:18;;:4;:18;;;37959:187;;37998:40;38030:7;37998:31;:40::i;:::-;37959:187;;;38068:2;38060:10;;:4;:10;;;38056:90;;38087:47;38120:4;38126:7;38087:32;:47::i;:::-;38056:90;37959:187;38174:1;38160:16;;:2;:16;;;38156:183;;38193:45;38230:7;38193:36;:45::i;:::-;38156:183;;;38266:4;38260:10;;:2;:10;;;38256:83;;38287:40;38315:2;38319:7;38287:27;:40::i;:::-;38256:83;38156:183;37791:555;;;:::o;8471:420::-;8531:4;8739:12;8849:7;8837:20;8829:28;;8882:1;8875:4;:8;8868:15;;;8471:420;;;:::o;31310:360::-;31370:13;31386:23;31401:7;31386:14;:23::i;:::-;31370:39;;31422:48;31443:5;31458:1;31462:7;31422:20;:48::i;:::-;31511:29;31528:1;31532:7;31511:8;:29::i;:::-;31573:1;31553:9;:16;31563:5;31553:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;31592:7;:16;31600:7;31592:16;;;;;;;;;;;;31585:23;;;;;;;;;;;31654:7;31650:1;31626:36;;31635:5;31626:36;;;;;;;;;;;;31359:311;31310:360;:::o;19286:723::-;19342:13;19572:1;19563:5;:10;19559:53;;19590:10;;;;;;;;;;;;;;;;;;;;;19559:53;19622:12;19637:5;19622:20;;19653:14;19678:78;19693:1;19685:4;:9;19678:78;;19711:8;;;;;:::i;:::-;;;;19742:2;19734:10;;;;;:::i;:::-;;;19678:78;;;19766:19;19798:6;19788:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19766:39;;19816:154;19832:1;19823:5;:10;19816:154;;19860:1;19850:11;;;;;:::i;:::-;;;19927:2;19919:5;:10;;;;:::i;:::-;19906:2;:24;;;;:::i;:::-;19893:39;;19876:6;19883;19876:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19956:2;19947:11;;;;;:::i;:::-;;;19816:154;;;19994:6;19980:21;;;;;19286:723;;;;:::o;21741:157::-;21826:4;21865:25;21850:40;;;:11;:40;;;;21843:47;;21741:157;;;:::o;34860:92::-;;;;:::o;39069:164::-;39173:10;:17;;;;39146:15;:24;39162:7;39146:24;;;;;;;;;;;:44;;;;39201:10;39217:7;39201:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39069:164;:::o;39860:1014::-;40126:22;40176:1;40151:22;40168:4;40151:16;:22::i;:::-;:26;;;;:::i;:::-;40126:51;;40188:18;40209:17;:26;40227:7;40209:26;;;;;;;;;;;;40188:47;;40356:14;40342:10;:28;40338:354;;40387:19;40409:12;:18;40422:4;40409:18;;;;;;;;;;;;;;;:34;40428:14;40409:34;;;;;;;;;;;;40387:56;;40493:11;40460:12;:18;40473:4;40460:18;;;;;;;;;;;;;;;:30;40479:10;40460:30;;;;;;;;;;;:44;;;;40623:10;40590:17;:30;40608:11;40590:30;;;;;;;;;;;:43;;;;40372:320;40338:354;40788:17;:26;40806:7;40788:26;;;;;;;;;;;40781:33;;;40832:12;:18;40845:4;40832:18;;;;;;;;;;;;;;;:34;40851:14;40832:34;;;;;;;;;;;40825:41;;;39941:933;;39860:1014;;:::o;41169:1097::-;41422:22;41467:1;41447:10;:17;;;;:21;;;;:::i;:::-;41422:46;;41479:18;41500:15;:24;41516:7;41500:24;;;;;;;;;;;;41479:45;;41851:19;41873:10;41884:14;41873:26;;;;;;;;:::i;:::-;;;;;;;;;;41851:48;;41937:11;41912:10;41923;41912:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42057:10;42026:15;:28;42042:11;42026:28;;;;;;;;;;;:41;;;;42207:15;:24;42223:7;42207:24;;;;;;;;;;;42200:31;;;42242:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41240:1026;;;41169:1097;:::o;38647:221::-;38732:14;38749:20;38766:2;38749:16;:20::i;:::-;38732:37;;38807:7;38780:12;:16;38793:2;38780:16;;;;;;;;;;;;;;;:24;38797:6;38780:24;;;;;;;;;;;:34;;;;38854:6;38825:17;:26;38843:7;38825:26;;;;;;;;;;;:35;;;;38721:147;38647:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:77::-;2062:7;2091:5;2080:16;;2025:77;;;:::o;2108:122::-;2181:24;2199:5;2181:24;:::i;:::-;2174:5;2171:35;2161:63;;2220:1;2217;2210:12;2161:63;2108:122;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2236:139;;;;:::o;2381:474::-;2449:6;2457;2506:2;2494:9;2485:7;2481:23;2477:32;2474:119;;;2512:79;;:::i;:::-;2474:119;2632:1;2657:53;2702:7;2693:6;2682:9;2678:22;2657:53;:::i;:::-;2647:63;;2603:117;2759:2;2785:53;2830:7;2821:6;2810:9;2806:22;2785:53;:::i;:::-;2775:63;;2730:118;2381:474;;;;;:::o;2861:77::-;2898:7;2927:5;2916:16;;2861:77;;;:::o;2944:118::-;3031:24;3049:5;3031:24;:::i;:::-;3026:3;3019:37;2944:118;;:::o;3068:222::-;3161:4;3199:2;3188:9;3184:18;3176:26;;3212:71;3280:1;3269:9;3265:17;3256:6;3212:71;:::i;:::-;3068:222;;;;:::o;3296:99::-;3348:6;3382:5;3376:12;3366:22;;3296:99;;;:::o;3401:169::-;3485:11;3519:6;3514:3;3507:19;3559:4;3554:3;3550:14;3535:29;;3401:169;;;;:::o;3576:246::-;3657:1;3667:113;3681:6;3678:1;3675:13;3667:113;;;3766:1;3761:3;3757:11;3751:18;3747:1;3742:3;3738:11;3731:39;3703:2;3700:1;3696:10;3691:15;;3667:113;;;3814:1;3805:6;3800:3;3796:16;3789:27;3638:184;3576:246;;;:::o;3828:102::-;3869:6;3920:2;3916:7;3911:2;3904:5;3900:14;3896:28;3886:38;;3828:102;;;:::o;3936:377::-;4024:3;4052:39;4085:5;4052:39;:::i;:::-;4107:71;4171:6;4166:3;4107:71;:::i;:::-;4100:78;;4187:65;4245:6;4240:3;4233:4;4226:5;4222:16;4187:65;:::i;:::-;4277:29;4299:6;4277:29;:::i;:::-;4272:3;4268:39;4261:46;;4028:285;3936:377;;;;:::o;4319:313::-;4432:4;4470:2;4459:9;4455:18;4447:26;;4519:9;4513:4;4509:20;4505:1;4494:9;4490:17;4483:47;4547:78;4620:4;4611:6;4547:78;:::i;:::-;4539:86;;4319:313;;;;:::o;4638:329::-;4697:6;4746:2;4734:9;4725:7;4721:23;4717:32;4714:119;;;4752:79;;:::i;:::-;4714:119;4872:1;4897:53;4942:7;4933:6;4922:9;4918:22;4897:53;:::i;:::-;4887:63;;4843:117;4638:329;;;;:::o;4973:118::-;5060:24;5078:5;5060:24;:::i;:::-;5055:3;5048:37;4973:118;;:::o;5097:222::-;5190:4;5228:2;5217:9;5213:18;5205:26;;5241:71;5309:1;5298:9;5294:17;5285:6;5241:71;:::i;:::-;5097:222;;;;:::o;5325:118::-;5412:24;5430:5;5412:24;:::i;:::-;5407:3;5400:37;5325:118;;:::o;5449:222::-;5542:4;5580:2;5569:9;5565:18;5557:26;;5593:71;5661:1;5650:9;5646:17;5637:6;5593:71;:::i;:::-;5449:222;;;;:::o;5677:117::-;5786:1;5783;5776:12;5800:117;5909:1;5906;5899:12;5923:180;5971:77;5968:1;5961:88;6068:4;6065:1;6058:15;6092:4;6089:1;6082:15;6109:281;6192:27;6214:4;6192:27;:::i;:::-;6184:6;6180:40;6322:6;6310:10;6307:22;6286:18;6274:10;6271:34;6268:62;6265:88;;;6333:18;;:::i;:::-;6265:88;6373:10;6369:2;6362:22;6152:238;6109:281;;:::o;6396:129::-;6430:6;6457:20;;:::i;:::-;6447:30;;6486:33;6514:4;6506:6;6486:33;:::i;:::-;6396:129;;;:::o;6531:308::-;6593:4;6683:18;6675:6;6672:30;6669:56;;;6705:18;;:::i;:::-;6669:56;6743:29;6765:6;6743:29;:::i;:::-;6735:37;;6827:4;6821;6817:15;6809:23;;6531:308;;;:::o;6845:146::-;6942:6;6937:3;6932;6919:30;6983:1;6974:6;6969:3;6965:16;6958:27;6845:146;;;:::o;6997:425::-;7075:5;7100:66;7116:49;7158:6;7116:49;:::i;:::-;7100:66;:::i;:::-;7091:75;;7189:6;7182:5;7175:21;7227:4;7220:5;7216:16;7265:3;7256:6;7251:3;7247:16;7244:25;7241:112;;;7272:79;;:::i;:::-;7241:112;7362:54;7409:6;7404:3;7399;7362:54;:::i;:::-;7081:341;6997:425;;;;;:::o;7442:340::-;7498:5;7547:3;7540:4;7532:6;7528:17;7524:27;7514:122;;7555:79;;:::i;:::-;7514:122;7672:6;7659:20;7697:79;7772:3;7764:6;7757:4;7749:6;7745:17;7697:79;:::i;:::-;7688:88;;7504:278;7442:340;;;;:::o;7788:117::-;7897:1;7894;7887:12;7911:117;8020:1;8017;8010:12;8047:552;8104:8;8114:6;8164:3;8157:4;8149:6;8145:17;8141:27;8131:122;;8172:79;;:::i;:::-;8131:122;8285:6;8272:20;8262:30;;8315:18;8307:6;8304:30;8301:117;;;8337:79;;:::i;:::-;8301:117;8451:4;8443:6;8439:17;8427:29;;8505:3;8497:4;8489:6;8485:17;8475:8;8471:32;8468:41;8465:128;;;8512:79;;:::i;:::-;8465:128;8047:552;;;;;:::o;8605:1289::-;8721:6;8729;8737;8745;8753;8761;8810:3;8798:9;8789:7;8785:23;8781:33;8778:120;;;8817:79;;:::i;:::-;8778:120;8937:1;8962:53;9007:7;8998:6;8987:9;8983:22;8962:53;:::i;:::-;8952:63;;8908:117;9064:2;9090:53;9135:7;9126:6;9115:9;9111:22;9090:53;:::i;:::-;9080:63;;9035:118;9192:2;9218:53;9263:7;9254:6;9243:9;9239:22;9218:53;:::i;:::-;9208:63;;9163:118;9348:2;9337:9;9333:18;9320:32;9379:18;9371:6;9368:30;9365:117;;;9401:79;;:::i;:::-;9365:117;9506:63;9561:7;9552:6;9541:9;9537:22;9506:63;:::i;:::-;9496:73;;9291:288;9646:3;9635:9;9631:19;9618:33;9678:18;9670:6;9667:30;9664:117;;;9700:79;;:::i;:::-;9664:117;9813:64;9869:7;9860:6;9849:9;9845:22;9813:64;:::i;:::-;9795:82;;;;9589:298;8605:1289;;;;;;;;:::o;9900:619::-;9977:6;9985;9993;10042:2;10030:9;10021:7;10017:23;10013:32;10010:119;;;10048:79;;:::i;:::-;10010:119;10168:1;10193:53;10238:7;10229:6;10218:9;10214:22;10193:53;:::i;:::-;10183:63;;10139:117;10295:2;10321:53;10366:7;10357:6;10346:9;10342:22;10321:53;:::i;:::-;10311:63;;10266:118;10423:2;10449:53;10494:7;10485:6;10474:9;10470:22;10449:53;:::i;:::-;10439:63;;10394:118;9900:619;;;;;:::o;10525:122::-;10598:24;10616:5;10598:24;:::i;:::-;10591:5;10588:35;10578:63;;10637:1;10634;10627:12;10578:63;10525:122;:::o;10653:139::-;10699:5;10737:6;10724:20;10715:29;;10753:33;10780:5;10753:33;:::i;:::-;10653:139;;;;:::o;10798:329::-;10857:6;10906:2;10894:9;10885:7;10881:23;10877:32;10874:119;;;10912:79;;:::i;:::-;10874:119;11032:1;11057:53;11102:7;11093:6;11082:9;11078:22;11057:53;:::i;:::-;11047:63;;11003:117;10798:329;;;;:::o;11133:474::-;11201:6;11209;11258:2;11246:9;11237:7;11233:23;11229:32;11226:119;;;11264:79;;:::i;:::-;11226:119;11384:1;11409:53;11454:7;11445:6;11434:9;11430:22;11409:53;:::i;:::-;11399:63;;11355:117;11511:2;11537:53;11582:7;11573:6;11562:9;11558:22;11537:53;:::i;:::-;11527:63;;11482:118;11133:474;;;;;:::o;11613:799::-;11700:6;11708;11716;11765:2;11753:9;11744:7;11740:23;11736:32;11733:119;;;11771:79;;:::i;:::-;11733:119;11891:1;11916:53;11961:7;11952:6;11941:9;11937:22;11916:53;:::i;:::-;11906:63;;11862:117;12018:2;12044:53;12089:7;12080:6;12069:9;12065:22;12044:53;:::i;:::-;12034:63;;11989:118;12174:2;12163:9;12159:18;12146:32;12205:18;12197:6;12194:30;12191:117;;;12227:79;;:::i;:::-;12191:117;12332:63;12387:7;12378:6;12367:9;12363:22;12332:63;:::i;:::-;12322:73;;12117:288;11613:799;;;;;:::o;12418:329::-;12477:6;12526:2;12514:9;12505:7;12501:23;12497:32;12494:119;;;12532:79;;:::i;:::-;12494:119;12652:1;12677:53;12722:7;12713:6;12702:9;12698:22;12677:53;:::i;:::-;12667:63;;12623:117;12418:329;;;;:::o;12753:114::-;12820:6;12854:5;12848:12;12838:22;;12753:114;;;:::o;12873:184::-;12972:11;13006:6;13001:3;12994:19;13046:4;13041:3;13037:14;13022:29;;12873:184;;;;:::o;13063:132::-;13130:4;13153:3;13145:11;;13183:4;13178:3;13174:14;13166:22;;13063:132;;;:::o;13201:108::-;13278:24;13296:5;13278:24;:::i;:::-;13273:3;13266:37;13201:108;;:::o;13315:179::-;13384:10;13405:46;13447:3;13439:6;13405:46;:::i;:::-;13483:4;13478:3;13474:14;13460:28;;13315:179;;;;:::o;13500:113::-;13570:4;13602;13597:3;13593:14;13585:22;;13500:113;;;:::o;13649:732::-;13768:3;13797:54;13845:5;13797:54;:::i;:::-;13867:86;13946:6;13941:3;13867:86;:::i;:::-;13860:93;;13977:56;14027:5;13977:56;:::i;:::-;14056:7;14087:1;14072:284;14097:6;14094:1;14091:13;14072:284;;;14173:6;14167:13;14200:63;14259:3;14244:13;14200:63;:::i;:::-;14193:70;;14286:60;14339:6;14286:60;:::i;:::-;14276:70;;14132:224;14119:1;14116;14112:9;14107:14;;14072:284;;;14076:14;14372:3;14365:10;;13773:608;;;13649:732;;;;:::o;14387:373::-;14530:4;14568:2;14557:9;14553:18;14545:26;;14617:9;14611:4;14607:20;14603:1;14592:9;14588:17;14581:47;14645:108;14748:4;14739:6;14645:108;:::i;:::-;14637:116;;14387:373;;;;:::o;14766:116::-;14836:21;14851:5;14836:21;:::i;:::-;14829:5;14826:32;14816:60;;14872:1;14869;14862:12;14816:60;14766:116;:::o;14888:133::-;14931:5;14969:6;14956:20;14947:29;;14985:30;15009:5;14985:30;:::i;:::-;14888:133;;;;:::o;15027:468::-;15092:6;15100;15149:2;15137:9;15128:7;15124:23;15120:32;15117:119;;;15155:79;;:::i;:::-;15117:119;15275:1;15300:53;15345:7;15336:6;15325:9;15321:22;15300:53;:::i;:::-;15290:63;;15246:117;15402:2;15428:50;15470:7;15461:6;15450:9;15446:22;15428:50;:::i;:::-;15418:60;;15373:115;15027:468;;;;;:::o;15501:307::-;15562:4;15652:18;15644:6;15641:30;15638:56;;;15674:18;;:::i;:::-;15638:56;15712:29;15734:6;15712:29;:::i;:::-;15704:37;;15796:4;15790;15786:15;15778:23;;15501:307;;;:::o;15814:423::-;15891:5;15916:65;15932:48;15973:6;15932:48;:::i;:::-;15916:65;:::i;:::-;15907:74;;16004:6;15997:5;15990:21;16042:4;16035:5;16031:16;16080:3;16071:6;16066:3;16062:16;16059:25;16056:112;;;16087:79;;:::i;:::-;16056:112;16177:54;16224:6;16219:3;16214;16177:54;:::i;:::-;15897:340;15814:423;;;;;:::o;16256:338::-;16311:5;16360:3;16353:4;16345:6;16341:17;16337:27;16327:122;;16368:79;;:::i;:::-;16327:122;16485:6;16472:20;16510:78;16584:3;16576:6;16569:4;16561:6;16557:17;16510:78;:::i;:::-;16501:87;;16317:277;16256:338;;;;:::o;16600:943::-;16695:6;16703;16711;16719;16768:3;16756:9;16747:7;16743:23;16739:33;16736:120;;;16775:79;;:::i;:::-;16736:120;16895:1;16920:53;16965:7;16956:6;16945:9;16941:22;16920:53;:::i;:::-;16910:63;;16866:117;17022:2;17048:53;17093:7;17084:6;17073:9;17069:22;17048:53;:::i;:::-;17038:63;;16993:118;17150:2;17176:53;17221:7;17212:6;17201:9;17197:22;17176:53;:::i;:::-;17166:63;;17121:118;17306:2;17295:9;17291:18;17278:32;17337:18;17329:6;17326:30;17323:117;;;17359:79;;:::i;:::-;17323:117;17464:62;17518:7;17509:6;17498:9;17494:22;17464:62;:::i;:::-;17454:72;;17249:287;16600:943;;;;;;;:::o;17549:474::-;17617:6;17625;17674:2;17662:9;17653:7;17649:23;17645:32;17642:119;;;17680:79;;:::i;:::-;17642:119;17800:1;17825:53;17870:7;17861:6;17850:9;17846:22;17825:53;:::i;:::-;17815:63;;17771:117;17927:2;17953:53;17998:7;17989:6;17978:9;17974:22;17953:53;:::i;:::-;17943:63;;17898:118;17549:474;;;;;:::o;18029:817::-;18117:6;18125;18133;18141;18190:2;18178:9;18169:7;18165:23;18161:32;18158:119;;;18196:79;;:::i;:::-;18158:119;18316:1;18341:53;18386:7;18377:6;18366:9;18362:22;18341:53;:::i;:::-;18331:63;;18287:117;18443:2;18469:53;18514:7;18505:6;18494:9;18490:22;18469:53;:::i;:::-;18459:63;;18414:118;18599:2;18588:9;18584:18;18571:32;18630:18;18622:6;18619:30;18616:117;;;18652:79;;:::i;:::-;18616:117;18765:64;18821:7;18812:6;18801:9;18797:22;18765:64;:::i;:::-;18747:82;;;;18542:297;18029:817;;;;;;;:::o;18852:332::-;18973:4;19011:2;19000:9;18996:18;18988:26;;19024:71;19092:1;19081:9;19077:17;19068:6;19024:71;:::i;:::-;19105:72;19173:2;19162:9;19158:18;19149:6;19105:72;:::i;:::-;18852:332;;;;;:::o;19190:180::-;19238:77;19235:1;19228:88;19335:4;19332:1;19325:15;19359:4;19356:1;19349:15;19376:320;19420:6;19457:1;19451:4;19447:12;19437:22;;19504:1;19498:4;19494:12;19525:18;19515:81;;19581:4;19573:6;19569:17;19559:27;;19515:81;19643:2;19635:6;19632:14;19612:18;19609:38;19606:84;;19662:18;;:::i;:::-;19606:84;19427:269;19376:320;;;:::o;19702:231::-;19842:34;19838:1;19830:6;19826:14;19819:58;19911:14;19906:2;19898:6;19894:15;19887:39;19702:231;:::o;19939:366::-;20081:3;20102:67;20166:2;20161:3;20102:67;:::i;:::-;20095:74;;20178:93;20267:3;20178:93;:::i;:::-;20296:2;20291:3;20287:12;20280:19;;19939:366;;;:::o;20311:419::-;20477:4;20515:2;20504:9;20500:18;20492:26;;20564:9;20558:4;20554:20;20550:1;20539:9;20535:17;20528:47;20592:131;20718:4;20592:131;:::i;:::-;20584:139;;20311:419;;;:::o;20736:220::-;20876:34;20872:1;20864:6;20860:14;20853:58;20945:3;20940:2;20932:6;20928:15;20921:28;20736:220;:::o;20962:366::-;21104:3;21125:67;21189:2;21184:3;21125:67;:::i;:::-;21118:74;;21201:93;21290:3;21201:93;:::i;:::-;21319:2;21314:3;21310:12;21303:19;;20962:366;;;:::o;21334:419::-;21500:4;21538:2;21527:9;21523:18;21515:26;;21587:9;21581:4;21577:20;21573:1;21562:9;21558:17;21551:47;21615:131;21741:4;21615:131;:::i;:::-;21607:139;;21334:419;;;:::o;21759:243::-;21899:34;21895:1;21887:6;21883:14;21876:58;21968:26;21963:2;21955:6;21951:15;21944:51;21759:243;:::o;22008:366::-;22150:3;22171:67;22235:2;22230:3;22171:67;:::i;:::-;22164:74;;22247:93;22336:3;22247:93;:::i;:::-;22365:2;22360:3;22356:12;22349:19;;22008:366;;;:::o;22380:419::-;22546:4;22584:2;22573:9;22569:18;22561:26;;22633:9;22627:4;22623:20;22619:1;22608:9;22604:17;22597:47;22661:131;22787:4;22661:131;:::i;:::-;22653:139;;22380:419;;;:::o;22805:229::-;22945:34;22941:1;22933:6;22929:14;22922:58;23014:12;23009:2;23001:6;22997:15;22990:37;22805:229;:::o;23040:366::-;23182:3;23203:67;23267:2;23262:3;23203:67;:::i;:::-;23196:74;;23279:93;23368:3;23279:93;:::i;:::-;23397:2;23392:3;23388:12;23381:19;;23040:366;;;:::o;23412:419::-;23578:4;23616:2;23605:9;23601:18;23593:26;;23665:9;23659:4;23655:20;23651:1;23640:9;23636:17;23629:47;23693:131;23819:4;23693:131;:::i;:::-;23685:139;;23412:419;;;:::o;23837:224::-;23977:34;23973:1;23965:6;23961:14;23954:58;24046:7;24041:2;24033:6;24029:15;24022:32;23837:224;:::o;24067:366::-;24209:3;24230:67;24294:2;24289:3;24230:67;:::i;:::-;24223:74;;24306:93;24395:3;24306:93;:::i;:::-;24424:2;24419:3;24415:12;24408:19;;24067:366;;;:::o;24439:419::-;24605:4;24643:2;24632:9;24628:18;24620:26;;24692:9;24686:4;24682:20;24678:1;24667:9;24663:17;24656:47;24720:131;24846:4;24720:131;:::i;:::-;24712:139;;24439:419;;;:::o;24864:236::-;25004:34;25000:1;24992:6;24988:14;24981:58;25073:19;25068:2;25060:6;25056:15;25049:44;24864:236;:::o;25106:366::-;25248:3;25269:67;25333:2;25328:3;25269:67;:::i;:::-;25262:74;;25345:93;25434:3;25345:93;:::i;:::-;25463:2;25458:3;25454:12;25447:19;;25106:366;;;:::o;25478:419::-;25644:4;25682:2;25671:9;25667:18;25659:26;;25731:9;25725:4;25721:20;25717:1;25706:9;25702:17;25695:47;25759:131;25885:4;25759:131;:::i;:::-;25751:139;;25478:419;;;:::o;25903:234::-;26043:34;26039:1;26031:6;26027:14;26020:58;26112:17;26107:2;26099:6;26095:15;26088:42;25903:234;:::o;26143:366::-;26285:3;26306:67;26370:2;26365:3;26306:67;:::i;:::-;26299:74;;26382:93;26471:3;26382:93;:::i;:::-;26500:2;26495:3;26491:12;26484:19;;26143:366;;;:::o;26515:419::-;26681:4;26719:2;26708:9;26704:18;26696:26;;26768:9;26762:4;26758:20;26754:1;26743:9;26739:17;26732:47;26796:131;26922:4;26796:131;:::i;:::-;26788:139;;26515:419;;;:::o;26940:230::-;27080:34;27076:1;27068:6;27064:14;27057:58;27149:13;27144:2;27136:6;27132:15;27125:38;26940:230;:::o;27176:366::-;27318:3;27339:67;27403:2;27398:3;27339:67;:::i;:::-;27332:74;;27415:93;27504:3;27415:93;:::i;:::-;27533:2;27528:3;27524:12;27517:19;;27176:366;;;:::o;27548:419::-;27714:4;27752:2;27741:9;27737:18;27729:26;;27801:9;27795:4;27791:20;27787:1;27776:9;27772:17;27765:47;27829:131;27955:4;27829:131;:::i;:::-;27821:139;;27548:419;;;:::o;27973:234::-;28113:34;28109:1;28101:6;28097:14;28090:58;28182:17;28177:2;28169:6;28165:15;28158:42;27973:234;:::o;28213:366::-;28355:3;28376:67;28440:2;28435:3;28376:67;:::i;:::-;28369:74;;28452:93;28541:3;28452:93;:::i;:::-;28570:2;28565:3;28561:12;28554:19;;28213:366;;;:::o;28585:419::-;28751:4;28789:2;28778:9;28774:18;28766:26;;28838:9;28832:4;28828:20;28824:1;28813:9;28809:17;28802:47;28866:131;28992:4;28866:131;:::i;:::-;28858:139;;28585:419;;;:::o;29010:234::-;29150:34;29146:1;29138:6;29134:14;29127:58;29219:17;29214:2;29206:6;29202:15;29195:42;29010:234;:::o;29250:366::-;29392:3;29413:67;29477:2;29472:3;29413:67;:::i;:::-;29406:74;;29489:93;29578:3;29489:93;:::i;:::-;29607:2;29602:3;29598:12;29591:19;;29250:366;;;:::o;29622:419::-;29788:4;29826:2;29815:9;29811:18;29803:26;;29875:9;29869:4;29865:20;29861:1;29850:9;29846:17;29839:47;29903:131;30029:4;29903:131;:::i;:::-;29895:139;;29622:419;;;:::o;30047:235::-;30187:34;30183:1;30175:6;30171:14;30164:58;30256:18;30251:2;30243:6;30239:15;30232:43;30047:235;:::o;30288:366::-;30430:3;30451:67;30515:2;30510:3;30451:67;:::i;:::-;30444:74;;30527:93;30616:3;30527:93;:::i;:::-;30645:2;30640:3;30636:12;30629:19;;30288:366;;;:::o;30660:419::-;30826:4;30864:2;30853:9;30849:18;30841:26;;30913:9;30907:4;30903:20;30899:1;30888:9;30884:17;30877:47;30941:131;31067:4;30941:131;:::i;:::-;30933:139;;30660:419;;;:::o;31085:231::-;31225:34;31221:1;31213:6;31209:14;31202:58;31294:14;31289:2;31281:6;31277:15;31270:39;31085:231;:::o;31322:366::-;31464:3;31485:67;31549:2;31544:3;31485:67;:::i;:::-;31478:74;;31561:93;31650:3;31561:93;:::i;:::-;31679:2;31674:3;31670:12;31663:19;;31322:366;;;:::o;31694:419::-;31860:4;31898:2;31887:9;31883:18;31875:26;;31947:9;31941:4;31937:20;31933:1;31922:9;31918:17;31911:47;31975:131;32101:4;31975:131;:::i;:::-;31967:139;;31694:419;;;:::o;32119:180::-;32167:77;32164:1;32157:88;32264:4;32261:1;32254:15;32288:4;32285:1;32278:15;32305:233;32445:34;32441:1;32433:6;32429:14;32422:58;32514:16;32509:2;32501:6;32497:15;32490:41;32305:233;:::o;32544:366::-;32686:3;32707:67;32771:2;32766:3;32707:67;:::i;:::-;32700:74;;32783:93;32872:3;32783:93;:::i;:::-;32901:2;32896:3;32892:12;32885:19;;32544:366;;;:::o;32916:419::-;33082:4;33120:2;33109:9;33105:18;33097:26;;33169:9;33163:4;33159:20;33155:1;33144:9;33140:17;33133:47;33197:131;33323:4;33197:131;:::i;:::-;33189:139;;32916:419;;;:::o;33341:228::-;33481:34;33477:1;33469:6;33465:14;33458:58;33550:11;33545:2;33537:6;33533:15;33526:36;33341:228;:::o;33575:366::-;33717:3;33738:67;33802:2;33797:3;33738:67;:::i;:::-;33731:74;;33814:93;33903:3;33814:93;:::i;:::-;33932:2;33927:3;33923:12;33916:19;;33575:366;;;:::o;33947:419::-;34113:4;34151:2;34140:9;34136:18;34128:26;;34200:9;34194:4;34190:20;34186:1;34175:9;34171:17;34164:47;34228:131;34354:4;34228:131;:::i;:::-;34220:139;;33947:419;;;:::o;34372:229::-;34512:34;34508:1;34500:6;34496:14;34489:58;34581:12;34576:2;34568:6;34564:15;34557:37;34372:229;:::o;34607:366::-;34749:3;34770:67;34834:2;34829:3;34770:67;:::i;:::-;34763:74;;34846:93;34935:3;34846:93;:::i;:::-;34964:2;34959:3;34955:12;34948:19;;34607:366;;;:::o;34979:419::-;35145:4;35183:2;35172:9;35168:18;35160:26;;35232:9;35226:4;35222:20;35218:1;35207:9;35203:17;35196:47;35260:131;35386:4;35260:131;:::i;:::-;35252:139;;34979:419;;;:::o;35404:182::-;35544:34;35540:1;35532:6;35528:14;35521:58;35404:182;:::o;35592:366::-;35734:3;35755:67;35819:2;35814:3;35755:67;:::i;:::-;35748:74;;35831:93;35920:3;35831:93;:::i;:::-;35949:2;35944:3;35940:12;35933:19;;35592:366;;;:::o;35964:419::-;36130:4;36168:2;36157:9;36153:18;36145:26;;36217:9;36211:4;36207:20;36203:1;36192:9;36188:17;36181:47;36245:131;36371:4;36245:131;:::i;:::-;36237:139;;35964:419;;;:::o;36389:180::-;36437:77;36434:1;36427:88;36534:4;36531:1;36524:15;36558:4;36555:1;36548:15;36575:233;36614:3;36637:24;36655:5;36637:24;:::i;:::-;36628:33;;36683:66;36676:5;36673:77;36670:103;;36753:18;;:::i;:::-;36670:103;36800:1;36793:5;36789:13;36782:20;;36575:233;;;:::o;36814:175::-;36954:27;36950:1;36942:6;36938:14;36931:51;36814:175;:::o;36995:366::-;37137:3;37158:67;37222:2;37217:3;37158:67;:::i;:::-;37151:74;;37234:93;37323:3;37234:93;:::i;:::-;37352:2;37347:3;37343:12;37336:19;;36995:366;;;:::o;37367:419::-;37533:4;37571:2;37560:9;37556:18;37548:26;;37620:9;37614:4;37610:20;37606:1;37595:9;37591:17;37584:47;37648:131;37774:4;37648:131;:::i;:::-;37640:139;;37367:419;;;:::o;37792:235::-;37932:34;37928:1;37920:6;37916:14;37909:58;38001:18;37996:2;37988:6;37984:15;37977:43;37792:235;:::o;38033:366::-;38175:3;38196:67;38260:2;38255:3;38196:67;:::i;:::-;38189:74;;38272:93;38361:3;38272:93;:::i;:::-;38390:2;38385:3;38381:12;38374:19;;38033:366;;;:::o;38405:419::-;38571:4;38609:2;38598:9;38594:18;38586:26;;38658:9;38652:4;38648:20;38644:1;38633:9;38629:17;38622:47;38686:131;38812:4;38686:131;:::i;:::-;38678:139;;38405:419;;;:::o;38830:225::-;38970:34;38966:1;38958:6;38954:14;38947:58;39039:8;39034:2;39026:6;39022:15;39015:33;38830:225;:::o;39061:366::-;39203:3;39224:67;39288:2;39283:3;39224:67;:::i;:::-;39217:74;;39300:93;39389:3;39300:93;:::i;:::-;39418:2;39413:3;39409:12;39402:19;;39061:366;;;:::o;39433:419::-;39599:4;39637:2;39626:9;39622:18;39614:26;;39686:9;39680:4;39676:20;39672:1;39661:9;39657:17;39650:47;39714:131;39840:4;39714:131;:::i;:::-;39706:139;;39433:419;;;:::o;39858:86::-;39893:7;39933:4;39926:5;39922:16;39911:27;;39858:86;;;:::o;39950:112::-;40033:22;40049:5;40033:22;:::i;:::-;40028:3;40021:35;39950:112;;:::o;40068:545::-;40241:4;40279:3;40268:9;40264:19;40256:27;;40293:71;40361:1;40350:9;40346:17;40337:6;40293:71;:::i;:::-;40374:68;40438:2;40427:9;40423:18;40414:6;40374:68;:::i;:::-;40452:72;40520:2;40509:9;40505:18;40496:6;40452:72;:::i;:::-;40534;40602:2;40591:9;40587:18;40578:6;40534:72;:::i;:::-;40068:545;;;;;;;:::o;40619:233::-;40759:34;40755:1;40747:6;40743:14;40736:58;40828:16;40823:2;40815:6;40811:15;40804:41;40619:233;:::o;40858:366::-;41000:3;41021:67;41085:2;41080:3;41021:67;:::i;:::-;41014:74;;41097:93;41186:3;41097:93;:::i;:::-;41215:2;41210:3;41206:12;41199:19;;40858:366;;;:::o;41230:419::-;41396:4;41434:2;41423:9;41419:18;41411:26;;41483:9;41477:4;41473:20;41469:1;41458:9;41454:17;41447:47;41511:131;41637:4;41511:131;:::i;:::-;41503:139;;41230:419;;;:::o;41655:141::-;41704:4;41727:3;41719:11;;41750:3;41747:1;41740:14;41784:4;41781:1;41771:18;41763:26;;41655:141;;;:::o;41802:93::-;41839:6;41886:2;41881;41874:5;41870:14;41866:23;41856:33;;41802:93;;;:::o;41901:107::-;41945:8;41995:5;41989:4;41985:16;41964:37;;41901:107;;;;:::o;42014:393::-;42083:6;42133:1;42121:10;42117:18;42156:97;42186:66;42175:9;42156:97;:::i;:::-;42274:39;42304:8;42293:9;42274:39;:::i;:::-;42262:51;;42346:4;42342:9;42335:5;42331:21;42322:30;;42395:4;42385:8;42381:19;42374:5;42371:30;42361:40;;42090:317;;42014:393;;;;;:::o;42413:60::-;42441:3;42462:5;42455:12;;42413:60;;;:::o;42479:142::-;42529:9;42562:53;42580:34;42589:24;42607:5;42589:24;:::i;:::-;42580:34;:::i;:::-;42562:53;:::i;:::-;42549:66;;42479:142;;;:::o;42627:75::-;42670:3;42691:5;42684:12;;42627:75;;;:::o;42708:269::-;42818:39;42849:7;42818:39;:::i;:::-;42879:91;42928:41;42952:16;42928:41;:::i;:::-;42920:6;42913:4;42907:11;42879:91;:::i;:::-;42873:4;42866:105;42784:193;42708:269;;;:::o;42983:73::-;43028:3;42983:73;:::o;43062:189::-;43139:32;;:::i;:::-;43180:65;43238:6;43230;43224:4;43180:65;:::i;:::-;43115:136;43062:189;;:::o;43257:186::-;43317:120;43334:3;43327:5;43324:14;43317:120;;;43388:39;43425:1;43418:5;43388:39;:::i;:::-;43361:1;43354:5;43350:13;43341:22;;43317:120;;;43257:186;;:::o;43449:543::-;43550:2;43545:3;43542:11;43539:446;;;43584:38;43616:5;43584:38;:::i;:::-;43668:29;43686:10;43668:29;:::i;:::-;43658:8;43654:44;43851:2;43839:10;43836:18;43833:49;;;43872:8;43857:23;;43833:49;43895:80;43951:22;43969:3;43951:22;:::i;:::-;43941:8;43937:37;43924:11;43895:80;:::i;:::-;43554:431;;43539:446;43449:543;;;:::o;43998:117::-;44052:8;44102:5;44096:4;44092:16;44071:37;;43998:117;;;;:::o;44121:169::-;44165:6;44198:51;44246:1;44242:6;44234:5;44231:1;44227:13;44198:51;:::i;:::-;44194:56;44279:4;44273;44269:15;44259:25;;44172:118;44121:169;;;;:::o;44295:295::-;44371:4;44517:29;44542:3;44536:4;44517:29;:::i;:::-;44509:37;;44579:3;44576:1;44572:11;44566:4;44563:21;44555:29;;44295:295;;;;:::o;44595:1395::-;44712:37;44745:3;44712:37;:::i;:::-;44814:18;44806:6;44803:30;44800:56;;;44836:18;;:::i;:::-;44800:56;44880:38;44912:4;44906:11;44880:38;:::i;:::-;44965:67;45025:6;45017;45011:4;44965:67;:::i;:::-;45059:1;45083:4;45070:17;;45115:2;45107:6;45104:14;45132:1;45127:618;;;;45789:1;45806:6;45803:77;;;45855:9;45850:3;45846:19;45840:26;45831:35;;45803:77;45906:67;45966:6;45959:5;45906:67;:::i;:::-;45900:4;45893:81;45762:222;45097:887;;45127:618;45179:4;45175:9;45167:6;45163:22;45213:37;45245:4;45213:37;:::i;:::-;45272:1;45286:208;45300:7;45297:1;45294:14;45286:208;;;45379:9;45374:3;45370:19;45364:26;45356:6;45349:42;45430:1;45422:6;45418:14;45408:24;;45477:2;45466:9;45462:18;45449:31;;45323:4;45320:1;45316:12;45311:17;;45286:208;;;45522:6;45513:7;45510:19;45507:179;;;45580:9;45575:3;45571:19;45565:26;45623:48;45665:4;45657:6;45653:17;45642:9;45623:48;:::i;:::-;45615:6;45608:64;45530:156;45507:179;45732:1;45728;45720:6;45716:14;45712:22;45706:4;45699:36;45134:611;;;45097:887;;44687:1303;;;44595:1395;;:::o;45996:231::-;46136:34;46132:1;46124:6;46120:14;46113:58;46205:14;46200:2;46192:6;46188:15;46181:39;45996:231;:::o;46233:366::-;46375:3;46396:67;46460:2;46455:3;46396:67;:::i;:::-;46389:74;;46472:93;46561:3;46472:93;:::i;:::-;46590:2;46585:3;46581:12;46574:19;;46233:366;;;:::o;46605:419::-;46771:4;46809:2;46798:9;46794:18;46786:26;;46858:9;46852:4;46848:20;46844:1;46833:9;46829:17;46822:47;46886:131;47012:4;46886:131;:::i;:::-;46878:139;;46605:419;;;:::o;47030:228::-;47170:34;47166:1;47158:6;47154:14;47147:58;47239:11;47234:2;47226:6;47222:15;47215:36;47030:228;:::o;47264:366::-;47406:3;47427:67;47491:2;47486:3;47427:67;:::i;:::-;47420:74;;47503:93;47592:3;47503:93;:::i;:::-;47621:2;47616:3;47612:12;47605:19;;47264:366;;;:::o;47636:419::-;47802:4;47840:2;47829:9;47825:18;47817:26;;47889:9;47883:4;47879:20;47875:1;47864:9;47860:17;47853:47;47917:131;48043:4;47917:131;:::i;:::-;47909:139;;47636:419;;;:::o;48061:223::-;48201:34;48197:1;48189:6;48185:14;48178:58;48270:6;48265:2;48257:6;48253:15;48246:31;48061:223;:::o;48290:366::-;48432:3;48453:67;48517:2;48512:3;48453:67;:::i;:::-;48446:74;;48529:93;48618:3;48529:93;:::i;:::-;48647:2;48642:3;48638:12;48631:19;;48290:366;;;:::o;48662:419::-;48828:4;48866:2;48855:9;48851:18;48843:26;;48915:9;48909:4;48905:20;48901:1;48890:9;48886:17;48879:47;48943:131;49069:4;48943:131;:::i;:::-;48935:139;;48662:419;;;:::o;49087:194::-;49127:4;49147:20;49165:1;49147:20;:::i;:::-;49142:25;;49181:20;49199:1;49181:20;:::i;:::-;49176:25;;49225:1;49222;49218:9;49210:17;;49249:1;49243:4;49240:11;49237:37;;;49254:18;;:::i;:::-;49237:37;49087:194;;;;:::o;49287:191::-;49327:3;49346:20;49364:1;49346:20;:::i;:::-;49341:25;;49380:20;49398:1;49380:20;:::i;:::-;49375:25;;49423:1;49420;49416:9;49409:16;;49444:3;49441:1;49438:10;49435:36;;;49451:18;;:::i;:::-;49435:36;49287:191;;;;:::o;49484:170::-;49624:22;49620:1;49612:6;49608:14;49601:46;49484:170;:::o;49660:366::-;49802:3;49823:67;49887:2;49882:3;49823:67;:::i;:::-;49816:74;;49899:93;49988:3;49899:93;:::i;:::-;50017:2;50012:3;50008:12;50001:19;;49660:366;;;:::o;50032:419::-;50198:4;50236:2;50225:9;50221:18;50213:26;;50285:9;50279:4;50275:20;50271:1;50260:9;50256:17;50249:47;50313:131;50439:4;50313:131;:::i;:::-;50305:139;;50032:419;;;:::o;50457:237::-;50597:34;50593:1;50585:6;50581:14;50574:58;50666:20;50661:2;50653:6;50649:15;50642:45;50457:237;:::o;50700:366::-;50842:3;50863:67;50927:2;50922:3;50863:67;:::i;:::-;50856:74;;50939:93;51028:3;50939:93;:::i;:::-;51057:2;51052:3;51048:12;51041:19;;50700:366;;;:::o;51072:419::-;51238:4;51276:2;51265:9;51261:18;51253:26;;51325:9;51319:4;51315:20;51311:1;51300:9;51296:17;51289:47;51353:131;51479:4;51353:131;:::i;:::-;51345:139;;51072:419;;;:::o;51497:166::-;51637:18;51633:1;51625:6;51621:14;51614:42;51497:166;:::o;51669:366::-;51811:3;51832:67;51896:2;51891:3;51832:67;:::i;:::-;51825:74;;51908:93;51997:3;51908:93;:::i;:::-;52026:2;52021:3;52017:12;52010:19;;51669:366;;;:::o;52041:419::-;52207:4;52245:2;52234:9;52230:18;52222:26;;52294:9;52288:4;52284:20;52280:1;52269:9;52265:17;52258:47;52322:131;52448:4;52322:131;:::i;:::-;52314:139;;52041:419;;;:::o;52466:236::-;52606:34;52602:1;52594:6;52590:14;52583:58;52675:19;52670:2;52662:6;52658:15;52651:44;52466:236;:::o;52708:366::-;52850:3;52871:67;52935:2;52930:3;52871:67;:::i;:::-;52864:74;;52947:93;53036:3;52947:93;:::i;:::-;53065:2;53060:3;53056:12;53049:19;;52708:366;;;:::o;53080:419::-;53246:4;53284:2;53273:9;53269:18;53261:26;;53333:9;53327:4;53323:20;53319:1;53308:9;53304:17;53297:47;53361:131;53487:4;53361:131;:::i;:::-;53353:139;;53080:419;;;:::o;53505:148::-;53607:11;53644:3;53629:18;;53505:148;;;;:::o;53659:390::-;53765:3;53793:39;53826:5;53793:39;:::i;:::-;53848:89;53930:6;53925:3;53848:89;:::i;:::-;53841:96;;53946:65;54004:6;53999:3;53992:4;53985:5;53981:16;53946:65;:::i;:::-;54036:6;54031:3;54027:16;54020:23;;53769:280;53659:390;;;;:::o;54055:435::-;54235:3;54257:95;54348:3;54339:6;54257:95;:::i;:::-;54250:102;;54369:95;54460:3;54451:6;54369:95;:::i;:::-;54362:102;;54481:3;54474:10;;54055:435;;;;;:::o;54496:174::-;54636:26;54632:1;54624:6;54620:14;54613:50;54496:174;:::o;54676:366::-;54818:3;54839:67;54903:2;54898:3;54839:67;:::i;:::-;54832:74;;54915:93;55004:3;54915:93;:::i;:::-;55033:2;55028:3;55024:12;55017:19;;54676:366;;;:::o;55048:419::-;55214:4;55252:2;55241:9;55237:18;55229:26;;55301:9;55295:4;55291:20;55287:1;55276:9;55272:17;55265:47;55329:131;55455:4;55329:131;:::i;:::-;55321:139;;55048:419;;;:::o;55473:180::-;55613:32;55609:1;55601:6;55597:14;55590:56;55473:180;:::o;55659:366::-;55801:3;55822:67;55886:2;55881:3;55822:67;:::i;:::-;55815:74;;55898:93;55987:3;55898:93;:::i;:::-;56016:2;56011:3;56007:12;56000:19;;55659:366;;;:::o;56031:419::-;56197:4;56235:2;56224:9;56220:18;56212:26;;56284:9;56278:4;56274:20;56270:1;56259:9;56255:17;56248:47;56312:131;56438:4;56312:131;:::i;:::-;56304:139;;56031:419;;;:::o;56456:98::-;56507:6;56541:5;56535:12;56525:22;;56456:98;;;:::o;56560:168::-;56643:11;56677:6;56672:3;56665:19;56717:4;56712:3;56708:14;56693:29;;56560:168;;;;:::o;56734:373::-;56820:3;56848:38;56880:5;56848:38;:::i;:::-;56902:70;56965:6;56960:3;56902:70;:::i;:::-;56895:77;;56981:65;57039:6;57034:3;57027:4;57020:5;57016:16;56981:65;:::i;:::-;57071:29;57093:6;57071:29;:::i;:::-;57066:3;57062:39;57055:46;;56824:283;56734:373;;;;:::o;57113:640::-;57308:4;57346:3;57335:9;57331:19;57323:27;;57360:71;57428:1;57417:9;57413:17;57404:6;57360:71;:::i;:::-;57441:72;57509:2;57498:9;57494:18;57485:6;57441:72;:::i;:::-;57523;57591:2;57580:9;57576:18;57567:6;57523:72;:::i;:::-;57642:9;57636:4;57632:20;57627:2;57616:9;57612:18;57605:48;57670:76;57741:4;57732:6;57670:76;:::i;:::-;57662:84;;57113:640;;;;;;;:::o;57759:141::-;57815:5;57846:6;57840:13;57831:22;;57862:32;57888:5;57862:32;:::i;:::-;57759:141;;;;:::o;57906:349::-;57975:6;58024:2;58012:9;58003:7;57999:23;57995:32;57992:119;;;58030:79;;:::i;:::-;57992:119;58150:1;58175:63;58230:7;58221:6;58210:9;58206:22;58175:63;:::i;:::-;58165:73;;58121:127;57906:349;;;;:::o;58261:234::-;58401:34;58397:1;58389:6;58385:14;58378:58;58470:17;58465:2;58457:6;58453:15;58446:42;58261:234;:::o;58501:366::-;58643:3;58664:67;58728:2;58723:3;58664:67;:::i;:::-;58657:74;;58740:93;58829:3;58740:93;:::i;:::-;58858:2;58853:3;58849:12;58842:19;;58501:366;;;:::o;58873:419::-;59039:4;59077:2;59066:9;59062:18;59054:26;;59126:9;59120:4;59116:20;59112:1;59101:9;59097:17;59090:47;59154:131;59280:4;59154:131;:::i;:::-;59146:139;;58873:419;;;:::o;59298:182::-;59438:34;59434:1;59426:6;59422:14;59415:58;59298:182;:::o;59486:366::-;59628:3;59649:67;59713:2;59708:3;59649:67;:::i;:::-;59642:74;;59725:93;59814:3;59725:93;:::i;:::-;59843:2;59838:3;59834:12;59827:19;;59486:366;;;:::o;59858:419::-;60024:4;60062:2;60051:9;60047:18;60039:26;;60111:9;60105:4;60101:20;60097:1;60086:9;60082:17;60075:47;60139:131;60265:4;60139:131;:::i;:::-;60131:139;;59858:419;;;:::o;60283:178::-;60423:30;60419:1;60411:6;60407:14;60400:54;60283:178;:::o;60467:366::-;60609:3;60630:67;60694:2;60689:3;60630:67;:::i;:::-;60623:74;;60706:93;60795:3;60706:93;:::i;:::-;60824:2;60819:3;60815:12;60808:19;;60467:366;;;:::o;60839:419::-;61005:4;61043:2;61032:9;61028:18;61020:26;;61092:9;61086:4;61082:20;61078:1;61067:9;61063:17;61056:47;61120:131;61246:4;61120:131;:::i;:::-;61112:139;;60839:419;;;:::o;61264:180::-;61312:77;61309:1;61302:88;61409:4;61406:1;61399:15;61433:4;61430:1;61423:15;61450:185;61490:1;61507:20;61525:1;61507:20;:::i;:::-;61502:25;;61541:20;61559:1;61541:20;:::i;:::-;61536:25;;61580:1;61570:35;;61585:18;;:::i;:::-;61570:35;61627:1;61624;61620:9;61615:14;;61450:185;;;;:::o;61641:176::-;61673:1;61690:20;61708:1;61690:20;:::i;:::-;61685:25;;61724:20;61742:1;61724:20;:::i;:::-;61719:25;;61763:1;61753:35;;61768:18;;:::i;:::-;61753:35;61809:1;61806;61802:9;61797:14;;61641:176;;;;:::o;61823:180::-;61871:77;61868:1;61861:88;61968:4;61965:1;61958:15;61992:4;61989:1;61982:15
Swarm Source
ipfs://9c0800dc566614d73c717eaa941a6c108a764d55d86f61c78354100354821759
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.