ERC-721
Overview
Max Total Supply
4,444 DEGENARIOS
Holders
1,455
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 DEGENARIOSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Degenarios
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-29 */ pragma solidity ^0.8.9; /* ▓█████▄ ▓█████ ▄████ ▓█████ ███▄ █ ▄▄▄ ██▀███ ██▓ ▒█████ ██████ ▒██▀ ██▌▓█ ▀ ██▒ ▀█▒▓█ ▀ ██ ▀█ █ ▒████▄ ▓██ ▒ ██▒▓██▒▒██▒ ██▒▒██ ▒ ░██ █▌▒███ ▒██░▄▄▄░▒███ ▓██ ▀█ ██▒▒██ ▀█▄ ▓██ ░▄█ ▒▒██▒▒██░ ██▒░ ▓██▄ ░▓█▄ ▌▒▓█ ▄ ░▓█ ██▓▒▓█ ▄ ▓██▒ ▐▌██▒░██▄▄▄▄██ ▒██▀▀█▄ ░██░▒██ ██░ ▒ ██▒ ░▒████▓ ░▒████▒░▒▓███▀▒░▒████▒▒██░ ▓██░ ▓█ ▓██▒░██▓ ▒██▒░██░░ ████▓▒░▒██████▒▒ ▒▒▓ ▒ ░░ ▒░ ░ ░▒ ▒ ░░ ▒░ ░░ ▒░ ▒ ▒ ▒▒ ▓▒█░░ ▒▓ ░▒▓░░▓ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░ ░ ▒ ▒ ░ ░ ░ ░ ░ ░ ░ ░░ ░░ ░ ▒░ ▒ ▒▒ ░ ░▒ ░ ▒░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ▒ ░░ ░ ▒ ░░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @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; } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @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); } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) /** * @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); } } } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @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; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _transferOwnership(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // Creator: Chiru Labs /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply */ abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function totalSupply() public view override returns (uint256) { return currentIndex; } function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert('ERC721A: unable to get token of owner by index'); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert('ERC721A: unable to determine the owner of token'); } function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } 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())) : ''; } function _baseURI() internal view virtual returns (string memory) { return ''; } function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); require(quantity != 0, 'ERC721A: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; bytes internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000" hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000" hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000" hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } function decode(string memory _data) internal pure returns (bytes memory) { bytes memory data = bytes(_data); if (data.length == 0) return new bytes(0); require(data.length % 4 == 0, "invalid base64 decoder input"); // load the table into memory bytes memory table = TABLE_DECODE; // every 4 characters represent 3 bytes uint256 decodedLen = (data.length / 4) * 3; // add some extra buffer at the end required for the writing bytes memory result = new bytes(decodedLen + 32); assembly { // padding with '=' let lastBytes := mload(add(data, mload(data))) if eq(and(lastBytes, 0xFF), 0x3d) { decodedLen := sub(decodedLen, 1) if eq(and(lastBytes, 0xFFFF), 0x3d3d) { decodedLen := sub(decodedLen, 1) } } // set the actual output length mstore(result, decodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 4 characters at a time for {} lt(dataPtr, endPtr) {} { // read 4 characters dataPtr := add(dataPtr, 4) let input := mload(dataPtr) // write 3 bytes let output := add( add( shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)), shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))), add( shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)), and(mload(add(tablePtr, and( input , 0xFF))), 0xFF) ) ) mstore(resultPtr, shl(232, output)) resultPtr := add(resultPtr, 3) } } return result; } } library degenSVG { function font() internal pure returns (string memory) { return "@font-face { font-family: 'Press Start 2P'; src: url(data:application/octet-stream;base64,d09GMgABAAAAABIwAAwAAAAARfwAABHeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIJkBmAAhGwRCArwVNJjC4NCAAE2AiQDg0YEIAWESgeEUBt0NKOimnQXsv+etMZtc/arCoLMrlTj7sDDSKhoUo3QokyEBuILd6hJ40F4FXopS5/npS0+vfFbtFjG0rBo5IMjJJmF52s/9ufuYm7JPWpjKIFFvLkmtxJJpBeJ9k1+sHt9seo09wkF9KUAMddTJ4PqrU4k6vA8cd/+3F4aRrslvIPvFG4b+KPGM8jwU/Y36of72SLj/b/gqKS1RoRoEc9GKZB3OJA7/e0PcDdQJ3cILJIWaIilGFQZNC/BH8YT4JtfN9UjBClpkRKGh4wdSwUHa5Oa2mglCDeSwGnlec+nnU3ppLarQIb3fKt0KpW30sgOmJ/8SiMNfI+3WRgOwyyc8p9c8g6UfnIl3+h0raH/39KUzujubMm1wFJRGkClPR7UHg9g1p/5+z07Gk286z01y11uV9zPSd9Znd9buZSG/IxSGnUupVbkZ5gXmo5IEEkwDeB5G0MDDaBcbCJGvKK/lzX7F2hhD9mKx6OsGyHFIYwxhpiOcWT5p/84v2cEOKk0XfRokivimJvacoxL5ydq2C8CkvEfUxRbdruHD8KGDfILQbP//xfsgxNv73HT69Rw3IEmjSGODhBsM0og/XjryoklswHCgQgTzUcyYaNDtDlRbETWFyoRioA6qJpTcWGn75e3GxKtTRTRDOlJEc0P8c2mxdgxTTQ3dqYkvTDVU/CnDJoq/sFKjGQa9nCm9rGf67qIUOogRSpICCt9yd6weJVt4qDKUQXUVS8rK9ycAbC1vK29z1g2zcdxl0FUnfgFQH/JugvYAqDeTTKsSaf5iCE61sjPKwcilg/AVTqJEf/x5hQqp3FXD/WKEIECNICCETwQg4BEUGSHHFAxhgngKgKb1OaYk9eYJgQZqG7Y/ZPg8weaAPzXgX8NBgvrCayTmbU02a/7z1nun4LPvigAGYB6z4E8slwg5cfm4v84bdlGa511xwOb7LLbEpestM86W6yw2XVXXbPefbFcuHLnaZTRxhhrogIILBwCBhY2Di4eMQkpGYUdltrppa3eUzIysbBx8/DyiShUpESpcvUaNWnWqk23Hr36DNrmue1uOmWN084744IXHnnnMdQBt+z3xAfP3DDXPK/d9tAyb8wx4qBFFlpsg0S27Dix58iZG1/ZcuTKN854E2TCoyAioSG7jEqET0BIjqmFloqanoaOgZmLnYNTWEBQiFWZahUq1apyRY0u7Tp06tdgAF2dvfY46pgjosgH8wFYAOQFyH947nDg/QawAzEA0ABA0TS1WMELEyix0JrLBATJWLWqNlfScLusyNsTsFUzKVPKgowhgAxev1BOwhHtipUDcfFJq7YEBhJqcpg0qMKO5JKQHRMKxDsj4Tka/HCmTbVLuilAcG8xZ+Pb1WqdzXJlLVtkzVzZAPI83dm97xLdTLKZAYNo9Td53FAvaWs+V/qWVwZR59f+RqWW3K/vbIWTelfBkFa2+j8bNeujVpRB1OxRWwm6/dADY0lvz14HYWTA2EA2n1v+vD03YJ51oCE+Px6ts7XRy7JZoivgY+CL+epha6m9KdqwyTVkJZe5zlTbZW64j58ze3jcQneQaqNeWxHIt5EKc23/3j0pSCiwtxym8bNHqdeSFxbL2q5rcWFw8LpArW2AI2wvkGySPsNC6EhMP8Rlqvu3t12BBIsLpXFxSTjcKAFNoRCcDn44jgSoLmUGmh01pCgM9XyqBbD3XHigD3Ampe/C52UE5G6EfJCiObarZ5gz7eMXITcImWb0ADLOgRBC67I0NDYkbpsw8+ugZKnoXSj2LyQmeRA4ZSmhtXuDJ6ycBOJqlCtVbYtdU9WxrwF9nuXokQgM8LZdSJXZ2hAPDCmPehSvppfuHYW8EHaqOFUfEA69BiWLLHlJ9ZbaXbWhl5hJSwCi+1MFQ6bWGAzRQVaIhR6akKQv9doyTxsjGzfCnBdUzbLNdXzpqVvLbfUWgWPgAAuFx01pjobrGKGAtWvh4Gh1YeKU2BCnKhUpGGC8cdUryD0WvcielSh54lBV+Pqsk65wMjyKkSms7jTkwzUlRi0bpYcVgY8vaRrhhlpE1tqri1SQVQK6BddNylzUNPLs6SwLc3GsjhBx34qjmgiFL01hoY84knFsRgIIG7SFS1BBzc1cOgmESZ/HiDlpghnyEiVS14exuPBHW8ROQAUESmGyVlzXxmKsAUJiHHOiDnPqjsZCk0i22ByPVtBjguWMkOXgwkTls1AiuPXXhiL2qWQyen6DTSKKzK5HAhIm2yJQ4aA5HQ5h9O8sI+iZ7AAWAY5Ykik8WUJS1VTqBn3hiy3DAIIUWHFq2NWV4u0rsUWoktmVPzdebhIJual46yshudFAMIfLwDF+QKIJ0p2HfJiRh8YlaIXI2ticIgR4DdAL90zEi1cTpdUDSTZ0BTbTvkAtWtgbAd3Vv3SXw3BJ9JQMq5Ks1PqI5/Vgp+bak1QMlyVQoZuguiz0D2czByKuwlOGC5NxRUJOubK4EK4VwGWDhGQ7BFF90ts8GRY2nggRUUcIuJlYEhZirYvEmihBEEGOYuUia4ywC5PHkjNrWcoyl22Wo5o9CJGfjVMWV9aS1JV4LtvyGVd79mzvLzQtXEZZPD6CNEp5jWBoJSAQO5bUzRd7JUuvFvYJlkAdUMEVwEizAWZxNrWYThxG5UDrUoPjEUZFvugyD+sRguC69hpiVmIUrgcYdv+K92yZlG7LMLtzU0RdGPDFqEoTiQBZ8oU51sh6gR3kUlsWGSKWvgNBDtFy8bkh13KGKg0kdIvwRxJFYbw7H9B7MHVj6z4e2JmMT4xAF9/VCpP+aRRrnFDE4rogs9ydWYitjhEj8fRYOEccQOecCCbB8aI+m2swLwRIW0i4ehCDSK0K0epXnWYEyl7gTzNsC5kh12IeIw8qsMVc29HvgNREll1gdCOxtUapVPWtu0Fz1tatzmAdXAZrptRUltdjj/npaiop+iPsX4oc6JiP2yAmDmxn2C20vX4XfpTVrkyyOUfzko7quIw266JENhBz/nyF1L9gvqoX0o1XCBJEeTrtbXOpCzMVdij0iYbooULAKehWdh5b6+QHScnmhHbpCvgirlRiUjSasFM92egL/uyikeX4i36VucwxR2wom/6YJnVnVuBFX57PgkSss4z64kal3rXCj3hZ/nhmE76FXB/NjpZ6bMAj7IU658/047OYdZ0l00WaJftgU5K5k9N4mnCdn/i1Zcd19LdO/yo07ARwjkESwATiS9h0nalZhF8mhn0FM2AAhzjWTpe8mNSyKChSAd86f167QERonqiDkQhY52Exr/pywCuwdsDzj+vRZTo1OvcHFkQeuP+4bZ/KcmDOdL9Po2xh3iqnE6dcYsaLTXycT5N6OgzJf+UM5cc6627JiAgoN4AAOlGkAFA3A95VYMnLGSoLehWH5uYbN1dvU8cIEH4/Ad1BJ9f0/138jpXJwZDjHG+1tVlYuII7G7uReOehlmQdOBoDhPI6EMQc9yrqxRWs7jIQRFmByXDXi1zZmPWKX2DuL6S8fB3t6V8tZq8kt499gxw467V1xzgdknkvcBj7XX0RqX2/9xv7zl4FjbeL4h7LOWMQ0tKBA3J5RVK21y6GdDhx68KoaeQfADCRP4SElrUlDq7WZaLlInQoC5vo5MAppBnOoaIY1d6VY6q1eyeBd1Bb8XFTbuGaEoD69EWC2fcA80SfvmkA8BdBr3rvqOV8uNW0IhL6qYFI23LBJq/65vEgNb4faIoBmfBSNRXJ5rsEsAVliiO2ZHwkNdLd255IaHxDf2CqOLrECBW8lyPwnu9jAJsN1RY1ZoMmBtvoCTYUPpU/PK60vDQn2PpAaicnzEipLLMC9hh7Tsdy8YuUrveBaHkcgTfloctjCCoyiIOS0zCMCTVOMZ5GaMoZOUCqIj1KquTGglJ065RQJzhic6CfZQzvLMzaIfENsfoY+BvxXuv0eQOLYF4Rg3uEi3yzGyAZl5JtFCmWLrZrOJ3uzGf7SXIm61wUvu1MzOud8XVA8fNVObSaWnPoNAEEgflCAGudrG8Bd4YwDM/pSUIW4fc2kYIrAY/TmLu9C/tJkbddrmfoxuJ2bEHDUtEf0dA4ZwVVPa6RZqmeRl8nJlmQvvC+roZ7I4UXHe/RznnPLfw4zm9X1w+2tWZBaM5ir30HCC6DAbqvQBWam/d1MiHp2MObH+svhbk5h33ORK7pW19fWxgI22zf3hy2/DfeglElIjqTw0Oxb0m8+yfdQXwqNY60h2Xy+E9ie9EOFcLzZcKJQGmri5q0NRXmwNl4ysUEQyi3yAFDOFj2IS6GNbfTjHUofdh3x85aOkN9XDi3xwaVnGNPjO1uqZzSh+QGRgiewnb7zsE7/mbcQjgkSSsWKLvqPBRdPEdwx3Ez6CVv3SGV5u0QOQf7RDkIbil8j+VuwjchlTd879KYTDXEByuhaaQ8M/KmriyHii2qifOccfXuyNSnodZxHRV4b9fahiQCxEzYynWTyUnSFynV5jdLYN9E8K5h5NhAul+hmyk2UgD1pCgYEQ2eCeBB3QfX2v+5TtNld501cLsHclZIEIs3ELvSfVbtwXN714gkidYwEr7XGzMHi3pGvAMsa5TkPN4cqJ+bsMKgJb2rG5q8ZKs3z9DlMq7zHx7WEnkPbl8W9i+wi7oYDRKutLGokPT33pOD081+aDxWifvTjB20afEp4uJDLU8z2tfCbQvpYwwW1aSzSQ5cKB4UlkmnC6rFXhVu59wOXCiqn/83fRfF5TzvJ7m/uZJr+eGpH9TSA5Lixol0z9F0JX/4pHMhMIH9RMBeqdr73BkEU0vuca5kX1gZ2QnPa+wREsLAUzCJQa4qRMAmFXEevX1fojas0OuOtE+ZZXKkSyg2QaiFLC2GVpVeJjUTq3Xb6Iwk7ozXA5R+hPs4PxZ9MWqz+Kuwntw+buj63wEpnYgY+rGrLgju+eJ/BVC1Y44qCSEn3yXg+AwWJPNXvJm3bpNiz8YZCeQzpv7PyVbF9X61eut91vNpZmj+pt1SEN1/271pqjbAoUfnnsB2J/sx/ci3HtaLkLddbbxBgcfSu7Sl2V8xhHAqfRjfd6v+Oz7GCvnG+BvCDEFAAzaGN9618ILvysU3Q2hxv1paUB08OcvFOC3q9ZKlWVmlT9Hp9vId9ajaEt+F2ODOeteHC3Nm3BCt4gCvbX6DHjlICScjwcWc21MUOg6UHcthyrs1xaD4EgU0Viaq6873nYubAjz34L9a//b+lUXkxl5zkeBB4bmbKMBwliAKaOduJLHmGaVtBDfX33VIyYBrcleNxqkaqPkbNuZX2aTJDCrbfhkjOMzE5bRRcUijeO2GCrdq7qGBjV95NlAg91Sj0pVBoaKARSxVjARKMY95gLuaRBQBDnrEkKoj8BJGNkOE+DFDcWPN0AptnWEjRe8MW0GKZ9hJwFdutAbo1a1T2kmxNuxSpVODV91pNFOXau6qbaLqdhu6GNm5naqBz9PFp1uFTt243Bi8atTp0ZyqIOpO/YHatELwMLHL2CKNJBrJbwCJa/zVyOhEeBnIzLtS/01uqtOm3YDr9Tr1KvlQeQXhD6ym39rYUWnTuNVViopGD+p63wF4YLIqbaoNUBv0CK9RYoZ6oG4UdIg+DRrSC7rLg6o3dVVDGFPA7XKq0GLPzmNzg2WVCv+PvulyhQXkUenLGeOOWyodUOWgxQiIqpF8RlbjtrvuoaCiobvvgYceYWBiheglVctv/tgTdZ5Z4pDDeL4/yv5iImLPvVDv5QP6D5b7SkGv4dF71chdLTYzuLepyRdm7T57Px0srGzsXunWq0/P4+81V0gP86t+/nEGDBk2aAvUET4/+AUEzRESNmKyKSY98v/Rin1zVonLrthgoxy58n5fgXwk/782ZLETe3HgyU9ffeOqyDWz5MtwKNaeeJ6wtorjJEw2rVLllNRSuLh0VGbo7NvroktuOO6Ek065HgajLkiIM2NWhoWbN3cQGAWWqbA9bBziJu5ESzJppnnmmm+aMp9owrPAR68tpPPWB2+q/+PLDUm59WRJGraHUVe7nkki7qrDkrFOsojTBnIUjonARH9F9tyaX4xTs31eBK9TO80nm9WUDr/PSCirGokC);}"; } function speech() internal pure returns (string memory) { return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB9AAAAfQAgMAAADnVizqAAAADFBMVEUAAAD///8AAAAdHR1AT0ftAAAAAXRSTlMAQObYZgAACBVJREFUeNrs2sEJg1AABFHTmU3YTC7pR0iJwYDgUYi3fOe9Fgb2tBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwF9bGZzoQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQdN1G4ObLnssDG6+POrvhcE914PoGaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQT9H3w6fhcG9toNnXNA8nTHqt7UPvegtogeJHiR6kOhBogeJHiR6kOhBogeJHiR6kOhBogeJHiR6kOhB59E9425rf8u5xwXNlr1n33jRW77s0YEAAAAAgCB/60EuhaQPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+SPiR9SPqQ9CHpQ9KHpA9JH5I+JH1I+pD0IelD0oekD0kfkj4kfUj6kPQh6UPSh6QPSR+KXTs4bRiIoig66UxNuBlv1I96DEqUhQxBNnjpued0MFz4s3miB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGP6A9fN6a2jAv7r+8bE1qPtuPkxhf8XXbRW0QPEj1I9CDRg0QPEj1I9CDRg0QPEj1I9CDRg0QPEj1I9CDRg/5FN5QrWMZL+8FabgrrGXO8th0c+incz5iiZ4geJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiBz2Nbi03r2W8bf8Ul2u+dWe8b/sUlx/RfUP0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0oDGpbXsWfeZXx4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4n+w84dnTAIBUAQ1M7SWfoR0mBAXiSggliBO9PCwn1ekOhBogeJHiR6kOhBogeJHiR6kOhBogeJHiR6kOhBokfNogeNzSp6y3/jRW8RPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGDRA8SPUj0INGD7qK/x2bisY7oV6+JJ3MmVzR2q+gZy+4jeoboQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoQaIHiR4kepDoZbPoQePwFb1iOYleIXqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJHqQ6EGiB4keJDoAAAAAAAAAAAAAAAAA/NiDAwEAAAAAIP/XRlBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFfbgQAAAAAAAyP+1EVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVhT04EAAAAAAA8n9tBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYQ8OBAAAAACA/F8bQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV2IMDAQAAAAAg/9dGUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUV9uBAAAAAAADI/7URVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWFPTgQAAAAAADyf20EVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVhDw4EAAAAAID8XxtBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXYgwMBAAAAACD/10ZQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRX24EAAAAAAAMj/tRFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYU9OBAAAAAAAPJ/bQRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWEPDgQAAAAAgPxfG0FVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdqDQwIAAAAAQf9fe8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcBbQ4SRypNCDlAAAAAElFTkSuQmCC"; } function getSVG(string memory _cs, string memory _imgURI, string memory _token) internal pure returns (string memory) { string[7] memory parts; parts[0] = "<svg width='2000' height='2000' viewBox='0 0 2000 2000' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns='http://www.w3.org/2000/svg'>"; parts[1] = string(abi.encodePacked("<style type='text/css'>", degenSVG.font(), "</style>")); parts[2] = string(abi.encodePacked("<filter id='this_image' x='0%' y='0%' width='100%' height='100%'><feImage xlink:href='",_imgURI, _token)); parts[3] = string(abi.encodePacked("'/></filter><filter id='custom_text' x='0%' y='0%' width='100%' height='100%'><feImage xlink:href='", degenSVG.speech(), "'/></filter>")); parts[4] = "<rect width='100%' height='100%' x='0%' y='0%' filter='url(#this_image)'/><rect width='100%' height='100%' x='0%' y='0%' filter='url(#custom_text)'/><text dominant-baseline='middle' text-anchor='middle' x='50%' y='10.5%' font-family='"Press Start 2P",cursive' font-size='10em' textLength='1800' lengthAdjust='spacingAndGlyphs'>"; parts[5] = _cs; parts[6] = "</text></svg>"; return string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6])); } function desc() internal pure returns (string memory) { return "4444 Degens preparing to take over the ethereum blockchain. Created by Degens for Degens!"; } function getJSON(uint256 token, string memory _imgURI, string memory _cs) internal pure returns (string memory) { string memory json = (string(abi.encodePacked('{"name": "Degenarios #', Strings.toString(token + 1), '", "external_url": "https://degenarios.wtf", ', '"description": "', degenSVG.desc(),'", "attributes":[{"trait_type": "Speech", "value": "', _cs, '"},{"trait_type": "Custom Speech", "value": "Yes"}], "image_data": "', degenSVG.getSVG(_cs, _imgURI, Strings.toString(token)), '"}'))); return string(abi.encodePacked('data:application/json;base64,', Base64.encode(bytes(json)))); } } contract Degenarios is ERC721A, Ownable { using Strings for uint256; uint256 public constant maxSupply = 4444; bool public csAllowed = false; bool public bOpen = false; bool public bPaused = true; uint256 public mintedWLAmt = 0; uint256 public mintedFreeAmt = 0; uint256 public supplyWL = 1249; uint256 public supplyFree = 3195; uint256 public maxPerMint = 3; uint256 public maxPerWallet = 3; mapping(uint256 => string) _tokCS; mapping(address => uint256) public minted; mapping(address => uint256) public mintedWL; mapping(address => uint256) public mintedFree; bytes32 public merkleRoot; string private _imgURI = ""; string private _bURIExt = ""; constructor() ERC721A("Degenarios", "DEGENARIOS") {} function _checkFlags() private view { require(!bPaused, "Contract Paused"); } modifier checkFlags() { _checkFlags(); _; } function setPaused(bool b) external onlyOwner { bPaused = b; } function setPublic(bool b) external onlyOwner { bOpen = b; } function setCSAllowed(bool b) external onlyOwner { csAllowed = b; } function devSetCS(uint256 token, string memory _cs) external onlyOwner { _tokCS[token] = _cs; } function setCS(uint256 token, string memory _cs) external { require(token >= 0 && token <= totalSupply(),"nonexistent token"); require(csAllowed, "Cust Speech isn't allowed."); address owner = ERC721A.ownerOf(token); require(msg.sender == owner, 'Non-owned token.'); require((4*((bytes(_cs)).length / 3)) < 85, 'Max len exceeded!'); _tokCS[token] = _cs; } function tokenURI(uint256 token) public view virtual override returns (string memory) { require(token >= 0 && token <= totalSupply(),"nonexistent token"); if(bytes(_tokCS[token]).length > 0) { return _tokSVG(token); } else { return string(abi.encodePacked(_bURIExt, token.toString())); } } function tokenIMG(uint256 token) public view virtual returns (string memory) { require(token >= 0 && token <= totalSupply(),"nonexistent token"); if(bytes(_tokCS[token]).length > 0) { return degenSVG.getSVG(string(Base64.decode(_tokCS[token])), _imgURI, token.toString()); } else { return string(abi.encodePacked(_imgURI, token.toString())); } } function _tokSVG(uint256 token) private view returns (string memory) { return degenSVG.getJSON(token, _imgURI, string(Base64.decode(_tokCS[token]))); } function setmaxPerMint(uint256 a) external onlyOwner { maxPerMint = a; } function setmaxPerWallet(uint256 a) external onlyOwner { maxPerWallet = a; } function setImageURI(string memory u) external onlyOwner { _imgURI = u; } function setBaseURI(string memory u) external onlyOwner { _bURIExt = u; } function _baseURI() internal view virtual override returns (string memory) { return _bURIExt; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; Address.sendValue(payable(msg.sender), balance); } function setWLSupply(uint a) external onlyOwner { supplyWL = a; } function setFreeSupply(uint a) external onlyOwner { supplyFree = a; } function setMerkleRoot(bytes32 data) external onlyOwner { merkleRoot = data; } function tokensOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function claimWLDegen(bytes32[] calldata merkleProof) external checkFlags { require(mintedWL[msg.sender] < 1, "WL Wallet limit reached"); require((mintedWLAmt + 1) <= supplyWL, "No WL mint left"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(merkleProof, merkleRoot, leaf), "Invalid WL proof"); uint256 avail = maxSupply - mintedWLAmt - mintedFreeAmt; require(avail > 0, "Sold out!"); mintedWLAmt += 1; mintedWL[msg.sender] += 1; minted[msg.sender] += 1; _safeMint(msg.sender, 1); } function claimFreeDegen(uint amount) external checkFlags { require(bOpen, "!Public"); uint256 mAmt = amount; require(mAmt <= maxPerMint, "Exceeded max mint"); require((mintedFreeAmt + mAmt) <= supplyFree, "No Free mint left"); require((minted[msg.sender] + mAmt) <= maxPerWallet, "Wallet limit reached"); uint256 avail = maxSupply - mintedWLAmt - mintedFreeAmt; require(avail > 0, "Sold out!"); mAmt = Math.min(mAmt, avail); mintedFreeAmt += mAmt; mintedFree[msg.sender] += mAmt; minted[msg.sender] += mAmt; _safeMint(msg.sender, mAmt); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimFreeDegen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claimWLDegen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"csAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"string","name":"_cs","type":"string"}],"name":"devSetCS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedFreeAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedWLAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"u","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"string","name":"_cs","type":"string"}],"name":"setCS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setCSAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"u","type":"string"}],"name":"setImageURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setWLSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setmaxPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setmaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"tokenIMG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6007805462ffffff60a01b1916600160b01b1790556000600881905560098190556104e1600a55610c7b600b556003600c819055600d5560a0604081905260808290526200005191601391906200016e565b5060408051602081019182905260009081905262000072916014916200016e565b503480156200008057600080fd5b506040518060400160405280600a815260200169446567656e6172696f7360b01b8152506040518060400160405280600a815260200169444547454e4152494f5360b01b8152508160019080519060200190620000df9291906200016e565b508051620000f59060029060208401906200016e565b505050620001126200010c6200011860201b60201c565b6200011c565b62000251565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200017c9062000214565b90600052602060002090601f016020900481019282620001a05760008555620001eb565b82601f10620001bb57805160ff1916838001178555620001eb565b82800160010185558215620001eb579182015b82811115620001eb578251825591602001919060010190620001ce565b50620001f9929150620001fd565b5090565b5b80821115620001f95760008155600101620001fe565b600181811c908216806200022957607f821691505b602082108114156200024b57634e487b7160e01b600052602260045260246000fd5b50919050565b615c1c80620002616000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c80636f6eac0d11610182578063a22cb465116100e9578063d5abeb01116100a2578063e985e9c51161007c578063e985e9c51461062c578063f2fde38b14610668578063f676308a1461067b578063ff260b591461068e57600080fd5b8063d5abeb01146105fd578063dbd4e9d814610606578063e1d1ce181461061957600080fd5b8063a22cb4651461059f578063b88d4fde146105b2578063bcc295a1146105c5578063c87b56dd146105ce578063cb889594146105e1578063d03a8585146105ea57600080fd5b80638da5cb5b1161013b5780638da5cb5b146105395780639032bff01461054a57806395d89b411461055d5780639aa5d57f146105655780639b68a6c614610579578063a194190d1461058c57600080fd5b80636f6eac0d146104d957806370a08231146104e2578063715018a6146104f55780637cb64759146104fd5780638462151c1461051057806389cfa3641461053057600080fd5b80632f745c59116102415780634f6ccce7116101fa57806359695dd3116101d457806359695dd31461048c5780635cbcec4e146104a057806360d3e1ae146104b35780636352211e146104c657600080fd5b80634f6ccce71461045d578063507e094f1461047057806355f804b31461047957600080fd5b80632f745c591461040057806338cc0c15146104135780633948b8cc146104265780633ccfd60b1461043957806342842e0e14610441578063453c23101461045457600080fd5b806316c38b3c1161029357806316c38b3c1461037f57806318160ddd146103925780631e7269c5146103a457806320984801146103c457806323b872dd146103e45780632eb4a7ab146103f757600080fd5b806301ffc9a7146102db57806304787ca21461030357806306fdde0314610318578063081812fc1461032d578063095ea7b31461035857806311319b1e1461036b575b600080fd5b6102ee6102e9366004612a0d565b6106ae565b60405190151581526020015b60405180910390f35b610316610311366004612ad5565b61071b565b005b610320610765565b6040516102fa9190612b61565b61034061033b366004612b74565b6107f7565b6040516001600160a01b0390911681526020016102fa565b610316610366366004612ba4565b610882565b6007546102ee90600160b01b900460ff1681565b61031661038d366004612bde565b61099a565b6000545b6040519081526020016102fa565b6103966103b2366004612bf9565b600f6020526000908152604090205481565b6103966103d2366004612bf9565b60116020526000908152604090205481565b6103166103f2366004612c14565b6109e2565b61039660125481565b61039661040e366004612ba4565b6109ed565b610316610421366004612bde565b610b49565b610316610434366004612b74565b610b91565b610316610bc0565b61031661044f366004612c14565b610bf8565b610396600d5481565b61039661046b366004612b74565b610c13565b610396600c5481565b610316610487366004612ad5565b610c75565b6007546102ee90600160a01b900460ff1681565b6103166104ae366004612bde565b610cb2565b6103166104c1366004612b74565b610cfa565b6103406104d4366004612b74565b610d29565b61039660095481565b6103966104f0366004612bf9565b610d3b565b610316610dcc565b61031661050b366004612b74565b610e02565b61052361051e366004612bf9565b610e31565b6040516102fa9190612c50565b61039660085481565b6007546001600160a01b0316610340565b610320610558366004612b74565b610eef565b6103206110ae565b6007546102ee90600160a81b900460ff1681565b610316610587366004612b74565b6110bd565b61031661059a366004612c94565b6110ec565b6103166105ad366004612d08565b61132e565b6103166105c0366004612d3b565b6113f3565b610396600a5481565b6103206105dc366004612b74565b611426565b610396600b5481565b6103166105f8366004612b74565b611485565b61039661115c81565b610316610614366004612db6565b6116a1565b610316610627366004612db6565b6116ea565b6102ee61063a366004612dfc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610316610676366004612bf9565b611838565b610316610689366004612b74565b6118d0565b61039661069c366004612bf9565b60106020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b14806106df57506001600160e01b03198216635b5e139f60e01b145b806106fa57506001600160e01b0319821663780e9d6360e01b145b8061071557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b0316331461074e5760405162461bcd60e51b815260040161074590612e26565b60405180910390fd5b805161076190601390602084019061293b565b5050565b60606001805461077490612e5b565b80601f01602080910402602001604051908101604052809291908181526020018280546107a090612e5b565b80156107ed5780601f106107c2576101008083540402835291602001916107ed565b820191906000526020600020905b8154815290600101906020018083116107d057829003601f168201915b5050505050905090565b6000610804826000541190565b6108665760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610745565b506000908152600560205260409020546001600160a01b031690565b600061088d82610d29565b9050806001600160a01b0316836001600160a01b031614156108fc5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610745565b336001600160a01b03821614806109185750610918813361063a565b61098a5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610745565b6109958383836118ff565b505050565b6007546001600160a01b031633146109c45760405162461bcd60e51b815260040161074590612e26565b60078054911515600160b01b0260ff60b01b19909216919091179055565b61099583838361195b565b60006109f883610d3b565b8210610a515760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610745565b600080549080805b83811015610ae9576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610aab57805192505b876001600160a01b0316836001600160a01b03161415610ae05786841415610ad95750935061071592505050565b6001909301925b50600101610a59565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610745565b6007546001600160a01b03163314610b735760405162461bcd60e51b815260040161074590612e26565b60078054911515600160a01b0260ff60a01b19909216919091179055565b6007546001600160a01b03163314610bbb5760405162461bcd60e51b815260040161074590612e26565b600a55565b6007546001600160a01b03163314610bea5760405162461bcd60e51b815260040161074590612e26565b47610bf53382611c3e565b50565b610995838383604051806020016040528060008152506113f3565b600080548210610c715760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610745565b5090565b6007546001600160a01b03163314610c9f5760405162461bcd60e51b815260040161074590612e26565b805161076190601490602084019061293b565b6007546001600160a01b03163314610cdc5760405162461bcd60e51b815260040161074590612e26565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6007546001600160a01b03163314610d245760405162461bcd60e51b815260040161074590612e26565b600d55565b6000610d3482611d57565b5192915050565b60006001600160a01b038216610da75760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610745565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610df65760405162461bcd60e51b815260040161074590612e26565b610e006000611e2d565b565b6007546001600160a01b03163314610e2c5760405162461bcd60e51b815260040161074590612e26565b601255565b60606000610e3e83610d3b565b905080610e5f5760408051600080825260208201909252905b509392505050565b6000816001600160401b03811115610e7957610e79612a2a565b604051908082528060200260200182016040528015610ea2578160200160208202803683370190505b50905060005b82811015610e5757610eba85826109ed565b828281518110610ecc57610ecc612e90565b602090810291909101015280610ee181612ebc565b915050610ea8565b50919050565b6060610efa60005490565b821115610f195760405162461bcd60e51b815260040161074590612ed7565b6000828152600e602052604081208054610f3290612e5b565b90501115611077576000828152600e60205260409020805461071591610fde91610f5b90612e5b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8790612e5b565b8015610fd45780601f10610fa957610100808354040283529160200191610fd4565b820191906000526020600020905b815481529060010190602001808311610fb757829003601f168201915b5050505050611e7f565b60138054610feb90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461101790612e5b565b80156110645780601f1061103957610100808354040283529160200191611064565b820191906000526020600020905b81548152906001019060200180831161104757829003601f168201915b50505050506110728561202f565b612134565b60136110828361202f565b604051602001611093929190612f1e565b6040516020818303038152906040529050919050565b919050565b60606002805461077490612e5b565b6007546001600160a01b031633146110e75760405162461bcd60e51b815260040161074590612e26565b600c55565b6110f4612274565b336000908152601060205260409020546001116111535760405162461bcd60e51b815260206004820152601760248201527f574c2057616c6c6574206c696d697420726561636865640000000000000000006044820152606401610745565b600a54600854611164906001612fc5565b11156111a45760405162461bcd60e51b815260206004820152600f60248201526e139bc815d3081b5a5b9d081b19599d608a1b6044820152606401610745565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061121e8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506122c0565b61125d5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102ba610383937b7b360811b6044820152606401610745565b600060095460085461115c6112729190612fdd565b61127c9190612fdd565b9050600081116112ba5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610745565b6001600860008282546112cd9190612fc5565b90915550503360009081526010602052604081208054600192906112f2908490612fc5565b9091555050336000908152600f60205260408120805460019290611317908490612fc5565b9091555061132890503360016122d6565b50505050565b6001600160a01b0382163314156113875760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610745565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113fe84848461195b565b61140a848484846122f0565b6113285760405162461bcd60e51b815260040161074590612ff4565b606061143160005490565b8211156114505760405162461bcd60e51b815260040161074590612ed7565b6000828152600e60205260408120805461146990612e5b565b9050111561147a57610715826123fd565b60146110828361202f565b61148d612274565b600754600160a81b900460ff166114d05760405162461bcd60e51b8152602060048201526007602482015266215075626c696360c81b6044820152606401610745565b600c5481908111156115185760405162461bcd60e51b8152602060048201526011602482015270115e18d959591959081b585e081b5a5b9d607a1b6044820152606401610745565b600b54816009546115299190612fc5565b111561156b5760405162461bcd60e51b8152602060048201526011602482015270139bc8119c9959481b5a5b9d081b19599d607a1b6044820152606401610745565b600d54336000908152600f6020526040902054611589908390612fc5565b11156115ce5760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d081b1a5b5a5d081c995858da195960621b6044820152606401610745565b600060095460085461115c6115e39190612fdd565b6115ed9190612fdd565b90506000811161162b5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610745565b61163582826124b2565b915081600960008282546116499190612fc5565b9091555050336000908152601160205260408120805484929061166d908490612fc5565b9091555050336000908152600f602052604081208054849290611691908490612fc5565b90915550610995905033836122d6565b6007546001600160a01b031633146116cb5760405162461bcd60e51b815260040161074590612e26565b6000828152600e6020908152604090912082516109959284019061293b565b60005482111561170c5760405162461bcd60e51b815260040161074590612ed7565b600754600160a01b900460ff166117655760405162461bcd60e51b815260206004820152601a60248201527f43757374205370656563682069736e277420616c6c6f7765642e0000000000006044820152606401610745565b600061177083610d29565b9050336001600160a01b038216146117bd5760405162461bcd60e51b815260206004820152601060248201526f2737b716b7bbb732b2103a37b5b2b71760811b6044820152606401610745565b6055600383516117cd919061305d565b6117d8906004613071565b106118195760405162461bcd60e51b81526020600482015260116024820152704d6178206c656e2065786365656465642160781b6044820152606401610745565b6000838152600e6020908152604090912083516113289285019061293b565b6007546001600160a01b031633146118625760405162461bcd60e51b815260040161074590612e26565b6001600160a01b0381166118c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610745565b610bf581611e2d565b6007546001600160a01b031633146118fa5760405162461bcd60e51b815260040161074590612e26565b600b55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061196682611d57565b80519091506000906001600160a01b0316336001600160a01b0316148061199d575033611992846107f7565b6001600160a01b0316145b806119af575081516119af903361063a565b905080611a195760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610745565b846001600160a01b031682600001516001600160a01b031614611a8d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610745565b6001600160a01b038416611af15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610745565b611b0160008484600001516118ff565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b031602179055908601808352912054909116611bf457611ba8816000541190565b15611bf457825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b80471015611c8e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610745565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611cdb576040519150601f19603f3d011682016040523d82523d6000602084013e611ce0565b606091505b50509050806109955760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610745565b6040805180820190915260008082526020820152611d76826000541190565b611dd55760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610745565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611e23579392505050565b5060001901611dd7565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516060908290611ea0576040805160008082526020820190925290610e57565b60048151611eae9190613090565b15611efb5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420626173653634206465636f64657220696e707574000000006044820152606401610745565b60006040518060a0016040528060808152602001614179608091399050600060048351611f28919061305d565b611f33906003613071565b90506000611f42826020612fc5565b6001600160401b03811115611f5957611f59612a2a565b6040519080825280601f01601f191660200182016040528015611f83576020820181803683370190505b5090508351840151603d60ff82161415611fb257600183039250613d3d61ffff82161415611fb2576001830392505b50818152600183018485518101602084015b8183101561202157600483019250825160ff8082168601511660ff808360081c168701511660061b0160ff808360101c1687015116600c1b60ff808460181c168801511660121b010190508060e81b825250600381019050611fc4565b509298975050505050505050565b6060816120535750506040805180820190915260018152600360fc1b602082015290565b8160005b811561207d578061206781612ebc565b91506120769050600a8361305d565b9150612057565b6000816001600160401b0381111561209757612097612a2a565b6040519080825280601f01601f1916602001820160405280156120c1576020820181803683370190505b5090505b841561212c576120d6600183612fdd565b91506120e3600a86613090565b6120ee906030612fc5565b60f81b81838151811061210357612103612e90565b60200101906001600160f81b031916908160001a905350612125600a8661305d565b94506120c5565b949350505050565b606061213e6129bb565b6040518060c00160405280608681526020016135596086913981526121616124ca565b60405160200161217191906130a4565b60408051808303601f19018152918152602080840192909252516121999186918691016130fb565b60408051808303601f190181529181528201526121b46124ed565b6040516020016121c4919061319b565b60408051808303601f19018152918152606083019190915280516101808101909152610151808252615a9660208301396080820190815260a08201868152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b60208083019190915260c0860182905285518187015184880151606089015197519651955161225b989397929691959394929391920161324e565b6040516020818303038152906040529150509392505050565b600754600160b01b900460ff1615610e005760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd0814185d5cd959608a1b6044820152606401610745565b6000826122cd8584612510565b14949350505050565b61076182826040518060200160405280600081525061257c565b60006001600160a01b0384163b156123f257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123349033908990889088906004016132e0565b602060405180830381600087803b15801561234e57600080fd5b505af192505050801561237e575060408051601f3d908101601f1916820190925261237b9181019061331d565b60015b6123d8573d8080156123ac576040519150601f19603f3d011682016040523d82523d6000602084013e6123b1565b606091505b5080516123d05760405162461bcd60e51b815260040161074590612ff4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061212c565b506001949350505050565b6060610715826013805461241090612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461243c90612e5b565b80156124895780601f1061245e57610100808354040283529160200191612489565b820191906000526020600020905b81548152906001019060200180831161246c57829003601f168201915b5050506000878152600e6020526040902080546124ad9350909150610f5b90612e5b565b612589565b60008183106124c157816124c3565b825b9392505050565b6060604051806118c0016040528061189d81526020016141f961189d9139905090565b606060405180610b800160405280610b5a81526020016135df610b5a9139905090565b600081815b8451811015610e5757600085828151811061253257612532612e90565b602002602001015190508083116125585760008381526020829052604090209250612569565b600081815260208490526040902092505b508061257481612ebc565b915050612515565b61099583838360016125f4565b606060006125a061259b866001612fc5565b61202f565b6125a86127b6565b846125b786886110728b61202f565b6040516020016125ca949392919061333a565b60405160208183030381529060405290506125e4816127d6565b60405160200161225b91906134ba565b6000546001600160a01b0385166126575760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610745565b836126b55760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610745565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b858110156127ad5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156127a15761278560008884886122f0565b6127a15760405162461bcd60e51b815260040161074590612ff4565b60019182019101612732565b50600055611c37565b606060405180608001604052806059815260200161350060599139905090565b60608151600014156127f657505060408051602081019091526000815290565b600060405180606001604052806040815260200161413960409139905060006003845160026128259190612fc5565b61282f919061305d565b61283a906004613071565b90506000612849826020612fc5565b6001600160401b0381111561286057612860612a2a565b6040519080825280601f01601f19166020018201604052801561288a576020820181803683370190505b509050818152600183018586518101602084015b818310156128f6576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161289e565b60038951066001811461291057600281146129215761292d565b613d3d60f01b60011983015261292d565b603d60f81b6000198301525b509398975050505050505050565b82805461294790612e5b565b90600052602060002090601f01602090048101928261296957600085556129af565b82601f1061298257805160ff19168380011785556129af565b828001600101855582156129af579182015b828111156129af578251825591602001919060010190612994565b50610c719291506129e2565b6040518060e001604052806007905b60608152602001906001900390816129ca5790505090565b5b80821115610c7157600081556001016129e3565b6001600160e01b031981168114610bf557600080fd5b600060208284031215612a1f57600080fd5b81356124c3816129f7565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612a5a57612a5a612a2a565b604051601f8501601f19908116603f01168101908282118183101715612a8257612a82612a2a565b81604052809350858152868686011115612a9b57600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112612ac657600080fd5b6124c383833560208501612a40565b600060208284031215612ae757600080fd5b81356001600160401b03811115612afd57600080fd5b61212c84828501612ab5565b60005b83811015612b24578181015183820152602001612b0c565b838111156113285750506000910152565b60008151808452612b4d816020860160208601612b09565b601f01601f19169290920160200192915050565b6020815260006124c36020830184612b35565b600060208284031215612b8657600080fd5b5035919050565b80356001600160a01b03811681146110a957600080fd5b60008060408385031215612bb757600080fd5b612bc083612b8d565b946020939093013593505050565b803580151581146110a957600080fd5b600060208284031215612bf057600080fd5b6124c382612bce565b600060208284031215612c0b57600080fd5b6124c382612b8d565b600080600060608486031215612c2957600080fd5b612c3284612b8d565b9250612c4060208501612b8d565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612c8857835183529284019291840191600101612c6c565b50909695505050505050565b60008060208385031215612ca757600080fd5b82356001600160401b0380821115612cbe57600080fd5b818501915085601f830112612cd257600080fd5b813581811115612ce157600080fd5b8660208260051b8501011115612cf657600080fd5b60209290920196919550909350505050565b60008060408385031215612d1b57600080fd5b612d2483612b8d565b9150612d3260208401612bce565b90509250929050565b60008060008060808587031215612d5157600080fd5b612d5a85612b8d565b9350612d6860208601612b8d565b92506040850135915060608501356001600160401b03811115612d8a57600080fd5b8501601f81018713612d9b57600080fd5b612daa87823560208401612a40565b91505092959194509250565b60008060408385031215612dc957600080fd5b8235915060208301356001600160401b03811115612de657600080fd5b612df285828601612ab5565b9150509250929050565b60008060408385031215612e0f57600080fd5b612e1883612b8d565b9150612d3260208401612b8d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612e6f57607f821691505b60208210811415610ee957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612ed057612ed0612ea6565b5060010190565b6020808252601190820152703737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b60008151612f14818560208601612b09565b9290920192915050565b600080845481600182811c915080831680612f3a57607f831692505b6020808410821415612f5a57634e487b7160e01b86526022600452602486fd5b818015612f6e5760018114612f7f57612fac565b60ff19861689528489019650612fac565b60008b81526020902060005b86811015612fa45781548b820152908501908301612f8b565b505084890196505b505050505050612fbc8185612f02565b95945050505050565b60008219821115612fd857612fd8612ea6565b500190565b600082821015612fef57612fef612ea6565b500390565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261306c5761306c613047565b500490565b600081600019048311821515161561308b5761308b612ea6565b500290565b60008261309f5761309f613047565b500690565b7f3c7374796c6520747970653d27746578742f637373273e0000000000000000008152600082516130dc816017850160208701612b09565b671e17b9ba3cb6329f60c11b6017939091019283015250601f01919050565b7f3c66696c7465722069643d27746869735f696d6167652720783d27302527207981527f3d273025272077696474683d273130302527206865696768743d2731303025276020820152753e3c6665496d61676520786c696e6b3a687265663d2760501b604082015260008351613178816056850160208801612b09565b83519083019061318f816056840160208801612b09565b01605601949350505050565b7f272f3e3c2f66696c7465723e3c66696c7465722069643d27637573746f6d5f7481527f6578742720783d2730252720793d273025272077696474683d2731303025272060208201527f6865696768743d2731303025273e3c6665496d61676520786c696e6b3a687265604082015262663d2760e81b60608201526000825161322b816063850160208701612b09565b6b13979f1e17b334b63a32b91f60a11b6063939091019283015250606f01919050565b6000885160206132618285838e01612b09565b8951918401916132748184848e01612b09565b89519201916132868184848d01612b09565b88519201916132988184848c01612b09565b87519201916132aa8184848b01612b09565b86519201916132bc8184848a01612b09565b85519201916132ce8184848901612b09565b919091019a9950505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061331390830184612b35565b9695505050505050565b60006020828403121561332f57600080fd5b81516124c3816129f7565b757b226e616d65223a2022446567656e6172696f73202360501b8152845160009061336c816016850160208a01612b09565b7f222c202265787465726e616c5f75726c223a202268747470733a2f2f646567656016918401918201526c03730b934b7b9973bba3311161609d1b60368201526f113232b9b1b934b83a34b7b7111d101160811b604382015285516133d8816053840160208a01612b09565b7f222c202261747472696275746573223a5b7b2274726169745f74797065223a2060539290910191820152731129b832b2b1b4111610113b30b63ab2911d101160611b60738201528451613433816087840160208901612b09565b7f227d2c7b2274726169745f74797065223a2022437573746f6d20537065656368608792909101918201527f222c202276616c7565223a2022596573227d5d2c2022696d6167655f6461746160a782015263111d101160e11b60c78201526134af6134a160cb830186612f02565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516134f281601d850160208701612b09565b91909101601d019291505056fe3434343420446567656e7320707265706172696e6720746f2074616b65206f7665722074686520657468657265756d20626c6f636b636861696e2e204372656174656420627920446567656e7320666f7220446567656e73213c7376672077696474683d273230303027206865696768743d2732303030272076696577426f783d27302030203230303020323030302720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e646174613a696d6167652f706e673b6261736536342c6956424f5277304b47676f414141414e5355684555674141423941414141665141674d414141446e56697a71414141414446424d564555414141442f2f2f38414141416448523141543066744141414141585253546c4d41514f62595a6741414342564a52454655654e72733273454a67314141424648546d553359544337705230694a7759446755596933664f65394667623274424d4141414141414141414141414141414141414141414141414141414141414141414141414177463962475a7a6f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f51644e3147344f624c6e73734447362b504f7276686345393134506f476149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f515439483377366668634739746f4e6e584e41386e54487174375550766567746f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68423539453934323572663875357877584e6c72316e33336a525737377330594541414141416743422f363045756861515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b4b58547334625269496f6967363655784e75426c763149393644457155685178424e6e6a70756564304d467a3473336d6942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a48715136454750364139664e3661326a417637722b3862453171507475506b786866385858625257305150456a31493943445267305150456a31493943445267305150456a31493943445267305150456a314939434452672f35464e355172574d5a4c2b3846616267727247584f38746830632b696e637a3569695a3467654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a48715136454769427a324e6269303372325738626638556c32752b64576538622f73556c782f5266555030494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a306f4447706258735766655a5878346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346e2b773834646e54414942554151314d375357666f52306d424158695367676c69424f395043776e31656b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f6b664e6f67654e7a53703679332f6a5257385250556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e474437714b2f783262697359376f56362b4a4a334d6d567a5232712b675a792b346a656f626f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f5a62506f51655077466231694f596c65495871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a446f41414141414141414141414141414141412f4e6944417745414141414149502f58526c42565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565646666267514141414141414179502b314556525656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656685430344541414141414141386e397442465656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565951384f42414141414143412f463862515656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565632494d4441514141414141672f39644755465656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565655563975424141414141414144492f375552564656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656574650546751414141414141447966323045565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656566844773445414141414149443858787442565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656585967774d42414141414143442f31305a5156565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565258323445414141414141414d6a2f7452465556565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565955394f4241414141414141504a2f62515256565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565657455044675141414141416750786647304656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565664714451774941414141415166396665384d41414141414141414141414141414141414141414141414141414141414141426342625134535279704e43446c4141414141456c46546b5375516d43434142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e0000003f3435363738393a3b3c3d00000000000000000102030405060708090a0b0c0d0e0f101112131415161718190000000000001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233000000000040666f6e742d66616365207b20666f6e742d66616d696c793a20275072657373205374617274203250273b207372633a2075726c28646174613a6170706c69636174696f6e2f6f637465742d73747265616d3b6261736536342c643039474d674142414141414142497741417741414141415266774141424865414145414141414141414141414141414141414141414141414141414141414148494a6b426d41416847775243417277564e4a6a43344e434141453241695144673059454941574553676545554274304e4b4f696d6e515873762b65744d5a74632f6172436f4c4d726c546a37734444534b686f556f33516f6b79454275494c6436684a3430463446586f7053352f6e7053302b7666466274466a473072426f35494d6a4a4a6d463532732f39756675596d374a5057706a4b494646764c6b6d74784a4a7042654a396b312b7348743973656f3039776b46394b55414d6464544a3450717255346b3676413863642f2b334634615272736c76495076464734622b4b50474d386a77552f5933366f663732534c6a2f622f67714b5331526f526f456339474b5a42334f4a41372f653050634464514a3363494c4a49576149696c4746515a4e432f4248385954344a74664e39556a42436c706b524b47683477645377554861354f61326d676c4344655377476e6c65632b6e6e553370704c617251496233664b74304b7057333073674f6d4a2f3853694d4e66492b335752674f777979633870396338673655666e496c332b68307261482f33394b557a756a75624d6d3177464a52476b436c505237554867396731702f352b7a3037476b3238367a30317931317556397a505364395a6e643962755a53472f497853476e55757056626b5a3567586d6f354945456b774465423547304d444461426362434a47764b4b2f6c7a58374632686844396d4b78364f7347794846495977786870694f63575435702f3834763263454f4b6b305866526f6b6976696d4a7661636f784c35796471324338436b764566557852626472754844384b474466494c5162502f2f78667367784e7637334854363952773349456d6a53474f446842734d306f672f586a72796f6b6c73774843675167547a55637959614e4474446c526245545746796f52696f4136714a70546357476e3735653347784b7454525452444f6c4a456330503863326d78646778545451336471596b76544456552f436e444a6f712f73464b6a475161396e436d3972476636377149554f6f67525370494343743979643677654a56743471444b55515855565338724b39796341624331764b32397a3167327a6364786c3046556e66674651482f4a756776594171446554544b73536166356943453631736a504b7763696c672f415654714a45662f783568517170334658442f574b454945434e4943434554775167344245554753484846417868676e674b674b62314f61596b3965594a67515a714737592f5a50673877656141507a586758384e42677672436179546d62553032612f377a316e756e344c5076696741475942367a344538736c77673563666d3476383462646c476135313178774f62374c4c6245706573744d38365736797732585658586250656662466375484c6e615a5452786868726f6749494c42774342685932446934654d516b70475955646c74727070613365557a497973624278382f44796953685570455370637655614e576e57716b323348723336444e726d756531754f6d574e3038343734344958486e6e6e4d645142742b7a337841665033444458504b2f64397441796238777834714246466c707367305332374469783538695a47312f5a6375544b4e383534453254436f7941696f5347376a457145543042496a716d466c6f71616e6f614f675a6d4c6e594e54574542516946575a616855713161707952593075375470303674646741463264766659343670676a6f73674838774659414f514679483934376e44672f516177417a45413041424130545331574d454c45796978304a724c4241544a574c57714e6c6653634c7573794e73547346557a4b56504b676f7768674178657631424f77684874697055446366464a7137594542684a7163706730714d4b4f354a4b5148524d4b7844736a34546b612f48436d5462564c75696c41634738785a2b5062315771647a584a6c4c56746b7a567a5a4150493833646d3937784c64544c4b5a41594e6f39546435334641766157732b562f715756775a523539662b52715757334b2f7662495754656c66426b4661322b6a38624e65756a56705242314f785257776d362f64414459306c767a31344859575441324541326e31762b76443033594a35316f43452b507836747337585279374a5a6f697667592b434c2b65706861366d394b6471777954566b4a5a65357a6c54625a5736346a35387a65336a63516e655161714e65577848497435454b6332332f336a3070534369777478796d38624e48716465534678624c3271357263574677384c704172573241493277766b47795350734e433645684d5038526c71767533743132424249734c7058467853546a634b41464e6f524363446e34346a67536f4c6d55476d6830317043674d3958797142624433584869674433416d70652f433532554535473645664a43694f6261725a35677a37654d58495463496d57623041444c4f67524243363749304e44596b62707377382b75675a4b6e6f58536a324c79516d655241345a536d68745875444a367963424f4a716c4374566259746455395778727746396e75586f6b51674d384c5a64534a585a3268415044436d50656853767070667548595738454861714f465566454136394269574c4c486c4a395a6261586257686c35684a537743692b314d465136625747417a5251566149685236616b4b517639646f795478736a477a66436e4264557a624c4e64587a707156764c626655576757506741417546783031706a6f6272474b4741745776683447683159654b553242436e4b685570474743386364557279443057766369656c536835346c42562b5071736b3635774d6a794b6b536d73376a546b777a556c52693062705963566759387661527268686c7045317471726931535156514b364264644e796c7a554e504c733653774c633347736a6842783334716a6d6769464c3031686f5938346b6e46735267494947375346533142427a6331634f676d45535a2f4869446c7067686e794569565331346578755042485738524f51415545536d4779566c7a58786d4b7341554a6948484f69446e50716a735a436b306932324279505674426a6775574d6b4f5867776b546c733141697550585868694c3271575179656e364454534b4b7a4b35484168496d32794a513461413548513568394f3873492b695a37414157415935596b696b3857554a5331565471426e3368697933444149495557484671324e5756347530727355576f6b746d56507a64656268494a75616c3436797368756446414d49664c7744462b514b494a30703248664a69526838596c6149584932746963496752344464414c39307a45693163547064554453545a3042546254766b41745774676241643356763353587733424a394a514d71354b7331507149352f5667702b62616b31514d6c7956516f5a756775697a304432637a42794b75776c4f4743354e7852554a4f75624b34454b345677475744684751374246463930747338475259326e67675255556349754a6c5945685a69725976456d6968424545474f5975556961347977433550486b6a4e7257636f796c3232576f356f39434a47666a564d5756396153314a56344c74767947566437396d7a764c7a517458455a5a504436434e4570356a57426f4a5341514f3562557a5264374a5575764676594a6c6b4164554d45567745697a41575a784e7257595468784735554472556f506a45555a4676756779442b73526775433639687069566d49557267635964762b4b3932795a6c47374c4d4c747a553052644750444671456f546951425a386f5535317368366752336b556c735747534b5776674e424474467938626b6831334b474b67306b6449767752784a4659627737483942374d48566a367a3465324a6d4d5434784146392f564370502b615252726e46444534726f6773397964575969746a68456a386652594f456363514f6563434362423861492b6d3273774c7752495730693465684344534b304b306570586e575945796c3767547a4e7343356b683132496549773871734d566332394876674e52456c6c316764434f7874556170565057747530467a317461747a6d416458415a72707452556c74646a6a2f6e7061696f702b69507358346f63364a69503279416d446d786e324332307658345866705456726b79794f55667a6b6f37717549773236364a454e68427a2f6e7946314c396776716f58306f315843424a456554727462584f70437a4d5664696a306959626f6f554c414b65685764683562362b514853636e6d6848627043766769726c5269556a536173464d393265674c2f7579696b65583469333656756377785232776f6d2f36594a6e566e5675424658353750676b537373347a36346b616c337258436a33685a2f6e686d4537364658422f4e6a705a36624d416a3749553635382f3034374f59645a306c303057614a66746755354b356b394e346d6e43646e2f69315a636431394c644f2f796f30374152776a6b455377415469533968306e616c5a6846386d686e30464d324141687a6a57547065386d4e53794b43685341643836663136375145526f6e7169446b51685935324578722f7079774375776473447a6a2b76525a546f314f766348466b516575502b34625a2f4b636d444f644c39506f3278683369716e453664635973614c5458796354354e364f677a4a662b554d356363363632374a6941676f4e3441414f6c476b4146413341393556594d6e4c47536f4c65685748357559624e316476553863494548342f416431424a3966302f3133386a70584a775a446a48472b3174566c597549493747377552654f65686c6d51644f426f4468504936454d51633979727178525773376a495152466d427958445869317a5a6d50574b583244754c36533866423374365638745a71386b743439396778773436375631787a67646b6e6b7663426a37585830527158322f397876377a6c34466a62654c3468374c4f574d5130744b4241334a3552564b32317936476444687836384b6f6165516641444352503453456c72556c447137575a614c6c496e516f4335766f354d417070426e4f6f614959316436565936713165796542643142623858465462754761456f4436394557433266634138305366766d6b413842644272337276714f5638754e573049684c367159464932334c424a712f36357645674e62346661496f426d6642534e52584a357273457341566c69694f325a48776b4e644c643235354961487844663243714f4c7245434257386c7950776e75396a414a734e315259315a6f4d6d4274766f435459555070552f504b36307644516e325070416169636e7a4569704c4c4d433968683754736479385975557276654261486b636754666c6f63746a43436f7969494f53307a434d4354564f4d5a3547614d6f5a4f554371496a314b71755447676c4a30363552514a7a6869633643665a517a764c4d7a614966454e73666f592b4276785875763065514f4c59463452673375456933797a4779415a6c354a7446436d574c725a724f4a33757a4766375358496d363177557675314d7a4f75643858564138664e564f625361576e506f4e41454567666c43414775647247384264345977444d2f7053554957346663326b59497241592f546d4c7539432f744a6b626464726d666f78754a326245484455744566306441345a775656506136525a716d65526c386e4a6c6d517676432b726f5a374934555848652f527a6e6e504c6677347a6d395831772b3274575a42614d3569723330484343364441627176514257616d2f64314d694870324d4f62482b737668626b356833334f524b3770573139665778674932327a66336879322f446665676c456c496a715477304f7862306d382b796664515877714e593630683258792b4539696539454f46634c7a5a634b4a51476d72693571304e52586d774e6c347973554551796933794146444f466a32495336474e6266546a48556f66646833783835614f6b4e3958446933787761566e474e506a4f3175715a7a53682b514752676965776e62377a7345372f6d6263516a676b535373574b4c767150425264504564777833457a3643567633534756357530514f51663752446b4962696c386a2b5675776a63686c54643837394b595444584542797568616151384d2f4b6d726979486969327169664f6363665875794e536e6f645a7848525634623966616869514378457a59796e575479556e5346796e56356a644c594e3945384b3568354e6841756c2b686d796b32556744317043675945513265436542423351665832762b3554744e6c64353031634c7348636c5a4945497333454c76536656627477584e373134676b6964597745723758477a4d486933704776414d736135546b504e3463714a2b62734d4b674a623272473571385a4b73337a39446c4d71377a48783757456e6b50626c385739692b7769376f5944524b75744c476f6b50543333704f443038312b61447857696676546a4232306166457034754a444c55387a3274664362517670597777573161537a535135634b4234556c6b6d6e43367246586856753539774f584369716e2f38336652664635547a764a376d2f755a4a722b6547704839545341354c69786f6c307a3946304a582f3470484d684d494839524d42657164723733426b45553076756361356b5831675a32516e50612b775245734c41557a434a51613471524d416d46584565765831666f6a6173304f754f74452b5a5a584b6b53796732516169464c433247567056654a6a5554713358623649776b376f7a584135522b6850733450785a394d57717a2b4b75776e74772b62756a36337745706e5967592b7247724c676a752b654a2f42564331593434714353456e337958672b4177574a504e58764a6d3362704e697a38595a4365517a7076375079566246395836316575743931764e705a6d6a2b70743153454e312f32373170716a62416f55666e6e7342324a2f73782f6369334874614c6b4c646462627842676366537537536c325638786848417166526a666436762b4f7a374743766e472b42764344454641417a61474e39363138494c76797355335132687876317061554230384f6376464f433371395a4b6c57566d6c543948703976496439616a6145742b46324f444f6574654843334e6d334243743467437662583644486a6c494353636a7763576332314d554f6736554863746879727331786144344567553056696171363837336e597562416a7a33344c39612f2f622b6c55586b786c357a6b65424234626d624b4d42776c69414b614f64754a4c486d47615674424466583333564979594272636c654e78716b6171506b624e755a583261544a4443726266686b6a4f4d7a45356252526355696a654f324743726471377147426a5639354e6c41673931536a307056426f614b41525378566a41524b4d593935674c756152425142446e72456b4b6f6a38424a474e6b4f452b4446446357504e304170746e57456a5265384d5730474b5a39684a774664757441626f31613154326b6d784e75785370564f44563931704e464f586175367162614c7164687536474e6d356e6171427a39504670317546547432343342693861745470305a7971494f704f2f59486174454c774d4c484c32434b4e4a42724a6277434a612f7a56794f684565426e497a4c74532f30317571744f6d33594472395472314b766c51655158684436796d3339725955576e54754e5656696f7047442b703633774634594c497162616f4e55427630434b3952596f5a366f4734556449672b445272534337724c67366f33645656444746504137584b7130474c507a6d4e7a6732575643762b5076756c796851586b55656e4c47654f4f57796f64554f57677851694971704638526c626a747276756f6143696f62767667596365595742696865676c566374762f746754645a355a34704444654c342f79763569496d4c50765644763551503644356237536b477634644637316368644c54597a754c65707952646d375435375078307372477a7358756e5771302f50342b3831563067503836742b2f6e454744426b32614176554554342f2b4155457a5245534e6d4b794b53593938762f52696e317a566f6e4c727468676f787935386e35666758776b2f3738325a4c4554653348677955396666654f717944577a354d74774b4e6165654a3677746f726a4a45773272564c6c6c4e5253754c68305647626f374e76726f6b74754f4f36456b3036354867616a4c6b69494d324e57686f57624e336351474157577162413962427a694a753545537a4a70706e6e6d6d6d2b614d70396f77725041523638747050505742322b712f2b504c44556d353957524a47726148555665376e6b6b69377172446b72464f736f6a54426e49556a6f6e4152483946397479615834785473333165424b39544f38306e6d39575544722f5053436972476f6b43293b7d3c726563742077696474683d273130302527206865696768743d27313030252720783d2730252720793d273025272066696c7465723d2775726c2823746869735f696d61676529272f3e3c726563742077696474683d273130302527206865696768743d27313030252720783d2730252720793d273025272066696c7465723d2775726c2823637573746f6d5f7465787429272f3e3c7465787420646f6d696e616e742d626173656c696e653d276d6964646c652720746578742d616e63686f723d276d6964646c652720783d273530252720793d2731302e35252720666f6e742d66616d696c793d272671756f743b50726573732053746172742032502671756f743b2c637572736976652720666f6e742d73697a653d273130656d2720746578744c656e6774683d273138303027206c656e67746841646a7573743d2773706163696e67416e64476c79706873273ea2646970667358221220c8e1a04e18f99ebe24df09f9c10f0fe0a6942de22b9bb396d2093395e92394a264736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d65760003560e01c80636f6eac0d11610182578063a22cb465116100e9578063d5abeb01116100a2578063e985e9c51161007c578063e985e9c51461062c578063f2fde38b14610668578063f676308a1461067b578063ff260b591461068e57600080fd5b8063d5abeb01146105fd578063dbd4e9d814610606578063e1d1ce181461061957600080fd5b8063a22cb4651461059f578063b88d4fde146105b2578063bcc295a1146105c5578063c87b56dd146105ce578063cb889594146105e1578063d03a8585146105ea57600080fd5b80638da5cb5b1161013b5780638da5cb5b146105395780639032bff01461054a57806395d89b411461055d5780639aa5d57f146105655780639b68a6c614610579578063a194190d1461058c57600080fd5b80636f6eac0d146104d957806370a08231146104e2578063715018a6146104f55780637cb64759146104fd5780638462151c1461051057806389cfa3641461053057600080fd5b80632f745c59116102415780634f6ccce7116101fa57806359695dd3116101d457806359695dd31461048c5780635cbcec4e146104a057806360d3e1ae146104b35780636352211e146104c657600080fd5b80634f6ccce71461045d578063507e094f1461047057806355f804b31461047957600080fd5b80632f745c591461040057806338cc0c15146104135780633948b8cc146104265780633ccfd60b1461043957806342842e0e14610441578063453c23101461045457600080fd5b806316c38b3c1161029357806316c38b3c1461037f57806318160ddd146103925780631e7269c5146103a457806320984801146103c457806323b872dd146103e45780632eb4a7ab146103f757600080fd5b806301ffc9a7146102db57806304787ca21461030357806306fdde0314610318578063081812fc1461032d578063095ea7b31461035857806311319b1e1461036b575b600080fd5b6102ee6102e9366004612a0d565b6106ae565b60405190151581526020015b60405180910390f35b610316610311366004612ad5565b61071b565b005b610320610765565b6040516102fa9190612b61565b61034061033b366004612b74565b6107f7565b6040516001600160a01b0390911681526020016102fa565b610316610366366004612ba4565b610882565b6007546102ee90600160b01b900460ff1681565b61031661038d366004612bde565b61099a565b6000545b6040519081526020016102fa565b6103966103b2366004612bf9565b600f6020526000908152604090205481565b6103966103d2366004612bf9565b60116020526000908152604090205481565b6103166103f2366004612c14565b6109e2565b61039660125481565b61039661040e366004612ba4565b6109ed565b610316610421366004612bde565b610b49565b610316610434366004612b74565b610b91565b610316610bc0565b61031661044f366004612c14565b610bf8565b610396600d5481565b61039661046b366004612b74565b610c13565b610396600c5481565b610316610487366004612ad5565b610c75565b6007546102ee90600160a01b900460ff1681565b6103166104ae366004612bde565b610cb2565b6103166104c1366004612b74565b610cfa565b6103406104d4366004612b74565b610d29565b61039660095481565b6103966104f0366004612bf9565b610d3b565b610316610dcc565b61031661050b366004612b74565b610e02565b61052361051e366004612bf9565b610e31565b6040516102fa9190612c50565b61039660085481565b6007546001600160a01b0316610340565b610320610558366004612b74565b610eef565b6103206110ae565b6007546102ee90600160a81b900460ff1681565b610316610587366004612b74565b6110bd565b61031661059a366004612c94565b6110ec565b6103166105ad366004612d08565b61132e565b6103166105c0366004612d3b565b6113f3565b610396600a5481565b6103206105dc366004612b74565b611426565b610396600b5481565b6103166105f8366004612b74565b611485565b61039661115c81565b610316610614366004612db6565b6116a1565b610316610627366004612db6565b6116ea565b6102ee61063a366004612dfc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610316610676366004612bf9565b611838565b610316610689366004612b74565b6118d0565b61039661069c366004612bf9565b60106020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b14806106df57506001600160e01b03198216635b5e139f60e01b145b806106fa57506001600160e01b0319821663780e9d6360e01b145b8061071557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b0316331461074e5760405162461bcd60e51b815260040161074590612e26565b60405180910390fd5b805161076190601390602084019061293b565b5050565b60606001805461077490612e5b565b80601f01602080910402602001604051908101604052809291908181526020018280546107a090612e5b565b80156107ed5780601f106107c2576101008083540402835291602001916107ed565b820191906000526020600020905b8154815290600101906020018083116107d057829003601f168201915b5050505050905090565b6000610804826000541190565b6108665760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610745565b506000908152600560205260409020546001600160a01b031690565b600061088d82610d29565b9050806001600160a01b0316836001600160a01b031614156108fc5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610745565b336001600160a01b03821614806109185750610918813361063a565b61098a5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610745565b6109958383836118ff565b505050565b6007546001600160a01b031633146109c45760405162461bcd60e51b815260040161074590612e26565b60078054911515600160b01b0260ff60b01b19909216919091179055565b61099583838361195b565b60006109f883610d3b565b8210610a515760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610745565b600080549080805b83811015610ae9576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610aab57805192505b876001600160a01b0316836001600160a01b03161415610ae05786841415610ad95750935061071592505050565b6001909301925b50600101610a59565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610745565b6007546001600160a01b03163314610b735760405162461bcd60e51b815260040161074590612e26565b60078054911515600160a01b0260ff60a01b19909216919091179055565b6007546001600160a01b03163314610bbb5760405162461bcd60e51b815260040161074590612e26565b600a55565b6007546001600160a01b03163314610bea5760405162461bcd60e51b815260040161074590612e26565b47610bf53382611c3e565b50565b610995838383604051806020016040528060008152506113f3565b600080548210610c715760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610745565b5090565b6007546001600160a01b03163314610c9f5760405162461bcd60e51b815260040161074590612e26565b805161076190601490602084019061293b565b6007546001600160a01b03163314610cdc5760405162461bcd60e51b815260040161074590612e26565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6007546001600160a01b03163314610d245760405162461bcd60e51b815260040161074590612e26565b600d55565b6000610d3482611d57565b5192915050565b60006001600160a01b038216610da75760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610745565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610df65760405162461bcd60e51b815260040161074590612e26565b610e006000611e2d565b565b6007546001600160a01b03163314610e2c5760405162461bcd60e51b815260040161074590612e26565b601255565b60606000610e3e83610d3b565b905080610e5f5760408051600080825260208201909252905b509392505050565b6000816001600160401b03811115610e7957610e79612a2a565b604051908082528060200260200182016040528015610ea2578160200160208202803683370190505b50905060005b82811015610e5757610eba85826109ed565b828281518110610ecc57610ecc612e90565b602090810291909101015280610ee181612ebc565b915050610ea8565b50919050565b6060610efa60005490565b821115610f195760405162461bcd60e51b815260040161074590612ed7565b6000828152600e602052604081208054610f3290612e5b565b90501115611077576000828152600e60205260409020805461071591610fde91610f5b90612e5b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8790612e5b565b8015610fd45780601f10610fa957610100808354040283529160200191610fd4565b820191906000526020600020905b815481529060010190602001808311610fb757829003601f168201915b5050505050611e7f565b60138054610feb90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461101790612e5b565b80156110645780601f1061103957610100808354040283529160200191611064565b820191906000526020600020905b81548152906001019060200180831161104757829003601f168201915b50505050506110728561202f565b612134565b60136110828361202f565b604051602001611093929190612f1e565b6040516020818303038152906040529050919050565b919050565b60606002805461077490612e5b565b6007546001600160a01b031633146110e75760405162461bcd60e51b815260040161074590612e26565b600c55565b6110f4612274565b336000908152601060205260409020546001116111535760405162461bcd60e51b815260206004820152601760248201527f574c2057616c6c6574206c696d697420726561636865640000000000000000006044820152606401610745565b600a54600854611164906001612fc5565b11156111a45760405162461bcd60e51b815260206004820152600f60248201526e139bc815d3081b5a5b9d081b19599d608a1b6044820152606401610745565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061121e8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506122c0565b61125d5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102ba610383937b7b360811b6044820152606401610745565b600060095460085461115c6112729190612fdd565b61127c9190612fdd565b9050600081116112ba5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610745565b6001600860008282546112cd9190612fc5565b90915550503360009081526010602052604081208054600192906112f2908490612fc5565b9091555050336000908152600f60205260408120805460019290611317908490612fc5565b9091555061132890503360016122d6565b50505050565b6001600160a01b0382163314156113875760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610745565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113fe84848461195b565b61140a848484846122f0565b6113285760405162461bcd60e51b815260040161074590612ff4565b606061143160005490565b8211156114505760405162461bcd60e51b815260040161074590612ed7565b6000828152600e60205260408120805461146990612e5b565b9050111561147a57610715826123fd565b60146110828361202f565b61148d612274565b600754600160a81b900460ff166114d05760405162461bcd60e51b8152602060048201526007602482015266215075626c696360c81b6044820152606401610745565b600c5481908111156115185760405162461bcd60e51b8152602060048201526011602482015270115e18d959591959081b585e081b5a5b9d607a1b6044820152606401610745565b600b54816009546115299190612fc5565b111561156b5760405162461bcd60e51b8152602060048201526011602482015270139bc8119c9959481b5a5b9d081b19599d607a1b6044820152606401610745565b600d54336000908152600f6020526040902054611589908390612fc5565b11156115ce5760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d081b1a5b5a5d081c995858da195960621b6044820152606401610745565b600060095460085461115c6115e39190612fdd565b6115ed9190612fdd565b90506000811161162b5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610745565b61163582826124b2565b915081600960008282546116499190612fc5565b9091555050336000908152601160205260408120805484929061166d908490612fc5565b9091555050336000908152600f602052604081208054849290611691908490612fc5565b90915550610995905033836122d6565b6007546001600160a01b031633146116cb5760405162461bcd60e51b815260040161074590612e26565b6000828152600e6020908152604090912082516109959284019061293b565b60005482111561170c5760405162461bcd60e51b815260040161074590612ed7565b600754600160a01b900460ff166117655760405162461bcd60e51b815260206004820152601a60248201527f43757374205370656563682069736e277420616c6c6f7765642e0000000000006044820152606401610745565b600061177083610d29565b9050336001600160a01b038216146117bd5760405162461bcd60e51b815260206004820152601060248201526f2737b716b7bbb732b2103a37b5b2b71760811b6044820152606401610745565b6055600383516117cd919061305d565b6117d8906004613071565b106118195760405162461bcd60e51b81526020600482015260116024820152704d6178206c656e2065786365656465642160781b6044820152606401610745565b6000838152600e6020908152604090912083516113289285019061293b565b6007546001600160a01b031633146118625760405162461bcd60e51b815260040161074590612e26565b6001600160a01b0381166118c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610745565b610bf581611e2d565b6007546001600160a01b031633146118fa5760405162461bcd60e51b815260040161074590612e26565b600b55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061196682611d57565b80519091506000906001600160a01b0316336001600160a01b0316148061199d575033611992846107f7565b6001600160a01b0316145b806119af575081516119af903361063a565b905080611a195760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610745565b846001600160a01b031682600001516001600160a01b031614611a8d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610745565b6001600160a01b038416611af15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610745565b611b0160008484600001516118ff565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b031602179055908601808352912054909116611bf457611ba8816000541190565b15611bf457825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b80471015611c8e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610745565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611cdb576040519150601f19603f3d011682016040523d82523d6000602084013e611ce0565b606091505b50509050806109955760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610745565b6040805180820190915260008082526020820152611d76826000541190565b611dd55760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610745565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611e23579392505050565b5060001901611dd7565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516060908290611ea0576040805160008082526020820190925290610e57565b60048151611eae9190613090565b15611efb5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420626173653634206465636f64657220696e707574000000006044820152606401610745565b60006040518060a0016040528060808152602001614179608091399050600060048351611f28919061305d565b611f33906003613071565b90506000611f42826020612fc5565b6001600160401b03811115611f5957611f59612a2a565b6040519080825280601f01601f191660200182016040528015611f83576020820181803683370190505b5090508351840151603d60ff82161415611fb257600183039250613d3d61ffff82161415611fb2576001830392505b50818152600183018485518101602084015b8183101561202157600483019250825160ff8082168601511660ff808360081c168701511660061b0160ff808360101c1687015116600c1b60ff808460181c168801511660121b010190508060e81b825250600381019050611fc4565b509298975050505050505050565b6060816120535750506040805180820190915260018152600360fc1b602082015290565b8160005b811561207d578061206781612ebc565b91506120769050600a8361305d565b9150612057565b6000816001600160401b0381111561209757612097612a2a565b6040519080825280601f01601f1916602001820160405280156120c1576020820181803683370190505b5090505b841561212c576120d6600183612fdd565b91506120e3600a86613090565b6120ee906030612fc5565b60f81b81838151811061210357612103612e90565b60200101906001600160f81b031916908160001a905350612125600a8661305d565b94506120c5565b949350505050565b606061213e6129bb565b6040518060c00160405280608681526020016135596086913981526121616124ca565b60405160200161217191906130a4565b60408051808303601f19018152918152602080840192909252516121999186918691016130fb565b60408051808303601f190181529181528201526121b46124ed565b6040516020016121c4919061319b565b60408051808303601f19018152918152606083019190915280516101808101909152610151808252615a9660208301396080820190815260a08201868152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b60208083019190915260c0860182905285518187015184880151606089015197519651955161225b989397929691959394929391920161324e565b6040516020818303038152906040529150509392505050565b600754600160b01b900460ff1615610e005760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd0814185d5cd959608a1b6044820152606401610745565b6000826122cd8584612510565b14949350505050565b61076182826040518060200160405280600081525061257c565b60006001600160a01b0384163b156123f257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123349033908990889088906004016132e0565b602060405180830381600087803b15801561234e57600080fd5b505af192505050801561237e575060408051601f3d908101601f1916820190925261237b9181019061331d565b60015b6123d8573d8080156123ac576040519150601f19603f3d011682016040523d82523d6000602084013e6123b1565b606091505b5080516123d05760405162461bcd60e51b815260040161074590612ff4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061212c565b506001949350505050565b6060610715826013805461241090612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461243c90612e5b565b80156124895780601f1061245e57610100808354040283529160200191612489565b820191906000526020600020905b81548152906001019060200180831161246c57829003601f168201915b5050506000878152600e6020526040902080546124ad9350909150610f5b90612e5b565b612589565b60008183106124c157816124c3565b825b9392505050565b6060604051806118c0016040528061189d81526020016141f961189d9139905090565b606060405180610b800160405280610b5a81526020016135df610b5a9139905090565b600081815b8451811015610e5757600085828151811061253257612532612e90565b602002602001015190508083116125585760008381526020829052604090209250612569565b600081815260208490526040902092505b508061257481612ebc565b915050612515565b61099583838360016125f4565b606060006125a061259b866001612fc5565b61202f565b6125a86127b6565b846125b786886110728b61202f565b6040516020016125ca949392919061333a565b60405160208183030381529060405290506125e4816127d6565b60405160200161225b91906134ba565b6000546001600160a01b0385166126575760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610745565b836126b55760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610745565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b858110156127ad5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156127a15761278560008884886122f0565b6127a15760405162461bcd60e51b815260040161074590612ff4565b60019182019101612732565b50600055611c37565b606060405180608001604052806059815260200161350060599139905090565b60608151600014156127f657505060408051602081019091526000815290565b600060405180606001604052806040815260200161413960409139905060006003845160026128259190612fc5565b61282f919061305d565b61283a906004613071565b90506000612849826020612fc5565b6001600160401b0381111561286057612860612a2a565b6040519080825280601f01601f19166020018201604052801561288a576020820181803683370190505b509050818152600183018586518101602084015b818310156128f6576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161289e565b60038951066001811461291057600281146129215761292d565b613d3d60f01b60011983015261292d565b603d60f81b6000198301525b509398975050505050505050565b82805461294790612e5b565b90600052602060002090601f01602090048101928261296957600085556129af565b82601f1061298257805160ff19168380011785556129af565b828001600101855582156129af579182015b828111156129af578251825591602001919060010190612994565b50610c719291506129e2565b6040518060e001604052806007905b60608152602001906001900390816129ca5790505090565b5b80821115610c7157600081556001016129e3565b6001600160e01b031981168114610bf557600080fd5b600060208284031215612a1f57600080fd5b81356124c3816129f7565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612a5a57612a5a612a2a565b604051601f8501601f19908116603f01168101908282118183101715612a8257612a82612a2a565b81604052809350858152868686011115612a9b57600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112612ac657600080fd5b6124c383833560208501612a40565b600060208284031215612ae757600080fd5b81356001600160401b03811115612afd57600080fd5b61212c84828501612ab5565b60005b83811015612b24578181015183820152602001612b0c565b838111156113285750506000910152565b60008151808452612b4d816020860160208601612b09565b601f01601f19169290920160200192915050565b6020815260006124c36020830184612b35565b600060208284031215612b8657600080fd5b5035919050565b80356001600160a01b03811681146110a957600080fd5b60008060408385031215612bb757600080fd5b612bc083612b8d565b946020939093013593505050565b803580151581146110a957600080fd5b600060208284031215612bf057600080fd5b6124c382612bce565b600060208284031215612c0b57600080fd5b6124c382612b8d565b600080600060608486031215612c2957600080fd5b612c3284612b8d565b9250612c4060208501612b8d565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612c8857835183529284019291840191600101612c6c565b50909695505050505050565b60008060208385031215612ca757600080fd5b82356001600160401b0380821115612cbe57600080fd5b818501915085601f830112612cd257600080fd5b813581811115612ce157600080fd5b8660208260051b8501011115612cf657600080fd5b60209290920196919550909350505050565b60008060408385031215612d1b57600080fd5b612d2483612b8d565b9150612d3260208401612bce565b90509250929050565b60008060008060808587031215612d5157600080fd5b612d5a85612b8d565b9350612d6860208601612b8d565b92506040850135915060608501356001600160401b03811115612d8a57600080fd5b8501601f81018713612d9b57600080fd5b612daa87823560208401612a40565b91505092959194509250565b60008060408385031215612dc957600080fd5b8235915060208301356001600160401b03811115612de657600080fd5b612df285828601612ab5565b9150509250929050565b60008060408385031215612e0f57600080fd5b612e1883612b8d565b9150612d3260208401612b8d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612e6f57607f821691505b60208210811415610ee957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612ed057612ed0612ea6565b5060010190565b6020808252601190820152703737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b60008151612f14818560208601612b09565b9290920192915050565b600080845481600182811c915080831680612f3a57607f831692505b6020808410821415612f5a57634e487b7160e01b86526022600452602486fd5b818015612f6e5760018114612f7f57612fac565b60ff19861689528489019650612fac565b60008b81526020902060005b86811015612fa45781548b820152908501908301612f8b565b505084890196505b505050505050612fbc8185612f02565b95945050505050565b60008219821115612fd857612fd8612ea6565b500190565b600082821015612fef57612fef612ea6565b500390565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261306c5761306c613047565b500490565b600081600019048311821515161561308b5761308b612ea6565b500290565b60008261309f5761309f613047565b500690565b7f3c7374796c6520747970653d27746578742f637373273e0000000000000000008152600082516130dc816017850160208701612b09565b671e17b9ba3cb6329f60c11b6017939091019283015250601f01919050565b7f3c66696c7465722069643d27746869735f696d6167652720783d27302527207981527f3d273025272077696474683d273130302527206865696768743d2731303025276020820152753e3c6665496d61676520786c696e6b3a687265663d2760501b604082015260008351613178816056850160208801612b09565b83519083019061318f816056840160208801612b09565b01605601949350505050565b7f272f3e3c2f66696c7465723e3c66696c7465722069643d27637573746f6d5f7481527f6578742720783d2730252720793d273025272077696474683d2731303025272060208201527f6865696768743d2731303025273e3c6665496d61676520786c696e6b3a687265604082015262663d2760e81b60608201526000825161322b816063850160208701612b09565b6b13979f1e17b334b63a32b91f60a11b6063939091019283015250606f01919050565b6000885160206132618285838e01612b09565b8951918401916132748184848e01612b09565b89519201916132868184848d01612b09565b88519201916132988184848c01612b09565b87519201916132aa8184848b01612b09565b86519201916132bc8184848a01612b09565b85519201916132ce8184848901612b09565b919091019a9950505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061331390830184612b35565b9695505050505050565b60006020828403121561332f57600080fd5b81516124c3816129f7565b757b226e616d65223a2022446567656e6172696f73202360501b8152845160009061336c816016850160208a01612b09565b7f222c202265787465726e616c5f75726c223a202268747470733a2f2f646567656016918401918201526c03730b934b7b9973bba3311161609d1b60368201526f113232b9b1b934b83a34b7b7111d101160811b604382015285516133d8816053840160208a01612b09565b7f222c202261747472696275746573223a5b7b2274726169745f74797065223a2060539290910191820152731129b832b2b1b4111610113b30b63ab2911d101160611b60738201528451613433816087840160208901612b09565b7f227d2c7b2274726169745f74797065223a2022437573746f6d20537065656368608792909101918201527f222c202276616c7565223a2022596573227d5d2c2022696d6167655f6461746160a782015263111d101160e11b60c78201526134af6134a160cb830186612f02565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516134f281601d850160208701612b09565b91909101601d019291505056fe3434343420446567656e7320707265706172696e6720746f2074616b65206f7665722074686520657468657265756d20626c6f636b636861696e2e204372656174656420627920446567656e7320666f7220446567656e73213c7376672077696474683d273230303027206865696768743d2732303030272076696577426f783d27302030203230303020323030302720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e646174613a696d6167652f706e673b6261736536342c6956424f5277304b47676f414141414e5355684555674141423941414141665141674d414141446e56697a71414141414446424d564555414141442f2f2f38414141416448523141543066744141414141585253546c4d41514f62595a6741414342564a52454655654e72733273454a67314141424648546d553359544337705230694a7759446755596933664f65394667623274424d4141414141414141414141414141414141414141414141414141414141414141414141414177463962475a7a6f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f51644e3147344f624c6e73734447362b504f7276686345393134506f476149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f515439483377366668634739746f4e6e584e41386e54487174375550766567746f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68423539453934323572663875357877584e6c72316e33336a525737377330594541414141416743422f363045756861515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b5350695239535071513943487051394b487041394a4835492b4a4831492b70443049656c44306f656b44306b666b6a346b66556a366b505168365550536836515053522b4b58547334625269496f6967363655784e75426c763149393644457155685178424e6e6a70756564304d467a3473336d6942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a48715136454750364139664e3661326a417637722b3862453171507475506b786866385858625257305150456a31493943445267305150456a31493943445267305150456a31493943445267305150456a314939434452672f35464e355172574d5a4c2b3846616267727247584f38746830632b696e637a3569695a3467654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a48715136454769427a324e6269303372325738626638556c32752b64576538622f73556c782f5266555030494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a306f4447706258735766655a5878346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346e2b773834646e54414942554151314d375357666f52306d424158695367676c69424f395043776e31656b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f67654a486952366b4f68426f6b664e6f67654e7a53703679332f6a5257385250556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e47445241385350556a30494e474437714b2f783262697359376f56362b4a4a334d6d567a5232712b675a792b346a656f626f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f516149486952346b6570446f5a62506f51655077466231694f596c65495871513645476942346b654a4871513645476942346b654a4871513645476942346b654a4871513645476942346b654a446f41414141414141414141414141414141412f4e6944417745414141414149502f58526c42565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565646666267514141414141414179502b314556525656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656685430344541414141414141386e397442465656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565951384f42414141414143412f463862515656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565632494d4441514141414141672f39644755465656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565655563975424141414141414144492f375552564656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656574650546751414141414141447966323045565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656566844773445414141414149443858787442565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656585967774d42414141414143442f31305a5156565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565258323445414141414141414d6a2f7452465556565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565955394f4241414141414141504a2f62515256565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565657455044675141414141416750786647304656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565664714451774941414141415166396665384d41414141414141414141414141414141414141414141414141414141414141426342625134535279704e43446c4141414141456c46546b5375516d43434142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e0000003f3435363738393a3b3c3d00000000000000000102030405060708090a0b0c0d0e0f101112131415161718190000000000001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233000000000040666f6e742d66616365207b20666f6e742d66616d696c793a20275072657373205374617274203250273b207372633a2075726c28646174613a6170706c69636174696f6e2f6f637465742d73747265616d3b6261736536342c643039474d674142414141414142497741417741414141415266774141424865414145414141414141414141414141414141414141414141414141414141414148494a6b426d41416847775243417277564e4a6a43344e434141453241695144673059454941574553676545554274304e4b4f696d6e515873762b65744d5a74632f6172436f4c4d726c546a37734444534b686f556f33516f6b79454275494c6436684a3430463446586f7053352f6e7053302b7666466274466a473072426f35494d6a4a4a6d463532732f39756675596d374a5057706a4b494646764c6b6d74784a4a7042654a396b312b7348743973656f3039776b46394b55414d6464544a3450717255346b3676413863642f2b334634615272736c76495076464734622b4b50474d386a77552f5933366f663732534c6a2f622f67714b5331526f526f456339474b5a42334f4a41372f653050634464514a3363494c4a49576149696c4746515a4e432f4248385954344a74664e39556a42436c706b524b47683477645377554861354f61326d676c4344655377476e6c65632b6e6e553370704c617251496233664b74304b7057333073674f6d4a2f3853694d4e66492b335752674f777979633870396338673655666e496c332b68307261482f33394b557a756a75624d6d3177464a52476b436c505237554867396731702f352b7a3037476b3238367a30317931317556397a505364395a6e643962755a53472f497853476e55757056626b5a3567586d6f354945456b774465423547304d444461426362434a47764b4b2f6c7a58374632686844396d4b78364f7347794846495977786870694f63575435702f3834763263454f4b6b305866526f6b6976696d4a7661636f784c35796471324338436b764566557852626472754844384b474466494c5162502f2f78667367784e7637334854363952773349456d6a53474f446842734d306f672f586a72796f6b6c73774843675167547a55637959614e4474446c526245545746796f52696f4136714a70546357476e3735653347784b7454525452444f6c4a456330503863326d78646778545451336471596b76544456552f436e444a6f712f73464b6a475161396e436d3972476636377149554f6f67525370494343743979643677654a56743471444b55515855565338724b39796341624331764b32397a3167327a6364786c3046556e66674651482f4a756776594171446554544b73536166356943453631736a504b7763696c672f415654714a45662f783568517170334658442f574b454945434e4943434554775167344245554753484846417868676e674b674b62314f61596b3965594a67515a714737592f5a50673877656141507a586758384e42677672436179546d62553032612f377a316e756e344c5076696741475942367a344538736c77673563666d3476383462646c476135313178774f62374c4c6245706573744d38365736797732585658586250656662466375484c6e615a5452786868726f6749494c42774342685932446934654d516b70475955646c74727070613365557a497973624278382f44796953685570455370637655614e576e57716b323348723336444e726d756531754f6d574e3038343734344958486e6e6e4d645142742b7a337841665033444458504b2f64397441796238777834714246466c707367305332374469783538695a47312f5a6375544b4e383534453254436f7941696f5347376a457145543042496a716d466c6f71616e6f614f675a6d4c6e594e54574542516946575a616855713161707952593075375470303674646741463264766659343670676a6f73674838774659414f514679483934376e44672f516177417a45413041424130545331574d454c45796978304a724c4241544a574c57714e6c6653634c7573794e73547346557a4b56504b676f7768674178657631424f77684874697055446366464a7137594542684a7163706730714d4b4f354a4b5148524d4b7844736a34546b612f48436d5462564c75696c41634738785a2b5062315771647a584a6c4c56746b7a567a5a4150493833646d3937784c64544c4b5a41594e6f39546435334641766157732b562f715756775a523539662b52715757334b2f7662495754656c66426b4661322b6a38624e65756a56705242314f785257776d362f64414459306c767a31344859575441324541326e31762b76443033594a35316f43452b507836747337585279374a5a6f697667592b434c2b65706861366d394b6471777954566b4a5a65357a6c54625a5736346a35387a65336a63516e655161714e65577848497435454b6332332f336a3070534369777478796d38624e48716465534678624c3271357263574677384c704172573241493277766b47795350734e433645684d5038526c71767533743132424249734c7058467853546a634b41464e6f524363446e34346a67536f4c6d55476d6830317043674d3958797142624433584869674433416d70652f433532554535473645664a43694f6261725a35677a37654d58495463496d57623041444c4f67524243363749304e44596b62707377382b75675a4b6e6f58536a324c79516d655241345a536d68745875444a367963424f4a716c4374566259746455395778727746396e75586f6b51674d384c5a64534a585a3268415044436d50656853767070667548595738454861714f465566454136394269574c4c486c4a395a6261586257686c35684a537743692b314d465136625747417a5251566149685236616b4b517639646f795478736a477a66436e4264557a624c4e64587a707156764c626655576757506741417546783031706a6f6272474b4741745776683447683159654b553242436e4b685570474743386364557279443057766369656c536835346c42562b5071736b3635774d6a794b6b536d73376a546b777a556c52693062705963566759387661527268686c7045317471726931535156514b364264644e796c7a554e504c733653774c633347736a6842783334716a6d6769464c3031686f5938346b6e46735267494947375346533142427a6331634f676d45535a2f4869446c7067686e794569565331346578755042485738524f51415545536d4779566c7a58786d4b7341554a6948484f69446e50716a735a436b306932324279505674426a6775574d6b4f5867776b546c733141697550585868694c3271575179656e364454534b4b7a4b35484168496d32794a513461413548513568394f3873492b695a37414157415935596b696b3857554a5331565471426e3368697933444149495557484671324e5756347530727355576f6b746d56507a64656268494a75616c3436797368756446414d49664c7744462b514b494a30703248664a69526838596c6149584932746963496752344464414c39307a45693163547064554453545a3042546254766b41745774676241643356763353587733424a394a514d71354b7331507149352f5667702b62616b31514d6c7956516f5a756775697a304432637a42794b75776c4f4743354e7852554a4f75624b34454b345677475744684751374246463930747338475259326e67675255556349754a6c5945685a69725976456d6968424545474f5975556961347977433550486b6a4e7257636f796c3232576f356f39434a47666a564d5756396153314a56344c74767947566437396d7a764c7a517458455a5a504436434e4570356a57426f4a5341514f3562557a5264374a5575764676594a6c6b4164554d45567745697a41575a784e7257595468784735554472556f506a45555a4676756779442b73526775433639687069566d49557267635964762b4b3932795a6c47374c4d4c747a553052644750444671456f546951425a386f5535317368366752336b556c735747534b5776674e424474467938626b6831334b474b67306b6449767752784a4659627737483942374d48566a367a3465324a6d4d5434784146392f564370502b615252726e46444534726f6773397964575969746a68456a386652594f456363514f6563434362423861492b6d3273774c7752495730693465684344534b304b306570586e575945796c3767547a4e7343356b683132496549773871734d566332394876674e52456c6c316764434f7874556170565057747530467a317461747a6d416458415a72707452556c74646a6a2f6e7061696f702b69507358346f63364a69503279416d446d786e324332307658345866705456726b79794f55667a6b6f37717549773236364a454e68427a2f6e7946314c396776716f58306f315843424a456554727462584f70437a4d5664696a306959626f6f554c414b65685764683562362b514853636e6d6848627043766769726c5269556a536173464d393265674c2f7579696b65583469333656756377785232776f6d2f36594a6e566e5675424658353750676b537373347a36346b616c337258436a33685a2f6e686d4537364658422f4e6a705a36624d416a3749553635382f3034374f59645a306c303057614a66746755354b356b394e346d6e43646e2f69315a636431394c644f2f796f30374152776a6b455377415469533968306e616c5a6846386d686e30464d324141687a6a57547065386d4e53794b43685341643836663136375145526f6e7169446b51685935324578722f7079774375776473447a6a2b76525a546f314f766348466b516575502b34625a2f4b636d444f644c39506f3278683369716e453664635973614c5458796354354e364f677a4a662b554d356363363632374a6941676f4e3441414f6c476b4146413341393556594d6e4c47536f4c65685748357559624e316476553863494548342f416431424a3966302f3133386a70584a775a446a48472b3174566c597549493747377552654f65686c6d51644f426f4468504936454d51633979727178525773376a495152466d427958445869317a5a6d50574b583244754c36533866423374365638745a71386b743439396778773436375631787a67646b6e6b7663426a37585830527158322f397876377a6c34466a62654c3468374c4f574d5130744b4241334a3552564b32317936476444687836384b6f6165516641444352503453456c72556c447137575a614c6c496e516f4335766f354d417070426e4f6f614959316436565936713165796542643142623858465462754761456f4436394557433266634138305366766d6b413842644272337276714f5638754e573049684c367159464932334c424a712f36357645674e62346661496f426d6642534e52584a357273457341566c69694f325a48776b4e644c643235354961487844663243714f4c7245434257386c7950776e75396a414a734e315259315a6f4d6d4274766f435459555070552f504b36307644516e325070416169636e7a4569704c4c4d433968683754736479385975557276654261486b636754666c6f63746a43436f7969494f53307a434d4354564f4d5a3547614d6f5a4f554371496a314b71755447676c4a30363552514a7a6869633643665a517a764c4d7a614966454e73666f592b4276785875763065514f4c59463452673375456933797a4779415a6c354a7446436d574c725a724f4a33757a4766375358496d363177557675314d7a4f75643858564138664e564f625361576e506f4e41454567666c43414775647247384264345977444d2f7053554957346663326b59497241592f546d4c7539432f744a6b626464726d666f78754a326245484455744566306441345a775656506136525a716d65526c386e4a6c6d517676432b726f5a374934555848652f527a6e6e504c6677347a6d395831772b3274575a42614d3569723330484343364441627176514257616d2f64314d694870324d4f62482b737668626b356833334f524b3770573139665778674932327a66336879322f446665676c456c496a715477304f7862306d382b796664515877714e593630683258792b4539696539454f46634c7a5a634b4a51476d72693571304e52586d774e6c347973554551796933794146444f466a32495336474e6266546a48556f66646833783835614f6b4e3958446933787761566e474e506a4f3175715a7a53682b514752676965776e62377a7345372f6d6263516a676b535373574b4c767150425264504564777833457a3643567633534756357530514f51663752446b4962696c386a2b5675776a63686c54643837394b595444584542797568616151384d2f4b6d726979486969327169664f6363665875794e536e6f645a7848525634623966616869514378457a59796e575479556e5346796e56356a644c594e3945384b3568354e6841756c2b686d796b32556744317043675945513265436542423351665832762b3554744e6c64353031634c7348636c5a4945497333454c76536656627477584e373134676b6964597745723758477a4d486933704776414d736135546b504e3463714a2b62734d4b674a623272473571385a4b73337a39446c4d71377a48783757456e6b50626c385739692b7769376f5944524b75744c476f6b50543333704f443038312b61447857696676546a4232306166457034754a444c55387a3274664362517670597777573161537a535135634b4234556c6b6d6e43367246586856753539774f584369716e2f38336652664635547a764a376d2f755a4a722b6547704839545341354c69786f6c307a3946304a582f3470484d684d494839524d42657164723733426b45553076756361356b5831675a32516e50612b775245734c41557a434a51613471524d416d46584565765831666f6a6173304f754f74452b5a5a584b6b53796732516169464c433247567056654a6a5554713358623649776b376f7a584135522b6850733450785a394d57717a2b4b75776e74772b62756a36337745706e5967592b7247724c676a752b654a2f42564331593434714353456e337958672b4177574a504e58764a6d3362704e697a38595a4365517a7076375079566246395836316575743931764e705a6d6a2b70743153454e312f32373170716a62416f55666e6e7342324a2f73782f6369334874614c6b4c646462627842676366537537536c325638786848417166526a666436762b4f7a374743766e472b42764344454641417a61474e39363138494c76797355335132687876317061554230384f6376464f433371395a4b6c57566d6c543948703976496439616a6145742b46324f444f6574654843334e6d334243743467437662583644486a6c494353636a7763576332314d554f6736554863746879727331786144344567553056696171363837336e597562416a7a33344c39612f2f622b6c55586b786c357a6b65424234626d624b4d42776c69414b614f64754a4c486d47615674424466583333564979594272636c654e78716b6171506b624e755a583261544a4443726266686b6a4f4d7a45356252526355696a654f324743726471377147426a5639354e6c41673931536a307056426f614b41525378566a41524b4d593935674c756152425142446e72456b4b6f6a38424a474e6b4f452b4446446357504e304170746e57456a5265384d5730474b5a39684a774664757441626f31613154326b6d784e75785370564f44563931704e464f586175367162614c7164687536474e6d356e6171427a39504670317546547432343342693861745470305a7971494f704f2f59486174454c774d4c484c32434b4e4a42724a6277434a612f7a56794f684565426e497a4c74532f30317571744f6d33594472395472314b766c51655158684436796d3339725955576e54754e5656696f7047442b703633774634594c497162616f4e55427630434b3952596f5a366f4734556449672b445272534337724c67366f33645656444746504137584b7130474c507a6d4e7a6732575643762b5076756c796851586b55656e4c47654f4f57796f64554f57677851694971704638526c626a747276756f6143696f62767667596365595742696865676c566374762f746754645a355a34704444654c342f79763569496d4c50765644763551503644356237536b477634644637316368644c54597a754c65707952646d375435375078307372477a7358756e5771302f50342b3831563067503836742b2f6e454744426b32614176554554342f2b4155457a5245534e6d4b794b53593938762f52696e317a566f6e4c727468676f787935386e35666758776b2f3738325a4c4554653348677955396666654f717944577a354d74774b4e6165654a3677746f726a4a45773272564c6c6c4e5253754c68305647626f374e76726f6b74754f4f36456b3036354867616a4c6b69494d324e57686f57624e336351474157577162413962427a694a753545537a4a70706e6e6d6d6d2b614d70396f77725041523638747050505742322b712f2b504c44556d353957524a47726148555665376e6b6b69377172446b72464f736f6a54426e49556a6f6e4152483946397479615834785473333165424b39544f38306e6d39575544722f5053436972476f6b43293b7d3c726563742077696474683d273130302527206865696768743d27313030252720783d2730252720793d273025272066696c7465723d2775726c2823746869735f696d61676529272f3e3c726563742077696474683d273130302527206865696768743d27313030252720783d2730252720793d273025272066696c7465723d2775726c2823637573746f6d5f7465787429272f3e3c7465787420646f6d696e616e742d626173656c696e653d276d6964646c652720746578742d616e63686f723d276d6964646c652720783d273530252720793d2731302e35252720666f6e742d66616d696c793d272671756f743b50726573732053746172742032502671756f743b2c637572736976652720666f6e742d73697a653d273130656d2720746578744c656e6774683d273138303027206c656e67746841646a7573743d2773706163696e67416e64476c79706873273ea2646970667358221220c8e1a04e18f99ebe24df09f9c10f0fe0a6942de22b9bb396d2093395e92394a264736f6c63430008090033
Deployed Bytecode Sourcemap
55026:5548:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27500:372;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27500:372:0;;;;;;;;58018:87;;;;;;:::i;:::-;;:::i;:::-;;29023:100;;;:::i;:::-;;;;;;;:::i;30109:214::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3037:32:1;;;3019:51;;3007:2;2992:18;30109:214:0;2873:203:1;29688:413:0;;;;;;:::i;:::-;;:::i;55222:26::-;;;;;-1:-1:-1;;;55222:26:0;;;;;;56019:76;;;;;;:::i;:::-;;:::i;26182:100::-;26235:7;26262:12;26182:100;;;4014:25:1;;;4002:2;3987:18;26182:100:0;3868:177:1;55531:41:0;;;;;;:::i;:::-;;;;;;;;;;;;;;55629:45;;;;;;:::i;:::-;;;;;;;;;;;;;;30799:162;;;;;;:::i;:::-;;:::i;55683:25::-;;;;;;26485:1007;;;;;;:::i;:::-;;:::i;56185:81::-;;;;;;:::i;:::-;;:::i;58488:79::-;;;;;;:::i;:::-;;:::i;58325:155::-;;;:::i;30969:177::-;;;;;;:::i;:::-;;:::i;55449:31::-;;;;;;26290:187;;;;;;:::i;:::-;;:::i;55413:29::-;;;;;;58113:87;;;;;;:::i;:::-;;:::i;55154:29::-;;;;;-1:-1:-1;;;55154:29:0;;;;;;56103:74;;;;;;:::i;:::-;;:::i;57916:90::-;;;;;;:::i;:::-;;:::i;28891:124::-;;;;;;:::i;:::-;;:::i;55294:32::-;;;;;;27880:221;;;;;;:::i;:::-;;:::i;23991:103::-;;;:::i;58666:92::-;;;;;;:::i;:::-;;:::i;58766:502::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55257:30::-;;;;;;23768:87;23841:6;;-1:-1:-1;;;;;23841:6:0;23768:87;;57214:427;;;;;;:::i;:::-;;:::i;29131:104::-;;;:::i;55190:25::-;;;;;-1:-1:-1;;;55190:25:0;;;;;;57822:86;;;;;;:::i;:::-;;:::i;59276:626::-;;;;;;:::i;:::-;;:::i;30331:288::-;;;;;;:::i;:::-;;:::i;31154:355::-;;;;;;:::i;:::-;;:::i;55335:30::-;;;;;;56835:371;;;;;;:::i;:::-;;:::i;55372:32::-;;;;;;59910:661;;;;;;:::i;:::-;;:::i;55105:40::-;;55141:4;55105:40;;56274:109;;;;;;:::i;:::-;;:::i;56391:436::-;;;;;;:::i;:::-;;:::i;30627:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;30748:25:0;;;30724:4;30748:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30627:164;24102:201;;;;;;:::i;:::-;;:::i;58575:83::-;;;;;;:::i;:::-;;:::i;55579:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;27500:372;27602:4;-1:-1:-1;;;;;;27639:40:0;;-1:-1:-1;;;27639:40:0;;:105;;-1:-1:-1;;;;;;;27696:48:0;;-1:-1:-1;;;27696:48:0;27639:105;:172;;;-1:-1:-1;;;;;;;27761:50:0;;-1:-1:-1;;;27761:50:0;27639:172;:225;;;-1:-1:-1;;;;;;;;;;3446:40:0;;;27828:36;27619:245;27500:372;-1:-1:-1;;27500:372:0:o;58018:87::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;;;;;;;;;58086:11;;::::1;::::0;:7:::1;::::0;:11:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58018:87:::0;:::o;29023:100::-;29077:13;29110:5;29103:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29023:100;:::o;30109:214::-;30177:7;30205:16;30213:7;31574:4;31608:12;-1:-1:-1;31598:22:0;31517:111;30205:16;30197:74;;;;-1:-1:-1;;;30197:74:0;;8737:2:1;30197:74:0;;;8719:21:1;8776:2;8756:18;;;8749:30;8815:34;8795:18;;;8788:62;-1:-1:-1;;;8866:18:1;;;8859:43;8919:19;;30197:74:0;8535:409:1;30197:74:0;-1:-1:-1;30291:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30291:24:0;;30109:214::o;29688:413::-;29761:13;29777:24;29793:7;29777:15;:24::i;:::-;29761:40;;29826:5;-1:-1:-1;;;;;29820:11:0;:2;-1:-1:-1;;;;;29820:11:0;;;29812:58;;;;-1:-1:-1;;;29812:58:0;;9151:2:1;29812:58:0;;;9133:21:1;9190:2;9170:18;;;9163:30;9229:34;9209:18;;;9202:62;-1:-1:-1;;;9280:18:1;;;9273:32;9322:19;;29812:58:0;8949:398:1;29812:58:0;6214:10;-1:-1:-1;;;;;29905:21:0;;;;:62;;-1:-1:-1;29930:37:0;29947:5;6214:10;30627:164;:::i;29930:37::-;29883:169;;;;-1:-1:-1;;;29883:169:0;;9554:2:1;29883:169:0;;;9536:21:1;9593:2;9573:18;;;9566:30;9632:34;9612:18;;;9605:62;9703:27;9683:18;;;9676:55;9748:19;;29883:169:0;9352:421:1;29883:169:0;30065:28;30074:2;30078:7;30087:5;30065:8;:28::i;:::-;29750:351;29688:413;;:::o;56019:76::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;56076:7:::1;:11:::0;;;::::1;;-1:-1:-1::0;;;56076:11:0::1;-1:-1:-1::0;;;;56076:11:0;;::::1;::::0;;;::::1;::::0;;56019:76::o;30799:162::-;30925:28;30935:4;30941:2;30945:7;30925:9;:28::i;26485:1007::-;26574:7;26610:16;26620:5;26610:9;:16::i;:::-;26602:5;:24;26594:71;;;;-1:-1:-1;;;26594:71:0;;9980:2:1;26594:71:0;;;9962:21:1;10019:2;9999:18;;;9992:30;10058:34;10038:18;;;10031:62;-1:-1:-1;;;10109:18:1;;;10102:32;10151:19;;26594:71:0;9778:398:1;26594:71:0;26676:22;26262:12;;;26676:22;;26939:466;26959:14;26955:1;:18;26939:466;;;26999:31;27033:14;;;:11;:14;;;;;;;;;26999:48;;;;;;;;;-1:-1:-1;;;;;26999:48:0;;;;;-1:-1:-1;;;26999:48:0;;;-1:-1:-1;;;;;26999:48:0;;;;;;;;27070:28;27066:111;;27143:14;;;-1:-1:-1;27066:111:0;27220:5;-1:-1:-1;;;;;27199:26:0;:17;-1:-1:-1;;;;;27199:26:0;;27195:195;;;27269:5;27254:11;:20;27250:85;;;-1:-1:-1;27310:1:0;-1:-1:-1;27303:8:0;;-1:-1:-1;;;27303:8:0;27250:85;27357:13;;;;;27195:195;-1:-1:-1;26975:3:0;;26939:466;;;-1:-1:-1;27428:56:0;;-1:-1:-1;;;27428:56:0;;10383:2:1;27428:56:0;;;10365:21:1;10422:2;10402:18;;;10395:30;10461:34;10441:18;;;10434:62;-1:-1:-1;;;10512:18:1;;;10505:44;10566:19;;27428:56:0;10181:410:1;56185:81:0;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;56245:9:::1;:13:::0;;;::::1;;-1:-1:-1::0;;;56245:13:0::1;-1:-1:-1::0;;;;56245:13:0;;::::1;::::0;;;::::1;::::0;;56185:81::o;58488:79::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58547:8:::1;:12:::0;58488:79::o;58325:155::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58393:21:::1;58425:47;58451:10;58393:21:::0;58425:17:::1;:47::i;:::-;58364:116;58325:155::o:0;30969:177::-;31099:39;31116:4;31122:2;31126:7;31099:39;;;;;;;;;;;;:16;:39::i;26290:187::-;26357:7;26262:12;;26385:5;:21;26377:69;;;;-1:-1:-1;;;26377:69:0;;10798:2:1;26377:69:0;;;10780:21:1;10837:2;10817:18;;;10810:30;10876:34;10856:18;;;10849:62;-1:-1:-1;;;10927:18:1;;;10920:33;10970:19;;26377:69:0;10596:399:1;26377:69:0;-1:-1:-1;26464:5:0;26290:187::o;58113:87::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58180:12;;::::1;::::0;:8:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;56103:74::-:0;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;56160:5:::1;:9:::0;;;::::1;;-1:-1:-1::0;;;56160:9:0::1;-1:-1:-1::0;;;;56160:9:0;;::::1;::::0;;;::::1;::::0;;56103:74::o;57916:90::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;57982:12:::1;:16:::0;57916:90::o;28891:124::-;28955:7;28982:20;28994:7;28982:11;:20::i;:::-;:25;;28891:124;-1:-1:-1;;28891:124:0:o;27880:221::-;27944:7;-1:-1:-1;;;;;27972:19:0;;27964:75;;;;-1:-1:-1;;;27964:75:0;;11202:2:1;27964:75:0;;;11184:21:1;11241:2;11221:18;;;11214:30;11280:34;11260:18;;;11253:62;-1:-1:-1;;;11331:18:1;;;11324:41;11382:19;;27964:75:0;11000:407:1;27964:75:0;-1:-1:-1;;;;;;28065:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;28065:27:0;;27880:221::o;23991:103::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;24056:30:::1;24083:1;24056:18;:30::i;:::-;23991:103::o:0;58666:92::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58733:10:::1;:17:::0;58666:92::o;58766:502::-;58828:16;58857:18;58878:17;58888:6;58878:9;:17::i;:::-;58857:38;-1:-1:-1;58910:15:0;58906:355;;58949:16;;;58963:1;58949:16;;;;;;;;;;;-1:-1:-1;58942:23:0;58766:502;-1:-1:-1;;;58766:502:0:o;58906:355::-;58998:23;59038:10;-1:-1:-1;;;;;59024:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59024:25:0;;58998:51;;59064:13;59092:130;59116:10;59108:5;:18;59092:130;;;59172:34;59192:6;59200:5;59172:19;:34::i;:::-;59156:6;59163:5;59156:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;59128:7;;;;:::i;:::-;;;;59092:130;;58906:355;58846:422;58766:502;;;:::o;57214:427::-;57276:13;57333;26235:7;26262:12;;26182:100;57333:13;57324:5;:22;;57302:65;;;;-1:-1:-1;;;57302:65:0;;;;;;;:::i;:::-;57413:1;57389:13;;;:6;:13;;;;;57383:27;;;;;:::i;:::-;;;:31;57380:254;;;57475:13;;;;:6;:13;;;;;57461:28;;57438:80;;57461:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:28::i;:::-;57492:7;57438:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57501:16;:5;:14;:16::i;:::-;57438:15;:80::i;57380:254::-;57591:7;57600:16;:5;:14;:16::i;:::-;57574:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57560:58;;57214:427;;;:::o;57380:254::-;57214:427;;;:::o;29131:104::-;29187:13;29220:7;29213:14;;;;;:::i;57822:86::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;57886:10:::1;:14:::0;57822:86::o;59276:626::-;55978:13;:11;:13::i;:::-;59380:10:::1;59371:20;::::0;;;:8:::1;:20;::::0;;;;;59394:1:::1;-1:-1:-1::0;59363:60:0::1;;;::::0;-1:-1:-1;;;59363:60:0;;13859:2:1;59363:60:0::1;::::0;::::1;13841:21:1::0;13898:2;13878:18;;;13871:30;13937:25;13917:18;;;13910:53;13980:18;;59363:60:0::1;13657:347:1::0;59363:60:0::1;59463:8;::::0;59443:11:::1;::::0;:15:::1;::::0;59457:1:::1;59443:15;:::i;:::-;59442:29;;59434:57;;;::::0;-1:-1:-1;;;59434:57:0;;14344:2:1;59434:57:0::1;::::0;::::1;14326:21:1::0;14383:2;14363:18;;;14356:30;-1:-1:-1;;;14402:18:1;;;14395:45;14457:18;;59434:57:0::1;14142:339:1::0;59434:57:0::1;59529:28;::::0;-1:-1:-1;;59546:10:0::1;14635:2:1::0;14631:15;14627:53;59529:28:0::1;::::0;::::1;14615:66:1::0;59504:12:0::1;::::0;14697::1;;59529:28:0::1;;;;;;;;;;;;59519:39;;;;;;59504:54;;59577:49;59596:11;;59577:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;59609:10:0::1;::::0;;-1:-1:-1;59621:4:0;;-1:-1:-1;59577:18:0::1;:49::i;:::-;59569:78;;;::::0;-1:-1:-1;;;59569:78:0;;14922:2:1;59569:78:0::1;::::0;::::1;14904:21:1::0;14961:2;14941:18;;;14934:30;-1:-1:-1;;;14980:18:1;;;14973:46;15036:18;;59569:78:0::1;14720:340:1::0;59569:78:0::1;59660:13;59702;;59688:11;;55141:4;59676:23;;;;:::i;:::-;:39;;;;:::i;:::-;59660:55;;59742:1;59734:5;:9;59726:31;;;::::0;-1:-1:-1;;;59726:31:0;;15397:2:1;59726:31:0::1;::::0;::::1;15379:21:1::0;15436:1;15416:18;;;15409:29;-1:-1:-1;;;15454:18:1;;;15447:39;15503:18;;59726:31:0::1;15195:332:1::0;59726:31:0::1;59786:1;59771:11;;:16;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;59807:10:0::1;59798:20;::::0;;;:8:::1;:20;::::0;;;;:25;;59822:1:::1;::::0;59798:20;:25:::1;::::0;59822:1;;59798:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;59841:10:0::1;59834:18;::::0;;;:6:::1;:18;::::0;;;;:23;;59856:1:::1;::::0;59834:18;:23:::1;::::0;59856:1;;59834:23:::1;:::i;:::-;::::0;;;-1:-1:-1;59870:24:0::1;::::0;-1:-1:-1;59880:10:0::1;59892:1;59870:9;:24::i;:::-;59350:552;;59276:626:::0;;:::o;30331:288::-;-1:-1:-1;;;;;30426:24:0;;6214:10;30426:24;;30418:63;;;;-1:-1:-1;;;30418:63:0;;15734:2:1;30418:63:0;;;15716:21:1;15773:2;15753:18;;;15746:30;15812:28;15792:18;;;15785:56;15858:18;;30418:63:0;15532:350:1;30418:63:0;6214:10;30494:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30494:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30494:53:0;;;;;;;;;;30563:48;;540:41:1;;;30494:42:0;;6214:10;30563:48;;513:18:1;30563:48:0;;;;;;;30331:288;;:::o;31154:355::-;31313:28;31323:4;31329:2;31333:7;31313:9;:28::i;:::-;31374:48;31397:4;31403:2;31407:7;31416:5;31374:22;:48::i;:::-;31352:149;;;;-1:-1:-1;;;31352:149:0;;;;;;;:::i;56835:371::-;56906:13;56963;26235:7;26262:12;;26182:100;56963:13;56954:5;:22;;56932:65;;;;-1:-1:-1;;;56932:65:0;;;;;;;:::i;:::-;57043:1;57019:13;;;:6;:13;;;;;57013:27;;;;;:::i;:::-;;;:31;57010:189;;;57068:14;57076:5;57068:7;:14::i;57010:189::-;57155:8;57165:16;:5;:14;:16::i;59910:661::-;55978:13;:11;:13::i;:::-;59986:5:::1;::::0;-1:-1:-1;;;59986:5:0;::::1;;;59978:25;;;::::0;-1:-1:-1;;;59978:25:0;;16509:2:1;59978:25:0::1;::::0;::::1;16491:21:1::0;16548:1;16528:18;;;16521:29;-1:-1:-1;;;16566:18:1;;;16559:37;16613:18;;59978:25:0::1;16307:330:1::0;59978:25:0::1;60064:10;::::0;60031:6;;60056:18;::::1;;60048:48;;;::::0;-1:-1:-1;;;60048:48:0;;16844:2:1;60048:48:0::1;::::0;::::1;16826:21:1::0;16883:2;16863:18;;;16856:30;-1:-1:-1;;;16902:18:1;;;16895:47;16959:18;;60048:48:0::1;16642:341:1::0;60048:48:0::1;60141:10;;60132:4;60116:13;;:20;;;;:::i;:::-;60115:36;;60107:66;;;::::0;-1:-1:-1;;;60107:66:0;;17190:2:1;60107:66:0::1;::::0;::::1;17172:21:1::0;17229:2;17209:18;;;17202:30;-1:-1:-1;;;17248:18:1;;;17241:47;17305:18;;60107:66:0::1;16988:341:1::0;60107:66:0::1;60223:12;::::0;60200:10:::1;60193:18;::::0;;;:6:::1;:18;::::0;;;;;:25:::1;::::0;60214:4;;60193:25:::1;:::i;:::-;60192:43;;60184:76;;;::::0;-1:-1:-1;;;60184:76:0;;17536:2:1;60184:76:0::1;::::0;::::1;17518:21:1::0;17575:2;17555:18;;;17548:30;-1:-1:-1;;;17594:18:1;;;17587:50;17654:18;;60184:76:0::1;17334:344:1::0;60184:76:0::1;60273:13;60315;;60301:11;;55141:4;60289:23;;;;:::i;:::-;:39;;;;:::i;:::-;60273:55;;60355:1;60347:5;:9;60339:31;;;::::0;-1:-1:-1;;;60339:31:0;;15397:2:1;60339:31:0::1;::::0;::::1;15379:21:1::0;15436:1;15416:18;;;15409:29;-1:-1:-1;;;15454:18:1;;;15447:39;15503:18;;60339:31:0::1;15195:332:1::0;60339:31:0::1;60390:21;60399:4;60405:5;60390:8;:21::i;:::-;60383:28;;60441:4;60424:13;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;60467:10:0::1;60456:22;::::0;;;:10:::1;:22;::::0;;;;:30;;60482:4;;60456:22;:30:::1;::::0;60482:4;;60456:30:::1;:::i;:::-;::::0;;;-1:-1:-1;;60504:10:0::1;60497:18;::::0;;;:6:::1;:18;::::0;;;;:26;;60519:4;;60497:18;:26:::1;::::0;60519:4;;60497:26:::1;:::i;:::-;::::0;;;-1:-1:-1;60536:27:0::1;::::0;-1:-1:-1;60546:10:0::1;60558:4:::0;60536:9:::1;:27::i;56274:109::-:0;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;56356:13:::1;::::0;;;:6:::1;:13;::::0;;;;;;;:19;;::::1;::::0;;::::1;::::0;::::1;:::i;56391:436::-:0;26235:7;26262:12;56482:5;:22;;56460:65;;;;-1:-1:-1;;;56460:65:0;;;;;;;:::i;:::-;56544:9;;-1:-1:-1;;;56544:9:0;;;;56536:48;;;;-1:-1:-1;;;56536:48:0;;17885:2:1;56536:48:0;;;17867:21:1;17924:2;17904:18;;;17897:30;17963:28;17943:18;;;17936:56;18009:18;;56536:48:0;17683:350:1;56536:48:0;56605:13;56621:22;56637:5;56621:15;:22::i;:::-;56605:38;-1:-1:-1;56662:10:0;-1:-1:-1;;;;;56662:19:0;;;56654:48;;;;-1:-1:-1;;;56654:48:0;;18240:2:1;56654:48:0;;;18222:21:1;18279:2;18259:18;;;18252:30;-1:-1:-1;;;18298:18:1;;;18291:46;18354:18;;56654:48:0;18038:340:1;56654:48:0;56763:2;56757:1;56742:3;56735:19;:23;;;;:::i;:::-;56732:27;;:1;:27;:::i;:::-;56731:34;56723:64;;;;-1:-1:-1;;;56723:64:0;;19015:2:1;56723:64:0;;;18997:21:1;19054:2;19034:18;;;19027:30;-1:-1:-1;;;19073:18:1;;;19066:47;19130:18;;56723:64:0;18813:341:1;56723:64:0;56800:13;;;;:6;:13;;;;;;;;:19;;;;;;;;:::i;24102:201::-;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24191:22:0;::::1;24183:73;;;::::0;-1:-1:-1;;;24183:73:0;;19361:2:1;24183:73:0::1;::::0;::::1;19343:21:1::0;19400:2;19380:18;;;19373:30;19439:34;19419:18;;;19412:62;-1:-1:-1;;;19490:18:1;;;19483:36;19536:19;;24183:73:0::1;19159:402:1::0;24183:73:0::1;24267:28;24286:8;24267:18;:28::i;58575:83::-:0;23841:6;;-1:-1:-1;;;;;23841:6:0;6214:10;23903:23;23895:68;;;;-1:-1:-1;;;23895:68:0;;;;;;;:::i;:::-;58636:10:::1;:14:::0;58575:83::o;35475:196::-;35590:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;35590:29:0;-1:-1:-1;;;;;35590:29:0;;;;;;;;;35635:28;;35590:24;;35635:28;;;;;;;35475:196;;;:::o;33465:2002::-;33580:35;33618:20;33630:7;33618:11;:20::i;:::-;33693:18;;33580:58;;-1:-1:-1;33651:22:0;;-1:-1:-1;;;;;33677:34:0;6214:10;-1:-1:-1;;;;;33677:34:0;;:87;;;-1:-1:-1;6214:10:0;33728:20;33740:7;33728:11;:20::i;:::-;-1:-1:-1;;;;;33728:36:0;;33677:87;:154;;;-1:-1:-1;33798:18:0;;33781:50;;6214:10;30627:164;:::i;33781:50::-;33651:181;;33853:17;33845:80;;;;-1:-1:-1;;;33845:80:0;;19768:2:1;33845:80:0;;;19750:21:1;19807:2;19787:18;;;19780:30;19846:34;19826:18;;;19819:62;-1:-1:-1;;;19897:18:1;;;19890:48;19955:19;;33845:80:0;19566:414:1;33845:80:0;33968:4;-1:-1:-1;;;;;33946:26:0;:13;:18;;;-1:-1:-1;;;;;33946:26:0;;33938:77;;;;-1:-1:-1;;;33938:77:0;;20187:2:1;33938:77:0;;;20169:21:1;20226:2;20206:18;;;20199:30;20265:34;20245:18;;;20238:62;-1:-1:-1;;;20316:18:1;;;20309:36;20362:19;;33938:77:0;19985:402:1;33938:77:0;-1:-1:-1;;;;;34034:16:0;;34026:66;;;;-1:-1:-1;;;34026:66:0;;20594:2:1;34026:66:0;;;20576:21:1;20633:2;20613:18;;;20606:30;20672:34;20652:18;;;20645:62;-1:-1:-1;;;20723:18:1;;;20716:35;20768:19;;34026:66:0;20392:401:1;34026:66:0;34213:49;34230:1;34234:7;34243:13;:18;;;34213:8;:49::i;:::-;-1:-1:-1;;;;;34558:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;34558:31:0;;;-1:-1:-1;;;;;34558:31:0;;;-1:-1:-1;;34558:31:0;;;;;;;34604:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;34604:29:0;;;;;;;;;;;;;34650:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;34695:61:0;;;;-1:-1:-1;;;34740:15:0;-1:-1:-1;;;;;34695:61:0;;;;;35030:11;;;35060:24;;;;;:29;35030:11;;35060:29;35056:295;;35128:20;35136:11;31574:4;31608:12;-1:-1:-1;31598:22:0;31517:111;35128:20;35124:212;;;35205:18;;;35173:24;;;:11;:24;;;;;;;;:50;;35288:28;;;;-1:-1:-1;;;;;35246:70:0;-1:-1:-1;;;35246:70:0;-1:-1:-1;;;;;;35246:70:0;;;-1:-1:-1;;;;;35173:50:0;;;35246:70;;;;;;;35124:212;34533:829;35398:7;35394:2;-1:-1:-1;;;;;35379:27:0;35388:4;-1:-1:-1;;;;;35379:27:0;;;;;;;;;;;35417:42;33569:1898;;33465:2002;;;:::o;8405:317::-;8520:6;8495:21;:31;;8487:73;;;;-1:-1:-1;;;8487:73:0;;21000:2:1;8487:73:0;;;20982:21:1;21039:2;21019:18;;;21012:30;21078:31;21058:18;;;21051:59;21127:18;;8487:73:0;20798:353:1;8487:73:0;8574:12;8592:9;-1:-1:-1;;;;;8592:14:0;8614:6;8592:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8573:52;;;8644:7;8636:78;;;;-1:-1:-1;;;8636:78:0;;21568:2:1;8636:78:0;;;21550:21:1;21607:2;21587:18;;;21580:30;21646:34;21626:18;;;21619:62;21717:28;21697:18;;;21690:56;21763:19;;8636:78:0;21366:422:1;28346:537:0;-1:-1:-1;;;;;;;;;;;;;;;;;28449:16:0;28457:7;31574:4;31608:12;-1:-1:-1;31598:22:0;31517:111;28449:16;28441:71;;;;-1:-1:-1;;;28441:71:0;;21995:2:1;28441:71:0;;;21977:21:1;22034:2;22014:18;;;22007:30;22073:34;22053:18;;;22046:62;-1:-1:-1;;;22124:18:1;;;22117:40;22174:19;;28441:71:0;21793:406:1;28441:71:0;28570:7;28550:245;28617:31;28651:17;;;:11;:17;;;;;;;;;28617:51;;;;;;;;;-1:-1:-1;;;;;28617:51:0;;;;;-1:-1:-1;;;28617:51:0;;;-1:-1:-1;;;;;28617:51:0;;;;;;;;28691:28;28687:93;;28751:9;28346:537;-1:-1:-1;;;28346:537:0:o;28687:93::-;-1:-1:-1;;;28590:6:0;28550:245;;24311:191;24404:6;;;-1:-1:-1;;;;;24421:17:0;;;-1:-1:-1;;;;;;24421:17:0;;;;;;;24454:40;;24404:6;;;24421:17;24404:6;;24454:40;;24385:16;;24454:40;24374:128;24311:191;:::o;41402:2092::-;41530:11;;41462:12;;41510:5;;41526:41;;41555:12;;;41565:1;41555:12;;;;;;;;;;;;41526:41;41597:1;41583:4;:11;:15;;;;:::i;:::-;:20;41575:61;;;;-1:-1:-1;;;41575:61:0;;22939:2:1;41575:61:0;;;22921:21:1;22978:2;22958:18;;;22951:30;23017;22997:18;;;22990:58;23065:18;;41575:61:0;22737:352:1;41575:61:0;41682:18;41703:12;;;;;;;;;;;;;;;;;41682:33;;41771:18;41807:1;41793:4;:11;:15;;;;:::i;:::-;41792:21;;41812:1;41792:21;:::i;:::-;41771:42;-1:-1:-1;41890:19:0;41922:15;41771:42;41935:2;41922:15;:::i;:::-;-1:-1:-1;;;;;41912:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41912:26:0;;41890:48;;42038:4;42032:11;42026:4;42022:22;42016:29;42084:4;42077;42066:9;42062:20;42059:30;42056:215;;;42136:1;42124:10;42120:18;42106:32;;42183:6;42174;42163:9;42159:22;42156:34;42153:106;;;42241:1;42229:10;42225:18;42211:32;;42153:106;42056:215;42341:10;42333:6;42326:26;42430:1;42423:5;42419:13;42483:4;42531;42525:11;42516:7;42512:25;42621:2;42613:6;42609:15;42693:766;42712:6;42703:7;42700:19;42693:766;;;42806:1;42797:7;42793:15;42782:26;;42841:7;42835:14;43311:4;43302;43294:5;43282:25;43272:8;43268:40;43262:47;43258:58;43221:4;43212;43204:5;43201:1;43196:14;43192:25;43182:8;43178:40;43172:47;43168:58;43165:1;43160:67;43134:202;43108:4;43099;43091:5;43087:2;43083:14;43079:25;43069:8;43065:40;43059:47;43055:58;43051:2;43047:67;43018:4;43009;43001:5;42997:2;42993:14;42989:25;42979:8;42975:40;42969:47;42965:58;42961:2;42957:67;42931:184;42909:443;42895:457;;43394:6;43389:3;43385:16;43374:9;43367:35;;43445:1;43434:9;43430:17;43417:30;;42693:766;;;-1:-1:-1;43483:6:0;;41402:2092;-1:-1:-1;;;;;;;;41402:2092:0:o;3781:723::-;3837:13;4058:10;4054:53;;-1:-1:-1;;4085:10:0;;;;;;;;;;;;-1:-1:-1;;;4085:10:0;;;;;3781:723::o;4054:53::-;4132:5;4117:12;4173:78;4180:9;;4173:78;;4206:8;;;;:::i;:::-;;-1:-1:-1;4229:10:0;;-1:-1:-1;4237:2:0;4229:10;;:::i;:::-;;;4173:78;;;4261:19;4293:6;-1:-1:-1;;;;;4283:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4283:17:0;;4261:39;;4311:154;4318:10;;4311:154;;4345:11;4355:1;4345:11;;:::i;:::-;;-1:-1:-1;4414:10:0;4422:2;4414:5;:10;:::i;:::-;4401:24;;:2;:24;:::i;:::-;4388:39;;4371:6;4378;4371:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4371:56:0;;;;;;;;-1:-1:-1;4442:11:0;4451:2;4442:11;;:::i;:::-;;;4311:154;;;4489:6;3781:723;-1:-1:-1;;;;3781:723:0:o;52920:1286::-;53023:13;53049:22;;:::i;:::-;53076:147;;;;;;;;;;;;;;;;;;;53296:15;:13;:15::i;:::-;53252:72;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;53252:72:0;;;;;;53234:8;;;;:91;;;;53354:122;;;53460:7;;53469:6;;53354:122;;:::i;:::-;;;;;;;-1:-1:-1;;53354:122:0;;;;;;53336:8;;:141;53626:17;:15;:17::i;:::-;53506:154;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;53506:154:0;;;;;;53488:8;;;:173;;;;53672:350;;;;;;;;;;;;;53488:8;53672:350;;;:8;;;:350;;;54033:8;;;:14;;;54058:26;;;;;;;;;;;-1:-1:-1;;;53672:8:0;54058:26;;;;;;;:8;;;:26;;;54128:8;;54138;;;;-1:-1:-1;;;54148:8:0;-1:-1:-1;;;54158:8:0;54168;;54178;;54111:86;;;;54128:8;;54138;;54148;;54158;;54168;;54178;;54111:86;;:::i;:::-;;;;;;;;;;;;;54097:101;;;52920:1286;;;;;:::o;55846:91::-;55902:7;;-1:-1:-1;;;55902:7:0;;;;55901:8;55893:36;;;;-1:-1:-1;;;55893:36:0;;26912:2:1;55893:36:0;;;26894:21:1;26951:2;26931:18;;;26924:30;-1:-1:-1;;;26970:18:1;;;26963:45;27025:18;;55893:36:0;26710:339:1;37270:190:0;37395:4;37448;37419:25;37432:5;37439:4;37419:12;:25::i;:::-;:33;;37270:190;-1:-1:-1;;;;37270:190:0:o;31636:104::-;31705:27;31715:2;31719:8;31705:27;;;;;;;;;;;;:9;:27::i;35679:804::-;35834:4;-1:-1:-1;;;;;35855:13:0;;7406:20;7454:8;35851:625;;35891:72;;-1:-1:-1;;;35891:72:0;;-1:-1:-1;;;;;35891:36:0;;;;;:72;;6214:10;;35942:4;;35948:7;;35957:5;;35891:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35891:72:0;;;;;;;;-1:-1:-1;;35891:72:0;;;;;;;;;;;;:::i;:::-;;;35887:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36137:13:0;;36133:273;;36180:61;;-1:-1:-1;;;36180:61:0;;;;;;;:::i;36133:273::-;36356:6;36350:13;36341:6;36337:2;36333:15;36326:38;35887:534;-1:-1:-1;;;;;;36014:55:0;-1:-1:-1;;;36014:55:0;;-1:-1:-1;36007:62:0;;35851:625;-1:-1:-1;36460:4:0;35679:804;;;;;;:::o;57649:165::-;57703:13;57736:70;57753:5;57760:7;57736:70;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57790:13:0;;;;:6;:13;;;;;57776:28;;;;-1:-1:-1;57790:13:0;;-1:-1:-1;57776:28:0;;;:::i;:::-;57736:16;:70::i;22174:106::-;22232:7;22263:1;22259;:5;:13;;22271:1;22259:13;;;22267:1;22259:13;22252:20;22174:106;-1:-1:-1;;;22174:106:0:o;43531:6383::-;43570:13;43596:6310;;;;;;;;;;;;;;;;;;;43531:6383;:::o;49922:2990::-;49963:13;49989:2915;;;;;;;;;;;;;;;;;;;49922:2990;:::o;37822:675::-;37905:7;37948:4;37905:7;37963:497;37987:5;:12;37983:1;:16;37963:497;;;38021:20;38044:5;38050:1;38044:8;;;;;;;;:::i;:::-;;;;;;;38021:31;;38087:12;38071;:28;38067:382;;38573:13;38623:15;;;38659:4;38652:15;;;38706:4;38690:21;;38199:57;;38067:382;;;38573:13;38623:15;;;38659:4;38652:15;;;38706:4;38690:21;;38376:57;;38067:382;-1:-1:-1;38001:3:0;;;;:::i;:::-;;;;37963:497;;31748:163;31871:32;31877:2;31881:8;31891:5;31898:4;31871:5;:32::i;54393:626::-;54490:13;54526:18;54598:27;54615:9;:5;54623:1;54615:9;:::i;:::-;54598:16;:27::i;:::-;54696:15;:13;:15::i;:::-;54768:3;54845:54;54861:3;54866:7;54875:23;54892:5;54875:16;:23::i;54845:54::-;54555:351;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54526:382;;54983:26;55003:4;54983:13;:26::i;:::-;54933:77;;;;;;;;:::i;31919:1538::-;32058:20;32081:12;-1:-1:-1;;;;;32112:16:0;;32104:62;;;;-1:-1:-1;;;32104:62:0;;30758:2:1;32104:62:0;;;30740:21:1;30797:2;30777:18;;;30770:30;30836:34;30816:18;;;30809:62;-1:-1:-1;;;30887:18:1;;;30880:31;30928:19;;32104:62:0;30556:397:1;32104:62:0;32185:13;32177:66;;;;-1:-1:-1;;;32177:66:0;;31160:2:1;32177:66:0;;;31142:21:1;31199:2;31179:18;;;31172:30;31238:34;31218:18;;;31211:62;-1:-1:-1;;;31289:18:1;;;31282:38;31337:19;;32177:66:0;30958:404:1;32177:66:0;-1:-1:-1;;;;;32595:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;32595:45:0;;-1:-1:-1;;;;;32595:45:0;;;;;;;;;;32655:50;;;;;;;;;;;;;;32722:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;32772:66:0;;;;-1:-1:-1;;;32822:15:0;-1:-1:-1;;;;;32772:66:0;;;;;;32722:25;;32907:415;32927:8;32923:1;:12;32907:415;;;32966:38;;32991:12;;-1:-1:-1;;;;;32966:38:0;;;32983:1;;32966:38;;32983:1;;32966:38;33027:4;33023:249;;;33090:59;33121:1;33125:2;33129:12;33143:5;33090:22;:59::i;:::-;33056:196;;;;-1:-1:-1;;;33056:196:0;;;;;;;:::i;:::-;33292:14;;;;;32937:3;32907:415;;;-1:-1:-1;33338:12:0;:27;33389:60;59276:626;54214:171;54253:13;54279:98;;;;;;;;;;;;;;;;;;;54214:171;:::o;39487:1912::-;39545:13;39575:4;:11;39590:1;39575:16;39571:31;;;-1:-1:-1;;39593:9:0;;;;;;;;;-1:-1:-1;39593:9:0;;;39487:1912::o;39571:31::-;39654:19;39676:12;;;;;;;;;;;;;;;;;39654:34;;39740:18;39786:1;39767:4;:11;39781:1;39767:15;;;;:::i;:::-;39766:21;;;;:::i;:::-;39761:27;;:1;:27;:::i;:::-;39740:48;-1:-1:-1;39871:20:0;39905:15;39740:48;39918:2;39905:15;:::i;:::-;-1:-1:-1;;;;;39894:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39894:27:0;;39871:50;;40018:10;40010:6;40003:26;40113:1;40106:5;40102:13;40172:4;40223;40217:11;40208:7;40204:25;40319:2;40311:6;40307:15;40392:754;40411:6;40402:7;40399:19;40392:754;;;40511:1;40502:7;40498:15;40487:26;;40550:7;40544:14;40676:4;40668:5;40664:2;40660:14;40656:25;40646:8;40642:40;40636:47;40625:9;40617:67;40730:1;40719:9;40715:17;40702:30;;40809:4;40801:5;40797:2;40793:14;40789:25;40779:8;40775:40;40769:47;40758:9;40750:67;40863:1;40852:9;40848:17;40835:30;;40942:4;40934:5;40931:1;40926:14;40922:25;40912:8;40908:40;40902:47;40891:9;40883:67;40996:1;40985:9;40981:17;40968:30;;41075:4;41067:5;41055:25;41045:8;41041:40;41035:47;41024:9;41016:67;-1:-1:-1;41129:1:0;41114:17;40392:754;;;41219:1;41212:4;41206:11;41202:19;41240:1;41235:54;;;;41308:1;41303:52;;;;41195:160;;41235:54;-1:-1:-1;;;;;41251:17:0;;41244:43;41235:54;;41303:52;-1:-1:-1;;;;;41319:17:0;;41312:41;41195:160;-1:-1:-1;41385:6:0;;39487:1912;-1:-1:-1;;;;;;;;39487:1912:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:632;789:5;-1:-1:-1;;;;;860:2:1;852:6;849:14;846:40;;;866:18;;:::i;:::-;941:2;935:9;909:2;995:15;;-1:-1:-1;;991:24:1;;;1017:2;987:33;983:42;971:55;;;1041:18;;;1061:22;;;1038:46;1035:72;;;1087:18;;:::i;:::-;1127:10;1123:2;1116:22;1156:6;1147:15;;1186:6;1178;1171:22;1226:3;1217:6;1212:3;1208:16;1205:25;1202:45;;;1243:1;1240;1233:12;1202:45;1293:6;1288:3;1281:4;1273:6;1269:17;1256:44;1348:1;1341:4;1332:6;1324;1320:19;1316:30;1309:41;;;;724:632;;;;;:::o;1361:222::-;1404:5;1457:3;1450:4;1442:6;1438:17;1434:27;1424:55;;1475:1;1472;1465:12;1424:55;1497:80;1573:3;1564:6;1551:20;1544:4;1536:6;1532:17;1497:80;:::i;1588:322::-;1657:6;1710:2;1698:9;1689:7;1685:23;1681:32;1678:52;;;1726:1;1723;1716:12;1678:52;1766:9;1753:23;-1:-1:-1;;;;;1791:6:1;1788:30;1785:50;;;1831:1;1828;1821:12;1785:50;1854;1896:7;1887:6;1876:9;1872:22;1854:50;:::i;1915:258::-;1987:1;1997:113;2011:6;2008:1;2005:13;1997:113;;;2087:11;;;2081:18;2068:11;;;2061:39;2033:2;2026:10;1997:113;;;2128:6;2125:1;2122:13;2119:48;;;-1:-1:-1;;2163:1:1;2145:16;;2138:27;1915:258::o;2178:269::-;2231:3;2269:5;2263:12;2296:6;2291:3;2284:19;2312:63;2368:6;2361:4;2356:3;2352:14;2345:4;2338:5;2334:16;2312:63;:::i;:::-;2429:2;2408:15;-1:-1:-1;;2404:29:1;2395:39;;;;2436:4;2391:50;;2178:269;-1:-1:-1;;2178:269:1:o;2452:231::-;2601:2;2590:9;2583:21;2564:4;2621:56;2673:2;2662:9;2658:18;2650:6;2621:56;:::i;2688:180::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;-1:-1:-1;2839:23:1;;2688:180;-1:-1:-1;2688:180:1:o;3081:173::-;3149:20;;-1:-1:-1;;;;;3198:31:1;;3188:42;;3178:70;;3244:1;3241;3234:12;3259:254;3327:6;3335;3388:2;3376:9;3367:7;3363:23;3359:32;3356:52;;;3404:1;3401;3394:12;3356:52;3427:29;3446:9;3427:29;:::i;:::-;3417:39;3503:2;3488:18;;;;3475:32;;-1:-1:-1;;;3259:254:1:o;3518:160::-;3583:20;;3639:13;;3632:21;3622:32;;3612:60;;3668:1;3665;3658:12;3683:180;3739:6;3792:2;3780:9;3771:7;3767:23;3763:32;3760:52;;;3808:1;3805;3798:12;3760:52;3831:26;3847:9;3831:26;:::i;4050:186::-;4109:6;4162:2;4150:9;4141:7;4137:23;4133:32;4130:52;;;4178:1;4175;4168:12;4130:52;4201:29;4220:9;4201:29;:::i;4241:328::-;4318:6;4326;4334;4387:2;4375:9;4366:7;4362:23;4358:32;4355:52;;;4403:1;4400;4393:12;4355:52;4426:29;4445:9;4426:29;:::i;:::-;4416:39;;4474:38;4508:2;4497:9;4493:18;4474:38;:::i;:::-;4464:48;;4559:2;4548:9;4544:18;4531:32;4521:42;;4241:328;;;;;:::o;4941:632::-;5112:2;5164:21;;;5234:13;;5137:18;;;5256:22;;;5083:4;;5112:2;5335:15;;;;5309:2;5294:18;;;5083:4;5378:169;5392:6;5389:1;5386:13;5378:169;;;5453:13;;5441:26;;5522:15;;;;5487:12;;;;5414:1;5407:9;5378:169;;;-1:-1:-1;5564:3:1;;4941:632;-1:-1:-1;;;;;;4941:632:1:o;5578:615::-;5664:6;5672;5725:2;5713:9;5704:7;5700:23;5696:32;5693:52;;;5741:1;5738;5731:12;5693:52;5781:9;5768:23;-1:-1:-1;;;;;5851:2:1;5843:6;5840:14;5837:34;;;5867:1;5864;5857:12;5837:34;5905:6;5894:9;5890:22;5880:32;;5950:7;5943:4;5939:2;5935:13;5931:27;5921:55;;5972:1;5969;5962:12;5921:55;6012:2;5999:16;6038:2;6030:6;6027:14;6024:34;;;6054:1;6051;6044:12;6024:34;6107:7;6102:2;6092:6;6089:1;6085:14;6081:2;6077:23;6073:32;6070:45;6067:65;;;6128:1;6125;6118:12;6067:65;6159:2;6151:11;;;;;6181:6;;-1:-1:-1;5578:615:1;;-1:-1:-1;;;;5578:615:1:o;6198:254::-;6263:6;6271;6324:2;6312:9;6303:7;6299:23;6295:32;6292:52;;;6340:1;6337;6330:12;6292:52;6363:29;6382:9;6363:29;:::i;:::-;6353:39;;6411:35;6442:2;6431:9;6427:18;6411:35;:::i;:::-;6401:45;;6198:254;;;;;:::o;6457:667::-;6552:6;6560;6568;6576;6629:3;6617:9;6608:7;6604:23;6600:33;6597:53;;;6646:1;6643;6636:12;6597:53;6669:29;6688:9;6669:29;:::i;:::-;6659:39;;6717:38;6751:2;6740:9;6736:18;6717:38;:::i;:::-;6707:48;;6802:2;6791:9;6787:18;6774:32;6764:42;;6857:2;6846:9;6842:18;6829:32;-1:-1:-1;;;;;6876:6:1;6873:30;6870:50;;;6916:1;6913;6906:12;6870:50;6939:22;;6992:4;6984:13;;6980:27;-1:-1:-1;6970:55:1;;7021:1;7018;7011:12;6970:55;7044:74;7110:7;7105:2;7092:16;7087:2;7083;7079:11;7044:74;:::i;:::-;7034:84;;;6457:667;;;;;;;:::o;7129:390::-;7207:6;7215;7268:2;7256:9;7247:7;7243:23;7239:32;7236:52;;;7284:1;7281;7274:12;7236:52;7320:9;7307:23;7297:33;;7381:2;7370:9;7366:18;7353:32;-1:-1:-1;;;;;7400:6:1;7397:30;7394:50;;;7440:1;7437;7430:12;7394:50;7463;7505:7;7496:6;7485:9;7481:22;7463:50;:::i;:::-;7453:60;;;7129:390;;;;;:::o;7524:260::-;7592:6;7600;7653:2;7641:9;7632:7;7628:23;7624:32;7621:52;;;7669:1;7666;7659:12;7621:52;7692:29;7711:9;7692:29;:::i;:::-;7682:39;;7740:38;7774:2;7763:9;7759:18;7740:38;:::i;7789:356::-;7991:2;7973:21;;;8010:18;;;8003:30;8069:34;8064:2;8049:18;;8042:62;8136:2;8121:18;;7789:356::o;8150:380::-;8229:1;8225:12;;;;8272;;;8293:61;;8347:4;8339:6;8335:17;8325:27;;8293:61;8400:2;8392:6;8389:14;8369:18;8366:38;8363:161;;;8446:10;8441:3;8437:20;8434:1;8427:31;8481:4;8478:1;8471:15;8509:4;8506:1;8499:15;11412:127;11473:10;11468:3;11464:20;11461:1;11454:31;11504:4;11501:1;11494:15;11528:4;11525:1;11518:15;11544:127;11605:10;11600:3;11596:20;11593:1;11586:31;11636:4;11633:1;11626:15;11660:4;11657:1;11650:15;11676:135;11715:3;-1:-1:-1;;11736:17:1;;11733:43;;;11756:18;;:::i;:::-;-1:-1:-1;11803:1:1;11792:13;;11676:135::o;11816:341::-;12018:2;12000:21;;;12057:2;12037:18;;;12030:30;-1:-1:-1;;;12091:2:1;12076:18;;12069:47;12148:2;12133:18;;11816:341::o;12288:185::-;12330:3;12368:5;12362:12;12383:52;12428:6;12423:3;12416:4;12409:5;12405:16;12383:52;:::i;:::-;12451:16;;;;;12288:185;-1:-1:-1;;12288:185:1:o;12478:1174::-;12654:3;12683:1;12716:6;12710:13;12746:3;12768:1;12796:9;12792:2;12788:18;12778:28;;12856:2;12845:9;12841:18;12878;12868:61;;12922:4;12914:6;12910:17;12900:27;;12868:61;12948:2;12996;12988:6;12985:14;12965:18;12962:38;12959:165;;;-1:-1:-1;;;13023:33:1;;13079:4;13076:1;13069:15;13109:4;13030:3;13097:17;12959:165;13140:18;13167:104;;;;13285:1;13280:320;;;;13133:467;;13167:104;-1:-1:-1;;13200:24:1;;13188:37;;13245:16;;;;-1:-1:-1;13167:104:1;;13280:320;12235:1;12228:14;;;12272:4;12259:18;;13375:1;13389:165;13403:6;13400:1;13397:13;13389:165;;;13481:14;;13468:11;;;13461:35;13524:16;;;;13418:10;;13389:165;;;13393:3;;13583:6;13578:3;13574:16;13567:23;;13133:467;;;;;;;13616:30;13642:3;13634:6;13616:30;:::i;:::-;13609:37;12478:1174;-1:-1:-1;;;;;12478:1174:1:o;14009:128::-;14049:3;14080:1;14076:6;14073:1;14070:13;14067:39;;;14086:18;;:::i;:::-;-1:-1:-1;14122:9:1;;14009:128::o;15065:125::-;15105:4;15133:1;15130;15127:8;15124:34;;;15138:18;;:::i;:::-;-1:-1:-1;15175:9:1;;15065:125::o;15887:415::-;16089:2;16071:21;;;16128:2;16108:18;;;16101:30;16167:34;16162:2;16147:18;;16140:62;-1:-1:-1;;;16233:2:1;16218:18;;16211:49;16292:3;16277:19;;15887:415::o;18383:127::-;18444:10;18439:3;18435:20;18432:1;18425:31;18475:4;18472:1;18465:15;18499:4;18496:1;18489:15;18515:120;18555:1;18581;18571:35;;18586:18;;:::i;:::-;-1:-1:-1;18620:9:1;;18515:120::o;18640:168::-;18680:7;18746:1;18742;18738:6;18734:14;18731:1;18728:21;18723:1;18716:9;18709:17;18705:45;18702:71;;;18753:18;;:::i;:::-;-1:-1:-1;18793:9:1;;18640:168::o;22620:112::-;22652:1;22678;22668:35;;22683:18;;:::i;:::-;-1:-1:-1;22717:9:1;;22620:112::o;23094:604::-;23457:25;23452:3;23445:38;23427:3;23512:6;23506:13;23528:62;23583:6;23578:2;23573:3;23569:12;23562:4;23554:6;23550:17;23528:62;:::i;:::-;-1:-1:-1;;;23649:2:1;23609:16;;;;23641:11;;;23634:31;-1:-1:-1;23689:2:1;23681:11;;23094:604;-1:-1:-1;23094:604:1:o;23703:761::-;24013:34;24008:3;24001:47;24078:34;24073:2;24068:3;24064:12;24057:56;-1:-1:-1;;;24138:2:1;24133:3;24129:12;24122:46;23983:3;24197:6;24191:13;24213:60;24266:6;24261:2;24256:3;24252:12;24247:2;24239:6;24235:15;24213:60;:::i;:::-;24333:13;;24292:16;;;;24355:61;24333:13;24402:2;24394:11;;24389:2;24377:15;;24355:61;:::i;:::-;24436:17;24455:2;24432:26;;23703:761;-1:-1:-1;;;;23703:761:1:o;24469:782::-;24832:34;24827:3;24820:47;24897:34;24892:2;24887:3;24883:12;24876:56;24962:34;24957:2;24952:3;24948:12;24941:56;-1:-1:-1;;;25022:2:1;25017:3;25013:12;25006:27;24802:3;25062:6;25056:13;25078:60;25131:6;25126:2;25121:3;25117:12;25112:2;25104:6;25100:15;25078:60;:::i;:::-;-1:-1:-1;;;25197:2:1;25157:16;;;;25189:11;;;25182:35;-1:-1:-1;25241:3:1;25233:12;;24469:782;-1:-1:-1;24469:782:1:o;25256:1449::-;25675:3;25713:6;25707:13;25739:4;25752:51;25796:6;25791:3;25786:2;25778:6;25774:15;25752:51;:::i;:::-;25866:13;;25825:16;;;;25888:55;25866:13;25825:16;25910:15;;;25888:55;:::i;:::-;26010:13;;25965:20;;;26032:55;26010:13;25965:20;26054:15;;;26032:55;:::i;:::-;26154:13;;26109:20;;;26176:55;26154:13;26109:20;26198:15;;;26176:55;:::i;:::-;26298:13;;26253:20;;;26320:55;26298:13;26253:20;26342:15;;;26320:55;:::i;:::-;26442:13;;26397:20;;;26464:55;26442:13;26397:20;26486:15;;;26464:55;:::i;:::-;26586:13;;26541:20;;;26608:55;26586:13;26541:20;26630:15;;;26608:55;:::i;:::-;26679:20;;;;;25256:1449;-1:-1:-1;;;;;;;;;;25256:1449:1:o;27054:500::-;-1:-1:-1;;;;;27323:15:1;;;27305:34;;27375:15;;27370:2;27355:18;;27348:43;27422:2;27407:18;;27400:34;;;27470:3;27465:2;27450:18;;27443:31;;;27248:4;;27491:57;;27528:19;;27520:6;27491:57;:::i;:::-;27483:65;27054:500;-1:-1:-1;;;;;;27054:500:1:o;27559:249::-;27628:6;27681:2;27669:9;27660:7;27656:23;27652:32;27649:52;;;27697:1;27694;27687:12;27649:52;27729:9;27723:16;27748:30;27772:5;27748:30;:::i;27943:2155::-;-1:-1:-1;;;28842:68:1;;28933:13;;28824:3;;28955:62;28933:13;29005:2;28996:12;;28989:4;28977:17;;28955:62;:::i;:::-;29081:66;29076:2;29036:16;;;29068:11;;;29061:87;-1:-1:-1;;;29172:2:1;29164:11;;29157:59;-1:-1:-1;;;29240:2:1;29232:11;;29225:65;29315:13;;29337:63;29315:13;29386:2;29378:11;;29371:4;29359:17;;29337:63;:::i;:::-;29465:66;29460:2;29419:17;;;;29452:11;;;29445:87;-1:-1:-1;;;29556:3:1;29548:12;;29541:73;29639:13;;29661:64;29639:13;29710:3;29702:12;;29695:4;29683:17;;29661:64;:::i;:::-;29791:66;29785:3;29744:17;;;;29777:12;;;29770:88;29888:66;29882:3;29874:12;;29867:88;-1:-1:-1;;;29979:3:1;29971:12;;29964:42;30022:70;30052:39;30086:3;30078:12;;30070:6;30052:39;:::i;:::-;-1:-1:-1;;;27878:27:1;;27930:1;27921:11;;27813:125;30022:70;30015:77;27943:2155;-1:-1:-1;;;;;;;27943:2155:1:o;30103:448::-;30365:31;30360:3;30353:44;30335:3;30426:6;30420:13;30442:62;30497:6;30492:2;30487:3;30483:12;30476:4;30468:6;30464:17;30442:62;:::i;:::-;30524:16;;;;30542:2;30520:25;;30103:448;-1:-1:-1;;30103:448:1:o
Swarm Source
ipfs://c8e1a04e18f99ebe24df09f9c10f0fe0a6942de22b9bb396d2093395e92394a2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.