Overview
ETH Balance
0.000000000000001296 ETH
Eth Value
Less Than $0.01 (@ $1,615.66/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 610 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Active | 14727611 | 1080 days ago | IN | 0 ETH | 0.00124528 | ||||
Mint With Awoo | 14726456 | 1080 days ago | IN | 0 ETH | 0.01179449 | ||||
Purchase And App... | 14726417 | 1080 days ago | IN | 0 ETH | 0.01862661 | ||||
Mint With Eth | 14723367 | 1081 days ago | IN | 0 ETH | 0.00709073 | ||||
Set Item Active | 14723348 | 1081 days ago | IN | 0 ETH | 0.0021679 | ||||
Purchase And App... | 14721946 | 1081 days ago | IN | 0 ETH | 0.01708721 | ||||
Add Item | 14720888 | 1081 days ago | IN | 0 ETH | 0.01674662 | ||||
Purchase And App... | 14720748 | 1081 days ago | IN | 0 ETH | 0.01813025 | ||||
Purchase And App... | 14715580 | 1082 days ago | IN | 0 ETH | 0.05496396 | ||||
Purchase And App... | 14713192 | 1082 days ago | IN | 0 ETH | 0.01863006 | ||||
Purchase And App... | 14712533 | 1082 days ago | IN | 0 ETH | 0.01483096 | ||||
Purchase And App... | 14711460 | 1083 days ago | IN | 0 ETH | 0.02096225 | ||||
Purchase And App... | 14710755 | 1083 days ago | IN | 0 ETH | 0.01514401 | ||||
Mint With Awoo | 14708883 | 1083 days ago | IN | 0 ETH | 0.01259246 | ||||
Purchase And App... | 14703356 | 1084 days ago | IN | 0 ETH | 0.0485195 | ||||
Purchase And App... | 14701589 | 1084 days ago | IN | 0 ETH | 0.09913412 | ||||
Mint With Awoo | 14700772 | 1084 days ago | IN | 0 ETH | 0.03989539 | ||||
Purchase And App... | 14697739 | 1085 days ago | IN | 0 ETH | 0.02505035 | ||||
Purchase And App... | 14695544 | 1085 days ago | IN | 0 ETH | 0.01855099 | ||||
Mint With Awoo | 14694956 | 1085 days ago | IN | 0 ETH | 0.03084267 | ||||
Apply Minted Ite... | 14693326 | 1085 days ago | IN | 0 ETH | 0.015355 | ||||
Mint With Awoo | 14692509 | 1086 days ago | IN | 0 ETH | 0.01493187 | ||||
Purchase And App... | 14685285 | 1087 days ago | IN | 0 ETH | 0.0151539 | ||||
Mint With Awoo | 14683868 | 1087 days ago | IN | 0 ETH | 0.01228589 | ||||
Purchase And App... | 14679984 | 1088 days ago | IN | 0 ETH | 0.01456329 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AwooStore
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-30 */ // File: contracts/AwooModels.sol pragma solidity 0.8.12; struct AccrualDetails{ address ContractAddress; uint256[] TokenIds; uint256[] Accruals; uint256 TotalAccrued; } struct ClaimDetails{ address ContractAddress; uint32[] TokenIds; } struct SupportedContractDetails{ address ContractAddress; uint256 BaseRate; bool Active; } // File: contracts/IAwooClaimingV2.sol pragma solidity 0.8.12; interface IAwooClaimingV2{ function overrideTokenAccrualBaseRate(address contractAddress, uint32 tokenId, uint256 newBaseRate) external; function claim(address holder, ClaimDetails[] calldata requestedClaims) external; } // File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/IAwooToken.sol pragma solidity 0.8.12; interface IAwooToken is IERC20 { function increaseVirtualBalance(address account, uint256 amount) external; function mint(address account, uint256 amount) external; function balanceOfVirtual(address account) external view returns(uint256); function spendVirtualAwoo(bytes32 hash, bytes memory sig, string calldata nonce, address account, uint256 amount) external; } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/OwnerAdminGuard.sol pragma solidity 0.8.12; contract OwnerAdminGuard is Ownable { address[2] private _admins; bool private _adminsSet; /// @notice Allows the owner to specify two addresses allowed to administer this contract /// @param admins A 2 item array of addresses function setAdmins(address[2] calldata admins) public { require(admins[0] != address(0) && admins[1] != address(0), "Invalid admin address"); _admins = admins; _adminsSet = true; } function _isOwnerOrAdmin(address addr) internal virtual view returns(bool){ return addr == owner() || ( _adminsSet && ( addr == _admins[0] || addr == _admins[1] ) ); } modifier onlyOwnerOrAdmin() { require(_isOwnerOrAdmin(msg.sender), "Not an owner or admin"); _; } } // File: contracts/AuthorizedCallerGuard.sol pragma solidity 0.8.12; contract AuthorizedCallerGuard is OwnerAdminGuard { /// @dev Keeps track of which contracts are explicitly allowed to interact with certain super contract functionality mapping(address => bool) public authorizedContracts; event AuthorizedContractAdded(address contractAddress, address addedBy); event AuthorizedContractRemoved(address contractAddress, address removedBy); /// @notice Allows the owner or an admin to authorize another contract to override token accruals on an individual token level /// @param contractAddress The authorized contract address function addAuthorizedContract(address contractAddress) public onlyOwnerOrAdmin { require(_isContract(contractAddress), "Invalid contractAddress"); authorizedContracts[contractAddress] = true; emit AuthorizedContractAdded(contractAddress, _msgSender()); } /// @notice Allows the owner or an admin to remove an authorized contract /// @param contractAddress The contract address which should have its authorization revoked function removeAuthorizedContract(address contractAddress) public onlyOwnerOrAdmin { authorizedContracts[contractAddress] = false; emit AuthorizedContractRemoved(contractAddress, _msgSender()); } /// @dev Derived from @openzeppelin/contracts/utils/Address.sol function _isContract(address account) internal virtual view returns (bool) { if(account == address(0)) return false; // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } function _isAuthorizedContract(address addr) internal virtual view returns(bool){ return authorizedContracts[addr]; } modifier onlyAuthorizedCaller() { require(_isOwnerOrAdmin(_msgSender()) || _isAuthorizedContract(_msgSender()), "Sender is not authorized"); _; } modifier onlyAuthorizedContract() { require(_isAuthorizedContract(_msgSender()), "Sender is not authorized"); _; } } // File: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: contracts/IAwooMintableCollection.sol pragma solidity 0.8.12; interface IAwooMintableCollection is IERC1155 { struct TokenDetail { bool SoftLimit; bool Active; } struct TokenCount { uint256 TokenId; uint256 Count; } function supportsInterface(bytes4 interfaceId) external view returns (bool); function mint(address to, uint256 id, uint256 qty) external; function mintBatch(address to, uint256[] memory ids, uint256[] memory quantities) external; function burn(address from, uint256 id, uint256 qty) external; function tokensOfOwner(address owner) external view returns (TokenCount[] memory); function totalMinted(uint256 id) external view returns(uint256); function totalSupply(uint256 id) external view returns (uint256); function exists(uint256 id) external view returns (bool); function addToken(TokenDetail calldata tokenDetail, string memory tokenUri) external returns(uint256); function setTokenUri(uint256 id, string memory tokenUri) external; function setTokenActive(uint256 id, bool active) external; function setBaseUri(string memory baseUri) external; } // File: @openzeppelin/[email protected]/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/[email protected]/token/ERC1155/extensions/ERC1155Supply.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } } } // File: contracts/AwooCollection.sol pragma solidity 0.8.12; contract AwooCollection is IAwooMintableCollection, ERC1155Supply, AuthorizedCallerGuard { using Strings for uint256; string public constant name = "Awoo Items"; string public constant symbol = "AWOOI"; uint16 public currentTokenId; bool public isActive; /// @notice Maps the tokenId of a specific mintable item to the details that define that item mapping(uint256 => TokenDetail) public tokenDetails; /// @notice Keeps track of the number of tokens that were burned to support "Soft" limits /// @dev Soft limits are the number of tokens available at any given time, so if 1 is burned, another can be minted mapping(uint256 => uint256) public tokenBurnCounts; /// @dev Allows us to have token-specific metadata uris that will override the baseUri mapping(uint256 => string) private _tokenUris; event TokenUriUpdated(uint256 indexed id, string newUri, address updatedBy); constructor(address awooStoreAddress, string memory baseUri) ERC1155(baseUri){ // Allow the Awoo Store contract to interact with this contract to faciliate minting and burning addAuthorizedContract(awooStoreAddress); } /// @dev See {IERC165-supportsInterface}. function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, IAwooMintableCollection) returns (bool) { return super.supportsInterface(interfaceId) || interfaceId == type(IAwooMintableCollection).interfaceId || interfaceId == type(IERC1155).interfaceId || interfaceId == ERC1155Supply.totalSupply.selector || interfaceId == ERC1155Supply.exists.selector; } /// @notice Allows authorized contracts to mints tokens to the specified recipient /// @param to The recipient address /// @param id The Id of the specific token to mint /// @param qty The number of specified tokens that should be minted function mint(address to, uint256 id, uint256 qty ) external whenActive onlyAuthorizedContract { _mint(to, id, qty, ""); } /// @notice Allows authorized contracts to mint multiple different tokens to the specified recipient /// @param to The recipient address /// @param ids The Ids of the specific tokens to mint /// @param quantities The number of each of the specified tokens that should be minted function mintBatch(address to, uint256[] memory ids, uint256[] memory quantities ) external whenActive onlyAuthorizedContract { _mintBatch(to, ids, quantities, ""); } /// @notice Burns the specified number of tokens. /// @notice Only the holder or an approved operator is authorized to burn /// @notice Operator approvals must have been explicitly allowed by the token holder /// @param from The account from which the specified tokens will be burned /// @param id The Id of the tokens that will be burned /// @param qty The number of specified tokens that will be burned function burn(address from, uint256 id, uint256 qty) external { require(exists(id), "Query for non-existent id"); require(from == _msgSender() || isApprovedForAll(from, _msgSender()), "Not owner or approved"); _burn(from, id, qty); } /// @notice Burns the specified number of each of the specified tokens. /// @notice Only the holder or an approved operator is authorized to burn /// @notice Operator approvals must have been explicitly allowed by the token holder /// @param from The account from which the specified tokens will be burned /// @param ids The Ids of the tokens that will be burned /// @param quantities The number of each of the specified tokens that will be burned function burnBatch(address from, uint256[] memory ids, uint256[] memory quantities) external { require(from == _msgSender() || isApprovedForAll(from, _msgSender()), "Not owner or approved"); for(uint256 i; i < ids.length; i++){ require(exists(ids[i]), "Query for non-existent id"); } _burnBatch(from, ids, quantities); } /// @notice Returns the metadata uri for the specified token /// @dev By default, token-specific uris are given preference /// @param id The id of the token for which the uri should be returned /// @return A uri string function uri(uint256 id) public view override returns (string memory) { require(exists(id), "Query for non-existent id"); return bytes(_tokenUris[id]).length > 0 ? _tokenUris[id] : string.concat(ERC1155.uri(id), id.toString(), ".json"); } /// @notice Returns the number of each token held by the specified owner address /// @param owner The address of the token owner/holder /// @return An array of Tuple(uint256,uint256) indicating the number of tokens held function tokensOfOwner(address owner) external view returns (TokenCount[] memory) { TokenCount[] memory ownerTokenCounts = new TokenCount[](currentTokenId); for(uint256 i = 1; i <= currentTokenId; i++){ uint256 count = balanceOf(owner, i); ownerTokenCounts[i-1] = TokenCount(i, count); } return ownerTokenCounts; } /// @notice Returns the total number of tokens minted for the specified token id /// @dev For tokens that have a soft limit, the number of burned tokens is included /// so the result is based on the total number of tokens minted, regardless of whether /// or not they were subsequently burned /// @param id The id of the token to query /// @return A uint256 value indicating the total number of tokens minted and burned for the specified token id function totalMinted(uint256 id) isValidTokenId(id) external view returns(uint256) { TokenDetail memory tokenDetail = tokenDetails[id]; if(tokenDetail.SoftLimit){ return ERC1155Supply.totalSupply(id); } else { return (ERC1155Supply.totalSupply(id) + tokenBurnCounts[id]); } } /// @notice Returns the current number of tokens that were minted and not burned /// @param id The id of the token to query /// @return A uint256 value indicating the number of tokens which have not been burned function totalSupply(uint256 id) public view virtual override(ERC1155Supply,IAwooMintableCollection) returns (uint256) { return ERC1155Supply.totalSupply(id); } /// @notice Determines whether or not the specified token id is valid and at least 1 has been minted /// @param id The id of the token to validate /// @return A boolean value indicating the existence of the specified token id function exists(uint256 id) public view virtual override(ERC1155Supply,IAwooMintableCollection) returns (bool) { return ERC1155Supply.exists(id); } /// @notice Allows authorized individuals or contracts to add new tokens that can be minted /// @param tokenDetail An object describing the token being added /// @param tokenUri The specific uri to use for the token being added /// @return A uint256 value representing the id of the token function addToken(TokenDetail calldata tokenDetail, string memory tokenUri) external isAuthorized returns(uint256){ currentTokenId++; if(bytes(tokenUri).length > 0) { _tokenUris[currentTokenId] = tokenUri; } tokenDetails[currentTokenId] = tokenDetail; return currentTokenId; } /// @notice Allows authorized individuals or contracts to set the base metadata uri /// @dev It is assumed that the baseUri value will end with / /// @param baseUri The uri to use as the base for all tokens that don't have a token-specific uri function setBaseUri(string memory baseUri) external isAuthorized { _setURI(baseUri); } /// @notice Allows authorized individuals or contracts to set the base metadata uri on a per token level /// @param id The id of the token /// @param tokenUri The uri to use for the specified token id function setTokenUri(uint256 id, string memory tokenUri) external isAuthorized isValidTokenId(id) { _tokenUris[id] = tokenUri; emit TokenUriUpdated(id, tokenUri, _msgSender()); } /// @notice Allows authorized individuals or contracts to activate/deactivate minting of the specified token id /// @param id The id of the token /// @param active A boolean value indicating whether or not minting is allowed for this token function setTokenActive(uint256 id, bool active) external isAuthorized isValidTokenId(id) { tokenDetails[id].Active = active; } /// @notice Allows authorized individuals to activate/deactivate minting of all tokens /// @param active A boolean value indicating whether or not minting is allowed function setActive(bool active) external onlyOwnerOrAdmin { isActive = active; } function rescueEth() external onlyOwner { require(payable(owner()).send(address(this).balance)); } /// @dev Hook to allows us to count the burned tokens even if they're just transferred to the zero address function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { tokenBurnCounts[ids[i]] += amounts[i]; } } } modifier whenActive(){ require(isActive, "Minting inactive"); _; } modifier isValidTokenId(uint256 id) { require(id <= currentTokenId, "Invalid tokenId"); _; } modifier isValidTokenIds(uint256[] memory ids){ for(uint256 i = 0; i < ids.length; i++){ require(ids[i] <= currentTokenId, "Invalid tokenId"); } _; } modifier isAuthorized() { require(_isAuthorizedContract(_msgSender()) || _isOwnerOrAdmin(_msgSender()), "Unauthorized"); _; } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/AwooStore.sol pragma solidity 0.8.12; contract AwooStore is OwnerAdminGuard { struct AwooSpendApproval { bytes32 Hash; bytes Sig; string Nonce; } enum PaymentType { AWOO, ETHER, AWOO_AND_ETHER, FREE } struct UpgradeDetail { uint8 ApplicableCollectionId; uint256 UpgradeBaseAccrualRate; bool UpgradeItem; bool Stackable; } struct ItemDetail { IAwooMintableCollection.TokenDetail TokenDetails; UpgradeDetail UpgradeDetails; string MetadataUri; uint256 TokenId; PaymentType PmtType; uint256 EtherPrice; uint256 AWOOPrice; uint256 TotalAvailable; bool Burnable; bool NonMintable; bool Active; uint256 PerAddressLimit; uint256 PerTransactionLimit; } address payable public withdrawAddress; IAwooToken public awooContract; IAwooClaimingV2 public awooClaimingContract; IAwooMintableCollection public awooMintableCollectionContract; bool public storeActive; /// @dev Helps us track the supported ERC721Enumerable contracts so we can refer to them by their "id" to save a bit of gas uint8 public collectionCount; /// @dev Helps us track the available items so we can refer to them by their "id" to save a bit of gas uint16 public itemCount; /// @notice Maps the supported ERC721Enumerable contracts to their Ids mapping(uint8 => address) public collectionIdAddressMap; /// @notice Maps the available items to their Ids mapping(uint16 => ItemDetail) public itemIdDetailMap; /// @notice Maps the number of purchased items when those items cannot be minted mapping(uint16 => uint256) public nonMintedItemPurchaseCounts; /// @notice Maps item ownership counts // owner => (itemId, count). This is only relevant for items that weren't minted mapping(address => mapping(uint16 => uint256)) public ownedItemCountsByOwner; /// @notice Keeps track of how many of each token has been minted by a particular address // owner => (itemId, count) mapping(address => mapping(uint16 => uint256)) public mintedItemCountsByAddress; /// @notice Keeps track of "upgrade" item applications mapping(uint16 => mapping(uint8 => uint256[])) public itemApplications; /// @notice Keeps track of "upgrade" items by the collection that they were applied to // collectionId => (tokenId, (itemId => count)) mapping(uint8 => mapping(uint32 => mapping(uint16 => uint256))) public tokenAppliedItemCountsByCollection; /// @notice A method that tells us that an "upgrade" item was applied so we can do some cool stuff event UpgradeItemApplied(uint16 itemId, address applicationCollectionAddress, uint256 appliedToTokenId); // ;) event NonMintedItemUsed(uint16 itemId, address usedBy, uint256 qty); constructor(address payable withdrawAddr, IAwooToken awooTokenContract, IAwooClaimingV2 claimingContract){ require(withdrawAddr != address(0), "Withdraw address cannot be the zero address"); withdrawAddress = withdrawAddr; awooContract = awooTokenContract; awooClaimingContract = claimingContract; } /// @notice Allows the specified item to be minted with AWOO /// @param itemId The id of the item to mint /// @param qty The number of items to mint /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC function mintWithAwoo(uint16 itemId, uint256 qty, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims ) public whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = validateItem(itemId); require(!item.NonMintable, "Specified item is not mintable"); require(item.PmtType == PaymentType.AWOO, "Specified item cannot be purchased with AWOO"); validateRequestedQuantity(itemId, item, qty); ensureAvailablity(item, itemId, qty); claimAwoo(requestedClaims); awooContract.spendVirtualAwoo(approval.Hash, approval.Sig, approval.Nonce, _msgSender(), qty * item.AWOOPrice); awooMintableCollectionContract.mint(_msgSender(), item.TokenId, qty); mintedItemCountsByAddress[_msgSender()][itemId] += qty; } /// @notice Allows the specified item to be minted with Ether /// @param itemId The id of the item to mint /// @param qty The number of items to mint function mintWithEth(uint16 itemId, uint256 qty) public payable whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = validateItem(itemId); require(!item.NonMintable, "Specified item is not mintable"); require(item.PmtType == PaymentType.ETHER, "Specified item cannot be purchased with Ether"); validateRequestedQuantity(itemId, item, qty); ensureAvailablity(item, itemId, qty); validateEtherValue(item, qty); awooMintableCollectionContract.mint(_msgSender(), item.TokenId, qty); mintedItemCountsByAddress[_msgSender()][itemId] += qty; } /// @notice Allows the specified item to be minted with both AWOO and Ether, if the item supports that /// @param itemId The id of the item to mint /// @param qty The number of items to mint /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC function mintWithEthAndAwoo(uint16 itemId, uint256 qty, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims ) public payable whenStoreActive nonZeroQuantity(qty){ ItemDetail memory item = validateItem(itemId); require(!item.NonMintable, "Specified item is not mintable"); require(item.PmtType == PaymentType.AWOO_AND_ETHER, "Specified item cannot be purchased with AWOO and Ether"); validateRequestedQuantity(itemId, item, qty); ensureAvailablity(item, itemId, qty); validateEtherValue(item, qty); claimAwoo(requestedClaims); awooContract.spendVirtualAwoo(approval.Hash, approval.Sig, approval.Nonce, _msgSender(), qty * item.AWOOPrice); awooMintableCollectionContract.mint(_msgSender(), item.TokenId, qty); mintedItemCountsByAddress[_msgSender()][itemId] += qty; } /// @notice Allows the specified item to be purchased with AWOO /// @param itemId The id of the item to purchase /// @param qty The number of items to purchase /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC function purchaseWithAwoo(uint16 itemId, uint256 qty, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims ) public whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = validateItem(itemId); require(item.PmtType == PaymentType.AWOO, "Specified item cannot be purchased with AWOO"); validateRequestedQuantity(itemId, item, qty); ensureAvailablity(item, itemId, qty); claimAwoo(requestedClaims); awooContract.spendVirtualAwoo(approval.Hash, approval.Sig, approval.Nonce, _msgSender(), qty * item.AWOOPrice); nonMintedItemPurchaseCounts[itemId] += qty; ownedItemCountsByOwner[_msgSender()][itemId] += qty; } /// @notice Allows the specified item to be purchased with Ether /// @param itemId The id of the item to purchase /// @param qty The numbers of items to purchase function purchaseWithEth(uint16 itemId, uint256 qty) public payable whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = validateItem(itemId); require(item.PmtType == PaymentType.ETHER, "Specified item cannot be purchased with Ether"); validateRequestedQuantity(itemId, item, qty); ensureAvailablity(item, itemId, qty); validateEtherValue(item, qty); nonMintedItemPurchaseCounts[itemId] += qty; ownedItemCountsByOwner[_msgSender()][itemId] += qty; } /// @notice Allows the specified item to be purchased with AWOO and Ether, if the item allows it /// @param itemId The id of the item to purchase /// @param qty The number of items to purchase /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC function purchaseWithEthAndAwoo(uint16 itemId, uint256 qty, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims ) public payable whenStoreActive nonZeroQuantity(qty){ ItemDetail memory item = validateItem(itemId); require(item.PmtType == PaymentType.AWOO_AND_ETHER, "Specified item cannot be purchased with AWOO and Ether"); validateRequestedQuantity(itemId, item, qty); ensureAvailablity(item, itemId, qty); validateEtherValue(item, qty); claimAwoo(requestedClaims); awooContract.spendVirtualAwoo(approval.Hash, approval.Sig, approval.Nonce, _msgSender(), qty * item.AWOOPrice); nonMintedItemPurchaseCounts[itemId] += qty; ownedItemCountsByOwner[_msgSender()][itemId] += qty; } /// @notice Allows the specified item to be purchased with AWOO and applied to the specified tokens /// @param itemId The id of the item to purchase /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC /// @param applicationTokenIds An array of supported token ids to apply the purchased items to function purchaseAndApplyWithAwoo(uint16 itemId, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims, uint32[] calldata applicationTokenIds ) public whenStoreActive { ItemDetail memory item = validateItem(itemId); require(item.PmtType == PaymentType.AWOO, "Specified item cannot be purchased with AWOO"); validateRequestedQuantity(itemId, item, applicationTokenIds.length); ensureAvailablity(item, itemId, applicationTokenIds.length); claimAwoo(requestedClaims); awooContract.spendVirtualAwoo(approval.Hash, approval.Sig, approval.Nonce, _msgSender(), applicationTokenIds.length * item.AWOOPrice); applyItem(itemId, applicationTokenIds); } /// @notice Allows the specified item to be purchased with Ether and applied to the specified tokens /// @param itemId The id of the item to purchase /// @param applicationTokenIds An array of supported token ids to apply the purchased items to function purchaseAndApplyWithEth(uint16 itemId, uint32[] calldata applicationTokenIds ) public payable whenStoreActive { ItemDetail memory item = validateItem(itemId); require(item.PmtType == PaymentType.ETHER, "Specified item cannot be purchased with Ether"); validateRequestedQuantity(itemId, item, applicationTokenIds.length); validateEtherValue(item, applicationTokenIds.length); ensureAvailablity(item, itemId, applicationTokenIds.length); applyItem(itemId, applicationTokenIds); } /// @notice Allows the specified item to be purchased with AWOO and Ether, and the tokens the items should be applied to /// @param itemId The id of the item to purchase /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC /// @param applicationTokenIds An array of supported token ids to apply the purchased items to function purchaseAndApplyWithEthAndAwoo(uint16 itemId, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims, uint32[] calldata applicationTokenIds ) public payable whenStoreActive { ItemDetail memory item = validateItem(itemId); require(item.PmtType == PaymentType.AWOO_AND_ETHER, "Specified item cannot be purchased with AWOO and Ether"); validateRequestedQuantity(itemId, item, applicationTokenIds.length); validateEtherValue(item, applicationTokenIds.length); ensureAvailablity(item, itemId, applicationTokenIds.length); claimAwoo(requestedClaims); awooContract.spendVirtualAwoo(approval.Hash, approval.Sig, approval.Nonce, _msgSender(), applicationTokenIds.length * item.AWOOPrice); applyItem(itemId, applicationTokenIds); } // TODO: Add the free mint/purchase functionality (V2) /// @notice Applies the specified item to the list of "upgradeable" tokens /// @param itemId The id of the item to apply /// @param applicationTokenIds An array of token ids to which the specified item will be applied function applyOwnedItem(uint16 itemId, uint32[] calldata applicationTokenIds) public whenStoreActive { ItemDetail memory item = validateItem(itemId); require(applicationTokenIds.length <= ownedItemCountsByOwner[_msgSender()][itemId], "Requested qty exceeds owned quantity"); for(uint256 i; i < applicationTokenIds.length; i++){ applyItem(item, itemId, applicationTokenIds[i]); } if(item.Burnable) { ownedItemCountsByOwner[_msgSender()][itemId] -= applicationTokenIds.length; } } /// @notice Allows the holder of a non-mintable item to "use" it for something (TBA) cool /// @param itemId The id of the item to use /// @param qty The number of items to use function useOwnedItem(uint16 itemId, uint256 qty) public whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = validateItem(itemId); require(qty <= ownedItemCountsByOwner[_msgSender()][itemId], "Requested qty exceeds owned quantity"); if(item.Burnable) { ownedItemCountsByOwner[_msgSender()][itemId] -= qty; } emit NonMintedItemUsed(itemId, _msgSender(), qty); } /// @notice Applies the specified item to the list of "upgradeable" tokens, and burns the item if applicable /// @dev Tokens can only be burned if the holder has explicitly allowed us to do so /// @param itemId The id of the item to apply /// @param applicationTokenIds An array of token ids to which the specified item will be applied function applyMintedItem(uint16 itemId, uint32[] calldata applicationTokenIds) public whenStoreActive { ItemDetail memory item = validateItem(itemId); require(!item.NonMintable, "Specified item is not mintable"); require(applicationTokenIds.length <= awooMintableCollectionContract.balanceOf(_msgSender(), item.TokenId), "Requested application qty exceeds owned qty"); for(uint256 i; i < applicationTokenIds.length; i++){ applyItem(item, itemId, applicationTokenIds[i]); } if(item.Burnable) { awooMintableCollectionContract.burn(_msgSender(), item.TokenId, applicationTokenIds.length); } } function applyItem(uint16 itemId, uint32[] calldata applicationTokenIds) private { ItemDetail memory item = validateItem(itemId); for(uint256 i; i < applicationTokenIds.length; i++){ applyItem(item, itemId, applicationTokenIds[i]); } } function applyItem(ItemDetail memory item, uint16 itemId, uint32 applicationTokenId) private { require(item.UpgradeDetails.UpgradeItem, "Item cannot be applied"); // Items can only be applied to "upgradable" tokens held by the same account require( _msgSender() == ERC721Enumerable(collectionIdAddressMap[item.UpgradeDetails.ApplicableCollectionId]).ownerOf(applicationTokenId), "Invalid application tokenId" ); // Don't allow the item to be applied mutiple times to the same token unless the item is stackable if(!item.UpgradeDetails.Stackable) { require( tokenAppliedItemCountsByCollection[item.UpgradeDetails.ApplicableCollectionId][applicationTokenId][itemId] == 0, "Specified item already applied to the specified token and is not stackable" ); } // If the item should change the base AWOO accrual rate of the item that it is being applied to, do that // now if(item.UpgradeDetails.UpgradeBaseAccrualRate > 0) { awooClaimingContract.overrideTokenAccrualBaseRate( collectionIdAddressMap[item.UpgradeDetails.ApplicableCollectionId], applicationTokenId, item.UpgradeDetails.UpgradeBaseAccrualRate ); } tokenAppliedItemCountsByCollection[item.UpgradeDetails.ApplicableCollectionId][applicationTokenId][itemId] += 1; itemApplications[itemId][item.UpgradeDetails.ApplicableCollectionId].push(applicationTokenId); // Tell NFC that we applied this upgrade so it can do some fun stuff emit UpgradeItemApplied(itemId, collectionIdAddressMap[item.UpgradeDetails.ApplicableCollectionId], applicationTokenId); } function claimAwoo(ClaimDetails[] calldata requestedClaims) private { if(requestedClaims.length > 0) { awooClaimingContract.claim(_msgSender(), requestedClaims); } } /// @notice Allows authorized individuals to add supported ERC721Enumerable collections function addCollection(address collectionAddress) external onlyOwnerOrAdmin returns(uint8 collectionId){ collectionId = ++collectionCount; collectionIdAddressMap[collectionId] = collectionAddress; } /// @notice Allows authorized individuals to remove supported ERC721Enumerable collections function removeCollection(uint8 collectionId) external onlyOwnerOrAdmin { require(collectionId <= collectionCount, "Invalid collectionId"); delete collectionIdAddressMap[collectionId]; collectionCount--; } /// @notice Allows authorized individuals to add new items function addItem(ItemDetail memory item) external onlyOwnerOrAdmin returns(uint16) { validateItem(item); if(!item.NonMintable){ uint256 tokenId = awooMintableCollectionContract.addToken( item.TokenDetails, item.MetadataUri ); item.TokenId = tokenId; } itemIdDetailMap[++itemCount] = item; return itemCount; } /// @notice Allows authorized individuals to update an existing item function updateItem(uint16 itemId, ItemDetail memory newItem) external onlyOwnerOrAdmin { validateItem(newItem); ItemDetail memory existingItem = validateItem(itemId); require(existingItem.NonMintable == newItem.NonMintable, "Item mintability cannot change"); require(newItem.TotalAvailable <= availableQty(existingItem, itemId), "Purchased quantity exceeds new total available quantity"); if(!existingItem.NonMintable) { newItem.TokenId = existingItem.TokenId; if( bytes(newItem.MetadataUri).length != bytes(existingItem.MetadataUri).length || keccak256(abi.encodePacked(newItem.MetadataUri)) != keccak256(abi.encodePacked(existingItem.MetadataUri)) ) { awooMintableCollectionContract.setTokenUri(existingItem.TokenId, newItem.MetadataUri); } if(newItem.Active != existingItem.Active) { awooMintableCollectionContract.setTokenActive(existingItem.TokenId, newItem.Active); } } itemIdDetailMap[itemId] = newItem; } function validateRequestedQuantity(uint16 itemId, ItemDetail memory item, uint256 requestedQty) private view { require(isWithinTransactionLimit(item, requestedQty), "Exceeds transaction limit"); require(isWithinAddressLimit(itemId, item, requestedQty, _msgSender()),"Exceeds address limit"); } function ensureAvailablity(ItemDetail memory item, uint16 itemId, uint256 requestedQty) private view { require(requestedQty <= availableQty(item, itemId), "Exceeds available quantity"); } function availableQty(uint16 itemId) public view returns(uint256){ ItemDetail memory item = validateItem(itemId); return availableQty(item, itemId); } function availableQty(ItemDetail memory item, uint16 itemId) private view returns(uint256) { uint256 mintedCount; // If the item is mintable, get the minted quantity from the ERC-1155 contract. // The minted count includes the quantity that was burned if the item does not have a soft limit if(!item.NonMintable) { mintedCount = awooMintableCollectionContract.totalMinted(item.TokenId); } return item.TotalAvailable-mintedCount-nonMintedItemPurchaseCounts[itemId]; } /// @notice Determines if the requested quantity is within the per-transaction limit defined by this item function isWithinTransactionLimit(ItemDetail memory item, uint256 requestedQty) public pure returns(bool) { if(item.PerTransactionLimit > 0) { return requestedQty <= item.PerTransactionLimit; } return true; } /// @notice Determines if the requested quantity is within the per-address limit defined by this item function isWithinAddressLimit(uint16 itemId, ItemDetail memory item, uint256 requestedQty, address recipient) public view returns(bool) { if(item.PerAddressLimit > 0) { uint256 tokenCountByOwner = item.NonMintable ? ownedItemCountsByOwner[recipient][itemId] : ownedItemCountsByOwner[recipient][itemId] + mintedItemCountsByAddress[recipient][itemId]; return tokenCountByOwner + requestedQty <= item.PerAddressLimit; } return true; } /// @notice Returns an array of tokenIds and application counts to indicate how many of the specified items /// were applied to the specified tokenIds function checkItemTokenApplicationStatus(uint8 collectionId, uint16 itemId, uint256[] calldata tokenIds ) external view returns(uint256[] memory, uint256[] memory){ uint256[] memory checkedTokenIds = new uint256[](tokenIds.length); uint256[] memory applicationCounts = new uint256[](tokenIds.length); for(uint256 i; i < tokenIds.length;i++){ uint32 tokenId = uint32(tokenIds[i]); checkedTokenIds[i] = tokenId; applicationCounts[i] = tokenAppliedItemCountsByCollection[collectionId][tokenId][itemId]; } return(checkedTokenIds, applicationCounts); } function validateEtherValue(ItemDetail memory item, uint256 qty) private { require(msg.value == item.EtherPrice * qty, "Incorrect amount"); } function validateItem(uint16 itemId) private view returns(ItemDetail memory item){ require(itemId <= itemCount, "Invalid itemId"); item = itemIdDetailMap[itemId]; require(item.Active, "Inactive item"); } function validateItem(ItemDetail memory item) private view { require(item.TotalAvailable > 0, "Total available cannot be zero"); require(!(item.UpgradeDetails.Stackable && item.PerAddressLimit == 1), "Stackable items cannot have per-address limit of 1"); if(item.NonMintable) { require(bytes(item.MetadataUri).length > 0, "Non-mintable items require a metadata uri"); } if(item.UpgradeDetails.UpgradeItem){ require(item.UpgradeDetails.ApplicableCollectionId <= collectionCount, "Invalid applicableCollectionId"); } else { require(item.UpgradeDetails.ApplicableCollectionId == 0, "Non-upgrade items cannot have an applicable collection"); } if(item.PmtType == PaymentType.ETHER){ require(item.EtherPrice > 0, "Ether items must have an Ether price"); require(item.AWOOPrice == 0, "Ether-only items cannot have an AWOO price"); } else if(item.PmtType == PaymentType.AWOO){ require(item.EtherPrice == 0, "AWOO-only items cannot have an Ether price"); require(item.AWOOPrice == ((item.AWOOPrice/1e18)*1e18), "Fractional AWOO ether units are not supported"); } else if (item.PmtType == PaymentType.AWOO_AND_ETHER) { require(item.EtherPrice > 0, "AWOO and Ether items must have an Ether price"); require(item.AWOOPrice == ((item.AWOOPrice/1e18)*1e18), "Fractional AWOO ether units are not supported"); } // free else { revert("Not implemented, yet"); } } /// @notice Allows authorized individuals to swap out claiming contract function setAwooClaimingContract(IAwooClaimingV2 awooClaiming) external onlyOwnerOrAdmin { awooClaimingContract = IAwooClaimingV2(awooClaiming); } /// @notice Allows authorized individuals to swap out the ERC-1155 collection contract, if absolutely necessary function setAwooCollection(IAwooMintableCollection awooCollectionContract) external onlyOwnerOrAdmin { awooMintableCollectionContract = awooCollectionContract; } /// @notice Allows authorized individuals to swap out the ERC-20 AWOO contract, if absolutely necessary function setAwooTokenContract(IAwooToken awooTokenContract) external onlyOwnerOrAdmin { awooContract = awooTokenContract; } /// @notice Allows authorized individuals to activate/deactivate this contract function setActive(bool active) external onlyOwnerOrAdmin { if(active){ require(address(awooMintableCollectionContract) != address(0), "Awoo collection has not been set"); } storeActive = active; } /// @notice Allows authorized individuals to activate/deactivate specific items function setItemActive(uint16 itemId, bool isActive) external onlyOwnerOrAdmin { require(itemId > 0 && itemId <= itemCount, "Invalid Item Id"); itemIdDetailMap[itemId].Active = isActive; } /// @notice Allows authorized individuals to specify which address Ether and other arbitrary ERC-20 tokens /// should be sent to during withdraw function setWithdrawAddress(address payable addr) external onlyOwnerOrAdmin { require(addr != address(0), "Withdraw address cannot be the zero address"); withdrawAddress = addr; } function withdraw(uint256 amount) external onlyOwnerOrAdmin { require(amount <= address(this).balance, "Amount exceeds balance"); require(payable(withdrawAddress).send(amount)); } /// @dev Any random ERC-20 tokens sent to this contract will be locked forever, unless we rescue them function rescueArbitraryERC20(IERC20 token) external { uint256 balance = token.balanceOf(address(this)); require(balance > 0, "Contract has no balance"); require(token.transfer(payable(withdrawAddress), balance), "Transfer failed"); } modifier nonZeroQuantity(uint256 qty) { require(qty > 0, "Quantity cannot be zero"); _; } modifier whenStoreActive() { require(storeActive, "Awoo Store is not active"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address payable","name":"withdrawAddr","type":"address"},{"internalType":"contract IAwooToken","name":"awooTokenContract","type":"address"},{"internalType":"contract IAwooClaimingV2","name":"claimingContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"itemId","type":"uint16"},{"indexed":false,"internalType":"address","name":"usedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"NonMintedItemUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"itemId","type":"uint16"},{"indexed":false,"internalType":"address","name":"applicationCollectionAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"appliedToTokenId","type":"uint256"}],"name":"UpgradeItemApplied","type":"event"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"}],"name":"addCollection","outputs":[{"internalType":"uint8","name":"collectionId","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"bool","name":"SoftLimit","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"}],"internalType":"struct IAwooMintableCollection.TokenDetail","name":"TokenDetails","type":"tuple"},{"components":[{"internalType":"uint8","name":"ApplicableCollectionId","type":"uint8"},{"internalType":"uint256","name":"UpgradeBaseAccrualRate","type":"uint256"},{"internalType":"bool","name":"UpgradeItem","type":"bool"},{"internalType":"bool","name":"Stackable","type":"bool"}],"internalType":"struct AwooStore.UpgradeDetail","name":"UpgradeDetails","type":"tuple"},{"internalType":"string","name":"MetadataUri","type":"string"},{"internalType":"uint256","name":"TokenId","type":"uint256"},{"internalType":"enum AwooStore.PaymentType","name":"PmtType","type":"uint8"},{"internalType":"uint256","name":"EtherPrice","type":"uint256"},{"internalType":"uint256","name":"AWOOPrice","type":"uint256"},{"internalType":"uint256","name":"TotalAvailable","type":"uint256"},{"internalType":"bool","name":"Burnable","type":"bool"},{"internalType":"bool","name":"NonMintable","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"},{"internalType":"uint256","name":"PerAddressLimit","type":"uint256"},{"internalType":"uint256","name":"PerTransactionLimit","type":"uint256"}],"internalType":"struct AwooStore.ItemDetail","name":"item","type":"tuple"}],"name":"addItem","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"applyMintedItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"applyOwnedItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"}],"name":"availableQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"awooClaimingContract","outputs":[{"internalType":"contract IAwooClaimingV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"awooContract","outputs":[{"internalType":"contract IAwooToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"awooMintableCollectionContract","outputs":[{"internalType":"contract IAwooMintableCollection","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"collectionId","type":"uint8"},{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"checkItemTokenApplicationStatus","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"collectionIdAddressMap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"components":[{"components":[{"internalType":"bool","name":"SoftLimit","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"}],"internalType":"struct IAwooMintableCollection.TokenDetail","name":"TokenDetails","type":"tuple"},{"components":[{"internalType":"uint8","name":"ApplicableCollectionId","type":"uint8"},{"internalType":"uint256","name":"UpgradeBaseAccrualRate","type":"uint256"},{"internalType":"bool","name":"UpgradeItem","type":"bool"},{"internalType":"bool","name":"Stackable","type":"bool"}],"internalType":"struct AwooStore.UpgradeDetail","name":"UpgradeDetails","type":"tuple"},{"internalType":"string","name":"MetadataUri","type":"string"},{"internalType":"uint256","name":"TokenId","type":"uint256"},{"internalType":"enum AwooStore.PaymentType","name":"PmtType","type":"uint8"},{"internalType":"uint256","name":"EtherPrice","type":"uint256"},{"internalType":"uint256","name":"AWOOPrice","type":"uint256"},{"internalType":"uint256","name":"TotalAvailable","type":"uint256"},{"internalType":"bool","name":"Burnable","type":"bool"},{"internalType":"bool","name":"NonMintable","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"},{"internalType":"uint256","name":"PerAddressLimit","type":"uint256"},{"internalType":"uint256","name":"PerTransactionLimit","type":"uint256"}],"internalType":"struct AwooStore.ItemDetail","name":"item","type":"tuple"},{"internalType":"uint256","name":"requestedQty","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"isWithinAddressLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"bool","name":"SoftLimit","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"}],"internalType":"struct IAwooMintableCollection.TokenDetail","name":"TokenDetails","type":"tuple"},{"components":[{"internalType":"uint8","name":"ApplicableCollectionId","type":"uint8"},{"internalType":"uint256","name":"UpgradeBaseAccrualRate","type":"uint256"},{"internalType":"bool","name":"UpgradeItem","type":"bool"},{"internalType":"bool","name":"Stackable","type":"bool"}],"internalType":"struct AwooStore.UpgradeDetail","name":"UpgradeDetails","type":"tuple"},{"internalType":"string","name":"MetadataUri","type":"string"},{"internalType":"uint256","name":"TokenId","type":"uint256"},{"internalType":"enum AwooStore.PaymentType","name":"PmtType","type":"uint8"},{"internalType":"uint256","name":"EtherPrice","type":"uint256"},{"internalType":"uint256","name":"AWOOPrice","type":"uint256"},{"internalType":"uint256","name":"TotalAvailable","type":"uint256"},{"internalType":"bool","name":"Burnable","type":"bool"},{"internalType":"bool","name":"NonMintable","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"},{"internalType":"uint256","name":"PerAddressLimit","type":"uint256"},{"internalType":"uint256","name":"PerTransactionLimit","type":"uint256"}],"internalType":"struct AwooStore.ItemDetail","name":"item","type":"tuple"},{"internalType":"uint256","name":"requestedQty","type":"uint256"}],"name":"isWithinTransactionLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"itemApplications","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"itemIdDetailMap","outputs":[{"components":[{"internalType":"bool","name":"SoftLimit","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"}],"internalType":"struct IAwooMintableCollection.TokenDetail","name":"TokenDetails","type":"tuple"},{"components":[{"internalType":"uint8","name":"ApplicableCollectionId","type":"uint8"},{"internalType":"uint256","name":"UpgradeBaseAccrualRate","type":"uint256"},{"internalType":"bool","name":"UpgradeItem","type":"bool"},{"internalType":"bool","name":"Stackable","type":"bool"}],"internalType":"struct AwooStore.UpgradeDetail","name":"UpgradeDetails","type":"tuple"},{"internalType":"string","name":"MetadataUri","type":"string"},{"internalType":"uint256","name":"TokenId","type":"uint256"},{"internalType":"enum AwooStore.PaymentType","name":"PmtType","type":"uint8"},{"internalType":"uint256","name":"EtherPrice","type":"uint256"},{"internalType":"uint256","name":"AWOOPrice","type":"uint256"},{"internalType":"uint256","name":"TotalAvailable","type":"uint256"},{"internalType":"bool","name":"Burnable","type":"bool"},{"internalType":"bool","name":"NonMintable","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"},{"internalType":"uint256","name":"PerAddressLimit","type":"uint256"},{"internalType":"uint256","name":"PerTransactionLimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStore.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"}],"name":"mintWithAwoo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStore.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"}],"name":"mintWithEthAndAwoo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"mintedItemCountsByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"nonMintedItemPurchaseCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"ownedItemCountsByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStore.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"purchaseAndApplyWithAwoo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"purchaseAndApplyWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStore.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"purchaseAndApplyWithEthAndAwoo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStore.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"}],"name":"purchaseWithAwoo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"purchaseWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStore.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"}],"name":"purchaseWithEthAndAwoo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"collectionId","type":"uint8"}],"name":"removeCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"rescueArbitraryERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[2]","name":"admins","type":"address[2]"}],"name":"setAdmins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAwooClaimingV2","name":"awooClaiming","type":"address"}],"name":"setAwooClaimingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAwooMintableCollection","name":"awooCollectionContract","type":"address"}],"name":"setAwooCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAwooToken","name":"awooTokenContract","type":"address"}],"name":"setAwooTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setItemActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"tokenAppliedItemCountsByCollection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"components":[{"components":[{"internalType":"bool","name":"SoftLimit","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"}],"internalType":"struct IAwooMintableCollection.TokenDetail","name":"TokenDetails","type":"tuple"},{"components":[{"internalType":"uint8","name":"ApplicableCollectionId","type":"uint8"},{"internalType":"uint256","name":"UpgradeBaseAccrualRate","type":"uint256"},{"internalType":"bool","name":"UpgradeItem","type":"bool"},{"internalType":"bool","name":"Stackable","type":"bool"}],"internalType":"struct AwooStore.UpgradeDetail","name":"UpgradeDetails","type":"tuple"},{"internalType":"string","name":"MetadataUri","type":"string"},{"internalType":"uint256","name":"TokenId","type":"uint256"},{"internalType":"enum AwooStore.PaymentType","name":"PmtType","type":"uint8"},{"internalType":"uint256","name":"EtherPrice","type":"uint256"},{"internalType":"uint256","name":"AWOOPrice","type":"uint256"},{"internalType":"uint256","name":"TotalAvailable","type":"uint256"},{"internalType":"bool","name":"Burnable","type":"bool"},{"internalType":"bool","name":"NonMintable","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"},{"internalType":"uint256","name":"PerAddressLimit","type":"uint256"},{"internalType":"uint256","name":"PerTransactionLimit","type":"uint256"}],"internalType":"struct AwooStore.ItemDetail","name":"newItem","type":"tuple"}],"name":"updateItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"useOwnedItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005c1b38038062005c1b833981016040819052620000349162000163565b6200003f33620000fa565b6001600160a01b038316620000ae5760405162461bcd60e51b815260206004820152602b60248201527f576974686472617720616464726573732063616e6e6f7420626520746865207a60448201526a65726f206164647265737360a81b606482015260840160405180910390fd5b600380546001600160a01b0394851661010002610100600160a81b0319909116179055600480549284166001600160a01b031993841617905560058054919093169116179055620001b7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200016057600080fd5b50565b6000806000606084860312156200017957600080fd5b835162000186816200014a565b602085015190935062000199816200014a565b6040850151909250620001ac816200014a565b809150509250925092565b615a5480620001c76000396000f3fe6080604052600436106102fd5760003560e01c806361700ef31161018f578063b2958fba116100e1578063d7f0cbdc1161008a578063eddf758611610064578063eddf758614610935578063f2fde38b14610948578063f563d82e1461096857600080fd5b8063d7f0cbdc146108e2578063e4b064bc14610902578063ebd0f2b71461092257600080fd5b8063d22a092a116100bb578063d22a092a1461086f578063d57f966b1461088f578063d684dbd8146108c257600080fd5b8063b2958fba1461080f578063bc1f793f1461082f578063c71ab3c51461084f57600080fd5b80638bbf9ef611610143578063a174e77a1161011d578063a174e77a146107aa578063a235ea27146107dc578063acec338a146107ef57600080fd5b80638bbf9ef6146107255780638da5cb5b146107535780639ab199771461077157600080fd5b80636bfb0d01116101745780636bfb0d01146106bb57806370cd3f84146106f0578063715018a61461071057600080fd5b806361700ef31461067b5780636b3bc1e31461069b57600080fd5b80633218d7bb1161025357806347f2e27a116101fc5780635433d350116101d65780635433d350146105fd5780635ce628b01461061d5780635f3002ba1461065b57600080fd5b806347f2e27a1461057b5780634fb9f912146105bd5780634fcd3a71146105ea57600080fd5b80633ab1a4941161022d5780633ab1a494146104f0578063405402c21461051057806347c5dc0c1461054857600080fd5b80633218d7bb1461049d57806336bd4b4a146104bd57806339708905146104dd57600080fd5b806320be2759116102b55780632f5315681161028f5780632f5315681461042f5780632fcc503b1461045d57806330c8d9df1461047d57600080fd5b806320be2759146103cf57806325609d6f146103ef5780632e1a7d4d1461040f57600080fd5b80630d9014e7116102e65780630d9014e7146103375780631581b6001461038a57806315e32e08146103af57600080fd5b80630604c672146103025780630a6f94fc14610317575b600080fd5b610315610310366004614a61565b6109a0565b005b34801561032357600080fd5b50610315610332366004614a8b565b610c5e565b34801561034357600080fd5b5061036d610352366004614ac4565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561039657600080fd5b5060035461036d9061010090046001600160a01b031681565b3480156103bb57600080fd5b506103156103ca366004614af4565b610d25565b3480156103db57600080fd5b5060045461036d906001600160a01b031681565b3480156103fb57600080fd5b5060055461036d906001600160a01b031681565b34801561041b57600080fd5b5061031561042a366004614b11565b610db4565b34801561043b57600080fd5b5061044f61044a366004614b2a565b610e92565b604051908152602001610381565b34801561046957600080fd5b50610315610478366004614ac4565b610eb1565b34801561048957600080fd5b50610315610498366004614af4565b610ff9565b3480156104a957600080fd5b506103156104b8366004614ba3565b611088565b3480156104c957600080fd5b506103156104d8366004614af4565b6113d7565b6103156104eb366004614a61565b611592565b3480156104fc57600080fd5b5061031561050b366004614af4565b611739565b34801561051c57600080fd5b5061044f61052b366004614c28565b600a60209081526000928352604080842090915290825290205481565b34801561055457600080fd5b50610568610563366004614f65565b611849565b60405161ffff9091168152602001610381565b34801561058757600080fd5b506006546105ad9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610381565b3480156105c957600080fd5b5061044f6105d8366004614b2a565b60096020526000908152604090205481565b6103156105f8366004614ba3565b611bd2565b34801561060957600080fd5b50610315610618366004614f9a565b611d98565b34801561062957600080fd5b5061044f610638366004615001565b600d60209081526000938452604080852082529284528284209052825290205481565b34801561066757600080fd5b50610315610676366004614f9a565b612067565b34801561068757600080fd5b50610315610696366004615044565b6121e0565b3480156106a757600080fd5b506103156106b636600461507b565b612306565b3480156106c757600080fd5b5060065461056890760100000000000000000000000000000000000000000000900461ffff1681565b3480156106fc57600080fd5b506105ad61070b3660046150c9565b612827565b34801561071c57600080fd5b5061031561284e565b34801561073157600080fd5b5061074561074036600461510e565b6128b4565b6040516103819291906151aa565b34801561075f57600080fd5b506000546001600160a01b031661036d565b34801561077d57600080fd5b5061079161078c366004614b2a565b612a01565b6040516103819d9c9b9a999897969594939291906152b8565b3480156107b657600080fd5b506107ca6107c5366004614af4565b612b4e565b60405160ff9091168152602001610381565b6103156107ea366004615377565b612c36565b3480156107fb57600080fd5b5061031561080a36600461541c565b612e07565b34801561081b57600080fd5b506105ad61082a366004615439565b612f04565b34801561083b57600080fd5b5061031561084a366004614a61565b612fbc565b34801561085b57600080fd5b5061031561086a366004614af4565b6131a0565b34801561087b57600080fd5b5061044f61088a3660046154a3565b61322f565b34801561089b57600080fd5b506006546107ca907501000000000000000000000000000000000000000000900460ff1681565b3480156108ce57600080fd5b506103156108dd366004614ba3565b61326d565b3480156108ee57600080fd5b5060065461036d906001600160a01b031681565b34801561090e57600080fd5b5061031561091d366004615377565b6134a5565b610315610930366004614f9a565b6135b2565b610315610943366004614ba3565b6136df565b34801561095457600080fd5b50610315610963366004614af4565b613852565b34801561097457600080fd5b5061044f610983366004614c28565b600b60209081526000928352604080842090915290825290205481565b60065474010000000000000000000000000000000000000000900460ff16610a0f5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064015b60405180910390fd5b8060008111610a605760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b6000610a6b84613931565b905080610120015115610ac05760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c6500006044820152606401610a06565b600181608001516003811115610ad857610ad861524e565b14610b4b5760405162461bcd60e51b815260206004820152602d60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f65642077697468204574686572000000000000000000000000000000000000006064820152608401610a06565b610b56848285613c4c565b610b61818585613cff565b610b6b8184613d58565b6006546001600160a01b031663156e29f63360608401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260448101869052606401600060405180830381600087803b158015610be757600080fd5b505af1158015610bfb573d6000803e3d6000fd5b5050505082600b6000610c0b3390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008661ffff1661ffff1681526020019081526020016000206000828254610c53919061550e565b909155505050505050565b6000610c6d6020830183614af4565b6001600160a01b031614158015610c9d57506000610c916040830160208401614af4565b6001600160a01b031614155b610ce95760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e206164647265737300000000000000000000006044820152606401610a06565b610cf66001826002614958565b5050600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610d2e33613db6565b610d7a5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610dbd33613db6565b610e095760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b47811115610e595760405162461bcd60e51b815260206004820152601660248201527f416d6f756e7420657863656564732062616c616e6365000000000000000000006044820152606401610a06565b6003546040516101009091046001600160a01b0316906108fc8315029083906000818181858888f19350505050610e8f57600080fd5b50565b600080610e9e83613931565b9050610eaa8184613e07565b9392505050565b610eba33613db6565b610f065760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b60065460ff750100000000000000000000000000000000000000000090910481169082161115610f785760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420636f6c6c656374696f6e49640000000000000000000000006044820152606401610a06565b60ff808216600090815260076020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556006805475010000000000000000000000000000000000000000009004909116906015610fdd83615555565b91906101000a81548160ff021916908360ff1602179055505050565b61100233613db6565b61104e5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60065474010000000000000000000000000000000000000000900460ff166110f25760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b83600081116111435760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b600061114e87613931565b9050806101200151156111a35760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c6500006044820152606401610a06565b6000816080015160038111156111bb576111bb61524e565b1461122e5760405162461bcd60e51b815260206004820152602c60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f00000000000000000000000000000000000000006064820152608401610a06565b611239878288613c4c565b611244818888613cff565b61124e8484613ed6565b6004546001600160a01b0316636cce000c863561126e6020890189615590565b61127b60408b018b615590565b3360c089015161128b908f6155f5565b6040518863ffffffff1660e01b81526004016112ad979695949392919061567b565b600060405180830381600087803b1580156112c757600080fd5b505af11580156112db573d6000803e3d6000fd5b50506006546001600160a01b0316915063156e29f690503360608401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260448101899052606401600060405180830381600087803b15801561135d57600080fd5b505af1158015611371573d6000803e3d6000fd5b5050505085600b60006113813390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008961ffff1661ffff16815260200190815260200160002060008282546113c9919061550e565b909155505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145b91906156c8565b9050600081116114ad5760405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420686173206e6f2062616c616e63650000000000000000006044820152606401610a06565b6003546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b0390811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af115801561151e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154291906156e1565b61158e5760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610a06565b5050565b60065474010000000000000000000000000000000000000000900460ff166115fc5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b806000811161164d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b600061165884613931565b90506001816080015160038111156116725761167261524e565b146116e55760405162461bcd60e51b815260206004820152602d60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f65642077697468204574686572000000000000000000000000000000000000006064820152608401610a06565b6116f0848285613c4c565b6116fb818585613cff565b6117058184613d58565b61ffff84166000908152600960205260408120805485929061172890849061550e565b90915550839050600a600033610c0b565b61174233613db6565b61178e5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b6001600160a01b03811661180a5760405162461bcd60e51b815260206004820152602b60248201527f576974686472617720616464726573732063616e6e6f7420626520746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610a06565b600380546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b600061185433613db6565b6118a05760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b6118a982613f44565b81610120015161194c57600654825160408085015190517f4d451c070000000000000000000000000000000000000000000000000000000081526000936001600160a01b031692634d451c0792611902926004016156fe565b6020604051808303816000875af1158015611921573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194591906156c8565b6060840152505b81600860006006601681819054906101000a900461ffff1661196d90615726565b825461ffff91821661010093840a81810293021990911691909117909255908252602080830193909352604091820160002084518051825491860151151584027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff91151582167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009384161717835586860151805160018501805460ff929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0092909216919091179055808701516002850155808601516003850180546060909301511515909602901515909216921691909117179091559083015180519192611a80926004850192909101906149c6565b506060820151600582015560808201516006820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836003811115611acc57611acc61524e565b021790555060a0820151600782015560c0820151600882015560e0820151600982015561010080830151600a830180546101208601516101408701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009092169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1693909317921515909302919091177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000092151592909202919091179055610160820151600b82015561018090910151600c9091015550600654760100000000000000000000000000000000000000000000900461ffff165b919050565b60065474010000000000000000000000000000000000000000900460ff16611c3c5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b8360008111611c8d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b6000611c9887613931565b905080610120015115611ced5760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c6500006044820152606401610a06565b600281608001516003811115611d0557611d0561524e565b14611d785760405162461bcd60e51b815260206004820152603660248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f20616e64204574686572000000000000000000006064820152608401610a06565b611d83878288613c4c565b611d8e818888613cff565b6112448187613d58565b60065474010000000000000000000000000000000000000000900460ff16611e025760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b6000611e0d84613931565b905080610120015115611e625760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c6500006044820152606401610a06565b6006546001600160a01b031662fdd58e3360608401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611ed9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efd91906156c8565b821115611f725760405162461bcd60e51b815260206004820152602b60248201527f526571756573746564206170706c69636174696f6e207174792065786365656460448201527f73206f776e6564207174790000000000000000000000000000000000000000006064820152608401610a06565b60005b82811015611fc057611fae8286868685818110611f9457611f94615526565b9050602002016020810190611fa99190615748565b6144d8565b80611fb881615763565b915050611f75565b5080610100015115612061576006546001600160a01b031663f5298aca33606084015160405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039092166004830152602482015260448101859052606401600060405180830381600087803b15801561204857600080fd5b505af115801561205c573d6000803e3d6000fd5b505050505b50505050565b60065474010000000000000000000000000000000000000000900460ff166120d15760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b60006120dc84613931565b336000908152600a6020908152604080832061ffff891684529091529020549091508211156121725760405162461bcd60e51b8152602060048201526024808201527f526571756573746564207174792065786365656473206f776e6564207175616e60448201527f74697479000000000000000000000000000000000000000000000000000000006064820152608401610a06565b60005b828110156121a6576121948286868685818110611f9457611f94615526565b8061219e81615763565b915050612175565b508061010001511561206157336000908152600a6020908152604080832061ffff8816845290915281208054849290610c5390849061579c565b6121e933613db6565b6122355760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b60008261ffff1611801561226d575060065461ffff760100000000000000000000000000000000000000000000909104811690831611155b6122b95760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964204974656d20496400000000000000000000000000000000006044820152606401610a06565b61ffff9091166000908152600860205260409020600a01805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b61230f33613db6565b61235b5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b61236481613f44565b600061236f83613931565b905081610120015115158161012001511515146123ce5760405162461bcd60e51b815260206004820152601e60248201527f4974656d206d696e746162696c6974792063616e6e6f74206368616e676500006044820152606401610a06565b6123d88184613e07565b8260e0015111156124515760405162461bcd60e51b815260206004820152603760248201527f507572636861736564207175616e746974792065786365656473206e6577207460448201527f6f74616c20617661696c61626c65207175616e746974790000000000000000006064820152608401610a06565b8061012001516125fd57606080820151908301526040808201515190830151511415806124d25750806040015160405160200161248e91906157b3565b6040516020818303038152906040528051906020012082604001516040516020016124b991906157b3565b6040516020818303038152906040528051906020012014155b1561255d57600654606082015160408085015190517f57f7789e0000000000000000000000000000000000000000000000000000000081526001600160a01b03909316926357f7789e9261252a9290916004016157cf565b600060405180830381600087803b15801561254457600080fd5b505af1158015612558573d6000803e3d6000fd5b505050505b80610140015115158261014001511515146125fd5760065460608201516101408401516040517fffc54ea40000000000000000000000000000000000000000000000000000000081526004810192909252151560248201526001600160a01b039091169063ffc54ea490604401600060405180830381600087803b1580156125e457600080fd5b505af11580156125f8573d6000803e3d6000fd5b505050505b61ffff83166000908152600860209081526040918290208451805182549184015115156101009081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff92151583167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009485161717845584880151805160018601805460ff929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00929092169190911790558086015160028601558087015160038601805460609093015115159093029015159093169316929092171790559184015180518593926126f89260048501929101906149c6565b506060820151600582015560808201516006820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360038111156127445761274461524e565b021790555060a0820151600782015560c0820151600882015560e0820151600982015561010080830151600a830180546101208601516101408701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009092169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1693909317921515909302919091177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000092151592909202919091179055610160820151600b82015561018090910151600c90910155505050565b610180820151600090156128445750610180820151811115612848565b5060015b92915050565b6000546001600160a01b031633146128a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a06565b6128b260006148a8565b565b60608060008367ffffffffffffffff8111156128d2576128d2614c5d565b6040519080825280602002602001820160405280156128fb578160200160208202803683370190505b50905060008467ffffffffffffffff81111561291957612919614c5d565b604051908082528060200260200182016040528015612942578160200160208202803683370190505b50905060005b858110156129f357600087878381811061296457612964615526565b9050602002013590508063ffffffff1684838151811061298657612986615526565b60209081029190910181019190915260ff8b166000908152600d8252604080822063ffffffff85168352835280822061ffff8d168352909252205483518490849081106129d5576129d5615526565b602090810291909101015250806129eb81615763565b915050612948565b509097909650945050505050565b60086020908152600091825260409182902082518084018452815460ff8082161515835261010091829004811615158386015285516080810187526001850154821681526002850154958101959095526003840154808216151596860196909652940490931615156060830152600481018054612a7d906157e8565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa9906157e8565b8015612af65780601f10612acb57610100808354040283529160200191612af6565b820191906000526020600020905b815481529060010190602001808311612ad957829003601f168201915b50505060058401546006850154600786015460088701546009880154600a890154600b8a0154600c909a01549899959860ff95861698509396509194909382811693610100840482169362010000900490911691908d565b6000612b5933613db6565b612ba55760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b60068054601590612bd1907501000000000000000000000000000000000000000000900460ff16615836565b825460ff8083166101009490940a84810291021990911617909255600090815260076020526040902080546001600160a01b039094167fffffffffffffffffffffffff0000000000000000000000000000000000000000909416939093179092555090565b60065474010000000000000000000000000000000000000000900460ff16612ca05760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b6000612cab87613931565b9050600281608001516003811115612cc557612cc561524e565b14612d385760405162461bcd60e51b815260206004820152603660248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f20616e64204574686572000000000000000000006064820152608401610a06565b612d43878284613c4c565b612d4d8183613d58565b612d58818884613cff565b612d628585613ed6565b6004546001600160a01b0316636cce000c8735612d8260208a018a615590565b612d8f60408c018c615590565b3360c0890151612d9f908b6155f5565b6040518863ffffffff1660e01b8152600401612dc1979695949392919061567b565b600060405180830381600087803b158015612ddb57600080fd5b505af1158015612def573d6000803e3d6000fd5b50505050612dfe878484614910565b50505050505050565b612e1033613db6565b612e5c5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b8015612eba576006546001600160a01b0316612eba5760405162461bcd60e51b815260206004820181905260248201527f41776f6f20636f6c6c656374696f6e20686173206e6f74206265656e207365746044820152606401610a06565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61016083015160009015612fb0576000846101200151612f6a576001600160a01b0383166000818152600b6020908152604080832061ffff8b1680855290835281842054948452600a8352818420908452909152902054612f65919061550e565b612f93565b6001600160a01b0383166000908152600a6020908152604080832061ffff8a1684529091529020545b610160860151909150612fa6858361550e565b1115915050612fb4565b5060015b949350505050565b60065474010000000000000000000000000000000000000000900460ff166130265760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b80600081116130775760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b600061308284613931565b336000908152600a6020908152604080832061ffff891684529091529020549091508311156131185760405162461bcd60e51b8152602060048201526024808201527f526571756573746564207174792065786365656473206f776e6564207175616e60448201527f74697479000000000000000000000000000000000000000000000000000000006064820152608401610a06565b8061010001511561315757336000908152600a6020908152604080832061ffff881684529091528120805485929061315190849061579c565b90915550505b6040805161ffff8616815233602082015280820185905290517f092211df311fc0c931c057e151adc257d33cb44b549de2f4e546555953de755b9181900360600190a150505050565b6131a933613db6565b6131f55760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600c602052826000526040600020602052816000526040600020818154811061325757600080fd5b9060005260206000200160009250925050505481565b60065474010000000000000000000000000000000000000000900460ff166132d75760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b83600081116133285760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b600061333387613931565b905060008160800151600381111561334d5761334d61524e565b146133c05760405162461bcd60e51b815260206004820152602c60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f00000000000000000000000000000000000000006064820152608401610a06565b6133cb878288613c4c565b6133d6818888613cff565b6133e08484613ed6565b6004546001600160a01b0316636cce000c86356134006020890189615590565b61340d60408b018b615590565b3360c089015161341d908f6155f5565b6040518863ffffffff1660e01b815260040161343f979695949392919061567b565b600060405180830381600087803b15801561345957600080fd5b505af115801561346d573d6000803e3d6000fd5b5050505061ffff87166000908152600960205260408120805488929061349490849061550e565b90915550869050600a600033611381565b60065474010000000000000000000000000000000000000000900460ff1661350f5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b600061351a87613931565b90506000816080015160038111156135345761353461524e565b146135a75760405162461bcd60e51b815260206004820152602c60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f00000000000000000000000000000000000000006064820152608401610a06565b612d4d878284613c4c565b60065474010000000000000000000000000000000000000000900460ff1661361c5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b600061362784613931565b90506001816080015160038111156136415761364161524e565b146136b45760405162461bcd60e51b815260206004820152602d60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f65642077697468204574686572000000000000000000000000000000000000006064820152608401610a06565b6136bf848284613c4c565b6136c98183613d58565b6136d4818584613cff565b612061848484614910565b60065474010000000000000000000000000000000000000000900460ff166137495760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b836000811161379a5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b60006137a587613931565b90506002816080015160038111156137bf576137bf61524e565b146138325760405162461bcd60e51b815260206004820152603660248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f20616e64204574686572000000000000000000006064820152608401610a06565b61383d878288613c4c565b613848818888613cff565b6133d68187613d58565b6000546001600160a01b031633146138ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a06565b6001600160a01b0381166139285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a06565b610e8f816148a8565b6139d0604080516101e08101825260006101a082018181526101c083018290528252825160808082018552828252602080830184905282860184905260608084018590529085019290925293830181905282018190529091820190815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200160008152602001600081525090565b60065461ffff76010000000000000000000000000000000000000000000090910481169083161115613a445760405162461bcd60e51b815260206004820152600e60248201527f496e76616c6964206974656d49640000000000000000000000000000000000006044820152606401610a06565b61ffff821660009081526008602090815260409182902082516101e081018452815460ff80821615156101a0840190815261010092839004821615156101c0850152835285516080810187526001850154821681526002850154818701526003850154808316151582890152929092041615156060820152928101929092526004810180549293919291840191613ada906157e8565b80601f0160208091040260200160405190810160405280929190818152602001828054613b06906157e8565b8015613b535780601f10613b2857610100808354040283529160200191613b53565b820191906000526020600020905b815481529060010190602001808311613b3657829003601f168201915b505050918352505060058201546020820152600682015460409091019060ff166003811115613b8457613b8461524e565b6003811115613b9557613b9561524e565b8152600782015460208201526008820154604082015260098201546060820152600a82015460ff808216151560808401526101008083048216151560a08501526201000090920416151560c0830152600b83015460e0830152600c90920154910152610140810151909150611bcd5760405162461bcd60e51b815260206004820152600d60248201527f496e616374697665206974656d000000000000000000000000000000000000006044820152606401610a06565b613c568282612827565b613ca25760405162461bcd60e51b815260206004820152601960248201527f45786365656473207472616e73616374696f6e206c696d6974000000000000006044820152606401610a06565b613cae83838333612f04565b613cfa5760405162461bcd60e51b815260206004820152601560248201527f457863656564732061646472657373206c696d697400000000000000000000006044820152606401610a06565b505050565b613d098383613e07565b811115613cfa5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320617661696c61626c65207175616e746974790000000000006044820152606401610a06565b808260a00151613d6891906155f5565b341461158e5760405162461bcd60e51b815260206004820152601060248201527f496e636f727265637420616d6f756e74000000000000000000000000000000006044820152606401610a06565b600080546001600160a01b0383811691161480612848575060035460ff16801561284857506001546001600160a01b03838116911614806128485750506002546001600160a01b0390811691161490565b600080836101200151613ea85760065460608501516040517f9d7f4ebf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691639d7f4ebf91613e649160040190815260200190565b602060405180830381865afa158015613e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ea591906156c8565b90505b61ffff831660009081526009602052604090205460e0850151613ecc90839061579c565b612fb4919061579c565b801561158e576005546001600160a01b031663070ffee33384846040518463ffffffff1660e01b8152600401613f0e93929190615856565b600060405180830381600087803b158015613f2857600080fd5b505af1158015613f3c573d6000803e3d6000fd5b505050505050565b60008160e0015111613f985760405162461bcd60e51b815260206004820152601e60248201527f546f74616c20617661696c61626c652063616e6e6f74206265207a65726f00006044820152606401610a06565b8060200151606001518015613fb257508061016001516001145b156140255760405162461bcd60e51b815260206004820152603260248201527f537461636b61626c65206974656d732063616e6e6f742068617665207065722d60448201527f61646472657373206c696d6974206f66203100000000000000000000000000006064820152608401610a06565b806101200151156140ab576000816040015151116140ab5760405162461bcd60e51b815260206004820152602960248201527f4e6f6e2d6d696e7461626c65206974656d7320726571756972652061206d657460448201527f61646174612075726900000000000000000000000000000000000000000000006064820152608401610a06565b806020015160400151156141355760065460208201515160ff75010000000000000000000000000000000000000000009092048216911611156141305760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206170706c696361626c65436f6c6c656374696f6e496400006044820152606401610a06565b6141b1565b60208101515160ff16156141b15760405162461bcd60e51b815260206004820152603660248201527f4e6f6e2d75706772616465206974656d732063616e6e6f74206861766520616e60448201527f206170706c696361626c6520636f6c6c656374696f6e000000000000000000006064820152608401610a06565b6001816080015160038111156141c9576141c961524e565b14156142c05760008160a00151116142485760405162461bcd60e51b8152602060048201526024808201527f4574686572206974656d73206d757374206861766520616e204574686572207060448201527f72696365000000000000000000000000000000000000000000000000000000006064820152608401610a06565b60c081015115610e8f5760405162461bcd60e51b815260206004820152602a60248201527f45746865722d6f6e6c79206974656d732063616e6e6f74206861766520616e2060448201527f41574f4f207072696365000000000000000000000000000000000000000000006064820152608401610a06565b6000816080015160038111156142d8576142d861524e565b14156143f85760a0810151156143565760405162461bcd60e51b815260206004820152602a60248201527f41574f4f2d6f6e6c79206974656d732063616e6e6f74206861766520616e204560448201527f74686572207072696365000000000000000000000000000000000000000000006064820152608401610a06565b670de0b6b3a76400008160c0015161436e91906159c6565b61438090670de0b6b3a76400006155f5565b8160c0015114610e8f5760405162461bcd60e51b815260206004820152602d60248201527f4672616374696f6e616c2041574f4f20657468657220756e697473206172652060448201527f6e6f7420737570706f72746564000000000000000000000000000000000000006064820152608401610a06565b6002816080015160038111156144105761441061524e565b14156144905760008160a00151116143565760405162461bcd60e51b815260206004820152602d60248201527f41574f4f20616e64204574686572206974656d73206d7573742068617665206160448201527f6e204574686572207072696365000000000000000000000000000000000000006064820152608401610a06565b60405162461bcd60e51b815260206004820152601460248201527f4e6f7420696d706c656d656e7465642c207965740000000000000000000000006044820152606401610a06565b82602001516040015161452d5760405162461bcd60e51b815260206004820152601660248201527f4974656d2063616e6e6f74206265206170706c696564000000000000000000006044820152606401610a06565b6020838101515160ff16600090815260079091526040908190205490517f6352211e00000000000000000000000000000000000000000000000000000000815263ffffffff831660048201526001600160a01b0390911690636352211e90602401602060405180830381865afa1580156145ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145cf9190615a01565b6001600160a01b0316336001600160a01b03161461462f5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206170706c69636174696f6e20746f6b656e496400000000006044820152606401610a06565b826020015160600151614707576020808401515160ff166000908152600d8252604080822063ffffffff85168352835280822061ffff861683529092522054156147075760405162461bcd60e51b815260206004820152604a60248201527f537065636966696564206974656d20616c7265616479206170706c696564207460448201527f6f207468652073706563696669656420746f6b656e20616e64206973206e6f7460648201527f20737461636b61626c6500000000000000000000000000000000000000000000608482015260a401610a06565b6020808401510151156147c157600554602084810180515160ff166000908152600783526040908190205491519092015191517f88730d1e0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015263ffffffff851660248201526044810192909252909116906388730d1e90606401600060405180830381600087803b1580156147a857600080fd5b505af11580156147bc573d6000803e3d6000fd5b505050505b6020808401515160ff166000908152600d8252604080822063ffffffff85168352835280822061ffff8616835290925290812080546001929061480590849061550e565b909155505061ffff82166000818152600c6020908152604080832087830180515160ff9081168652918452828520805460018101825590865284862063ffffffff89169101819055905151909116845260078352928190205481519485526001600160a01b0316918401919091528201527f44c309fb21ce6956879f0e32aac00d6b2949bddf851b0e1e6255a019c60d522f9060600160405180910390a1505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061491b84613931565b905060005b828110156149515761493f8286868685818110611f9457611f94615526565b8061494981615763565b915050614920565b5050505050565b82600281019282156149b6579160200282015b828111156149b65781547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384351617825560209092019160019091019061496b565b506149c2929150614a3a565b5090565b8280546149d2906157e8565b90600052602060002090601f0160209004810192826149f457600085556149b6565b82601f10614a0d57805160ff19168380011785556149b6565b828001600101855582156149b6579182015b828111156149b6578251825591602001919060010190614a1f565b5b808211156149c25760008155600101614a3b565b803561ffff81168114611bcd57600080fd5b60008060408385031215614a7457600080fd5b614a7d83614a4f565b946020939093013593505050565b600060408284031215614a9d57600080fd5b82604083011115614aad57600080fd5b50919050565b803560ff81168114611bcd57600080fd5b600060208284031215614ad657600080fd5b610eaa82614ab3565b6001600160a01b0381168114610e8f57600080fd5b600060208284031215614b0657600080fd5b8135610eaa81614adf565b600060208284031215614b2357600080fd5b5035919050565b600060208284031215614b3c57600080fd5b610eaa82614a4f565b600060608284031215614aad57600080fd5b60008083601f840112614b6957600080fd5b50813567ffffffffffffffff811115614b8157600080fd5b6020830191508360208260051b8501011115614b9c57600080fd5b9250929050565b600080600080600060808688031215614bbb57600080fd5b614bc486614a4f565b945060208601359350604086013567ffffffffffffffff80821115614be857600080fd5b614bf489838a01614b45565b94506060880135915080821115614c0a57600080fd5b50614c1788828901614b57565b969995985093965092949392505050565b60008060408385031215614c3b57600080fd5b8235614c4681614adf565b9150614c5460208401614a4f565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614cb057614cb0614c5d565b60405290565b8015158114610e8f57600080fd5b8035611bcd81614cb6565b600060408284031215614ce157600080fd5b6040516040810181811067ffffffffffffffff82111715614d0457614d04614c5d565b6040529050808235614d1581614cb6565b81526020830135614d2581614cb6565b6020919091015292915050565b600060808284031215614d4457600080fd5b6040516080810181811067ffffffffffffffff82111715614d6757614d67614c5d565b604052905080614d7683614ab3565b8152602083013560208201526040830135614d9081614cb6565b60408201526060830135614da381614cb6565b6060919091015292915050565b600082601f830112614dc157600080fd5b813567ffffffffffffffff80821115614ddc57614ddc614c5d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614e2257614e22614c5d565b81604052838152866020858801011115614e3b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560048110611bcd57600080fd5b60006102208284031215614e7d57600080fd5b614e85614c8c565b9050614e918383614ccf565b8152614ea08360408401614d32565b602082015260c082013567ffffffffffffffff811115614ebf57600080fd5b614ecb84828501614db0565b60408301525060e08201356060820152610100614ee9818401614e5b565b60808301526101208084013560a08401526101408085013560c08501526101608086013560e0860152610180614f20818801614cc4565b85870152614f316101a08801614cc4565b84870152614f426101c08801614cc4565b838701526101e08701358287015261020087013581870152505050505092915050565b600060208284031215614f7757600080fd5b813567ffffffffffffffff811115614f8e57600080fd5b612fb484828501614e6a565b600080600060408486031215614faf57600080fd5b614fb884614a4f565b9250602084013567ffffffffffffffff811115614fd457600080fd5b614fe086828701614b57565b9497909650939450505050565b803563ffffffff81168114611bcd57600080fd5b60008060006060848603121561501657600080fd5b61501f84614ab3565b925061502d60208501614fed565b915061503b60408501614a4f565b90509250925092565b6000806040838503121561505757600080fd5b61506083614a4f565b9150602083013561507081614cb6565b809150509250929050565b6000806040838503121561508e57600080fd5b61509783614a4f565b9150602083013567ffffffffffffffff8111156150b357600080fd5b6150bf85828601614e6a565b9150509250929050565b600080604083850312156150dc57600080fd5b823567ffffffffffffffff8111156150f357600080fd5b6150ff85828601614e6a565b95602094909401359450505050565b6000806000806060858703121561512457600080fd5b61512d85614ab3565b935061513b60208601614a4f565b9250604085013567ffffffffffffffff81111561515757600080fd5b61516387828801614b57565b95989497509550505050565b600081518084526020808501945080840160005b8381101561519f57815187529582019590820190600101615183565b509495945050505050565b6040815260006151bd604083018561516f565b82810360208401526151cf818561516f565b95945050505050565b60005b838110156151f35781810151838201526020016151db565b838111156120615750506000910152565b6000815180845261521c8160208601602086016151d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106152b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8d51151581526020808f015115159082015260ff8d5116604082015260208d0151606082015260408d01511515608082015260608d0151151560a082015261022060c0820152600061530e61022083018e615204565b90508b60e083015261532461010083018c61527d565b89610120830152886101408301528761016083015261534861018083018815159052565b8515156101a08301528415156101c08301526101e082019390935261020001529b9a5050505050505050505050565b6000806000806000806080878903121561539057600080fd5b61539987614a4f565b9550602087013567ffffffffffffffff808211156153b657600080fd5b6153c28a838b01614b45565b965060408901359150808211156153d857600080fd5b6153e48a838b01614b57565b909650945060608901359150808211156153fd57600080fd5b5061540a89828a01614b57565b979a9699509497509295939492505050565b60006020828403121561542e57600080fd5b8135610eaa81614cb6565b6000806000806080858703121561544f57600080fd5b61545885614a4f565b9350602085013567ffffffffffffffff81111561547457600080fd5b61548087828801614e6a565b93505060408501359150606085013561549881614adf565b939692955090935050565b6000806000606084860312156154b857600080fd5b6154c184614a4f565b92506154cf60208501614ab3565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615521576155216154df565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff821680615568576155686154df565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155c557600080fd5b83018035915067ffffffffffffffff8211156155e057600080fd5b602001915036819003821315614b9c57600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561562d5761562d6154df565b500290565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815260a06020820152600061569560a08301888a615632565b82810360408401526156a8818789615632565b6001600160a01b0395909516606084015250506080015295945050505050565b6000602082840312156156da57600080fd5b5051919050565b6000602082840312156156f357600080fd5b8151610eaa81614cb6565b825115158152602080840151151590820152606060408201526000612fb46060830184615204565b600061ffff8083168181141561573e5761573e6154df565b6001019392505050565b60006020828403121561575a57600080fd5b610eaa82614fed565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615795576157956154df565b5060010190565b6000828210156157ae576157ae6154df565b500390565b600082516157c58184602087016151d8565b9190910192915050565b828152604060208201526000612fb46040830184615204565b600181811c908216806157fc57607f821691505b60208210811415614aad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060ff821660ff81141561584d5761584d6154df565b60010192915050565b6001600160a01b03848116825260406020808401829052838201859052600092606091828601600588811b880185018a885b8b8110156159b4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b840301855281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18e36030181126158e957600080fd5b8d01838a0181356158f981614adf565b8916855281880135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261593257600080fd5b8201803567ffffffffffffffff81111561594b57600080fd5b80881b360384131561595c57600080fd5b868a018d9052918290528a860192508801906000905b8082101561599f5763ffffffff61598884614fed565b168452928901929189019160019190910190615972565b50505094860194925090850190600101615888565b50909c9b505050505050505050505050565b6000826159fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615a1357600080fd5b8151610eaa81614adf56fea2646970667358221220dc9206b563bed21b7dd9fabfe834b5c0b833bfc066be200c175cbea12f06929364736f6c634300080c00330000000000000000000000005e697c6f5cbebd6ca17bde80d684c226a1e223be000000000000000000000000ffe844169bfc6da1b87c9157f684e18e7f1663ad0000000000000000000000001ff94eeb38d25cc081be1b4032afb638bc810728
Deployed Bytecode
0x6080604052600436106102fd5760003560e01c806361700ef31161018f578063b2958fba116100e1578063d7f0cbdc1161008a578063eddf758611610064578063eddf758614610935578063f2fde38b14610948578063f563d82e1461096857600080fd5b8063d7f0cbdc146108e2578063e4b064bc14610902578063ebd0f2b71461092257600080fd5b8063d22a092a116100bb578063d22a092a1461086f578063d57f966b1461088f578063d684dbd8146108c257600080fd5b8063b2958fba1461080f578063bc1f793f1461082f578063c71ab3c51461084f57600080fd5b80638bbf9ef611610143578063a174e77a1161011d578063a174e77a146107aa578063a235ea27146107dc578063acec338a146107ef57600080fd5b80638bbf9ef6146107255780638da5cb5b146107535780639ab199771461077157600080fd5b80636bfb0d01116101745780636bfb0d01146106bb57806370cd3f84146106f0578063715018a61461071057600080fd5b806361700ef31461067b5780636b3bc1e31461069b57600080fd5b80633218d7bb1161025357806347f2e27a116101fc5780635433d350116101d65780635433d350146105fd5780635ce628b01461061d5780635f3002ba1461065b57600080fd5b806347f2e27a1461057b5780634fb9f912146105bd5780634fcd3a71146105ea57600080fd5b80633ab1a4941161022d5780633ab1a494146104f0578063405402c21461051057806347c5dc0c1461054857600080fd5b80633218d7bb1461049d57806336bd4b4a146104bd57806339708905146104dd57600080fd5b806320be2759116102b55780632f5315681161028f5780632f5315681461042f5780632fcc503b1461045d57806330c8d9df1461047d57600080fd5b806320be2759146103cf57806325609d6f146103ef5780632e1a7d4d1461040f57600080fd5b80630d9014e7116102e65780630d9014e7146103375780631581b6001461038a57806315e32e08146103af57600080fd5b80630604c672146103025780630a6f94fc14610317575b600080fd5b610315610310366004614a61565b6109a0565b005b34801561032357600080fd5b50610315610332366004614a8b565b610c5e565b34801561034357600080fd5b5061036d610352366004614ac4565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561039657600080fd5b5060035461036d9061010090046001600160a01b031681565b3480156103bb57600080fd5b506103156103ca366004614af4565b610d25565b3480156103db57600080fd5b5060045461036d906001600160a01b031681565b3480156103fb57600080fd5b5060055461036d906001600160a01b031681565b34801561041b57600080fd5b5061031561042a366004614b11565b610db4565b34801561043b57600080fd5b5061044f61044a366004614b2a565b610e92565b604051908152602001610381565b34801561046957600080fd5b50610315610478366004614ac4565b610eb1565b34801561048957600080fd5b50610315610498366004614af4565b610ff9565b3480156104a957600080fd5b506103156104b8366004614ba3565b611088565b3480156104c957600080fd5b506103156104d8366004614af4565b6113d7565b6103156104eb366004614a61565b611592565b3480156104fc57600080fd5b5061031561050b366004614af4565b611739565b34801561051c57600080fd5b5061044f61052b366004614c28565b600a60209081526000928352604080842090915290825290205481565b34801561055457600080fd5b50610568610563366004614f65565b611849565b60405161ffff9091168152602001610381565b34801561058757600080fd5b506006546105ad9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610381565b3480156105c957600080fd5b5061044f6105d8366004614b2a565b60096020526000908152604090205481565b6103156105f8366004614ba3565b611bd2565b34801561060957600080fd5b50610315610618366004614f9a565b611d98565b34801561062957600080fd5b5061044f610638366004615001565b600d60209081526000938452604080852082529284528284209052825290205481565b34801561066757600080fd5b50610315610676366004614f9a565b612067565b34801561068757600080fd5b50610315610696366004615044565b6121e0565b3480156106a757600080fd5b506103156106b636600461507b565b612306565b3480156106c757600080fd5b5060065461056890760100000000000000000000000000000000000000000000900461ffff1681565b3480156106fc57600080fd5b506105ad61070b3660046150c9565b612827565b34801561071c57600080fd5b5061031561284e565b34801561073157600080fd5b5061074561074036600461510e565b6128b4565b6040516103819291906151aa565b34801561075f57600080fd5b506000546001600160a01b031661036d565b34801561077d57600080fd5b5061079161078c366004614b2a565b612a01565b6040516103819d9c9b9a999897969594939291906152b8565b3480156107b657600080fd5b506107ca6107c5366004614af4565b612b4e565b60405160ff9091168152602001610381565b6103156107ea366004615377565b612c36565b3480156107fb57600080fd5b5061031561080a36600461541c565b612e07565b34801561081b57600080fd5b506105ad61082a366004615439565b612f04565b34801561083b57600080fd5b5061031561084a366004614a61565b612fbc565b34801561085b57600080fd5b5061031561086a366004614af4565b6131a0565b34801561087b57600080fd5b5061044f61088a3660046154a3565b61322f565b34801561089b57600080fd5b506006546107ca907501000000000000000000000000000000000000000000900460ff1681565b3480156108ce57600080fd5b506103156108dd366004614ba3565b61326d565b3480156108ee57600080fd5b5060065461036d906001600160a01b031681565b34801561090e57600080fd5b5061031561091d366004615377565b6134a5565b610315610930366004614f9a565b6135b2565b610315610943366004614ba3565b6136df565b34801561095457600080fd5b50610315610963366004614af4565b613852565b34801561097457600080fd5b5061044f610983366004614c28565b600b60209081526000928352604080842090915290825290205481565b60065474010000000000000000000000000000000000000000900460ff16610a0f5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064015b60405180910390fd5b8060008111610a605760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b6000610a6b84613931565b905080610120015115610ac05760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c6500006044820152606401610a06565b600181608001516003811115610ad857610ad861524e565b14610b4b5760405162461bcd60e51b815260206004820152602d60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f65642077697468204574686572000000000000000000000000000000000000006064820152608401610a06565b610b56848285613c4c565b610b61818585613cff565b610b6b8184613d58565b6006546001600160a01b031663156e29f63360608401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260448101869052606401600060405180830381600087803b158015610be757600080fd5b505af1158015610bfb573d6000803e3d6000fd5b5050505082600b6000610c0b3390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008661ffff1661ffff1681526020019081526020016000206000828254610c53919061550e565b909155505050505050565b6000610c6d6020830183614af4565b6001600160a01b031614158015610c9d57506000610c916040830160208401614af4565b6001600160a01b031614155b610ce95760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e206164647265737300000000000000000000006044820152606401610a06565b610cf66001826002614958565b5050600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610d2e33613db6565b610d7a5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610dbd33613db6565b610e095760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b47811115610e595760405162461bcd60e51b815260206004820152601660248201527f416d6f756e7420657863656564732062616c616e6365000000000000000000006044820152606401610a06565b6003546040516101009091046001600160a01b0316906108fc8315029083906000818181858888f19350505050610e8f57600080fd5b50565b600080610e9e83613931565b9050610eaa8184613e07565b9392505050565b610eba33613db6565b610f065760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b60065460ff750100000000000000000000000000000000000000000090910481169082161115610f785760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420636f6c6c656374696f6e49640000000000000000000000006044820152606401610a06565b60ff808216600090815260076020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556006805475010000000000000000000000000000000000000000009004909116906015610fdd83615555565b91906101000a81548160ff021916908360ff1602179055505050565b61100233613db6565b61104e5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60065474010000000000000000000000000000000000000000900460ff166110f25760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b83600081116111435760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b600061114e87613931565b9050806101200151156111a35760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c6500006044820152606401610a06565b6000816080015160038111156111bb576111bb61524e565b1461122e5760405162461bcd60e51b815260206004820152602c60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f00000000000000000000000000000000000000006064820152608401610a06565b611239878288613c4c565b611244818888613cff565b61124e8484613ed6565b6004546001600160a01b0316636cce000c863561126e6020890189615590565b61127b60408b018b615590565b3360c089015161128b908f6155f5565b6040518863ffffffff1660e01b81526004016112ad979695949392919061567b565b600060405180830381600087803b1580156112c757600080fd5b505af11580156112db573d6000803e3d6000fd5b50506006546001600160a01b0316915063156e29f690503360608401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260448101899052606401600060405180830381600087803b15801561135d57600080fd5b505af1158015611371573d6000803e3d6000fd5b5050505085600b60006113813390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008961ffff1661ffff16815260200190815260200160002060008282546113c9919061550e565b909155505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145b91906156c8565b9050600081116114ad5760405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420686173206e6f2062616c616e63650000000000000000006044820152606401610a06565b6003546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b0390811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af115801561151e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154291906156e1565b61158e5760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610a06565b5050565b60065474010000000000000000000000000000000000000000900460ff166115fc5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b806000811161164d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b600061165884613931565b90506001816080015160038111156116725761167261524e565b146116e55760405162461bcd60e51b815260206004820152602d60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f65642077697468204574686572000000000000000000000000000000000000006064820152608401610a06565b6116f0848285613c4c565b6116fb818585613cff565b6117058184613d58565b61ffff84166000908152600960205260408120805485929061172890849061550e565b90915550839050600a600033610c0b565b61174233613db6565b61178e5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b6001600160a01b03811661180a5760405162461bcd60e51b815260206004820152602b60248201527f576974686472617720616464726573732063616e6e6f7420626520746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610a06565b600380546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b600061185433613db6565b6118a05760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b6118a982613f44565b81610120015161194c57600654825160408085015190517f4d451c070000000000000000000000000000000000000000000000000000000081526000936001600160a01b031692634d451c0792611902926004016156fe565b6020604051808303816000875af1158015611921573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194591906156c8565b6060840152505b81600860006006601681819054906101000a900461ffff1661196d90615726565b825461ffff91821661010093840a81810293021990911691909117909255908252602080830193909352604091820160002084518051825491860151151584027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff91151582167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009384161717835586860151805160018501805460ff929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0092909216919091179055808701516002850155808601516003850180546060909301511515909602901515909216921691909117179091559083015180519192611a80926004850192909101906149c6565b506060820151600582015560808201516006820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836003811115611acc57611acc61524e565b021790555060a0820151600782015560c0820151600882015560e0820151600982015561010080830151600a830180546101208601516101408701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009092169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1693909317921515909302919091177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000092151592909202919091179055610160820151600b82015561018090910151600c9091015550600654760100000000000000000000000000000000000000000000900461ffff165b919050565b60065474010000000000000000000000000000000000000000900460ff16611c3c5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b8360008111611c8d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b6000611c9887613931565b905080610120015115611ced5760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c6500006044820152606401610a06565b600281608001516003811115611d0557611d0561524e565b14611d785760405162461bcd60e51b815260206004820152603660248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f20616e64204574686572000000000000000000006064820152608401610a06565b611d83878288613c4c565b611d8e818888613cff565b6112448187613d58565b60065474010000000000000000000000000000000000000000900460ff16611e025760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b6000611e0d84613931565b905080610120015115611e625760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c6500006044820152606401610a06565b6006546001600160a01b031662fdd58e3360608401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611ed9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efd91906156c8565b821115611f725760405162461bcd60e51b815260206004820152602b60248201527f526571756573746564206170706c69636174696f6e207174792065786365656460448201527f73206f776e6564207174790000000000000000000000000000000000000000006064820152608401610a06565b60005b82811015611fc057611fae8286868685818110611f9457611f94615526565b9050602002016020810190611fa99190615748565b6144d8565b80611fb881615763565b915050611f75565b5080610100015115612061576006546001600160a01b031663f5298aca33606084015160405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039092166004830152602482015260448101859052606401600060405180830381600087803b15801561204857600080fd5b505af115801561205c573d6000803e3d6000fd5b505050505b50505050565b60065474010000000000000000000000000000000000000000900460ff166120d15760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b60006120dc84613931565b336000908152600a6020908152604080832061ffff891684529091529020549091508211156121725760405162461bcd60e51b8152602060048201526024808201527f526571756573746564207174792065786365656473206f776e6564207175616e60448201527f74697479000000000000000000000000000000000000000000000000000000006064820152608401610a06565b60005b828110156121a6576121948286868685818110611f9457611f94615526565b8061219e81615763565b915050612175565b508061010001511561206157336000908152600a6020908152604080832061ffff8816845290915281208054849290610c5390849061579c565b6121e933613db6565b6122355760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b60008261ffff1611801561226d575060065461ffff760100000000000000000000000000000000000000000000909104811690831611155b6122b95760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964204974656d20496400000000000000000000000000000000006044820152606401610a06565b61ffff9091166000908152600860205260409020600a01805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b61230f33613db6565b61235b5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b61236481613f44565b600061236f83613931565b905081610120015115158161012001511515146123ce5760405162461bcd60e51b815260206004820152601e60248201527f4974656d206d696e746162696c6974792063616e6e6f74206368616e676500006044820152606401610a06565b6123d88184613e07565b8260e0015111156124515760405162461bcd60e51b815260206004820152603760248201527f507572636861736564207175616e746974792065786365656473206e6577207460448201527f6f74616c20617661696c61626c65207175616e746974790000000000000000006064820152608401610a06565b8061012001516125fd57606080820151908301526040808201515190830151511415806124d25750806040015160405160200161248e91906157b3565b6040516020818303038152906040528051906020012082604001516040516020016124b991906157b3565b6040516020818303038152906040528051906020012014155b1561255d57600654606082015160408085015190517f57f7789e0000000000000000000000000000000000000000000000000000000081526001600160a01b03909316926357f7789e9261252a9290916004016157cf565b600060405180830381600087803b15801561254457600080fd5b505af1158015612558573d6000803e3d6000fd5b505050505b80610140015115158261014001511515146125fd5760065460608201516101408401516040517fffc54ea40000000000000000000000000000000000000000000000000000000081526004810192909252151560248201526001600160a01b039091169063ffc54ea490604401600060405180830381600087803b1580156125e457600080fd5b505af11580156125f8573d6000803e3d6000fd5b505050505b61ffff83166000908152600860209081526040918290208451805182549184015115156101009081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff92151583167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009485161717845584880151805160018601805460ff929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00929092169190911790558086015160028601558087015160038601805460609093015115159093029015159093169316929092171790559184015180518593926126f89260048501929101906149c6565b506060820151600582015560808201516006820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360038111156127445761274461524e565b021790555060a0820151600782015560c0820151600882015560e0820151600982015561010080830151600a830180546101208601516101408701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009092169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1693909317921515909302919091177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000092151592909202919091179055610160820151600b82015561018090910151600c90910155505050565b610180820151600090156128445750610180820151811115612848565b5060015b92915050565b6000546001600160a01b031633146128a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a06565b6128b260006148a8565b565b60608060008367ffffffffffffffff8111156128d2576128d2614c5d565b6040519080825280602002602001820160405280156128fb578160200160208202803683370190505b50905060008467ffffffffffffffff81111561291957612919614c5d565b604051908082528060200260200182016040528015612942578160200160208202803683370190505b50905060005b858110156129f357600087878381811061296457612964615526565b9050602002013590508063ffffffff1684838151811061298657612986615526565b60209081029190910181019190915260ff8b166000908152600d8252604080822063ffffffff85168352835280822061ffff8d168352909252205483518490849081106129d5576129d5615526565b602090810291909101015250806129eb81615763565b915050612948565b509097909650945050505050565b60086020908152600091825260409182902082518084018452815460ff8082161515835261010091829004811615158386015285516080810187526001850154821681526002850154958101959095526003840154808216151596860196909652940490931615156060830152600481018054612a7d906157e8565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa9906157e8565b8015612af65780601f10612acb57610100808354040283529160200191612af6565b820191906000526020600020905b815481529060010190602001808311612ad957829003601f168201915b50505060058401546006850154600786015460088701546009880154600a890154600b8a0154600c909a01549899959860ff95861698509396509194909382811693610100840482169362010000900490911691908d565b6000612b5933613db6565b612ba55760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b60068054601590612bd1907501000000000000000000000000000000000000000000900460ff16615836565b825460ff8083166101009490940a84810291021990911617909255600090815260076020526040902080546001600160a01b039094167fffffffffffffffffffffffff0000000000000000000000000000000000000000909416939093179092555090565b60065474010000000000000000000000000000000000000000900460ff16612ca05760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b6000612cab87613931565b9050600281608001516003811115612cc557612cc561524e565b14612d385760405162461bcd60e51b815260206004820152603660248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f20616e64204574686572000000000000000000006064820152608401610a06565b612d43878284613c4c565b612d4d8183613d58565b612d58818884613cff565b612d628585613ed6565b6004546001600160a01b0316636cce000c8735612d8260208a018a615590565b612d8f60408c018c615590565b3360c0890151612d9f908b6155f5565b6040518863ffffffff1660e01b8152600401612dc1979695949392919061567b565b600060405180830381600087803b158015612ddb57600080fd5b505af1158015612def573d6000803e3d6000fd5b50505050612dfe878484614910565b50505050505050565b612e1033613db6565b612e5c5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b8015612eba576006546001600160a01b0316612eba5760405162461bcd60e51b815260206004820181905260248201527f41776f6f20636f6c6c656374696f6e20686173206e6f74206265656e207365746044820152606401610a06565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61016083015160009015612fb0576000846101200151612f6a576001600160a01b0383166000818152600b6020908152604080832061ffff8b1680855290835281842054948452600a8352818420908452909152902054612f65919061550e565b612f93565b6001600160a01b0383166000908152600a6020908152604080832061ffff8a1684529091529020545b610160860151909150612fa6858361550e565b1115915050612fb4565b5060015b949350505050565b60065474010000000000000000000000000000000000000000900460ff166130265760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b80600081116130775760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b600061308284613931565b336000908152600a6020908152604080832061ffff891684529091529020549091508311156131185760405162461bcd60e51b8152602060048201526024808201527f526571756573746564207174792065786365656473206f776e6564207175616e60448201527f74697479000000000000000000000000000000000000000000000000000000006064820152608401610a06565b8061010001511561315757336000908152600a6020908152604080832061ffff881684529091528120805485929061315190849061579c565b90915550505b6040805161ffff8616815233602082015280820185905290517f092211df311fc0c931c057e151adc257d33cb44b549de2f4e546555953de755b9181900360600190a150505050565b6131a933613db6565b6131f55760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e00000000000000000000006044820152606401610a06565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600c602052826000526040600020602052816000526040600020818154811061325757600080fd5b9060005260206000200160009250925050505481565b60065474010000000000000000000000000000000000000000900460ff166132d75760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b83600081116133285760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b600061333387613931565b905060008160800151600381111561334d5761334d61524e565b146133c05760405162461bcd60e51b815260206004820152602c60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f00000000000000000000000000000000000000006064820152608401610a06565b6133cb878288613c4c565b6133d6818888613cff565b6133e08484613ed6565b6004546001600160a01b0316636cce000c86356134006020890189615590565b61340d60408b018b615590565b3360c089015161341d908f6155f5565b6040518863ffffffff1660e01b815260040161343f979695949392919061567b565b600060405180830381600087803b15801561345957600080fd5b505af115801561346d573d6000803e3d6000fd5b5050505061ffff87166000908152600960205260408120805488929061349490849061550e565b90915550869050600a600033611381565b60065474010000000000000000000000000000000000000000900460ff1661350f5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b600061351a87613931565b90506000816080015160038111156135345761353461524e565b146135a75760405162461bcd60e51b815260206004820152602c60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f00000000000000000000000000000000000000006064820152608401610a06565b612d4d878284613c4c565b60065474010000000000000000000000000000000000000000900460ff1661361c5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b600061362784613931565b90506001816080015160038111156136415761364161524e565b146136b45760405162461bcd60e51b815260206004820152602d60248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f65642077697468204574686572000000000000000000000000000000000000006064820152608401610a06565b6136bf848284613c4c565b6136c98183613d58565b6136d4818584613cff565b612061848484614910565b60065474010000000000000000000000000000000000000000900460ff166137495760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f742061637469766500000000000000006044820152606401610a06565b836000811161379a5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610a06565b60006137a587613931565b90506002816080015160038111156137bf576137bf61524e565b146138325760405162461bcd60e51b815260206004820152603660248201527f537065636966696564206974656d2063616e6e6f74206265207075726368617360448201527f656420776974682041574f4f20616e64204574686572000000000000000000006064820152608401610a06565b61383d878288613c4c565b613848818888613cff565b6133d68187613d58565b6000546001600160a01b031633146138ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a06565b6001600160a01b0381166139285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a06565b610e8f816148a8565b6139d0604080516101e08101825260006101a082018181526101c083018290528252825160808082018552828252602080830184905282860184905260608084018590529085019290925293830181905282018190529091820190815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200160008152602001600081525090565b60065461ffff76010000000000000000000000000000000000000000000090910481169083161115613a445760405162461bcd60e51b815260206004820152600e60248201527f496e76616c6964206974656d49640000000000000000000000000000000000006044820152606401610a06565b61ffff821660009081526008602090815260409182902082516101e081018452815460ff80821615156101a0840190815261010092839004821615156101c0850152835285516080810187526001850154821681526002850154818701526003850154808316151582890152929092041615156060820152928101929092526004810180549293919291840191613ada906157e8565b80601f0160208091040260200160405190810160405280929190818152602001828054613b06906157e8565b8015613b535780601f10613b2857610100808354040283529160200191613b53565b820191906000526020600020905b815481529060010190602001808311613b3657829003601f168201915b505050918352505060058201546020820152600682015460409091019060ff166003811115613b8457613b8461524e565b6003811115613b9557613b9561524e565b8152600782015460208201526008820154604082015260098201546060820152600a82015460ff808216151560808401526101008083048216151560a08501526201000090920416151560c0830152600b83015460e0830152600c90920154910152610140810151909150611bcd5760405162461bcd60e51b815260206004820152600d60248201527f496e616374697665206974656d000000000000000000000000000000000000006044820152606401610a06565b613c568282612827565b613ca25760405162461bcd60e51b815260206004820152601960248201527f45786365656473207472616e73616374696f6e206c696d6974000000000000006044820152606401610a06565b613cae83838333612f04565b613cfa5760405162461bcd60e51b815260206004820152601560248201527f457863656564732061646472657373206c696d697400000000000000000000006044820152606401610a06565b505050565b613d098383613e07565b811115613cfa5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320617661696c61626c65207175616e746974790000000000006044820152606401610a06565b808260a00151613d6891906155f5565b341461158e5760405162461bcd60e51b815260206004820152601060248201527f496e636f727265637420616d6f756e74000000000000000000000000000000006044820152606401610a06565b600080546001600160a01b0383811691161480612848575060035460ff16801561284857506001546001600160a01b03838116911614806128485750506002546001600160a01b0390811691161490565b600080836101200151613ea85760065460608501516040517f9d7f4ebf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691639d7f4ebf91613e649160040190815260200190565b602060405180830381865afa158015613e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ea591906156c8565b90505b61ffff831660009081526009602052604090205460e0850151613ecc90839061579c565b612fb4919061579c565b801561158e576005546001600160a01b031663070ffee33384846040518463ffffffff1660e01b8152600401613f0e93929190615856565b600060405180830381600087803b158015613f2857600080fd5b505af1158015613f3c573d6000803e3d6000fd5b505050505050565b60008160e0015111613f985760405162461bcd60e51b815260206004820152601e60248201527f546f74616c20617661696c61626c652063616e6e6f74206265207a65726f00006044820152606401610a06565b8060200151606001518015613fb257508061016001516001145b156140255760405162461bcd60e51b815260206004820152603260248201527f537461636b61626c65206974656d732063616e6e6f742068617665207065722d60448201527f61646472657373206c696d6974206f66203100000000000000000000000000006064820152608401610a06565b806101200151156140ab576000816040015151116140ab5760405162461bcd60e51b815260206004820152602960248201527f4e6f6e2d6d696e7461626c65206974656d7320726571756972652061206d657460448201527f61646174612075726900000000000000000000000000000000000000000000006064820152608401610a06565b806020015160400151156141355760065460208201515160ff75010000000000000000000000000000000000000000009092048216911611156141305760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206170706c696361626c65436f6c6c656374696f6e496400006044820152606401610a06565b6141b1565b60208101515160ff16156141b15760405162461bcd60e51b815260206004820152603660248201527f4e6f6e2d75706772616465206974656d732063616e6e6f74206861766520616e60448201527f206170706c696361626c6520636f6c6c656374696f6e000000000000000000006064820152608401610a06565b6001816080015160038111156141c9576141c961524e565b14156142c05760008160a00151116142485760405162461bcd60e51b8152602060048201526024808201527f4574686572206974656d73206d757374206861766520616e204574686572207060448201527f72696365000000000000000000000000000000000000000000000000000000006064820152608401610a06565b60c081015115610e8f5760405162461bcd60e51b815260206004820152602a60248201527f45746865722d6f6e6c79206974656d732063616e6e6f74206861766520616e2060448201527f41574f4f207072696365000000000000000000000000000000000000000000006064820152608401610a06565b6000816080015160038111156142d8576142d861524e565b14156143f85760a0810151156143565760405162461bcd60e51b815260206004820152602a60248201527f41574f4f2d6f6e6c79206974656d732063616e6e6f74206861766520616e204560448201527f74686572207072696365000000000000000000000000000000000000000000006064820152608401610a06565b670de0b6b3a76400008160c0015161436e91906159c6565b61438090670de0b6b3a76400006155f5565b8160c0015114610e8f5760405162461bcd60e51b815260206004820152602d60248201527f4672616374696f6e616c2041574f4f20657468657220756e697473206172652060448201527f6e6f7420737570706f72746564000000000000000000000000000000000000006064820152608401610a06565b6002816080015160038111156144105761441061524e565b14156144905760008160a00151116143565760405162461bcd60e51b815260206004820152602d60248201527f41574f4f20616e64204574686572206974656d73206d7573742068617665206160448201527f6e204574686572207072696365000000000000000000000000000000000000006064820152608401610a06565b60405162461bcd60e51b815260206004820152601460248201527f4e6f7420696d706c656d656e7465642c207965740000000000000000000000006044820152606401610a06565b82602001516040015161452d5760405162461bcd60e51b815260206004820152601660248201527f4974656d2063616e6e6f74206265206170706c696564000000000000000000006044820152606401610a06565b6020838101515160ff16600090815260079091526040908190205490517f6352211e00000000000000000000000000000000000000000000000000000000815263ffffffff831660048201526001600160a01b0390911690636352211e90602401602060405180830381865afa1580156145ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145cf9190615a01565b6001600160a01b0316336001600160a01b03161461462f5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206170706c69636174696f6e20746f6b656e496400000000006044820152606401610a06565b826020015160600151614707576020808401515160ff166000908152600d8252604080822063ffffffff85168352835280822061ffff861683529092522054156147075760405162461bcd60e51b815260206004820152604a60248201527f537065636966696564206974656d20616c7265616479206170706c696564207460448201527f6f207468652073706563696669656420746f6b656e20616e64206973206e6f7460648201527f20737461636b61626c6500000000000000000000000000000000000000000000608482015260a401610a06565b6020808401510151156147c157600554602084810180515160ff166000908152600783526040908190205491519092015191517f88730d1e0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015263ffffffff851660248201526044810192909252909116906388730d1e90606401600060405180830381600087803b1580156147a857600080fd5b505af11580156147bc573d6000803e3d6000fd5b505050505b6020808401515160ff166000908152600d8252604080822063ffffffff85168352835280822061ffff8616835290925290812080546001929061480590849061550e565b909155505061ffff82166000818152600c6020908152604080832087830180515160ff9081168652918452828520805460018101825590865284862063ffffffff89169101819055905151909116845260078352928190205481519485526001600160a01b0316918401919091528201527f44c309fb21ce6956879f0e32aac00d6b2949bddf851b0e1e6255a019c60d522f9060600160405180910390a1505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061491b84613931565b905060005b828110156149515761493f8286868685818110611f9457611f94615526565b8061494981615763565b915050614920565b5050505050565b82600281019282156149b6579160200282015b828111156149b65781547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384351617825560209092019160019091019061496b565b506149c2929150614a3a565b5090565b8280546149d2906157e8565b90600052602060002090601f0160209004810192826149f457600085556149b6565b82601f10614a0d57805160ff19168380011785556149b6565b828001600101855582156149b6579182015b828111156149b6578251825591602001919060010190614a1f565b5b808211156149c25760008155600101614a3b565b803561ffff81168114611bcd57600080fd5b60008060408385031215614a7457600080fd5b614a7d83614a4f565b946020939093013593505050565b600060408284031215614a9d57600080fd5b82604083011115614aad57600080fd5b50919050565b803560ff81168114611bcd57600080fd5b600060208284031215614ad657600080fd5b610eaa82614ab3565b6001600160a01b0381168114610e8f57600080fd5b600060208284031215614b0657600080fd5b8135610eaa81614adf565b600060208284031215614b2357600080fd5b5035919050565b600060208284031215614b3c57600080fd5b610eaa82614a4f565b600060608284031215614aad57600080fd5b60008083601f840112614b6957600080fd5b50813567ffffffffffffffff811115614b8157600080fd5b6020830191508360208260051b8501011115614b9c57600080fd5b9250929050565b600080600080600060808688031215614bbb57600080fd5b614bc486614a4f565b945060208601359350604086013567ffffffffffffffff80821115614be857600080fd5b614bf489838a01614b45565b94506060880135915080821115614c0a57600080fd5b50614c1788828901614b57565b969995985093965092949392505050565b60008060408385031215614c3b57600080fd5b8235614c4681614adf565b9150614c5460208401614a4f565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614cb057614cb0614c5d565b60405290565b8015158114610e8f57600080fd5b8035611bcd81614cb6565b600060408284031215614ce157600080fd5b6040516040810181811067ffffffffffffffff82111715614d0457614d04614c5d565b6040529050808235614d1581614cb6565b81526020830135614d2581614cb6565b6020919091015292915050565b600060808284031215614d4457600080fd5b6040516080810181811067ffffffffffffffff82111715614d6757614d67614c5d565b604052905080614d7683614ab3565b8152602083013560208201526040830135614d9081614cb6565b60408201526060830135614da381614cb6565b6060919091015292915050565b600082601f830112614dc157600080fd5b813567ffffffffffffffff80821115614ddc57614ddc614c5d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614e2257614e22614c5d565b81604052838152866020858801011115614e3b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560048110611bcd57600080fd5b60006102208284031215614e7d57600080fd5b614e85614c8c565b9050614e918383614ccf565b8152614ea08360408401614d32565b602082015260c082013567ffffffffffffffff811115614ebf57600080fd5b614ecb84828501614db0565b60408301525060e08201356060820152610100614ee9818401614e5b565b60808301526101208084013560a08401526101408085013560c08501526101608086013560e0860152610180614f20818801614cc4565b85870152614f316101a08801614cc4565b84870152614f426101c08801614cc4565b838701526101e08701358287015261020087013581870152505050505092915050565b600060208284031215614f7757600080fd5b813567ffffffffffffffff811115614f8e57600080fd5b612fb484828501614e6a565b600080600060408486031215614faf57600080fd5b614fb884614a4f565b9250602084013567ffffffffffffffff811115614fd457600080fd5b614fe086828701614b57565b9497909650939450505050565b803563ffffffff81168114611bcd57600080fd5b60008060006060848603121561501657600080fd5b61501f84614ab3565b925061502d60208501614fed565b915061503b60408501614a4f565b90509250925092565b6000806040838503121561505757600080fd5b61506083614a4f565b9150602083013561507081614cb6565b809150509250929050565b6000806040838503121561508e57600080fd5b61509783614a4f565b9150602083013567ffffffffffffffff8111156150b357600080fd5b6150bf85828601614e6a565b9150509250929050565b600080604083850312156150dc57600080fd5b823567ffffffffffffffff8111156150f357600080fd5b6150ff85828601614e6a565b95602094909401359450505050565b6000806000806060858703121561512457600080fd5b61512d85614ab3565b935061513b60208601614a4f565b9250604085013567ffffffffffffffff81111561515757600080fd5b61516387828801614b57565b95989497509550505050565b600081518084526020808501945080840160005b8381101561519f57815187529582019590820190600101615183565b509495945050505050565b6040815260006151bd604083018561516f565b82810360208401526151cf818561516f565b95945050505050565b60005b838110156151f35781810151838201526020016151db565b838111156120615750506000910152565b6000815180845261521c8160208601602086016151d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106152b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8d51151581526020808f015115159082015260ff8d5116604082015260208d0151606082015260408d01511515608082015260608d0151151560a082015261022060c0820152600061530e61022083018e615204565b90508b60e083015261532461010083018c61527d565b89610120830152886101408301528761016083015261534861018083018815159052565b8515156101a08301528415156101c08301526101e082019390935261020001529b9a5050505050505050505050565b6000806000806000806080878903121561539057600080fd5b61539987614a4f565b9550602087013567ffffffffffffffff808211156153b657600080fd5b6153c28a838b01614b45565b965060408901359150808211156153d857600080fd5b6153e48a838b01614b57565b909650945060608901359150808211156153fd57600080fd5b5061540a89828a01614b57565b979a9699509497509295939492505050565b60006020828403121561542e57600080fd5b8135610eaa81614cb6565b6000806000806080858703121561544f57600080fd5b61545885614a4f565b9350602085013567ffffffffffffffff81111561547457600080fd5b61548087828801614e6a565b93505060408501359150606085013561549881614adf565b939692955090935050565b6000806000606084860312156154b857600080fd5b6154c184614a4f565b92506154cf60208501614ab3565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615521576155216154df565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff821680615568576155686154df565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155c557600080fd5b83018035915067ffffffffffffffff8211156155e057600080fd5b602001915036819003821315614b9c57600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561562d5761562d6154df565b500290565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815260a06020820152600061569560a08301888a615632565b82810360408401526156a8818789615632565b6001600160a01b0395909516606084015250506080015295945050505050565b6000602082840312156156da57600080fd5b5051919050565b6000602082840312156156f357600080fd5b8151610eaa81614cb6565b825115158152602080840151151590820152606060408201526000612fb46060830184615204565b600061ffff8083168181141561573e5761573e6154df565b6001019392505050565b60006020828403121561575a57600080fd5b610eaa82614fed565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615795576157956154df565b5060010190565b6000828210156157ae576157ae6154df565b500390565b600082516157c58184602087016151d8565b9190910192915050565b828152604060208201526000612fb46040830184615204565b600181811c908216806157fc57607f821691505b60208210811415614aad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060ff821660ff81141561584d5761584d6154df565b60010192915050565b6001600160a01b03848116825260406020808401829052838201859052600092606091828601600588811b880185018a885b8b8110156159b4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b840301855281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18e36030181126158e957600080fd5b8d01838a0181356158f981614adf565b8916855281880135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261593257600080fd5b8201803567ffffffffffffffff81111561594b57600080fd5b80881b360384131561595c57600080fd5b868a018d9052918290528a860192508801906000905b8082101561599f5763ffffffff61598884614fed565b168452928901929189019160019190910190615972565b50505094860194925090850190600101615888565b50909c9b505050505050505050505050565b6000826159fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615a1357600080fd5b8151610eaa81614adf56fea2646970667358221220dc9206b563bed21b7dd9fabfe834b5c0b833bfc066be200c175cbea12f06929364736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005e697c6f5cbebd6ca17bde80d684c226a1e223be000000000000000000000000ffe844169bfc6da1b87c9157f684e18e7f1663ad0000000000000000000000001ff94eeb38d25cc081be1b4032afb638bc810728
-----Decoded View---------------
Arg [0] : withdrawAddr (address): 0x5E697C6f5cBEBD6ca17BDE80d684c226A1e223BE
Arg [1] : awooTokenContract (address): 0xFfE844169bFc6dA1B87c9157f684E18E7F1663aD
Arg [2] : claimingContract (address): 0x1fF94eeb38d25Cc081BE1B4032AfB638BC810728
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000005e697c6f5cbebd6ca17bde80d684c226a1e223be
Arg [1] : 000000000000000000000000ffe844169bfc6da1b87c9157f684e18e7f1663ad
Arg [2] : 0000000000000000000000001ff94eeb38d25cc081be1b4032afb638bc810728
Deployed Bytecode Sourcemap
88339:28666:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93102:626;;;;;;:::i;:::-;;:::i;:::-;;9955:212;;;;;;;;;;-1:-1:-1;9955:212:0;;;;;:::i;:::-;;:::i;89837:55::-;;;;;;;;;;-1:-1:-1;89837:55:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;89837:55:0;;;;;;-1:-1:-1;;;;;1203:55:1;;;1185:74;;1173:2;1158:18;89837:55:0;;;;;;;;89217:38;;;;;;;;;;-1:-1:-1;89217:38:0;;;;;;;-1:-1:-1;;;;;89217:38:0;;;114725:175;;;;;;;;;;-1:-1:-1;114725:175:0;;;;;:::i;:::-;;:::i;89262:30::-;;;;;;;;;;-1:-1:-1;89262:30:0;;;;-1:-1:-1;;;;;89262:30:0;;;89299:43;;;;;;;;;;-1:-1:-1;89299:43:0;;;;-1:-1:-1;;;;;89299:43:0;;;116175:202;;;;;;;;;;-1:-1:-1;116175:202:0;;;;;:::i;:::-;;:::i;109728:173::-;;;;;;;;;;-1:-1:-1;109728:173:0;;;;;:::i;:::-;;:::i;:::-;;;3032:25:1;;;3020:2;3005:18;109728:173:0;2886:177:1;107207:237:0;;;;;;;;;;-1:-1:-1;107207:237:0;;;;;:::i;:::-;;:::i;115017:137::-;;;;;;;;;;-1:-1:-1;115017:137:0;;;;;:::i;:::-;;:::i;92100:829::-;;;;;;;;;;-1:-1:-1;92100:829:0;;;;;:::i;:::-;;:::i;116492:276::-;;;;;;;;;;-1:-1:-1;116492:276:0;;;;;:::i;:::-;;:::i;96505:530::-;;;;;;:::i;:::-;;:::i;115965:202::-;;;;;;;;;;-1:-1:-1;115965:202:0;;;;;:::i;:::-;;:::i;90304:76::-;;;;;;;;;;-1:-1:-1;90304:76:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;107516:435;;;;;;;;;;-1:-1:-1;107516:435:0;;;;;:::i;:::-;;:::i;:::-;;;10643:6:1;10631:19;;;10613:38;;10601:2;10586:18;107516:435:0;10469:188:1;89419:23:0;;;;;;;;;;-1:-1:-1;89419:23:0;;;;;;;;;;;;;;10923:14:1;;10916:22;10898:41;;10886:2;10871:18;89419:23:0;10758:187:1;90103:61:0;;;;;;;;;;-1:-1:-1;90103:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;94216:912;;;;;;:::i;:::-;;:::i;103768:687::-;;;;;;;;;;-1:-1:-1;103768:687:0;;;;;:::i;:::-;;:::i;90889:105::-;;;;;;;;;;-1:-1:-1;90889:105:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102170:582;;;;;;;;;;-1:-1:-1;102170:582:0;;;;;:::i;:::-;;:::i;115581:221::-;;;;;;;;;;-1:-1:-1;115581:221:0;;;;;:::i;:::-;;:::i;108033:1154::-;;;;;;;;;;-1:-1:-1;108033:1154:0;;;;;:::i;:::-;;:::i;89729:23::-;;;;;;;;;;-1:-1:-1;89729:23:0;;;;;;;;;;;110574:253;;;;;;;;;;-1:-1:-1;110574:253:0;;;;;:::i;:::-;;:::i;8809:103::-;;;;;;;;;;;;;:::i;111636:647::-;;;;;;;;;;-1:-1:-1;111636:647:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;8158:87::-;;;;;;;;;;-1:-1:-1;8204:7:0;8231:6;-1:-1:-1;;;;;8231:6:0;8158:87;;89956:52;;;;;;;;;;-1:-1:-1;89956:52:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;106882:221::-;;;;;;;;;;-1:-1:-1;106882:221:0;;;;;:::i;:::-;;:::i;:::-;;;17895:4:1;17883:17;;;17865:36;;17853:2;17838:18;106882:221:0;17723:184:1;101015:852:0;;;;;;:::i;:::-;;:::i;115246:242::-;;;;;;;;;;-1:-1:-1;115246:242:0;;;;;:::i;:::-;;:::i;110942:525::-;;;;;;;;;;-1:-1:-1;110942:525:0;;;;;:::i;:::-;;:::i;102951:453::-;;;;;;;;;;-1:-1:-1;102951:453:0;;;;;:::i;:::-;;:::i;114440:160::-;;;;;;;;;;-1:-1:-1;114440:160:0;;;;;:::i;:::-;;:::i;90665:70::-;;;;;;;;;;-1:-1:-1;90665:70:0;;;;;:::i;:::-;;:::i;89580:28::-;;;;;;;;;;-1:-1:-1;89580:28:0;;;;;;;;;;;95585:735;;;;;;;;;;-1:-1:-1;95585:735:0;;;;;:::i;:::-;;:::i;89349:61::-;;;;;;;;;;-1:-1:-1;89349:61:0;;;;-1:-1:-1;;;;;89349:61:0;;;98882:751;;;;;;;;;;-1:-1:-1;98882:751:0;;;;;:::i;:::-;;:::i;99901:552::-;;;;;;:::i;:::-;;:::i;97525:816::-;;;;;;:::i;:::-;;:::i;9067:201::-;;;;;;;;;;-1:-1:-1;9067:201:0;;;;;:::i;:::-;;:::i;90517:79::-;;;;;;;;;;-1:-1:-1;90517:79:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;93102:626;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;;;;;;;;;93198:3:::1;116839:1;116833:3;:7;116825:43;;;::::0;-1:-1:-1;;;116825:43:0;;21435:2:1;116825:43:0::1;::::0;::::1;21417:21:1::0;21474:2;21454:18;;;21447:30;21513:25;21493:18;;;21486:53;21556:18;;116825:43:0::1;21233:347:1::0;116825:43:0::1;93214:22:::2;93239:20;93252:6;93239:12;:20::i;:::-;93214:45;;93279:4;:16;;;93278:17;93270:60;;;::::0;-1:-1:-1;;;93270:60:0;;21787:2:1;93270:60:0::2;::::0;::::2;21769:21:1::0;21826:2;21806:18;;;21799:30;21865:32;21845:18;;;21838:60;21915:18;;93270:60:0::2;21585:354:1::0;93270:60:0::2;93365:17;93349:4;:12;;;:33;;;;;;;;:::i;:::-;;93341:91;;;::::0;-1:-1:-1;;;93341:91:0;;22146:2:1;93341:91:0::2;::::0;::::2;22128:21:1::0;22185:2;22165:18;;;22158:30;22224:34;22204:18;;;22197:62;22295:15;22275:18;;;22268:43;22328:19;;93341:91:0::2;21944:409:1::0;93341:91:0::2;93443:44;93469:6;93477:4;93483:3;93443:25;:44::i;:::-;93498:36;93516:4;93522:6;93530:3;93498:17;:36::i;:::-;93545:29;93564:4;93570:3;93545:18;:29::i;:::-;93587:30;::::0;-1:-1:-1;;;;;93587:30:0::2;:35;6956:10:::0;93637:12:::2;::::0;::::2;::::0;93587:68:::2;::::0;;::::2;::::0;;;;;;-1:-1:-1;;;;;22578:55:1;;;93587:68:0::2;::::0;::::2;22560:74:1::0;22650:18;;;22643:34;22693:18;;;22686:34;;;22533:18;;93587:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;93717:3;93666:25;:39;93692:12;6956:10:::0;;6876:98;93692:12:::2;-1:-1:-1::0;;;;;93666:39:0::2;-1:-1:-1::0;;;;;93666:39:0::2;;;;;;;;;;;;:47;93706:6;93666:47;;;;;;;;;;;;;;;;:54;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;93102:626:0:o;9955:212::-;10049:1;10028:9;;;;:6;:9;:::i;:::-;-1:-1:-1;;;;;10028:23:0;;;:50;;;;-1:-1:-1;10076:1:0;10055:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10055:23:0;;;10028:50;10020:84;;;;-1:-1:-1;;;10020:84:0;;23444:2:1;10020:84:0;;;23426:21:1;23483:2;23463:18;;;23456:30;23522:23;23502:18;;;23495:51;23563:18;;10020:84:0;23242:345:1;10020:84:0;10115:16;:7;10125:6;10115:16;;:::i;:::-;-1:-1:-1;;10142:10:0;:17;;;;10155:4;10142:17;;;9955:212::o;114725:175::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;114837:30:::1;:55:::0;;;::::1;-1:-1:-1::0;;;;;114837:55:0;;;::::1;::::0;;;::::1;::::0;;114725:175::o;116175:202::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;116264:21:::1;116254:6;:31;;116246:66;;;::::0;-1:-1:-1;;;116246:66:0;;24144:2:1;116246:66:0::1;::::0;::::1;24126:21:1::0;24183:2;24163:18;;;24156:30;24222:24;24202:18;;;24195:52;24264:18;;116246:66:0::1;23942:346:1::0;116246:66:0::1;116339:15;::::0;116331:37:::1;::::0;116339:15:::1;::::0;;::::1;-1:-1:-1::0;;;;;116339:15:0::1;::::0;116331:37:::1;::::0;::::1;;::::0;;;::::1;::::0;;;;116339:15;116331:37;::::1;;;;;;116323:46;;;::::0;::::1;;116175:202:::0;:::o;109728:173::-;109785:7;109804:22;109829:20;109842:6;109829:12;:20::i;:::-;109804:45;;109867:26;109880:4;109886:6;109867:12;:26::i;:::-;109860:33;109728:173;-1:-1:-1;;;109728:173:0:o;107207:237::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;107314:15:::1;::::0;::::1;::::0;;;::::1;::::0;::::1;107298:31:::0;;::::1;;;107290:64;;;::::0;-1:-1:-1;;;107290:64:0;;24495:2:1;107290:64:0::1;::::0;::::1;24477:21:1::0;24534:2;24514:18;;;24507:30;24573:22;24553:18;;;24546:50;24613:18;;107290:64:0::1;24293:344:1::0;107290:64:0::1;107372:36;::::0;;::::1;;::::0;;;:22:::1;:36;::::0;;;;107365:43;;;::::1;::::0;;107419:15:::1;:17:::0;;;;::::1;::::0;;::::1;::::0;:15:::1;:17;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;107207:237:::0;:::o;115017:137::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;115114:12:::1;:32:::0;;;::::1;-1:-1:-1::0;;;;;115114:32:0;;;::::1;::::0;;;::::1;::::0;;115017:137::o;92100:829::-;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;92283:3:::1;116839:1;116833:3;:7;116825:43;;;::::0;-1:-1:-1;;;116825:43:0;;21435:2:1;116825:43:0::1;::::0;::::1;21417:21:1::0;21474:2;21454:18;;;21447:30;21513:25;21493:18;;;21486:53;21556:18;;116825:43:0::1;21233:347:1::0;116825:43:0::1;92299:22:::2;92324:20;92337:6;92324:12;:20::i;:::-;92299:45;;92364:4;:16;;;92363:17;92355:60;;;::::0;-1:-1:-1;;;92355:60:0;;21787:2:1;92355:60:0::2;::::0;::::2;21769:21:1::0;21826:2;21806:18;;;21799:30;21865:32;21845:18;;;21838:60;21915:18;;92355:60:0::2;21585:354:1::0;92355:60:0::2;92450:16;92434:4;:12;;;:32;;;;;;;;:::i;:::-;;92426:89;;;::::0;-1:-1:-1;;;92426:89:0;;25087:2:1;92426:89:0::2;::::0;::::2;25069:21:1::0;25126:2;25106:18;;;25099:30;25165:34;25145:18;;;25138:62;25236:14;25216:18;;;25209:42;25268:19;;92426:89:0::2;24885:408:1::0;92426:89:0::2;92526:44;92552:6;92560:4;92566:3;92526:25;:44::i;:::-;92581:36;92599:4;92605:6;92613:3;92581:17;:36::i;:::-;92630:26;92640:15;;92630:9;:26::i;:::-;92667:12;::::0;-1:-1:-1;;;;;92667:12:0::2;:29;92697:13:::0;::::2;92712:12;;::::0;::::2;92697:8:::0;92712:12:::2;:::i;:::-;92726:14;;::::0;::::2;:8:::0;:14:::2;:::i;:::-;6956:10:::0;92762:14:::2;::::0;::::2;::::0;92756:20:::2;::::0;:3;:20:::2;:::i;:::-;92667:110;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;92788:30:0::2;::::0;-1:-1:-1;;;;;92788:30:0::2;::::0;-1:-1:-1;92788:35:0::2;::::0;-1:-1:-1;6956:10:0;92838:12:::2;::::0;::::2;::::0;92788:68:::2;::::0;;::::2;::::0;;;;;;-1:-1:-1;;;;;22578:55:1;;;92788:68:0::2;::::0;::::2;22560:74:1::0;22650:18;;;22643:34;22693:18;;;22686:34;;;22533:18;;92788:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;92918:3;92867:25;:39;92893:12;6956:10:::0;;6876:98;92893:12:::2;-1:-1:-1::0;;;;;92867:39:0::2;-1:-1:-1::0;;;;;92867:39:0::2;;;;;;;;;;;;:47;92907:6;92867:47;;;;;;;;;;;;;;;;:54;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;92100:829:0:o;116492:276::-;116574:30;;;;;116598:4;116574:30;;;1185:74:1;116556:15:0;;-1:-1:-1;;;;;116574:15:0;;;;;1158:18:1;;116574:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;116556:48;;116643:1;116633:7;:11;116625:47;;;;-1:-1:-1;;;116625:47:0;;28126:2:1;116625:47:0;;;28108:21:1;28165:2;28145:18;;;28138:30;28204:25;28184:18;;;28177:53;28247:18;;116625:47:0;27924:347:1;116625:47:0;116714:15;;116691:49;;;;;116714:15;;;;-1:-1:-1;;;;;116714:15:0;;;116691:49;;;28458:74:1;28548:18;;;28541:34;;;116691:14:0;;;;;28431:18:1;;116691:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;116683:77;;;;-1:-1:-1;;;116683:77:0;;29038:2:1;116683:77:0;;;29020:21:1;29077:2;29057:18;;;29050:30;29116:17;29096:18;;;29089:45;29151:18;;116683:77:0;28836:339:1;116683:77:0;116545:223;116492:276;:::o;96505:530::-;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;96605:3:::1;116839:1;116833:3;:7;116825:43;;;::::0;-1:-1:-1;;;116825:43:0;;21435:2:1;116825:43:0::1;::::0;::::1;21417:21:1::0;21474:2;21454:18;;;21447:30;21513:25;21493:18;;;21486:53;21556:18;;116825:43:0::1;21233:347:1::0;116825:43:0::1;96621:22:::2;96646:20;96659:6;96646:12;:20::i;:::-;96621:45:::0;-1:-1:-1;96701:17:0::2;96685:4;:12;;;:33;;;;;;;;:::i;:::-;;96677:91;;;::::0;-1:-1:-1;;;96677:91:0;;22146:2:1;96677:91:0::2;::::0;::::2;22128:21:1::0;22185:2;22165:18;;;22158:30;22224:34;22204:18;;;22197:62;22295:15;22275:18;;;22268:43;22328:19;;96677:91:0::2;21944:409:1::0;96677:91:0::2;96779:44;96805:6;96813:4;96819:3;96779:25;:44::i;:::-;96834:36;96852:4;96858:6;96866:3;96834:17;:36::i;:::-;96881:29;96900:4;96906:3;96881:18;:29::i;:::-;96923:35;::::0;::::2;;::::0;;;:27:::2;:35;::::0;;;;:42;;96962:3;;96923:35;:42:::2;::::0;96962:3;;96923:42:::2;:::i;:::-;::::0;;;-1:-1:-1;97024:3:0;;-1:-1:-1;96976:22:0::2;:36;6956:10:::0;96999:12:::2;6876:98:::0;115965:202;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;-1:-1:-1;;;;;116060:18:0;::::1;116052:74;;;::::0;-1:-1:-1;;;116052:74:0;;29382:2:1;116052:74:0::1;::::0;::::1;29364:21:1::0;29421:2;29401:18;;;29394:30;29460:34;29440:18;;;29433:62;29531:13;29511:18;;;29504:41;29562:19;;116052:74:0::1;29180:407:1::0;116052:74:0::1;116137:15;:22:::0;;-1:-1:-1;;;;;116137:22:0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;115965:202::o;107516:435::-;107591:6;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;107610:18:::1;107623:4;107610:12;:18::i;:::-;107645:4;:16;;;107641:228;;107695:30;::::0;107753:17;;107789:16:::1;::::0;;::::1;::::0;107695:125;;;;;107677:15:::1;::::0;-1:-1:-1;;;;;107695:30:0::1;::::0;:39:::1;::::0;:125:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;107835:12;::::0;::::1;:22:::0;-1:-1:-1;107641:228:0::1;107912:4;107881:15;:28;107899:9;;107897:11;;;;;;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;107881:28;;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;107881:28:0;:35;;;;;;;;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;;-1:-1:-1;107881:35:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;;::::0;;;;;;;;;::::1;::::0;;;;;::::1;::::0;;;:28;;:35:::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;107881:35:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;107881:35:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;;::::0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;107934:9:0::1;::::0;;;::::1;;;10527:1;107516:435:::0;;;:::o;94216:912::-;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;94413:3:::1;116839:1;116833:3;:7;116825:43;;;::::0;-1:-1:-1;;;116825:43:0;;21435:2:1;116825:43:0::1;::::0;::::1;21417:21:1::0;21474:2;21454:18;;;21447:30;21513:25;21493:18;;;21486:53;21556:18;;116825:43:0::1;21233:347:1::0;116825:43:0::1;94428:22:::2;94453:20;94466:6;94453:12;:20::i;:::-;94428:45;;94493:4;:16;;;94492:17;94484:60;;;::::0;-1:-1:-1;;;94484:60:0;;21787:2:1;94484:60:0::2;::::0;::::2;21769:21:1::0;21826:2;21806:18;;;21799:30;21865:32;21845:18;;;21838:60;21915:18;;94484:60:0::2;21585:354:1::0;94484:60:0::2;94579:26;94563:4;:12;;;:42;;;;;;;;:::i;:::-;;94555:109;;;::::0;-1:-1:-1;;;94555:109:0;;30373:2:1;94555:109:0::2;::::0;::::2;30355:21:1::0;30412:2;30392:18;;;30385:30;30451:34;30431:18;;;30424:62;30522:24;30502:18;;;30495:52;30564:19;;94555:109:0::2;30171:418:1::0;94555:109:0::2;94675:44;94701:6;94709:4;94715:3;94675:25;:44::i;:::-;94730:36;94748:4;94754:6;94762:3;94730:17;:36::i;:::-;94777:29;94796:4;94802:3;94777:18;:29::i;103768:687::-:0;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;103881:22:::1;103906:20;103919:6;103906:12;:20::i;:::-;103881:45;;103946:4;:16;;;103945:17;103937:60;;;::::0;-1:-1:-1;;;103937:60:0;;21787:2:1;103937:60:0::1;::::0;::::1;21769:21:1::0;21826:2;21806:18;;;21799:30;21865:32;21845:18;;;21838:60;21915:18;;103937:60:0::1;21585:354:1::0;103937:60:0::1;104046:30;::::0;-1:-1:-1;;;;;104046:30:0::1;:40;6956:10:::0;104101:12:::1;::::0;::::1;::::0;104046:68:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;28476:55:1;;;104046:68:0::1;::::0;::::1;28458:74:1::0;28548:18;;;28541:34;28431:18;;104046:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104016:98:::0;::::1;;104008:154;;;::::0;-1:-1:-1;;;104008:154:0;;31098:2:1;104008:154:0::1;::::0;::::1;31080:21:1::0;31137:2;31117:18;;;31110:30;31176:34;31156:18;;;31149:62;31247:13;31227:18;;;31220:41;31278:19;;104008:154:0::1;30896:407:1::0;104008:154:0::1;104179:9;104175:125;104190:30:::0;;::::1;104175:125;;;104241:47;104251:4;104257:6;104265:19;;104285:1;104265:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;104241:9;:47::i;:::-;104222:3:::0;::::1;::::0;::::1;:::i;:::-;;;;104175:125;;;;104315:4;:13;;;104312:136;;;104345:30;::::0;-1:-1:-1;;;;;104345:30:0::1;:35;6956:10:::0;104395:12:::1;::::0;::::1;::::0;104345:91:::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;22578:55:1;;;104345:91:0::1;::::0;::::1;22560:74:1::0;22650:18;;;22643:34;22693:18;;;22686:34;;;22533:18;;104345:91:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;104312:136;103870:585;103768:687:::0;;;:::o;102170:582::-;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;102282:22:::1;102307:20;102320:6;102307:12;:20::i;:::-;6956:10:::0;102383:36:::1;::::0;;;:22:::1;:36;::::0;;;;;;;:44:::1;::::0;::::1;::::0;;;;;;;;102282:45;;-1:-1:-1;102353:74:0;::::1;;102345:123;;;::::0;-1:-1:-1;;;102345:123:0;;31899:2:1;102345:123:0::1;::::0;::::1;31881:21:1::0;31938:2;31918:18;;;31911:30;31977:34;31957:18;;;31950:62;32048:6;32028:18;;;32021:34;32072:19;;102345:123:0::1;31697:400:1::0;102345:123:0::1;102493:9;102489:125;102504:30:::0;;::::1;102489:125;;;102555:47;102565:4;102571:6;102579:19;;102599:1;102579:22;;;;;;;:::i;102555:47::-;102536:3:::0;::::1;::::0;::::1;:::i;:::-;;;;102489:125;;;;102629:4;:13;;;102626:119;;;6956:10:::0;102659:36:::1;::::0;;;:22:::1;:36;::::0;;;;;;;:44:::1;::::0;::::1;::::0;;;;;;;:74;;102707:19;;102659:36;:74:::1;::::0;102707:19;;102659:74:::1;:::i;115581:221::-:0;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;115688:1:::1;115679:6;:10;;;:33;;;;-1:-1:-1::0;115703:9:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;115693:19:::0;;::::1;;;115679:33;115671:61;;;::::0;-1:-1:-1;;;115671:61:0;;32434:2:1;115671:61:0::1;::::0;::::1;32416:21:1::0;32473:2;32453:18;;;32446:30;32512:17;32492:18;;;32485:45;32547:18;;115671:61:0::1;32232:339:1::0;115671:61:0::1;115753:23;::::0;;::::1;;::::0;;;:15:::1;:23;::::0;;;;:30:::1;;:41:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;115581:221::o;108033:1154::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;108132:21:::1;108145:7;108132:12;:21::i;:::-;108164:30;108197:20;108210:6;108197:12;:20::i;:::-;108164:53;;108266:7;:19;;;108238:47;;:12;:24;;;:47;;;108230:90;;;::::0;-1:-1:-1;;;108230:90:0;;32778:2:1;108230:90:0::1;::::0;::::1;32760:21:1::0;32817:2;32797:18;;;32790:30;32856:32;32836:18;;;32829:60;32906:18;;108230:90:0::1;32576:354:1::0;108230:90:0::1;108365:34;108378:12;108392:6;108365:12;:34::i;:::-;108339:7;:22;;;:60;;108331:128;;;::::0;-1:-1:-1;;;108331:128:0;;33137:2:1;108331:128:0::1;::::0;::::1;33119:21:1::0;33176:2;33156:18;;;33149:30;33215:34;33195:18;;;33188:62;33286:25;33266:18;;;33259:53;33329:19;;108331:128:0::1;32935:419:1::0;108331:128:0::1;108484:12;:24;;;108480:654;;108543:20;::::0;;::::1;::::0;108525:15;;::::1;:38:::0;108644:24:::1;::::0;;::::1;::::0;108638:38;108607:19;;::::1;::::0;108601:33;:75:::1;;::::0;:202:::1;;;108777:12;:24;;;108760:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;108750:53;;;;;;108725:7;:19;;;108708:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;108698:48;;;;;;:105;;108601:202;108580:367;;;108846:30;::::0;108889:20:::1;::::0;::::1;::::0;108911:19:::1;::::0;;::::1;::::0;108846:85;;;;;-1:-1:-1;;;;;108846:30:0;;::::1;::::0;:42:::1;::::0;:85:::1;::::0;108889:20;;108846:85:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;108580:367;108984:12;:19;;;108966:37;;:7;:14;;;:37;;;108963:160;;109024:30;::::0;109070:20:::1;::::0;::::1;::::0;109092:14:::1;::::0;::::1;::::0;109024:83:::1;::::0;;;;::::1;::::0;::::1;34104:25:1::0;;;;34172:14;34165:22;34145:18;;;34138:50;-1:-1:-1;;;;;109024:30:0;;::::1;::::0;:45:::1;::::0;34077:18:1;;109024:83:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;108963:160;109146:23;::::0;::::1;;::::0;;;:15:::1;:23;::::0;;;;;;;;:33;;;;;;;;::::1;::::0;::::1;;;::::0;;::::1;::::0;;::::1;;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;;::::0;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;109172:7;;109146:23;:33:::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;109146:33:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;109146:33:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;;::::0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;108033:1154:0:o;110574:253::-;110694:24;;;;110674:4;;110694:28;110691:107;;-1:-1:-1;110762:24:0;;;;110746:40;;;110739:47;;110691:107;-1:-1:-1;110815:4:0;110574:253;;;;;:::o;8809:103::-;8204:7;8231:6;-1:-1:-1;;;;;8231:6:0;6956:10;8378:23;8370:68;;;;-1:-1:-1;;;8370:68:0;;34401:2:1;8370:68:0;;;34383:21:1;;;34420:18;;;34413:30;34479:34;34459:18;;;34452:62;34531:18;;8370:68:0;34199:356:1;8370:68:0;8874:30:::1;8901:1;8874:18;:30::i;:::-;8809:103::o:0;111636:647::-;111769:16;;111815:32;111864:8;111850:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111850:30:0;-1:-1:-1;111815:65:0;-1:-1:-1;111891:34:0;111942:8;111928:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111928:30:0;;111891:67;;111975:9;111971:250;111986:19;;;111971:250;;;112025:14;112049:8;;112058:1;112049:11;;;;;;;:::i;:::-;;;;;;;112025:36;;112099:7;112078:28;;:15;112094:1;112078:18;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;;112144:48;;;;;;;:34;:48;;;;;;:57;;;;;;;;;;:65;;;;;;;;;;112121:20;;:17;;112139:1;;112121:20;;;;;;:::i;:::-;;;;;;;;;;:88;-1:-1:-1;112006:3:0;;;;:::i;:::-;;;;111971:250;;;-1:-1:-1;112240:15:0;;;;-1:-1:-1;111636:647:0;-1:-1:-1;;;;;111636:647:0:o;89956:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;89956:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89956:52:0;;-1:-1:-1;89956:52:0;;;;;;;;;;;;;;;;;;;;;;;:::o;106882:221::-;106966:18;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;107013:15:::1;107011:17:::0;;107013:15:::1;::::0;107011:17:::1;::::0;;;::::1;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;;::::0;;::::1;;::::0;;;-1:-1:-1;107039:36:0;;;:22:::1;:36;::::0;;;;:56;;-1:-1:-1;;;;;107039:56:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;107011:17:0;106882:221::o;101015:852::-;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;101245:22:::1;101270:20;101283:6;101270:12;:20::i;:::-;101245:45:::0;-1:-1:-1;101325:26:0::1;101309:4;:12;;;:42;;;;;;;;:::i;:::-;;101301:109;;;::::0;-1:-1:-1;;;101301:109:0;;30373:2:1;101301:109:0::1;::::0;::::1;30355:21:1::0;30412:2;30392:18;;;30385:30;30451:34;30431:18;;;30424:62;30522:24;30502:18;;;30495:52;30564:19;;101301:109:0::1;30171:418:1::0;101301:109:0::1;101421:67;101447:6:::0;101455:4;101461:19;101421:25:::1;:67::i;:::-;101499:52;101518:4:::0;101524:19;101499:18:::1;:52::i;:::-;101562:59;101580:4:::0;101586:6;101594:19;101562:17:::1;:59::i;:::-;101634:26;101644:15;;101634:9;:26::i;:::-;101671:12;::::0;-1:-1:-1;;;;;101671:12:0::1;:29;101701:13:::0;::::1;101716:12;;::::0;::::1;101701:8:::0;101716:12:::1;:::i;:::-;101730:14;;::::0;::::1;:8:::0;:14:::1;:::i;:::-;6956:10:::0;101789:14:::1;::::0;::::1;::::0;101760:43:::1;::::0;:19;:43:::1;:::i;:::-;101671:133;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;101821:38;101831:6;101839:19;;101821:9;:38::i;:::-;101234:633;101015:852:::0;;;;;;:::o;115246:242::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;115318:6:::1;115315:135;;;115356:30;::::0;-1:-1:-1;;;;;115356:30:0::1;115340:98;;;::::0;-1:-1:-1;;;115340:98:0;;35384:2:1;115340:98:0::1;::::0;::::1;35366:21:1::0;;;35403:18;;;35396:30;35462:34;35442:18;;;35435:62;35514:18;;115340:98:0::1;35182:356:1::0;115340:98:0::1;115460:11;:20:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;115246:242::o;110942:525::-;111092:20;;;;111072:4;;111092:24;111089:349;;111133:25;111161:4;:16;;;:185;;-1:-1:-1;;;;;111302:36:0;;;;;;:25;:36;;;;;;;;:44;;;;;;;;;;;;;111258:33;;;:22;:33;;;;;:41;;;;;;;;;:88;;111302:44;111258:88;:::i;:::-;111161:185;;;-1:-1:-1;;;;;111197:33:0;;;;;;:22;:33;;;;;;;;:41;;;;;;;;;;;111161:185;111406:20;;;;111133:213;;-1:-1:-1;111370:32:0;111390:12;111133:213;111370:32;:::i;:::-;:56;;111363:63;;;;;111089:349;-1:-1:-1;111455:4:0;110942:525;;;;;;;:::o;102951:453::-;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;103040:3:::1;116839:1;116833:3;:7;116825:43;;;::::0;-1:-1:-1;;;116825:43:0;;21435:2:1;116825:43:0::1;::::0;::::1;21417:21:1::0;21474:2;21454:18;;;21447:30;21513:25;21493:18;;;21486:53;21556:18;;116825:43:0::1;21233:347:1::0;116825:43:0::1;103056:22:::2;103081:20;103094:6;103081:12;:20::i;:::-;6956:10:::0;103134:36:::2;::::0;;;:22:::2;:36;::::0;;;;;;;:44:::2;::::0;::::2;::::0;;;;;;;;103056:45;;-1:-1:-1;103127:51:0;::::2;;103119:100;;;::::0;-1:-1:-1;;;103119:100:0;;31899:2:1;103119:100:0::2;::::0;::::2;31881:21:1::0;31938:2;31918:18;;;31911:30;31977:34;31957:18;;;31950:62;32048:6;32028:18;;;32021:34;32072:19;;103119:100:0::2;31697:400:1::0;103119:100:0::2;103242:4;:13;;;103239:96;;;6956:10:::0;103272:36:::2;::::0;;;:22:::2;:36;::::0;;;;;;;:44:::2;::::0;::::2;::::0;;;;;;;:51;;103320:3;;103272:36;:51:::2;::::0;103320:3;;103272:51:::2;:::i;:::-;::::0;;;-1:-1:-1;;103239:96:0::2;103352:44;::::0;;35773:6:1;35761:19;;35743:38;;6956:10:0;35812:2:1;35797:18;;35790:83;35889:18;;;35882:34;;;103352:44:0;;::::2;::::0;;;;35731:2:1;103352:44:0;;::::2;103045:359;116993:1:::1;102951:453:::0;;:::o;114440:160::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;23794:2:1;10455:61:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:23;23852:18;;;23845:51;23913:18;;10455:61:0;23592:345:1;10455:61:0;114540:20:::1;:52:::0;;;::::1;-1:-1:-1::0;;;;;114540:52:0;;;::::1;::::0;;;::::1;::::0;;114440:160::o;90665:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;95585:735::-;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;95772:3:::1;116839:1;116833:3;:7;116825:43;;;::::0;-1:-1:-1;;;116825:43:0;;21435:2:1;116825:43:0::1;::::0;::::1;21417:21:1::0;21474:2;21454:18;;;21447:30;21513:25;21493:18;;;21486:53;21556:18;;116825:43:0::1;21233:347:1::0;116825:43:0::1;95788:22:::2;95813:20;95826:6;95813:12;:20::i;:::-;95788:45:::0;-1:-1:-1;95868:16:0::2;95852:4;:12;;;:32;;;;;;;;:::i;:::-;;95844:89;;;::::0;-1:-1:-1;;;95844:89:0;;25087:2:1;95844:89:0::2;::::0;::::2;25069:21:1::0;25126:2;25106:18;;;25099:30;25165:34;25145:18;;;25138:62;25236:14;25216:18;;;25209:42;25268:19;;95844:89:0::2;24885:408:1::0;95844:89:0::2;95944:44;95970:6;95978:4;95984:3;95944:25;:44::i;:::-;95999:36;96017:4;96023:6;96031:3;95999:17;:36::i;:::-;96048:26;96058:15;;96048:9;:26::i;:::-;96085:12;::::0;-1:-1:-1;;;;;96085:12:0::2;:29;96115:13:::0;::::2;96130:12;;::::0;::::2;96115:8:::0;96130:12:::2;:::i;:::-;96144:14;;::::0;::::2;:8:::0;:14:::2;:::i;:::-;6956:10:::0;96180:14:::2;::::0;::::2;::::0;96174:20:::2;::::0;:3;:20:::2;:::i;:::-;96085:110;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;96208:35:0::2;::::0;::::2;;::::0;;;:27:::2;:35;::::0;;;;:42;;96247:3;;96208:35;:42:::2;::::0;96247:3;;96208:42:::2;:::i;:::-;::::0;;;-1:-1:-1;96309:3:0;;-1:-1:-1;96261:22:0::2;:36;6956:10:::0;96284:12:::2;6876:98:::0;98882:751;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;99098:22:::1;99123:20;99136:6;99123:12;:20::i;:::-;99098:45:::0;-1:-1:-1;99178:16:0::1;99162:4;:12;;;:32;;;;;;;;:::i;:::-;;99154:89;;;::::0;-1:-1:-1;;;99154:89:0;;25087:2:1;99154:89:0::1;::::0;::::1;25069:21:1::0;25126:2;25106:18;;;25099:30;25165:34;25145:18;;;25138:62;25236:14;25216:18;;;25209:42;25268:19;;99154:89:0::1;24885:408:1::0;99154:89:0::1;99254:67;99280:6:::0;99288:4;99294:19;99254:25:::1;:67::i;99901:552::-:0;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;100036:22:::1;100061:20;100074:6;100061:12;:20::i;:::-;100036:45:::0;-1:-1:-1;100116:17:0::1;100100:4;:12;;;:33;;;;;;;;:::i;:::-;;100092:91;;;::::0;-1:-1:-1;;;100092:91:0;;22146:2:1;100092:91:0::1;::::0;::::1;22128:21:1::0;22185:2;22165:18;;;22158:30;22224:34;22204:18;;;22197:62;22295:15;22275:18;;;22268:43;22328:19;;100092:91:0::1;21944:409:1::0;100092:91:0::1;100194:67;100220:6:::0;100228:4;100234:19;100194:25:::1;:67::i;:::-;100272:52;100291:4:::0;100297:19;100272:18:::1;:52::i;:::-;100335:59;100353:4:::0;100359:6;100367:19;100335:17:::1;:59::i;:::-;100407:38;100417:6;100425:19;;100407:9;:38::i;97525:816::-:0;116942:11;;;;;;;116934:48;;;;-1:-1:-1;;;116934:48:0;;21082:2:1;116934:48:0;;;21064:21:1;21121:2;21101:18;;;21094:30;21160:26;21140:18;;;21133:54;21204:18;;116934:48:0;20880:348:1;116934:48:0;97726:3:::1;116839:1;116833:3;:7;116825:43;;;::::0;-1:-1:-1;;;116825:43:0;;21435:2:1;116825:43:0::1;::::0;::::1;21417:21:1::0;21474:2;21454:18;;;21447:30;21513:25;21493:18;;;21486:53;21556:18;;116825:43:0::1;21233:347:1::0;116825:43:0::1;97741:22:::2;97766:20;97779:6;97766:12;:20::i;:::-;97741:45:::0;-1:-1:-1;97821:26:0::2;97805:4;:12;;;:42;;;;;;;;:::i;:::-;;97797:109;;;::::0;-1:-1:-1;;;97797:109:0;;30373:2:1;97797:109:0::2;::::0;::::2;30355:21:1::0;30412:2;30392:18;;;30385:30;30451:34;30431:18;;;30424:62;30522:24;30502:18;;;30495:52;30564:19;;97797:109:0::2;30171:418:1::0;97797:109:0::2;97917:44;97943:6;97951:4;97957:3;97917:25;:44::i;:::-;97972:36;97990:4;97996:6;98004:3;97972:17;:36::i;:::-;98019:29;98038:4;98044:3;98019:18;:29::i;9067:201::-:0;8204:7;8231:6;-1:-1:-1;;;;;8231:6:0;6956:10;8378:23;8370:68;;;;-1:-1:-1;;;8370:68:0;;34401:2:1;8370:68:0;;;34383:21:1;;;34420:18;;;34413:30;34479:34;34459:18;;;34452:62;34531:18;;8370:68:0;34199:356:1;8370:68:0;-1:-1:-1;;;;;9156:22:0;::::1;9148:73;;;::::0;-1:-1:-1;;;9148:73:0;;36129:2:1;9148:73:0::1;::::0;::::1;36111:21:1::0;36168:2;36148:18;;;36141:30;36207:34;36187:18;;;36180:62;36278:8;36258:18;;;36251:36;36304:19;;9148:73:0::1;35927:402:1::0;9148:73:0::1;9232:28;9251:8;9232:18;:28::i;112454:235::-:0;112512:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112512:22:0;112564:9;;;;;;;;;112554:19;;;;;112546:46;;;;-1:-1:-1;;;112546:46:0;;36536:2:1;112546:46:0;;;36518:21:1;36575:2;36555:18;;;36548:30;36614:16;36594:18;;;36587:44;36648:18;;112546:46:0;36334:338:1;112546:46:0;112610:23;;;;;;;:15;:23;;;;;;;;;112603:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112610:23;;112603:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;112603:30:0;;;-1:-1:-1;;112603:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112652:11;;;;112603:30;;-1:-1:-1;112644:37:0;;;;-1:-1:-1;;;112644:37:0;;36879:2:1;112644:37:0;;;36861:21:1;36918:2;36898:18;;;36891:30;36957:15;36937:18;;;36930:43;36990:18;;112644:37:0;36677:337:1;109195:316:0;109323:44;109348:4;109354:12;109323:24;:44::i;:::-;109315:82;;;;-1:-1:-1;;;109315:82:0;;37221:2:1;109315:82:0;;;37203:21:1;37260:2;37240:18;;;37233:30;37299:27;37279:18;;;37272:55;37344:18;;109315:82:0;37019:349:1;109315:82:0;109416:62;109437:6;109445:4;109451:12;6956:10;110942:525;:::i;109416:62::-;109408:95;;;;-1:-1:-1;;;109408:95:0;;37575:2:1;109408:95:0;;;37557:21:1;37614:2;37594:18;;;37587:30;37653:23;37633:18;;;37626:51;37694:18;;109408:95:0;37373:345:1;109408:95:0;109195:316;;;:::o;109519:201::-;109655:26;109668:4;109674:6;109655:12;:26::i;:::-;109639:12;:42;;109631:81;;;;-1:-1:-1;;;109631:81:0;;37925:2:1;109631:81:0;;;37907:21:1;37964:2;37944:18;;;37937:30;38003:28;37983:18;;;37976:56;38049:18;;109631:81:0;37723:350:1;112291:155:0;112414:3;112396:4;:15;;;:21;;;;:::i;:::-;112383:9;:34;112375:63;;;;-1:-1:-1;;;112375:63:0;;38280:2:1;112375:63:0;;;38262:21:1;38319:2;38299:18;;;38292:30;38358:18;38338;;;38331:46;38394:18;;112375:63:0;38078:340:1;10175:233:0;10244:4;8231:6;;-1:-1:-1;;;;;10267:15:0;;;8231:6;;10267:15;;:133;;-1:-1:-1;10301:10:0;;;;:88;;;;-1:-1:-1;10342:7:0;:10;-1:-1:-1;;;;;10334:18:0;;;10342:10;;10334:18;;:40;;-1:-1:-1;;10364:10:0;;-1:-1:-1;;;;;10364:10:0;;;10356:18;;;;10175:233::o;109907:548::-;109989:7;110009:19;110248:4;:16;;;110244:119;;110295:30;;110338:12;;;;110295:56;;;;;-1:-1:-1;;;;;110295:30:0;;;;:42;;:56;;;;3032:25:1;;;3020:2;3005:18;;2886:177;110295:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;110281:70;;110244:119;110412:35;;;;;;;:27;:35;;;;;;110380:19;;;;:31;;110400:11;;110380:31;:::i;:::-;:67;;;;:::i;106576:201::-;106658:26;;106655:115;;106701:20;;-1:-1:-1;;;;;106701:20:0;:26;6956:10;106742:15;;106701:57;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106576:201;;:::o;112697:1658::-;112797:1;112775:4;:19;;;:23;112767:66;;;;-1:-1:-1;;;112767:66:0;;41102:2:1;112767:66:0;;;41084:21:1;41141:2;41121:18;;;41114:30;41180:32;41160:18;;;41153:60;41230:18;;112767:66:0;40900:354:1;112767:66:0;112854:4;:19;;;:29;;;:58;;;;;112887:4;:20;;;112911:1;112887:25;112854:58;112852:61;112844:124;;;;-1:-1:-1;;;112844:124:0;;41461:2:1;112844:124:0;;;41443:21:1;41500:2;41480:18;;;41473:30;41539:34;41519:18;;;41512:62;41610:20;41590:18;;;41583:48;41648:19;;112844:124:0;41259:414:1;112844:124:0;112992:4;:16;;;112989:136;;;113066:1;113039:4;:16;;;113033:30;:34;113025:88;;;;-1:-1:-1;;;113025:88:0;;41880:2:1;113025:88:0;;;41862:21:1;41919:2;41899:18;;;41892:30;41958:34;41938:18;;;41931:62;42029:11;42009:18;;;42002:39;42058:19;;113025:88:0;41678:405:1;113025:88:0;113148:4;:19;;;:31;;;113145:322;;;113249:15;;113203:19;;;;:42;113249:15;;;;;;;113203:61;;;;113195:104;;;;-1:-1:-1;;;113195:104:0;;42290:2:1;113195:104:0;;;42272:21:1;42329:2;42309:18;;;42302:30;42368:32;42348:18;;;42341:60;42418:18;;113195:104:0;42088:354:1;113195:104:0;113145:322;;;113349:19;;;;:42;:47;;;113341:114;;;;-1:-1:-1;;;113341:114:0;;42649:2:1;113341:114:0;;;42631:21:1;42688:2;42668:18;;;42661:30;42727:34;42707:18;;;42700:62;42798:24;42778:18;;;42771:52;42840:19;;113341:114:0;42447:418:1;113341:114:0;113498:17;113482:4;:12;;;:33;;;;;;;;:::i;:::-;;113479:869;;;113557:1;113539:4;:15;;;:19;113531:68;;;;-1:-1:-1;;;113531:68:0;;43072:2:1;113531:68:0;;;43054:21:1;43111:2;43091:18;;;43084:30;43150:34;43130:18;;;43123:62;43221:6;43201:18;;;43194:34;43245:19;;113531:68:0;42870:400:1;113531:68:0;113622:14;;;;:19;113614:74;;;;-1:-1:-1;;;113614:74:0;;43477:2:1;113614:74:0;;;43459:21:1;43516:2;43496:18;;;43489:30;43555:34;43535:18;;;43528:62;43626:12;43606:18;;;43599:40;43656:19;;113614:74:0;43275:406:1;113479:869:0;113734:16;113718:4;:12;;;:32;;;;;;;;:::i;:::-;;113715:633;;;113774:15;;;;:20;113766:75;;;;-1:-1:-1;;;113766:75:0;;43888:2:1;113766:75:0;;;43870:21:1;43927:2;43907:18;;;43900:30;43966:34;43946:18;;;43939:62;44037:12;44017:18;;;44010:40;44067:19;;113766:75:0;43686:406:1;113766:75:0;113899:4;113884;:14;;;:19;;;;:::i;:::-;113883:26;;113905:4;113883:26;:::i;:::-;113864:4;:14;;;:46;113856:104;;;;-1:-1:-1;;;113856:104:0;;44578:2:1;113856:104:0;;;44560:21:1;44617:2;44597:18;;;44590:30;44656:34;44636:18;;;44629:62;44727:15;44707:18;;;44700:43;44760:19;;113856:104:0;44376:409:1;113715:633:0;114007:26;113991:4;:12;;;:42;;;;;;;;:::i;:::-;;113987:361;;;114076:1;114058:4;:15;;;:19;114050:77;;;;-1:-1:-1;;;114050:77:0;;44992:2:1;114050:77:0;;;44974:21:1;45031:2;45011:18;;;45004:30;45070:34;45050:18;;;45043:62;45141:15;45121:18;;;45114:43;45174:19;;114050:77:0;44790:409:1;113987:361:0;114306:30;;-1:-1:-1;;;114306:30:0;;45406:2:1;114306:30:0;;;45388:21:1;45445:2;45425:18;;;45418:30;45484:22;45464:18;;;45457:50;45524:18;;114306:30:0;45204:344:1;104751:1817:0;104863:4;:19;;;:31;;;104855:66;;;;-1:-1:-1;;;104855:66:0;;45755:2:1;104855:66:0;;;45737:21:1;45794:2;45774:18;;;45767:30;45833:24;45813:18;;;45806:52;45875:18;;104855:66:0;45553:346:1;104855:66:0;105096:19;;;;;:42;105073:66;;;;;;:22;:66;;;;;;;;;105056:112;;;;;46079:10:1;46067:23;;105056:112:0;;;46049:42:1;-1:-1:-1;;;;;105073:66:0;;;;105056:92;;46022:18:1;;105056:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;105040:128:0;6956:10;-1:-1:-1;;;;;105040:128:0;;105018:206;;;;-1:-1:-1;;;105018:206:0;;46585:2:1;105018:206:0;;;46567:21:1;46624:2;46604:18;;;46597:30;46663:29;46643:18;;;46636:57;46710:18;;105018:206:0;46383:351:1;105018:206:0;105349:4;:19;;;:29;;;105345:309;;105456:19;;;;;:42;105421:78;;;;;;:34;:78;;;;;;:98;;;;;;;;;;:106;;;;;;;;;;:111;105395:247;;;;-1:-1:-1;;;105395:247:0;;46941:2:1;105395:247:0;;;46923:21:1;46980:2;46960:18;;;46953:30;47019:34;46999:18;;;46992:62;47090:34;47070:18;;;47063:62;47162:12;47141:19;;;47134:41;47192:19;;105395:247:0;46739:478:1;105395:247:0;105799:19;;;;;:42;;:46;105796:327;;105862:20;;105953:19;;;;;;:42;105930:66;;105862:20;105930:66;;;:22;:66;;;;;;;;106054:19;;:42;;;;105862:249;;;;;-1:-1:-1;;;;;105930:66:0;;;105862:249;;;47422:74:1;47544:10;47532:23;;47512:18;;;47505:51;47572:18;;;47565:34;;;;105862:20:0;;;;:49;;47395:18:1;;105862:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105796:327;106170:19;;;;;:42;106135:78;;;;;;:34;:78;;;;;;:98;;;;;;;;;;:106;;;;;;;;;;;:111;;106245:1;;106135:78;:111;;106245:1;;106135:111;:::i;:::-;;;;-1:-1:-1;;106257:24:0;;;;;;;:16;:24;;;;;;;;106282:19;;;;;:42;106257:68;;;;;;;;;;;;:93;;;;;;;;;;;;;;;;;;;;;106496:19;;:42;106473:66;;;;;:22;:66;;;;;;;106446:114;;47809:38:1;;;-1:-1:-1;;;;;106473:66:0;47863:18:1;;;47856:83;;;;47955:18;;47948:51;106446:114:0;;47797:2:1;47782:18;106446:114:0;;;;;;;104751:1817;;;:::o;9428:191::-;9502:16;9521:6;;-1:-1:-1;;;;;9538:17:0;;;;;;;;;;9571:40;;9521:6;;;;;;;9571:40;;9502:16;9571:40;9491:128;9428:191;:::o;104463:280::-;104555:22;104580:20;104593:6;104580:12;:20::i;:::-;104555:45;;104615:9;104611:125;104626:30;;;104611:125;;;104677:47;104687:4;104693:6;104701:19;;104721:1;104701:22;;;;;;;:::i;104677:47::-;104658:3;;;;:::i;:::-;;;;104611:125;;;;104544:199;104463:280;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;178:252;245:6;253;306:2;294:9;285:7;281:23;277:32;274:52;;;322:1;319;312:12;274:52;345:28;363:9;345:28;:::i;:::-;335:38;420:2;405:18;;;;392:32;;-1:-1:-1;;;178:252:1:o;435:251::-;519:6;572:2;560:9;551:7;547:23;543:32;540:52;;;588:1;585;578:12;540:52;627:7;622:2;611:9;607:18;604:31;601:51;;;648:1;645;638:12;601:51;-1:-1:-1;671:9:1;435:251;-1:-1:-1;435:251:1:o;691:156::-;757:20;;817:4;806:16;;796:27;;786:55;;837:1;834;827:12;852:182;909:6;962:2;950:9;941:7;937:23;933:32;930:52;;;978:1;975;968:12;930:52;1001:27;1018:9;1001:27;:::i;1517:179::-;-1:-1:-1;;;;;1621:5:1;1617:54;1610:5;1607:65;1597:93;;1686:1;1683;1676:12;1701:304;1792:6;1845:2;1833:9;1824:7;1820:23;1816:32;1813:52;;;1861:1;1858;1851:12;1813:52;1900:9;1887:23;1919:56;1969:5;1919:56;:::i;2512:180::-;2571:6;2624:2;2612:9;2603:7;2599:23;2595:32;2592:52;;;2640:1;2637;2630:12;2592:52;-1:-1:-1;2663:23:1;;2512:180;-1:-1:-1;2512:180:1:o;2697:184::-;2755:6;2808:2;2796:9;2787:7;2783:23;2779:32;2776:52;;;2824:1;2821;2814:12;2776:52;2847:28;2865:9;2847:28;:::i;3363:165::-;3433:5;3478:2;3469:6;3464:3;3460:16;3456:25;3453:45;;;3494:1;3491;3484:12;3533:388;3617:8;3627:6;3681:3;3674:4;3666:6;3662:17;3658:27;3648:55;;3699:1;3696;3689:12;3648:55;-1:-1:-1;3722:20:1;;3765:18;3754:30;;3751:50;;;3797:1;3794;3787:12;3751:50;3834:4;3826:6;3822:17;3810:29;;3894:3;3887:4;3877:6;3874:1;3870:14;3862:6;3858:27;3854:38;3851:47;3848:67;;;3911:1;3908;3901:12;3848:67;3533:388;;;;;:::o;3926:904::-;4105:6;4113;4121;4129;4137;4190:3;4178:9;4169:7;4165:23;4161:33;4158:53;;;4207:1;4204;4197:12;4158:53;4230:28;4248:9;4230:28;:::i;:::-;4220:38;;4305:2;4294:9;4290:18;4277:32;4267:42;;4360:2;4349:9;4345:18;4332:32;4383:18;4424:2;4416:6;4413:14;4410:34;;;4440:1;4437;4430:12;4410:34;4463:77;4532:7;4523:6;4512:9;4508:22;4463:77;:::i;:::-;4453:87;;4593:2;4582:9;4578:18;4565:32;4549:48;;4622:2;4612:8;4609:16;4606:36;;;4638:1;4635;4628:12;4606:36;;4677:93;4762:7;4751:8;4740:9;4736:24;4677:93;:::i;:::-;3926:904;;;;-1:-1:-1;3926:904:1;;-1:-1:-1;4789:8:1;;4651:119;3926:904;-1:-1:-1;;;3926:904:1:o;5411:344::-;5478:6;5486;5539:2;5527:9;5518:7;5514:23;5510:32;5507:52;;;5555:1;5552;5545:12;5507:52;5594:9;5581:23;5613:56;5663:5;5613:56;:::i;:::-;5688:5;-1:-1:-1;5712:37:1;5745:2;5730:18;;5712:37;:::i;:::-;5702:47;;5411:344;;;;;:::o;5760:184::-;5812:77;5809:1;5802:88;5909:4;5906:1;5899:15;5933:4;5930:1;5923:15;5949:250;6016:2;6010:9;6058:6;6046:19;;6095:18;6080:34;;6116:22;;;6077:62;6074:88;;;6142:18;;:::i;:::-;6178:2;6171:22;5949:250;:::o;6204:118::-;6290:5;6283:13;6276:21;6269:5;6266:32;6256:60;;6312:1;6309;6302:12;6327:128;6392:20;;6421:28;6392:20;6421:28;:::i;6460:620::-;6518:5;6566:4;6554:9;6549:3;6545:19;6541:30;6538:50;;;6584:1;6581;6574:12;6538:50;6617:4;6611:11;6661:4;6653:6;6649:17;6732:6;6720:10;6717:22;6696:18;6684:10;6681:34;6678:62;6675:88;;;6743:18;;:::i;:::-;6779:4;6772:24;6814:6;-1:-1:-1;6814:6:1;6844:23;;6876:30;6844:23;6876:30;:::i;:::-;6915:23;;6990:2;6975:18;;6962:32;7003:30;6962:32;7003:30;:::i;:::-;7061:2;7049:15;;;;7042:32;6460:620;;-1:-1:-1;;6460:620:1:o;7085:754::-;7145:5;7193:4;7181:9;7176:3;7172:19;7168:30;7165:50;;;7211:1;7208;7201:12;7165:50;7244:2;7238:9;7286:4;7278:6;7274:17;7357:6;7345:10;7342:22;7321:18;7309:10;7306:34;7303:62;7300:88;;;7368:18;;:::i;:::-;7404:2;7397:22;7437:6;-1:-1:-1;7437:6:1;7467:27;7484:9;7467:27;:::i;:::-;7459:6;7452:43;7556:2;7545:9;7541:18;7528:32;7523:2;7515:6;7511:15;7504:57;7613:2;7602:9;7598:18;7585:32;7626:30;7648:7;7626:30;:::i;:::-;7684:2;7672:15;;7665:32;7749:2;7734:18;;7721:32;7762:30;7721:32;7762:30;:::i;:::-;7820:2;7808:15;;;;7801:32;7085:754;;-1:-1:-1;;7085:754:1:o;7844:778::-;7887:5;7940:3;7933:4;7925:6;7921:17;7917:27;7907:55;;7958:1;7955;7948:12;7907:55;7994:6;7981:20;8020:18;8057:2;8053;8050:10;8047:36;;;8063:18;;:::i;:::-;8197:2;8191:9;8259:4;8251:13;;8102:66;8247:22;;;8271:2;8243:31;8239:40;8227:53;;;8295:18;;;8315:22;;;8292:46;8289:72;;;8341:18;;:::i;:::-;8381:10;8377:2;8370:22;8416:2;8408:6;8401:18;8462:3;8455:4;8450:2;8442:6;8438:15;8434:26;8431:35;8428:55;;;8479:1;8476;8469:12;8428:55;8543:2;8536:4;8528:6;8524:17;8517:4;8509:6;8505:17;8492:54;8590:1;8583:4;8578:2;8570:6;8566:15;8562:26;8555:37;8610:6;8601:15;;;;;;7844:778;;;;:::o;8627:152::-;8704:20;;8753:1;8743:12;;8733:40;;8769:1;8766;8759:12;8784:1324;8841:5;8889:6;8877:9;8872:3;8868:19;8864:32;8861:52;;;8909:1;8906;8899:12;8861:52;8931:17;;:::i;:::-;8922:26;;8971:45;9012:3;9001:9;8971:45;:::i;:::-;8964:5;8957:60;9051:56;9103:3;9098:2;9087:9;9083:18;9051:56;:::i;:::-;9044:4;9037:5;9033:16;9026:82;9159:3;9148:9;9144:19;9131:33;9187:18;9179:6;9176:30;9173:50;;;9219:1;9216;9209:12;9173:50;9255:46;9297:3;9288:6;9277:9;9273:22;9255:46;:::i;:::-;9250:2;9243:5;9239:14;9232:70;;9364:3;9353:9;9349:19;9336:33;9329:4;9322:5;9318:16;9311:59;9389:3;9426:47;9469:2;9458:9;9454:18;9426:47;:::i;:::-;9419:4;9412:5;9408:16;9401:73;9493:3;9558:2;9547:9;9543:18;9530:32;9523:4;9516:5;9512:16;9505:58;9582:3;9646:2;9635:9;9631:18;9618:32;9612:3;9605:5;9601:15;9594:57;9670:3;9734:2;9723:9;9719:18;9706:32;9700:3;9693:5;9689:15;9682:57;9758:3;9793:35;9824:2;9813:9;9809:18;9793:35;:::i;:::-;9788:2;9781:5;9777:14;9770:59;9861:39;9892:6;9881:9;9877:22;9861:39;:::i;:::-;9856:2;9849:5;9845:14;9838:63;9933:36;9964:3;9953:9;9949:19;9933:36;:::i;:::-;9928:2;9921:5;9917:14;9910:60;10030:3;10019:9;10015:19;10002:33;9997:2;9990:5;9986:14;9979:57;10096:3;10085:9;10081:19;10068:33;10063:2;10056:5;10052:14;10045:57;;;;;;8784:1324;;;;:::o;10113:351::-;10200:6;10253:2;10241:9;10232:7;10228:23;10224:32;10221:52;;;10269:1;10266;10259:12;10221:52;10309:9;10296:23;10342:18;10334:6;10331:30;10328:50;;;10374:1;10371;10364:12;10328:50;10397:61;10450:7;10441:6;10430:9;10426:22;10397:61;:::i;10950:529::-;11043:6;11051;11059;11112:2;11100:9;11091:7;11087:23;11083:32;11080:52;;;11128:1;11125;11118:12;11080:52;11151:28;11169:9;11151:28;:::i;:::-;11141:38;;11230:2;11219:9;11215:18;11202:32;11257:18;11249:6;11246:30;11243:50;;;11289:1;11286;11279:12;11243:50;11328:91;11411:7;11402:6;11391:9;11387:22;11328:91;:::i;:::-;10950:529;;11438:8;;-1:-1:-1;11302:117:1;;-1:-1:-1;;;;10950:529:1:o;11484:163::-;11551:20;;11611:10;11600:22;;11590:33;;11580:61;;11637:1;11634;11627:12;11652:326;11725:6;11733;11741;11794:2;11782:9;11773:7;11769:23;11765:32;11762:52;;;11810:1;11807;11800:12;11762:52;11833:27;11850:9;11833:27;:::i;:::-;11823:37;;11879;11912:2;11901:9;11897:18;11879:37;:::i;:::-;11869:47;;11935:37;11968:2;11957:9;11953:18;11935:37;:::i;:::-;11925:47;;11652:326;;;;;:::o;11983:313::-;12047:6;12055;12108:2;12096:9;12087:7;12083:23;12079:32;12076:52;;;12124:1;12121;12114:12;12076:52;12147:28;12165:9;12147:28;:::i;:::-;12137:38;;12225:2;12214:9;12210:18;12197:32;12238:28;12260:5;12238:28;:::i;:::-;12285:5;12275:15;;;11983:313;;;;;:::o;12301:423::-;12396:6;12404;12457:2;12445:9;12436:7;12432:23;12428:32;12425:52;;;12473:1;12470;12463:12;12425:52;12496:28;12514:9;12496:28;:::i;:::-;12486:38;;12575:2;12564:9;12560:18;12547:32;12602:18;12594:6;12591:30;12588:50;;;12634:1;12631;12624:12;12588:50;12657:61;12710:7;12701:6;12690:9;12686:22;12657:61;:::i;:::-;12647:71;;;12301:423;;;;;:::o;12729:419::-;12825:6;12833;12886:2;12874:9;12865:7;12861:23;12857:32;12854:52;;;12902:1;12899;12892:12;12854:52;12942:9;12929:23;12975:18;12967:6;12964:30;12961:50;;;13007:1;13004;12997:12;12961:50;13030:61;13083:7;13074:6;13063:9;13059:22;13030:61;:::i;:::-;13020:71;13138:2;13123:18;;;;13110:32;;-1:-1:-1;;;;12729:419:1:o;13153:600::-;13254:6;13262;13270;13278;13331:2;13319:9;13310:7;13306:23;13302:32;13299:52;;;13347:1;13344;13337:12;13299:52;13370:27;13387:9;13370:27;:::i;:::-;13360:37;;13416;13449:2;13438:9;13434:18;13416:37;:::i;:::-;13406:47;;13504:2;13493:9;13489:18;13476:32;13531:18;13523:6;13520:30;13517:50;;;13563:1;13560;13553:12;13517:50;13602:91;13685:7;13676:6;13665:9;13661:22;13602:91;:::i;:::-;13153:600;;;;-1:-1:-1;13712:8:1;-1:-1:-1;;;;13153:600:1:o;13758:435::-;13811:3;13849:5;13843:12;13876:6;13871:3;13864:19;13902:4;13931:2;13926:3;13922:12;13915:19;;13968:2;13961:5;13957:14;13989:1;13999:169;14013:6;14010:1;14007:13;13999:169;;;14074:13;;14062:26;;14108:12;;;;14143:15;;;;14035:1;14028:9;13999:169;;;-1:-1:-1;14184:3:1;;13758:435;-1:-1:-1;;;;;13758:435:1:o;14198:465::-;14455:2;14444:9;14437:21;14418:4;14481:56;14533:2;14522:9;14518:18;14510:6;14481:56;:::i;:::-;14585:9;14577:6;14573:22;14568:2;14557:9;14553:18;14546:50;14613:44;14650:6;14642;14613:44;:::i;:::-;14605:52;14198:465;-1:-1:-1;;;;;14198:465:1:o;14857:258::-;14929:1;14939:113;14953:6;14950:1;14947:13;14939:113;;;15029:11;;;15023:18;15010:11;;;15003:39;14975:2;14968:10;14939:113;;;15070:6;15067:1;15064:13;15061:48;;;-1:-1:-1;;15105:1:1;15087:16;;15080:27;14857:258::o;15120:317::-;15162:3;15200:5;15194:12;15227:6;15222:3;15215:19;15243:63;15299:6;15292:4;15287:3;15283:14;15276:4;15269:5;15265:16;15243:63;:::i;:::-;15351:2;15339:15;15356:66;15335:88;15326:98;;;;15426:4;15322:109;;15120:317;-1:-1:-1;;15120:317:1:o;15442:184::-;15494:77;15491:1;15484:88;15591:4;15588:1;15581:15;15615:4;15612:1;15605:15;15631:296;15714:1;15707:5;15704:12;15694:200;;15750:77;15747:1;15740:88;15851:4;15848:1;15841:15;15879:4;15876:1;15869:15;15694:200;15903:18;;15631:296::o;15932:1509::-;14759:12;;14752:20;14745:28;14733:41;;14837:4;14826:16;;;14820:23;14813:31;14806:39;14790:14;;;14783:63;16621:4;16612:6;16606:13;16602:24;16597:2;16586:9;16582:18;16575:52;16681:4;16673:6;16669:17;16663:24;16658:2;16647:9;16643:18;16636:52;16757:2;16749:6;16745:15;16739:22;16732:30;16725:38;16719:3;16708:9;16704:19;16697:67;16833:2;16825:6;16821:15;16815:22;16808:30;16801:38;16795:3;16784:9;16780:19;16773:67;16877:3;16871;16860:9;16856:19;16849:32;16499:4;16898:46;16939:3;16928:9;16924:19;16916:6;16898:46;:::i;:::-;16890:54;;16981:6;16975:3;16964:9;16960:19;16953:35;16997:56;17048:3;17037:9;17033:19;17025:6;16997:56;:::i;:::-;17090:6;17084:3;17073:9;17069:19;17062:35;17134:6;17128:3;17117:9;17113:19;17106:35;17178:6;17172:3;17161:9;17157:19;17150:35;17194:44;17233:3;17222:9;17218:19;17210:6;10732:13;10725:21;10713:34;;10662:91;17194:44;10732:13;;10725:21;17286:3;17271:19;;10713:34;10732:13;;10725:21;17340:3;17325:19;;10713:34;17376:3;17361:19;;17354:36;;;;17421:3;17406:19;17399:36;15932:1509;;-1:-1:-1;;;;;;;;;;;15932:1509:1:o;17912:1171::-;18117:6;18125;18133;18141;18149;18157;18210:3;18198:9;18189:7;18185:23;18181:33;18178:53;;;18227:1;18224;18217:12;18178:53;18250:28;18268:9;18250:28;:::i;:::-;18240:38;;18329:2;18318:9;18314:18;18301:32;18352:18;18393:2;18385:6;18382:14;18379:34;;;18409:1;18406;18399:12;18379:34;18432:77;18501:7;18492:6;18481:9;18477:22;18432:77;:::i;:::-;18422:87;;18562:2;18551:9;18547:18;18534:32;18518:48;;18591:2;18581:8;18578:16;18575:36;;;18607:1;18604;18597:12;18575:36;18646:93;18731:7;18720:8;18709:9;18705:24;18646:93;:::i;:::-;18758:8;;-1:-1:-1;18620:119:1;-1:-1:-1;18846:2:1;18831:18;;18818:32;;-1:-1:-1;18862:16:1;;;18859:36;;;18891:1;18888;18881:12;18859:36;;18930:93;19015:7;19004:8;18993:9;18989:24;18930:93;:::i;:::-;17912:1171;;;;-1:-1:-1;17912:1171:1;;-1:-1:-1;17912:1171:1;;19042:8;;17912:1171;-1:-1:-1;;;17912:1171:1:o;19088:241::-;19144:6;19197:2;19185:9;19176:7;19172:23;19168:32;19165:52;;;19213:1;19210;19203:12;19165:52;19252:9;19239:23;19271:28;19293:5;19271:28;:::i;19334:652::-;19447:6;19455;19463;19471;19524:3;19512:9;19503:7;19499:23;19495:33;19492:53;;;19541:1;19538;19531:12;19492:53;19564:28;19582:9;19564:28;:::i;:::-;19554:38;;19643:2;19632:9;19628:18;19615:32;19670:18;19662:6;19659:30;19656:50;;;19702:1;19699;19692:12;19656:50;19725:61;19778:7;19769:6;19758:9;19754:22;19725:61;:::i;:::-;19715:71;;;19833:2;19822:9;19818:18;19805:32;19795:42;;19887:2;19876:9;19872:18;19859:32;19900:56;19950:5;19900:56;:::i;:::-;19334:652;;;;-1:-1:-1;19334:652:1;;-1:-1:-1;;19334:652:1:o;20290:322::-;20364:6;20372;20380;20433:2;20421:9;20412:7;20408:23;20404:32;20401:52;;;20449:1;20446;20439:12;20401:52;20472:28;20490:9;20472:28;:::i;:::-;20462:38;;20519:36;20551:2;20540:9;20536:18;20519:36;:::i;:::-;20509:46;;20602:2;20591:9;20587:18;20574:32;20564:42;;20290:322;;;;;:::o;22731:184::-;22783:77;22780:1;22773:88;22880:4;22877:1;22870:15;22904:4;22901:1;22894:15;22920:128;22960:3;22991:1;22987:6;22984:1;22981:13;22978:39;;;22997:18;;:::i;:::-;-1:-1:-1;23033:9:1;;22920:128::o;23053:184::-;23105:77;23102:1;23095:88;23202:4;23199:1;23192:15;23226:4;23223:1;23216:15;24642:238;24679:3;24723:4;24716:5;24712:16;24747:7;24737:41;;24758:18;;:::i;:::-;24807:66;24794:80;;24642:238;-1:-1:-1;;24642:238:1:o;25298:580::-;25375:4;25381:6;25441:11;25428:25;25531:66;25520:8;25504:14;25500:29;25496:102;25476:18;25472:127;25462:155;;25613:1;25610;25603:12;25462:155;25640:33;;25692:20;;;-1:-1:-1;25735:18:1;25724:30;;25721:50;;;25767:1;25764;25757:12;25721:50;25800:4;25788:17;;-1:-1:-1;25831:14:1;25827:27;;;25817:38;;25814:58;;;25868:1;25865;25858:12;26469:228;26509:7;26635:1;26567:66;26563:74;26560:1;26557:81;26552:1;26545:9;26538:17;26534:105;26531:131;;;26642:18;;:::i;:::-;-1:-1:-1;26682:9:1;;26469:228::o;26702:325::-;26790:6;26785:3;26778:19;26842:6;26835:5;26828:4;26823:3;26819:14;26806:43;;26894:1;26887:4;26878:6;26873:3;26869:16;26865:27;26858:38;26760:3;27016:4;26946:66;26941:2;26933:6;26929:15;26925:88;26920:3;26916:98;26912:109;26905:116;;26702:325;;;;:::o;27032:698::-;27331:6;27320:9;27313:25;27374:3;27369:2;27358:9;27354:18;27347:31;27294:4;27401:62;27458:3;27447:9;27443:19;27435:6;27427;27401:62;:::i;:::-;27511:9;27503:6;27499:22;27494:2;27483:9;27479:18;27472:50;27539:49;27581:6;27573;27565;27539:49;:::i;:::-;-1:-1:-1;;;;;27624:55:1;;;;27619:2;27604:18;;27597:83;-1:-1:-1;;27711:3:1;27696:19;27689:35;27531:57;27032:698;-1:-1:-1;;;;;27032:698:1:o;27735:184::-;27805:6;27858:2;27846:9;27837:7;27833:23;27829:32;27826:52;;;27874:1;27871;27864:12;27826:52;-1:-1:-1;27897:16:1;;27735:184;-1:-1:-1;27735:184:1:o;28586:245::-;28653:6;28706:2;28694:9;28685:7;28681:23;28677:32;28674:52;;;28722:1;28719;28712:12;28674:52;28754:9;28748:16;28773:28;28795:5;28773:28;:::i;29592:372::-;14759:12;;14752:20;14745:28;14733:41;;14837:4;14826:16;;;14820:23;14813:31;14806:39;14790:14;;;14783:63;29893:2;29888;29877:9;29873:18;29866:30;29790:4;29913:45;29954:2;29943:9;29939:18;29931:6;29913:45;:::i;29969:197::-;30007:3;30035:6;30076:2;30069:5;30065:14;30103:2;30094:7;30091:15;30088:41;;;30109:18;;:::i;:::-;30158:1;30145:15;;29969:197;-1:-1:-1;;;29969:197:1:o;31308:184::-;31366:6;31419:2;31407:9;31398:7;31394:23;31390:32;31387:52;;;31435:1;31432;31425:12;31387:52;31458:28;31476:9;31458:28;:::i;31497:195::-;31536:3;31567:66;31560:5;31557:77;31554:103;;;31637:18;;:::i;:::-;-1:-1:-1;31684:1:1;31673:13;;31497:195::o;32102:125::-;32142:4;32170:1;32167;32164:8;32161:34;;;32175:18;;:::i;:::-;-1:-1:-1;32212:9:1;;32102:125::o;33359:276::-;33490:3;33528:6;33522:13;33544:53;33590:6;33585:3;33578:4;33570:6;33566:17;33544:53;:::i;:::-;33613:16;;;;;33359:276;-1:-1:-1;;33359:276:1:o;33640:291::-;33817:6;33806:9;33799:25;33860:2;33855;33844:9;33840:18;33833:30;33780:4;33880:45;33921:2;33910:9;33906:18;33898:6;33880:45;:::i;34560:437::-;34639:1;34635:12;;;;34682;;;34703:61;;34757:4;34749:6;34745:17;34735:27;;34703:61;34810:2;34802:6;34799:14;34779:18;34776:38;34773:218;;;34847:77;34844:1;34837:88;34948:4;34945:1;34938:15;34976:4;34973:1;34966:15;35002:175;35039:3;35083:4;35076:5;35072:16;35112:4;35103:7;35100:17;35097:43;;;35120:18;;:::i;:::-;35169:1;35156:15;;35002:175;-1:-1:-1;;35002:175:1:o;38423:2472::-;-1:-1:-1;;;;;38821:15:1;;;38803:34;;38690:2;38856;38874:18;;;38867:30;;;38715:18;;;38932:22;;;38661:4;;38973:2;;38991:18;;;39028:1;39071:15;;;39056:31;;39052:40;;39115:6;38661:4;39149:1717;39163:6;39160:1;39157:13;39149:1717;;;39252:66;39240:9;39232:6;39228:22;39224:95;39219:3;39212:108;39372:6;39359:20;39459:66;39450:6;39434:14;39430:27;39426:100;39406:18;39402:125;39392:153;;39541:1;39538;39531:12;39392:153;39571:31;;39629:15;;;39672:19;;39704:58;39672:19;39704:58;:::i;:::-;39790:16;;39775:32;;39861:14;;;39848:28;39933:14;39929:26;;;39957:66;39925:99;39899:126;;39889:154;;40039:1;40036;40029:12;39889:154;40071:32;;40130:21;;40178:18;40167:30;;40164:50;;;40210:1;40207;40200:12;40164:50;40269:6;40265:2;40261:15;40245:14;40241:36;40234:5;40230:48;40227:68;;;40291:1;40288;40281:12;40227:68;40315:15;;;40308:27;;;40380:22;;;;40424:15;;;;-1:-1:-1;40468:16:1;;;40508:1;;40522:236;40538:6;40533:3;40530:15;40522:236;;;40646:10;40617:27;40635:8;40617:27;:::i;:::-;40613:44;40599:59;;40684:14;;;;40727:17;;;;40564:1;40555:11;;;;;40522:236;;;-1:-1:-1;;;40844:12:1;;;;40781:5;-1:-1:-1;40809:15:1;;;;39185:1;39178:9;39149:1717;;;-1:-1:-1;40883:6:1;;38423:2472;-1:-1:-1;;;;;;;;;;;;38423:2472:1:o;44097:274::-;44137:1;44163;44153:189;;44198:77;44195:1;44188:88;44299:4;44296:1;44289:15;44327:4;44324:1;44317:15;44153:189;-1:-1:-1;44356:9:1;;44097:274::o;46102:276::-;46172:6;46225:2;46213:9;46204:7;46200:23;46196:32;46193:52;;;46241:1;46238;46231:12;46193:52;46273:9;46267:16;46292:56;46342:5;46292:56;:::i
Swarm Source
ipfs://dc9206b563bed21b7dd9fabfe834b5c0b833bfc066be200c175cbea12f069293
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1,614.37 | 0.000000000000001296 | <$0.000001 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.