ERC-721
Overview
Max Total Supply
10,000 🤖
Holders
2,644
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 🤖Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Robobots
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-22 */ // File: contracts/tokens/erc721.sol // SPDX-License-Identifier: MIT AND GPL-3.0 pragma solidity ^0.8.0; /** * @dev ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721 { /** * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any * number of NFTs may be created and assigned without emitting Transfer. At the time of any * transfer, the approved address for that NFT (if any) is reset to none. */ event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); /** * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero * address indicates there is no approved address. When a Transfer event emits, this also * indicates that the approved address for that NFT (if any) is reset to none. */ event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); /** * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage * all NFTs of the owner. */ event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); /** * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this * function checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata _data ) external; /** * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they may be permanently lost. * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function transferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is * the current NFT owner, or an authorized operator of the current owner. * @param _approved The new approved NFT controller. * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable. * @param _tokenId The NFT to approve. */ function approve( address _approved, uint256 _tokenId ) external; /** * @notice The contract MUST allow multiple operators per owner. * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @param _operator Address to add to the set of authorized operators. * @param _approved True if the operators is approved, false to revoke approval. */ function setApprovalForAll( address _operator, bool _approved ) external; /** * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are * considered invalid, and this function throws for queries about the zero address. * @notice Count all NFTs assigned to an owner. * @param _owner Address for whom to query the balance. * @return Balance of _owner. */ function balanceOf( address _owner ) external view returns (uint256); /** * @notice Find the owner of an NFT. * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are * considered invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. * @return Address of _tokenId owner. */ function ownerOf( uint256 _tokenId ) external view returns (address); /** * @notice Throws if `_tokenId` is not a valid NFT. * @dev Get the approved address for a single NFT. * @param _tokenId The NFT to find the approved address for. * @return Address that _tokenId is approved for. */ function getApproved( uint256 _tokenId ) external view returns (address); /** * @notice Query if an address is an authorized operator for another address. * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise. * @param _owner The address that owns the NFTs. * @param _operator The address that acts on behalf of the owner. * @return True if approved for all, false otherwise. */ function isApprovedForAll( address _owner, address _operator ) external view returns (bool); } // File: contracts/tokens/erc721-token-receiver.sol pragma solidity ^0.8.0; /** * @dev ERC-721 interface for accepting safe transfers. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721TokenReceiver { /** * @notice The contract address is always the message sender. A wallet/broker/auction application * MUST implement the wallet interface if it will accept safe transfers. * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return * of other than the magic value MUST result in the transaction being reverted. * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing. * @param _operator The address which called `safeTransferFrom` function. * @param _from The address which previously owned the token. * @param _tokenId The NFT identifier which is being transferred. * @param _data Additional data with no specified format. * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes calldata _data ) external returns(bytes4); } // File: contracts/utils/erc165.sol pragma solidity ^0.8.0; /** * @dev A standard for detecting smart contract interfaces. * See: https://eips.ethereum.org/EIPS/eip-165. */ interface ERC165 { /** * @dev Checks if the smart contract includes a specific interface. * This function uses less than 30,000 gas. * @param _interfaceID The interface identifier, as specified in ERC-165. * @return True if _interfaceID is supported, false otherwise. */ function supportsInterface( bytes4 _interfaceID ) external view returns (bool); } // File: contracts/utils/supports-interface.sol pragma solidity ^0.8.0; /** * @dev Implementation of standard for detect smart contract interfaces. */ contract SupportsInterface is ERC165 { /** * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true. */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev Contract constructor. */ constructor() { supportedInterfaces[0x01ffc9a7] = true; // ERC165 } /** * @dev Function to check which interfaces are suported by this contract. * @param _interfaceID Id of the interface. * @return True if _interfaceID is supported, false otherwise. */ function supportsInterface( bytes4 _interfaceID ) external override view returns (bool) { return supportedInterfaces[_interfaceID]; } } // File: contracts/utils/address-utils.sol pragma solidity ^0.8.0; /** * @notice Based on: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol * Requires EIP-1052. * @dev Utility library of inline functions on addresses. */ library AddressUtils { /** * @dev Returns whether the target address is a contract. * @param _addr Address to check. * @return addressCheck True if _addr is a contract, false if not. */ function isContract( address _addr ) internal view returns (bool addressCheck) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; assembly { codehash := extcodehash(_addr) } // solhint-disable-line addressCheck = (codehash != 0x0 && codehash != accountHash); } } // File: contracts/tokens/nf-token.sol pragma solidity ^0.8.0; /** * @dev Implementation of ERC-721 non-fungible token standard. */ contract NFToken is ERC721, SupportsInterface { using AddressUtils for address; /** * @dev List of revert message codes. Implementing dApp should handle showing the correct message. * Based on 0xcert framework error codes. */ string constant ZERO_ADDRESS = "003001"; string constant NOT_VALID_NFT = "003002"; string constant NOT_OWNER_OR_OPERATOR = "003003"; string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004"; string constant NOT_ABLE_TO_RECEIVE_NFT = "003005"; string constant NFT_ALREADY_EXISTS = "003006"; string constant NOT_OWNER = "003007"; string constant IS_OWNER = "003008"; /** * @dev Magic value of a smart contract that can receive NFT. * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")). */ bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02; /** * @dev A mapping from NFT ID to the address that owns it. */ mapping (uint256 => address) internal idToOwner; /** * @dev Mapping from NFT ID to approved address. */ mapping (uint256 => address) internal idToApproval; /** * @dev Mapping from owner address to count of their tokens. */ mapping (address => uint256) private ownerToNFTokenCount; /** * @dev Mapping from owner address to mapping of operator addresses. */ mapping (address => mapping (address => bool)) internal ownerToOperators; /** * @dev Guarantees that the msg.sender is an owner or operator of the given NFT. * @param _tokenId ID of the NFT to validate. */ modifier canOperate( uint256 _tokenId ) { address tokenOwner = idToOwner[_tokenId]; require( tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender], NOT_OWNER_OR_OPERATOR ); _; } /** * @dev Guarantees that the msg.sender is allowed to transfer NFT. * @param _tokenId ID of the NFT to transfer. */ modifier canTransfer( uint256 _tokenId ) { address tokenOwner = idToOwner[_tokenId]; require( tokenOwner == msg.sender || idToApproval[_tokenId] == msg.sender || ownerToOperators[tokenOwner][msg.sender], NOT_OWNER_APPROVED_OR_OPERATOR ); _; } /** * @dev Guarantees that _tokenId is a valid Token. * @param _tokenId ID of the NFT to validate. */ modifier validNFToken( uint256 _tokenId ) { require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT); _; } /** * @dev Contract constructor. */ constructor() { supportedInterfaces[0x80ac58cd] = true; // ERC721 } /** * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this * function checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata _data ) external override { _safeTransferFrom(_from, _to, _tokenId, _data); } /** * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "". * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external override { _safeTransferFrom(_from, _to, _tokenId, ""); } /** * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they may be permanently lost. * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function transferFrom( address _from, address _to, uint256 _tokenId ) external override canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from, NOT_OWNER); require(_to != address(0), ZERO_ADDRESS); _transfer(_to, _tokenId); } /** * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is * the current NFT owner, or an authorized operator of the current owner. * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable. * @param _approved Address to be approved for the given NFT ID. * @param _tokenId ID of the token to be approved. */ function approve( address _approved, uint256 _tokenId ) external override canOperate(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(_approved != tokenOwner, IS_OWNER); idToApproval[_tokenId] = _approved; emit Approval(tokenOwner, _approved, _tokenId); } /** * @notice This works even if sender doesn't own any tokens at the time. * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @param _operator Address to add to the set of authorized operators. * @param _approved True if the operators is approved, false to revoke approval. */ function setApprovalForAll( address _operator, bool _approved ) external override { ownerToOperators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are * considered invalid, and this function throws for queries about the zero address. * @param _owner Address for whom to query the balance. * @return Balance of _owner. */ function balanceOf( address _owner ) external override view returns (uint256) { require(_owner != address(0), ZERO_ADDRESS); return _getOwnerNFTCount(_owner); } /** * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are * considered invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. * @return _owner Address of _tokenId owner. */ function ownerOf( uint256 _tokenId ) external override view returns (address _owner) { _owner = idToOwner[_tokenId]; require(_owner != address(0), NOT_VALID_NFT); } /** * @notice Throws if `_tokenId` is not a valid NFT. * @dev Get the approved address for a single NFT. * @param _tokenId ID of the NFT to query the approval of. * @return Address that _tokenId is approved for. */ function getApproved( uint256 _tokenId ) external override view validNFToken(_tokenId) returns (address) { return idToApproval[_tokenId]; } /** * @dev Checks if `_operator` is an approved operator for `_owner`. * @param _owner The address that owns the NFTs. * @param _operator The address that acts on behalf of the owner. * @return True if approved for all, false otherwise. */ function isApprovedForAll( address _owner, address _operator ) external override view returns (bool) { return ownerToOperators[_owner][_operator]; } /** * @notice Does NO checks. * @dev Actually performs the transfer. * @param _to Address of a new owner. * @param _tokenId The NFT that is being transferred. */ function _transfer( address _to, uint256 _tokenId ) internal virtual { address from = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(from, _tokenId); _addNFToken(_to, _tokenId); emit Transfer(from, _to, _tokenId); } /** * @notice This is an internal function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @dev Mints a new NFT. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal virtual { require(_to != address(0), ZERO_ADDRESS); require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); _addNFToken(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); } /** * @notice This is an internal function which should be called from user-implemented external burn * function. Its purpose is to show and properly initialize data structures when using this * implementation. Also, note that this burn implementation allows the minter to re-mint a burned * NFT. * @dev Burns a NFT. * @param _tokenId ID of the NFT to be burned. */ function _burn( uint256 _tokenId ) internal virtual validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(tokenOwner, _tokenId); emit Transfer(tokenOwner, address(0), _tokenId); } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Removes a NFT from owner. * @param _from Address from which we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function _removeNFToken( address _from, uint256 _tokenId ) internal virtual { require(idToOwner[_tokenId] == _from, NOT_OWNER); ownerToNFTokenCount[_from] -= 1; delete idToOwner[_tokenId]; } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Assigns a new NFT to owner. * @param _to Address to which we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function _addNFToken( address _to, uint256 _tokenId ) internal virtual { require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); idToOwner[_tokenId] = _to; ownerToNFTokenCount[_to] += 1; } /** * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable * extension to remove double storage (gas optimization) of owner NFT count. * @param _owner Address for whom to query the count. * @return Number of _owner NFTs. */ function _getOwnerNFTCount( address _owner ) internal virtual view returns (uint256) { return ownerToNFTokenCount[_owner]; } /** * @dev Actually perform the safeTransferFrom. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function _safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes memory _data ) private canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from, NOT_OWNER); require(_to != address(0), ZERO_ADDRESS); _transfer(_to, _tokenId); if (_to.isContract()) { bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data); require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT); } } /** * @dev Clears the current approval of a given NFT ID. * @param _tokenId ID of the NFT to be transferred. */ function _clearApproval( uint256 _tokenId ) private { delete idToApproval[_tokenId]; } } // File: contracts/tokens/erc721-metadata.sol pragma solidity ^0.8.0; /** * @dev Optional metadata extension for ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721Metadata { /** * @dev Returns a descriptive name for a collection of NFTs in this contract. * @return _name Representing name. */ function name() external view returns (string memory _name); /** * @dev Returns a abbreviated name for a collection of NFTs in this contract. * @return _symbol Representing symbol. */ function symbol() external view returns (string memory _symbol); /** * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file * that conforms to the "ERC721 Metadata JSON Schema". * @return URI of _tokenId. */ function tokenURI(uint256 _tokenId) external view returns (string memory); } // File: contracts/NFTokenMetadata.sol pragma solidity 0.8.6; /** * @dev Optional metadata implementation for ERC-721 non-fungible token standard. */ contract NFTokenMetadata is NFToken, ERC721Metadata { /** * @dev A descriptive name for a collection of NFTs. */ string internal nftName; /** * @dev An abbreviated name for NFTokens. */ string internal nftSymbol; /** * @dev The baseUri for NFTokens. */ string internal baseUri; /** * @dev Contract constructor. * @notice When implementing, don't forget to set nftName, nftSymbol, and baseUri */ constructor() { supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata } /** * @dev Returns a descriptive name for a collection of NFTokens. * @return _name Representing name. */ function name() external override view returns (string memory _name) { _name = nftName; } /** * @dev Returns an abbreviated name for NFTokens. * @return _symbol Representing symbol. */ function symbol() external override view returns (string memory _symbol) { _symbol = nftSymbol; } /** * @dev A distinct URI (RFC 3986) for a given NFT. * @param _tokenId Id for which we want uri. * @return concatenated baseURI and _tokenId string. */ function tokenURI( uint256 _tokenId ) external override view validNFToken(_tokenId) returns (string memory) { return string(abi.encodePacked(baseUri, uint2str(_tokenId))); } function uint2str(uint _i) internal pure returns (string memory) { if (_i == 0) { return "0"; } uint j = _i; uint length; while (j != 0) { length++; j /= 10; } bytes memory str = new bytes(length); while (_i != 0) { str[--length] = bytes1(uint8(48 + _i % 10)); _i /= 10; } return string(str); } } // File: contracts/ownership/ownable.sol pragma solidity ^0.8.0; /** * @dev The contract has an owner address, and provides basic authorization control whitch * simplifies the implementation of user permissions. This contract is based on the source code at: * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol */ contract Ownable { /** * @dev Error constants. */ string public constant NOT_CURRENT_OWNER = "018001"; string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002"; /** * @dev Current owner address. */ address public owner; /** * @dev An event which is triggered when the owner is changed. * @param previousOwner The address of the previous owner. * @param newOwner The address of the new owner. */ event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The constructor sets the original `owner` of the contract to the sender account. */ constructor() { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner, NOT_CURRENT_OWNER); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership( address _newOwner ) public onlyOwner { require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/Robobots.sol pragma solidity 0.8.6; /** * @dev Robobots ERC721 & Marketplace. */ contract Robobots is NFTokenMetadata, Ownable { using SafeMath for uint256; string constant NOT_FOR_SALE = "004001"; string constant NOT_FOR_SALE_TO_YOU = "004002"; string constant INSUFFICIENT_VALUE = "004003"; string constant BID_INFLATION = "004004"; string constant MISSING_BID = "004005"; string constant NOT_BIDDER = "004006"; string constant INTERNAL_INCONSISTENCY = "004007"; string public constant imageHash = "d4c5e36e00ab8cefae0f3c04ad14f71209e75897a9dd1a3e59a01a51be7dfbf0"; uint256 public constant totalSupply = 10000; uint256 public constant feePercent = 1; // of 100 basis points, or 1% struct Offer { bool isForSale; uint tokenId; address seller; uint minValue; address onlySellTo; // optionally sell only to a specific address } struct Bid { bool hasBid; uint tokenId; address bidder; uint value; } // A record of tokens that are offered for sale at a minimum value, and optionally to a specific buyer mapping (uint => Offer) public offers; // A record of the highest bid per token mapping (uint => Bid) public bids; // Ether stored in the contract until a seller withdraws mapping (address => uint) public pendingWithdrawals; event PurchaseMade(uint indexed tokenId, uint value, address indexed fromAddress, address indexed toAddress); event OfferMade(uint indexed tokenId, uint minValue, address indexed toAddress); event OfferRemoved(uint indexed tokenId); event BidMade(uint indexed tokenId, uint value, address indexed fromAddress); event BidRemoved(uint indexed tokenId, uint value, address indexed fromAddress); /** * @dev Contract constructor. Sets metadata extension `name` and `symbol`. */ constructor() { nftName = "robobots"; nftSymbol = unicode"🤖"; baseUri = "https://robobots-f79f8.web.app/metadata/bot"; } function setBaseTokenURI(string calldata _baseUri) external onlyOwner { baseUri = _baseUri; } /** * @dev Mints a new NFT. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function mint(address _to, uint256 _tokenId) external { require(_tokenId < totalSupply, NOT_VALID_NFT); // _tokenId should range from 0 to totalSupply-1 super._mint(_to, _tokenId); } /** * @dev onlyOwner backdoor to allow multiple mints in one transaction * @param _to The addresses that will own a minted NFT. * @param _tokenIds to be minted by the msg.sender. */ function mintAll(address[] memory _to, uint256[] memory _tokenIds) external onlyOwner { uint n = _to.length; for (uint i = 0; i < n; i++) { require(_tokenIds[i] < totalSupply, NOT_VALID_NFT); super._mint(_to[i], _tokenIds[i]); } } /** * @dev Put the token on sale at a minimum sale price. * @param _tokenId The token for sale, operated by msg.sender * @param _minSalePriceInWei the minimum payment accepted */ function makeOffer(uint256 _tokenId, uint _minSalePriceInWei) external canOperate(_tokenId) { offers[_tokenId] = Offer(true, _tokenId, msg.sender, _minSalePriceInWei, address(0)); emit OfferMade(_tokenId, _minSalePriceInWei, address(0)); } /** * @dev Like makeOffer, but the token may only be bought from a specific address. * @param _tokenId The token for sale, operated by msg.sender * @param _minSalePriceInWei the minimum payment accepted * @param _toAddress the only allowed buyer */ function makeOfferToAddress(uint256 _tokenId, uint _minSalePriceInWei, address _toAddress) external canOperate(_tokenId) { offers[_tokenId] = Offer(true, _tokenId, msg.sender, _minSalePriceInWei, _toAddress); emit OfferMade(_tokenId, _minSalePriceInWei, _toAddress); } /** * @dev Remove the offer for this token. * @param _tokenId The token (previously) for sale, operated by msg.sender */ function withdrawOffer(uint256 _tokenId) external canOperate(_tokenId) { _removeOffer(_tokenId); } /** * @dev Buy the token at the minimum sale price. * @param _tokenId The token for sale */ function buy(uint256 _tokenId) external payable { // check that this is a valid purchase attempt require(_tokenId < totalSupply, NOT_VALID_NFT); Offer memory offer = offers[_tokenId]; require(offer.isForSale, NOT_FOR_SALE); require(offer.onlySellTo == address(0) || offer.onlySellTo == msg.sender, NOT_FOR_SALE_TO_YOU); require(msg.value >= offer.minValue, INSUFFICIENT_VALUE); address seller = offer.seller; require(seller == idToOwner[_tokenId], INTERNAL_INCONSISTENCY); // make the Transfer _transfer(msg.sender, _tokenId); // collect fee, and make proceeds available to seller uint256 fee = (msg.value.mul(feePercent)).div(100); uint256 proceeds = msg.value - fee; pendingWithdrawals[owner] += fee; pendingWithdrawals[seller] += proceeds; emit PurchaseMade(_tokenId, msg.value, seller, msg.sender); // Check for the case where there is a bid from the new owner and refund it. // Any other bid can stay in place. Bid memory bid = bids[_tokenId]; if (bid.bidder == msg.sender) { // Delete bid and refund value pendingWithdrawals[msg.sender] += bid.value; _removeBid(_tokenId); } } /** * @dev Remove funds from this contract, after a sale and/or a withdrawn bid. */ function withdrawFunds() external { uint amount = pendingWithdrawals[msg.sender]; // Zero the pending refund before sending to prevent re-entrancy attacks pendingWithdrawals[msg.sender] = 0; payable(msg.sender).transfer(amount); } /** * @dev Make a bid for the token with msg.value. * @param _tokenId The coveted token */ function makeBid(uint256 _tokenId) external payable { require(_tokenId < totalSupply, NOT_VALID_NFT); require(idToOwner[_tokenId] != address(0), ZERO_ADDRESS); require(idToOwner[_tokenId] != msg.sender, BID_INFLATION); Bid memory existingBid = bids[_tokenId]; require(msg.value > existingBid.value, INSUFFICIENT_VALUE); if (existingBid.value > 0) { pendingWithdrawals[existingBid.bidder] += existingBid.value; // refund the outbid bidder } bids[_tokenId] = Bid(true, _tokenId, msg.sender, msg.value); emit BidMade(_tokenId, msg.value, msg.sender); } /** * @dev Accept the highest bid, assuming a minimum sale price. * @param _tokenId The coveted token, operated by msg.sender * @param _minSalePriceInWei the minimum payment accepted, ensuring the bid has not just been reduced. */ function acceptBid(uint256 _tokenId, uint _minSalePriceInWei) external canOperate(_tokenId) { address seller = msg.sender; Bid memory bid = bids[_tokenId]; require(bid.hasBid, MISSING_BID); require(bid.value > 0, INTERNAL_INCONSISTENCY); require(bid.value >= _minSalePriceInWei, INSUFFICIENT_VALUE); // make the Transfer _transfer(bid.bidder, _tokenId); uint amount = bid.value; _removeBid(_tokenId); // collect fee, and make proceeds available to seller uint256 fee = (amount.mul(feePercent)).div(100); uint256 proceeds = amount - fee; pendingWithdrawals[owner] += fee; pendingWithdrawals[seller] += proceeds; emit PurchaseMade(_tokenId, bid.value, seller, bid.bidder); } /** * @dev Withdraw the bid for this token. * @param _tokenId The (once-)coveted token */ function withdrawBid(uint256 _tokenId) external { require(_tokenId < totalSupply, NOT_VALID_NFT); require(idToOwner[_tokenId] != msg.sender, BID_INFLATION); Bid memory bid = bids[_tokenId]; require(bid.bidder == msg.sender, NOT_BIDDER); uint amount = bid.value; _removeBid(_tokenId); // Refund the bid money payable(msg.sender).transfer(amount); } function _removeOffer(uint256 _tokenId) internal { if (offers[_tokenId].isForSale) { offers[_tokenId] = Offer(false, _tokenId, address(0), 0, address(0)); emit OfferRemoved(_tokenId); } } function _removeBid(uint256 _tokenId) internal { Bid memory bid = bids[_tokenId]; bids[_tokenId] = Bid(false, 0, address(0), 0); emit BidRemoved(_tokenId, bid.value, bid.bidder); } /** * @dev Transfers the ownership of an NFT from one address to another address. * Removes any existing offer for the token when ownership changes. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function _transfer(address _to, uint256 _tokenId) internal override { super._transfer(_to, _tokenId); _removeOffer(_tokenId); } }
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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"BidMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"BidRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minValue","type":"uint256"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"OfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OfferRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"PurchaseMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minSalePriceInWei","type":"uint256"}],"name":"acceptBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bids","outputs":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imageHash","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"_tokenId","type":"uint256"}],"name":"makeBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minSalePriceInWei","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minSalePriceInWei","type":"uint256"},{"internalType":"address","name":"_toAddress","type":"address"}],"name":"makeOfferToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"mintAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offers","outputs":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"address","name":"onlySellTo","type":"address"}],"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":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingWithdrawals","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":"_baseUri","type":"string"}],"name":"setBaseTokenURI","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":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawOffer","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600881526020017f726f626f626f747300000000000000000000000000000000000000000000000081525060059080519060200190620001939291906200021a565b506040518060400160405280600481526020017ff09fa4960000000000000000000000000000000000000000000000000000000081525060069080519060200190620001e19291906200021a565b506040518060600160405280602b815260200162005e78602b913960079080519060200190620002139291906200021a565b506200032f565b8280546200022890620002ca565b90600052602060002090601f0160209004810192826200024c576000855562000298565b82601f106200026757805160ff191683800117855562000298565b8280016001018555821562000298579182015b82811115620002975782518255916020019190600101906200027a565b5b509050620002a79190620002ab565b5090565b5b80821115620002c6576000816000905550600101620002ac565b5090565b60006002820490506001821680620002e357607f821691505b60208210811415620002fa57620002f962000300565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615b39806200033f6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063ae0b61ba116100a0578063d96a094a1161006f578063d96a094a14610725578063e985e9c514610741578063f2fde38b1461077e578063f3f43703146107a7578063f3fe3bc3146107e4576101f9565b8063ae0b61ba1461066d578063b88d4fde14610696578063c87b56dd146106bf578063c99fef70146106fc576101f9565b80638a72ea6a116100dc5780638a72ea6a146105ad5780638da5cb5b146105ee57806395d89b4114610619578063a22cb46514610644576101f9565b806370a08231146104f15780637fd6f15c1461052e578063860d248a146105595780638610f04514610584576101f9565b806318160ddd1161019057806340c10f191161015f57806340c10f19146103f757806342842e0e146104205780634423c5f11461044957806351605d80146104895780636352211e146104b4576101f9565b806318160ddd1461036357806323b872dd1461038e57806324600fc3146103b757806330176e13146103ce576101f9565b8063081812fc116101cc578063081812fc146102b8578063095ea7b3146102f55780630eaaf4c81461031e578063175b230414610347576101f9565b806301ffc9a7146101fe57806302e9d5e41461023b57806305b7cdd31461026457806306fdde031461028d575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190615189565b61080f565b60405161023291906154ca565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061525d565b610876565b005b34801561027057600080fd5b5061028b6004803603810190610286919061525d565b610db2565b005b34801561029957600080fd5b506102a26110a8565b6040516102af919061557d565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190615230565b61113a565b6040516102ec9190615463565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906150d1565b611255565b005b34801561032a57600080fd5b5061034560048036038101906103409190615230565b611638565b005b610361600480360381019061035c9190615230565b611940565b005b34801561036f57600080fd5b50610378611e24565b604051610385919061559f565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614fb6565b611e2a565b005b3480156103c357600080fd5b506103cc61227c565b005b3480156103da57600080fd5b506103f560048036038101906103f091906151e3565b61234f565b005b34801561040357600080fd5b5061041e600480360381019061041991906150d1565b61242e565b005b34801561042c57600080fd5b5061044760048036038101906104429190614fb6565b6124b9565b005b34801561045557600080fd5b50610470600480360381019061046b9190615230565b6124d9565b60405161048094939291906154e5565b60405180910390f35b34801561049557600080fd5b5061049e612536565b6040516104ab919061557d565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190615230565b612552565b6040516104e89190615463565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190614f49565b612638565b604051610525919061559f565b60405180910390f35b34801561053a57600080fd5b506105436126f2565b604051610550919061559f565b60405180910390f35b34801561056557600080fd5b5061056e6126f7565b60405161057b919061557d565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615230565b612730565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615230565b6128af565b6040516105e595949392919061552a565b60405180910390f35b3480156105fa57600080fd5b50610603612932565b6040516106109190615463565b60405180910390f35b34801561062557600080fd5b5061062e612958565b60405161063b919061557d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190615091565b6129ea565b005b34801561067957600080fd5b50610694600480360381019061068f9190615111565b612ae7565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190615009565b612caf565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190615230565b612d06565b6040516106f3919061557d565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e919061529d565b612e18565b005b61073f600480360381019061073a9190615230565b61310d565b005b34801561074d57600080fd5b5061076860048036038101906107639190614f76565b613811565b60405161077591906154ca565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190614f49565b6138a5565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190614f49565b613ad7565b6040516107db919061559f565b60405180910390f35b3480156107f057600080fd5b506107f9613aef565b604051610806919061557d565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061096f5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd919061557d565b60405180910390fd5b5060003390506000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001516040518060400160405280600681526020017f303034303035000000000000000000000000000000000000000000000000000081525090610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b06919061557d565b60405180910390fd5b5060008160600151116040518060400160405280600681526020017f303034303037000000000000000000000000000000000000000000000000000081525090610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86919061557d565b60405180910390fd5b5084816060015110156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c06919061557d565b60405180910390fd5b50610c1e816040015187613b28565b600081606001519050610c3087613b3f565b6000610c596064610c4b600185613d0f90919063ffffffff16565b613d2590919063ffffffff16565b905060008183610c699190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cdc919061568f565b9250508190555080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d32919061568f565b92505081905550836040015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168a7fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd7968760600151604051610d9f919061559f565b60405180910390a4505050505050505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610eab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600073ffffffffffffffffffffffffffffffffffffffff16847f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc18560405161109a919061559f565b60405180910390a350505050565b6060600580546110b790615875565b80601f01602080910402602001604051908101604052809291908181526020018280546110e390615875565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f919061557d565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061134e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579919061557d565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303430303400000000000000000000000000000000000000000000000000008152509061178f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611786919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030343030360000000000000000000000000000000000000000000000000000815250906118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d8919061557d565b60405180910390fd5b506000816060015190506118f483613b3f565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561193a573d6000803e3d6000fd5b50505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b3919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303034303034000000000000000000000000000000000000000000000000000081525090611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050806060015134116040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c90919061557d565b60405180910390fd5b50600081606001511115611d06578060600151600b6000836040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfe919061568f565b925050819055505b60405180608001604052806001151581526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301559050503373ffffffffffffffffffffffffffffffffffffffff16827f2db9bd3d5e680e2159753ffc16e1709fb0e786ca24553a511f64e3c6a7d4b70a34604051611e18919061559f565b60405180910390a35050565b61271081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611efb57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611f8c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b6919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f919061557d565b60405180910390fd5b506122738686613b28565b50505050505050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561234b573d6000803e3d6000fd5b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e919061557d565b60405180910390fd5b50818160079190612429929190614c55565b505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1919061557d565b60405180910390fd5b506124b58282613d3b565b5050565b6124d483838360405180602001604052806000815250613f29565b505050565b600a6020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905084565b604051806060016040528060408152602001615ac46040913981565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612629919061557d565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d8919061557d565b60405180910390fd5b506126eb826144f7565b9050919050565b600181565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806128295750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897919061557d565b60405180910390fd5b506128aa83614540565b505050565b60096020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461296790615875565b80601f016020809104026020016040519081016040528092919081815260200182805461299390615875565b80156129e05780601f106129b5576101008083540402835291602001916129e0565b820191906000526020600020905b8154815290600101906020018083116129c357829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612adb91906154ca565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba6919061557d565b60405180910390fd5b5060008251905060005b81811015612ca957612710838281518110612bd757612bd66159df565b5b6020026020010151106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4e919061557d565b60405180910390fd5b50612c96848281518110612c6e57612c6d6159df565b5b6020026020010151848381518110612c8957612c886159df565b5b6020026020010151613d3b565b8080612ca1906158d8565b915050612bb9565b50505050565b612cff85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613f29565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb919061557d565b60405180910390fd5b506007612df0846146cb565b604051602001612e0192919061543f565b604051602081830303815290604052915050919050565b8260006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612f115750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff168152506009600087815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508273ffffffffffffffffffffffffffffffffffffffff16857f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc1866040516130fe919061559f565b60405180910390a35050505050565b61271081106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613189576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613180919061557d565b60405180910390fd5b506000600960008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905080600001516040518060400160405280600681526020017f303034303031000000000000000000000000000000000000000000000000000081525090613303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fa919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16148061337257503373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600681526020017f3030343030320000000000000000000000000000000000000000000000000000815250906133e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e0919061557d565b60405180910390fd5b5080606001513410156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090613469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613460919061557d565b60405180910390fd5b506000816040015190506001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303430303700000000000000000000000000000000000000000000000000008152509061354c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613543919061557d565b60405180910390fd5b506135573384613b28565b60006135806064613572600134613d0f90919063ffffffff16565b613d2590919063ffffffff16565b9050600081346135909190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613603919061568f565b9250508190555080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613659919061568f565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16867fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd796346040516136be919061559f565b60405180910390a46000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161415613809578060600151600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137f8919061568f565b9250508190555061380886613b3f565b5b505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061396d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613964919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090613a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0d919061557d565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915090505481565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b613b328282614829565b613b3b81614540565b5050565b6000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050604051806080016040528060001515815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155905050806040015173ffffffffffffffffffffffffffffffffffffffff16827f4a096bfd874de7130bbce9d6635f0a77646b227b594b1b1b34d174e05be363dc8360600151604051613d03919061559f565b60405180910390a35050565b60008183613d1d9190615716565b905092915050565b60008183613d3391906156e5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dda919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb5919061557d565b60405180910390fd5b50613ec982826148de565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480613ffa57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061408b5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090614102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140f9919061557d565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906141df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d6919061557d565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906142be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b5919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090614367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435e919061557d565b60405180910390fd5b506143728787613b28565b6143918773ffffffffffffffffffffffffffffffffffffffff16614a66565b156144ed5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016143d7949392919061547e565b602060405180830381600087803b1580156143f157600080fd5b505af1158015614405573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061442991906151b6565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906144ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144e1919061557d565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6009600082815260200190815260200160002060000160009054906101000a900460ff16156146c8576040518060a00160405280600015158152602001828152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600083815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050807fe78251393d13c4f887458774ea505a80414b5608a0c963bb2e75da45811919f160405160405180910390a25b50565b60606000821415614713576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614824565b600082905060005b6000821461474557808061472e906158d8565b915050600a8261473e91906156e5565b915061471b565b60008167ffffffffffffffff81111561476157614760615a0e565b5b6040519080825280601f01601f1916602001820160405280156147935781602001600182028036833780820191505090505b5090505b6000851461481d57600a856147ac9190615921565b60306147b8919061568f565b60f81b81836147c69061584b565b935083815181106147da576147d96159df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561481691906156e5565b9450614797565b8093505050505b919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061486a82614ab1565b6148748183614aea565b61487e83836148de565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906149b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149af919061557d565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614a5b919061568f565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015614aa85750808214155b92505050919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090614bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614bba919061557d565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614c149190615770565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b828054614c6190615875565b90600052602060002090601f016020900481019282614c835760008555614cca565b82601f10614c9c57803560ff1916838001178555614cca565b82800160010185558215614cca579182015b82811115614cc9578235825591602001919060010190614cae565b5b509050614cd79190614cdb565b5090565b5b80821115614cf4576000816000905550600101614cdc565b5090565b6000614d0b614d06846155df565b6155ba565b90508083825260208201905082856020860282011115614d2e57614d2d615a47565b5b60005b85811015614d5e5781614d448882614dd8565b845260208401935060208301925050600181019050614d31565b5050509392505050565b6000614d7b614d768461560b565b6155ba565b90508083825260208201905082856020860282011115614d9e57614d9d615a47565b5b60005b85811015614dce5781614db48882614f34565b845260208401935060208301925050600181019050614da1565b5050509392505050565b600081359050614de781615a67565b92915050565b600082601f830112614e0257614e01615a42565b5b8135614e12848260208601614cf8565b91505092915050565b600082601f830112614e3057614e2f615a42565b5b8135614e40848260208601614d68565b91505092915050565b600081359050614e5881615a7e565b92915050565b600081359050614e6d81615a95565b92915050565b600081519050614e8281615a95565b92915050565b60008083601f840112614e9e57614e9d615a42565b5b8235905067ffffffffffffffff811115614ebb57614eba615a3d565b5b602083019150836001820283011115614ed757614ed6615a47565b5b9250929050565b60008083601f840112614ef457614ef3615a42565b5b8235905067ffffffffffffffff811115614f1157614f10615a3d565b5b602083019150836001820283011115614f2d57614f2c615a47565b5b9250929050565b600081359050614f4381615aac565b92915050565b600060208284031215614f5f57614f5e615a51565b5b6000614f6d84828501614dd8565b91505092915050565b60008060408385031215614f8d57614f8c615a51565b5b6000614f9b85828601614dd8565b9250506020614fac85828601614dd8565b9150509250929050565b600080600060608486031215614fcf57614fce615a51565b5b6000614fdd86828701614dd8565b9350506020614fee86828701614dd8565b9250506040614fff86828701614f34565b9150509250925092565b60008060008060006080868803121561502557615024615a51565b5b600061503388828901614dd8565b955050602061504488828901614dd8565b945050604061505588828901614f34565b935050606086013567ffffffffffffffff81111561507657615075615a4c565b5b61508288828901614e88565b92509250509295509295909350565b600080604083850312156150a8576150a7615a51565b5b60006150b685828601614dd8565b92505060206150c785828601614e49565b9150509250929050565b600080604083850312156150e8576150e7615a51565b5b60006150f685828601614dd8565b925050602061510785828601614f34565b9150509250929050565b6000806040838503121561512857615127615a51565b5b600083013567ffffffffffffffff81111561514657615145615a4c565b5b61515285828601614ded565b925050602083013567ffffffffffffffff81111561517357615172615a4c565b5b61517f85828601614e1b565b9150509250929050565b60006020828403121561519f5761519e615a51565b5b60006151ad84828501614e5e565b91505092915050565b6000602082840312156151cc576151cb615a51565b5b60006151da84828501614e73565b91505092915050565b600080602083850312156151fa576151f9615a51565b5b600083013567ffffffffffffffff81111561521857615217615a4c565b5b61522485828601614ede565b92509250509250929050565b60006020828403121561524657615245615a51565b5b600061525484828501614f34565b91505092915050565b6000806040838503121561527457615273615a51565b5b600061528285828601614f34565b925050602061529385828601614f34565b9150509250929050565b6000806000606084860312156152b6576152b5615a51565b5b60006152c486828701614f34565b93505060206152d586828701614f34565b92505060406152e686828701614dd8565b9150509250925092565b6152f9816157a4565b82525050565b615308816157b6565b82525050565b60006153198261564c565b6153238185615662565b9350615333818560208601615818565b61533c81615a56565b840191505092915050565b600061535282615657565b61535c8185615673565b935061536c818560208601615818565b61537581615a56565b840191505092915050565b600061538b82615657565b6153958185615684565b93506153a5818560208601615818565b80840191505092915050565b600081546153be81615875565b6153c88186615684565b945060018216600081146153e357600181146153f457615427565b60ff19831686528186019350615427565b6153fd85615637565b60005b8381101561541f57815481890152600182019150602081019050615400565b838801955050505b50505092915050565b6154398161580e565b82525050565b600061544b82856153b1565b91506154578284615380565b91508190509392505050565b600060208201905061547860008301846152f0565b92915050565b600060808201905061549360008301876152f0565b6154a060208301866152f0565b6154ad6040830185615430565b81810360608301526154bf818461530e565b905095945050505050565b60006020820190506154df60008301846152ff565b92915050565b60006080820190506154fa60008301876152ff565b6155076020830186615430565b61551460408301856152f0565b6155216060830184615430565b95945050505050565b600060a08201905061553f60008301886152ff565b61554c6020830187615430565b61555960408301866152f0565b6155666060830185615430565b61557360808301846152f0565b9695505050505050565b600060208201905081810360008301526155978184615347565b905092915050565b60006020820190506155b46000830184615430565b92915050565b60006155c46155d5565b90506155d082826158a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156155fa576155f9615a0e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561562657615625615a0e565b5b602082029050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061569a8261580e565b91506156a58361580e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156da576156d9615952565b5b828201905092915050565b60006156f08261580e565b91506156fb8361580e565b92508261570b5761570a615981565b5b828204905092915050565b60006157218261580e565b915061572c8361580e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561576557615764615952565b5b828202905092915050565b600061577b8261580e565b91506157868361580e565b92508282101561579957615798615952565b5b828203905092915050565b60006157af826157ee565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561583657808201518184015260208101905061581b565b83811115615845576000848401525b50505050565b60006158568261580e565b9150600082141561586a57615869615952565b5b600182039050919050565b6000600282049050600182168061588d57607f821691505b602082108114156158a1576158a06159b0565b5b50919050565b6158b082615a56565b810181811067ffffffffffffffff821117156158cf576158ce615a0e565b5b80604052505050565b60006158e38261580e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561591657615915615952565b5b600182019050919050565b600061592c8261580e565b91506159378361580e565b92508261594757615946615981565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615a70816157a4565b8114615a7b57600080fd5b50565b615a87816157b6565b8114615a9257600080fd5b50565b615a9e816157c2565b8114615aa957600080fd5b50565b615ab58161580e565b8114615ac057600080fd5b5056fe64346335653336653030616238636566616530663363303461643134663731323039653735383937613964643161336535396130316135316265376466626630a2646970667358221220be539e2c3ccdf3b83c01ee223d1f01073960383b2543701df5fdfc0b4561789d64736f6c6343000806003368747470733a2f2f726f626f626f74732d66373966382e7765622e6170702f6d657461646174612f626f74
Deployed Bytecode
0x6080604052600436106101f95760003560e01c806370a082311161010d578063ae0b61ba116100a0578063d96a094a1161006f578063d96a094a14610725578063e985e9c514610741578063f2fde38b1461077e578063f3f43703146107a7578063f3fe3bc3146107e4576101f9565b8063ae0b61ba1461066d578063b88d4fde14610696578063c87b56dd146106bf578063c99fef70146106fc576101f9565b80638a72ea6a116100dc5780638a72ea6a146105ad5780638da5cb5b146105ee57806395d89b4114610619578063a22cb46514610644576101f9565b806370a08231146104f15780637fd6f15c1461052e578063860d248a146105595780638610f04514610584576101f9565b806318160ddd1161019057806340c10f191161015f57806340c10f19146103f757806342842e0e146104205780634423c5f11461044957806351605d80146104895780636352211e146104b4576101f9565b806318160ddd1461036357806323b872dd1461038e57806324600fc3146103b757806330176e13146103ce576101f9565b8063081812fc116101cc578063081812fc146102b8578063095ea7b3146102f55780630eaaf4c81461031e578063175b230414610347576101f9565b806301ffc9a7146101fe57806302e9d5e41461023b57806305b7cdd31461026457806306fdde031461028d575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190615189565b61080f565b60405161023291906154ca565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061525d565b610876565b005b34801561027057600080fd5b5061028b6004803603810190610286919061525d565b610db2565b005b34801561029957600080fd5b506102a26110a8565b6040516102af919061557d565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190615230565b61113a565b6040516102ec9190615463565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906150d1565b611255565b005b34801561032a57600080fd5b5061034560048036038101906103409190615230565b611638565b005b610361600480360381019061035c9190615230565b611940565b005b34801561036f57600080fd5b50610378611e24565b604051610385919061559f565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614fb6565b611e2a565b005b3480156103c357600080fd5b506103cc61227c565b005b3480156103da57600080fd5b506103f560048036038101906103f091906151e3565b61234f565b005b34801561040357600080fd5b5061041e600480360381019061041991906150d1565b61242e565b005b34801561042c57600080fd5b5061044760048036038101906104429190614fb6565b6124b9565b005b34801561045557600080fd5b50610470600480360381019061046b9190615230565b6124d9565b60405161048094939291906154e5565b60405180910390f35b34801561049557600080fd5b5061049e612536565b6040516104ab919061557d565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190615230565b612552565b6040516104e89190615463565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190614f49565b612638565b604051610525919061559f565b60405180910390f35b34801561053a57600080fd5b506105436126f2565b604051610550919061559f565b60405180910390f35b34801561056557600080fd5b5061056e6126f7565b60405161057b919061557d565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615230565b612730565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615230565b6128af565b6040516105e595949392919061552a565b60405180910390f35b3480156105fa57600080fd5b50610603612932565b6040516106109190615463565b60405180910390f35b34801561062557600080fd5b5061062e612958565b60405161063b919061557d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190615091565b6129ea565b005b34801561067957600080fd5b50610694600480360381019061068f9190615111565b612ae7565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190615009565b612caf565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190615230565b612d06565b6040516106f3919061557d565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e919061529d565b612e18565b005b61073f600480360381019061073a9190615230565b61310d565b005b34801561074d57600080fd5b5061076860048036038101906107639190614f76565b613811565b60405161077591906154ca565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190614f49565b6138a5565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190614f49565b613ad7565b6040516107db919061559f565b60405180910390f35b3480156107f057600080fd5b506107f9613aef565b604051610806919061557d565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061096f5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd919061557d565b60405180910390fd5b5060003390506000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001516040518060400160405280600681526020017f303034303035000000000000000000000000000000000000000000000000000081525090610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b06919061557d565b60405180910390fd5b5060008160600151116040518060400160405280600681526020017f303034303037000000000000000000000000000000000000000000000000000081525090610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86919061557d565b60405180910390fd5b5084816060015110156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c06919061557d565b60405180910390fd5b50610c1e816040015187613b28565b600081606001519050610c3087613b3f565b6000610c596064610c4b600185613d0f90919063ffffffff16565b613d2590919063ffffffff16565b905060008183610c699190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cdc919061568f565b9250508190555080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d32919061568f565b92505081905550836040015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168a7fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd7968760600151604051610d9f919061559f565b60405180910390a4505050505050505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610eab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600073ffffffffffffffffffffffffffffffffffffffff16847f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc18560405161109a919061559f565b60405180910390a350505050565b6060600580546110b790615875565b80601f01602080910402602001604051908101604052809291908181526020018280546110e390615875565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f919061557d565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061134e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579919061557d565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303430303400000000000000000000000000000000000000000000000000008152509061178f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611786919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030343030360000000000000000000000000000000000000000000000000000815250906118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d8919061557d565b60405180910390fd5b506000816060015190506118f483613b3f565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561193a573d6000803e3d6000fd5b50505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b3919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303034303034000000000000000000000000000000000000000000000000000081525090611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050806060015134116040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c90919061557d565b60405180910390fd5b50600081606001511115611d06578060600151600b6000836040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfe919061568f565b925050819055505b60405180608001604052806001151581526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301559050503373ffffffffffffffffffffffffffffffffffffffff16827f2db9bd3d5e680e2159753ffc16e1709fb0e786ca24553a511f64e3c6a7d4b70a34604051611e18919061559f565b60405180910390a35050565b61271081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611efb57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611f8c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b6919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f919061557d565b60405180910390fd5b506122738686613b28565b50505050505050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561234b573d6000803e3d6000fd5b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e919061557d565b60405180910390fd5b50818160079190612429929190614c55565b505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1919061557d565b60405180910390fd5b506124b58282613d3b565b5050565b6124d483838360405180602001604052806000815250613f29565b505050565b600a6020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905084565b604051806060016040528060408152602001615ac46040913981565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612629919061557d565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d8919061557d565b60405180910390fd5b506126eb826144f7565b9050919050565b600181565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806128295750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897919061557d565b60405180910390fd5b506128aa83614540565b505050565b60096020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461296790615875565b80601f016020809104026020016040519081016040528092919081815260200182805461299390615875565b80156129e05780601f106129b5576101008083540402835291602001916129e0565b820191906000526020600020905b8154815290600101906020018083116129c357829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612adb91906154ca565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba6919061557d565b60405180910390fd5b5060008251905060005b81811015612ca957612710838281518110612bd757612bd66159df565b5b6020026020010151106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4e919061557d565b60405180910390fd5b50612c96848281518110612c6e57612c6d6159df565b5b6020026020010151848381518110612c8957612c886159df565b5b6020026020010151613d3b565b8080612ca1906158d8565b915050612bb9565b50505050565b612cff85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613f29565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb919061557d565b60405180910390fd5b506007612df0846146cb565b604051602001612e0192919061543f565b604051602081830303815290604052915050919050565b8260006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612f115750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff168152506009600087815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508273ffffffffffffffffffffffffffffffffffffffff16857f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc1866040516130fe919061559f565b60405180910390a35050505050565b61271081106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613189576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613180919061557d565b60405180910390fd5b506000600960008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905080600001516040518060400160405280600681526020017f303034303031000000000000000000000000000000000000000000000000000081525090613303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fa919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16148061337257503373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600681526020017f3030343030320000000000000000000000000000000000000000000000000000815250906133e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e0919061557d565b60405180910390fd5b5080606001513410156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090613469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613460919061557d565b60405180910390fd5b506000816040015190506001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303430303700000000000000000000000000000000000000000000000000008152509061354c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613543919061557d565b60405180910390fd5b506135573384613b28565b60006135806064613572600134613d0f90919063ffffffff16565b613d2590919063ffffffff16565b9050600081346135909190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613603919061568f565b9250508190555080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613659919061568f565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16867fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd796346040516136be919061559f565b60405180910390a46000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161415613809578060600151600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137f8919061568f565b9250508190555061380886613b3f565b5b505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061396d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613964919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090613a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0d919061557d565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915090505481565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b613b328282614829565b613b3b81614540565b5050565b6000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050604051806080016040528060001515815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155905050806040015173ffffffffffffffffffffffffffffffffffffffff16827f4a096bfd874de7130bbce9d6635f0a77646b227b594b1b1b34d174e05be363dc8360600151604051613d03919061559f565b60405180910390a35050565b60008183613d1d9190615716565b905092915050565b60008183613d3391906156e5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dda919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb5919061557d565b60405180910390fd5b50613ec982826148de565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480613ffa57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061408b5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090614102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140f9919061557d565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906141df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d6919061557d565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906142be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b5919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090614367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435e919061557d565b60405180910390fd5b506143728787613b28565b6143918773ffffffffffffffffffffffffffffffffffffffff16614a66565b156144ed5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016143d7949392919061547e565b602060405180830381600087803b1580156143f157600080fd5b505af1158015614405573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061442991906151b6565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906144ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144e1919061557d565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6009600082815260200190815260200160002060000160009054906101000a900460ff16156146c8576040518060a00160405280600015158152602001828152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600083815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050807fe78251393d13c4f887458774ea505a80414b5608a0c963bb2e75da45811919f160405160405180910390a25b50565b60606000821415614713576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614824565b600082905060005b6000821461474557808061472e906158d8565b915050600a8261473e91906156e5565b915061471b565b60008167ffffffffffffffff81111561476157614760615a0e565b5b6040519080825280601f01601f1916602001820160405280156147935781602001600182028036833780820191505090505b5090505b6000851461481d57600a856147ac9190615921565b60306147b8919061568f565b60f81b81836147c69061584b565b935083815181106147da576147d96159df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561481691906156e5565b9450614797565b8093505050505b919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061486a82614ab1565b6148748183614aea565b61487e83836148de565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906149b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149af919061557d565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614a5b919061568f565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015614aa85750808214155b92505050919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090614bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614bba919061557d565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614c149190615770565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b828054614c6190615875565b90600052602060002090601f016020900481019282614c835760008555614cca565b82601f10614c9c57803560ff1916838001178555614cca565b82800160010185558215614cca579182015b82811115614cc9578235825591602001919060010190614cae565b5b509050614cd79190614cdb565b5090565b5b80821115614cf4576000816000905550600101614cdc565b5090565b6000614d0b614d06846155df565b6155ba565b90508083825260208201905082856020860282011115614d2e57614d2d615a47565b5b60005b85811015614d5e5781614d448882614dd8565b845260208401935060208301925050600181019050614d31565b5050509392505050565b6000614d7b614d768461560b565b6155ba565b90508083825260208201905082856020860282011115614d9e57614d9d615a47565b5b60005b85811015614dce5781614db48882614f34565b845260208401935060208301925050600181019050614da1565b5050509392505050565b600081359050614de781615a67565b92915050565b600082601f830112614e0257614e01615a42565b5b8135614e12848260208601614cf8565b91505092915050565b600082601f830112614e3057614e2f615a42565b5b8135614e40848260208601614d68565b91505092915050565b600081359050614e5881615a7e565b92915050565b600081359050614e6d81615a95565b92915050565b600081519050614e8281615a95565b92915050565b60008083601f840112614e9e57614e9d615a42565b5b8235905067ffffffffffffffff811115614ebb57614eba615a3d565b5b602083019150836001820283011115614ed757614ed6615a47565b5b9250929050565b60008083601f840112614ef457614ef3615a42565b5b8235905067ffffffffffffffff811115614f1157614f10615a3d565b5b602083019150836001820283011115614f2d57614f2c615a47565b5b9250929050565b600081359050614f4381615aac565b92915050565b600060208284031215614f5f57614f5e615a51565b5b6000614f6d84828501614dd8565b91505092915050565b60008060408385031215614f8d57614f8c615a51565b5b6000614f9b85828601614dd8565b9250506020614fac85828601614dd8565b9150509250929050565b600080600060608486031215614fcf57614fce615a51565b5b6000614fdd86828701614dd8565b9350506020614fee86828701614dd8565b9250506040614fff86828701614f34565b9150509250925092565b60008060008060006080868803121561502557615024615a51565b5b600061503388828901614dd8565b955050602061504488828901614dd8565b945050604061505588828901614f34565b935050606086013567ffffffffffffffff81111561507657615075615a4c565b5b61508288828901614e88565b92509250509295509295909350565b600080604083850312156150a8576150a7615a51565b5b60006150b685828601614dd8565b92505060206150c785828601614e49565b9150509250929050565b600080604083850312156150e8576150e7615a51565b5b60006150f685828601614dd8565b925050602061510785828601614f34565b9150509250929050565b6000806040838503121561512857615127615a51565b5b600083013567ffffffffffffffff81111561514657615145615a4c565b5b61515285828601614ded565b925050602083013567ffffffffffffffff81111561517357615172615a4c565b5b61517f85828601614e1b565b9150509250929050565b60006020828403121561519f5761519e615a51565b5b60006151ad84828501614e5e565b91505092915050565b6000602082840312156151cc576151cb615a51565b5b60006151da84828501614e73565b91505092915050565b600080602083850312156151fa576151f9615a51565b5b600083013567ffffffffffffffff81111561521857615217615a4c565b5b61522485828601614ede565b92509250509250929050565b60006020828403121561524657615245615a51565b5b600061525484828501614f34565b91505092915050565b6000806040838503121561527457615273615a51565b5b600061528285828601614f34565b925050602061529385828601614f34565b9150509250929050565b6000806000606084860312156152b6576152b5615a51565b5b60006152c486828701614f34565b93505060206152d586828701614f34565b92505060406152e686828701614dd8565b9150509250925092565b6152f9816157a4565b82525050565b615308816157b6565b82525050565b60006153198261564c565b6153238185615662565b9350615333818560208601615818565b61533c81615a56565b840191505092915050565b600061535282615657565b61535c8185615673565b935061536c818560208601615818565b61537581615a56565b840191505092915050565b600061538b82615657565b6153958185615684565b93506153a5818560208601615818565b80840191505092915050565b600081546153be81615875565b6153c88186615684565b945060018216600081146153e357600181146153f457615427565b60ff19831686528186019350615427565b6153fd85615637565b60005b8381101561541f57815481890152600182019150602081019050615400565b838801955050505b50505092915050565b6154398161580e565b82525050565b600061544b82856153b1565b91506154578284615380565b91508190509392505050565b600060208201905061547860008301846152f0565b92915050565b600060808201905061549360008301876152f0565b6154a060208301866152f0565b6154ad6040830185615430565b81810360608301526154bf818461530e565b905095945050505050565b60006020820190506154df60008301846152ff565b92915050565b60006080820190506154fa60008301876152ff565b6155076020830186615430565b61551460408301856152f0565b6155216060830184615430565b95945050505050565b600060a08201905061553f60008301886152ff565b61554c6020830187615430565b61555960408301866152f0565b6155666060830185615430565b61557360808301846152f0565b9695505050505050565b600060208201905081810360008301526155978184615347565b905092915050565b60006020820190506155b46000830184615430565b92915050565b60006155c46155d5565b90506155d082826158a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156155fa576155f9615a0e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561562657615625615a0e565b5b602082029050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061569a8261580e565b91506156a58361580e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156da576156d9615952565b5b828201905092915050565b60006156f08261580e565b91506156fb8361580e565b92508261570b5761570a615981565b5b828204905092915050565b60006157218261580e565b915061572c8361580e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561576557615764615952565b5b828202905092915050565b600061577b8261580e565b91506157868361580e565b92508282101561579957615798615952565b5b828203905092915050565b60006157af826157ee565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561583657808201518184015260208101905061581b565b83811115615845576000848401525b50505050565b60006158568261580e565b9150600082141561586a57615869615952565b5b600182039050919050565b6000600282049050600182168061588d57607f821691505b602082108114156158a1576158a06159b0565b5b50919050565b6158b082615a56565b810181811067ffffffffffffffff821117156158cf576158ce615a0e565b5b80604052505050565b60006158e38261580e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561591657615915615952565b5b600182019050919050565b600061592c8261580e565b91506159378361580e565b92508261594757615946615981565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615a70816157a4565b8114615a7b57600080fd5b50565b615a87816157b6565b8114615a9257600080fd5b50565b615a9e816157c2565b8114615aa957600080fd5b50565b615ab58161580e565b8114615ac057600080fd5b5056fe64346335653336653030616238636566616530663363303461643134663731323039653735383937613964643161336535396130316135316265376466626630a2646970667358221220be539e2c3ccdf3b83c01ee223d1f01073960383b2543701df5fdfc0b4561789d64736f6c63430008060033
Deployed Bytecode Sourcemap
35492:9405:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8932:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42679:818;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38726:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25531:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18443:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16228:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43615:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41767:648;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36035:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15454:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41377:271;;;;;;;;;;;;;:::i;:::-;;37519:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37806:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14699:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36679:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;35927:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17991:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17517:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36085:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27248:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39715:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36589:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;27368:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25785:136;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16991:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38226:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14079:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26111:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39275:291;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39947:1323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18895:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28193:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36781:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27192;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8932:172;9042:4;9065:19;:33;9085:12;9065:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9058:40;;8932:172;;;:::o;42679:818::-;42761:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42782:14:::1;42799:10;42782:27;;42820:14;42837:4;:14;42842:8;42837:14;;;;;;;;;;;42820:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;42870:3;:10;;;42882:11;;;;;;;;;;;;;;;;::::0;42862:32:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42925:1;42913:3;:9;;;:13;42928:22;;;;;;;;;;;;;;;;::::0;42905:46:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42983:18;42970:3;:9;;;:31;;43003:18;;;;;;;;;;;;;;;;::::0;42962:60:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43065:31;43075:3;:10;;;43087:8;43065:9;:31::i;:::-;43109:11;43123:3;:9;;;43109:23;;43143:20;43154:8;43143:10;:20::i;:::-;43239:11;43253:33;43282:3;43254:22;36122:1;43254:6;:10;;:22;;;;:::i;:::-;43253:28;;:33;;;;:::i;:::-;43239:47;;43297:16;43325:3;43316:6;:12;;;;:::i;:::-;43297:31;;43368:3;43339:18;:25;43358:5;;;;;;;;;;;43339:25;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;43412:8;43382:18;:26;43401:6;43382:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;43478:3;:10;;;43436:53;;43470:6;43436:53;;43449:8;43436:53;43459:3;:9;;;43436:53;;;;;;:::i;:::-;;;;;;;;42771:726;;;;;12188:189:::0;42679:818;;;:::o;38726:262::-;38808:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38848:65:::1;;;;;;;;38854:4;38848:65;;;;;;38860:8;38848:65;;;;38870:10;38848:65;;;;;;38882:18;38848:65;;;;38910:1;38848:65;;;;::::0;38829:6:::1;:16;38836:8;38829:16;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38977:1;38929:51;;38939:8;38929:51;38949:18;38929:51;;;;;;:::i;:::-;;;;;;;;12188:189:::0;38726:262;;;:::o;25531:128::-;25599:19;25644:7;25636:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25531:128;:::o;18443:183::-;18572:7;18548:8;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;;13003:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18598:12:::1;:22;18611:8;18598:22;;;;;;;;;;;;;;;;;;;;;18591:29;;18443:183:::0;;;;:::o;16228:352::-;16341:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16369:8:::1;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;::::0;13003:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16389:18:::2;16410:9;:19;16420:8;16410:19;;;;;;;;;;;;;;;;;;;;;16389:40;;16457:10;16444:23;;:9;:23;;;;16469:8;;;;;;;;;;;;;;;;::::0;16436:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16512:9;16487:12;:22;16500:8;16487:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;16565:8;16554:9;16533:41;;16542:10;16533:41;;;;;;;;;;;;16382:198;12370:1:::1;12188:189:::0;16228:352;;;:::o;43615:424::-;36073:5;43682:8;:22;43706:13;;;;;;;;;;;;;;;;;43674:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43762:10;43739:33;;:9;:19;43749:8;43739:19;;;;;;;;;;;;;;;;;;;;;:33;;;;43774:13;;;;;;;;;;;;;;;;;43731:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43799:14;43816:4;:14;43821:8;43816:14;;;;;;;;;;;43799:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43863:10;43849:24;;:3;:10;;;:24;;;43875:10;;;;;;;;;;;;;;;;;43841:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43897:11;43911:3;:9;;;43897:23;;43931:20;43942:8;43931:10;:20::i;:::-;44003:10;43995:28;;:36;44024:6;43995:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43663:376;;43615:424;:::o;41767:648::-;36073:5;41838:8;:22;41862:13;;;;;;;;;;;;;;;;;41830:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41926:1;41895:33;;:9;:19;41905:8;41895:19;;;;;;;;;;;;;;;;;;;;;:33;;;;41930:12;;;;;;;;;;;;;;;;;41887:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41985:10;41962:33;;:9;:19;41972:8;41962:19;;;;;;;;;;;;;;;;;;;;;:33;;;;41997:13;;;;;;;;;;;;;;;;;41954:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42022:22;42047:4;:14;42052:8;42047:14;;;;;;;;;;;42022:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42092:11;:17;;;42080:9;:29;42111:18;;;;;;;;;;;;;;;;;42072:58;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42165:1;42145:11;:17;;;:21;42141:141;;;42225:11;:17;;;42183:18;:38;42202:11;:18;;;42183:38;;;;;;;;;;;;;;;;:59;;;;;;;:::i;:::-;;;;;;;;42141:141;42309:42;;;;;;;;42313:4;42309:42;;;;;;42319:8;42309:42;;;;42329:10;42309:42;;;;;;42341:9;42309:42;;;42292:4;:14;42297:8;42292:14;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42396:10;42367:40;;42375:8;42367:40;42385:9;42367:40;;;;;;:::i;:::-;;;;;;;;41819:596;41767:648;:::o;36035:43::-;36073:5;36035:43;:::o;15454:353::-;15587:8;12575:18;12596:9;:19;12606:8;12596:19;;;;;;;;;;;;;;;;;;;;;12575:40;;12652:10;12638:24;;:10;:24;;;:71;;;;12699:10;12673:36;;:12;:22;12686:8;12673:22;;;;;;;;;;;;;;;;;;;;;:36;;;12638:71;:122;;;;12720:16;:28;12737:10;12720:28;;;;;;;;;;;;;;;:40;12749:10;12720:40;;;;;;;;;;;;;;;;;;;;;;;;;12638:122;12769:30;;;;;;;;;;;;;;;;;12622:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15615:8:::1;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;::::0;13003:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15635:18:::2;15656:9;:19;15666:8;15656:19;;;;;;;;;;;;;;;;;;;;;15635:40;;15704:5;15690:19;;:10;:19;;;15711:9;;;;;;;;;;;;;;;;::::0;15682:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15751:1;15736:17;;:3;:17;;;;15755:12;;;;;;;;;;;;;;;;::::0;15728:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15777:24;15787:3;15792:8;15777:9;:24::i;:::-;15628:179;12813:1:::1;12568:252:::0;15454:353;;;;:::o;41377:271::-;41422:11;41436:18;:30;41455:10;41436:30;;;;;;;;;;;;;;;;41422:44;;41592:1;41559:18;:30;41578:10;41559:30;;;;;;;;;;;;;;;:34;;;;41612:10;41604:28;;:36;41633:6;41604:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41411:237;41377:271::o;37519:107::-;27986:5;;;;;;;;;;;27972:19;;:10;:19;;;27993:17;;;;;;;;;;;;;;;;;27964:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37610:8:::1;;37600:7;:18;;;;;;;:::i;:::-;;37519:107:::0;;:::o;37806:205::-;36073:5;37879:8;:22;37903:13;;;;;;;;;;;;;;;;;37871:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37977:26;37989:3;37994:8;37977:11;:26::i;:::-;37806:205;;:::o;14699:179::-;14829:43;14847:5;14854:3;14859:8;14829:43;;;;;;;;;;;;:17;:43::i;:::-;14699:179;;;:::o;36679:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35927:101::-;;;;;;;;;;;;;;;;;;;:::o;17991:208::-;18088:14;18123:9;:19;18133:8;18123:19;;;;;;;;;;;;;;;;;;;;;18114:28;;18175:1;18157:20;;:6;:20;;;;18179:13;;;;;;;;;;;;;;;;;18149:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17991:208;;;:::o;17517:204::-;17614:7;17659:1;17641:20;;:6;:20;;;;17663:12;;;;;;;;;;;;;;;;;17633:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17690:25;17708:6;17690:17;:25::i;:::-;17683:32;;17517:204;;;:::o;36085:38::-;36122:1;36085:38;:::o;27248:65::-;;;;;;;;;;;;;;;;;;;:::o;39715:112::-;39776:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39797:22:::1;39810:8;39797:12;:22::i;:::-;12188:189:::0;39715:112;;:::o;36589:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27368:20::-;;;;;;;;;;;;;:::o;25785:136::-;25855:21;25904:9;25894:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25785:136;:::o;16991:232::-;17148:9;17106:16;:28;17123:10;17106:28;;;;;;;;;;;;;;;:39;17135:9;17106:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;17196:9;17169:48;;17184:10;17169:48;;;17207:9;17169:48;;;;;;:::i;:::-;;;;;;;;16991:232;;:::o;38226:288::-;27986:5;;;;;;;;;;;27972:19;;:10;:19;;;27993:17;;;;;;;;;;;;;;;;;27964:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38323:6:::1;38332:3;:10;38323:19;;38358:6;38353:154;38374:1;38370;:5;38353:154;;;36073:5;38405:9;38415:1;38405:12;;;;;;;;:::i;:::-;;;;;;;;:26;38433:13;;;;;;;;;;;;;;;;::::0;38397:50:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38462:33;38474:3;38478:1;38474:6;;;;;;;;:::i;:::-;;;;;;;;38482:9;38492:1;38482:12;;;;;;;;:::i;:::-;;;;;;;;38462:11;:33::i;:::-;38377:3;;;;;:::i;:::-;;;;38353:154;;;;38312:202;38226:288:::0;;:::o;14079:209::-;14236:46;14254:5;14261:3;14266:8;14276:5;;14236:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;14079:209;;;;;:::o;26111:231::-;26243:13;26219:8;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;;13003:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26305:7:::1;26314:18;26323:8;26314;:18::i;:::-;26288:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26274:60;;26111:231:::0;;;;:::o;39275:291::-;39386:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39426:65:::1;;;;;;;;39432:4;39426:65;;;;;;39438:8;39426:65;;;;39448:10;39426:65;;;;;;39460:18;39426:65;;;;39480:10;39426:65;;;;::::0;39407:6:::1;:16;39414:8;39407:16;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39547:10;39507:51;;39517:8;39507:51;39527:18;39507:51;;;;;;:::i;:::-;;;;;;;;12188:189:::0;39275:291;;;;:::o;39947:1323::-;36073:5;40070:8;:22;40094:13;;;;;;;;;;;;;;;;;40062:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40119:18;40140:6;:16;40147:8;40140:16;;;;;;;;;;;40119:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40175:5;:15;;;40192:12;;;;;;;;;;;;;;;;;40167:38;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40252:1;40224:30;;:5;:16;;;:30;;;:64;;;;40278:10;40258:30;;:5;:16;;;:30;;;40224:64;40290:19;;;;;;;;;;;;;;;;;40216:94;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40342:5;:14;;;40329:9;:27;;40358:18;;;;;;;;;;;;;;;;;40321:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40388:14;40405:5;:12;;;40388:29;;40446:9;:19;40456:8;40446:19;;;;;;;;;;;;;;;;;;;;;40436:29;;:6;:29;;;40467:22;;;;;;;;;;;;;;;;;40428:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40533:31;40543:10;40555:8;40533:9;:31::i;:::-;40642:11;40656:36;40688:3;40657:25;36122:1;40657:9;:13;;:25;;;;:::i;:::-;40656:31;;:36;;;;:::i;:::-;40642:50;;40703:16;40734:3;40722:9;:15;;;;:::i;:::-;40703:34;;40777:3;40748:18;:25;40767:5;;;;;;;;;;;40748:25;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;40821:8;40791:18;:26;40810:6;40791:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;40887:10;40845:53;;40879:6;40845:53;;40858:8;40845:53;40868:9;40845:53;;;;;;:::i;:::-;;;;;;;;41042:14;41059:4;:14;41064:8;41059:14;;;;;;;;;;;41042:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41102:10;41088:24;;:3;:10;;;:24;;;41084:179;;;41207:3;:9;;;41173:18;:30;41192:10;41173:30;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;41231:20;41242:8;41231:10;:20::i;:::-;41084:179;39995:1275;;;;;39947:1323;:::o;18895:192::-;19023:4;19046:16;:24;19063:6;19046:24;;;;;;;;;;;;;;;:35;19071:9;19046:35;;;;;;;;;;;;;;;;;;;;;;;;;19039:42;;18895:192;;;;:::o;28193:238::-;27986:5;;;;;;;;;;;27972:19;;:10;:19;;;27993:17;;;;;;;;;;;;;;;;;27964:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28315:1:::1;28294:23;;:9;:23;;;;28319:31;;;;;;;;;;;;;;;;::::0;28286:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28391:9;28363:38;;28384:5;;;;;;;;;;;28363:38;;;;;;;;;;;;28416:9;28408:5;;:17;;;;;;;;;;;;;;;;;;28193:238:::0;:::o;36781:51::-;;;;;;;;;;;;;;;;;:::o;27192:::-;;;;;;;;;;;;;;;;;;;:::o;44756:138::-;44831:30;44847:3;44852:8;44831:15;:30::i;:::-;44868:22;44881:8;44868:12;:22::i;:::-;44756:138;;:::o;44291:212::-;44349:14;44366:4;:14;44371:8;44366:14;;;;;;;;;;;44349:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44408:28;;;;;;;;44412:5;44408:28;;;;;;44419:1;44408:28;;;;44430:1;44408:28;;;;;;44434:1;44408:28;;;44391:4;:14;44396:8;44391:14;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44484:3;:10;;;44452:43;;44463:8;44452:43;44473:3;:9;;;44452:43;;;;;;:::i;:::-;;;;;;;;44338:165;44291:212;:::o;32052:98::-;32110:7;32141:1;32137;:5;;;;:::i;:::-;32130:12;;32052:98;;;;:::o;32451:::-;32509:7;32540:1;32536;:5;;;;:::i;:::-;32529:12;;32451:98;;;;:::o;19957:297::-;20078:1;20063:17;;:3;:17;;;;20082:12;;;;;;;;;;;;;;;;;20055:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20141:1;20110:33;;:9;:19;20120:8;20110:19;;;;;;;;;;;;;;;;;;;;;:33;;;20145:18;;;;;;;;;;;;;;;;;20102:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20173:26;20185:3;20190:8;20173:11;:26::i;:::-;20239:8;20234:3;20213:35;;20230:1;20213:35;;;;;;;;;;;;19957:297;;:::o;22694:590::-;22842:8;12575:18;12596:9;:19;12606:8;12596:19;;;;;;;;;;;;;;;;;;;;;12575:40;;12652:10;12638:24;;:10;:24;;;:71;;;;12699:10;12673:36;;:12;:22;12686:8;12673:22;;;;;;;;;;;;;;;;;;;;;:36;;;12638:71;:122;;;;12720:16;:28;12737:10;12720:28;;;;;;;;;;;;;;;:40;12749:10;12720:40;;;;;;;;;;;;;;;;;;;;;;;;;12638:122;12769:30;;;;;;;;;;;;;;;;;12622:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22870:8:::1;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;::::0;13003:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22890:18:::2;22911:9;:19;22921:8;22911:19;;;;;;;;;;;;;;;;;;;;;22890:40;;22959:5;22945:19;;:10;:19;;;22966:9;;;;;;;;;;;;;;;;::::0;22937:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23006:1;22991:17;;:3;:17;;;;23010:12;;;;;;;;;;;;;;;;::::0;22983:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23032:24;23042:3;23047:8;23032:9;:24::i;:::-;23069:16;:3;:14;;;:16::i;:::-;23065:214;;;23101:13;23137:3;23117:41;;;23159:10;23171:5;23178:8;23188:5;23117:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23101:93;;11413:10;23221:24;;23211:34;;;:6;:34;;;;23247:23;;;;;;;;;;;;;;;;::::0;23203:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23092:187;23065:214;22883:401;12813:1:::1;12568:252:::0;22694:590;;;;;:::o;22253:163::-;22357:7;22383:19;:27;22403:6;22383:27;;;;;;;;;;;;;;;;22376:34;;22253:163;;;:::o;44047:236::-;44111:6;:16;44118:8;44111:16;;;;;;;;;;;:26;;;;;;;;;;;;44107:169;;;44173:49;;;;;;;;44179:5;44173:49;;;;;;44186:8;44173:49;;;;44204:1;44173:49;;;;;;44208:1;44173:49;;;;44219:1;44173:49;;;;;44154:6;:16;44161:8;44154:16;;;;;;;;;;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44255:8;44242:22;;;;;;;;;;44107:169;44047:236;:::o;26350:390::-;26400:13;26432:1;26426:2;:7;26422:42;;;26446:10;;;;;;;;;;;;;;;;;;;;;26422:42;26470:6;26479:2;26470:11;;26488;26506:60;26518:1;26513;:6;26506:60;;26532:8;;;;;:::i;:::-;;;;26556:2;26551:7;;;;;:::i;:::-;;;26506:60;;;26572:16;26601:6;26591:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26572:36;;26615:97;26628:1;26622:2;:7;26615:97;;26681:2;26676;:7;;;;:::i;:::-;26671:2;:12;;;;:::i;:::-;26658:27;;26642:3;26646:8;;;;:::i;:::-;;;;26642:13;;;;;;;;:::i;:::-;;;;;:43;;;;;;;;;;;26702:2;26696:8;;;;;:::i;:::-;;;26615:97;;;26732:3;26718:18;;;;;26350:390;;;;:::o;19278:288::-;19380:12;19395:9;:19;19405:8;19395:19;;;;;;;;;;;;;;;;;;;;;19380:34;;19421:24;19436:8;19421:14;:24::i;:::-;19454:30;19469:4;19475:8;19454:14;:30::i;:::-;19491:26;19503:3;19508:8;19491:11;:26::i;:::-;19551:8;19546:3;19531:29;;19540:4;19531:29;;;;;;;;;;;;19373:193;19278:288;;:::o;21715:242::-;21858:1;21827:33;;:9;:19;21837:8;21827:19;;;;;;;;;;;;;;;;;;;;;:33;;;21862:18;;;;;;;;;;;;;;;;;21819:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21912:3;21890:9;:19;21900:8;21890:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;21950:1;21922:19;:24;21942:3;21922:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;21715:242;;:::o;9610:780::-;9693:17;10134:16;10157:19;10179:66;10157:88;;;;10287:5;10275:18;10263:30;;10353:3;10341:15;;:8;:15;;:42;;;;;10372:11;10360:8;:23;;10341:42;10325:59;;9715:675;;9610:780;;;:::o;23417:110::-;23499:12;:22;23512:8;23499:22;;;;;;;;;;;;23492:29;;;;;;;;;;;23417:110;:::o;21214:234::-;21354:5;21331:28;;:9;:19;21341:8;21331:19;;;;;;;;;;;;;;;;;;;;;:28;;;21361:9;;;;;;;;;;;;;;;;;21323:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21408:1;21378:19;:26;21398:5;21378:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;21423:9;:19;21433:8;21423:19;;;;;;;;;;;;21416:26;;;;;;;;;;;21214:234;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;404:79;;:::i;:::-;350:2;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;;;;;;:::o;769:722::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:2;;;1149:79;;:::i;:::-;1095:2;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;;;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1549:87;;;;:::o;1659:370::-;1730:5;1779:3;1772:4;1764:6;1760:17;1756:27;1746:2;;1787:79;;:::i;:::-;1746:2;1904:6;1891:20;1929:94;2019:3;2011:6;2004:4;1996:6;1992:17;1929:94;:::i;:::-;1920:103;;1736:293;;;;;:::o;2052:370::-;2123:5;2172:3;2165:4;2157:6;2153:17;2149:27;2139:2;;2180:79;;:::i;:::-;2139:2;2297:6;2284:20;2322:94;2412:3;2404:6;2397:4;2389:6;2385:17;2322:94;:::i;:::-;2313:103;;2129:293;;;;;:::o;2428:133::-;2471:5;2509:6;2496:20;2487:29;;2525:30;2549:5;2525:30;:::i;:::-;2477:84;;;;:::o;2567:137::-;2612:5;2650:6;2637:20;2628:29;;2666:32;2692:5;2666:32;:::i;:::-;2618:86;;;;:::o;2710:141::-;2766:5;2797:6;2791:13;2782:22;;2813:32;2839:5;2813:32;:::i;:::-;2772:79;;;;:::o;2870:552::-;2927:8;2937:6;2987:3;2980:4;2972:6;2968:17;2964:27;2954:2;;2995:79;;:::i;:::-;2954:2;3108:6;3095:20;3085:30;;3138:18;3130:6;3127:30;3124:2;;;3160:79;;:::i;:::-;3124:2;3274:4;3266:6;3262:17;3250:29;;3328:3;3320:4;3312:6;3308:17;3298:8;3294:32;3291:41;3288:2;;;3335:79;;:::i;:::-;3288:2;2944:478;;;;;:::o;3442:553::-;3500:8;3510:6;3560:3;3553:4;3545:6;3541:17;3537:27;3527:2;;3568:79;;:::i;:::-;3527:2;3681:6;3668:20;3658:30;;3711:18;3703:6;3700:30;3697:2;;;3733:79;;:::i;:::-;3697:2;3847:4;3839:6;3835:17;3823:29;;3901:3;3893:4;3885:6;3881:17;3871:8;3867:32;3864:41;3861:2;;;3908:79;;:::i;:::-;3861:2;3517:478;;;;;:::o;4001:139::-;4047:5;4085:6;4072:20;4063:29;;4101:33;4128:5;4101:33;:::i;:::-;4053:87;;;;:::o;4146:329::-;4205:6;4254:2;4242:9;4233:7;4229:23;4225:32;4222:2;;;4260:79;;:::i;:::-;4222:2;4380:1;4405:53;4450:7;4441:6;4430:9;4426:22;4405:53;:::i;:::-;4395:63;;4351:117;4212:263;;;;:::o;4481:474::-;4549:6;4557;4606:2;4594:9;4585:7;4581:23;4577:32;4574:2;;;4612:79;;:::i;:::-;4574:2;4732:1;4757:53;4802:7;4793:6;4782:9;4778:22;4757:53;:::i;:::-;4747:63;;4703:117;4859:2;4885:53;4930:7;4921:6;4910:9;4906:22;4885:53;:::i;:::-;4875:63;;4830:118;4564:391;;;;;:::o;4961:619::-;5038:6;5046;5054;5103:2;5091:9;5082:7;5078:23;5074:32;5071:2;;;5109:79;;:::i;:::-;5071:2;5229:1;5254:53;5299:7;5290:6;5279:9;5275:22;5254:53;:::i;:::-;5244:63;;5200:117;5356:2;5382:53;5427:7;5418:6;5407:9;5403:22;5382:53;:::i;:::-;5372:63;;5327:118;5484:2;5510:53;5555:7;5546:6;5535:9;5531:22;5510:53;:::i;:::-;5500:63;;5455:118;5061:519;;;;;:::o;5586:963::-;5683:6;5691;5699;5707;5715;5764:3;5752:9;5743:7;5739:23;5735:33;5732:2;;;5771:79;;:::i;:::-;5732:2;5891:1;5916:53;5961:7;5952:6;5941:9;5937:22;5916:53;:::i;:::-;5906:63;;5862:117;6018:2;6044:53;6089:7;6080:6;6069:9;6065:22;6044:53;:::i;:::-;6034:63;;5989:118;6146:2;6172:53;6217:7;6208:6;6197:9;6193:22;6172:53;:::i;:::-;6162:63;;6117:118;6302:2;6291:9;6287:18;6274:32;6333:18;6325:6;6322:30;6319:2;;;6355:79;;:::i;:::-;6319:2;6468:64;6524:7;6515:6;6504:9;6500:22;6468:64;:::i;:::-;6450:82;;;;6245:297;5722:827;;;;;;;;:::o;6555:468::-;6620:6;6628;6677:2;6665:9;6656:7;6652:23;6648:32;6645:2;;;6683:79;;:::i;:::-;6645:2;6803:1;6828:53;6873:7;6864:6;6853:9;6849:22;6828:53;:::i;:::-;6818:63;;6774:117;6930:2;6956:50;6998:7;6989:6;6978:9;6974:22;6956:50;:::i;:::-;6946:60;;6901:115;6635:388;;;;;:::o;7029:474::-;7097:6;7105;7154:2;7142:9;7133:7;7129:23;7125:32;7122:2;;;7160:79;;:::i;:::-;7122:2;7280:1;7305:53;7350:7;7341:6;7330:9;7326:22;7305:53;:::i;:::-;7295:63;;7251:117;7407:2;7433:53;7478:7;7469:6;7458:9;7454:22;7433:53;:::i;:::-;7423:63;;7378:118;7112:391;;;;;:::o;7509:894::-;7627:6;7635;7684:2;7672:9;7663:7;7659:23;7655:32;7652:2;;;7690:79;;:::i;:::-;7652:2;7838:1;7827:9;7823:17;7810:31;7868:18;7860:6;7857:30;7854:2;;;7890:79;;:::i;:::-;7854:2;7995:78;8065:7;8056:6;8045:9;8041:22;7995:78;:::i;:::-;7985:88;;7781:302;8150:2;8139:9;8135:18;8122:32;8181:18;8173:6;8170:30;8167:2;;;8203:79;;:::i;:::-;8167:2;8308:78;8378:7;8369:6;8358:9;8354:22;8308:78;:::i;:::-;8298:88;;8093:303;7642:761;;;;;:::o;8409:327::-;8467:6;8516:2;8504:9;8495:7;8491:23;8487:32;8484:2;;;8522:79;;:::i;:::-;8484:2;8642:1;8667:52;8711:7;8702:6;8691:9;8687:22;8667:52;:::i;:::-;8657:62;;8613:116;8474:262;;;;:::o;8742:349::-;8811:6;8860:2;8848:9;8839:7;8835:23;8831:32;8828:2;;;8866:79;;:::i;:::-;8828:2;8986:1;9011:63;9066:7;9057:6;9046:9;9042:22;9011:63;:::i;:::-;9001:73;;8957:127;8818:273;;;;:::o;9097:529::-;9168:6;9176;9225:2;9213:9;9204:7;9200:23;9196:32;9193:2;;;9231:79;;:::i;:::-;9193:2;9379:1;9368:9;9364:17;9351:31;9409:18;9401:6;9398:30;9395:2;;;9431:79;;:::i;:::-;9395:2;9544:65;9601:7;9592:6;9581:9;9577:22;9544:65;:::i;:::-;9526:83;;;;9322:297;9183:443;;;;;:::o;9632:329::-;9691:6;9740:2;9728:9;9719:7;9715:23;9711:32;9708:2;;;9746:79;;:::i;:::-;9708:2;9866:1;9891:53;9936:7;9927:6;9916:9;9912:22;9891:53;:::i;:::-;9881:63;;9837:117;9698:263;;;;:::o;9967:474::-;10035:6;10043;10092:2;10080:9;10071:7;10067:23;10063:32;10060:2;;;10098:79;;:::i;:::-;10060:2;10218:1;10243:53;10288:7;10279:6;10268:9;10264:22;10243:53;:::i;:::-;10233:63;;10189:117;10345:2;10371:53;10416:7;10407:6;10396:9;10392:22;10371:53;:::i;:::-;10361:63;;10316:118;10050:391;;;;;:::o;10447:619::-;10524:6;10532;10540;10589:2;10577:9;10568:7;10564:23;10560:32;10557:2;;;10595:79;;:::i;:::-;10557:2;10715:1;10740:53;10785:7;10776:6;10765:9;10761:22;10740:53;:::i;:::-;10730:63;;10686:117;10842:2;10868:53;10913:7;10904:6;10893:9;10889:22;10868:53;:::i;:::-;10858:63;;10813:118;10970:2;10996:53;11041:7;11032:6;11021:9;11017:22;10996:53;:::i;:::-;10986:63;;10941:118;10547:519;;;;;:::o;11072:118::-;11159:24;11177:5;11159:24;:::i;:::-;11154:3;11147:37;11137:53;;:::o;11196:109::-;11277:21;11292:5;11277:21;:::i;:::-;11272:3;11265:34;11255:50;;:::o;11311:360::-;11397:3;11425:38;11457:5;11425:38;:::i;:::-;11479:70;11542:6;11537:3;11479:70;:::i;:::-;11472:77;;11558:52;11603:6;11598:3;11591:4;11584:5;11580:16;11558:52;:::i;:::-;11635:29;11657:6;11635:29;:::i;:::-;11630:3;11626:39;11619:46;;11401:270;;;;;:::o;11677:364::-;11765:3;11793:39;11826:5;11793:39;:::i;:::-;11848:71;11912:6;11907:3;11848:71;:::i;:::-;11841:78;;11928:52;11973:6;11968:3;11961:4;11954:5;11950:16;11928:52;:::i;:::-;12005:29;12027:6;12005:29;:::i;:::-;12000:3;11996:39;11989:46;;11769:272;;;;;:::o;12047:377::-;12153:3;12181:39;12214:5;12181:39;:::i;:::-;12236:89;12318:6;12313:3;12236:89;:::i;:::-;12229:96;;12334:52;12379:6;12374:3;12367:4;12360:5;12356:16;12334:52;:::i;:::-;12411:6;12406:3;12402:16;12395:23;;12157:267;;;;;:::o;12454:845::-;12557:3;12594:5;12588:12;12623:36;12649:9;12623:36;:::i;:::-;12675:89;12757:6;12752:3;12675:89;:::i;:::-;12668:96;;12795:1;12784:9;12780:17;12811:1;12806:137;;;;12957:1;12952:341;;;;12773:520;;12806:137;12890:4;12886:9;12875;12871:25;12866:3;12859:38;12926:6;12921:3;12917:16;12910:23;;12806:137;;12952:341;13019:38;13051:5;13019:38;:::i;:::-;13079:1;13093:154;13107:6;13104:1;13101:13;13093:154;;;13181:7;13175:14;13171:1;13166:3;13162:11;13155:35;13231:1;13222:7;13218:15;13207:26;;13129:4;13126:1;13122:12;13117:17;;13093:154;;;13276:6;13271:3;13267:16;13260:23;;12959:334;;12773:520;;12561:738;;;;;;:::o;13305:118::-;13392:24;13410:5;13392:24;:::i;:::-;13387:3;13380:37;13370:53;;:::o;13429:429::-;13606:3;13628:92;13716:3;13707:6;13628:92;:::i;:::-;13621:99;;13737:95;13828:3;13819:6;13737:95;:::i;:::-;13730:102;;13849:3;13842:10;;13610:248;;;;;:::o;13864:222::-;13957:4;13995:2;13984:9;13980:18;13972:26;;14008:71;14076:1;14065:9;14061:17;14052:6;14008:71;:::i;:::-;13962:124;;;;:::o;14092:640::-;14287:4;14325:3;14314:9;14310:19;14302:27;;14339:71;14407:1;14396:9;14392:17;14383:6;14339:71;:::i;:::-;14420:72;14488:2;14477:9;14473:18;14464:6;14420:72;:::i;:::-;14502;14570:2;14559:9;14555:18;14546:6;14502:72;:::i;:::-;14621:9;14615:4;14611:20;14606:2;14595:9;14591:18;14584:48;14649:76;14720:4;14711:6;14649:76;:::i;:::-;14641:84;;14292:440;;;;;;;:::o;14738:210::-;14825:4;14863:2;14852:9;14848:18;14840:26;;14876:65;14938:1;14927:9;14923:17;14914:6;14876:65;:::i;:::-;14830:118;;;;:::o;14954:541::-;15125:4;15163:3;15152:9;15148:19;15140:27;;15177:65;15239:1;15228:9;15224:17;15215:6;15177:65;:::i;:::-;15252:72;15320:2;15309:9;15305:18;15296:6;15252:72;:::i;:::-;15334;15402:2;15391:9;15387:18;15378:6;15334:72;:::i;:::-;15416;15484:2;15473:9;15469:18;15460:6;15416:72;:::i;:::-;15130:365;;;;;;;:::o;15501:652::-;15700:4;15738:3;15727:9;15723:19;15715:27;;15752:65;15814:1;15803:9;15799:17;15790:6;15752:65;:::i;:::-;15827:72;15895:2;15884:9;15880:18;15871:6;15827:72;:::i;:::-;15909;15977:2;15966:9;15962:18;15953:6;15909:72;:::i;:::-;15991;16059:2;16048:9;16044:18;16035:6;15991:72;:::i;:::-;16073:73;16141:3;16130:9;16126:19;16117:6;16073:73;:::i;:::-;15705:448;;;;;;;;:::o;16159:313::-;16272:4;16310:2;16299:9;16295:18;16287:26;;16359:9;16353:4;16349:20;16345:1;16334:9;16330:17;16323:47;16387:78;16460:4;16451:6;16387:78;:::i;:::-;16379:86;;16277:195;;;;:::o;16478:222::-;16571:4;16609:2;16598:9;16594:18;16586:26;;16622:71;16690:1;16679:9;16675:17;16666:6;16622:71;:::i;:::-;16576:124;;;;:::o;16706:129::-;16740:6;16767:20;;:::i;:::-;16757:30;;16796:33;16824:4;16816:6;16796:33;:::i;:::-;16747:88;;;:::o;16841:75::-;16874:6;16907:2;16901:9;16891:19;;16881:35;:::o;16922:311::-;16999:4;17089:18;17081:6;17078:30;17075:2;;;17111:18;;:::i;:::-;17075:2;17161:4;17153:6;17149:17;17141:25;;17221:4;17215;17211:15;17203:23;;17004:229;;;:::o;17239:311::-;17316:4;17406:18;17398:6;17395:30;17392:2;;;17428:18;;:::i;:::-;17392:2;17478:4;17470:6;17466:17;17458:25;;17538:4;17532;17528:15;17520:23;;17321:229;;;:::o;17556:141::-;17605:4;17628:3;17620:11;;17651:3;17648:1;17641:14;17685:4;17682:1;17672:18;17664:26;;17610:87;;;:::o;17703:98::-;17754:6;17788:5;17782:12;17772:22;;17761:40;;;:::o;17807:99::-;17859:6;17893:5;17887:12;17877:22;;17866:40;;;:::o;17912:168::-;17995:11;18029:6;18024:3;18017:19;18069:4;18064:3;18060:14;18045:29;;18007:73;;;;:::o;18086:169::-;18170:11;18204:6;18199:3;18192:19;18244:4;18239:3;18235:14;18220:29;;18182:73;;;;:::o;18261:148::-;18363:11;18400:3;18385:18;;18375:34;;;;:::o;18415:305::-;18455:3;18474:20;18492:1;18474:20;:::i;:::-;18469:25;;18508:20;18526:1;18508:20;:::i;:::-;18503:25;;18662:1;18594:66;18590:74;18587:1;18584:81;18581:2;;;18668:18;;:::i;:::-;18581:2;18712:1;18709;18705:9;18698:16;;18459:261;;;;:::o;18726:185::-;18766:1;18783:20;18801:1;18783:20;:::i;:::-;18778:25;;18817:20;18835:1;18817:20;:::i;:::-;18812:25;;18856:1;18846:2;;18861:18;;:::i;:::-;18846:2;18903:1;18900;18896:9;18891:14;;18768:143;;;;:::o;18917:348::-;18957:7;18980:20;18998:1;18980:20;:::i;:::-;18975:25;;19014:20;19032:1;19014:20;:::i;:::-;19009:25;;19202:1;19134:66;19130:74;19127:1;19124:81;19119:1;19112:9;19105:17;19101:105;19098:2;;;19209:18;;:::i;:::-;19098:2;19257:1;19254;19250:9;19239:20;;18965:300;;;;:::o;19271:191::-;19311:4;19331:20;19349:1;19331:20;:::i;:::-;19326:25;;19365:20;19383:1;19365:20;:::i;:::-;19360:25;;19404:1;19401;19398:8;19395:2;;;19409:18;;:::i;:::-;19395:2;19454:1;19451;19447:9;19439:17;;19316:146;;;;:::o;19468:96::-;19505:7;19534:24;19552:5;19534:24;:::i;:::-;19523:35;;19513:51;;;:::o;19570:90::-;19604:7;19647:5;19640:13;19633:21;19622:32;;19612:48;;;:::o;19666:149::-;19702:7;19742:66;19735:5;19731:78;19720:89;;19710:105;;;:::o;19821:126::-;19858:7;19898:42;19891:5;19887:54;19876:65;;19866:81;;;:::o;19953:77::-;19990:7;20019:5;20008:16;;19998:32;;;:::o;20036:307::-;20104:1;20114:113;20128:6;20125:1;20122:13;20114:113;;;20213:1;20208:3;20204:11;20198:18;20194:1;20189:3;20185:11;20178:39;20150:2;20147:1;20143:10;20138:15;;20114:113;;;20245:6;20242:1;20239:13;20236:2;;;20325:1;20316:6;20311:3;20307:16;20300:27;20236:2;20085:258;;;;:::o;20349:171::-;20388:3;20411:24;20429:5;20411:24;:::i;:::-;20402:33;;20457:4;20450:5;20447:15;20444:2;;;20465:18;;:::i;:::-;20444:2;20512:1;20505:5;20501:13;20494:20;;20392:128;;;:::o;20526:320::-;20570:6;20607:1;20601:4;20597:12;20587:22;;20654:1;20648:4;20644:12;20675:18;20665:2;;20731:4;20723:6;20719:17;20709:27;;20665:2;20793;20785:6;20782:14;20762:18;20759:38;20756:2;;;20812:18;;:::i;:::-;20756:2;20577:269;;;;:::o;20852:281::-;20935:27;20957:4;20935:27;:::i;:::-;20927:6;20923:40;21065:6;21053:10;21050:22;21029:18;21017:10;21014:34;21011:62;21008:2;;;21076:18;;:::i;:::-;21008:2;21116:10;21112:2;21105:22;20895:238;;;:::o;21139:233::-;21178:3;21201:24;21219:5;21201:24;:::i;:::-;21192:33;;21247:66;21240:5;21237:77;21234:2;;;21317:18;;:::i;:::-;21234:2;21364:1;21357:5;21353:13;21346:20;;21182:190;;;:::o;21378:176::-;21410:1;21427:20;21445:1;21427:20;:::i;:::-;21422:25;;21461:20;21479:1;21461:20;:::i;:::-;21456:25;;21500:1;21490:2;;21505:18;;:::i;:::-;21490:2;21546:1;21543;21539:9;21534:14;;21412:142;;;;:::o;21560:180::-;21608:77;21605:1;21598:88;21705:4;21702:1;21695:15;21729:4;21726:1;21719:15;21746:180;21794:77;21791:1;21784:88;21891:4;21888:1;21881:15;21915:4;21912:1;21905:15;21932:180;21980:77;21977:1;21970:88;22077:4;22074:1;22067:15;22101:4;22098:1;22091:15;22118:180;22166:77;22163:1;22156:88;22263:4;22260:1;22253:15;22287:4;22284:1;22277:15;22304:180;22352:77;22349:1;22342:88;22449:4;22446:1;22439:15;22473:4;22470:1;22463:15;22490:117;22599:1;22596;22589:12;22613:117;22722:1;22719;22712:12;22736:117;22845:1;22842;22835:12;22859:117;22968:1;22965;22958:12;22982:117;23091:1;23088;23081:12;23105:102;23146:6;23197:2;23193:7;23188:2;23181:5;23177:14;23173:28;23163:38;;23153:54;;;:::o;23213:122::-;23286:24;23304:5;23286:24;:::i;:::-;23279:5;23276:35;23266:2;;23325:1;23322;23315:12;23266:2;23256:79;:::o;23341:116::-;23411:21;23426:5;23411:21;:::i;:::-;23404:5;23401:32;23391:2;;23447:1;23444;23437:12;23391:2;23381:76;:::o;23463:120::-;23535:23;23552:5;23535:23;:::i;:::-;23528:5;23525:34;23515:2;;23573:1;23570;23563:12;23515:2;23505:78;:::o;23589:122::-;23662:24;23680:5;23662:24;:::i;:::-;23655:5;23652:35;23642:2;;23701:1;23698;23691:12;23642:2;23632:79;:::o
Swarm Source
ipfs://be539e2c3ccdf3b83c01ee223d1f01073960383b2543701df5fdfc0b4561789d
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.