ERC-721
Overview
Max Total Supply
413 EFN
Holders
190
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 EFNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EyeFunny
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: NONE pragma solidity ^0.8.10; import "./OpenzeppelinERC721.sol"; import "./OpenZeppelinMerkleProof.sol"; contract EyeFunny is ERC721Enumerable { address public owner; string ipfsBase = "ipfs://QmWpjzkaxA64LwJ9TsWutActDjw7BYfu6jw3rGvtgMFXVc/"; bool privateMintStarted = false; bool publicMintStarted = false; mapping(uint => bool) public isMinted; mapping(address => uint) public addressMintedMap; uint public privateSalePrice = 0.15 ether; uint public publicSalePrice = 0.3 ether; uint public maxMintAmout = 2; address eyeFunnyWallet = 0xFDD2B857ce451E9246580a841EB2e8BeF52710e5; address eyeFunnyDeployWallet = 0xe79ea19d89357d594E736951cEeD08dbC142fB33; bytes32 allowListRoot = 0x37ad0982904787419523e407958377f77b92b71fa74ffe7b7b0d7be4b188c12f; constructor() ERC721("EyeFunny NFT" , "EFN" ) { owner = eyeFunnyDeployWallet; for(uint256 i=0; i<= 95; i++){ _safeMint(eyeFunnyDeployWallet , i); isMinted[i] = true; } } function setPrivateSalePrice(uint _price) public { require(_msgSender() == owner); privateSalePrice = _price; } function setPublicSalePrice(uint _price) public { require(_msgSender() == owner); publicSalePrice = _price; } function executeMint(uint _nftId) internal { require(isMinted[_nftId] == false, "already minted"); _safeMint(msg.sender,_nftId); addressMintedMap[msg.sender]++; isMinted[_nftId] = true; uint balance = address(this).balance; payable(eyeFunnyWallet).transfer(balance); } function publicSaleMint(uint[] memory _nftIds) public payable { require(msg.value == publicSalePrice * _nftIds.length); require(publicMintStarted,"public sale not started"); for(uint256 i=0; i<_nftIds.length ;i++){ require(96 <= _nftIds[i] && _nftIds[i] < 1152, "invalid nft id"); executeMint(_nftIds[i]); } } function privateSaleMint(address account, bytes32[] calldata proof , uint[] memory _nftIds) public payable { require(privateMintStarted,"private sale not started"); require(msg.value == privateSalePrice * _nftIds.length); require(checkRedeem(account, proof) > 0,"account is not in allowlist" ); require(msg.sender == account); for(uint256 i=0; i<_nftIds.length ;i++){ require(96 <= _nftIds[i] && _nftIds[i] < 1152, "invalid nft id"); require(addressMintedMap[msg.sender] < maxMintAmout , "mint amount over"); executeMint(_nftIds[i]); } } function checkRedeem(address account,bytes32[] calldata proof ) public view returns(uint) { if(_verify(_leaf(account), proof)){ return maxMintAmout; }else { return 0; } } function _leaf(address account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account)); } function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns(bool) { return MerkleProof.verify(proof, allowListRoot, leaf); } function teamMint(uint _startId)public { uint mintedNum = 0; require (msg.sender == owner); for(uint i=0; mintedNum<20; i++) { if(isMinted[_startId + i] == false){ _safeMint(msg.sender , _startId + i); isMinted[_startId + i] = true; mintedNum++; } } } function notMintedNFT(uint tokenId) public view returns (uint){ require(tokenId < 1152, "not exist."); require(0 <= tokenId, "not exist."); require(isMinted[tokenId] == false, "already minted."); return tokenId; } function _baseURI()internal view override returns(string memory){ return ipfsBase; } function setBaseURI(string memory _ipfsBase) public { require(_msgSender() == owner); ipfsBase = _ipfsBase; } function privateMintStart() public { require(_msgSender() == owner); privateMintStarted = true; } function privateMintStop() public { require(_msgSender() == owner); privateMintStarted = false; } function publicMintStart() public { require(_msgSender() == owner); publicMintStarted = true; } function publicMintStop() public { require(_msgSender() == owner); publicMintStarted = false; } function withdraw() public { require(_msgSender() == owner); uint balance = address(this).balance; payable(eyeFunnyWallet).transfer(balance); } function tokenURI(uint256 _tokenId) public view override returns(string memory) { require(_exists(_tokenId)); return super.tokenURI(_tokenId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } /** * @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); } } /** * @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); } /** * @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; } } /** * @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 Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { 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 override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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 { } } /** * @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 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]; } /** * @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]; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"checkRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"notMintedNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"privateMintStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256[]","name":"_nftIds","type":"uint256[]"}],"name":"privateSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"privateSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicMintStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_nftIds","type":"uint256[]"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ipfsBase","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrivateSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPublicSalePrice","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":"_startId","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","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":[],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180606001604052806036815260200162005c4260369139600b90805190602001906200003592919062000cd4565b506000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff021916908315150217905550670214e8348c4f0000600f55670429d069189e0000601055600260115573fdd2b857ce451e9246580a841eb2e8bef52710e5601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e79ea19d89357d594e736951ceed08dbc142fb33601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f37ad0982904787419523e407958377f77b92b71fa74ffe7b7b0d7be4b188c12f60001b6014553480156200016757600080fd5b506040518060400160405280600c81526020017f45796546756e6e79204e465400000000000000000000000000000000000000008152506040518060400160405280600381526020017f45464e00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001ec92919062000cd4565b5080600190805190602001906200020592919062000cd4565b505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b605f8111620002ed57620002ab601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682620002f460201b60201c565b6001600d600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620002e49062000dbd565b9150506200026e565b506200136d565b620003168282604051806020016040528060008152506200031a60201b60201c565b5050565b6200032c83836200038860201b60201c565b6200034160008484846200056e60201b60201c565b62000383576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037a9062000e92565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f29062000f04565b60405180910390fd5b6200040c816200071860201b60201c565b156200044f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004469062000f76565b60405180910390fd5b62000463600083836200078460201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004b5919062000f98565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200059c8473ffffffffffffffffffffffffffffffffffffffff16620008cb60201b62001b8b1760201c565b156200070b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005ce620008de60201b60201c565b8786866040518563ffffffff1660e01b8152600401620005f29493929190620010ef565b6020604051808303816000875af19250505080156200063157506040513d601f19601f820116820180604052508101906200062e9190620011a5565b60015b620006ba573d806000811462000664576040519150601f19603f3d011682016040523d82523d6000602084013e62000669565b606091505b50600081511415620006b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006a99062000e92565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000710565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200079c838383620008e660201b62001b9e1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620007e957620007e381620008eb60201b60201c565b62000831565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000830576200082f83826200093460201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200087e57620008788162000ab160201b60201c565b620008c6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620008c557620008c4828262000b8d60201b60201c565b5b5b505050565b600080823b905060008111915050919050565b600033905090565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016200094e8462000c1960201b620011301760201c565b6200095a9190620011d7565b905060006007600084815260200190815260200160002054905081811462000a40576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000ac79190620011d7565b905060006009600084815260200190815260200160002054905060006008838154811062000afa5762000af962001212565b5b90600052602060002001549050806008838154811062000b1f5762000b1e62001212565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000b715762000b7062001241565b5b6001900381819060005260206000200160009055905550505050565b600062000ba58362000c1960201b620011301760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000c8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c8490620012e6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000ce29062001337565b90600052602060002090601f01602090048101928262000d06576000855562000d52565b82601f1062000d2157805160ff191683800117855562000d52565b8280016001018555821562000d52579182015b8281111562000d5157825182559160200191906001019062000d34565b5b50905062000d61919062000d65565b5090565b5b8082111562000d8057600081600090555060010162000d66565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600062000dca8262000db3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000e005762000dff62000d84565b5b600182019050919050565b600082825260208201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600062000e7a60328362000e0b565b915062000e878262000e1c565b604082019050919050565b6000602082019050818103600083015262000ead8162000e6b565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600062000eec60208362000e0b565b915062000ef98262000eb4565b602082019050919050565b6000602082019050818103600083015262000f1f8162000edd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062000f5e601c8362000e0b565b915062000f6b8262000f26565b602082019050919050565b6000602082019050818103600083015262000f918162000f4f565b9050919050565b600062000fa58262000db3565b915062000fb28362000db3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000fea5762000fe962000d84565b5b828201905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620010228262000ff5565b9050919050565b620010348162001015565b82525050565b620010458162000db3565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620010875780820151818401526020810190506200106a565b8381111562001097576000848401525b50505050565b6000601f19601f8301169050919050565b6000620010bb826200104b565b620010c7818562001056565b9350620010d981856020860162001067565b620010e4816200109d565b840191505092915050565b600060808201905062001106600083018762001029565b62001115602083018662001029565b6200112460408301856200103a565b8181036060830152620011388184620010ae565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200117f8162001148565b81146200118b57600080fd5b50565b6000815190506200119f8162001174565b92915050565b600060208284031215620011be57620011bd62001143565b5b6000620011ce848285016200118e565b91505092915050565b6000620011e48262000db3565b9150620011f18362000db3565b92508282101562001207576200120662000d84565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000620012ce602a8362000e0b565b9150620012db8262001270565b604082019050919050565b600060208201905081810360008301526200130181620012bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200135057607f821691505b6020821081141562001367576200136662001308565b5b50919050565b6148c5806200137d6000396000f3fe6080604052600436106102045760003560e01c806368feee22116101185780639b6860c8116100a0578063c87b56dd1161006f578063c87b56dd14610742578063ca25052e1461077f578063e985e9c51461079b578063f50717e1146107d8578063f560d4151461080357610204565b80639b6860c8146106ae578063a22cb465146106d9578063b88d4fde14610702578063c1779e9b1461072b57610204565b80637f396dfb116100e75780637f396dfb146105e8578063863faa1e146106045780638cfec4c0146106415780638da5cb5b1461065857806395d89b411461068357610204565b806368feee221461051c57806370a0823114610559578063791a2519146105965780637bc36e04146105bf57610204565b806323b872dd1161019b5780633ccfd60b1161016a5780633ccfd60b1461043957806342842e0e146104505780634f6ccce71461047957806355f804b3146104b65780636352211e146104df57610204565b806323b872dd1461036d5780632f745c59146103965780632fbba115146103d357806333c41a90146103fc57610204565b8063095ea7b3116101d7578063095ea7b3146102c55780630a7a1c38146102ee57806318160ddd1461032b5780631b63c5ae1461035657610204565b806301ffc9a71461020957806304fc156e1461024657806306fdde031461025d578063081812fc14610288575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612f92565b61082e565b60405161023d9190612fda565b60405180910390f35b34801561025257600080fd5b5061025b6108a8565b005b34801561026957600080fd5b50610272610926565b60405161027f919061308e565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa91906130e6565b6109b8565b6040516102bc9190613154565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e7919061319b565b610a3d565b005b3480156102fa57600080fd5b50610315600480360381019061031091906131db565b610b55565b6040516103229190613217565b60405180910390f35b34801561033757600080fd5b50610340610b6d565b60405161034d9190613217565b60405180910390f35b34801561036257600080fd5b5061036b610b7a565b005b34801561037957600080fd5b50610394600480360381019061038f9190613232565b610bf8565b005b3480156103a257600080fd5b506103bd60048036038101906103b8919061319b565b610c58565b6040516103ca9190613217565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906130e6565b610cfd565b005b34801561040857600080fd5b50610423600480360381019061041e91906130e6565b610e10565b6040516104309190612fda565b60405180910390f35b34801561044557600080fd5b5061044e610e30565b005b34801561045c57600080fd5b5061047760048036038101906104729190613232565b610f02565b005b34801561048557600080fd5b506104a0600480360381019061049b91906130e6565b610f22565b6040516104ad9190613217565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d891906133ba565b610f93565b005b3480156104eb57600080fd5b50610506600480360381019061050191906130e6565b61100e565b6040516105139190613154565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613463565b6110c0565b6040516105509190613217565b60405180910390f35b34801561056557600080fd5b50610580600480360381019061057b91906131db565b611130565b60405161058d9190613217565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b891906130e6565b6111e8565b005b3480156105cb57600080fd5b506105e660048036038101906105e191906130e6565b611253565b005b61060260048036038101906105fd9190613586565b6112be565b005b34801561061057600080fd5b5061062b600480360381019061062691906130e6565b6113f2565b6040516106389190613217565b60405180910390f35b34801561064d57600080fd5b506106566114eb565b005b34801561066457600080fd5b5061066d611569565b60405161067a9190613154565b60405180910390f35b34801561068f57600080fd5b5061069861158f565b6040516106a5919061308e565b60405180910390f35b3480156106ba57600080fd5b506106c3611621565b6040516106d09190613217565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb91906135fb565b611627565b005b34801561070e57600080fd5b50610729600480360381019061072491906136dc565b6117a8565b005b34801561073757600080fd5b5061074061180a565b005b34801561074e57600080fd5b50610769600480360381019061076491906130e6565b611888565b604051610776919061308e565b60405180910390f35b6107996004803603810190610794919061375f565b6118ac565b005b3480156107a757600080fd5b506107c260048036038101906107bd91906137ef565b611aeb565b6040516107cf9190612fda565b60405180910390f35b3480156107e457600080fd5b506107ed611b7f565b6040516107fa9190613217565b60405180910390f35b34801561080f57600080fd5b50610818611b85565b6040516108259190613217565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108a157506108a082611ba3565b5b9050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108e9611c85565b73ffffffffffffffffffffffffffffffffffffffff161461090957600080fd5b6000600c60006101000a81548160ff021916908315150217905550565b6060600080546109359061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546109619061385e565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b5050505050905090565b60006109c382611c8d565b610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613902565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a488261100e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090613994565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad8611c85565b73ffffffffffffffffffffffffffffffffffffffff161480610b075750610b0681610b01611c85565b611aeb565b5b610b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3d90613a26565b60405180910390fd5b610b508383611cf9565b505050565b600e6020528060005260406000206000915090505481565b6000600880549050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610bbb611c85565b73ffffffffffffffffffffffffffffffffffffffff1614610bdb57600080fd5b6001600c60006101000a81548160ff021916908315150217905550565b610c09610c03611c85565b82611db2565b610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90613ab8565b60405180910390fd5b610c53838383611e90565b505050565b6000610c6383611130565b8210610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613b4a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5957600080fd5b60005b6014821015610e0b5760001515600d60008386610d799190613b99565b815260200190815260200160002060009054906101000a900460ff1615151415610df857610db2338285610dad9190613b99565b6120ec565b6001600d60008386610dc49190613b99565b815260200190815260200160002060006101000a81548160ff0219169083151502179055508180610df490613bef565b9250505b8080610e0390613bef565b915050610d5c565b505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e71611c85565b73ffffffffffffffffffffffffffffffffffffffff1614610e9157600080fd5b6000479050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610efe573d6000803e3d6000fd5b5050565b610f1d838383604051806020016040528060008152506117a8565b505050565b6000610f2c610b6d565b8210610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613caa565b60405180910390fd5b60088281548110610f8157610f80613cca565b5b90600052602060002001549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fd4611c85565b73ffffffffffffffffffffffffffffffffffffffff1614610ff457600080fd5b80600b908051906020019061100a929190612e83565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae90613d6b565b60405180910390fd5b80915050919050565b60006111156110ce8561210a565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061213a565b15611124576011549050611129565b600090505b9392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119890613dfd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611229611c85565b73ffffffffffffffffffffffffffffffffffffffff161461124957600080fd5b8060108190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611294611c85565b73ffffffffffffffffffffffffffffffffffffffff16146112b457600080fd5b80600f8190555050565b80516010546112cd9190613e1d565b34146112d857600080fd5b600c60019054906101000a900460ff16611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90613ec3565b60405180910390fd5b60005b81518110156113ee5781818151811061134657611345613cca565b5b6020026020010151606011158015611379575061048082828151811061136f5761136e613cca565b5b6020026020010151105b6113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613f2f565b60405180910390fd5b6113db8282815181106113ce576113cd613cca565b5b6020026020010151612151565b80806113e690613bef565b91505061132a565b5050565b60006104808210611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90613f9b565b60405180910390fd5b816000111561147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147390613f9b565b60405180910390fd5b60001515600d600084815260200190815260200160002060009054906101000a900460ff161515146114e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114da90614007565b60405180910390fd5b819050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661152c611c85565b73ffffffffffffffffffffffffffffffffffffffff161461154c57600080fd5b6001600c60016101000a81548160ff021916908315150217905550565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461159e9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546115ca9061385e565b80156116175780601f106115ec57610100808354040283529160200191611617565b820191906000526020600020905b8154815290600101906020018083116115fa57829003601f168201915b5050505050905090565b60105481565b61162f611c85565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169490614073565b60405180910390fd5b80600560006116aa611c85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611757611c85565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161179c9190612fda565b60405180910390a35050565b6117b96117b3611c85565b83611db2565b6117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef90613ab8565b60405180910390fd5b611804848484846122b5565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661184b611c85565b73ffffffffffffffffffffffffffffffffffffffff161461186b57600080fd5b6000600c60016101000a81548160ff021916908315150217905550565b606061189382611c8d565b61189c57600080fd5b6118a582612311565b9050919050565b600c60009054906101000a900460ff166118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f2906140df565b60405180910390fd5b8051600f5461190a9190613e1d565b341461191557600080fd5b60006119228585856110c0565b11611962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119599061414b565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461199a57600080fd5b60005b8151811015611ae4578181815181106119b9576119b8613cca565b5b60200260200101516060111580156119ec57506104808282815181106119e2576119e1613cca565b5b6020026020010151105b611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2290613f2f565b60405180910390fd5b601154600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa5906141b7565b60405180910390fd5b611ad1828281518110611ac457611ac3613cca565b5b6020026020010151612151565b8080611adc90613bef565b91505061199d565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60115481565b600f5481565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c6e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c7e5750611c7d826123b8565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d6c8361100e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611dbd82611c8d565b611dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df390614249565b60405180910390fd5b6000611e078361100e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e7657508373ffffffffffffffffffffffffffffffffffffffff16611e5e846109b8565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e875750611e868185611aeb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611eb08261100e565b73ffffffffffffffffffffffffffffffffffffffff1614611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd906142db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061436d565b60405180910390fd5b611f81838383612422565b611f8c600082611cf9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fdc919061438d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120339190613b99565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612106828260405180602001604052806000815250612536565b5050565b60008160405160200161211d9190614409565b604051602081830303815290604052805190602001209050919050565b60006121498260145485612591565b905092915050565b60001515600d600083815260200190815260200160002060009054906101000a900460ff161515146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af90614470565b60405180910390fd5b6121c233826120ec565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061221290613bef565b91905055506001600d600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000479050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156122b0573d6000803e3d6000fd5b505050565b6122c0848484611e90565b6122cc848484846125a8565b61230b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230290614502565b60405180910390fd5b50505050565b606061231c82611c8d565b61235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290614594565b60405180910390fd5b6000612365612730565b9050600081511161238557604051806020016040528060008152506123b0565b8061238f846127c2565b6040516020016123a09291906145f0565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61242d838383611b9e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124705761246b81612923565b6124af565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124ae576124ad838261296c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124f2576124ed81612ad9565b612531565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125305761252f8282612baa565b5b5b505050565b6125408383612c29565b61254d60008484846125a8565b61258c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258390614502565b60405180910390fd5b505050565b60008261259e8584612df7565b1490509392505050565b60006125c98473ffffffffffffffffffffffffffffffffffffffff16611b8b565b15612723578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125f2611c85565b8786866040518563ffffffff1660e01b81526004016126149493929190614669565b6020604051808303816000875af192505050801561265057506040513d601f19601f8201168201806040525081019061264d91906146ca565b60015b6126d3573d8060008114612680576040519150601f19603f3d011682016040523d82523d6000602084013e612685565b606091505b506000815114156126cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c290614502565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612728565b600190505b949350505050565b6060600b805461273f9061385e565b80601f016020809104026020016040519081016040528092919081815260200182805461276b9061385e565b80156127b85780601f1061278d576101008083540402835291602001916127b8565b820191906000526020600020905b81548152906001019060200180831161279b57829003601f168201915b5050505050905090565b6060600082141561280a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061291e565b600082905060005b6000821461283c57808061282590613bef565b915050600a826128359190614726565b9150612812565b60008167ffffffffffffffff8111156128585761285761328f565b5b6040519080825280601f01601f19166020018201604052801561288a5781602001600182028036833780820191505090505b5090505b60008514612917576001826128a3919061438d565b9150600a856128b29190614757565b60306128be9190613b99565b60f81b8183815181106128d4576128d3613cca565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129109190614726565b945061288e565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161297984611130565b612983919061438d565b9050600060076000848152602001908152602001600020549050818114612a68576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612aed919061438d565b9050600060096000848152602001908152602001600020549050600060088381548110612b1d57612b1c613cca565b5b906000526020600020015490508060088381548110612b3f57612b3e613cca565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b8e57612b8d614788565b5b6001900381819060005260206000200160009055905550505050565b6000612bb583611130565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9090614803565b60405180910390fd5b612ca281611c8d565b15612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd99061486f565b60405180910390fd5b612cee60008383612422565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d3e9190613b99565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008082905060005b8451811015612e61576000858281518110612e1e57612e1d613cca565b5b60200260200101519050808311612e4057612e398382612e6c565b9250612e4d565b612e4a8184612e6c565b92505b508080612e5990613bef565b915050612e00565b508091505092915050565b600082600052816020526040600020905092915050565b828054612e8f9061385e565b90600052602060002090601f016020900481019282612eb15760008555612ef8565b82601f10612eca57805160ff1916838001178555612ef8565b82800160010185558215612ef8579182015b82811115612ef7578251825591602001919060010190612edc565b5b509050612f059190612f09565b5090565b5b80821115612f22576000816000905550600101612f0a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f6f81612f3a565b8114612f7a57600080fd5b50565b600081359050612f8c81612f66565b92915050565b600060208284031215612fa857612fa7612f30565b5b6000612fb684828501612f7d565b91505092915050565b60008115159050919050565b612fd481612fbf565b82525050565b6000602082019050612fef6000830184612fcb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561302f578082015181840152602081019050613014565b8381111561303e576000848401525b50505050565b6000601f19601f8301169050919050565b600061306082612ff5565b61306a8185613000565b935061307a818560208601613011565b61308381613044565b840191505092915050565b600060208201905081810360008301526130a88184613055565b905092915050565b6000819050919050565b6130c3816130b0565b81146130ce57600080fd5b50565b6000813590506130e0816130ba565b92915050565b6000602082840312156130fc576130fb612f30565b5b600061310a848285016130d1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061313e82613113565b9050919050565b61314e81613133565b82525050565b60006020820190506131696000830184613145565b92915050565b61317881613133565b811461318357600080fd5b50565b6000813590506131958161316f565b92915050565b600080604083850312156131b2576131b1612f30565b5b60006131c085828601613186565b92505060206131d1858286016130d1565b9150509250929050565b6000602082840312156131f1576131f0612f30565b5b60006131ff84828501613186565b91505092915050565b613211816130b0565b82525050565b600060208201905061322c6000830184613208565b92915050565b60008060006060848603121561324b5761324a612f30565b5b600061325986828701613186565b935050602061326a86828701613186565b925050604061327b868287016130d1565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132c782613044565b810181811067ffffffffffffffff821117156132e6576132e561328f565b5b80604052505050565b60006132f9612f26565b905061330582826132be565b919050565b600067ffffffffffffffff8211156133255761332461328f565b5b61332e82613044565b9050602081019050919050565b82818337600083830152505050565b600061335d6133588461330a565b6132ef565b9050828152602081018484840111156133795761337861328a565b5b61338484828561333b565b509392505050565b600082601f8301126133a1576133a0613285565b5b81356133b184826020860161334a565b91505092915050565b6000602082840312156133d0576133cf612f30565b5b600082013567ffffffffffffffff8111156133ee576133ed612f35565b5b6133fa8482850161338c565b91505092915050565b600080fd5b600080fd5b60008083601f84011261342357613422613285565b5b8235905067ffffffffffffffff8111156134405761343f613403565b5b60208301915083602082028301111561345c5761345b613408565b5b9250929050565b60008060006040848603121561347c5761347b612f30565b5b600061348a86828701613186565b935050602084013567ffffffffffffffff8111156134ab576134aa612f35565b5b6134b78682870161340d565b92509250509250925092565b600067ffffffffffffffff8211156134de576134dd61328f565b5b602082029050602081019050919050565b60006135026134fd846134c3565b6132ef565b9050808382526020820190506020840283018581111561352557613524613408565b5b835b8181101561354e578061353a88826130d1565b845260208401935050602081019050613527565b5050509392505050565b600082601f83011261356d5761356c613285565b5b813561357d8482602086016134ef565b91505092915050565b60006020828403121561359c5761359b612f30565b5b600082013567ffffffffffffffff8111156135ba576135b9612f35565b5b6135c684828501613558565b91505092915050565b6135d881612fbf565b81146135e357600080fd5b50565b6000813590506135f5816135cf565b92915050565b6000806040838503121561361257613611612f30565b5b600061362085828601613186565b9250506020613631858286016135e6565b9150509250929050565b600067ffffffffffffffff8211156136565761365561328f565b5b61365f82613044565b9050602081019050919050565b600061367f61367a8461363b565b6132ef565b90508281526020810184848401111561369b5761369a61328a565b5b6136a684828561333b565b509392505050565b600082601f8301126136c3576136c2613285565b5b81356136d384826020860161366c565b91505092915050565b600080600080608085870312156136f6576136f5612f30565b5b600061370487828801613186565b945050602061371587828801613186565b9350506040613726878288016130d1565b925050606085013567ffffffffffffffff81111561374757613746612f35565b5b613753878288016136ae565b91505092959194509250565b6000806000806060858703121561377957613778612f30565b5b600061378787828801613186565b945050602085013567ffffffffffffffff8111156137a8576137a7612f35565b5b6137b48782880161340d565b9350935050604085013567ffffffffffffffff8111156137d7576137d6612f35565b5b6137e387828801613558565b91505092959194509250565b6000806040838503121561380657613805612f30565b5b600061381485828601613186565b925050602061382585828601613186565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387657607f821691505b6020821081141561388a5761388961382f565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006138ec602c83613000565b91506138f782613890565b604082019050919050565b6000602082019050818103600083015261391b816138df565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061397e602183613000565b915061398982613922565b604082019050919050565b600060208201905081810360008301526139ad81613971565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a10603883613000565b9150613a1b826139b4565b604082019050919050565b60006020820190508181036000830152613a3f81613a03565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613aa2603183613000565b9150613aad82613a46565b604082019050919050565b60006020820190508181036000830152613ad181613a95565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613b34602b83613000565b9150613b3f82613ad8565b604082019050919050565b60006020820190508181036000830152613b6381613b27565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ba4826130b0565b9150613baf836130b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613be457613be3613b6a565b5b828201905092915050565b6000613bfa826130b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c2d57613c2c613b6a565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613c94602c83613000565b9150613c9f82613c38565b604082019050919050565b60006020820190508181036000830152613cc381613c87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613d55602983613000565b9150613d6082613cf9565b604082019050919050565b60006020820190508181036000830152613d8481613d48565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613de7602a83613000565b9150613df282613d8b565b604082019050919050565b60006020820190508181036000830152613e1681613dda565b9050919050565b6000613e28826130b0565b9150613e33836130b0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6c57613e6b613b6a565b5b828202905092915050565b7f7075626c69632073616c65206e6f742073746172746564000000000000000000600082015250565b6000613ead601783613000565b9150613eb882613e77565b602082019050919050565b60006020820190508181036000830152613edc81613ea0565b9050919050565b7f696e76616c6964206e6674206964000000000000000000000000000000000000600082015250565b6000613f19600e83613000565b9150613f2482613ee3565b602082019050919050565b60006020820190508181036000830152613f4881613f0c565b9050919050565b7f6e6f742065786973742e00000000000000000000000000000000000000000000600082015250565b6000613f85600a83613000565b9150613f9082613f4f565b602082019050919050565b60006020820190508181036000830152613fb481613f78565b9050919050565b7f616c7265616479206d696e7465642e0000000000000000000000000000000000600082015250565b6000613ff1600f83613000565b9150613ffc82613fbb565b602082019050919050565b6000602082019050818103600083015261402081613fe4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061405d601983613000565b915061406882614027565b602082019050919050565b6000602082019050818103600083015261408c81614050565b9050919050565b7f707269766174652073616c65206e6f7420737461727465640000000000000000600082015250565b60006140c9601883613000565b91506140d482614093565b602082019050919050565b600060208201905081810360008301526140f8816140bc565b9050919050565b7f6163636f756e74206973206e6f7420696e20616c6c6f776c6973740000000000600082015250565b6000614135601b83613000565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b7f6d696e7420616d6f756e74206f76657200000000000000000000000000000000600082015250565b60006141a1601083613000565b91506141ac8261416b565b602082019050919050565b600060208201905081810360008301526141d081614194565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614233602c83613000565b915061423e826141d7565b604082019050919050565b6000602082019050818103600083015261426281614226565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006142c5602983613000565b91506142d082614269565b604082019050919050565b600060208201905081810360008301526142f4816142b8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614357602483613000565b9150614362826142fb565b604082019050919050565b600060208201905081810360008301526143868161434a565b9050919050565b6000614398826130b0565b91506143a3836130b0565b9250828210156143b6576143b5613b6a565b5b828203905092915050565b60008160601b9050919050565b60006143d9826143c1565b9050919050565b60006143eb826143ce565b9050919050565b6144036143fe82613133565b6143e0565b82525050565b600061441582846143f2565b60148201915081905092915050565b7f616c7265616479206d696e746564000000000000000000000000000000000000600082015250565b600061445a600e83613000565b915061446582614424565b602082019050919050565b600060208201905081810360008301526144898161444d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006144ec603283613000565b91506144f782614490565b604082019050919050565b6000602082019050818103600083015261451b816144df565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061457e602f83613000565b915061458982614522565b604082019050919050565b600060208201905081810360008301526145ad81614571565b9050919050565b600081905092915050565b60006145ca82612ff5565b6145d481856145b4565b93506145e4818560208601613011565b80840191505092915050565b60006145fc82856145bf565b915061460882846145bf565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061463b82614614565b614645818561461f565b9350614655818560208601613011565b61465e81613044565b840191505092915050565b600060808201905061467e6000830187613145565b61468b6020830186613145565b6146986040830185613208565b81810360608301526146aa8184614630565b905095945050505050565b6000815190506146c481612f66565b92915050565b6000602082840312156146e0576146df612f30565b5b60006146ee848285016146b5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614731826130b0565b915061473c836130b0565b92508261474c5761474b6146f7565b5b828204905092915050565b6000614762826130b0565b915061476d836130b0565b92508261477d5761477c6146f7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006147ed602083613000565b91506147f8826147b7565b602082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614859601c83613000565b915061486482614823565b602082019050919050565b600060208201905081810360008301526148888161484c565b905091905056fea26469706673582212208e6aa81e086f2848ba9212d9cd593ce93b766e40eac004c8da0cd74386ad482c64736f6c634300080a0033697066733a2f2f516d57706a7a6b61784136344c774a395473577574416374446a773742596675366a773372477674674d465856632f
Deployed Bytecode
0x6080604052600436106102045760003560e01c806368feee22116101185780639b6860c8116100a0578063c87b56dd1161006f578063c87b56dd14610742578063ca25052e1461077f578063e985e9c51461079b578063f50717e1146107d8578063f560d4151461080357610204565b80639b6860c8146106ae578063a22cb465146106d9578063b88d4fde14610702578063c1779e9b1461072b57610204565b80637f396dfb116100e75780637f396dfb146105e8578063863faa1e146106045780638cfec4c0146106415780638da5cb5b1461065857806395d89b411461068357610204565b806368feee221461051c57806370a0823114610559578063791a2519146105965780637bc36e04146105bf57610204565b806323b872dd1161019b5780633ccfd60b1161016a5780633ccfd60b1461043957806342842e0e146104505780634f6ccce71461047957806355f804b3146104b65780636352211e146104df57610204565b806323b872dd1461036d5780632f745c59146103965780632fbba115146103d357806333c41a90146103fc57610204565b8063095ea7b3116101d7578063095ea7b3146102c55780630a7a1c38146102ee57806318160ddd1461032b5780631b63c5ae1461035657610204565b806301ffc9a71461020957806304fc156e1461024657806306fdde031461025d578063081812fc14610288575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612f92565b61082e565b60405161023d9190612fda565b60405180910390f35b34801561025257600080fd5b5061025b6108a8565b005b34801561026957600080fd5b50610272610926565b60405161027f919061308e565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa91906130e6565b6109b8565b6040516102bc9190613154565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e7919061319b565b610a3d565b005b3480156102fa57600080fd5b50610315600480360381019061031091906131db565b610b55565b6040516103229190613217565b60405180910390f35b34801561033757600080fd5b50610340610b6d565b60405161034d9190613217565b60405180910390f35b34801561036257600080fd5b5061036b610b7a565b005b34801561037957600080fd5b50610394600480360381019061038f9190613232565b610bf8565b005b3480156103a257600080fd5b506103bd60048036038101906103b8919061319b565b610c58565b6040516103ca9190613217565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906130e6565b610cfd565b005b34801561040857600080fd5b50610423600480360381019061041e91906130e6565b610e10565b6040516104309190612fda565b60405180910390f35b34801561044557600080fd5b5061044e610e30565b005b34801561045c57600080fd5b5061047760048036038101906104729190613232565b610f02565b005b34801561048557600080fd5b506104a0600480360381019061049b91906130e6565b610f22565b6040516104ad9190613217565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d891906133ba565b610f93565b005b3480156104eb57600080fd5b50610506600480360381019061050191906130e6565b61100e565b6040516105139190613154565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613463565b6110c0565b6040516105509190613217565b60405180910390f35b34801561056557600080fd5b50610580600480360381019061057b91906131db565b611130565b60405161058d9190613217565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b891906130e6565b6111e8565b005b3480156105cb57600080fd5b506105e660048036038101906105e191906130e6565b611253565b005b61060260048036038101906105fd9190613586565b6112be565b005b34801561061057600080fd5b5061062b600480360381019061062691906130e6565b6113f2565b6040516106389190613217565b60405180910390f35b34801561064d57600080fd5b506106566114eb565b005b34801561066457600080fd5b5061066d611569565b60405161067a9190613154565b60405180910390f35b34801561068f57600080fd5b5061069861158f565b6040516106a5919061308e565b60405180910390f35b3480156106ba57600080fd5b506106c3611621565b6040516106d09190613217565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb91906135fb565b611627565b005b34801561070e57600080fd5b50610729600480360381019061072491906136dc565b6117a8565b005b34801561073757600080fd5b5061074061180a565b005b34801561074e57600080fd5b50610769600480360381019061076491906130e6565b611888565b604051610776919061308e565b60405180910390f35b6107996004803603810190610794919061375f565b6118ac565b005b3480156107a757600080fd5b506107c260048036038101906107bd91906137ef565b611aeb565b6040516107cf9190612fda565b60405180910390f35b3480156107e457600080fd5b506107ed611b7f565b6040516107fa9190613217565b60405180910390f35b34801561080f57600080fd5b50610818611b85565b6040516108259190613217565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108a157506108a082611ba3565b5b9050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108e9611c85565b73ffffffffffffffffffffffffffffffffffffffff161461090957600080fd5b6000600c60006101000a81548160ff021916908315150217905550565b6060600080546109359061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546109619061385e565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b5050505050905090565b60006109c382611c8d565b610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613902565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a488261100e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090613994565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad8611c85565b73ffffffffffffffffffffffffffffffffffffffff161480610b075750610b0681610b01611c85565b611aeb565b5b610b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3d90613a26565b60405180910390fd5b610b508383611cf9565b505050565b600e6020528060005260406000206000915090505481565b6000600880549050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610bbb611c85565b73ffffffffffffffffffffffffffffffffffffffff1614610bdb57600080fd5b6001600c60006101000a81548160ff021916908315150217905550565b610c09610c03611c85565b82611db2565b610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90613ab8565b60405180910390fd5b610c53838383611e90565b505050565b6000610c6383611130565b8210610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613b4a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5957600080fd5b60005b6014821015610e0b5760001515600d60008386610d799190613b99565b815260200190815260200160002060009054906101000a900460ff1615151415610df857610db2338285610dad9190613b99565b6120ec565b6001600d60008386610dc49190613b99565b815260200190815260200160002060006101000a81548160ff0219169083151502179055508180610df490613bef565b9250505b8080610e0390613bef565b915050610d5c565b505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e71611c85565b73ffffffffffffffffffffffffffffffffffffffff1614610e9157600080fd5b6000479050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610efe573d6000803e3d6000fd5b5050565b610f1d838383604051806020016040528060008152506117a8565b505050565b6000610f2c610b6d565b8210610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613caa565b60405180910390fd5b60088281548110610f8157610f80613cca565b5b90600052602060002001549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fd4611c85565b73ffffffffffffffffffffffffffffffffffffffff1614610ff457600080fd5b80600b908051906020019061100a929190612e83565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae90613d6b565b60405180910390fd5b80915050919050565b60006111156110ce8561210a565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061213a565b15611124576011549050611129565b600090505b9392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119890613dfd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611229611c85565b73ffffffffffffffffffffffffffffffffffffffff161461124957600080fd5b8060108190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611294611c85565b73ffffffffffffffffffffffffffffffffffffffff16146112b457600080fd5b80600f8190555050565b80516010546112cd9190613e1d565b34146112d857600080fd5b600c60019054906101000a900460ff16611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90613ec3565b60405180910390fd5b60005b81518110156113ee5781818151811061134657611345613cca565b5b6020026020010151606011158015611379575061048082828151811061136f5761136e613cca565b5b6020026020010151105b6113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613f2f565b60405180910390fd5b6113db8282815181106113ce576113cd613cca565b5b6020026020010151612151565b80806113e690613bef565b91505061132a565b5050565b60006104808210611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90613f9b565b60405180910390fd5b816000111561147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147390613f9b565b60405180910390fd5b60001515600d600084815260200190815260200160002060009054906101000a900460ff161515146114e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114da90614007565b60405180910390fd5b819050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661152c611c85565b73ffffffffffffffffffffffffffffffffffffffff161461154c57600080fd5b6001600c60016101000a81548160ff021916908315150217905550565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461159e9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546115ca9061385e565b80156116175780601f106115ec57610100808354040283529160200191611617565b820191906000526020600020905b8154815290600101906020018083116115fa57829003601f168201915b5050505050905090565b60105481565b61162f611c85565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169490614073565b60405180910390fd5b80600560006116aa611c85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611757611c85565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161179c9190612fda565b60405180910390a35050565b6117b96117b3611c85565b83611db2565b6117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef90613ab8565b60405180910390fd5b611804848484846122b5565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661184b611c85565b73ffffffffffffffffffffffffffffffffffffffff161461186b57600080fd5b6000600c60016101000a81548160ff021916908315150217905550565b606061189382611c8d565b61189c57600080fd5b6118a582612311565b9050919050565b600c60009054906101000a900460ff166118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f2906140df565b60405180910390fd5b8051600f5461190a9190613e1d565b341461191557600080fd5b60006119228585856110c0565b11611962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119599061414b565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461199a57600080fd5b60005b8151811015611ae4578181815181106119b9576119b8613cca565b5b60200260200101516060111580156119ec57506104808282815181106119e2576119e1613cca565b5b6020026020010151105b611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2290613f2f565b60405180910390fd5b601154600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa5906141b7565b60405180910390fd5b611ad1828281518110611ac457611ac3613cca565b5b6020026020010151612151565b8080611adc90613bef565b91505061199d565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60115481565b600f5481565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c6e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c7e5750611c7d826123b8565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d6c8361100e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611dbd82611c8d565b611dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df390614249565b60405180910390fd5b6000611e078361100e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e7657508373ffffffffffffffffffffffffffffffffffffffff16611e5e846109b8565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e875750611e868185611aeb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611eb08261100e565b73ffffffffffffffffffffffffffffffffffffffff1614611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd906142db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061436d565b60405180910390fd5b611f81838383612422565b611f8c600082611cf9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fdc919061438d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120339190613b99565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612106828260405180602001604052806000815250612536565b5050565b60008160405160200161211d9190614409565b604051602081830303815290604052805190602001209050919050565b60006121498260145485612591565b905092915050565b60001515600d600083815260200190815260200160002060009054906101000a900460ff161515146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af90614470565b60405180910390fd5b6121c233826120ec565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061221290613bef565b91905055506001600d600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000479050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156122b0573d6000803e3d6000fd5b505050565b6122c0848484611e90565b6122cc848484846125a8565b61230b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230290614502565b60405180910390fd5b50505050565b606061231c82611c8d565b61235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290614594565b60405180910390fd5b6000612365612730565b9050600081511161238557604051806020016040528060008152506123b0565b8061238f846127c2565b6040516020016123a09291906145f0565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61242d838383611b9e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124705761246b81612923565b6124af565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124ae576124ad838261296c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124f2576124ed81612ad9565b612531565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125305761252f8282612baa565b5b5b505050565b6125408383612c29565b61254d60008484846125a8565b61258c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258390614502565b60405180910390fd5b505050565b60008261259e8584612df7565b1490509392505050565b60006125c98473ffffffffffffffffffffffffffffffffffffffff16611b8b565b15612723578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125f2611c85565b8786866040518563ffffffff1660e01b81526004016126149493929190614669565b6020604051808303816000875af192505050801561265057506040513d601f19601f8201168201806040525081019061264d91906146ca565b60015b6126d3573d8060008114612680576040519150601f19603f3d011682016040523d82523d6000602084013e612685565b606091505b506000815114156126cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c290614502565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612728565b600190505b949350505050565b6060600b805461273f9061385e565b80601f016020809104026020016040519081016040528092919081815260200182805461276b9061385e565b80156127b85780601f1061278d576101008083540402835291602001916127b8565b820191906000526020600020905b81548152906001019060200180831161279b57829003601f168201915b5050505050905090565b6060600082141561280a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061291e565b600082905060005b6000821461283c57808061282590613bef565b915050600a826128359190614726565b9150612812565b60008167ffffffffffffffff8111156128585761285761328f565b5b6040519080825280601f01601f19166020018201604052801561288a5781602001600182028036833780820191505090505b5090505b60008514612917576001826128a3919061438d565b9150600a856128b29190614757565b60306128be9190613b99565b60f81b8183815181106128d4576128d3613cca565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129109190614726565b945061288e565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161297984611130565b612983919061438d565b9050600060076000848152602001908152602001600020549050818114612a68576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612aed919061438d565b9050600060096000848152602001908152602001600020549050600060088381548110612b1d57612b1c613cca565b5b906000526020600020015490508060088381548110612b3f57612b3e613cca565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b8e57612b8d614788565b5b6001900381819060005260206000200160009055905550505050565b6000612bb583611130565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9090614803565b60405180910390fd5b612ca281611c8d565b15612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd99061486f565b60405180910390fd5b612cee60008383612422565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d3e9190613b99565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008082905060005b8451811015612e61576000858281518110612e1e57612e1d613cca565b5b60200260200101519050808311612e4057612e398382612e6c565b9250612e4d565b612e4a8184612e6c565b92505b508080612e5990613bef565b915050612e00565b508091505092915050565b600082600052816020526040600020905092915050565b828054612e8f9061385e565b90600052602060002090601f016020900481019282612eb15760008555612ef8565b82601f10612eca57805160ff1916838001178555612ef8565b82800160010185558215612ef8579182015b82811115612ef7578251825591602001919060010190612edc565b5b509050612f059190612f09565b5090565b5b80821115612f22576000816000905550600101612f0a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f6f81612f3a565b8114612f7a57600080fd5b50565b600081359050612f8c81612f66565b92915050565b600060208284031215612fa857612fa7612f30565b5b6000612fb684828501612f7d565b91505092915050565b60008115159050919050565b612fd481612fbf565b82525050565b6000602082019050612fef6000830184612fcb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561302f578082015181840152602081019050613014565b8381111561303e576000848401525b50505050565b6000601f19601f8301169050919050565b600061306082612ff5565b61306a8185613000565b935061307a818560208601613011565b61308381613044565b840191505092915050565b600060208201905081810360008301526130a88184613055565b905092915050565b6000819050919050565b6130c3816130b0565b81146130ce57600080fd5b50565b6000813590506130e0816130ba565b92915050565b6000602082840312156130fc576130fb612f30565b5b600061310a848285016130d1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061313e82613113565b9050919050565b61314e81613133565b82525050565b60006020820190506131696000830184613145565b92915050565b61317881613133565b811461318357600080fd5b50565b6000813590506131958161316f565b92915050565b600080604083850312156131b2576131b1612f30565b5b60006131c085828601613186565b92505060206131d1858286016130d1565b9150509250929050565b6000602082840312156131f1576131f0612f30565b5b60006131ff84828501613186565b91505092915050565b613211816130b0565b82525050565b600060208201905061322c6000830184613208565b92915050565b60008060006060848603121561324b5761324a612f30565b5b600061325986828701613186565b935050602061326a86828701613186565b925050604061327b868287016130d1565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132c782613044565b810181811067ffffffffffffffff821117156132e6576132e561328f565b5b80604052505050565b60006132f9612f26565b905061330582826132be565b919050565b600067ffffffffffffffff8211156133255761332461328f565b5b61332e82613044565b9050602081019050919050565b82818337600083830152505050565b600061335d6133588461330a565b6132ef565b9050828152602081018484840111156133795761337861328a565b5b61338484828561333b565b509392505050565b600082601f8301126133a1576133a0613285565b5b81356133b184826020860161334a565b91505092915050565b6000602082840312156133d0576133cf612f30565b5b600082013567ffffffffffffffff8111156133ee576133ed612f35565b5b6133fa8482850161338c565b91505092915050565b600080fd5b600080fd5b60008083601f84011261342357613422613285565b5b8235905067ffffffffffffffff8111156134405761343f613403565b5b60208301915083602082028301111561345c5761345b613408565b5b9250929050565b60008060006040848603121561347c5761347b612f30565b5b600061348a86828701613186565b935050602084013567ffffffffffffffff8111156134ab576134aa612f35565b5b6134b78682870161340d565b92509250509250925092565b600067ffffffffffffffff8211156134de576134dd61328f565b5b602082029050602081019050919050565b60006135026134fd846134c3565b6132ef565b9050808382526020820190506020840283018581111561352557613524613408565b5b835b8181101561354e578061353a88826130d1565b845260208401935050602081019050613527565b5050509392505050565b600082601f83011261356d5761356c613285565b5b813561357d8482602086016134ef565b91505092915050565b60006020828403121561359c5761359b612f30565b5b600082013567ffffffffffffffff8111156135ba576135b9612f35565b5b6135c684828501613558565b91505092915050565b6135d881612fbf565b81146135e357600080fd5b50565b6000813590506135f5816135cf565b92915050565b6000806040838503121561361257613611612f30565b5b600061362085828601613186565b9250506020613631858286016135e6565b9150509250929050565b600067ffffffffffffffff8211156136565761365561328f565b5b61365f82613044565b9050602081019050919050565b600061367f61367a8461363b565b6132ef565b90508281526020810184848401111561369b5761369a61328a565b5b6136a684828561333b565b509392505050565b600082601f8301126136c3576136c2613285565b5b81356136d384826020860161366c565b91505092915050565b600080600080608085870312156136f6576136f5612f30565b5b600061370487828801613186565b945050602061371587828801613186565b9350506040613726878288016130d1565b925050606085013567ffffffffffffffff81111561374757613746612f35565b5b613753878288016136ae565b91505092959194509250565b6000806000806060858703121561377957613778612f30565b5b600061378787828801613186565b945050602085013567ffffffffffffffff8111156137a8576137a7612f35565b5b6137b48782880161340d565b9350935050604085013567ffffffffffffffff8111156137d7576137d6612f35565b5b6137e387828801613558565b91505092959194509250565b6000806040838503121561380657613805612f30565b5b600061381485828601613186565b925050602061382585828601613186565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387657607f821691505b6020821081141561388a5761388961382f565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006138ec602c83613000565b91506138f782613890565b604082019050919050565b6000602082019050818103600083015261391b816138df565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061397e602183613000565b915061398982613922565b604082019050919050565b600060208201905081810360008301526139ad81613971565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a10603883613000565b9150613a1b826139b4565b604082019050919050565b60006020820190508181036000830152613a3f81613a03565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613aa2603183613000565b9150613aad82613a46565b604082019050919050565b60006020820190508181036000830152613ad181613a95565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613b34602b83613000565b9150613b3f82613ad8565b604082019050919050565b60006020820190508181036000830152613b6381613b27565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ba4826130b0565b9150613baf836130b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613be457613be3613b6a565b5b828201905092915050565b6000613bfa826130b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c2d57613c2c613b6a565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613c94602c83613000565b9150613c9f82613c38565b604082019050919050565b60006020820190508181036000830152613cc381613c87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613d55602983613000565b9150613d6082613cf9565b604082019050919050565b60006020820190508181036000830152613d8481613d48565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613de7602a83613000565b9150613df282613d8b565b604082019050919050565b60006020820190508181036000830152613e1681613dda565b9050919050565b6000613e28826130b0565b9150613e33836130b0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6c57613e6b613b6a565b5b828202905092915050565b7f7075626c69632073616c65206e6f742073746172746564000000000000000000600082015250565b6000613ead601783613000565b9150613eb882613e77565b602082019050919050565b60006020820190508181036000830152613edc81613ea0565b9050919050565b7f696e76616c6964206e6674206964000000000000000000000000000000000000600082015250565b6000613f19600e83613000565b9150613f2482613ee3565b602082019050919050565b60006020820190508181036000830152613f4881613f0c565b9050919050565b7f6e6f742065786973742e00000000000000000000000000000000000000000000600082015250565b6000613f85600a83613000565b9150613f9082613f4f565b602082019050919050565b60006020820190508181036000830152613fb481613f78565b9050919050565b7f616c7265616479206d696e7465642e0000000000000000000000000000000000600082015250565b6000613ff1600f83613000565b9150613ffc82613fbb565b602082019050919050565b6000602082019050818103600083015261402081613fe4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061405d601983613000565b915061406882614027565b602082019050919050565b6000602082019050818103600083015261408c81614050565b9050919050565b7f707269766174652073616c65206e6f7420737461727465640000000000000000600082015250565b60006140c9601883613000565b91506140d482614093565b602082019050919050565b600060208201905081810360008301526140f8816140bc565b9050919050565b7f6163636f756e74206973206e6f7420696e20616c6c6f776c6973740000000000600082015250565b6000614135601b83613000565b9150614140826140ff565b602082019050919050565b6000602082019050818103600083015261416481614128565b9050919050565b7f6d696e7420616d6f756e74206f76657200000000000000000000000000000000600082015250565b60006141a1601083613000565b91506141ac8261416b565b602082019050919050565b600060208201905081810360008301526141d081614194565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614233602c83613000565b915061423e826141d7565b604082019050919050565b6000602082019050818103600083015261426281614226565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006142c5602983613000565b91506142d082614269565b604082019050919050565b600060208201905081810360008301526142f4816142b8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614357602483613000565b9150614362826142fb565b604082019050919050565b600060208201905081810360008301526143868161434a565b9050919050565b6000614398826130b0565b91506143a3836130b0565b9250828210156143b6576143b5613b6a565b5b828203905092915050565b60008160601b9050919050565b60006143d9826143c1565b9050919050565b60006143eb826143ce565b9050919050565b6144036143fe82613133565b6143e0565b82525050565b600061441582846143f2565b60148201915081905092915050565b7f616c7265616479206d696e746564000000000000000000000000000000000000600082015250565b600061445a600e83613000565b915061446582614424565b602082019050919050565b600060208201905081810360008301526144898161444d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006144ec603283613000565b91506144f782614490565b604082019050919050565b6000602082019050818103600083015261451b816144df565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061457e602f83613000565b915061458982614522565b604082019050919050565b600060208201905081810360008301526145ad81614571565b9050919050565b600081905092915050565b60006145ca82612ff5565b6145d481856145b4565b93506145e4818560208601613011565b80840191505092915050565b60006145fc82856145bf565b915061460882846145bf565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061463b82614614565b614645818561461f565b9350614655818560208601613011565b61465e81613044565b840191505092915050565b600060808201905061467e6000830187613145565b61468b6020830186613145565b6146986040830185613208565b81810360608301526146aa8184614630565b905095945050505050565b6000815190506146c481612f66565b92915050565b6000602082840312156146e0576146df612f30565b5b60006146ee848285016146b5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614731826130b0565b915061473c836130b0565b92508261474c5761474b6146f7565b5b828204905092915050565b6000614762826130b0565b915061476d836130b0565b92508261477d5761477c6146f7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006147ed602083613000565b91506147f8826147b7565b602082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614859601c83613000565b915061486482614823565b602082019050919050565b600060208201905081810360008301526148888161484c565b905091905056fea26469706673582212208e6aa81e086f2848ba9212d9cd593ce93b766e40eac004c8da0cd74386ad482c64736f6c634300080a0033
Deployed Bytecode Sourcemap
136:4743:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32418:234:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4167:117:2;;;;;;;;;;;;;:::i;:::-;;20185:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21597:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21148:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;406:48:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33055:111:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4044:117:2;;;;;;;;;;;;;:::i;:::-;;22461:300:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32731:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3195:347:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;363:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4536:171;;;;;;;;;;;;;:::i;:::-;;22827:149:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33238:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3909:129:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19888:235:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2669:222:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19626:205:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1212:129:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1072:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1673:365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3548:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4294:115;;;;;;;;;;;;;:::i;:::-;;181:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20347:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;508:39:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21881:290:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23042:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4415:115:2;;;;;;;;;;;;;:::i;:::-;;4713:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2044:619;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22237:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;553:28:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;461:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32418:234:1;32520:4;32558:35;32543:50;;;:11;:50;;;;:102;;;;32609:36;32633:11;32609:23;:36::i;:::-;32543:102;32536:109;;32418:234;;;:::o;4167:117:2:-;4235:5;;;;;;;;;;;4219:21;;:12;:10;:12::i;:::-;:21;;;4211:30;;;;;;4272:5;4251:18;;:26;;;;;;;;;;;;;;;;;;4167:117::o;20185:98:1:-;20239:13;20271:5;20264:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20185:98;:::o;21597:217::-;21673:7;21700:16;21708:7;21700;:16::i;:::-;21692:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21783:15;:24;21799:7;21783:24;;;;;;;;;;;;;;;;;;;;;21776:31;;21597:217;;;:::o;21148:388::-;21228:13;21244:23;21259:7;21244:14;:23::i;:::-;21228:39;;21291:5;21285:11;;:2;:11;;;;21277:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21369:5;21353:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21378:37;21395:5;21402:12;:10;:12::i;:::-;21378:16;:37::i;:::-;21353:62;21345:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;21508:21;21517:2;21521:7;21508:8;:21::i;:::-;21218:318;21148:388;;:::o;406:48:2:-;;;;;;;;;;;;;;;;;:::o;33055:111:1:-;33116:7;33142:10;:17;;;;33135:24;;33055:111;:::o;4044:117:2:-;4113:5;;;;;;;;;;;4097:21;;:12;:10;:12::i;:::-;:21;;;4089:30;;;;;;4150:4;4129:18;;:25;;;;;;;;;;;;;;;;;;4044:117::o;22461:300:1:-;22620:41;22639:12;:10;:12::i;:::-;22653:7;22620:18;:41::i;:::-;22612:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22726:28;22736:4;22742:2;22746:7;22726:9;:28::i;:::-;22461:300;;;:::o;32731:253::-;32828:7;32863:23;32880:5;32863:16;:23::i;:::-;32855:5;:31;32847:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;32951:12;:19;32964:5;32951:19;;;;;;;;;;;;;;;:26;32971:5;32951:26;;;;;;;;;;;;32944:33;;32731:253;;;;:::o;3195:347:2:-;3248:14;3299:5;;;;;;;;;;;3285:19;;:10;:19;;;3276:29;;;;;;3319:6;3315:221;3339:2;3329:9;:12;3315:221;;;3387:5;3361:31;;:8;:22;3381:1;3370:8;:12;;;;:::i;:::-;3361:22;;;;;;;;;;;;;;;;;;;;;:31;;;3358:168;;;3407:36;3417:10;3441:1;3430:8;:12;;;;:::i;:::-;3407:9;:36::i;:::-;3482:4;3457:8;:22;3477:1;3466:8;:12;;;;:::i;:::-;3457:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;3500:11;;;;;:::i;:::-;;;;3358:168;3343:3;;;;;:::i;:::-;;;;3315:221;;;;3234:308;3195:347;:::o;363:37::-;;;;;;;;;;;;;;;;;;;;;;:::o;4536:171::-;4597:5;;;;;;;;;;;4581:21;;:12;:10;:12::i;:::-;:21;;;4573:30;;;;;;4613:12;4628:21;4613:36;;4667:14;;;;;;;;;;;4659:32;;:41;4692:7;4659:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4563:144;4536:171::o;22827:149:1:-;22930:39;22947:4;22953:2;22957:7;22930:39;;;;;;;;;;;;:16;:39::i;:::-;22827:149;;;:::o;33238:230::-;33313:7;33348:30;:28;:30::i;:::-;33340:5;:38;33332:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;33444:10;33455:5;33444:17;;;;;;;;:::i;:::-;;;;;;;;;;33437:24;;33238:230;;;:::o;3909:129:2:-;3995:5;;;;;;;;;;;3979:21;;:12;:10;:12::i;:::-;:21;;;3971:30;;;;;;4022:9;4011:8;:20;;;;;;;;;;;;:::i;:::-;;3909:129;:::o;19888:235:1:-;19960:7;19979:13;19995:7;:16;20003:7;19995:16;;;;;;;;;;;;;;;;;;;;;19979:32;;20046:1;20029:19;;:5;:19;;;;20021:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20111:5;20104:12;;;19888:235;;;:::o;2669:222:2:-;2753:4;2772:30;2780:14;2786:7;2780:5;:14::i;:::-;2796:5;;2772:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:30::i;:::-;2769:116;;;2824:12;;2817:19;;;;2769:116;2873:1;2866:8;;2669:222;;;;;;:::o;19626:205:1:-;19698:7;19742:1;19725:19;;:5;:19;;;;19717:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;19808:9;:16;19818:5;19808:16;;;;;;;;;;;;;;;;19801:23;;19626:205;;;:::o;1212:129:2:-;1294:5;;;;;;;;;;;1278:21;;:12;:10;:12::i;:::-;:21;;;1270:30;;;;;;1328:6;1310:15;:24;;;;1212:129;:::o;1072:131::-;1155:5;;;;;;;;;;;1139:21;;:12;:10;:12::i;:::-;:21;;;1131:30;;;;;;1190:6;1171:16;:25;;;;1072:131;:::o;1673:365::-;1784:7;:14;1766:15;;:32;;;;:::i;:::-;1753:9;:45;1745:54;;;;;;1817:17;;;;;;;;;;;1809:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1875:9;1871:161;1890:7;:14;1888:1;:16;1871:161;;;1936:7;1944:1;1936:10;;;;;;;;:::i;:::-;;;;;;;;1930:2;:16;;:37;;;;;1963:4;1950:7;1958:1;1950:10;;;;;;;;:::i;:::-;;;;;;;;:17;1930:37;1922:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1998:23;2010:7;2018:1;2010:10;;;;;;;;:::i;:::-;;;;;;;;1998:11;:23::i;:::-;1906:3;;;;;:::i;:::-;;;;1871:161;;;;1673:365;:::o;3548:253::-;3605:4;3638;3628:7;:14;3620:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;3680:7;3675:1;:12;;3667:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;3741:5;3720:26;;:8;:17;3729:7;3720:17;;;;;;;;;;;;;;;;;;;;;:26;;;3712:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;3783:7;3776:14;;3548:253;;;:::o;4294:115::-;4362:5;;;;;;;;;;;4346:21;;:12;:10;:12::i;:::-;:21;;;4338:30;;;;;;4398:4;4378:17;;:24;;;;;;;;;;;;;;;;;;4294:115::o;181:20::-;;;;;;;;;;;;;:::o;20347:102:1:-;20403:13;20435:7;20428:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20347:102;:::o;508:39:2:-;;;;:::o;21881:290:1:-;21995:12;:10;:12::i;:::-;21983:24;;:8;:24;;;;21975:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22093:8;22048:18;:32;22067:12;:10;:12::i;:::-;22048:32;;;;;;;;;;;;;;;:42;22081:8;22048:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22145:8;22116:48;;22131:12;:10;:12::i;:::-;22116:48;;;22155:8;22116:48;;;;;;:::i;:::-;;;;;;;;21881:290;;:::o;23042:282::-;23173:41;23192:12;:10;:12::i;:::-;23206:7;23173:18;:41::i;:::-;23165:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23278:39;23292:4;23298:2;23302:7;23311:5;23278:13;:39::i;:::-;23042:282;;;;:::o;4415:115:2:-;4482:5;;;;;;;;;;;4466:21;;:12;:10;:12::i;:::-;:21;;;4458:30;;;;;;4518:5;4498:17;;:25;;;;;;;;;;;;;;;;;;4415:115::o;4713:164::-;4778:13;4811:17;4819:8;4811:7;:17::i;:::-;4803:26;;;;;;4846:24;4861:8;4846:14;:24::i;:::-;4839:31;;4713:164;;;:::o;2044:619::-;2169:18;;;;;;;;;;;2161:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;2265:7;:14;2246:16;;:33;;;;:::i;:::-;2233:9;:46;2225:55;;;;;;2328:1;2298:27;2310:7;2319:5;;2298:11;:27::i;:::-;:31;2290:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2393:7;2379:21;;:10;:21;;;2371:30;;;;;;2415:9;2411:246;2430:7;:14;2428:1;:16;2411:246;;;2476:7;2484:1;2476:10;;;;;;;;:::i;:::-;;;;;;;;2470:2;:16;;:37;;;;;2503:4;2490:7;2498:1;2490:10;;;;;;;;:::i;:::-;;;;;;;;:17;2470:37;2462:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;2577:12;;2546:16;:28;2563:10;2546:28;;;;;;;;;;;;;;;;:43;2538:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2623:23;2635:7;2643:1;2635:10;;;;;;;;:::i;:::-;;;;;;;;2623:11;:23::i;:::-;2446:3;;;;;:::i;:::-;;;;2411:246;;;;2044:619;;;;:::o;22237:162:1:-;22334:4;22357:18;:25;22376:5;22357:25;;;;;;;;;;;;;;;:35;22383:8;22357:35;;;;;;;;;;;;;;;;;;;;;;;;;22350:42;;22237:162;;;;:::o;553:28:2:-;;;;:::o;461:41::-;;;;:::o;9273:413:1:-;9333:4;9536:12;9645:7;9633:20;9625:28;;9678:1;9671:4;:8;9664:15;;;9273:413;;;:::o;30659:93::-;;;;:::o;19279:288::-;19381:4;19419:25;19404:40;;;:11;:40;;;;:104;;;;19475:33;19460:48;;;:11;:48;;;;19404:104;:156;;;;19524:36;19548:11;19524:23;:36::i;:::-;19404:156;19397:163;;19279:288;;;:::o;16899:96::-;16952:7;16978:10;16971:17;;16899:96;:::o;24758:125::-;24823:4;24874:1;24846:30;;:7;:16;24854:7;24846:16;;;;;;;;;;;;;;;;;;;;;:30;;;;24839:37;;24758:125;;;:::o;28515:171::-;28616:2;28589:15;:24;28605:7;28589:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;28671:7;28667:2;28633:46;;28642:23;28657:7;28642:14;:23::i;:::-;28633:46;;;;;;;;;;;;28515:171;;:::o;25041:344::-;25134:4;25158:16;25166:7;25158;:16::i;:::-;25150:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25233:13;25249:23;25264:7;25249:14;:23::i;:::-;25233:39;;25301:5;25290:16;;:7;:16;;;:51;;;;25334:7;25310:31;;:20;25322:7;25310:11;:20::i;:::-;:31;;;25290:51;:87;;;;25345:32;25362:5;25369:7;25345:16;:32::i;:::-;25290:87;25282:96;;;25041:344;;;;:::o;27874:530::-;27998:4;27971:31;;:23;27986:7;27971:14;:23::i;:::-;:31;;;27963:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28080:1;28066:16;;:2;:16;;;;28058:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28134:39;28155:4;28161:2;28165:7;28134:20;:39::i;:::-;28235:29;28252:1;28256:7;28235:8;:29::i;:::-;28294:1;28275:9;:15;28285:4;28275:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;28322:1;28305:9;:13;28315:2;28305:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28352:2;28333:7;:16;28341:7;28333:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28389:7;28385:2;28370:27;;28379:4;28370:27;;;;;;;;;;;;27874:530;;;:::o;25715:108::-;25790:26;25800:2;25804:7;25790:26;;;;;;;;;;;;:9;:26::i;:::-;25715:108;;:::o;2897:124:2:-;2952:7;3005;2988:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;2978:36;;;;;;2971:43;;2897:124;;;:::o;3027:153::-;3104:4;3127:46;3146:5;3153:13;;3168:4;3127:18;:46::i;:::-;3120:53;;3027:153;;;;:::o;1347:320::-;1428:5;1408:25;;:8;:16;1417:6;1408:16;;;;;;;;;;;;;;;;;;;;;:25;;;1400:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1462:28;1472:10;1483:6;1462:9;:28::i;:::-;1500:16;:28;1517:10;1500:28;;;;;;;;;;;;;;;;:30;;;;;;;;;:::i;:::-;;;;;;1559:4;1540:8;:16;1549:6;1540:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;1573:12;1588:21;1573:36;;1627:14;;;;;;;;;;;1619:32;;:41;1652:7;1619:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1390:277;1347:320;:::o;24186:269:1:-;24299:28;24309:4;24315:2;24319:7;24299:9;:28::i;:::-;24345:48;24368:4;24374:2;24378:7;24387:5;24345:22;:48::i;:::-;24337:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24186:269;;;;:::o;20515:353::-;20588:13;20621:16;20629:7;20621;:16::i;:::-;20613:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;20700:21;20724:10;:8;:10::i;:::-;20700:34;;20775:1;20757:7;20751:21;:25;:110;;;;;;;;;;;;;;;;;20815:7;20824:18;:7;:16;:18::i;:::-;20798:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20751:110;20744:117;;;20515:353;;;:::o;17924:155::-;18009:4;18047:25;18032:40;;;:11;:40;;;;18025:47;;17924:155;;;:::o;34064:542::-;34173:45;34200:4;34206:2;34210:7;34173:26;:45::i;:::-;34249:1;34233:18;;:4;:18;;;34229:183;;;34267:40;34299:7;34267:31;:40::i;:::-;34229:183;;;34336:2;34328:10;;:4;:10;;;34324:88;;34354:47;34387:4;34393:7;34354:32;:47::i;:::-;34324:88;34229:183;34439:1;34425:16;;:2;:16;;;34421:179;;;34457:45;34494:7;34457:36;:45::i;:::-;34421:179;;;34529:4;34523:10;;:2;:10;;;34519:81;;34549:40;34577:2;34581:7;34549:27;:40::i;:::-;34519:81;34421:179;34064:542;;;:::o;26044:247::-;26139:18;26145:2;26149:7;26139:5;:18::i;:::-;26175:54;26206:1;26210:2;26214:7;26223:5;26175:22;:54::i;:::-;26167:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;26044:247;;;:::o;1154:184:0:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;1291:40;;1154:184;;;;;:::o;29239:824:1:-;29359:4;29383:15;:2;:13;;;:15::i;:::-;29379:678;;;29434:2;29418:36;;;29455:12;:10;:12::i;:::-;29469:4;29475:7;29484:5;29418:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29414:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:1;29661:6;:13;:18;29657:334;;;29703:60;;;;;;;;;;:::i;:::-;;;;;;;;29657:334;29943:6;29937:13;29928:6;29924:2;29920:15;29913:38;29414:591;29550:45;;;29540:55;;;:6;:55;;;;29533:62;;;;;29379:678;30042:4;30035:11;;29239:824;;;;;;;:::o;3807:96:2:-;3857:13;3888:8;3881:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3807:96;:::o;5492:703:1:-;5548:13;5774:1;5765:5;:10;5761:51;;;5791:10;;;;;;;;;;;;;;;;;;;;;5761:51;5821:12;5836:5;5821:20;;5851:14;5875:75;5890:1;5882:4;:9;5875:75;;5907:8;;;;;:::i;:::-;;;;5937:2;5929:10;;;;;:::i;:::-;;;5875:75;;;5959:19;5991:6;5981:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5959:39;;6008:150;6024:1;6015:5;:10;6008:150;;6051:1;6041:11;;;;;:::i;:::-;;;6117:2;6109:5;:10;;;;:::i;:::-;6096:2;:24;;;;:::i;:::-;6083:39;;6066:6;6073;6066:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6145:2;6136:11;;;;;:::i;:::-;;;6008:150;;;6181:6;6167:21;;;;;5492:703;;;;:::o;35312:161::-;35415:10;:17;;;;35388:15;:24;35404:7;35388:24;;;;;;;;;;;:44;;;;35442:10;35458:7;35442:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35312:161;:::o;36090:970::-;36352:22;36402:1;36377:22;36394:4;36377:16;:22::i;:::-;:26;;;;:::i;:::-;36352:51;;36413:18;36434:17;:26;36452:7;36434:26;;;;;;;;;;;;36413:47;;36578:14;36564:10;:28;36560:323;;36608:19;36630:12;:18;36643:4;36630:18;;;;;;;;;;;;;;;:34;36649:14;36630:34;;;;;;;;;;;;36608:56;;36712:11;36679:12;:18;36692:4;36679:18;;;;;;;;;;;;;;;:30;36698:10;36679:30;;;;;;;;;;;:44;;;;36828:10;36795:17;:30;36813:11;36795:30;;;;;;;;;;;:43;;;;36594:289;36560:323;36976:17;:26;36994:7;36976:26;;;;;;;;;;;36969:33;;;37019:12;:18;37032:4;37019:18;;;;;;;;;;;;;;;:34;37038:14;37019:34;;;;;;;;;;;37012:41;;;36171:889;;36090:970;;:::o;37348:1061::-;37597:22;37642:1;37622:10;:17;;;;:21;;;;:::i;:::-;37597:46;;37653:18;37674:15;:24;37690:7;37674:24;;;;;;;;;;;;37653:45;;38020:19;38042:10;38053:14;38042:26;;;;;;;;:::i;:::-;;;;;;;;;;38020:48;;38104:11;38079:10;38090;38079:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;38214:10;38183:15;:28;38199:11;38183:28;;;;;;;;;;;:41;;;;38352:15;:24;38368:7;38352:24;;;;;;;;;;;38345:31;;;38386:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37419:990;;;37348:1061;:::o;34900:217::-;34984:14;35001:20;35018:2;35001:16;:20::i;:::-;34984:37;;35058:7;35031:12;:16;35044:2;35031:16;;;;;;;;;;;;;;;:24;35048:6;35031:24;;;;;;;;;;;:34;;;;35104:6;35075:17;:26;35093:7;35075:26;;;;;;;;;;;:35;;;;34974:143;34900:217;;:::o;26613:372::-;26706:1;26692:16;;:2;:16;;;;26684:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;26764:16;26772:7;26764;:16::i;:::-;26763:17;26755:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26824:45;26853:1;26857:2;26861:7;26824:20;:45::i;:::-;26897:1;26880:9;:13;26890:2;26880:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;26927:2;26908:7;:16;26916:7;26908:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;26970:7;26966:2;26945:33;;26962:1;26945:33;;;;;;;;;;;;26613:372;;:::o;1689:662:0:-;1772:7;1791:20;1814:4;1791:27;;1833:9;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;1871:445;1866:3;;;;;:::i;:::-;;;;1828:488;;;;2332:12;2325:19;;;1689:662;;;;:::o;2357:218::-;2425:13;2486:1;2480:4;2473:15;2514:1;2508:4;2501:15;2554:4;2548;2538:21;2529:30;;2357:218;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:3:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:117::-;8980:1;8977;8970:12;8994:117;9103:1;9100;9093:12;9134:568;9207:8;9217:6;9267:3;9260:4;9252:6;9248:17;9244:27;9234:122;;9275:79;;:::i;:::-;9234:122;9388:6;9375:20;9365:30;;9418:18;9410:6;9407:30;9404:117;;;9440:79;;:::i;:::-;9404:117;9554:4;9546:6;9542:17;9530:29;;9608:3;9600:4;9592:6;9588:17;9578:8;9574:32;9571:41;9568:128;;;9615:79;;:::i;:::-;9568:128;9134:568;;;;;:::o;9708:704::-;9803:6;9811;9819;9868:2;9856:9;9847:7;9843:23;9839:32;9836:119;;;9874:79;;:::i;:::-;9836:119;9994:1;10019:53;10064:7;10055:6;10044:9;10040:22;10019:53;:::i;:::-;10009:63;;9965:117;10149:2;10138:9;10134:18;10121:32;10180:18;10172:6;10169:30;10166:117;;;10202:79;;:::i;:::-;10166:117;10315:80;10387:7;10378:6;10367:9;10363:22;10315:80;:::i;:::-;10297:98;;;;10092:313;9708:704;;;;;:::o;10418:311::-;10495:4;10585:18;10577:6;10574:30;10571:56;;;10607:18;;:::i;:::-;10571:56;10657:4;10649:6;10645:17;10637:25;;10717:4;10711;10707:15;10699:23;;10418:311;;;:::o;10752:710::-;10848:5;10873:81;10889:64;10946:6;10889:64;:::i;:::-;10873:81;:::i;:::-;10864:90;;10974:5;11003:6;10996:5;10989:21;11037:4;11030:5;11026:16;11019:23;;11090:4;11082:6;11078:17;11070:6;11066:30;11119:3;11111:6;11108:15;11105:122;;;11138:79;;:::i;:::-;11105:122;11253:6;11236:220;11270:6;11265:3;11262:15;11236:220;;;11345:3;11374:37;11407:3;11395:10;11374:37;:::i;:::-;11369:3;11362:50;11441:4;11436:3;11432:14;11425:21;;11312:144;11296:4;11291:3;11287:14;11280:21;;11236:220;;;11240:21;10854:608;;10752:710;;;;;:::o;11485:370::-;11556:5;11605:3;11598:4;11590:6;11586:17;11582:27;11572:122;;11613:79;;:::i;:::-;11572:122;11730:6;11717:20;11755:94;11845:3;11837:6;11830:4;11822:6;11818:17;11755:94;:::i;:::-;11746:103;;11562:293;11485:370;;;;:::o;11861:539::-;11945:6;11994:2;11982:9;11973:7;11969:23;11965:32;11962:119;;;12000:79;;:::i;:::-;11962:119;12148:1;12137:9;12133:17;12120:31;12178:18;12170:6;12167:30;12164:117;;;12200:79;;:::i;:::-;12164:117;12305:78;12375:7;12366:6;12355:9;12351:22;12305:78;:::i;:::-;12295:88;;12091:302;11861:539;;;;:::o;12406:116::-;12476:21;12491:5;12476:21;:::i;:::-;12469:5;12466:32;12456:60;;12512:1;12509;12502:12;12456:60;12406:116;:::o;12528:133::-;12571:5;12609:6;12596:20;12587:29;;12625:30;12649:5;12625:30;:::i;:::-;12528:133;;;;:::o;12667:468::-;12732:6;12740;12789:2;12777:9;12768:7;12764:23;12760:32;12757:119;;;12795:79;;:::i;:::-;12757:119;12915:1;12940:53;12985:7;12976:6;12965:9;12961:22;12940:53;:::i;:::-;12930:63;;12886:117;13042:2;13068:50;13110:7;13101:6;13090:9;13086:22;13068:50;:::i;:::-;13058:60;;13013:115;12667:468;;;;;:::o;13141:307::-;13202:4;13292:18;13284:6;13281:30;13278:56;;;13314:18;;:::i;:::-;13278:56;13352:29;13374:6;13352:29;:::i;:::-;13344:37;;13436:4;13430;13426:15;13418:23;;13141:307;;;:::o;13454:410::-;13531:5;13556:65;13572:48;13613:6;13572:48;:::i;:::-;13556:65;:::i;:::-;13547:74;;13644:6;13637:5;13630:21;13682:4;13675:5;13671:16;13720:3;13711:6;13706:3;13702:16;13699:25;13696:112;;;13727:79;;:::i;:::-;13696:112;13817:41;13851:6;13846:3;13841;13817:41;:::i;:::-;13537:327;13454:410;;;;;:::o;13883:338::-;13938:5;13987:3;13980:4;13972:6;13968:17;13964:27;13954:122;;13995:79;;:::i;:::-;13954:122;14112:6;14099:20;14137:78;14211:3;14203:6;14196:4;14188:6;14184:17;14137:78;:::i;:::-;14128:87;;13944:277;13883:338;;;;:::o;14227:943::-;14322:6;14330;14338;14346;14395:3;14383:9;14374:7;14370:23;14366:33;14363:120;;;14402:79;;:::i;:::-;14363:120;14522:1;14547:53;14592:7;14583:6;14572:9;14568:22;14547:53;:::i;:::-;14537:63;;14493:117;14649:2;14675:53;14720:7;14711:6;14700:9;14696:22;14675:53;:::i;:::-;14665:63;;14620:118;14777:2;14803:53;14848:7;14839:6;14828:9;14824:22;14803:53;:::i;:::-;14793:63;;14748:118;14933:2;14922:9;14918:18;14905:32;14964:18;14956:6;14953:30;14950:117;;;14986:79;;:::i;:::-;14950:117;15091:62;15145:7;15136:6;15125:9;15121:22;15091:62;:::i;:::-;15081:72;;14876:287;14227:943;;;;;;;:::o;15176:1059::-;15305:6;15313;15321;15329;15378:2;15366:9;15357:7;15353:23;15349:32;15346:119;;;15384:79;;:::i;:::-;15346:119;15504:1;15529:53;15574:7;15565:6;15554:9;15550:22;15529:53;:::i;:::-;15519:63;;15475:117;15659:2;15648:9;15644:18;15631:32;15690:18;15682:6;15679:30;15676:117;;;15712:79;;:::i;:::-;15676:117;15825:80;15897:7;15888:6;15877:9;15873:22;15825:80;:::i;:::-;15807:98;;;;15602:313;15982:2;15971:9;15967:18;15954:32;16013:18;16005:6;16002:30;15999:117;;;16035:79;;:::i;:::-;15999:117;16140:78;16210:7;16201:6;16190:9;16186:22;16140:78;:::i;:::-;16130:88;;15925:303;15176:1059;;;;;;;:::o;16241:474::-;16309:6;16317;16366:2;16354:9;16345:7;16341:23;16337:32;16334:119;;;16372:79;;:::i;:::-;16334:119;16492:1;16517:53;16562:7;16553:6;16542:9;16538:22;16517:53;:::i;:::-;16507:63;;16463:117;16619:2;16645:53;16690:7;16681:6;16670:9;16666:22;16645:53;:::i;:::-;16635:63;;16590:118;16241:474;;;;;:::o;16721:180::-;16769:77;16766:1;16759:88;16866:4;16863:1;16856:15;16890:4;16887:1;16880:15;16907:320;16951:6;16988:1;16982:4;16978:12;16968:22;;17035:1;17029:4;17025:12;17056:18;17046:81;;17112:4;17104:6;17100:17;17090:27;;17046:81;17174:2;17166:6;17163:14;17143:18;17140:38;17137:84;;;17193:18;;:::i;:::-;17137:84;16958:269;16907:320;;;:::o;17233:231::-;17373:34;17369:1;17361:6;17357:14;17350:58;17442:14;17437:2;17429:6;17425:15;17418:39;17233:231;:::o;17470:366::-;17612:3;17633:67;17697:2;17692:3;17633:67;:::i;:::-;17626:74;;17709:93;17798:3;17709:93;:::i;:::-;17827:2;17822:3;17818:12;17811:19;;17470:366;;;:::o;17842:419::-;18008:4;18046:2;18035:9;18031:18;18023:26;;18095:9;18089:4;18085:20;18081:1;18070:9;18066:17;18059:47;18123:131;18249:4;18123:131;:::i;:::-;18115:139;;17842:419;;;:::o;18267:220::-;18407:34;18403:1;18395:6;18391:14;18384:58;18476:3;18471:2;18463:6;18459:15;18452:28;18267:220;:::o;18493:366::-;18635:3;18656:67;18720:2;18715:3;18656:67;:::i;:::-;18649:74;;18732:93;18821:3;18732:93;:::i;:::-;18850:2;18845:3;18841:12;18834:19;;18493:366;;;:::o;18865:419::-;19031:4;19069:2;19058:9;19054:18;19046:26;;19118:9;19112:4;19108:20;19104:1;19093:9;19089:17;19082:47;19146:131;19272:4;19146:131;:::i;:::-;19138:139;;18865:419;;;:::o;19290:243::-;19430:34;19426:1;19418:6;19414:14;19407:58;19499:26;19494:2;19486:6;19482:15;19475:51;19290:243;:::o;19539:366::-;19681:3;19702:67;19766:2;19761:3;19702:67;:::i;:::-;19695:74;;19778:93;19867:3;19778:93;:::i;:::-;19896:2;19891:3;19887:12;19880:19;;19539:366;;;:::o;19911:419::-;20077:4;20115:2;20104:9;20100:18;20092:26;;20164:9;20158:4;20154:20;20150:1;20139:9;20135:17;20128:47;20192:131;20318:4;20192:131;:::i;:::-;20184:139;;19911:419;;;:::o;20336:236::-;20476:34;20472:1;20464:6;20460:14;20453:58;20545:19;20540:2;20532:6;20528:15;20521:44;20336:236;:::o;20578:366::-;20720:3;20741:67;20805:2;20800:3;20741:67;:::i;:::-;20734:74;;20817:93;20906:3;20817:93;:::i;:::-;20935:2;20930:3;20926:12;20919:19;;20578:366;;;:::o;20950:419::-;21116:4;21154:2;21143:9;21139:18;21131:26;;21203:9;21197:4;21193:20;21189:1;21178:9;21174:17;21167:47;21231:131;21357:4;21231:131;:::i;:::-;21223:139;;20950:419;;;:::o;21375:230::-;21515:34;21511:1;21503:6;21499:14;21492:58;21584:13;21579:2;21571:6;21567:15;21560:38;21375:230;:::o;21611:366::-;21753:3;21774:67;21838:2;21833:3;21774:67;:::i;:::-;21767:74;;21850:93;21939:3;21850:93;:::i;:::-;21968:2;21963:3;21959:12;21952:19;;21611:366;;;:::o;21983:419::-;22149:4;22187:2;22176:9;22172:18;22164:26;;22236:9;22230:4;22226:20;22222:1;22211:9;22207:17;22200:47;22264:131;22390:4;22264:131;:::i;:::-;22256:139;;21983:419;;;:::o;22408:180::-;22456:77;22453:1;22446:88;22553:4;22550:1;22543:15;22577:4;22574:1;22567:15;22594:305;22634:3;22653:20;22671:1;22653:20;:::i;:::-;22648:25;;22687:20;22705:1;22687:20;:::i;:::-;22682:25;;22841:1;22773:66;22769:74;22766:1;22763:81;22760:107;;;22847:18;;:::i;:::-;22760:107;22891:1;22888;22884:9;22877:16;;22594:305;;;;:::o;22905:233::-;22944:3;22967:24;22985:5;22967:24;:::i;:::-;22958:33;;23013:66;23006:5;23003:77;23000:103;;;23083:18;;:::i;:::-;23000:103;23130:1;23123:5;23119:13;23112:20;;22905:233;;;:::o;23144:231::-;23284:34;23280:1;23272:6;23268:14;23261:58;23353:14;23348:2;23340:6;23336:15;23329:39;23144:231;:::o;23381:366::-;23523:3;23544:67;23608:2;23603:3;23544:67;:::i;:::-;23537:74;;23620:93;23709:3;23620:93;:::i;:::-;23738:2;23733:3;23729:12;23722:19;;23381:366;;;:::o;23753:419::-;23919:4;23957:2;23946:9;23942:18;23934:26;;24006:9;24000:4;23996:20;23992:1;23981:9;23977:17;23970:47;24034:131;24160:4;24034:131;:::i;:::-;24026:139;;23753:419;;;:::o;24178:180::-;24226:77;24223:1;24216:88;24323:4;24320:1;24313:15;24347:4;24344:1;24337:15;24364:228;24504:34;24500:1;24492:6;24488:14;24481:58;24573:11;24568:2;24560:6;24556:15;24549:36;24364:228;:::o;24598:366::-;24740:3;24761:67;24825:2;24820:3;24761:67;:::i;:::-;24754:74;;24837:93;24926:3;24837:93;:::i;:::-;24955:2;24950:3;24946:12;24939:19;;24598:366;;;:::o;24970:419::-;25136:4;25174:2;25163:9;25159:18;25151:26;;25223:9;25217:4;25213:20;25209:1;25198:9;25194:17;25187:47;25251:131;25377:4;25251:131;:::i;:::-;25243:139;;24970:419;;;:::o;25395:229::-;25535:34;25531:1;25523:6;25519:14;25512:58;25604:12;25599:2;25591:6;25587:15;25580:37;25395:229;:::o;25630:366::-;25772:3;25793:67;25857:2;25852:3;25793:67;:::i;:::-;25786:74;;25869:93;25958:3;25869:93;:::i;:::-;25987:2;25982:3;25978:12;25971:19;;25630:366;;;:::o;26002:419::-;26168:4;26206:2;26195:9;26191:18;26183:26;;26255:9;26249:4;26245:20;26241:1;26230:9;26226:17;26219:47;26283:131;26409:4;26283:131;:::i;:::-;26275:139;;26002:419;;;:::o;26427:348::-;26467:7;26490:20;26508:1;26490:20;:::i;:::-;26485:25;;26524:20;26542:1;26524:20;:::i;:::-;26519:25;;26712:1;26644:66;26640:74;26637:1;26634:81;26629:1;26622:9;26615:17;26611:105;26608:131;;;26719:18;;:::i;:::-;26608:131;26767:1;26764;26760:9;26749:20;;26427:348;;;;:::o;26781:173::-;26921:25;26917:1;26909:6;26905:14;26898:49;26781:173;:::o;26960:366::-;27102:3;27123:67;27187:2;27182:3;27123:67;:::i;:::-;27116:74;;27199:93;27288:3;27199:93;:::i;:::-;27317:2;27312:3;27308:12;27301:19;;26960:366;;;:::o;27332:419::-;27498:4;27536:2;27525:9;27521:18;27513:26;;27585:9;27579:4;27575:20;27571:1;27560:9;27556:17;27549:47;27613:131;27739:4;27613:131;:::i;:::-;27605:139;;27332:419;;;:::o;27757:164::-;27897:16;27893:1;27885:6;27881:14;27874:40;27757:164;:::o;27927:366::-;28069:3;28090:67;28154:2;28149:3;28090:67;:::i;:::-;28083:74;;28166:93;28255:3;28166:93;:::i;:::-;28284:2;28279:3;28275:12;28268:19;;27927:366;;;:::o;28299:419::-;28465:4;28503:2;28492:9;28488:18;28480:26;;28552:9;28546:4;28542:20;28538:1;28527:9;28523:17;28516:47;28580:131;28706:4;28580:131;:::i;:::-;28572:139;;28299:419;;;:::o;28724:160::-;28864:12;28860:1;28852:6;28848:14;28841:36;28724:160;:::o;28890:366::-;29032:3;29053:67;29117:2;29112:3;29053:67;:::i;:::-;29046:74;;29129:93;29218:3;29129:93;:::i;:::-;29247:2;29242:3;29238:12;29231:19;;28890:366;;;:::o;29262:419::-;29428:4;29466:2;29455:9;29451:18;29443:26;;29515:9;29509:4;29505:20;29501:1;29490:9;29486:17;29479:47;29543:131;29669:4;29543:131;:::i;:::-;29535:139;;29262:419;;;:::o;29687:165::-;29827:17;29823:1;29815:6;29811:14;29804:41;29687:165;:::o;29858:366::-;30000:3;30021:67;30085:2;30080:3;30021:67;:::i;:::-;30014:74;;30097:93;30186:3;30097:93;:::i;:::-;30215:2;30210:3;30206:12;30199:19;;29858:366;;;:::o;30230:419::-;30396:4;30434:2;30423:9;30419:18;30411:26;;30483:9;30477:4;30473:20;30469:1;30458:9;30454:17;30447:47;30511:131;30637:4;30511:131;:::i;:::-;30503:139;;30230:419;;;:::o;30655:175::-;30795:27;30791:1;30783:6;30779:14;30772:51;30655:175;:::o;30836:366::-;30978:3;30999:67;31063:2;31058:3;30999:67;:::i;:::-;30992:74;;31075:93;31164:3;31075:93;:::i;:::-;31193:2;31188:3;31184:12;31177:19;;30836:366;;;:::o;31208:419::-;31374:4;31412:2;31401:9;31397:18;31389:26;;31461:9;31455:4;31451:20;31447:1;31436:9;31432:17;31425:47;31489:131;31615:4;31489:131;:::i;:::-;31481:139;;31208:419;;;:::o;31633:174::-;31773:26;31769:1;31761:6;31757:14;31750:50;31633:174;:::o;31813:366::-;31955:3;31976:67;32040:2;32035:3;31976:67;:::i;:::-;31969:74;;32052:93;32141:3;32052:93;:::i;:::-;32170:2;32165:3;32161:12;32154:19;;31813:366;;;:::o;32185:419::-;32351:4;32389:2;32378:9;32374:18;32366:26;;32438:9;32432:4;32428:20;32424:1;32413:9;32409:17;32402:47;32466:131;32592:4;32466:131;:::i;:::-;32458:139;;32185:419;;;:::o;32610:177::-;32750:29;32746:1;32738:6;32734:14;32727:53;32610:177;:::o;32793:366::-;32935:3;32956:67;33020:2;33015:3;32956:67;:::i;:::-;32949:74;;33032:93;33121:3;33032:93;:::i;:::-;33150:2;33145:3;33141:12;33134:19;;32793:366;;;:::o;33165:419::-;33331:4;33369:2;33358:9;33354:18;33346:26;;33418:9;33412:4;33408:20;33404:1;33393:9;33389:17;33382:47;33446:131;33572:4;33446:131;:::i;:::-;33438:139;;33165:419;;;:::o;33590:166::-;33730:18;33726:1;33718:6;33714:14;33707:42;33590:166;:::o;33762:366::-;33904:3;33925:67;33989:2;33984:3;33925:67;:::i;:::-;33918:74;;34001:93;34090:3;34001:93;:::i;:::-;34119:2;34114:3;34110:12;34103:19;;33762:366;;;:::o;34134:419::-;34300:4;34338:2;34327:9;34323:18;34315:26;;34387:9;34381:4;34377:20;34373:1;34362:9;34358:17;34351:47;34415:131;34541:4;34415:131;:::i;:::-;34407:139;;34134:419;;;:::o;34559:231::-;34699:34;34695:1;34687:6;34683:14;34676:58;34768:14;34763:2;34755:6;34751:15;34744:39;34559:231;:::o;34796:366::-;34938:3;34959:67;35023:2;35018:3;34959:67;:::i;:::-;34952:74;;35035:93;35124:3;35035:93;:::i;:::-;35153:2;35148:3;35144:12;35137:19;;34796:366;;;:::o;35168:419::-;35334:4;35372:2;35361:9;35357:18;35349:26;;35421:9;35415:4;35411:20;35407:1;35396:9;35392:17;35385:47;35449:131;35575:4;35449:131;:::i;:::-;35441:139;;35168:419;;;:::o;35593:228::-;35733:34;35729:1;35721:6;35717:14;35710:58;35802:11;35797:2;35789:6;35785:15;35778:36;35593:228;:::o;35827:366::-;35969:3;35990:67;36054:2;36049:3;35990:67;:::i;:::-;35983:74;;36066:93;36155:3;36066:93;:::i;:::-;36184:2;36179:3;36175:12;36168:19;;35827:366;;;:::o;36199:419::-;36365:4;36403:2;36392:9;36388:18;36380:26;;36452:9;36446:4;36442:20;36438:1;36427:9;36423:17;36416:47;36480:131;36606:4;36480:131;:::i;:::-;36472:139;;36199:419;;;:::o;36624:223::-;36764:34;36760:1;36752:6;36748:14;36741:58;36833:6;36828:2;36820:6;36816:15;36809:31;36624:223;:::o;36853:366::-;36995:3;37016:67;37080:2;37075:3;37016:67;:::i;:::-;37009:74;;37092:93;37181:3;37092:93;:::i;:::-;37210:2;37205:3;37201:12;37194:19;;36853:366;;;:::o;37225:419::-;37391:4;37429:2;37418:9;37414:18;37406:26;;37478:9;37472:4;37468:20;37464:1;37453:9;37449:17;37442:47;37506:131;37632:4;37506:131;:::i;:::-;37498:139;;37225:419;;;:::o;37650:191::-;37690:4;37710:20;37728:1;37710:20;:::i;:::-;37705:25;;37744:20;37762:1;37744:20;:::i;:::-;37739:25;;37783:1;37780;37777:8;37774:34;;;37788:18;;:::i;:::-;37774:34;37833:1;37830;37826:9;37818:17;;37650:191;;;;:::o;37847:94::-;37880:8;37928:5;37924:2;37920:14;37899:35;;37847:94;;;:::o;37947:::-;37986:7;38015:20;38029:5;38015:20;:::i;:::-;38004:31;;37947:94;;;:::o;38047:100::-;38086:7;38115:26;38135:5;38115:26;:::i;:::-;38104:37;;38047:100;;;:::o;38153:157::-;38258:45;38278:24;38296:5;38278:24;:::i;:::-;38258:45;:::i;:::-;38253:3;38246:58;38153:157;;:::o;38316:256::-;38428:3;38443:75;38514:3;38505:6;38443:75;:::i;:::-;38543:2;38538:3;38534:12;38527:19;;38563:3;38556:10;;38316:256;;;;:::o;38578:164::-;38718:16;38714:1;38706:6;38702:14;38695:40;38578:164;:::o;38748:366::-;38890:3;38911:67;38975:2;38970:3;38911:67;:::i;:::-;38904:74;;38987:93;39076:3;38987:93;:::i;:::-;39105:2;39100:3;39096:12;39089:19;;38748:366;;;:::o;39120:419::-;39286:4;39324:2;39313:9;39309:18;39301:26;;39373:9;39367:4;39363:20;39359:1;39348:9;39344:17;39337:47;39401:131;39527:4;39401:131;:::i;:::-;39393:139;;39120:419;;;:::o;39545:237::-;39685:34;39681:1;39673:6;39669:14;39662:58;39754:20;39749:2;39741:6;39737:15;39730:45;39545:237;:::o;39788:366::-;39930:3;39951:67;40015:2;40010:3;39951:67;:::i;:::-;39944:74;;40027:93;40116:3;40027:93;:::i;:::-;40145:2;40140:3;40136:12;40129:19;;39788:366;;;:::o;40160:419::-;40326:4;40364:2;40353:9;40349:18;40341:26;;40413:9;40407:4;40403:20;40399:1;40388:9;40384:17;40377:47;40441:131;40567:4;40441:131;:::i;:::-;40433:139;;40160:419;;;:::o;40585:234::-;40725:34;40721:1;40713:6;40709:14;40702:58;40794:17;40789:2;40781:6;40777:15;40770:42;40585:234;:::o;40825:366::-;40967:3;40988:67;41052:2;41047:3;40988:67;:::i;:::-;40981:74;;41064:93;41153:3;41064:93;:::i;:::-;41182:2;41177:3;41173:12;41166:19;;40825:366;;;:::o;41197:419::-;41363:4;41401:2;41390:9;41386:18;41378:26;;41450:9;41444:4;41440:20;41436:1;41425:9;41421:17;41414:47;41478:131;41604:4;41478:131;:::i;:::-;41470:139;;41197:419;;;:::o;41622:148::-;41724:11;41761:3;41746:18;;41622:148;;;;:::o;41776:377::-;41882:3;41910:39;41943:5;41910:39;:::i;:::-;41965:89;42047:6;42042:3;41965:89;:::i;:::-;41958:96;;42063:52;42108:6;42103:3;42096:4;42089:5;42085:16;42063:52;:::i;:::-;42140:6;42135:3;42131:16;42124:23;;41886:267;41776:377;;;;:::o;42159:435::-;42339:3;42361:95;42452:3;42443:6;42361:95;:::i;:::-;42354:102;;42473:95;42564:3;42555:6;42473:95;:::i;:::-;42466:102;;42585:3;42578:10;;42159:435;;;;;:::o;42600:98::-;42651:6;42685:5;42679:12;42669:22;;42600:98;;;:::o;42704:168::-;42787:11;42821:6;42816:3;42809:19;42861:4;42856:3;42852:14;42837:29;;42704:168;;;;:::o;42878:360::-;42964:3;42992:38;43024:5;42992:38;:::i;:::-;43046:70;43109:6;43104:3;43046:70;:::i;:::-;43039:77;;43125:52;43170:6;43165:3;43158:4;43151:5;43147:16;43125:52;:::i;:::-;43202:29;43224:6;43202:29;:::i;:::-;43197:3;43193:39;43186:46;;42968:270;42878:360;;;;:::o;43244:640::-;43439:4;43477:3;43466:9;43462:19;43454:27;;43491:71;43559:1;43548:9;43544:17;43535:6;43491:71;:::i;:::-;43572:72;43640:2;43629:9;43625:18;43616:6;43572:72;:::i;:::-;43654;43722:2;43711:9;43707:18;43698:6;43654:72;:::i;:::-;43773:9;43767:4;43763:20;43758:2;43747:9;43743:18;43736:48;43801:76;43872:4;43863:6;43801:76;:::i;:::-;43793:84;;43244:640;;;;;;;:::o;43890:141::-;43946:5;43977:6;43971:13;43962:22;;43993:32;44019:5;43993:32;:::i;:::-;43890:141;;;;:::o;44037:349::-;44106:6;44155:2;44143:9;44134:7;44130:23;44126:32;44123:119;;;44161:79;;:::i;:::-;44123:119;44281:1;44306:63;44361:7;44352:6;44341:9;44337:22;44306:63;:::i;:::-;44296:73;;44252:127;44037:349;;;;:::o;44392:180::-;44440:77;44437:1;44430:88;44537:4;44534:1;44527:15;44561:4;44558:1;44551:15;44578:185;44618:1;44635:20;44653:1;44635:20;:::i;:::-;44630:25;;44669:20;44687:1;44669:20;:::i;:::-;44664:25;;44708:1;44698:35;;44713:18;;:::i;:::-;44698:35;44755:1;44752;44748:9;44743:14;;44578:185;;;;:::o;44769:176::-;44801:1;44818:20;44836:1;44818:20;:::i;:::-;44813:25;;44852:20;44870:1;44852:20;:::i;:::-;44847:25;;44891:1;44881:35;;44896:18;;:::i;:::-;44881:35;44937:1;44934;44930:9;44925:14;;44769:176;;;;:::o;44951:180::-;44999:77;44996:1;44989:88;45096:4;45093:1;45086:15;45120:4;45117:1;45110:15;45137:182;45277:34;45273:1;45265:6;45261:14;45254:58;45137:182;:::o;45325:366::-;45467:3;45488:67;45552:2;45547:3;45488:67;:::i;:::-;45481:74;;45564:93;45653:3;45564:93;:::i;:::-;45682:2;45677:3;45673:12;45666:19;;45325:366;;;:::o;45697:419::-;45863:4;45901:2;45890:9;45886:18;45878:26;;45950:9;45944:4;45940:20;45936:1;45925:9;45921:17;45914:47;45978:131;46104:4;45978:131;:::i;:::-;45970:139;;45697:419;;;:::o;46122:178::-;46262:30;46258:1;46250:6;46246:14;46239:54;46122:178;:::o;46306:366::-;46448:3;46469:67;46533:2;46528:3;46469:67;:::i;:::-;46462:74;;46545:93;46634:3;46545:93;:::i;:::-;46663:2;46658:3;46654:12;46647:19;;46306:366;;;:::o;46678:419::-;46844:4;46882:2;46871:9;46867:18;46859:26;;46931:9;46925:4;46921:20;46917:1;46906:9;46902:17;46895:47;46959:131;47085:4;46959:131;:::i;:::-;46951:139;;46678:419;;;:::o
Swarm Source
ipfs://8e6aa81e086f2848ba9212d9cd593ce93b766e40eac004c8da0cd74386ad482c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.